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