為什么會(huì)這樣輸出?
為什么輸出中dog.mothod( );和重寫toString( )方法的結(jié)果中age都為Animal類中的age的值10,而不是22,name都為dog.name="xiaoming",而不是“Cat”。
為什么輸出中dog.mothod( );和重寫toString( )方法的結(jié)果中age都為Animal類中的age的值10,而不是22,name都為dog.name="xiaoming",而不是“Cat”。
2016-09-06
舉報(bào)
2016-09-06
在Dogs里面聲明了age變量同時(shí)又繼承了父類里面的age變量,這時(shí)候主程序?qū)ge賦值實(shí)際上是dog.this.age=22;而super.age的初始值是Animal定義的=10;
你在mothod函數(shù)里面調(diào)用super.eat函數(shù)使用的是super.age,也就是為10. 同時(shí)對(duì)于從Animal繼承的toString函數(shù)里面調(diào)用的也是super.age,同樣結(jié)果為10.
而name由于在子類沒(méi)有被定義同名變量所以主函數(shù)賦值的xiaoming,從而在Animal里面賦值語(yǔ)句沒(méi)有被執(zhí)行,所以輸出的都是xiaoming。
-----------------上面說(shuō)的不太清楚,我從內(nèi)存的角度說(shuō)下吧-----------------
先實(shí)例Animal,內(nèi)存:地址1-》age ? 地址2-》name;eat函數(shù)和toString調(diào)用地址1和地址2的變量
再接著實(shí)例Dogs,內(nèi)存變成:地址1-》super.age ? 地址2-》name ? 地址3-》this.age;super.eat函數(shù)和toString調(diào)用地址1和地址2的變量;eat函數(shù)不調(diào)用變量;method函數(shù)調(diào)用super.eat函數(shù);
主函數(shù)的age賦值給地址3,name賦值給地址2,Animal的age賦值給了地址1,name本該賦值給地址2但是主函數(shù)賦值過(guò)所以不操作;
希望這樣表述你能明白
2016-09-06
age是全局變量,所以兩次賦值都改變了同一內(nèi)存中的值,而name是局部變量,兩次改變不是同一內(nèi)存地址的值,取第一次賦值的值
2016-09-06
把dog類的第四行注釋掉
2016-09-06
把第四行注釋掉試試?