一、instanceof運算符 instanceof是Java語言中的一個二元運算符,它的作用是判斷一個引用類型的變數所指向的對象是否是一個類(或介面、抽象類、父類)的實例,即它左邊的對象是否是它右邊的類的實例該運算符返回boolean類型的數據。 常見的用法為:result=object inst ...
一、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技術乾貨!
▼微信掃一掃下圖↓↓↓二維碼關註