繼承筆試題

父類

class Base{
    int x=10;
    public Base(){
        this.printMessage();
        System.out.println("父類的構造方法"+x);
        x=20;
    }
    public void printMessage(){
        System.out.println("父類的構造方法中的方法Base.x="+x);
    }
} 

子類

class Sub extends Base{
    int x=30;
    public Sub(){
        this.printMessage();
        System.out.println("子類的構造方法"+x);
        x=40;
    }
    public void printMessage(){
        System.out.println("子類的構造方法中的方法sub.x="+x);
    }
}

主程序

public class helloWorld {

    public static void main(String[] args) {
        Base b=new Sub();
//        Base c=b;
        b.printMessage();
       System.out.println(b.x);
    }   


}

結果爲:

子類的構造方法中的方法sub.x=0
父類的構造方法10
子類的構造方法中的方法sub.x=30
子類的構造方法30
子類的構造方法中的方法sub.x=40
20

首先1.new Sub()時,先實現父類的構造方法,(這裏子類在繼承父類時,重寫了父類方法)所以執行父類構造方法中的打印方法時被替換成了重寫後的方法。
2 .然後父類中的this指的是子類這個對象,還未對x進行賦值,所以打印出來默認爲0。
3.然後執行子類Sub,先賦值,再執行構造方法,打印出爲30.
4.關鍵的一步來了,實例化後的對象並沒有給子類Sub而是給了父類Base,也就是說實例化的子類又賦給了父類,所以要執行父類的構造方法,x被賦值爲20.

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