圖文詳解Java中class的初始化順序
class的裝載
在講class的初始化之前,我們來講解下class的裝載順序。
以下摘自《Thinking in Java 4》
由于Java 中的一切東西都是對象,所以許多活動
變得更加簡單,這個問題便是其中的一例。正如下一章會講到的那樣,每個對象的代碼都存在于獨立的文件中。除非真的需要代碼,否則那個文件是不會載入的。通常,我們可認(rèn)為除非那個類的一個對象構(gòu)造完畢,否則代碼不會真的載入。由于static 方法存在一些細(xì)微的歧義,所以也能認(rèn)為“類代碼在首次使用的時候載入”。
首次使用的地方也是static 初始化發(fā)生的地方。裝載的時候,所有static 對象和static 代碼塊都會按照本來的順序初始化(亦即它們在類定義代碼里寫入的順序)。當(dāng)然,static 數(shù)據(jù)只會初始化一次。
簡要的說就是,在類有繼承關(guān)系時,類加載器上溯造型,進行相關(guān)類的加載工作。
比如:
Class B extends Class A 當(dāng)我們new B()時,類加載器自動加載A的代碼
class的初始化順序
通常是以下這樣的初始化順序:
(static對象和static代碼塊,依據(jù)他們的順序進行初始化)>成員變量>構(gòu)造函數(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的構(gòu)造函數(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的構(gòu)造函數(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的構(gòu)造函數(shù)...
B的static代碼塊...
A的成員變量...
A的構(gòu)造函數(shù)...
B的成員變量...
代碼塊...
B的構(gòu)造函數(shù)...
總結(jié)
以上就是Java中class的初始化順序的全部內(nèi)容,希望對大家使用Java能有所幫助。
相關(guān)文章
Maven在Java8下如何忽略Javadoc的編譯錯誤詳解
這篇文章主要給大家介紹了關(guān)于Maven在Java8下如何忽略Javadoc的編譯錯誤的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Spring security用戶URL權(quán)限FilterSecurityInterceptor使用解析
這篇文章主要介紹了Spring security用戶URL權(quán)限FilterSecurityInterceptor使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12淺析SpringBoot多數(shù)據(jù)源實現(xiàn)方案
現(xiàn)在很多項目的開發(fā)過程中,可能涉及到多個數(shù)據(jù)源,像讀寫分離的場景,或者因為業(yè)務(wù)復(fù)雜,導(dǎo)致不同的業(yè)務(wù)部署在不同的數(shù)據(jù)庫上,那么這樣的場景,我們應(yīng)該如何在代碼中簡潔方便的切換數(shù)據(jù)源呢,本文介紹SpringBoot多數(shù)據(jù)源實現(xiàn)方案,感興趣的朋友跟隨小編一起看看吧2024-02-02Spring Boot security 默認(rèn)攔截靜態(tài)資源的解決方法
這篇文章主要介紹了Spring Boot security 默認(rèn)攔截靜態(tài)資源,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03Springboot 2.x中server.servlet.context-path的運用詳解
這篇文章主要介紹了Springboot 2.x中server.servlet.context-path的運用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Netty進階之EventExecutorGroup源碼詳解
這篇文章主要介紹了Netty進階之EventExecutorGroup源碼詳解,EventExecutorGroup繼承了JDK的ScheduledExecutroService,那么它就擁有了執(zhí)行定時任務(wù),執(zhí)行提交的普通任務(wù),需要的朋友可以參考下2023-11-11