Java 實例化中方法的執行過程

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關鍵子來調用父類帶參數的構造方法,否則編譯不能通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章