標籤:
這裡所說的物件類型轉換,是指存在繼承關係的對象,不是任意類型的對象。當對不存在繼承關係的對象進行強制類型轉換時,java 運行時將拋出 java.lang.ClassCastException 異常。
在繼承鏈中,我們將子類向父類轉換稱為“向上轉型”,將父類向子類轉換稱為“向下轉型”。
很多時候,我們會將變數定義為父類的類型,卻引用子類的對象,這個過程就是向上轉型。程式運行時通過動態綁定來實現對子類方法的調用,也就是多態性。
然而有些時候為了完成某些父類沒有的功能,我們需要將向上轉型後的子類對象再轉成子類,調用子類的方法,這就是向下轉型。
注意:不能直接將父類的對象強制轉換為子類類型,只能將向上轉型後的子類對象再次轉換為子類類型。也就是說,子類對象必須向上轉型後,才能再向下轉型。請看下面的代碼:
1 public class Demo { 2 public static void main(String args[]) { 3 SuperClass superObj = new SuperClass(); 4 SonClass sonObj = new SonClass(); 5 // 下面的代碼運行時會拋出異常,不能將父類對象直接轉換為子類類型 6 // SonClass sonObj2 = (SonClass)superObj; 7 // 先向上轉型,再向下轉型 8 superObj = sonObj; 9 SonClass sonObj1 = (SonClass)superObj;10 }11 }12 class SuperClass{ }13 class SonClass extends SuperClass{ }
將第7行的注釋去掉,運行時會拋出異常,但是編譯可以通過。
因為向下轉型存在風險,所以在接收到父類的一個引用時,請務必使用 instanceof 運算子來判斷該對象是否是你所要的子類,請看下面的代碼:
1 public class Demo { 2 public static void main(String args[]) { 3 SuperClass superObj = new SuperClass(); 4 SonClass sonObj = new SonClass(); 5 // superObj 不是 SonClass 類的執行個體 6 if(superObj instanceof SonClass){ 7 SonClass sonObj1 = (SonClass)superObj; 8 }else{ 9 System.out.println("①不能轉換");10 }11 superObj = sonObj;12 // superObj 是 SonClass 類的執行個體13 if(superObj instanceof SonClass){14 SonClass sonObj2 = (SonClass)superObj;15 }else{16 System.out.println("②不能轉換");17 }18 }19 }20 class SuperClass{ }21 class SonClass extends SuperClass{ }
運行結果:
①不能轉換
總結:對象的類型轉換在程式運行時檢查,向上轉型會自動進行,向下轉型的對象必須是當前參考型別的子類。
系列文章:
Java知多少(1)語言概述
Java知多少(2)虛擬機器(JVM)以及跨平台原理
Java知多少(3) 就業方向
Java知多少(4)J2SE、J2EE、J2ME的區別
Java知多少(5) Java開發環境的搭建
Java知多少(6)第一個程式樣本
Java知多少(7)類與對象
Java知多少(8)類庫及其組織圖
Java知多少(9) import及Java類的搜尋路徑
Java知多少(10)資料類型及變數
Java知多少(11)資料類型轉換
Java知多少(12)運算子
Java知多少(13)流程式控制制
Java知多少(14)數組
Java知多少(15)字串
Java知多少(16)StringBuffer與StringBuider
Java知多少(17)強調一下編程風格
Java知多少(18)類的定義及其執行個體化
Java知多少(19)存取修飾詞(存取控制符)
Java知多少(20)變數的範圍
Java知多少(21)this關鍵字詳解
Java知多少(22)方法重載
Java知多少(23)類的基本運行順序
Java知多少(24)封裝類、拆箱和裝箱詳解
Java知多少(25)再談Java包
Java知多少(26)源檔案的聲明規則
Java知多少(27)繼承的概念與實現
Java知多少(28)super關鍵字
Java知多少(29)覆蓋和重載
Java知多少(30)多態和動態綁定
Java知多少(31)static關鍵字以及Java靜態變數和靜態方法
Java知多少(32)instanceof
Java知多少(33)多態對象的類型轉換
Java知多少(33)多態對象的類型轉換