多態繼承的運行時綁定

今天在博客上看見一道多態的執行順序題,如下

public class Dervied extends Base {

    private String name = "dervied";

    public Dervied() {
        tellName();
        printName();
    }
   
    public void tellName() {
        System.out.println("Dervied tell name: " + name);
    }
    
    public void printName() {
        System.out.println("Dervied print name: " + name);
    }

    public static void main(String[] args){
        
        new Dervied();    
    }
}

class Base {
    
    private String name = "base";

    public Base() {
    
        tellName();
        printName();
    }
    
    public void tellName() {
        System.out.println("Base tell name: " + name);
    }
    
    public void printName() {
        System.out.println("Base print name: " + name);
    }
}

我原本以爲答案是這樣的:

Base tell name: null
Base print name: null
Dervied tell name: dervied
Dervied print name: dervied



然而運行後結果卻是:

Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied

也就是說,在執行父類構造方法的時候,已經執行子類重寫後的方法了。

根據我的理解,應該是運行時綁定在作祟,當子類新建對象時,父類調用被子類重寫過的方法,那麼編譯器就會判定,應該將該方法編譯爲子類重寫的方法。

我想了好久,除了這個解釋應該沒別的原因,如果我錯了,請私信我。

啊,本來每天11.30準時睡覺的,爲了解決這個問題拖了一小時還沒洗澡.....不過蠻開心的,碎覺。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章