我目前正在Java中进行基于文本的冒险,目的是将其用作测试平台,尝试从我正在阅读的这本Java书中学到的新东西。
我现在正在尝试声明一个子类的实例(因为播放器已编写脚本来查找它)。
父类为Item
,它有两个子类:Weapon
和Armour
。
但是,无论我尝试以何种方式声明它,我正在使用的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;
}
}
所以,如果有人能告诉我如何正确地实例化武器(所以我可以设置其字段的值并将其交给玩家),我将非常感激。
答案 0 :(得分:10)
“没有可以访问类型Item的封闭实例。必须使用类型为Item 的封闭实例限定分配(例如xx A(),其中x是Item的实例)。”
这是非常自我解释的:
Item machinePistol = new Item().new Weapon();
或者:
Item item = new Item();
Item machinePistol = item.new Weapon();
但是,我强烈建议将它们放在自己的类中,以便最终得到:
Item machinePistol = new Weapon();
答案 1 :(得分: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();
答案 2 :(得分:1)
您不应在 Weapon
内声明类Armour
和Item
。只需将它们声明为在之外:
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();