3 回答

TA貢獻1911條經驗 獲得超7個贊
您定義cat為 type Cat。這意味著cat可以做任何其他人可以做的事情Cat。該Animal對象確實定義了該make_a_sound函數,因此它可用于所有Animal實例。當您運行代碼時,該變量cat指向一個Tiger實例,因此當make_a_sound被調用時,它就是運行的實例Tiger。這就是繼承的全部意義。
對于你的第二個問題,cat是類型,Cat所以你只能用它做你可以用任何Cat對象做的事情。由于this_is_a_Tiger不是每個對象都有的東西,所以即使Cat它確實指向.catcatTiger
但你可以這樣做:
if (cat instanceof Tiger) {
Tiger tiger = (Tiger)cat;
System.out.println(tiger.this_is_a_Tiger);
}

TA貢獻1893條經驗 獲得超10個贊
此鏈接可以為您提供一些有關Java 中 覆蓋的概念: https ://www.geeksforgeeks.org/overriding-in-java/
為了簡單起見,Overriding
僅對方法有效(關于問題1),而不對字段變量有效(關于問題2)。

TA貢獻1803條經驗 獲得超6個贊
為什么Cat使用Tigers方法?請參閱下面的“make_a_sound”方法示例。它來自 Tiger,但 Cat 可以使用它。
回答)因為當你說 Cat cat = new Tiger() 時,你并不是說任何貓,而是說你想要老虎的聲音,而不是任何通用的貓。Tiger 通過覆蓋實現來使用貓的“make_a_sound”方法猛虎聲響。
如果你沒有覆蓋 Tigers 的“make_a_sound”方法,那么 Cat 的“make_a_sound”方法將被調用。你可以通過在 Tiger 類中使用 super().make_a_sound 或刪除此方法的實現來嘗試。
2)為什么Cat看不到Tiger的任何屬性?貓可以使用老虎的方法“make_a_sound”,但看不到它的屬性......很奇怪。
回答)如果父類知道子類的一切,那么 OOPS 就會被破壞。在 OOPS 中,每個類應該只知道它做什么,而不知道其他的。它不關心其他類的責任。
添加回答
舉報