是以編譯器在編譯時隻會檢查類型之間是否存在繼承關系,有則通過;而在運作時就會檢查它的真實類型,是則通過,否則抛出<code>classcastexception異常。</code>
舉個例子來說明。比如系統中存在father、son兩個對象。首先我們先構造一個son對象,然後用一個father類型變量引用它:
father father = new son();
在這裡son 對象執行個體被向上轉型為father了,但是請注意這個son對象執行個體在記憶體中的本質還是son類型的,隻不過它的能力臨時被消弱了而已,如果我們想變強怎麼辦?将其對象類型還原!
son son = (son)father;
這條語句是可行的,其實father引用仍然是father類型的,隻不過是将它的能力加強了,将其加強後轉交給son引用了,son對象執行個體在son的變量的引用下,恢複真身,可以使用全部功能了。
前面提到父類強制轉換成子類并不是總是成功,那麼在什麼情況下它會失效呢?
當引用類型的真實身份是父類本身的類型時,強制類型轉換就會産生錯誤。例如:
father father = new father();
son son = (son) father;
這個系統會抛出<code>classcastexception異常資訊。</code>
是以在繼承中,子類可以自動轉型為父類,但是父類強制轉換為子類時隻有當引用類型真正的身份為子類時才會強制轉換成功,否則失敗。
子類自動轉父類:
調用的方法必須在父類中定義,如果子類有重寫父類方法的時候,會調用子類的方法。