java中instanceof的实现原理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/A_BCDEF_/article/details/96443019

instanceof的使用

obj instanceof class

注:obj 操作数的类型必须是引用类型或空类型,否则,发生编译时错误。

instanceof的实现原理

代码:

boolean rs;
if (obj == null) {
  rs= false;
} else {
  try {
      T temp = (T) obj; 
      rs= true;
  } catch (ClassCastException e) {
      rs = false;
  }
}
return rs;
  1. obj==null,返回false;
  2. 如果 obj 强制转换为 T 时发生编译错误,返回false。
  3. 运行时,如果 T != null,并且 (T) obj 不引发ClassCastException,返回true。
  4. 如果 obj != null 并且 (T) obj 不引发 ClassCastException ,返回 true ,否则值为 false 。

总结:obj==null,返回false;
(T) obj 不引发ClassCastException,返回true,否则为false;

解释:为什么不引发ClassCastException就为true?

  1. 设S为obj的类型对象, 检查S是否为T的子类型;
  2. 如果S == T,则返回true;
  3. 否则进行子类型检查:
  • S是数组类型:如果 T 是一个类类型,那么T必须是Object;如果 T 是接口类型,那么 T 必须是由数组实现的接口之一;
  • S是接口类型:遍历S所实现的接口,看有没有跟T一致的;
  • S是类类型:遍历S的super链(继承链)一直到Object,看有没有跟T一致的。(遍历类的super链意味着这个算法的性能会受类的继承深度的影响。)

以上只要有一个成立,S就是T的子类型
否则 S不是T的子类型。那么就无法强制转换,会产生ClassCastException。

HotSpotVM优化

类所继承的超类和所实现的接口不会在运行时改变。 -> 可以将这些信息存储起来

类继承深度从0到7的超类叫做“主要超类型”(primary super)->存于长度为8的缓存数组。

把所有其它超类型(接口、数组相关以及超过深度7的超类)叫做“次要超类型”(secondary super),存于一个数组(在初始化数组时分情况按顺序填好)。

遍历

不用遍历继承链等(性能差)

  • 直接根据情况遍历主要超类型数组
  • 根据情况获取指定下标,从指定下标遍历次要超类型数组
展开阅读全文

没有更多推荐了,返回首页