Java中四大代碼塊的運行順序(附code)
阿新 • • 發佈:2017-06-01
align ng- extends code static 構造 自己 構造方法 xtend
驗證證的方法是寫code。例如以下:
以上運行結果為:A static block1
B static block2
A block3
A constructor4
B block5
B constructor6
public class test { static class A { public static String name = "hello"; static { System.out.println("A static block1"); //1 } { System.out.println("A block3"); //3 } public A() { System.out.println("A constructor4"); //4 } } static class B extends A { public static String childName = "hello"; static { System.out.println("B static block2"); //2 } { System.out.println("B block5"); //5 } public B() { System.out.println("B constructor6"); //6 } } public static void main(String[] args) { new B(); } }
B static block2
A block3
A constructor4
B block5
B constructor6
- 分析:當運行new B()時。它首先去看父類裏面有沒有靜態代碼塊,假設有,它先去運行父類裏面靜態代碼塊裏面的內容。當父類的靜態代碼塊裏面的內容運行完成之後。接著去運行子類(自己這個類)裏面的靜態代碼塊,當子類的靜態代碼塊運行完成之後,它接著又去看父類有沒有非靜態代碼塊,假設有就運行父類的非靜態代碼塊,父類的非靜態代碼塊運行完成。接著運行父類的構造方法;父類的構造方法運行完成之後,它接著去看子類有沒有非靜態代碼塊,假設有就運行子類的非靜態代碼塊。
子類的非靜態代碼塊運行完成再去運行子類的構造方法,這個就是一個對象的初始化順序。
- 總結:對象的初始化順序:首先運行父類靜態的內容,父類靜態的內容運行完成後,接著去運行子類的靜態的內容,當子類的靜態內容運行完成之後,再去看父類有沒有非靜態代碼塊。假設有就運行父類的非靜態代碼塊,父類的非靜態代碼塊運行完成,接著運行父類的構造方法。父類的構造方法運行完成之後,它接著去看子類有沒有非靜態代碼塊,假設有就運行子類的非靜態代碼塊。子類的非靜態代碼塊運行完成再去運行子類的構造方法。總之中的一個句話,靜態代碼塊內容先運行,接著運行父類非靜態代碼塊和構造方法,然後運行子類非靜態代碼塊和構造方法。
- 註意:子類的構造方法,無論這個構造方法帶不帶參數,默認的它都會先去尋找父類的不帶參數的構造方法。假設父類沒有不帶參數的構造方法,那麽子類必須用supper關鍵子來調用父類帶參數的構造方法,否則編譯不能通過。
Java中四大代碼塊的運行順序(附code)