類的初始化順序

類的初始化順序

這幾天看java編程思想內(nèi)部類這節(jié)時(shí),其中有個(gè)例子(第4版213頁)的輸出跟自己的預(yù)期有點(diǎn)出入,手動(dòng)debug了一遍,發(fā)現(xiàn)是自己對(duì)類的初始化順序理解不到位,于是重新將類的初始化順序梳理了一番。

話不多說,先看結(jié)論:

  • 父類靜態(tài)域 > 子類靜態(tài)域 > 父類非靜態(tài)域 > 父類構(gòu)造函數(shù) > 子類非靜態(tài)域 > 子類構(gòu)造函數(shù)。
  • 如果有多個(gè)靜態(tài)域或多個(gè)非靜態(tài)域,則按聲明順序依次執(zhí)行。
  • 當(dāng)?shù)谝淮握{(diào)用靜態(tài)函數(shù)時(shí),會(huì)觸發(fā)其他靜態(tài)域的初始化,然后再執(zhí)行該函數(shù)中的代碼。

證明示例如下:

首先,來看沒有繼承的情況


public class TestClassInit {
    public static void main(String[] args) {
        new Test(); 
    }
}

class A{
    public A(int i){
        System.out.println("("+i+")");
    }
}

class Test{
    static {
        System.out.println("靜態(tài)塊1...");
    }
    {
        System.out.println("非靜態(tài)塊1...");
    }
    static A a1 = new A(1);
    A a2 = new A(2);

    {
        System.out.println("非靜態(tài)塊2...");
    }
    A a3 = new A(3);
    static {
        System.out.println("靜態(tài)塊2...");
    }
    static A a4 = new A(4);

    static void f(){
        System.out.println("f()");
    }
}




輸出結(jié)果為:

靜態(tài)塊1...
(1)
靜態(tài)塊2...
(4)
非靜態(tài)塊1...
(2)
非靜態(tài)塊2...
(3)

將上述代碼稍作改動(dòng),new Test(); 換成Test.f();

輸出結(jié)果為:

靜態(tài)塊1...
(1)
靜態(tài)塊2...
(4)
f()

再看有繼承的情況


public class TestClassInitWithExtend {
    public static void main(String[] args) {
        new Son();
    }
}

class Parent{
    public Parent(){
        System.out.println("New Parent()");
    }
    A a1 = new A (1);
    static A a2 = new A(2);

}

class Son extends Parent{
    public Son(){
        System.out.println("New Son()");
    }
    static A a3 = new A(3);
    A a4 = new A(4);
}



輸出結(jié)果為:

(2)
(3)
(1)
New Parent()
(4)
New Son()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • ??最近在看回顧Java基礎(chǔ)的時(shí)候,發(fā)現(xiàn)看似很簡單的類初始化的順序卻并不是那么簡單(往往越是簡單的東西反而越容易出...
    BrightLoong閱讀 1,500評(píng)論 0 2
  • 這票文章主要想來說一下Java類各部分(非靜態(tài)字段初始化、非靜態(tài)塊、靜態(tài)字段初始化、靜態(tài)塊、構(gòu)造函數(shù))的執(zhí)行順序。...
    第四單元閱讀 426評(píng)論 0 2
  • 讀完本文將了解到 單例模式的常用雙重檢查鎖寫法,以及如何避免JVM指令重排序?qū)е碌氖?更加高效、安全的內(nèi)部靜態(tài)類...
    程序員修仙閱讀 2,128評(píng)論 2 1
  • 當(dāng)new一個(gè)類對(duì)象時(shí),如果該類還未被JVM所加載,則JVM首先加載該類,加載類流程中會(huì)有類的初始化操作,也就是類中...
    luoxn28閱讀 1,672評(píng)論 0 1
  • 任務(wù)地址 任務(wù)地址 學(xué)習(xí)目標(biāo) 掌握CSS中的核心概念和布局,并能夠美化使用HTML制作的普通頁面 學(xué)習(xí)內(nèi)容 知道c...
    小m_up閱讀 211評(píng)論 1 1