2 回答

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

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