鍍金池/ 教程/ Java/ 強(qiáng)制類型轉(zhuǎn)換
Java 集合細(xì)節(jié)(四):保持 compareTo 和 equals 同步
Iterator
使用序列化實(shí)現(xiàn)對(duì)象的拷貝
fail-fast 機(jī)制
關(guān)鍵字 final
Vector
HashTable
Java 集合細(xì)節(jié)(一):請(qǐng)為集合指定初始容量
強(qiáng)制類型轉(zhuǎn)換
數(shù)組之一:認(rèn)識(shí) JAVA 數(shù)組
Java 集合細(xì)節(jié)(三):subList 的缺陷
hashCode
ArrayList
數(shù)組之二
List 總結(jié)
LinkedList
Java 提高篇(九)—–實(shí)現(xiàn)多重繼承
Java 的四舍五入
關(guān)鍵字 static
理解 Java 的三大特性之多態(tài)
抽象類與接口
集合大家族
異常(二)
Java 集合細(xì)節(jié)(二):asList 的缺陷
Map 總結(jié)
TreeSet
equals() 方法總結(jié)
Java 提高篇(十)—–詳解匿名內(nèi)部類
HashMap
Stack
詳解內(nèi)部類
TreeMap
異常(一)
詳解 Java 定時(shí)任務(wù)
HashSet
字符串
理解 Java 的三大特性之繼承
理解 Java 的三大特性之封裝
代碼塊

強(qiáng)制類型轉(zhuǎn)換

在 Java 中強(qiáng)制類型轉(zhuǎn)換分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型兩種,這里我們討論的后者,也就是引用數(shù)據(jù)類型的強(qiáng)制類型轉(zhuǎn)換。

在 Java 中由于繼承和向上轉(zhuǎn)型,子類可以非常自然地轉(zhuǎn)換成父類,但是父類轉(zhuǎn)換成子類則需要強(qiáng)制轉(zhuǎn)換。因?yàn)樽宇悡碛斜雀割惛嗟膶傩?、更?qiáng)的功能,所以父類轉(zhuǎn)換為子類需要強(qiáng)制。那么,是不是只要是父類轉(zhuǎn)換為子類就會(huì)成功呢?其實(shí)不然,他們之間的強(qiáng)制類型轉(zhuǎn)換是有條件的。

當(dāng)我們用一個(gè)類型的構(gòu)造器構(gòu)造出一個(gè)對(duì)象時(shí),這個(gè)對(duì)象的類型就已經(jīng)確定的,也就說(shuō)它的本質(zhì)是不會(huì)再發(fā)生變化了。在 Java 中我們可以通過(guò)繼承、向上轉(zhuǎn)型的關(guān)系使用父類類型來(lái)引用它,這個(gè)時(shí)候我們是使用功能較弱的類型引用功能較強(qiáng)的對(duì)象,這是可行的。但是將功能較弱的類型強(qiáng)制轉(zhuǎn)功能較強(qiáng)的對(duì)象時(shí),就不一定可以行了。

舉個(gè)例子來(lái)說(shuō)明。比如系統(tǒng)中存在 Father、Son 兩個(gè)對(duì)象。首先我們先構(gòu)造一個(gè) Son 對(duì)象,然后用一個(gè)Father類型變量引用它:

Father father = new Son();

在這里 Son 對(duì)象實(shí)例被向上轉(zhuǎn)型為 father 了,但是請(qǐng)注意這個(gè) Son 對(duì)象實(shí)例在內(nèi)存中的本質(zhì)還是 Son 類型的,只不過(guò)它的能力臨時(shí)被消弱了而已,如果我們想變強(qiáng)怎么辦?將其對(duì)象類型還原!

Son son = (Son)father;

這條語(yǔ)句是可行的,其實(shí) father 引用仍然是 Father 類型的,只不過(guò)是將它的能力加強(qiáng)了,將其加強(qiáng)后轉(zhuǎn)交給 son 引用了,Son 對(duì)象實(shí)例在 son 的變量的引用下,恢復(fù)真身,可以使用全部功能了。

前面提到父類強(qiáng)制轉(zhuǎn)換成子類并不是總是成功,那么在什么情況下它會(huì)失效呢?

當(dāng)引用類型的真實(shí)身份是父類本身的類型時(shí),強(qiáng)制類型轉(zhuǎn)換就會(huì)產(chǎn)生錯(cuò)誤。例如:

Father father = new Father();

Son son = (Son) father;

這個(gè)系統(tǒng)會(huì)拋出ClassCastException 異常信息。

所以編譯器在編譯時(shí)只會(huì)檢查類型之間是否存在繼承關(guān)系,有則通過(guò);而在運(yùn)行時(shí)就會(huì)檢查它的真實(shí)類型,是則通過(guò),否則拋出 ClassCastException異常。

所以在繼承中,子類可以自動(dòng)轉(zhuǎn)型為父類,但是父類強(qiáng)制轉(zhuǎn)換為子類時(shí)只有當(dāng)引用類型真正的身份為子類時(shí)才會(huì)強(qiáng)制轉(zhuǎn)換成功,否則失敗。

鞏固基礎(chǔ),提高技術(shù),不懼困難,攀登高峰?。。。。。?/code>

上一篇:異常(二)下一篇:HashTable