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

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

為什么會這樣輸出?

57ce94d10001809205000320.jpg

57ce94d80001d9e905000228.jpg

57ce94de00014db105000320.jpg

57ce94e50001326703920095.jpg

為什么輸出中dog.mothod( );和重寫toString( )方法的結果中age都為Animal類中的age的值10,而不是22,name都為dog.name="xiaoming",而不是“Cat”。

正在回答

4 回答

在Dogs里面聲明了age變量同時又繼承了父類里面的age變量,這時候主程序對age賦值實際上是dog.this.age=22;而super.age的初始值是Animal定義的=10;

你在mothod函數里面調用super.eat函數使用的是super.age,也就是為10. 同時對于從Animal繼承的toString函數里面調用的也是super.age,同樣結果為10.

而name由于在子類沒有被定義同名變量所以主函數賦值的xiaoming,從而在Animal里面賦值語句沒有被執行,所以輸出的都是xiaoming。


-----------------上面說的不太清楚,我從內存的角度說下吧-----------------

先實例Animal,內存:地址1-》age ? 地址2-》name;eat函數和toString調用地址1和地址2的變量

再接著實例Dogs,內存變成:地址1-》super.age ? 地址2-》name ? 地址3-》this.age;super.eat函數和toString調用地址1和地址2的變量;eat函數不調用變量;method函數調用super.eat函數;

主函數的age賦值給地址3,name賦值給地址2,Animal的age賦值給了地址1,name本該賦值給地址2但是主函數賦值過所以不操作;

希望這樣表述你能明白

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

慕粉18883846529 提問者

非常感謝!
2016-09-06 回復 有任何疑惑可以回復我~

age是全局變量,所以兩次賦值都改變了同一內存中的值,而name是局部變量,兩次改變不是同一內存地址的值,取第一次賦值的值

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

把dog類的第四行注釋掉

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

把第四行注釋掉試試?

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

舉報

0/150
提交
取消
Java入門第二季 升級版
  • 參與學習       531142    人
  • 解答問題       6326    個

課程升級!以終為始告別枯燥,在開發和重構中體會Java面向對象編程的奧妙

進入課程

為什么會這樣輸出?

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

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

幫助反饋 APP下載

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

公眾號

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