2017-07-22 118 views
0

我有一個問題,試圖創建一個漢字類的實例。它應該有2個靜態內部類。每個內部類都應該包含兩個字符串。Java靜態內部類返回null

當我實例化類時,它將兩個靜態內部類作爲空值返回。

全班在下面。我的構造函數是否正確?如果我沒有內部類和他們的字符串作爲靜態我得到一個錯誤拋出。

Kanji kanji = new Kanji("aaa","bbb","ccc","ddd","eee","fff"); 

我班

public class Kanji { 

public String character; 
public String meaning; 
public Onyomi onyomi; 
public Kunyomi kunyomi; 

public static class Onyomi { 
    public static String romaji; 
    public static String katakana; 
    public String getRomaji() { 
     return romaji; 
    } 

    public void setRomaji(String romaji) { 
     this.romaji = romaji; 
    } 

    public String getKatakana() { 
     return katakana; 
    } 

    public void setKatakana(String katakana) { 
     this.katakana = katakana; 
    } 

} 
public static class Kunyomi { 
    public static String romaji; 
    public static String hiragana; 

    public String getRomaji() { 
     return romaji; 
    } 

    public void setRomaji(String romaji) { 
     this.romaji = romaji; 
    } 

    public String getHiragana() { 
     return hiragana; 
    } 

    public void setHiragana(String hiragana) { 
     this.hiragana = hiragana; 
    } 
} 

public Kanji(String character_, String meaning_, String oR_, String oK_, String kR_, String kH_) { 
    this.character = character_; 
    this.meaning = meaning_; 
    this.onyomi.romaji = oR_; 
    this.onyomi.katakana = oK_; 
    this.kunyomi.romaji = kR_; 
    this.kunyomi.hiragana = kH_; 
} 

public String getCharacter() { 
    return character; 
} 

public void setCharacter(String character) { 
    this.character = character; 
} 

public String getMeaning() { 
    return meaning; 
} 

public void setMeaning(String meaning) { 
    this.meaning = meaning; 
} 

public Onyomi getOnyomi() { 
    return onyomi; 
} 

public void setOnyomi(Onyomi onyomi) { 
    this.onyomi = onyomi; 
} 

public Kunyomi getKunyomi() { 
    return kunyomi; 
} 

public void setKunyomi(Kunyomi kunyomi) { 
    this.kunyomi = kunyomi; 
} 
} 

回答

1

我認爲這個代碼有2個問題。

第一個(造成的事實onyomikunyomi字段爲空)是,在構造函數的代碼,你不初始化這些變量,所以沒有,構造是不正確

你需要什麼在構造函數中添加這些是2行:

this.onyomi = new Onyomi(); 
this.kunyomi = new Kunyomi(); 

設置onyomikunyomi字段,這樣前:

public Kanji(String character_, String meaning_, String oR_, String oK_, String kR_, String kH_) { 
    this.character = character_; 
    this.meaning = meaning_; 
    this.onyomi = new Onyomi(); 
    this.kunyomi = new Kunyomi(); 
    this.onyomi.romaji = oR_; 
    this.onyomi.katakana = oK_; 
    this.kunyomi.romaji = kR_; 
    this.kunyomi.hiragana = kH_; 
} 

第二個問題出現與該測試碼:

Kanji ima = new Kanji("今","now","ima_on","イマ","ima_kun","いま"); 
    System.out.println(ima); 
    Kanji kuruma = new Kanji("車", "car", "kuruma_on", "クルマ", "kuruma_kun", "くるま"); 
    System.out.println(kuruma); 
    System.out.println(ima); 

我添加一個toString函數是漢字類這樣的:

public String toString() { 
    return "Character="+character+" - Meaning="+meaning + "\nKunyomi=" + this.kunyomi.getRomaji() + "/" + this.kunyomi.getHiragana() + " - Onyomi="+onyomi.getRomaji()+"/"+onyomi.getKatakana(); 
} 

