gpt4 book ai didi

Java静态内部类返回null

转载 作者:行者123 更新时间:2023-12-02 02:42:15 28 4
gpt4 key购买 nike

我在尝试创建 kanji 类的实例时遇到问题。它应该有 2 个静态内部类。每个内部类应该包含两个字符串。

当我实例化该类时,它将两个静态内部类返回为空。

完整类(class)如下。我的构造函数正确吗?如果我没有内部类及其静态字符串,则会抛出错误。

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

我的类(class)

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;
}
}

最佳答案

我认为这段代码有两个问题。

第一个(导致 onyomikunyomi 字段为 null 的事实)是,在构造函数代码中,您没有初始化这些变量,因此不,构造函数不正确

您需要在构造函数中添加以下两行:

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);

我在 Kanji 类中添加了一个 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”汉字信息的 Kanji 对象也更改了保存“now”汉字信息的 Kanji 对象的 toString 结果

这里的问题是 Onyomi 和 Kunyomi 类中的字段是静态的,这意味着整个应用程序中这些字段只有一份副本(或者加载的每个 Onyomi/Kunyomi 类一份副本,我不确定),而不是为每个 Onyomi/Kunyomi 对象创建一份副本。
这意味着每次创建新的 Kanji 对象时,Kanji 构造函数都会删除之前的 Kunyomi 罗马字和平假名字段,以及之前的 Onyomi 罗马字和片假名字段。
因此,您可能想要删除字段的 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;
}

在 Kanji 构造函数中,您将能够按照您的方式进行操作,或者这样:

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_);
}

关于Java静态内部类返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45259453/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com