課程
/后端開發
/Java
/Java入門第二季 升級版
為什么輸出中dog.mothod( );和重寫toString( )方法的結果中age都為Animal類中的age的值10,而不是22,name都為dog.name="xiaoming",而不是“Cat”。
2016-09-06
源自:Java入門第二季 升級版 9-8
正在回答
在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但是主函數賦值過所以不操作;
希望這樣表述你能明白
慕粉18883846529 提問者
age是全局變量,所以兩次賦值都改變了同一內存中的值,而name是局部變量,兩次改變不是同一內存地址的值,取第一次賦值的值
把dog類的第四行注釋掉
把第四行注釋掉試試?
舉報
課程升級!以終為始告別枯燥,在開發和重構中體會Java面向對象編程的奧妙
1 回答為什么會這樣輸出
3 回答為什么會輸出num1:91?
1 回答為什么順序是這樣輸出的?
3 回答為什么會這樣
3 回答為什么我運行出來會這樣?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-09-06
在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但是主函數賦值過所以不操作;
希望這樣表述你能明白
2016-09-06
age是全局變量,所以兩次賦值都改變了同一內存中的值,而name是局部變量,兩次改變不是同一內存地址的值,取第一次賦值的值
2016-09-06
把dog類的第四行注釋掉
2016-09-06
把第四行注釋掉試試?