引用型別變數的強制轉換

pengfoo發表於2012-08-14
編寫java程式時,引用變數只能呼叫它編譯時型別的方法,而不能呼叫它執行時型別的方法,即使它實際所引用物件確實包含該方法。
引用型別之間的轉換隻能把一個父類變數轉換成子類型別。如果試圖把一個父類例項轉換成子類型別,則必須這個物件實際上是子類例項才行(即編譯時型別為父類型別,執行時為子類型別),否則會發生ClassCastException異常。
public class Test {
     public static void main(String[] args) {

         Object o1=new Object();//o1的編譯型別是Object,實際型別是Object,是string的父類,所以可以強制轉換成string類

         String o2=new String();             //o2的編譯型別是String,實際型別是String

         Object o3=new String();            //o3的編譯型別是Object,實際型別是String

         o2=(String)o1;                          //編譯時沒錯,執行時有錯(o2和o1的實際型別不一樣)

        o2=(String)o3;                           //編譯時沒錯,執行時沒錯(o2和o3的實際型別一樣)

        o3=(String)o1;                          //編譯時沒錯,執行時有錯(o1和o3的實際型別不一樣)

        o3=o1;                                     //編譯時沒錯,執行時也沒錯
     }
}

在強制轉換之前可以先用instanceof來判斷是否可以成功轉換,instanceof 的前一個運算元通常是引用型別變數,後一個通常是類。它用於判斷前面的物件是否是後面的類或其子類的例項,如果是返回true否則返回false。instanceof前面的運算元的編譯型別要麼與後面的類相同,要麼是後面類的父類,否則會發生編譯錯誤。
public class Test {

 
 public static void main(String[] args) {
     Object a1=new String();
   System.out.println(a1 instanceof Object);       //返回true
   System.out.println(a1 instanceof String);    //返回true
 
   System.out.println(a1 instanceof Math);    //返回false,math是object的子類
   System.out.println(a1 instanceof Comparable);  //返回true,string實現了comparable介面

   String a2=new String();
   System.out.println(a2 instanceof Math );    //編譯錯誤因為a2不是math類,也不是math的父類
 }

}

相關文章