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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值