java中instanceof的实现原理

it2022-05-05  115

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; obj==null,返回false;如果 obj 强制转换为 T 时发生编译错误,返回false。运行时,如果 T != null,并且 (T) obj 不引发ClassCastException,返回true。如果 obj != null 并且 (T) obj 不引发 ClassCastException ,返回 true ,否则值为 false 。

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

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

设S为obj的类型对象, 检查S是否为T的子类型;如果S == T,则返回true;否则进行子类型检查: 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),存于一个数组(在初始化数组时分情况按顺序填好)。

遍历

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

直接根据情况遍历主要超类型数组根据情况获取指定下标,从指定下标遍历次要超类型数组

最新回复(0)