對象的初始化順序: 首先執行父類靜態的內容,父類靜態的內容執行完畢後,接着去執行子類的靜態的內容,當子類的靜態內容執行完畢以後,再去看父類有沒有非靜態代碼塊,若是有就執行父類的非靜態代碼塊,父類的非靜態代碼塊執行完畢,接着執行父類的構造方法;父類的構造方法執行完畢以後,它接着去看子類有沒有非靜態代碼塊,若是有就執行子類的非靜態代碼塊。子類的非靜態代碼塊執行完畢再去執行子類的構造方法。總之一句話,靜態代碼塊內容先執行,接着執行父類非靜態代碼塊和構造方法,而後執行子類非靜態代碼塊和構造方法。java
public class F_Test { { System.out.println("father not_static"); } static { System.out.println("father static"); } public F_Test(){ System.out.println("father constructed"); } } public class S_Test extends F_Test { { System.out.println("son not_static"); } static { System.out.println("son static"); } public S_Test(){ System.out.println("son constructed"); } public static void main(String[] args) { new S_Test(); } } //將輸出 father static son static father not_static father constructed son not_static son constructed
注意: 子類的構造方法,無論這個構造方法帶不帶參數,默認的它都會先去尋找父類的不帶參數的構造方法。若是父類沒有不帶參數的構造方法,那麼子類必須用supper關鍵子來調用父類帶參數的構造方法,不然編譯不能經過。web
public class F_Test { { System.out.println("father not_static"); } static { System.out.println("father static"); } public F_Test(String name){ System.out.println("father constructed"+"【"+name+"】"); } } public class S_Test extends F_Test { public S_Test(String name) { super(name); } { System.out.println("son not_static"); } static { System.out.println("son static"); } public static void main(String[] args) { new S_Test("Supper"); } }