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

8

我目前正在使用Java制作基于文本的冒险游戏,以便将其用作测试平台,尝试使用我正在阅读的Java书籍中学到的新知识。

我现在正在尝试声明一个子类的实例(因为玩家会找到它)。 父类是Item,它有两个子类:WeaponArmour

然而,无论我如何声明它,在我使用的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();

以下是该项的类别:

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;    
    }
}

如果有人可以告诉我如何正确地实例化武器(以便我可以设置其字段的值并将其交给玩家),我将不胜感激。


这也应该很方便:http://download.oracle.com/javase/tutorial/java/javaOO/nested.html - Bad Request
谢谢你,也感谢Wesley编辑我的代码片段,使其看起来正确。 - James
可能是重复的问题:Java - No enclosing instance of type Foo is accessible - fabian
3个回答

13

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

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

然而,我强烈建议将它们放入自己的类中,这样你就可以得到:

Item machinePistol = new Weapon();

这个也可以运行,但为什么你强烈建议把它们放在自己的类中? - James
这样你就可以创建一个武器,而不必先创建一个物品。此外,内部类通常只应由其父(子)类专用。如果它们被用于外部,则是重构为它们自己的类的时候了。 - BalusC
将内部类声明为static也可以避免额外的开销(允许您使用new Item.Weapon()实例化它们 - 正如@Joel在他的答案中非常漂亮地展示的那样)。尽管如此,我认为在这种情况下,最好将它们放在自己的作用域中。 - Levite

6

要做到这一点:

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

你需要将内部类声明为 static

 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();

哇,谢谢你这么好的人,我没想到那么简单。 - James

1

你不应该在 Item 类中声明 WeaponArmour 类。应该在外部声明:

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();

我也试过,但它只是说“公共类型Armour必须在自己的文件中定义”。 - James
1
@James 是的,你应该为你定义的这三个类中的每一个都有一个文件,因为它们不是内部类。 - unholysampler
好的,我会结合其他答案中提到的内容来解决问题,非常感谢你们的快速回复! - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接