課程
/后端開(kāi)發(fā)
/Java
/Java入門(mén)第二季
為什么要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換 ? 有什么用???
2017-09-23
源自:Java入門(mén)第二季 10-2
正在回答
在Java中強(qiáng)制類(lèi)型轉(zhuǎn)換分為基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型兩種,這里我們討論的后者,也就是引用數(shù)據(jù)類(lèi)型的強(qiáng)制類(lèi)型轉(zhuǎn)換。
?????? 在Java中由于繼承和向上轉(zhuǎn)型,子類(lèi)可以非常自然地轉(zhuǎn)換成父類(lèi),但是父類(lèi)轉(zhuǎn)換成子類(lèi)則需要強(qiáng)制轉(zhuǎn)換。因?yàn)樽宇?lèi)擁有比父類(lèi)更多的屬性、更強(qiáng)的功能,所以父類(lèi)轉(zhuǎn)換為子類(lèi)需要強(qiáng)制。那么,是不是只要是父類(lèi)轉(zhuǎn)換為子類(lèi)就會(huì)成功呢?其實(shí)不然,他們之間的強(qiáng)制類(lèi)型轉(zhuǎn)換是有條件的。
?????? 當(dāng)我們用一個(gè)類(lèi)型的構(gòu)造器構(gòu)造出一個(gè)對(duì)象時(shí),這個(gè)對(duì)象的類(lèi)型就已經(jīng)確定的,也就說(shuō)它的本質(zhì)是不會(huì)再發(fā)生變化了。在Java中我們可以通過(guò)繼承、向上轉(zhuǎn)型的關(guān)系使用父類(lèi)類(lèi)型來(lái)引用它,這個(gè)時(shí)候我們是使用功能較弱的類(lèi)型引用功能較強(qiáng)的對(duì)象,這是可行的。但是將功能較弱的類(lèi)型強(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類(lèi)型變量引用它:
?????? Father father = new Son();
?????? 在這里Son 對(duì)象實(shí)例被向上轉(zhuǎn)型為father了,但是請(qǐng)注意這個(gè)Son對(duì)象實(shí)例在內(nèi)存中的本質(zhì)還是Son類(lèi)型的,只不過(guò)它的能力臨時(shí)被消弱了而已,如果我們想變強(qiáng)怎么辦?將其對(duì)象類(lèi)型還原!
?????? Son son = (Son)father;
?????? 這條語(yǔ)句是可行的,其實(shí)father引用仍然是Father類(lèi)型的,只不過(guò)是將它的能力加強(qiáng)了,將其加強(qiáng)后轉(zhuǎn)交給son引用了,Son對(duì)象實(shí)例在son的變量的引用下,恢復(fù)真身,可以使用全部功能了。
?????? 前面提到父類(lèi)強(qiáng)制轉(zhuǎn)換成子類(lèi)并不是總是成功,那么在什么情況下它會(huì)失效呢?
?????? 當(dāng)引用類(lèi)型的真實(shí)身份是父類(lèi)本身的類(lèi)型時(shí),強(qiáng)制類(lèi)型轉(zhuǎn)換就會(huì)產(chǎn)生錯(cuò)誤。例如:
?????? Father father = new Father();
?????? Son son = (Son) father;
?????? 這個(gè)系統(tǒng)會(huì)拋出ClassCastException異常信息。
????所以編譯器在編譯時(shí)只會(huì)檢查類(lèi)型之間是否存在繼承關(guān)系,有則通過(guò);而在運(yùn)行時(shí)就會(huì)檢查它的真實(shí)類(lèi)型,是則通過(guò),否則拋出ClassCastException異常。
???所以在繼承中,子類(lèi)可以自動(dòng)轉(zhuǎn)型為父類(lèi),但是父類(lèi)強(qiáng)制轉(zhuǎn)換為子類(lèi)時(shí)只有當(dāng)引用類(lèi)型真正的身份為子類(lèi)時(shí)才會(huì)強(qiáng)制轉(zhuǎn)換成功,否則失敗
qq_乘風(fēng)破浪_16
舉報(bào)
課程升級(jí)!以終為始告別枯燥,在開(kāi)發(fā)和重構(gòu)中體會(huì)Java面向?qū)ο缶幊痰膴W妙
4 回答強(qiáng)制類(lèi)型轉(zhuǎn)換
3 回答dog無(wú)法強(qiáng)制類(lèi)型轉(zhuǎn)換
2 回答引用類(lèi)型轉(zhuǎn)換
1 回答強(qiáng)制類(lèi)型轉(zhuǎn)換有什么好處?
2 回答引用類(lèi)型轉(zhuǎn)換的作用
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2017-09-23
在Java中強(qiáng)制類(lèi)型轉(zhuǎn)換分為基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型兩種,這里我們討論的后者,也就是引用數(shù)據(jù)類(lèi)型的強(qiáng)制類(lèi)型轉(zhuǎn)換。
?????? 在Java中由于繼承和向上轉(zhuǎn)型,子類(lèi)可以非常自然地轉(zhuǎn)換成父類(lèi),但是父類(lèi)轉(zhuǎn)換成子類(lèi)則需要強(qiáng)制轉(zhuǎn)換。因?yàn)樽宇?lèi)擁有比父類(lèi)更多的屬性、更強(qiáng)的功能,所以父類(lèi)轉(zhuǎn)換為子類(lèi)需要強(qiáng)制。那么,是不是只要是父類(lèi)轉(zhuǎn)換為子類(lèi)就會(huì)成功呢?其實(shí)不然,他們之間的強(qiáng)制類(lèi)型轉(zhuǎn)換是有條件的。
?????? 當(dāng)我們用一個(gè)類(lèi)型的構(gòu)造器構(gòu)造出一個(gè)對(duì)象時(shí),這個(gè)對(duì)象的類(lèi)型就已經(jīng)確定的,也就說(shuō)它的本質(zhì)是不會(huì)再發(fā)生變化了。在Java中我們可以通過(guò)繼承、向上轉(zhuǎn)型的關(guān)系使用父類(lèi)類(lèi)型來(lái)引用它,這個(gè)時(shí)候我們是使用功能較弱的類(lèi)型引用功能較強(qiáng)的對(duì)象,這是可行的。但是將功能較弱的類(lèi)型強(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類(lèi)型變量引用它:
?????? Father father = new Son();
?????? 在這里Son 對(duì)象實(shí)例被向上轉(zhuǎn)型為father了,但是請(qǐng)注意這個(gè)Son對(duì)象實(shí)例在內(nèi)存中的本質(zhì)還是Son類(lèi)型的,只不過(guò)它的能力臨時(shí)被消弱了而已,如果我們想變強(qiáng)怎么辦?將其對(duì)象類(lèi)型還原!
?????? Son son = (Son)father;
?????? 這條語(yǔ)句是可行的,其實(shí)father引用仍然是Father類(lèi)型的,只不過(guò)是將它的能力加強(qiáng)了,將其加強(qiáng)后轉(zhuǎn)交給son引用了,Son對(duì)象實(shí)例在son的變量的引用下,恢復(fù)真身,可以使用全部功能了。
?????? 前面提到父類(lèi)強(qiáng)制轉(zhuǎn)換成子類(lèi)并不是總是成功,那么在什么情況下它會(huì)失效呢?
?????? 當(dāng)引用類(lèi)型的真實(shí)身份是父類(lèi)本身的類(lèi)型時(shí),強(qiáng)制類(lèi)型轉(zhuǎn)換就會(huì)產(chǎn)生錯(cuò)誤。例如:
?????? Father father = new Father();
?????? Son son = (Son) father;
?????? 這個(gè)系統(tǒng)會(huì)拋出ClassCastException異常信息。
????所以編譯器在編譯時(shí)只會(huì)檢查類(lèi)型之間是否存在繼承關(guān)系,有則通過(guò);而在運(yùn)行時(shí)就會(huì)檢查它的真實(shí)類(lèi)型,是則通過(guò),否則拋出ClassCastException異常。
???所以在繼承中,子類(lèi)可以自動(dòng)轉(zhuǎn)型為父類(lèi),但是父類(lèi)強(qiáng)制轉(zhuǎn)換為子類(lèi)時(shí)只有當(dāng)引用類(lèi)型真正的身份為子類(lèi)時(shí)才會(huì)強(qiáng)制轉(zhuǎn)換成功,否則失敗