1. 程式人生 > >java建立一個子類物件是會呼叫父類的構造方法會不會建立父類

java建立一個子類物件是會呼叫父類的構造方法會不會建立父類


第三個部分就是java原始碼中的構造方法中的程式碼,java原始碼中有幾個構造方法,那麼class檔案中就有幾個初始化方法,編譯器會把第一部分與第二部分分別複製到每個初始化方法的前端,然後把初始化方法對應引數的構造方法的程式碼複製到相應初始化方法中(這裡說的複製其實應該說是編譯,不過為了讓你更好理解所以如此說).
那麼說初始化方法如何追述其父類的,這也關係到初始化方法的結構,初始化方法的執行順序以及結構就如上所說,但是每個初始化方法的第一個執行指令就是呼叫另外一個初始化方法,這個初始化方法可能是自身類某個初始化方法,例如你的建構函式中第一句有類似this(...)這種語句,那麼初始化方法就會呼叫自身類的指定構造方法;如果你的構造方法中沒有指定構造方法呼叫,那麼初始化方法會預設呼叫父類無引數初始化方法,如果你的子類第一句為 super(....),那麼初始化方法會呼叫父類指定初始化方法。這種呼叫過程會遞迴進行呼叫,直到這個類是java.lang.Object類。
呼叫初始化方法並不代表會生成物件,你的java程式碼中出現new關鍵字加上構造方法的呼叫,只會生成一個物件,其父類物件不會生成,所以呼叫父類為抽象類的構造方法完全是合理的。而且初始化方法對於虛擬機器來說只是一個名稱叫做" <init>"的普通方法,區別只是生成物件以後呼叫而已(sun 的jdk私有包中有繞過構造方法生成物件的方式,可以證明之上說法,具體如何我這裡不陳述)。
然後回答你的第二個問題,抽象類中的構造方法其實是用來給繼承的子類來用的,因為構造方法相當於初始化方法,當子類呼叫構造方法時必須呼叫父類構造方法,所以你可以在子類產生物件時抽象類中按需求初始化抽象類中的欄位以及執行一些初始化程式碼。其實並不是一定要生成某個類的例項才呼叫構造方法,子類也需要呼叫父類構造方法。而生成例項也並不一定會呼叫構造方法,在某些特殊實現中或者特殊情況下,生成例項不會呼叫構造方法。而呼叫了構造方法也不一定就生成了一個例項,但是那一定是一個例項呼叫的,就像一個普通的例項方法一樣。