一個關於java初始化的問題

先來看這道題目吧,執行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

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