Java類的初始化順序
Java類的初始化順序
在開發中,知道Java類的初始化順序才能讓我們更加清楚地掌握程式的執行流程。先把結論貼出來,Java裡,從圖裡的1~6,分別按順序執行。
以下為程式碼驗證階段,一共三個類:基類(Base)、子類(Sub)和工具類(Log,輸出日誌)。
package com.kobe.practice.order; public class Sub extends Base { public static void main(String[] args) { Sub sub = new Sub(); } static { System.out.println("Sub static block 1"); } private static String staticValue = Log.printLog("Sub static Fields"); static { System.out.println("Sub static block 2"); } { System.out.println("Sub normal block 1"); } private String value = Log.printLog("Sub normal Fields"); { System.out.println("Sub normal block 2"); } public Sub() { System.out.println("Sub constructor"); } } class Base { static { System.out.println("Base static block 1"); } private static String staticValue = Log.printLog("Base static Fields"); static { System.out.println("Base static block 2"); } { System.out.println("Base normal block 1"); } private String value = Log.printLog("Base normal Fields"); { System.out.println("Base normal block 2"); } public Base() { System.out.println("Base constructor"); } } class Log { public static String printLog(String msg) { System.out.println(msg); return null; } }
輸出結果:
Base static block 1 Base static Fields Base static block 2 Sub static block 1 Sub static Fields Sub static block 2 Base normal block 1 Base normal Fields Base normal block 2 Base constructor Sub normal block 1 Sub normal Fields Sub normal block 2 Sub constructor
從結果能看出,基類的靜態程式碼塊、基類的靜態成員變數(優先順序相同,根據在程式碼中的出現順序執行,且只有在類的一次載入時執行) → 派生類靜態程式碼塊,派生類靜態成員欄位優先順序相同,根據在程式碼中的出現順序執行,且只有在類的一次載入時執行) → 基類普通程式碼塊,基類普通成員欄位(優先順序相同,根據在程式碼中的出現順序執行) → 基類的建構函式 → 派生類普通程式碼塊,派生類普通成員欄位(優先順序相同,根據在程式碼中的出現順序執行) → 派生類建構函式。
Java類的執行順序十分重要,謹記於心。