先說結論
對於具有繼承關係的類,它們的類和物件構造順序為:父類的類構造器() -> 子類的類構造器() -> 父類成員變數的賦值和例項**塊 -> 父類的建構函式 -> 子類成員變數的賦值和例項**塊 -> 子類的建構函式。
實驗**如下:
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...