當一個子類對象被澆鑄到它的父類,例如確定哪個覆蓋方法實際上被調用
Superclass obj = new Subclass();
和類被定義
public class Superclass{
public void thisMethod(){
System.out.println("Superclass version was executed");
}
和
public class Subclass extends Superclass{
public void thisMethod(){
System.out.println("Subclass version was called");
}
public void newMethod(){
System.out.println("blah");
}
}
當obj.thisMethod()
被稱爲,我得到Subclass version was called
作爲輸出,這顯然意味着ve雖然聲明的類型是超類,但在子類(原始超類對象不能「執行」的版本)中定義的此方法的rsion被調用,但是? 因此,如果即使子類方法在obj上執行, 當調用obj.newMethod()
時,我也會遇到編譯錯誤。
基本上,爲什麼在子類中定義的thisMethod()
版本是通過超類對象obj
調用的?據我所知,obj
的實際類型仍然是子類,所以很自然地,新版本應該被調用,但是,那麼我不應該能夠調用obj.newMethod()
?
編輯:
爲任何解釋(感謝堆意味着覆蓋*在標題