關於靜態塊 靜態屬性 構造塊 構造方法的執行順序

2021-09-10 12:04:34 字數 2711 閱讀 3643

總結:

1、類載入時,執行靜態**塊和初始化靜態變數。執行順序跟**順序一致。

2、類例項化時,初始化變數、執行**塊、執行構造。其中初始化變數和**塊的順序跟**順序一致。執行構造是在最後。

3、例項化子類時,會先呼叫父類的構造方法。呼叫構造方法之前,會先執行該類的**塊。

4、類只會載入一次。

5、靜態變數或靜態方法中如果呼叫構造,可以把構造當做乙個普通方法來看。但會先執行一遍**塊。

下面是在網上找到的比較典型的例子,以此來說明

例一:

class a 

private static string staticstr = getstaticstr();

private string str = getstr();

public a()

private static string getstaticstr()

private string getstr()

public static void main(string args)

}class b extends a

public b()

private string str = getstr();

private static string getstaticstr()

private string getstr()

}

該段**的執行結果為:

a的靜態塊

a的靜態屬性初始化

b的靜態屬性初始化

b的靜態塊

a的例項屬性初始化

a的例項塊

a的構造方法

b的例項塊

b的例項屬性初始化

b的構造方法

a的例項屬性初始化

a的例項塊

a的構造方法

b的例項塊

b的例項屬性初始化

b的構造方法

由此可見,例項化子類的時候,若此類未被載入過,首先載入是父類的類物件,然後載入子類的類物件,接著例項化父類,最後例項化子類,若此類被載入過,不再載入父類和子類的類物件。

接下來是載入順序,當載入類物件時,首先初始化靜態屬性,然後執行靜態塊;當例項化物件時,首先執行構造塊(直接寫在類中的**塊),然後執行構造方法。至於各靜態塊和靜態屬性初始化哪個些執行,是按**的先後順序。屬性、構造塊(也就是上面的例項塊)、構造方法之間的執行順序(但構造塊一定會在構造方法前執行),也是按**的先後順序。

例二:

public class exa   

public exa()

public static void main(string args)

}class exc extends exa

public exc()

}

該段**的執行結果為:

父類--非靜態**塊

父類--建構函式

父類--靜態**塊

父類--非靜態**塊

父類--建構函式

子類--非靜態**塊

子類--建構函式

子類--靜態**塊

父類--非靜態**塊

父類--建構函式

子類--非靜態**塊

子類--建構函式

父類--非靜態**塊

父類--建構函式

子類--非靜態**塊

子類--建構函式

分析(非靜態**塊即構造塊):

首先要載入父類exa,由於a的靜態屬性在靜態塊的前面,先初始化靜態屬性(new exa())(父類--非靜態**塊;父類--建構函式),然後是靜態塊(父類--靜態**塊);

載入子類exc,由於exc的靜態屬性也在靜態塊的前面,先初始化靜態屬性(new exc()),例項化子類物件的時候會先例項化父類,所以執行的順序為(父類--非靜態**塊;父類--建構函式;子類--非靜態**塊;子類--建構函式),然後是靜態塊(子類--靜態**塊)

例項化父類exa物件:父類--非靜態**塊;父類--建構函式;

例項化子類exc物件:子類--非靜態**塊;子類--建構函式;

第二個new exc():因為父類和子類都已載入,只需依次例項化父類物件和子類物件(父類--非靜態**塊;父類--建構函式;子類--非靜態**塊;子類--建構函式;)

推測:若將exa的靜態塊和靜態屬性的初始化換位置,執行結果應該為:

父類--靜態**塊

父類--非靜態**塊

父類--建構函式

父類--非靜態**塊

父類--建構函式

子類--非靜態**塊

子類--建構函式

子類--靜態**塊

父類--非靜態**塊

父類--建構函式

子類--非靜態**塊

子類--建構函式

父類--非靜態**塊

父類--建構函式

子類--非靜態**塊

子類--建構函式

public class exa  

private static exa a = new exa();

public exa()

public static void main(string args)

}class exc extends exa

public exc()

}

執行發現,結果證實這樣。

posted @

2017-09-27 10:41

阿狸哥哥 閱讀(

...)

編輯收藏

關於靜態塊 靜態屬性 構造塊 構造方法的執行順序

示例 public class helloa 父類 塊 靜態 塊 static 父類靜態屬性初始化 private static string getstaticstr private string getstr class hellob extends helloa 子類 塊 子類靜態 塊 sta...

構造塊 靜態塊

構造塊 靜態塊 static靜態塊在類載入的時候執行,且只執行一遍。靜態變數也在類載入的時候初始化 public class test public static void main string args 輸出 12 構造塊在類初始化的時候執行 public class test public s...

靜態塊》main 構造塊》構造方法

用static申明,jvm載入類時執行,僅執行一次 構造塊 類中直接用 定義,每一次建立物件時執行 執行順序優先順序 靜態塊 main 構造塊 構造方法 靜態塊按照申明順序執行,所以先執行publicstaticb t1 newb 該語句建立物件,則又會呼叫構造塊,輸出構造塊 接著執行public ...