- 相關(guān)推薦
java基礎知識:強制類(lèi)型轉換
在java中強制類(lèi)型轉換分為基本數據類(lèi)型和引用數據類(lèi)型兩種,這里我們討論的后者,也就是引用數據類(lèi)型的強制類(lèi)型轉換。那么強制類(lèi)型轉換的知識要點(diǎn)有哪些?快跟yjbys小編一起來(lái)看看吧!
在Java中由于繼承和向上轉型,子類(lèi)可以非常自然地轉換成父類(lèi),但是父類(lèi)轉換成子類(lèi)則需要強制轉換。因為子類(lèi)擁有比父類(lèi)更多的屬性、更強的功能,所以父類(lèi)轉換為子類(lèi)需要強制。那么,是不是只要是父類(lèi)轉換為子類(lèi)就會(huì )成功呢?其實(shí)不然,他們之間的強制類(lèi)型轉換是有條件的。
當我們用一個(gè)類(lèi)型的構造器構造出一個(gè)對象時(shí),這個(gè)對象的類(lèi)型就已經(jīng)確定的,也就說(shuō)它的本質(zhì)是不會(huì )再發(fā)生變化了。在Java中我們可以通過(guò)繼承、向上轉型的關(guān)系使用父類(lèi)類(lèi)型來(lái)引用它,這個(gè)時(shí)候我們是使用功能較弱的類(lèi)型引用功能較強的對象,這是可行的。但是將功能較弱的類(lèi)型強制轉功能較強的對象時(shí),就不一定可以行了。
舉個(gè)例子來(lái)說(shuō)明。
比如系統中存在Father、Son兩個(gè)對象。首先我們先構造一個(gè)Son對象,然后用一個(gè)Father類(lèi)型變量引用它:
Father father = new Son();
在這里Son 對象實(shí)例被向上轉型為father了,但是請注意這個(gè)Son對象實(shí)例在內存中的本質(zhì)還是Son類(lèi)型的,只不過(guò)它的能力臨時(shí)被消弱了而已。
如果我們想變強怎么辦?將其對象類(lèi)型還原!
Son son = (Son)father;
這條語(yǔ)句是可行的,其實(shí)father引用仍然是Father類(lèi)型的,只不過(guò)是將它的能力加強了,將其加強后轉交給son引用了,Son對象實(shí)例在son的變量的引用下,恢復真身,可以使用全部功能了。
前面提到父類(lèi)強制轉換成子類(lèi)并不是總是成功,那么在什么情況下它會(huì )失效呢?
當引用類(lèi)型的真實(shí)身份是父類(lèi)本身的類(lèi)型時(shí),強制類(lèi)型轉換就會(huì )產(chǎn)生錯誤。例如:
Father father = new Father();
Son son = (Son) father;
這個(gè)系統會(huì )拋出ClassCastException異常信息。
所以編譯器在編譯時(shí)只會(huì )檢查類(lèi)型之間是否存在繼承關(guān)系,有則通過(guò);而在運行時(shí)就會(huì )檢查它的真實(shí)類(lèi)型,是則通過(guò),否則拋出ClassCastException異常。
所以在繼承中,子類(lèi)可以自動(dòng)轉型為父類(lèi),但是父類(lèi)強制轉換為子類(lèi)時(shí)只有當引用類(lèi)型真正的身份為子類(lèi)時(shí)才會(huì )強制轉換成功,否則失敗。
【java基礎知識:強制類(lèi)型轉換】相關(guān)文章:
asp與js的類(lèi)型轉換函數09-04
Java內存溢出的類(lèi)型10-03
Java的基礎知識07-27
Java基礎知識詳解09-02
javascript顯式類(lèi)型轉換的方法分析08-21
Java入門(mén)基礎知識:Java IO(輸入/輸出)09-23
Java基本數據類(lèi)型09-20
JAVA認證基礎知識:Java獲取當前的系統時(shí)間06-08
Java基礎知識大集合09-21
Java基礎知識點(diǎn)歸納08-22