亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

一個困惑我幾天才解決的看似簡單的問題,明白了對多態理解更深了一點

父類:
public?class?Animal?{
?String?name="動物";?
}

子類:
public?class?Dog?extends?Animal{
?String?name="外狗";
?
?public?Dog(){???
??name="內狗";
?}
}

測試類:
public?class?TestAnimal?{
?public?static?void?main(String[]?args)?{
??Animal?dog=new?Dog();
??System.out.println(dog.name);
?}
}

問題:
測試類結果為:
動物
但是當我注釋掉?子類String?name="外狗";這行代碼
測試類結果為:
內狗
為什么?


正在回答

8 回答

子類:
public?class?Dog?extends?Animal{
?String?name="外狗";?//?這是定義了一個新的變量name,下面的name也是修改的這個新的變量,而不是父類中定義的那個name
??
?public?Dog(){???
??name="內狗";
?}
}

如果你把自類中String name改成String name1,運行結果會是 內狗。


0 回復 有任何疑惑可以回復我~

Animal?dog=new?Dog();

System.out.println(dog.name);

//Dog調用的是父類中的name屬性或著(子類中繼承或重寫的父類屬性),

String?name="外狗";?//?這是定義了一個新的變量name,不能被父類引用


0 回復 有任何疑惑可以回復我~

錯了? 沒弄清楚

0 回復 有任何疑惑可以回復我~

初始化順序 父類 》》子類?????? 父類對象》子類對象》構造方法

0 回復 有任何疑惑可以回復我~

????? 正如我采納答案所說,我在子類定義了一個String name="外狗",明確了這個變量是子類的變量,它會根據多態的規則,子類同名屬性并不會覆蓋父類屬性,而是都存在的(存在哪里?內存這塊我還不清楚),所以子類構造函數初始化了子類的屬性name為“內狗”,而Anima dog=new Dog(),? dog還是用的父類的屬性name="動物"

???? 而我沒有明確定義String name=“外狗”這句,子類構造函數默認用的name是父類的name(很容易就以為初始化的是子類的屬性name), name="內狗"這行等同于super.name="內狗"。

????想更清楚的話,可以去看看這個博客 http://blog.csdn.net/l_b_h_w/article/details/52665231

2 回復 有任何疑惑可以回復我~
#1

米柚

多謝~受益了!
2017-02-19 回復 有任何疑惑可以回復我~
#2

ffs555

第一次運行的結果不是外狗嗎?dog指向的不是子類的屬性name嗎?為什么是父類的name?
2017-02-23 回復 有任何疑惑可以回復我~
#3

ffs555

Anima dog=new Dog(), 為什么dog還是用的父類的屬性name="動物"? 不是子類才對嗎?
2017-02-23 回復 有任何疑惑可以回復我~

對象和引用這部分我弄的有點不清楚 ,請詳解

0 回復 有任何疑惑可以回復我~

為什么我寫了一個結果還是沒變呢?

0 回復 有任何疑惑可以回復我~

這是為什么呢。。。

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

一個困惑我幾天才解決的看似簡單的問題,明白了對多態理解更深了一點

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號