而且它產生這樣的輸出:

Character=今 - Meaning=now 
Kunyomi=ima_kun/いま - Onyomi=ima_on/イマ 
Character=車 - Meaning=car 
Kunyomi=kuruma_kun/くるま - Onyomi=kuruma_on/クルマ 
Character=今 - Meaning=now 
Kunyomi=kuruma_kun/くるま - Onyomi=kuruma_on/クルマ 

正如你所看到的,創建擁有'car'漢字信息的漢字對象也改變了漢字對象持有'now'漢字的toString結果信息

這裏的問題是,Onyomi和Kunyomi類中的字段是靜態的,這意味着在整個應用程序中將只有這些字段的一個副本(或每個Onyomi/Kunyomi類加載一個副本,我不是對此肯定),而不是每創建一個Onyomi/Kunyomi對象一個副本。
這意味着每次創建一個新的漢字對象時,漢字的構造函數都會刪除以前的Kunyomi romaji和Hiragana字段,以及之前的Onyomi romaji和Katakana字段。
所以,你可能想要刪除的字段static修飾符,就像這樣:

public static class Onyomi { 
    public String romaji; 
    public String katakana; 
    public String getRomaji() { 
     return romaji; 
    } 

    public void setRomaji(String romaji) { 
     this.romaji = romaji; 
    } 
    public String getKatakana() { 
     return katakana; 
    } 
    public void setKatakana(String katakana) { 
     this.katakana = katakana; 
    } 

} 
public static class Kunyomi { 
    public String romaji; 
    public String hiragana; 

    public String getRomaji() { 
     return romaji; 
    } 

    public void setRomaji(String romaji) { 
     this.romaji = romaji; 
    } 

    public String getHiragana() { 
     return hiragana; 
    } 

    public void setHiragana(String hiragana) { 
     this.hiragana = hiragana; 
    } 
} 

就這樣,前面的測試代碼輸出這樣的:

Character=今 - Meaning=now 
Kunyomi=ima_kun/いま - Onyomi=ima_on/イマ 
Character=車 - Meaning=car 
Kunyomi=kuruma_kun/くるま - Onyomi=kuruma_on/クルマ 
Character=今 - Meaning=now 
Kunyomi=ima_kun/いま - Onyomi=ima_on/イマ 

此外,漢字初始化本身Kunyomi/Onyomi創造的對象的領域。它應該是Kunyomi/Onyomi構造的工作要做到這一點:

在Onyomi類代碼,添加這些構造函數:

public Onyomi() { 
     romaji = null; 
     katakana = null; 
    } 

    public Onyomi(String romaji, String katakana) { 
     this.romaji = romaji; 
     this.katakana = katakana; 
    } 

在Kunyomi類,添加這些構造函數:

public Kunyomi() { 
     romaji = null; 
     hiragana = null; 
    } 

    public Kunyomi(String romaji, String hiragana) { 
     this.romaji = romaji; 
     this.hiragana = hiragana; 
    } 

而在漢字的構造函數中,你將可以按照你所做的方式或以這種方式進行:

public Kanji(String character_, String meaning_, String oR_, String oK_, String kR_, String kH_) { 
    this.character = character_; 
    this.meaning = meaning_; 
    this.onyomi = new Onyomi(oR_, oK_); 
    this.kunyomi = new Kunyomi(kR_, kH_); 
} 
+0

很好的外植體離子。ありがとう – user2202098

+0

どういたしまして,user2202098さん – HatsuPointerKun

1

你的構造不給予任何實例變量:onyomi,kunyomi。這些類可能是靜態的,但變量不是。無論哪種方式,他們需要初始化。

this.onyomi.romaji = oR_; 
this.onyomi.katakana = oK_; 

在這兩行之前沒有變量的初始化。事實上,構造函數在這兩條線上拋出一個NPE。除非你使用默認的構造函數。