instanceof关键字的实现原理浅析

版权声明:分享,转载原创文章,麻烦注明一下出处~谢谢 https://blog.csdn.net/sc9018181134/article/details/84038336

概念和用法:

    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还可以用来判断数组。

猜你喜欢

转载自blog.csdn.net/sc9018181134/article/details/84038336