詳解Java中類的加載與其初始化
java內(nèi)存分析
類加載的過程
類的加載與ClassLoader的理解
類的初始化
package Collections; public class text1 { public static void main(String[]args){ A a=new A(); System.out.println(A.m); } } class A{ static { System.out.println("A類靜態(tài)代碼塊初始化"); m=300; } static int m=100; public A(){ System.out.println("A類的無(wú)參構(gòu)造初始化"); } }
輸出:
A類靜態(tài)代碼塊初始化
A類的無(wú)參構(gòu)造初始化
100
為什么最終輸出的m值為100呢?
分析如下:
首先類進(jìn)行加載和鏈接,如下所示:
注:在鏈接階段的準(zhǔn)備工作時(shí),編譯器會(huì)為類變量賦默認(rèn)值為0,即此時(shí)的m為0
鏈接完畢后進(jìn)行類的初始化,這一過程將會(huì)執(zhí)行類構(gòu)造器()方法,將類中所有類變量的賦值語(yǔ)句以及靜態(tài)代碼塊中的語(yǔ)句收集和合并:
<clinit>() { System.out.println("A類靜態(tài)代碼塊初始化"); m=300; m=100; }
第二條m的賦值語(yǔ)句,覆蓋了第一條的300,因此最終輸出為100
會(huì)發(fā)生類的初始化的場(chǎng)景
類的主動(dòng)引用(一定會(huì)發(fā)生類的初始化)
類的主動(dòng)引用
package Collections; import static Collections.Son.m; public class text1 { static { System.out.println("Main類被加載"); } public static void main(String[]args) throws ClassNotFoundException { Son son=new Son(); } } class Father{ static int a=10; static{ System.out.println("Father類被加載"); } } class Son extends Father{ static { System.out.println("子類被加載"); m= 300; } static int m =100; static final int M = 1; }
輸出:
Main類被加載
Father類被加載
子類被加載
反射也會(huì)產(chǎn)生主動(dòng)引用
package Collections; import static Collections.Son.m; ???????public class text1 { static { System.out.println("Main類被加載"); } public static void main(String[]args) throws ClassNotFoundException { Class.forName("Collections.Son"); } } class Father{ static int a=10; static{ System.out.println("Father類被加載"); } } class Son extends Father{ static { System.out.println("子類被加載"); m= 300; } static int m =100; static final int M = 1; }
輸出:
Main類被加載
Father類被加載
子類被加載
類的被動(dòng)引用(不會(huì)發(fā)生類的初始化)
當(dāng)訪問一個(gè)靜態(tài)域時(shí),只有真正聲明這個(gè)域的類才會(huì)被初始化,如:當(dāng)通過子類引用父類的靜態(tài)變量,不會(huì)導(dǎo)致子類初始化。
舉例:
package Collections; import static Collections.Son.m; ???????public class text1 { static { System.out.println("Main類被加載"); } public static void main(String[]args) throws ClassNotFoundException { System.out.println(Son.a); } } class Father{ static int a=10; static{ System.out.println("Father類被加載"); } } class Son extends Father{ static { System.out.println("子類被加載"); m= 300; } static int m =100; static final int M = 1; }
輸出:
Main類被加載
Father類被加載
10
通過數(shù)組定義類引用,不會(huì)觸發(fā)此類的初始化
舉例:
package Collections; import static Collections.Son.m; ???????public class text1 { static { System.out.println("Main類被加載"); } public static void main(String[]args) throws ClassNotFoundException { Son[] arry=new Son[5]; } } class Father{ static int a=10; static{ System.out.println("Father類被加載"); } } class Son extends Father{ static { System.out.println("子類被加載"); m= 300; } static int m =100; static final int M = 1; }
輸出:
Main類被加載
引用常量不會(huì)觸發(fā)此類的初始化(常量在鏈接階段就存入調(diào)用類的常量池中了)
舉例:
package Collections; import static Collections.Son.m; ???????public class text1 { static { System.out.println("Main類被加載"); } public static void main(String[]args) throws ClassNotFoundException { System.out.println(Son.M); } } class Father{ static int a=10; static{ System.out.println("Father類被加載"); } } class Son extends Father{ static { System.out.println("子類被加載"); m= 300; } static int m =100; static final int M = 1; }
輸出:
Main類被加載
???????1
以上就是詳解Java中類的加載與其初始化的詳細(xì)內(nèi)容,更多關(guān)于Java類加載與初始化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 實(shí)戰(zhàn)項(xiàng)目錘煉之嘟嘟健身房管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)健身房管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11Java中的CopyOnWriteArrayList你了解嗎
CopyOnWriteArrayList是Java集合框架中的一種線程安全的List實(shí)現(xiàn),這篇文章主要來(lái)和大家聊聊CopyOnWriteArrayList的簡(jiǎn)單使用,需要的可以參考一下2023-06-06java格式化數(shù)字操作 NumberFormat及DecimalFormat
這篇文章主要介紹了java格式化數(shù)字操作 NumberFormat及DecimalFormat,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java工作環(huán)境的配置與Eclipse的安裝過程
這篇文章主要介紹了Java工作環(huán)境的配置與Eclipse的安裝過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02解決fastjson泛型轉(zhuǎn)換報(bào)錯(cuò)的解決方法
這篇文章主要介紹了解決fastjson泛型轉(zhuǎn)換報(bào)錯(cuò)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Spring Cloud Alibaba之Sentinel實(shí)現(xiàn)熔斷限流功能
這篇文章主要介紹了Spring Cloud Alibaba之Sentinel,這里使用阿里的sentinel來(lái)實(shí)現(xiàn)熔斷限流功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04