1 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
基本上,每次調(diào)用方法時(shí),編譯器都必須根據(jù)傳遞給方法的類型和參數(shù)來(lái)確定要調(diào)用哪個(gè)重載。這是靜態(tài)綁定。然后在運(yùn)行時(shí),運(yùn)行時(shí)將確定要調(diào)用哪個(gè)重載實(shí)現(xiàn)(此時(shí)已經(jīng)決定)。
考慮:
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("");
會(huì)發(fā)生什么?f(Object)
在編譯時(shí),編譯器根據(jù)a
存在的類型選擇了重載A
(只有一種方法可供選擇?。?。然后在運(yùn)行時(shí),由于a
實(shí)際上引用了 的實(shí)例B
,因此調(diào)用重載B
的實(shí)現(xiàn),打印。我見(jiàn)過(guò)的一種誤解是期望輸出為. 這是錯(cuò)誤的,因?yàn)榫幾g器不知道.f(Object)
From B (Object)
From B (String)
a
動(dòng)態(tài)綁定總是在靜態(tài)綁定之后產(chǎn)生嗎?
從上面代碼的結(jié)果我們可以看出,答案是肯定的。靜態(tài)綁定發(fā)生在編譯時(shí),動(dòng)態(tài)綁定發(fā)生在運(yùn)行時(shí),因此前者總是先發(fā)生。
如果這是真的,那么每個(gè)方法在運(yùn)行時(shí)都是動(dòng)態(tài)鏈接的說(shuō)法是真的嗎?
我不確定你的意思,所以希望上面的詳細(xì)解釋已經(jīng)回答了這個(gè)問(wèn)題。
不管怎樣,每次方法調(diào)用總是會(huì)有靜態(tài)綁定,然后動(dòng)態(tài)綁定?
是的,但有時(shí)這兩個(gè)過(guò)程可能會(huì)進(jìn)行得很快,因?yàn)檫x擇很少。當(dāng)您調(diào)用方法的類是最終類時(shí),您可能不需要在動(dòng)態(tài)綁定中做出“選擇”,是嗎?
添加回答
舉報(bào)