java中具有繼承關係的類及其物件初始化順序

2021-09-12 18:13:17 字數 993 閱讀 9356

先說結論

對於具有繼承關係的類,它們的類和物件構造順序為:父類的類構造器() -> 子類的類構造器() -> 父類成員變數的賦值和例項**塊 -> 父類的建構函式 -> 子類成員變數的賦值和例項**塊 -> 子類的建構函式。

實驗**如下:

public class extensiontest 

}class superclass

static

public superclass()

}class subclass extends superclass

static

public subclass()

}

結果:

我是父類類構造塊

我是子類類構造塊

我是父類例項塊

我是父類建構函式塊

我是子類例項塊

我是子類建構函式塊

解釋:類構造塊是初始化類的時候執行的,而初始化類首先得載入類(不載入類進記憶體當然沒法初始化)。

類例項塊是放在該類建構函式最前面和父類建構函式之後執行的。因為子類的構造函式呼叫之前,會先呼叫父類的建構函式。

基於上述兩條規則,我們再來看執行順序。

new subclass()也就是要構造subclass這個類的乙個物件,而要構造這個物件,首先必須把這個類的描述、定義載入進記憶體(類載入)。因此要先載入這個類(不過此時還未初始化)。

載入完這個類之後,想要構造這個類的物件。但是此時這個類的靜態變數還未被初始化,因此要先初始化這個類,但是初始化這個類需要先初始化它的父類,因此此時就變成了,載入父類->初始化父類(呼叫靜態塊,即類構造塊)

->初始化子類(呼叫靜態塊,即類構造塊)。

然後就可以構造這個類的物件了,構造這個類的物件之前,要先構造父類物件,因此會先呼叫父類的建構函式,而呼叫父類建構函式之前又會先呼叫父類的例項塊。

然後就到了子類建構函式,然而執行之前一樣要先呼叫子類的例項塊,最後才是子類的建構函式的函式體。

java中具有繼承關係的類及其物件初始化順序

先說結論 對於具有繼承關係的類,它們的類和物件構造順序為 父類的類構造器 子類的類構造器 父類成員變數的賦值和例項 塊 父類的建構函式 子類成員變數的賦值和例項 塊 子類的建構函式。實驗 如下 public class extensiontest class superclass static pu...

java中具有繼承關係的類及其物件初始化順序

先說結論 對於具有繼承關係的類,它們的類和物件構造順序為 父類的類構造器 子類的類構造器 父類成員變數的賦值和例項 塊 父類的建構函式 子類成員變數的賦值和例項 塊 子類的建構函式。實驗 如下 public class extensiontest class superclass static pu...

PHP中類的繼承關係

原文 php中類的繼承關係 在php中,我時常會寫乙個類,類寫了乙個共用方法,然後讓子類去繼承就能得到相應的功能。假設大致有這麼乙個父類 1 2 class father 7 8 protected function say str hello world 11 12 然後呢,搞乙個子類去繼承他 1...