当我创建" Sword"的实例并调用getName()时,我收到null。我怎样才能使Weapon类中的getName()返回" name"设置为武器。
public abstract class Weapon extends items.Item {
public String name;
public int damage;
public ItemType itemType = ItemType.Weapon;
public String getName(){
return name;
}
}
public class Sword extends Weapon{
int damage = 10;
int manaCost = 0;
String name = "Steel Sword";
}
答案 0 :(得分:3)
name
中的Sword
变量与Weapon
中的变量不同 - 隐藏 Sword
中的变量。当您拥有Weapon
类型的变量时,访问名称将会访问Weapon
的{{1}},这是未初始化的,因此它仍为name
。
您可以在null
中创建一个将现有Sword
变量设置为您想要的变量,而不是声明新变量。
答案 1 :(得分:1)
您可以向Weapon
类添加构造函数,以便其所有子类必须使用它来初始化该类的正确数据
public abstract class Weapon {
public String name;
public int damage;
public ItemType itemType = ItemType.Weapon;
public Weapon(String name, int damage) {//Constructor for creating a weapon to be used by subclasses
this.name = name;
this.damage = damage;
}
}
然后创建一个名为“Sword”且损坏为10的Sword
,你只需调用它的超类构造函数:
public class Sword extends Weapon {
public Sword() {
super("Sword", 10); //Calls the constructor from the Weapon class with the values "Sword" and 10
}
}
我认为这是首选的解决方案,因为如果Sword
没有调用武器的构造函数,它将导致编译时警告,并且它将确保正确初始化所有字段。