這個問題在這里已經有了答案: 為什么第 3 行沒有發生動態系結? (1 個回答) 2 天前關閉。
我在玩 Java 類繼承時遇到了一個問題,其中子類 C 有一個類似于其父類 A 的方法 fun(),但簽名不同。但是我不明白為什么在物件 x 上呼叫 fun() 時會呼叫父類的方法。我確實明白,因為簽名不同,這并不完全是方法覆寫,但我仍然不明白為什么在這里呼叫 A 的 fun() 方法。
A級
class A{
public void fun(double d){
System.out.println("A");
}
}
C級
public class C extends A{
public static void main(String[] args){
A x = new C();
x.fun(6); //prints "A"
}
public void fun(int i){
System.out.println("C");
}
}
uj5u.com熱心網友回復:
這里:
A x = new C();
編譯器只記得:x 屬于 A 類。所以當你這樣做時:
x.fun(6); //prints "A"
它查找存在于 A 中的方法。只有一個名為 的方法fun(),而那個方法是雙倍的。因此編譯器將方法呼叫fun(double)放入位元組碼中。后來,在運行時, x 也有一個采用 int 的方法這一事實并不重要。因為在編譯時,fun(double)被“固定”了這么說。
如果你想獲得的多型的經驗,改變的型別foo()在C也采取雙,所以:使它成為一個真正的替代。或者將定義更改為C x = .... 然后它會列印“C”。
這就是全部。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362171.html
上一篇:盡管提供了函式體,但仍期待它
下一篇:從其他檔案訪問結構資料成員的值
