1 回答

TA貢獻1909條經驗 獲得超7個贊
基本上,每次調用方法時,編譯器都必須根據傳遞給方法的類型和參數來確定要調用哪個重載。這是靜態綁定。然后在運行時,運行時將確定要調用哪個重載實現(此時已經決定)。
考慮:
class A
{
void f(Object o)
{
System.out.println("From A");
}
}
class B extends A
{
void f(Object o)
{
System.out.println("From B (Object)");
}
void f(String s)
{
System.out.println("From B (String)");
}
}
你也是:
A a = new B();
a.f("");
會發生什么?f(Object)
在編譯時,編譯器根據a
存在的類型選擇了重載A
(只有一種方法可供選擇!)。然后在運行時,由于a
實際上引用了 的實例B
,因此調用重載B
的實現,打印。我見過的一種誤解是期望輸出為. 這是錯誤的,因為編譯器不知道.f(Object)
From B (Object)
From B (String)
a
動態綁定總是在靜態綁定之后產生嗎?
從上面代碼的結果我們可以看出,答案是肯定的。靜態綁定發生在編譯時,動態綁定發生在運行時,因此前者總是先發生。
如果這是真的,那么每個方法在運行時都是動態鏈接的說法是真的嗎?
我不確定你的意思,所以希望上面的詳細解釋已經回答了這個問題。
不管怎樣,每次方法調用總是會有靜態綁定,然后動態綁定?
是的,但有時這兩個過程可能會進行得很快,因為選擇很少。當您調用方法的類是最終類時,您可能不需要在動態綁定中做出“選擇”,是嗎?
添加回答
舉報