Java 如何正确声明子类的实例?

Java 如何正确声明子类的实例?,java,subclass,instantiation,Java,Subclass,Instantiation,我目前正在用Java进行一次基于文本的冒险,目的是将其用作一个测试平台,尝试从我正在阅读的这本Java书籍中学到的新东西 我现在正试图声明一个子类的实例(因为玩家已经编写了查找它的脚本)。 父类是物资,它有两个子类:武器和装甲 但是,无论我尝试以何种方式声明它,我正在使用的IDE(Eclipse)都会用以下错误标记该行: 无法访问Item类型的封闭实例。必须使用Item类型的封闭实例(例如x.new A(),其中x是Item的实例)限定分配 当我试图按照以下任何一种方式声明它时: Item ma

我目前正在用Java进行一次基于文本的冒险,目的是将其用作一个测试平台,尝试从我正在阅读的这本Java书籍中学到的新东西

我现在正试图声明一个子类的实例(因为玩家已经编写了查找它的脚本)。 父类是
物资
,它有两个子类:
武器
装甲

但是,无论我尝试以何种方式声明它,我正在使用的IDE(Eclipse)都会用以下错误标记该行:

无法访问Item类型的封闭实例。必须使用Item类型的封闭实例(例如x.new A(),其中x是Item的实例)限定分配

当我试图按照以下任何一种方式声明它时:

Item machinePistol = new Weapon(); 
Weapon machinePistol = new Weapon();
Item machinePistol = new Item.Weapon();
Weapon machinePistol = new Item.Weapon();
作为参考,item类如下所示:

package JavaAIO;

public class Item 
{
    public String itemName;
    public double itemWeight;

    public class Weapon extends Item
    {
        public double damage;
        public double speed;
    }
    public class Armour extends Item
    {
        public double dmgResist;
        public double attSpdMod;    
    }
}
Weapon machinePistol = new Weapon();
因此,如果有人能告诉我如何正确地实例化一件武器(这样我就可以设置其字段的值并将其提供给玩家),我将不胜感激。

要做到这一点:

Item machinePistol = new Item();
Weapon machinePistol = new Item.Weapon();
您希望将内部类声明为
静态

 public static class Weapon extends Item
 {

  public double damage;
  public double speed;

 }

 public static class Armour extends Item
 {
  public double dmgResist;
  public double attSpdMod; 

 }
或者另一个(更好的)选择是不让它们成为内部类:

public class Item {}
public class Weapon extends Item {}
public class Armour extends Item {}
然后你可以把它们做成这样

Item machinePistol = new Item();
Item machinePistol = new Weapon();
Item someArmour = new Armour();

你不应该在
物品
中声明
武器
盔甲
。只需在外面申报:

因此,您可以这样实例化它们:

package JavaAIO;

public class Item 
{
    public String itemName;
    public double itemWeight;

    public class Weapon extends Item
    {
        public double damage;
        public double speed;
    }
    public class Armour extends Item
    {
        public double dmgResist;
        public double attSpdMod;    
    }
}
Weapon machinePistol = new Weapon();
“无法访问Item类型的封闭实例。必须使用Item类型的封闭实例限定分配(例如x.new A(),其中x是Item的实例)

这很能自我解释:

Item machinePistol = new Item().new Weapon(); 
或:

但是,我强烈建议您将他们放在自己的课程中,这样您就可以得到:

Item machinePistol = new Weapon();

哇,谢谢你,大多数善良的人都不认为它这么简单。我也试过了,但它只是说“公共类型Armor必须在它自己的文件中定义”@James是的,你应该为你定义的三个类中的每一个都有一个文件,因为它们不是内部类。对,我将结合这些,还有其他一些答案所说的,非常感谢你们能很快回答!这同样有效,但是为什么你强烈建议将它们放在它们自己的类中呢?这样你就可以创建一个武器,而不必先创建一个项目。此外,内部类通常被认为是由它们的父(子)类独占使用的。如果它们曾经在外部使用过,那么现在正是将它们重构为自己的类的时候了。声明内部类
static
也可以避免额外的开销(允许您使用
new Item.wearm()
-这在@Joel的回答中很好地表现出来)。不过我还是同意,在这种情况下,最好将它们放在自己的范围内。这也应该很方便:谢谢你,也谢谢卫斯理编辑了我的代码snipet,使它看起来正确。可能是