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技術乾貨!
▼微信掃一掃下圖↓↓↓二維碼關注