New一個子類物件的時候是否建立了父類的物件
阿新 • • 發佈:2019-01-10
首先:很堅決的說沒有建立父類的物件!!!
1.首先從子類到直接父類,依次執行父類的構造方法(沒有顯示呼叫構造方法的情況下),這個過程執行父類成員的初始化。
我仔細把書上繼承那章又讀了好幾遍!!!書上說的很明確,“創鍵子類的物件的時候,會先呼叫父類的建構函式!會先呼叫父類建構函式!會先呼叫父類的建構函式!”(重要的事情說三遍)!!並沒有說會建立父類的物件,沒說!!!!書上其實寫的很微妙!應該直接指明這一點,防止學生誤解!
2.最後呼叫本類的構造方法。
以上兩步的結果是建立了本類物件,這個物件如圖:
從圖中可知,壓根沒有父類物件,只有子類物件,而且this完全引用這個物件,super只是引用了這個物件中從父類繼承來的成員,也就是說,除了super不能訪問子類定義的成員之外,super和this是同一個物件,這可以通過toString()方法驗證(如果子類沒有重寫toString()方法,則呼叫父類的該方法,如果父類沒有,再找父類的父類,直到Object的toString()方法)。
Object類toString方法:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
getClass 和 getName 都是Object類的方法。
總之,沒有super這個物件,他只是引用了子類物件的一部分資料(也就是從父類繼承到的資料),所有無法輸出super。那麼為什麼能輸出super.toString()呢,原因在前面圖中,這個呼叫過程是先試圖呼叫從子類物件的直接父類繼承的toString方法(注意:super.toString()是顯式呼叫),如果沒有則向上追述知道Object。