1 回答

TA貢獻(xiàn)1810條經(jīng)驗 獲得超4個贊
方法覆蓋在運(yùn)行時通過查看對象的運(yùn)行時類型來解決。編譯器也決定調(diào)用哪個方法,但它只能根據(jù)表達(dá)式的編譯時類型來決定。
對于對 的兩次調(diào)用x
,它們都Top.m(All)
在編譯時解析為。x
是編譯時類型Top
,因此編譯器只能查找 中聲明的方法Top
及其超類。編譯器發(fā)現(xiàn)唯一可用的方法是m(All)
. 在運(yùn)行時,要調(diào)用的方法被解析為Middle.m(All)
。這是因為運(yùn)行時類型x
實際上是Middle
,所以運(yùn)行時將調(diào)用覆蓋m(All)
在Middle
。為什么不叫Middle.m(Special)
?編譯器已經(jīng)決定Top.m(All)
應(yīng)該調(diào)用。運(yùn)行時只會檢查運(yùn)行時類型是否覆蓋了它。編譯器不知道有一個Middle.m(Special)
因為x
是編譯時類型Top
。
這兩個調(diào)用y
是相似的。y
的編譯時類型仍然是Top
,因此編譯器將方法解析為Top.m(All)
. y
是運(yùn)行時類型Bottom
。由于Bottom
繼承自Middle
,它也覆蓋Top.m(All)
。實現(xiàn)與Middle
. 因此在運(yùn)行時調(diào)用被覆蓋的方法。
這兩個電話z
有點不同,但他們Middle.m(All)
最終還是決心這樣做。的編譯時類型z
是Middle
,因此兩個調(diào)用都解析為Middle.m(All)
。請注意,沒有Middle.m(Most)
,因此調(diào)用z.m(most)
仍將解析為Middle.m(All)
。在運(yùn)行時,該方法仍然解析為,Middle.m(All)
因為運(yùn)行時類型Bottom
不會覆蓋Middle.m(All)
。
添加回答
舉報