Java類的初始化順序

2021-09-14 08:20:01 字數 2861 閱讀 4105

三組五部分:(靜態變數、靜態**塊)、(成員變數、非靜態**塊)構造器;

單個類:對於靜態變數、靜態**塊成員變數、非靜態**塊構造器,它們的初始化順序依次是(靜態變數、靜態**塊)>(成員變數、非靜態**塊)

>構造器

繼承:子類的靜態變數和靜態**塊的初始化是在父類的成員變數、非靜態**塊和構造器初始化之前就完成了。靜態變數、靜態**塊

成員變數、非靜態**塊初始化的順序取決於它們在類**現的先後順序

(按照先後順序,不是變數初始化優先於**塊,切記

;如在靜態**塊中訪問後面的靜態變數,或在非靜態**塊中訪問後面的成員變數。

//靜態**塊2

static

public string field = "parent memeber field";

//非靜態**塊1

public string field2 = "parent member field2";

//非靜態**塊2

public parent()

public static void main(string args)

}執行結果:

parent static field

parent static code block

parent static field2

parent static code block2

parent memeber field

parent non-static code block

parent member field2

parent non-static code block2

parent constructor

public class child extends parent 

public static string staticfield2 = "child static field2";

//靜態**塊2

static

public string field = "child memeber field";

//非靜態**塊1

public string field2 = "child member field2";

//非靜態**塊2

public child()

public static void main(string args)

}

執行結果:

parent static field

parent static code block

parent static field2

parent static code block2

child static field

child static code block

child static field2

child static code block2

parent memeber field

parent non-static code block

parent member field2

parent non-static code block2

parent constructor

child memeber field

child non-static code block

child member field2

child non-static code block2

child constructor

(1)訪問child.main()(這是乙個static方法),於是裝載器就會為你尋找已經編譯的child類的**(也就是child.class檔案)。在裝載的過程中,裝載器注意到它有乙個基類(也就是extends所要表示的意思),於是它再裝載基類。不管你創不建立基類物件,這個過程總會發生。如果基類還有基類,那麼第二個基類也會被裝載,依此類推。

(2)執行根基類的static初始化,然後是下乙個派生類的static初始化,依此類推。這個順序非常重要,因為派生類的「static初始化」有可能要依賴基類成員的正確初始化

(3)當所有必要的類都已經裝載結束,開始執行main()方法體,並用new subclass()建立物件。

(4)類child存在父類,則呼叫父類的建構函式,你可以使用super來指定呼叫哪個建構函式。基類的構造過程以及構造順序,同派生類的相同。首先基類中各個變數按照字面順序進行初始化,然後執行基類的建構函式的其餘部分

(5)對子類成員資料按照它們宣告的順序初始化,執行子類建構函式的其餘部分。

Java類初始化順序

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

java類初始化順序

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

java類初始化順序

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