簡體   English   中英

無法訪問已分配給超類引用的子類實例變量

[英]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。 為什么是這樣?

這里的主要問題是,通過在humanoneandarthal重新聲明name ,您將掩蓋 ape中存在的name字段。 這意味着humanoneandarthal創建的對象具有兩個 name字段:一個由ape定義,而另一個由它們自己定義。 然后在代碼中,您對使用哪個name字段非常不一致。

你幾乎可以肯定是要刪除的name在聲明中humanoneandarthal (然后用this.super.name ),讓你在使用領域中聲明ape

您看到的具體原因有:

  • 第一行( "null" ): humano分配給它自己的 name字段,但是當您在main使用a1.name時,由於a1被聲明為ape ,因此它使用apename字段(仍然為null ,什么也沒有曾經分配給它)。
  • 第二行( "neandarthal" ): neandarthal分配給apename字段( super.name = ... ),而不是它自己的名稱。 由於a2被聲明為ape ,因此a2.ape使用它,您會看到分配的字符串。
  • 第三行( "I am a :humano" ): humanogetBehavior使用其自己的name字段,而不是apename字段,因此您可以看到構造函數為其分配了什么。
  • 第四行( "I am a :null" ): neandarthalgetBehavior使用其自己的 name字段,該字段仍然為null因為沒有分配任何內容。
  • 第五行( "ape" ):我不認為您對此感到困惑,但是humano的超類是ape

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM