class Parent{ static String name = "hello"; { System.out.println("3 parent block"); } static { System.out.println("1 parent static block"); } public Parent(){ System.out.println("4 parent constructor"); } } class Child extends Parent{ static String childName = "hello"; { System.out.println("5 child block"); } static { System.out.println("2 child static block"); } public Child(){ System.out.println("6 child constructor"); } } public class StaticIniBlockOrderTest { public static void main(String[] args) { new Child();//語句(*) } }
結果:
1 parent static block
2 child static block
3 parent block
4 parent constructor
5 child block
6 child constructor
2. 順序:
1)執行父類靜態的內容,父類靜態的內容執行完畢后,接着去執行子類的靜態的內容;
2)當子類的靜態內容執行完畢之后,再去看父類有沒有非靜態代碼塊,如果有就執行父類的非靜態代碼塊,父類的非靜態代碼塊執行完畢,接着執行父類的構 造方法;
3)父類的構造方法執行完畢之后,它接着去看子類有沒有非靜態代碼塊,如果有就執行子類的非靜態代碼塊。子類的非靜態代碼塊執行完畢再去執行子類的構造方法。
總之一句話,靜態代碼塊內容先執行,接着執行父類非靜態代碼塊和構造方法,然后執行子類非靜態代碼塊和構造方法。
而且子類的構造方法,不管這個構造方法帶不帶參數,默認的它都會先去尋找父類的不帶參數的構造方法。如果父類沒有不帶參數的構造方法,那么子類必須用supper關鍵子來調用父類帶參數的構造方法,否則編譯不能通過。