1. 程式人生 > >java構造方法,以及super、this關鍵字、隱式呼叫、顯式呼叫

java構造方法,以及super、this關鍵字、隱式呼叫、顯式呼叫

首先需要明白的是,當建立java物件時,程式總是依次呼叫每個父類的非靜態初始化塊、父類構造器(總是從Object開始)執行初始化,最後才呼叫該類的非靜態初始化塊、構造器執行初始化。

為了說明問題,這裡貼出一個小例子:

class Parent{
static{
System.out.println("父類靜態初始化塊");
}

{
System.out.println("父類非靜態初始化塊");
}

public Parent(){
System.out.println("父類無參構造器");
}

public Parent(String name){
System.out.println("父類含參構造器:name="+name);
}

}
public class Child extends Parent{


static{
System.out.println("子類靜態初始化塊");
}

{
System.out.println("子類非靜態初始化塊");
}

public Child() {
this("lily");
System.out.println("子類無參構造器");
}

public Child(String name){
super(name);
System.out.println("子類含參構造器: name="+name);
}

public static void main(String[] args) {

Child c1=new Child("Tom");
Child c2=new Child();
}


}

輸出結果:

--------------------------------------------------------------------------------------

父類靜態初始化塊
子類靜態初始化塊
父類非靜態初始化塊
父類含參構造器:name=Tom
子類非靜態初始化塊
子類含參構造器: name=Tom
父類非靜態初始化塊
父類含參構造器:name=lily
子類非靜態初始化塊
子類含參構造器: name=lily
子類無參構造器

--------------------------------------------------------------------------------------

容易得到這樣的結論:

無論新例項化多少個物件,該類的所有父類以及自身的靜態初始化塊只執行一次,而且是最先執行的初始化,稱作類的初始化。之後的初始化會依次執行父類的非靜態初始化塊、父類的構造器和子類的非靜態初始化塊、子類的構造器來完成初始化稱為物件初始化;在子類的構造器中可以通過super來顯式呼叫父類的構造器,可以通過this來呼叫該類過載的其他構造器,而具體呼叫哪個構造器決定於呼叫時的引數型別。

super與this 進階:

super用於該類顯式呼叫父類構造器、this用於該類顯式呼叫類中其他過載的某個構造器;如果一個構造器中沒有super呼叫,則會隱式呼叫父類的無參構造器。super和this的呼叫只能在構造器中,而且都必須作為構造器中的第一行,因此super和this不會同時出現在同一個構造器中;