圖文詳解Java中class的初始化順序
class的裝載
在講class的初始化之前,我們來講解下class的裝載順序。
以下摘自《Thinking in Java 4》
由于Java 中的一切東西都是對象,所以許多活動
變得更加簡單,這個問題便是其中的一例。正如下一章會講到的那樣,每個對象的代碼都存在于獨立的文件中。除非真的需要代碼,否則那個文件是不會載入的。通常,我們可認為除非那個類的一個對象構造完畢,否則代碼不會真的載入。由于static 方法存在一些細微的歧義,所以也能認為“類代碼在首次使用的時候載入”。
首次使用的地方也是static 初始化發(fā)生的地方。裝載的時候,所有static 對象和static 代碼塊都會按照本來的順序初始化(亦即它們在類定義代碼里寫入的順序)。當然,static 數(shù)據(jù)只會初始化一次。
簡要的說就是,在類有繼承關系時,類加載器上溯造型,進行相關類的加載工作。
比如:
Class B extends Class A 當我們new B()時,類加載器自動加載A的代碼
class的初始化順序
通常是以下這樣的初始化順序:
(static對象和static代碼塊,依據(jù)他們的順序進行初始化)>成員變量>構造函數(shù)

測試代碼
public class ClassInit {
/**
* @Title: main
* @Description: 類初始化順序測試
* @param: @param args
* @return: void
* @throws
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new B();
}
}
class A {
static{
System.out.println("A的static代碼塊...");
}
public String s1 = prtString("A的成員變量...");
public static String s2 = prtString("A的static變量...");
public A(){
System.out.println("A的構造函數(shù)...");
}
public static String prtString(String str) {
System.out.println(str);
return null;
}
}
class B extends A{
public String ss1 = prtString("B的成員變量...");
public static String ss2 = prtString("B的static變量...");
public B(){
System.out.println("B的構造函數(shù)...");
}
private static A a = new A();
static{
System.out.println("B的static代碼塊...");
}
{
System.out.println("代碼塊...");
}
}
測試結果
A的static代碼塊...
A的static變量...
B的static變量...
A的成員變量...
A的構造函數(shù)...
B的static代碼塊...
A的成員變量...
A的構造函數(shù)...
B的成員變量...
代碼塊...
B的構造函數(shù)...
總結
以上就是Java中class的初始化順序的全部內容,希望對大家使用Java能有所幫助。
相關文章
SpringBoot+Vue實現(xiàn)數(shù)據(jù)添加功能
這篇文章主要介紹了SpringBoot+Vue實現(xiàn)數(shù)據(jù)添加功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03
Java Kafka實現(xiàn)優(yōu)先級隊列的示例詳解
在分布式系統(tǒng)中,消息隊列是一種常見的異步通信機制,而優(yōu)先級隊列則是消息隊列的一種特殊形式,下面我們來看看如何利用Kafka實現(xiàn)優(yōu)先級隊列吧2025-03-03
SpringBoot3實戰(zhàn)教程之實現(xiàn)接口簽名驗證功能
接口簽名是一種重要的安全機制,用于確保 API 請求的真實性、數(shù)據(jù)的完整性以及防止重放攻擊,這篇文章主要介紹了SpringBoot3實戰(zhàn)教程之實現(xiàn)接口簽名驗證功能,需要的朋友可以參考下2025-04-04

