class Parent{ static String name = "hello"; { System.out.println("parent block"); } static { System.out.println("parent static block"); } public Parent(){ System.out.println("parent constructor"); } } class Child extends Parent{ static String childName = "hello"; { System.out.println("child block"); } static { System.out.println("child static block"); } public Child(){ System.out.println("child constructor"); } } public class StaticIniBlockOrderTest { public static void main(String[] args) { new Child();//語句(*) } }
執行結果:
parent static block //先父靜
child static block //再子靜
parent block //父非靜
parent constructor //父構造
child block // 子非靜
child constructor //子構造
當執行new Child()時,它首先去看父類裏面有沒有靜態代碼塊,
如果有,它先去執行父類裏面靜態代碼塊裏面的內容,
當父類的靜態代碼塊裏面的內容執行完畢之後,
接着去執行子類(自己這個類)裏面的靜態代碼塊,
當子類的靜態代碼塊執行完畢之後,它接着又去看父類有沒有非靜態代碼塊,
如果有就執行父類的非靜態代碼塊,父類的非靜態代碼塊執行完畢,
接着執行父類的構造方法;父類的構造方法執行完畢之後,
它接着去看子類有沒有非靜態代碼塊,如果有就執行子類的非靜態代碼塊。
子類的非靜態代碼塊執行完畢再去執行子類的構造方法,這個就是一個對象的初始化順序。
注意:子類的構造方法,不管這個構造方法帶不帶參數,默認的它都會先去尋找父類的不帶參數的構造方法。如果父類沒有不帶參數的構造方法,那麼子類必須用supper關鍵子來調用父類帶參數的構造方法,否則編譯不能通過。