2 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個贊
這歸結(jié)為編譯時間和運(yùn)行時間之間存在差異。
在編譯時,可用的方法是聲明對象的類型中的方法。
在運(yùn)行時,調(diào)用的方法是實(shí)例化對象的類型中的方法。
因此,對于聲明為 BaseClass 類型并實(shí)例化為 DerivedClass 類型的對象,可用的方法將是 BaseClass 中的方法,即。doSomeJob(),但調(diào)用的方法是 DerivedClass 中的方法。

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個贊
創(chuàng)建對象時:
BaseClass b1 = new DerievedClass();
我們要說的是:
ReferenceType variableName = new ConcreteImplementation();
將其視為為新對象提供腳手架的 ReferenceType。
創(chuàng)建對象時,它會查看此 ReferenceType 并創(chuàng)建一個以 ReferenceType 中的所有方法作為骨架的對象。
然后我們看一下方法實(shí)現(xiàn)的ConcreteImplementation。所以編譯器尋找 ConcreteImplementation 來填充所有方法。
只有在 ReferenceType 中定義的內(nèi)容才會在最終對象中實(shí)現(xiàn)。
將轉(zhuǎn)換視為更改已存在對象的 ReferenceType
隨著線:
DerievedClass d = new DerievedClass();
ReferenceType 是 DerievedClass,所以我們從 DerivedClass 中獲取所有方法,并用 ConcreteImplementation 中的實(shí)現(xiàn)填充它們,即 DerivedClass。
然后我們將 DerievedClass d 轉(zhuǎn)換為 BaseClass b。
BaseClass b = BaseClass.class.cast(d);
d 具有 DerivedClass 的所有實(shí)現(xiàn),但腳手架來自 ReferencType BaseClass,因此我們無法調(diào)用 printMagic,因?yàn)樗淮嬖谟?BaseClass 中。
那有意義嗎?
希望能幫助到你
添加回答
舉報