2015-11-11 81 views
0

當我創建「Sword」的實例並調用getName()時,我收到null。我怎樣才能讓它在武器類中的getName()返回在武器中設置的任何「名稱」。Java - 擴展超類的類的返回字段值

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

劍的名字變量是武器中隱藏的名字,只是說'name =「鋼劍」;' – FredK

回答

3

你在Swordname變量是一個比Weapon不同 - 它那個在Sword。當你有一個Weapon類型的變量時,訪問名將訪問Weaponname,這是未初始化的,所以它仍然是null

,而不用聲明一個新的變量,你可以在Sword,現有name變量設置爲你想要創建一個構造。

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傷害你只需調用它的超構造是這樣的:

public class Sword extends Weapon { 

    public Sword() { 
     super("Sword", 10); //Calls the constructor from the Weapon class with the values "Sword" and 10 
    } 
} 

我認爲這是非常優選的方案,因爲它會導致編譯時警告,如果Sword不叫牛逼他是武器的構造函數,它將確保所有字段都被正確初始化。