對象類型的轉換
對象類型的轉換包括向上類型轉換與向下類型轉換。
1、向上類型轉換
將子類對象賦值給父類類型的變量,這種技術稱為“向上轉型”。
在面向對象中越上層的類越抽象,越下層的類越具體,越具體的類具有越多的特性,由於向上轉型是將較具體的類轉到較抽象的類,所以它總是安全的。
2、向下類型轉換
將父類對象賦值給子類類型的變量,這種技術稱為“向下轉型”。
由於是將較抽象的類轉為較具體的類,這樣的轉型比較危險。子類對象總是父類的一個實例,父類對象不一定是子類的實例。子類總是具有父類的特性,子類具有的特性父類不一定具有。
回想一下平行四邊形、矩形、正方形具有的特性:
平行四邊形 | 矩形 | 正方形 |
①兩組對邊平行且相等 | ①兩組對邊平行且相等 | ①兩組對邊平行且相等 |
②有一個角是直角 | ②有一個角是直角 | |
③四條邊相等 |
越下層的類越具體,越具體的類具有的特性越多。向上轉型之所以是安全的,因為子類具有父類所有的特性。在程序中進行向下轉型時,必須使用顯示類型轉換,向編譯器說明要將父類對象轉換為哪一類型的子類對象。
在程序中,引用存儲着對象的內存地址,父類的引用能夠存儲父類及其子類對象的地址,對於到底存儲的是父類對象的地址子類對象的地址引用並不知曉。比如,平行四邊形類的引用只知道自己保存的地址是一個平行四邊形的地址,具體是矩形還是正方形它並不知道。
在程序中,如果需要將父類引用的值(也就是父類或者其子類對象的地址)賦值給某個子類的引用,需要告訴編譯器:“我給的地址就是這個子類的對象的地址”,否則編譯無法通過。
需要注意,父類引用存儲的地址到底是父類對象的地址還是某個子類對象的地址,完全是我們告訴編譯器的(顯示類型轉換),即使編譯能夠通過,但還是不能保證程序運行的時候不會出錯。即使我們將平行四邊形類引用存儲的矩形對象的地址賦值給正方形類引用,我們也能告訴編譯器,這就是一個正方形的地址,編譯是能夠通過的,但如果我們真把矩形當作正方形進行操作還是會出錯。
所以說,向下類型轉換是危險的。