Java - 返回扩展超类的类的字段值

时间:2015-11-11 20:48:38

标签: java

当我创建" 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";
}

2 个答案:

答案 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没有调用武器的构造函数,它将导致编译时警告,并且它将确保正确初始化所有字段。