在Java中,子類別的建構過程中,必須呼叫其父類別的建構函數,是因為有繼承關係存在時,子類別要把父類別的內容繼承下來,透過什麼手段做到的?
答案如下:
當你new一個子類別物件的時候,必須先要new一個父類別的物件出來,這個父類別物件位於子類別物件的內部,所以說,子類別物件比父類別物件大,子類別物件裡麵包含了一個父類別的對象,這是內存中真實的情況.構造方法是new一個對象的時候,必須要調的方法,這是規定,要new父類對像出來,那麼肯定要調用其構造方法,所以:
第一個規則:子類別的建構過程中,必須呼叫其父類別的建構方法。一個類,如果我們不寫構造方法,那麼編譯器會幫我們加上一個預設的構造方法,所謂預設的建構方法,就是沒有參數的建構方法,但是如果你自己寫了建構方法,那麼編譯器就不會為你增加了,所以有時候當你new一個子類別物件的時候,肯定呼叫了子類別的建構方法,但是在子類別建構方法中我們並沒有顯示的呼叫基底類別的建構方法,就是沒寫,如:super();並沒有這樣寫,但是這樣就會呼叫父類別沒有參數的建構方法,如果父類別中沒有沒有參數的建構方法就會出錯。
第二個規則:如果子類別的建構方法中沒有顯示的呼叫基底類別建構方法,系統預設呼叫基底類別無參數的建構方法注意:如果子類別的建構方法中既沒有顯示的呼叫基底類別建構方法,而基底類別中又沒有預設無參的建構方法,則編譯出錯,所以,通常我們需要顯示的:super(參數列表),來呼叫父類別有參數的建構子。
//如果你定義一個新的建構方法
public Animal(String name) {
this.name = name;
}
}
public Dog extends Animal{
//這時你就要顯示的呼叫父類別的建構方法,因為子類別預設呼叫的是父類別的
//無參構造方法Animal()
public Dog(){
super("小狗"); //顯示呼叫父類別的有參構造方法
.... //子類別的建構方法處理
}
}
//當然,如果你在父類別裡面把無參的建構方法,顯示的寫出來了,例如:
class Animal{
private String name;
//無參的建構方法
public Animal() {
..... //處理
}
/*
如果你定義一個新的建構方法,那麼在子類別的建構方法中,就可以不用顯示的呼叫父類別的建構方法,因為子類別有個無參的建構方法,
子類別在建構方法中會自動呼叫父類別已經定義的無參構造方法。
*/
public Animal(String name) {
this.name = name;
}
}