java 類的初始化順序

2021-05-26 12:36:53 字數 1476 閱讀 2428

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

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)

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

1 父類--靜態變數

2 父類--靜態初始化塊

3 子類--靜態變數

4 子類--靜態初始化塊

5 父類--變數

6 父類--初始化塊

7 父類--構造器

8 子類--變數

9 子類--初始化塊

10 子類--構造器

現在,結果已經不言自明了。大家可能會注意到一點,那就是,並不是父類完全初始化完畢後才進行子類的初始化,實際上子類的靜態變數和靜態初始化塊的初始化是在父類的變數、初始化塊和構造器初始化之前就完成了。

那麼對於靜態變數和靜態初始化塊之間、變數和初始化塊之間的先後順序又是怎樣呢?是否靜態變數總是先於靜態初始化塊,變數總是先於初始化塊就被初始化了呢?實際上這取決於它們在類中出現的先後順序。我們以靜態變數和靜態初始化塊為例來進行說明。

靜態資料的初始化是在類被裝載的時候就被初始化,所以在繼承中,因為在構造子類之前會先構造父類,這時就會現將父類的class檔案載入到jvm中,一旦父類class檔案被載入,就會初始化該類中的靜態資料(靜態變數和靜態**塊),父類class檔案載入完成接著載入子類的class檔案,同理,子類的所有靜態資料也被初始化。現在所有的class檔案都被載入成功。接著開始初始化物件,從父類開始初始化,為了初始化物件,就要把類中的除靜態資料以外的普通變數先初始化,這時普通變數初始化完成,然後是子類的普通變數初始化。再從父類開始,執行父類構造方法,子類構造方法。我發現類的初始化就是按照乙個順序進行:靜態資料-->普通變數-->建構函式 。就算是多重繼承還是這個順序,從祖先父類到最下面的子類,先把所有的靜態資料初始化。再回過頭,從祖先父類到最下面的子類,初始化所有的普通變數。再回過頭,從祖先父類到最面的子類,初始化構造器。

Java類初始化順序

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

java類初始化順序

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

java類初始化順序

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