我有以下代碼:靜態VS動態綁定邏輯
import java.lang.*;
public class Program
{
public static void main(String [] args)
{
B a = new A();
a.p(10);
a.p(10.0);
}
}
class B {
public void p(double i)
{
System.out.println(i*2);
}
}
class A extends B{
public void p(int i)
{
System.out.println(i);
}
}
當我執行使用B a = new A()
這個代碼,我得到了這兩種情況下這是有意義的,因爲重載是在編譯時編譯器在哪裏看手柄20.0聲明的類型並適當調用一個函數。由於我們聲明的類型是B類,所以在這兩種情況下都調用B類的方法。現在如果我做A a = new A();
,我應該在兩個答案中得到10,但我不是。我得到a.p(10)
爲10,對於a.p(10.0)
爲20.0。基於靜態綁定的概念和通過靜態綁定完成重載的整體概念,該靜態綁定將查看聲明的類型而不是實際的類型,爲什麼結果會以這種方式出現?我非常感謝你的幫助。
如果你說的是正確的,那麼如果我改變我的子類方法public void p(double i){System.out(i * 3);},然後如果我調用B a = new A(),I在兩種情況下都應該達到20.0,但爲什麼我要達到30.0?編譯器爲什麼要查看子類方法?我會感謝你的幫助。 – Stranger
在這種情況下,您重寫了動態綁定函數。在動態綁定的情況下,它的對象類型不是引用,它決定了在運行時調用哪個方法。因此,在這種情況下,您的方法調用都會調用子類中的過度使用方法。現在很明顯。 – Renjith
啊!你是我的朋友。你說對了。非常感謝答案。你們好棒!! – Stranger