1. 程式人生 > >instanceof關鍵字的實現原理淺析

instanceof關鍵字的實現原理淺析

概念和用法:

    instanceof關鍵字,也可以叫做型別比較運算子,在java中是用來判斷一個類是否是另一個類的例項。
    用法: boolean object instanceof class
    例如:a instanceof A,返回值是布林型。用法其實是比較簡單的,通俗的理解就是左邊的例項是否是右邊類的子類或者實現。右邊的類型別可以以是class,interface,array。參考oraclejdk8的規範,解釋一下上面的三句話:
    1.instanceof左邊的型別必須是引用型別或者null,否則會報錯(右邊的型別不能為null);
    2.instanceof右邊的型別不是可具體化的型別時,編譯會報錯(也就是右邊的型別要是可具體化型別,簡單的理解為非泛型的型別,因為編譯時會被型別擦除,細究可以參考

可具體化型別);
    3.如果左邊強制轉換右邊的型別失敗,那麼返回值不會是true(就是說左邊不能強轉到右邊的都會返回false,外國人語境的差異吧,聽起來很拗口)

用java程式碼的形式表示instanceof的實現原理就是:

boolean result;
if (obj == null) {
  result = false;
} else {
  try {
      T temp = (T) obj; 
      result = true;
  } catch (ClassCastException e) {
      result = false;
  }
}

instanceof使用例項

public class InstanceOfTest {


    public static void main(String[] args) {
        String [] stringArray = new String[]{};
        String text = "我是字串";
        B[] bArray = new B[]{};
        B b = new B();
        A ab = new B();
        System.out.println("class instanceof test");
        System.
out.println(b instanceof A); System.out.println(b instanceof B); System.out.println(b instanceof C); System.out.println(ab instanceof A); System.out.println(ab instanceof B); System.out.println(ab instanceof C); System.out.println(null instanceof Object); System.out.println(text instanceof String); System.out.println("interface instanceof test"); System.out.println(b instanceof B); System.out.println(b instanceof C); System.out.println(b instanceof D); System.out.println(ab instanceof B); System.out.println(ab instanceof C); System.out.println(ab instanceof D); System.out.println("array instanceof test"); System.out.println(b instanceof List); System.out.println(bArray instanceof A[]); System.out.println(bArray instanceof B[]); System.out.println(bArray instanceof C[]); System.out.println(bArray instanceof D[]); System.out.println(stringArray instanceof String[]); } } class B extends A implements C { } class A { } interface C extends D { } interface D { }

在這裡插入圖片描述
通過了上面對instanceof的用法解釋,想必這些結果讀者應該沒有什麼太多的疑問,可能比較注意的就是ab的instanceof的使用,ab是指向的B的例項,所以和b基本沒有區別,然後instanceof右邊的型別使用泛型是會編譯報錯的,因為泛型是上面說到的非可具體化型別,instanceof還可以用來判斷陣列。