在Java中強制型別轉換分為基本資料型別和引用資料型態兩種,這裡我們討論的後者,也就是引用資料型別的強制型別轉換。
在Java中由於繼承和向上轉型,子類別可以非常自然地轉換成父類,但是父類別轉換成子類別則需要強制轉換。因為子類別擁有比父類別更多的屬性、更強的功能,所以父類別轉換為子類別需要強制。那麼,是不是只要是父類別轉換為子類別就會成功呢?其實不然,他們之間的強制型別轉換是有條件的。
當我們用一個類型的構造器建構出一個物件時,這個物件的類型就已經確定的,也就說它的本質是不會再發生變化了。在Java中我們可以透過繼承、向轉型的關係使用父類別類型來引用它,這個時候我們是使用功能較弱的型別來引用功能較強的對象,這是可行的。但是將功能較弱的類型強制轉功能較強的物件時,就不一定可以行了。
則以舉例說明。例如係統中存在Father、Son兩個物件。首先我們先建構一個Son對象,然後用一個Father類型變數引用它:
Father father = new Son();
在這裡Son 物件實例被向上轉化為father了,但是請注意這個Son物件實例在記憶體中的本質還是Son類型的,只向上轉化為father了,但是請注意這個Son物件實例在記憶體中的本質還是Son類型的,只向向上轉化為father了,但是請注意這個Son物件實例在記憶體中的本質還是Son類型的,只向向上轉化為father了,但是請注意這個Son物件實例在記憶體中的本質還是Son類型的,只向向上轉化為father了,但是請注意這個Son物件實例在記憶體中的本質還是Son類型的,只向向上轉化為father了,但是請注意這個Son物件實例在記憶體中的本質還是Son類型的,只向向上轉化為father了,但是請注意這個Son物件實例在記憶體中的本質還是Son類型的,只向向上轉化為father了,但是請注意這個Son物件實例在記憶體中的本質還是Son類型的,只向向上轉化為father不過它的能力臨時被消弱了而已,如果我們想變強怎麼辦?將其物件類型還原!
Son son = (Son)father;
這語句是可行的,其實father引用仍然是Father類型的,只不過是將它的能力加強了,將其加強後轉交給son引用了,Son對象實例在son的變量的引用下實例,恢復真身,可以使用全部功能了。
前面提到父類別強制轉換成子類別並不是總是成功,那麼在什麼情況下它會失效呢?
當引用類型的真實身分是父類別本身的型別時,強制型別轉換就會產生錯誤。例如:
Father father = new Father(); Son son = (Son) father;
這個系統會拋出ClassCastException異常訊息。
所以編譯器在編譯時只會檢查類型之間是否有繼承關係,有則通過;而在運行時就會檢查它的真實類型,是則通過,否則拋出ClassCastException異常。
所以在繼承中,子類別可以自動轉換為父類,但是父類強制轉換為子類別時只有當引用類型真正的身分為子類別時才會強制轉換成功,否則失敗。
以上就是 java提高篇(十)-----強制型別轉換的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!