類加載時(shí),static、非static、構(gòu)造的加載順序

demo

/**
 * 構(gòu)造中打印Log,便于觀察加載順序
 */
public class Cup {

    public Cup(String container) {
        Log.e("AppTest", "Cup " + container);
    }
    
}

/**
 * Table類,可以放置Cup
 * 包含靜態(tài)屬性、靜態(tài)代碼塊、動態(tài)屬性、構(gòu)造的Table類
 */

    static Cup cup = new Cup("on Table static");
    
    Cup cup1 = new Cup("on Table non-static");
    
    static {
        Log.e("AppTest", "Table static block");
    }

    public Table() {
        Log.e("AppTest", "init Table");
    }

}

/**
 * TeaTable類,繼承自Table
 * 且擁有自己的靜態(tài)屬性、靜態(tài)代碼塊、動態(tài)屬性、構(gòu)造
 */
public class TeaTable extends Table {

    static Cup cup = new Cup("on TeaTable static");
    
    Cup cup1 = new Cup("on TeaTable non-static");
    
    static {
        Log.e("AppTest", "TeaTable static block");
    }
    
    public TeaTable() {
        Log.e("AppTest", "init TeaTable");
    }

}

/**
 * BigTeaTable 類,繼承自TeaTable,
 * 同樣擁有自己的靜態(tài)屬性、靜態(tài)代碼塊、動態(tài)屬性、構(gòu)造
 */
public class BigTeaTable extends TeaTable{

    static {
        Log.e("AppTest", "BigTeaTable static block");
    }
    
    static Cup cup = new Cup("on BigTeaTable static");
    
    Cup cup1 = new Cup("on BigTeaTable non-static");
    
    public BigTeaTable() {
        Log.e("AppTest", "init BigTeaTable");
    }

}

/**
 * Cupboard類,也可以裝cup
 * 擁有自己的靜態(tài)屬性、靜態(tài)代碼塊、動態(tài)屬性、構(gòu)造
 */
public class Cupboard {

    static Cup cup = new Cup("in Cupboard static");

    Cup cup1 = new Cup("in Cupboard non-static");

    static {
        Log.e("AppTest", "Cupboard static block");
    }

    public Cupboard() {
        Log.e("AppTest", "init Cupboard");
    }
}

/**
 * 測試Main方法
 */
main() {
    new BigTeaTable();
}

/**
 * Log輸出
 */
06-13 12:26:01.963 E/AppTest: Cup on Table static
06-13 12:26:01.963 E/AppTest: Table static block
06-13 12:26:01.963 E/AppTest: Cup on TeaTable static
06-13 12:26:01.963 E/AppTest: TeaTable static block
06-13 12:26:01.963 E/AppTest: BigTeaTable static block
06-13 12:26:01.963 E/AppTest: Cup on BigTeaTable static
06-13 12:26:01.963 E/AppTest: Cup on Table non-static
06-13 12:26:01.963 E/AppTest: init Table
06-13 12:26:01.963 E/AppTest: Cup on TeaTable non-static
06-13 12:26:01.963 E/AppTest: init TeaTable
06-13 12:26:01.964 E/AppTest: Cup on BigTeaTable non-static
06-13 12:26:01.964 E/AppTest: init BigTeaTable

結(jié)論

  1. 類加載時(shí),會首先初始化靜態(tài)屬性、執(zhí)行靜態(tài)代碼塊,順序?yàn)榇a聲明順序。如果有繼承,則先加載父類的,然后加載子類。
    如demo中Table、TeaTable、BigTeaTable最先加載完畢。而且BigTeaTable中靜態(tài)代碼塊是定義在靜態(tài)屬性之前,所以會按定義順序加載。

  2. 靜態(tài)部分加載完成后,加載非靜態(tài)部分,最后加載構(gòu)造。如果有繼承則先加載父類的非靜態(tài)及構(gòu)造,然后加載子類。如Log所示。

  3. 靜態(tài)屬性及代碼塊只有在首次初始化改類,或者首次調(diào)用時(shí)才會加載。
    如demo中的Cupboard未被初始化和調(diào)用,所以靜態(tài)屬性就沒有加載。

參考

  • 《Thinking in Java》第5章 第5.7節(jié) 構(gòu)造器初始化
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容