instanceof運算符與引用變數的強制類型轉換

  • 2019 年 10 月 3 日
  • 筆記

一、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技術乾貨!

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