Java類加載初始化的過程及順序
Java類的加載說明
- Java類的編譯代碼都存在于它自己的獨(dú)立文件中(class),該文件只在需要使用程序代碼時(shí)才會(huì)被加載。
- 類加載在創(chuàng)建類的第一個(gè)對象時(shí)發(fā)生,但當(dāng)訪問static域或static方法時(shí),也會(huì)發(fā)生加載。
- 構(gòu)造器也是static方法,盡管static關(guān)鍵字沒有顯式寫出,故可進(jìn)一步說,類是在任何static成員被訪問時(shí)加載的。
示例說明加載過程
示例源于《Java編程思想》
//父類
public class SuperClass {
protected int super_a;
private int super_b=9;
protected static int super_x=printStr("SuperClass static init super_x");
public SuperClass(){
System.out.println("Super Class Constructor action.... ");
System.out.println("super_a="+super_a);
System.out.println("super_b="+super_b);
super_a=33;
}
static int printStr(String string){
System.out.println(string);
return 47;
}
}
//子類
public class SubClass extends SuperClass{
private static int sub_b=printStr("SubClass static init sub_b");
public SubClass(){
System.out.println("Sub Class Constructor action.... ");
System.out.println("Sub Class super_a="+super_a);
System.out.println("Sub Class sub_b="+sub_b);
}
}
//程序入口,執(zhí)行代碼
public static void main(String[] args) {
SubClass subClass=new SubClass();
}
###執(zhí)行結(jié)果
SuperClass static init super_x SubClass static init sub_b Super Class Constructor action.... super_a=0 super_b=9 Sub Class Constructor action.... Sub Class super_a=33 Sub Class sub_b=47
由結(jié)果得出類的加載過程與順序
- 如果一個(gè)類有父類,則父類會(huì)先被加載。Static變量會(huì)優(yōu)先被初始化執(zhí)行,先初始化父類的super_x,再初始化子類的sub_b。
- 所有非靜態(tài)成員變量都會(huì)賦于一個(gè)默認(rèn)值,如果是基本類型則為默認(rèn)值,如果是對象引用則為null,這是通過將對象內(nèi)存設(shè)為二進(jìn)制零值而一舉生成的。
- 調(diào)用父類構(gòu)造函數(shù),但先不執(zhí)行里面的代碼。父類的非靜態(tài)成員變量會(huì)被賦值,即是執(zhí)行=號(hào)右邊內(nèi)容,將9賦值給super_b.
- 執(zhí)行父類的構(gòu)造函數(shù)里的代碼。
- 子類的非靜態(tài)成員變量賦于默認(rèn)值。
- 執(zhí)行子類構(gòu)造函數(shù)里的代碼。
加載過程流程圖

總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Java與WebUploader相結(jié)合實(shí)現(xiàn)文件上傳功能(實(shí)例代碼)
這篇文章主要介紹了Java結(jié)合WebUploader實(shí)現(xiàn)文件上傳功能,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
為什么wait和notify必須放在synchronized中使用
這篇文章主要介紹了為什么wait和notify必須放在synchronized中使用,文章圍繞主題的相關(guān)問題展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考以參考一下2022-05-05
Java淺析代碼塊與構(gòu)造塊及靜態(tài)塊三者之間的關(guān)系
所謂代碼塊是指用"{}"括起來的一段代碼,根據(jù)其位置和聲明的不同,可以分為普通代碼塊、構(gòu)造塊、靜態(tài)塊、和同步代碼塊。如果在代碼塊前加上synchronized關(guān)鍵字,則此代碼塊就成為同步代碼塊2022-07-07
Spring?Boot?2.6.x整合Swagger啟動(dòng)失敗報(bào)錯(cuò)問題的完美解決辦法
這篇文章主要給大家介紹了關(guān)于Spring?Boot?2.6.x整合Swagger啟動(dòng)失敗報(bào)錯(cuò)問題的完美解決辦法,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03
feign遠(yuǎn)程調(diào)用無法傳遞對象屬性405的問題
這篇文章主要介紹了feign遠(yuǎn)程調(diào)用無法傳遞對象屬性405的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java 基于AQS實(shí)現(xiàn)一個(gè)同步器
這篇文章主要介紹了如何基于AQS實(shí)現(xiàn)一個(gè)同步器,幫助大家更好的理解和學(xué)習(xí)Java并發(fā),感興趣的朋友可以了解下2020-09-09

