標籤:
這裡所說的物件類型轉換,是指存在繼承關係的對象,不是任意類型的對象。當對不存在繼承關係的對象進行強制類型轉換時,java 運行時將拋出 java.lang.ClassCastException 異常。
在繼承鏈中,我們將子類向父類轉換稱為“向上轉型”,將父類向子類轉換稱為“向下轉型”。
很多時候,我們會將變數定義為父類的類型,卻引用子類的對象,這個過程就是向上轉型。程式運行時通過動態綁定來實現對子類方法的調用,也就是多態性。
然而有些時候為了完成某些父類沒有的功能,我們需要將向上轉型後的子類對象再轉成子類,調用子類的方法,這就是向下轉型。
注意:不能直接將父類的對象強制轉換為子類類型,只能將向上轉型後的子類對象再次轉換為子類類型。也就是說,子類對象必須向上轉型後,才能再向下轉型。請看下面的代碼:
- public class Demo {
- public static void main(String args[]) {
- SuperClass superObj = new SuperClass();
- SonClass sonObj = new SonClass();
- // 下面的代碼運行時會拋出異常,不能將父類對象直接轉換為子類類型
- // SonClass sonObj2 = (SonClass)superObj;
- // 先向上轉型,再向下轉型
- superObj = sonObj;
- SonClass sonObj1 = (SonClass)superObj;
- }
- }
- class SuperClass{ }
- class SonClass extends SuperClass{ }
將第7行的注釋去掉,運行時會拋出異常,但是編譯可以通過。
因為向下轉型存在風險,所以在接收到父類的一個引用時,請務必使用 instanceof 運算子來判斷該對象是否是你所要的子類,請看下面的代碼:
- public class Demo {
- public static void main(String args[]) {
- SuperClass superObj = new SuperClass();
- SonClass sonObj = new SonClass();
- // superObj 不是 SonClass 類的執行個體
- if(superObj instanceof SonClass){
- SonClass sonObj1 = (SonClass)superObj;
- }else{
- System.out.println("①不能轉換");
- }
- superObj = sonObj;
- // superObj 是 SonClass 類的執行個體
- if(superObj instanceof SonClass){
- SonClass sonObj2 = (SonClass)superObj;
- }else{
- System.out.println("②不能轉換");
- }
- }
- }
- class SuperClass{ }
- class SonClass extends SuperClass{ }
運行結果:
①不能轉換
總結:對象的類型轉換在程式運行時檢查,向上轉型會自動進行,向下轉型的對象必須是當前參考型別的子類。
8.Java多態對象的類型轉換