圖文詳解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("代碼塊...");
}
}
測試結(jié)果
A的static代碼塊...
A的static變量...
B的static變量...
A的成員變量...
A的構造函數(shù)...
B的static代碼塊...
A的成員變量...
A的構造函數(shù)...
B的成員變量...
代碼塊...
B的構造函數(shù)...
總結(jié)
以上就是Java中class的初始化順序的全部內(nèi)容,希望對大家使用Java能有所幫助。
相關文章
Maven在Java8下如何忽略Javadoc的編譯錯誤詳解
這篇文章主要給大家介紹了關于Maven在Java8下如何忽略Javadoc的編譯錯誤的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-08-08
Spring security用戶URL權限FilterSecurityInterceptor使用解析
這篇文章主要介紹了Spring security用戶URL權限FilterSecurityInterceptor使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12
淺析SpringBoot多數(shù)據(jù)源實現(xiàn)方案
現(xiàn)在很多項目的開發(fā)過程中,可能涉及到多個數(shù)據(jù)源,像讀寫分離的場景,或者因為業(yè)務復雜,導致不同的業(yè)務部署在不同的數(shù)據(jù)庫上,那么這樣的場景,我們應該如何在代碼中簡潔方便的切換數(shù)據(jù)源呢,本文介紹SpringBoot多數(shù)據(jù)源實現(xiàn)方案,感興趣的朋友跟隨小編一起看看吧2024-02-02
Spring Boot security 默認攔截靜態(tài)資源的解決方法
這篇文章主要介紹了Spring Boot security 默認攔截靜態(tài)資源,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
Springboot 2.x中server.servlet.context-path的運用詳解
這篇文章主要介紹了Springboot 2.x中server.servlet.context-path的運用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
Netty進階之EventExecutorGroup源碼詳解
這篇文章主要介紹了Netty進階之EventExecutorGroup源碼詳解,EventExecutorGroup繼承了JDK的ScheduledExecutroService,那么它就擁有了執(zhí)行定時任務,執(zhí)行提交的普通任務,需要的朋友可以參考下2023-11-11

