W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
class Tester{
int var;
Tester(double var){this.var = (int)var};
Tester(int var){this("hello");
Tester(String s){
this();
System.out.println(s);
}
Tester(){ System.out.println("good-bye");}
}
public static void main(String[] args)
{
Tester t = new Tester(5);
}
}
Tester t = new Tester(5) 的輸出是什么?
good-bye
hello
貌似和 this 無關(guān)但是很重要
public class Base { int i;
Base(){
add(1);
System.out.println(i);
}
void add(int v){
i+=v;
System.out.println(i);
}
}
public class MyBase extends Base{
MyBase(){
System.out.println("MyBase");
add(2);
}
void add(int v){
System.out.println("MyBase Add");
i+=v*2;
System.out.println(i);
}
}
public class Test {
public static void main(String[] args) {
go(new MyBase());
}
static void go(Base b){
b.add(8);
}
}
輸出的結(jié)果是 22
子類會首先調(diào)用父類的構(gòu)造函數(shù),在父類的構(gòu)造函數(shù) Base() 中執(zhí)行 add() 方法. 但這個 add() 方法由于是在新建 MyBase 對象時調(diào)用的. 所以是執(zhí)行的 MyBase 中的 add 方法
在Java中,子類的構(gòu)造過程中,必須 調(diào)用其父類的構(gòu)造函數(shù), 是因為有繼承關(guān)系存在時, 子類要把父類的內(nèi)容繼承下來, 通過什么手段做到的? 這樣: 當(dāng)你new一個子類對象的時候, 必須首先要new一個父類的對像出來, 這個父類對象位于子類對象的內(nèi)部, 所以說,子類對象比父類對象大, 子類對象里面包含了一個父類的對象, 這是內(nèi)存中真實的情況.
構(gòu)造方法是new一個對象的時候, 必須要調(diào)的方法, 這是規(guī)定, 要new父類對象出來, 那么肯定要調(diào)用其構(gòu)造方法, 所以 第一個規(guī)則:子類的構(gòu)造過程中,必須 調(diào)用其父類的構(gòu)造方法
一個類, 如果我們不寫構(gòu)造方法, 那么編譯器會幫我們加上一個默認的構(gòu)造方法, 所謂默認的構(gòu)造方法, 就是沒有參數(shù)的構(gòu)造方法, 但是如果你自己寫了構(gòu)造方法, 那么編譯器就不會給你添加了
所以有時候當(dāng)你new一個子類對象的時候,肯定調(diào)用了子類的構(gòu)造方法,但是在子類構(gòu)造方法中我們并沒有顯示的調(diào)用基類的構(gòu)造方法,就是沒寫,如:super(); 并沒有這樣寫,但是
第二個規(guī)則:如果子類的構(gòu)造方法中沒有顯示的調(diào)用基類構(gòu)造方法,則系統(tǒng)默認調(diào)用基類無參數(shù)的構(gòu)造方法
注意:如果子類的構(gòu)造方法中既沒有顯示的調(diào)用基類構(gòu)造方法,而基類中又沒有默認無參的構(gòu)造方法,則編譯出錯,所以,通常我們需要顯示的:super(參數(shù)列表),來調(diào)用父類有參數(shù)的構(gòu)造函數(shù)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: