Java類初始化順序

2021-09-11 20:42:28 字數 1632 閱讀 3345

ref : 

類的初始化順序,如類的靜態變數、成員變數、靜態**塊、非靜態**塊、構造器,及繼承父類時,它們的初始化順序都是怎樣的,下面我通過例子來說明這個情況,以免被人誤導。

示例1:測試單類的初始化順序

public class classinitordertest

private string field = "member field";

public classinitordertest()

public static void main(string args)

}程式輸出:

static field

static block

member field

non-static block

constructor

可以得出以下結論,單類的初始化順序為:

靜態變數 > 靜態初始塊 > 成員變數 > 非靜態初始塊 > 構造器

示例2:測試類繼承的初始化順序

class parent

private string parentfield = "parent member field";

public parent()

public class child extends parent

private string childfield = "child member field";

public child()

public static void main(string args)

}程式輸出:

parent static field

parent static block

child static field

child static block

parent member field

parent non-static block

parent constructor

child member field

child non-static block

child constructor

可以得出以下結論,單類的初始化順序為:

父類靜態變數 > 父類靜態初始塊 > 子類靜態變數 > 子類靜態初始塊 > 父類成員變數 > 父類非靜態初始塊 > 父類構造器 > 子類成員變數 > 子類非靜態初始塊 > 子類構造器

示例3:測試成員變數、初始塊的初始化順序

從上面兩個例子可以看出,父類的靜態變數和靜態初始塊肯定是先於子類載入的。但同乙個類中的靜態變數與靜態初始塊之間,成員變數與初始塊之間的順序一定是變數先於初始塊嗎?繼續演示!

public class testorder

private static b b = new b();

public static void main(string args)

class a

}class b

}程式輸出:

static field a

static block

static field b

可以得出以下結論,單類的初始化順序為:

靜態變數a > 靜態初始塊 > 靜態變數b

所以,它們的在類中的順序就決定了它們的初始化順序,而不是變數一定會優先於初始塊。

Java類初始化順序

類的初始化順序 首先執行父類靜態的內容,父類靜態的內容執行完畢後,接著去執行子類的靜態的內容,當子類的靜態內容執行完畢之後,再去看父類有沒有非靜態 塊,如果有就執行父類的非靜態 塊,父類的非靜態 塊執行完畢,接著執行父類的構造方法 父類的構造方法執行完畢之後,它接著去看子類有沒有非靜態 塊,如果有就...

java類初始化順序

我們大家都知道,對於靜態變數 靜態初始化塊 變數 初始化塊 構造器,它們的初始化順序依次是 靜態變數 靜態初始化塊 變數 初始化塊 構造器。我們也可以通過下面的測試 來驗證這一點 public class initialordertest 初始化塊 構造器 public initialorderte...

java類初始化順序

我們大家都知道,對於靜態變數 靜態初始化塊 變數 初始化塊 構造器,它們的初始化順序依次是 靜態變數 靜態初始化塊 變數 初始化塊 構造器。我們也可以通過下面的測試 來驗證這一點 public class initialordertest 初始化塊 構造器 public initialorderte...