[英]JAXB, marshalling sub-class that has the same rootNode name as the superclass
[英]Not able to access Sub-Class instance variable that has been assigned to a SuperClass Reference
這一直困擾着我一段時間。 我是認真的OOps概念的新手,並且遇到了。 這是我所擁有的:
類猿:
public class ape {
String name;
public String getBehavior() {
return "I am apeshit";
}
}
類人:
public class humano extends ape {
public String name;
public humano(String namevalue) {
name = namevalue;
}
public String getBehavior() {
return "I am a :" + name;
}
public String getName() {
return name;
}
}
neandarthal類:
public class neandarthal extends ape {
String name;
public neandarthal(String name) {
super.name = name;
}
public String getBehavior() {
return "I am a :" + name;
}
public String getName() {
return name;
}
}
Species_Factory類:
公共類species_factory {
static ape ap = null;
static ape getSpecies(String name) {
if (name == "humano") {
return new humano(name);
}
if (name == "neandarthal") {
return new neandarthal(name);
}
else {
return ap;
}
}
}
最后是主類:
public class species {
public static void main(String args[]) {
ape a1 = species_factory.getSpecies("humano");
ape a2 = species_factory.getSpecies("neandarthal");
System.out.println(a1.name);
System.out.println(a2.name);
System.out.println(a1.getBehavior());
System.out.println(a2.getBehavior());
System.out.println(a1.getClass().getSuperclass().getName());
}
}
輸出:
null
neandarthal
I am a :humano
I am a :null
ape
我有關於空值的查詢。 基本上,當我嘗試顯示System.out.println(a1.name)
。 我看到null
。 為什么是這樣?
我看到我在第三行中得到的值I am a :humano
,這意味着我為字符串變量name
傳遞的值正在存儲在humano
實例中。
但是,當我嘗試使用語句System.out.println(a1.name)
顯示相同的變量時,為什么不顯示該變量?
抱歉,由於我缺乏理解,這可能是一個愚蠢的問題。但是非常感謝您的答復。
基本上,當我嘗試顯示“ System.out.println(a1.name)”時,我看到的是null。 為什么是這樣?
這里的主要問題是,通過在humano
和neandarthal
重新聲明name
,您將掩蓋 ape
中存在的name
字段。 這意味着humano
和neandarthal
創建的對象具有兩個 name
字段:一個由ape
定義,而另一個由它們自己定義。 然后在代碼中,您對使用哪個name
字段非常不一致。
你幾乎可以肯定是要刪除的name
在聲明中humano
和neandarthal
(然后用this.
不super.
上name
),讓你在使用領域中聲明ape
。
您看到的具體原因有:
"null"
): humano
分配給它自己的 name
字段,但是當您在main
使用a1.name
時,由於a1
被聲明為ape
,因此它使用ape
的name
字段(仍然為null
,什么也沒有曾經分配給它)。 "neandarthal"
): neandarthal
分配給ape
的name
字段( super.name = ...
),而不是它自己的名稱。 由於a2
被聲明為ape
,因此a2.ape
使用它,您會看到分配的字符串。 "I am a :humano"
): humano
的getBehavior
使用其自己的name
字段,而不是ape
的name
字段,因此您可以看到構造函數為其分配了什么。 "I am a :null"
): neandarthal
的getBehavior
使用其自己的 name
字段,該字段仍然為null
因為沒有分配任何內容。 "ape"
):我不認為您對此感到困惑,但是humano
的超類是ape
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.