java 類的初始化 順序

2021-06-09 04:47:06 字數 1558 閱讀 2116

對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的

初始化順序依次是(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。我們也可以通過下面的測試**來驗證這一點:

public class initialordertest

// 初始化塊

// 構造器

public initialordertest()

public static void main(string args) }

執行以上**,我們會得到如下的輸出結果:

1. 靜態變數

2. 靜態初始化塊

3. 變數

4. 初始化塊

5. 構造器

這與上文中說的完全符合。那麼對於繼承情況下又會怎樣呢?我們仍然以一段測試**來獲取最終結果:

class parent

// 初始化塊

// 構造器

public parent() }

public class subclass extends parent

// 初始化塊

// 構造器

public subclass()

// 程式入口

public static void main(string args) }

執行一下上面的**,結果馬上呈現在我們的眼前:

父類--靜態變數

父類--靜態初始化塊

子類--靜態變數

子類--靜態初始化塊

子類main方法

父類--變數

父類--初始化塊

父類--構造器

i=9, j=0

子類--變數

子類--初始化塊

子類--構造器

i=9,j=20

現在,結果已經不言自明了。子類的靜態變數和靜態初始化塊的初始化是在父類的變數、初始化塊和構造器初始化之前就完成了。

靜態變數、靜態初始化塊,變數、初始化塊初始化了順序取決於它們在類中出現的先後順序。

執行過程分析

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

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

(3)當所有必要的類都已經裝載結束,開始執行main()方法體

,並用new subclass()建立物件。

(4)類subclass存在父類,則呼叫父類的建構函式,你可以使用super來指定呼叫哪個建構函式(也就是beetle()建構函式所做的第一件事)。

基類的構造過程以及構造順序,同派生類的相同。首先基類中各個變數按照字面順序進行初始化,然後執行基類的建構函式的其餘部分。

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

Java類初始化順序

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

java類初始化順序

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

java類初始化順序

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