課程
/后端開發
/Java
/Java入門第二季 升級版
為什么要進行強制類型轉換 ? 有什么用???
2017-09-23
源自:Java入門第二季 升級版 10-2
正在回答
在Java中強制類型轉換分為基本數據類型和引用數據類型兩種,這里我們討論的后者,也就是引用數據類型的強制類型轉換。
?????? 在Java中由于繼承和向上轉型,子類可以非常自然地轉換成父類,但是父類轉換成子類則需要強制轉換。因為子類擁有比父類更多的屬性、更強的功能,所以父類轉換為子類需要強制。那么,是不是只要是父類轉換為子類就會成功呢?其實不然,他們之間的強制類型轉換是有條件的。
?????? 當我們用一個類型的構造器構造出一個對象時,這個對象的類型就已經確定的,也就說它的本質是不會再發生變化了。在Java中我們可以通過繼承、向上轉型的關系使用父類類型來引用它,這個時候我們是使用功能較弱的類型引用功能較強的對象,這是可行的。但是將功能較弱的類型強制轉功能較強的對象時,就不一定可以行了。
?????? 舉個例子來說明。比如系統中存在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;
?????? 這個系統會拋出ClassCastException異常信息。
????所以編譯器在編譯時只會檢查類型之間是否存在繼承關系,有則通過;而在運行時就會檢查它的真實類型,是則通過,否則拋出ClassCastException異常。
???所以在繼承中,子類可以自動轉型為父類,但是父類強制轉換為子類時只有當引用類型真正的身份為子類時才會強制轉換成功,否則失敗
qq_乘風破浪_16
舉報
課程升級!以終為始告別枯燥,在開發和重構中體會Java面向對象編程的奧妙
4 回答強制類型轉換
3 回答dog無法強制類型轉換
2 回答引用類型轉換
1 回答強制類型轉換有什么好處?
2 回答引用類型轉換的作用
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2017-09-23
在Java中強制類型轉換分為基本數據類型和引用數據類型兩種,這里我們討論的后者,也就是引用數據類型的強制類型轉換。
?????? 在Java中由于繼承和向上轉型,子類可以非常自然地轉換成父類,但是父類轉換成子類則需要強制轉換。因為子類擁有比父類更多的屬性、更強的功能,所以父類轉換為子類需要強制。那么,是不是只要是父類轉換為子類就會成功呢?其實不然,他們之間的強制類型轉換是有條件的。
?????? 當我們用一個類型的構造器構造出一個對象時,這個對象的類型就已經確定的,也就說它的本質是不會再發生變化了。在Java中我們可以通過繼承、向上轉型的關系使用父類類型來引用它,這個時候我們是使用功能較弱的類型引用功能較強的對象,這是可行的。但是將功能較弱的類型強制轉功能較強的對象時,就不一定可以行了。
?????? 舉個例子來說明。比如系統中存在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;
?????? 這個系統會拋出ClassCastException異常信息。
????所以編譯器在編譯時只會檢查類型之間是否存在繼承關系,有則通過;而在運行時就會檢查它的真實類型,是則通過,否則拋出ClassCastException異常。
???所以在繼承中,子類可以自動轉型為父類,但是父類強制轉換為子類時只有當引用類型真正的身份為子類時才會強制轉換成功,否則失敗