向下轉型與向下轉型

2022-03-10 23:18:34 字數 1006 閱讀 1820

物件型別的轉換包括向上型別轉換與向下型別轉換。

將子類物件賦值給父類型別的變數,這種技術稱為「向上轉型」。

在物件導向中越上層的類越抽象,越下層的類越具體,越具體的類具有越多的特性,由於向上轉型是將較具體的類轉到較抽象的類,所以它總是安全的。

將父類物件賦值給子類型別的變數,這種技術稱為「向下轉型」。

由於是將較抽象的類轉為較具體的類,這樣的轉型比較危險。子類物件總是父類的乙個例項,父類物件不一定是子類的例項。子類總是具有父類的特性,子類具有的特性父類不一定具有。

回想一下平行四邊形、矩形、正方形具有的特性:

平行四邊形

矩形

正方形

①兩組對邊平行且相等

①兩組對邊平行且相等

①兩組對邊平行且相等

②有乙個角是直角

②有乙個角是直角

③四條邊相等

越下層的類越具體,越具體的類具有的特性越多。向上轉型之所以是安全的,因為子類具有父類所有的特性。在程式中進行向下轉型時,必須使用顯示型別轉換,向編譯器說明要將父類物件轉換為哪一型別的子類物件。

在程式中,引用儲存著物件的記憶體位址,父類的引用能夠儲存父類及其子類物件的位址,對於到底儲存的是父類物件的位址子類物件的位址引用並不知曉。比如,平行四邊形類的引用只知道自己儲存的位址是乙個平行四邊形的位址,具體是矩形還是正方形它並不知道。

在程式中,如果需要將父類引用的值(也就是父類或者其子類物件的位址)賦值給某個子類的引用,需要告訴編譯器:「我給的位址就是這個子類的物件的位址」,否則編譯無法通過。

需要注意,父類引用儲存的位址到底是父類物件的位址還是某個子類物件的位址,完全是我們告訴編譯器的(顯示型別轉換),即使編譯能夠通過,但還是不能保證程式執行的時候不會出錯。即使我們將平行四邊形類引用儲存的矩形物件的位址賦值給正方形類引用,我們也能告訴編譯器,這就是乙個正方形的位址,編譯是能夠通過的,但如果我們真把矩形當作正方形進行操作還是會出錯。

所以說,向下型別轉換是危險的。

向上轉型與向下轉型

子類引用的物件轉換為父類型別稱為向上轉型。通俗地說就是是將子類物件轉為父類物件。此處父類物件可以是介面。向上轉型就是具體類向抽象類的轉換。語法 父類 物件 new 子類 例如 animal hern new dog 向上轉型 注意 1 向上轉型時,子類單獨定義的方法會丟失。2 子類引用不能指向父類物...

向下轉型,向上轉型

package cn.dali.code24 向上轉型 父類引用指向子類物件 格式 父類名稱 物件名 new 子類名稱 向下轉型 當我們使用父類引用指向子類物件的時候,我們想把父類物件轉為子類物件時,需要向下轉型 向下轉型就是乙個還原動作。格式 子類名稱 物件名 子類名稱 父類物件 注意 乙個父類有...

向上轉型向下轉型

在引用資料型別中,只有有繼承關係的型別才能進行型別轉換 型別轉換只是轉換看待物件的引用的型別,物件本身沒有也不可能參與轉換 父類引用可以自動指向子類物件,但只能訪問和呼叫到來自於父類的屬性和行為 子類的引用不能指向父類或其它子類物件,就算強轉也會導致執行失敗並丟擲classcastexception...