2012-04-14 58 views
0

嘗試獲取子級嵌套靜態類的字段值時,獲取null。 * 1 *每個類文件用水平線分隔。如何檢索孩子戰士的價值?無法獲取具有抽象父級的子級嵌套類的字段


abstract class GameCahracter{ 

     public String name; 

    public String type; 

    public Weapon weapon; 

    public int hitPoints; 

    public String getDescription(){ 

     return type + "; " + name + "; " + hitPoints + " hp; " + weapon.type; 
    } 

    public static class Warrior extends Player{ 

     public final String type = "Warrior"; 

     public int hitPoints = 100; 

     public static final Weapon.Sword weapon = new Weapon.Sword(); 

    } 
} 

abstract class Player extends GameCahracter { 

} 

GameCahracter.Warrior wr = new GameCahracter.Warrior(); 

wr.name = "Joe"; 

System.out.println(wr.getDescription()); 

OUTPUT:

null; Joe; 0 hp; null 

回答

3

不要重新申報成員變量。相反,你應該在構造函數中設置值。

public static class Warrior extends Player{ 
    public Warrior() { 
     type = "Warrior"; 
     hitPoints = 100; 
     weapon = new Weapon.Sword(); 
    } 
} 

另一種選擇是創建一個GameCahracter構造函數匹配每個成員變量的那個論點。

作爲一個方面說明:公共成員變量是一個壞主意。

+0

*公共成員變量是一個壞主意。*。你的意思是我應該將* Warrior *課程定義爲私人課程嗎?如果是這樣,那我該如何訪問它? – 2012-04-14 14:32:37

+1

@RCola:您可以根據需要使getter/setter方法提供訪問權限。這允許您保持類的API保持不變,即使您改變了內部結構類的方式。使用方法而不是公共成員也可以驗證輸入。目前任何人都可以將hitPoints設置爲1000或-1000。 – unholysampler 2012-04-14 14:37:08

1

GameCahracter.nameGameCahracter.hitPoints未分配,因此它們保持爲空。 Warrior.nameWarriorhitPoints.hitPoints已分配,但它們是不同的字段。在父母和孩子中使用相同名稱的字段是不好的主意(與方法不同)。

相關問題