1. 程式人生 > >instanceof運算子與引用變數的強制型別轉換

instanceof運算子與引用變數的強制型別轉換

一、instanceof運算子

instanceof是Java語言中的一個二元運算子,它的作用是判斷一個引用型別的變數所指向的物件是否是一個類(或介面、抽象類、父類)的例項,即它左邊的物件是否是它右邊的類的例項該運算子返回boolean型別的資料。

常見的用法為:result=object instanceof class。如果object是clas的一個例項,那麼instanceof運算子返回true;如果object不是class的一個例項,或者object是null,那麼instanceof運算子返回false。

在使用instanceof運算子時需要注意:instanceof運算子前面運算元的編譯時型別要麼與後面的類相同,要麼與後面的類具有父子繼承關係,否則會引起編譯錯誤。下面的程式示範了instanceof運算子的用法。

public class InstanceofTest {

    public static void main(String[] args) {
        //宣告hello時使用Object類,則hello的編譯型別是Object
        //Object是所有類的父類,但hello變數的實際型別是String
        Object hello = "hello";
        //String與Object類存在繼承關係,可以進行instanceof運算,返回true
        System.out.println("字串是否是Object類的例項:"+(hello instanceof Object));
        System.out.println("字串是否是String類的例項:"+(hello instanceof String));
        //Math與Object類存在繼承關係,可以進行instanceof運算,返回false
        System.out.println("字串是否是Math類的例項:"+(hello instanceof Math));
        //String類實現了Comparable介面,所以返回true
        System.out.println("字串是否是Comparable類的例項:"+(hello instanceof Comparable));
        String a = "hello";
        //String與Math類沒有繼承關係,所以下面程式碼編譯無法通過
        System.out.println("字串是否是Math類的例項:"+(a instanceof Math));

    }

}

上面程式通過Object hello = "hello";程式碼定義了一個hello變數,這個變數的編譯時型別是Object類,但實際型別是String。因為Object類是所有類、介面的父類,因此可以執行hello instanceof String和hello instanceof Math等。

但如果使用String a = "hello";程式碼定義的變數a,就不能執行a instanceof Math,因為a的編譯型別是String,String型別既不是Math型別也不是Math型別的父類,所以這行程式碼編譯就會出錯。

instanceof運算子的作用是:在進行強制型別轉換之前,首先判斷前一個物件是否是後一個類的例項,是否可以成功轉換,從而保證程式碼更加健壯。


 二、引用變數的強制型別轉換

編寫java程式時,引用變數只能呼叫它編譯時型別的方法,而不能呼叫它執行時型別的方法,即使它實際所引用的物件確實包含該方法。如果需要讓這個引用變數呼叫它執行時型別的方法,則必須把它強制型別轉換成執行時型別,強制型別轉換需要藉助於型別轉換運算子。

型別轉換運算子是小括號,其用法是:(type)variable,這種用法可以將variable變數轉換成一個type型別的變數。除此之外,這個型別轉換運算子還可以將一個引用型別變數轉換成其子類型別。但這種強制型別轉換不是萬能的,需要注意以下兩點:

1)基本型別之間的轉換隻能在數值型別之間進行,這裡所說的數值型別包括整型、字元型和浮點型。但數值型別和布林型別之間不能進行型別轉換。

2)引用型別之間的轉換隻能在具有繼承關係的兩個型別之間進行,如果是兩個沒有任何繼承關係的型別,則無法進行型別轉換,否則編譯時會出現錯誤。

下面是進行強制型別轉換的示範程式,說明了哪些情況可以進行型別轉換,哪些情況不可以進行型別轉換。

 

public class ConversionTest {

    public static void main(String[] args) {
        double d = 13.4;
        long l = (long)d;
        System.out.println(l);
        int in = 5;
        //boolean b = (boolean)in;//編譯出錯
        Object obj = "hello";
        String str = (String)obj;//執行通過
        System.out.println(str);
        Object objPri = new Integer(5);
        String s = (String)objPri;//引發ClassCastException異常

    }

}

考慮到進行強制型別轉換時可能出現異常,因此進行型別轉換之前應先通過instanceof運算子來判斷是否可以成功轉換,例如上面的String s = (String)objPri,為了讓程式更加健壯,可以將程式碼改為以下:

if(objPri instanceof String) {
    String s = (String)objPri;
}

instanceof和(type)是java提供的兩個相關的運算子,通常先用instanceof判斷一個物件是否可以強制型別轉換,然後再使用(type)運算子進行強制型別轉換,從而保證程式不會出現錯誤。

 

歡迎關注微信公眾號【Java典籍】,收看更多Java技術乾貨!

   ▼微信掃一掃下圖↓↓↓二維碼關注