Java instanceof 浅析

关键字 instanceof 通过返回一个布尔值来指出,某个对象是否是某个特定类或者是该特定类的子类的一个实例。
用法:boolean object instanceof class
返回值:返回值是布尔型

instanceof 规则

  • 左边的类型必须是引用类型或者null,否则会报错(非基本数据类型,右边的类型不能为null)
  • 右边的类型不是可具体化的类型时,编译会报错(非泛型的类型,编译时会被类型擦除)
  • 左边强制转换右边的类型失败,那么返回值是false
  • 左侧为null,返回值为false(null是万用数据类型,无论是否强转,返回值否为false;例如(String) null instanceof String;)
  • 没有继承或实现关系时,编译不通过:new Date() instanceof String;
  • 左侧为泛型时,返回值取决于泛型的表象类型,而不是实际类型(泛型为编码服务,在编译成字节码时就是表象类型)
  • instanceof还可以用来判断数组
  • class可以是类,亦可以是接口

instanceof在Java的编译状态和运行状态的区别:

  • 在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。 左侧为泛型时,按照编译时的表象类型Object判断是否会报错。
  • 在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错,运行结果为false。
  • 即:编译时期判断报错(表象类型),运行时期判断布尔值(实际类型)

instanceof关键字的Java实现原理

当左侧为null时,返回值为false,当不能强转类型时,返回值为false

boolean result;
if (obj == null) {
  result = false;
} else {
  try {
      T temp = (T) obj; 
      result = true;
  } catch (ClassCastException e) {
      result = false;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值