對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的
初始化順序依次是(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。我們也可以通過下面的測試**來驗證這一點:
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初始化」有可能要依賴基類成員的正確初始化。
Java類初始化順序
類的初始化順序 首先執行父類靜態的內容,父類靜態的內容執行完畢後,接著去執行子類的靜態的內容,當子類的靜態內容執行完畢之後,再去看父類有沒有非靜態 塊,如果有就執行父類的非靜態 塊,父類的非靜態 塊執行完畢,接著執行父類的構造方法 父類的構造方法執行完畢之後,它接著去看子類有沒有非靜態 塊,如果有就...
java類初始化順序
我們大家都知道,對於靜態變數 靜態初始化塊 變數 初始化塊 構造器,它們的初始化順序依次是 靜態變數 靜態初始化塊 變數 初始化塊 構造器。我們也可以通過下面的測試 來驗證這一點 public class initialordertest 初始化塊 構造器 public initialorderte...
java類初始化順序
我們大家都知道,對於靜態變數 靜態初始化塊 變數 初始化塊 構造器,它們的初始化順序依次是 靜態變數 靜態初始化塊 變數 初始化塊 構造器。我們也可以通過下面的測試 來驗證這一點 public class initialordertest 初始化塊 構造器 public initialorderte...