對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序依次是(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。
初始化順序圖示:
我們也可以通過下面的測試**來驗證這一點:
package com.trs.oop;
/** * 類的初始化順序
* 靜態變數->靜態初始化塊->變數->初始化塊->構造器
* @author xiayunan
* @date 2023年7月5日
* */
public class initialordertest
// 初始化塊
// 構造器
public initialordertest()
public static void main(string args)
}
執行結果:
而對於繼承的情況初始化順序又會是怎麼樣的呢?請看下面示例**:
package com.trs.oop;
/** * 有繼承關係的類初始化順序
* @author xiayunan
* @date 2023年7月5日
* */
class parent
// 初始化塊
// 構造器
public parent()
}
public class subclass extends parent
// 初始化塊
// 構造器
public subclass()
// 程式入口
public static void main(string args)
}
執行結果:
現在,結果已經不言自明了。子類的靜態變數和靜態初始化塊的初始化是在父類的變數、初始化塊和構造器初始化之前就完成了。
靜態變數、靜態初始化塊,變數、初始化塊初始化了順序取決於它們在類中出現的先後順序。
執行過程分析
(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...