2012-04-14 104 views
0

我需要創建新的戰士,分配名稱,並獲得與GameCahracter類中指定的函數的描述。當我嘗試運行時 - 在weapon.type ; // <<Exception上停止顯示weapon=null。爲什麼?據我所知戰士的構造函數分配給變量weapon一個鏈接到新武器。劍。然後使用可變武器,我應該可以訪問它的字段type。這裏有什麼問題?嵌套的靜態類無法返回其靜態字段


abstract class GameCahracter{ 
    public String name; 
    public String type; 
    public Weapon weapon; 
    public int hitPoints; 

    public String getDescription(){ 
     return name + "; " + 
     type + "; " + 
     hitPoints + " hp; " + 

     weapon.type ; // << Exception 
    } 

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

abstract class Player extends GameCahracter { 

} 

abstract class Weapon { 
    public int damage; 
    public String type = "default"; 

    public int getDamage(){ 
     return this.damage; 
    } 

    public static class Sword extends Weapon{ 

     public Sword() { 

      String type = "Sword"; 
      int damage = 10; 
     } 

    } 
} 

GameCahracter.Warrior wr = new GameCahracter.Warrior();  
wr.setName("Joe"); 
System.out.println(wr.getDescription()); 

EDIT1

出於某種原因,我在打印時出現default字符串weapon.type。爲什麼?我怎樣才能得到typeSword

+2

你知道'Character'不拼寫'Cahracter'對嗎? – 2012-04-14 16:16:04

+0

@真理:至少它是一致的。就編譯器而言,這更重要。 – Makoto 2012-04-14 16:17:59

+0

謝謝,我知道人物是如何拼寫的。 =)問題是爲什麼* weapon *是* null *。 – 2012-04-14 16:22:14

回答

2

在這一刻您的構造函數將weapon字段保留爲null。只需創建一個Sword一旦超出範圍就被垃圾回收的實例。

因此,與

weapon = new Weapon.Sword(); 

或更好的改線

Weapon.Sword weapon = new Weapon.Sword(); 

Warrior構造與

this.weapon = new Weapon.Sword(); 

和你做了類似的錯誤在Sword構造,當你寫

String type = "Sword"; 
int damage = 10; 

改變他們

this.type = "Sword"; 
this.damage = 10; 
+0

它工作。但出於某種原因,我在打印時使用* default *字符串* weapon.type *。爲什麼?我怎樣才能得到*類型*字符串*劍*? – 2012-04-14 16:28:33

+1

在答案中,我寫你如何解決這個問題:D – dash1e 2012-04-14 16:34:31

3

您的問題是在這條線:

Weapon.Sword weapon = new Weapon.Sword(); 

您與當地的一個陰影的成員變量。

將其替換爲:

this.weapon = new Weapon.Sword(); 
1

你會在該行得到一個例外,因爲在你的GameCahracter實例變量weapon爲空。沒有代碼設置它的任何代碼。 Warrior構造函數中的代碼設置新局部變量的值,而不是類中的成員變量。