先來看這道題目吧,執行main方法會輸出的是什麼?
public class FieldTest {
private int a = 1;
private boolean b = true;
public FieldTest() {
a = 2;
print();
}
public void print() {
System.out.println(a);
System.out.println(b);
}
public static class FieldTestSub extends FieldTest {
private boolean c = true;
public void print() {
System.out.println(c);
}
}
public static void main(String[] args) {
new FieldTestSub();
}
}
來給你點時間思考
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
思考差不多了吧~先告訴你答案:
false
都做對了嗎?沒有的話就好好看看接下來的分析吧~
我們從main方法開始,其中只有new FieldTestSub();
創建了FildTestSub對象,就會走相應的構造,class如果沒有顯示的有參構造,默認會有一個無參構造
public FieldTestSub() {
}
如果有該class有父類的話構造中又默認有super();
表示調用父類的構造,而父類的構造中
public FieldTest() {
a = 2;
print();
}
爲a變量賦值,然後調用print方法
public void print() {
System.out.println(a);
System.out.println(b);
}
print方法則輸出了a,b變量的值
a,b成員變量在申明的時候就賦值,該賦值是優先於構造生效的,因此a的值先是1,然後在構造中又變成了2,最終輸出的話應該是:
2
true
但是注意:子類中有這樣一個方法:
public void print() {
System.out.println(c);
}
該方法與父類的方法print同名且參數一致,表示重寫了父類的print方法。
在父類構造調用的print方法隱藏了調用的對象,即this.print();
而這個this是誰那?還記得在main方法中new的對象嗎?
this其實就是FieldTestSub的對象,調用的this的print方法執行的實際執行的是:
System.out.println(c);
那就是true
嘛,在申明的時候直接賦的值private boolean c = true;
但是print方法是在父類的構造中執行的,此時子類還沒有初始化,因此變量c還是最初值false,最終輸出的結果:false