我正在制作一个小RPG。有一个Item类,它是游戏中每个项目的父级。这些物品可以是药水(这是一个类)或绷带(这是一个类)。
Item类看起来像这样:
public class Item
{
int qty;
String name;
Hero hero1;
public void passHero(Hero hero1)
{
this.hero1 = hero1;
}
public void use()
{
if(qty == 0)
{
System.out.println("You have no more of this item to use.");
}
else
{
qty--;
}
}
public void addInv(int value)
{
qty = qty + value;
}
}
传递Hero类的方法。 一种使用项目的方法。 添加到商品库存的方法。
此方法激活这些项类:
public void initializeItemInventory()
{
items[0] = new Potion();
items[1] = new Bandage();
}
理论上,这种方法可以打印所有项目及其数量:
public void useInventory()
{
for(int i = 0; i<items.length; i++)
{
System.out.println("Enter: " + i + " for " + items[i].name);
}
int response = input.nextInt();
items[response].use();
}
作为一个例子,Potion类有一个实例变量,如:
String name = "Potion";
所以我的问题。为什么在useInventory
方法中没有正确调用Potion的名称变量。它返回null
,它告诉我它返回父类Item
名称,而不是单个子类变量的名称。
答案 0 :(得分:3)
public class Item
{
int qty;
String name;
...
Item
类已经有name
,这是您从Item
类型变量中访问的内容:
items[0].name
所以,如果你有
public class Potion extends Item
{
String name = "Potion";
...
然后Potion
类有两个 name
字段:
Potion p = new Potion();
System.out.println(p.name);
System.out.println((Item) p).name);
正如您所说,您需要多态,但它仅适用于方法。因此,你需要一个吸气剂:
public class Item
{
String name;
public String getName() { return name; }
...
在Potion
子类中,您可能有
public class Potion extends Item
{
public Potion() { this.name = "Potion"; }
...
和items[0].getName()
现在将按预期工作。
我将添加此内容以显示多态性的一些功能。
如果碰巧同一类的所有实例的name
属性始终相同,则可以通过完全消除存储name
变量的需要轻松地重构基于getter的解决方案:
public class Item
{
public String getName() { return "Generic item"; }
...
public class Potion extends Item
{
@Override public String getName() { return "Potion"; }
...
答案 1 :(得分:2)
而不是在你的子类中声明一个新的变量,如&#34; String name =&#34; Potion&#34 ;;&#34; 使用构造函数将值传递给超类,如下所示:
// the Item supuerclass has one constructor
public Item(name) {
this.name = name;
}
// the Potion subclass has one constructor
public Potion() {
super("Potion");
}