2017-07-22 56 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。除非你使用默认的构造函数。