Java instanceof 关键字是如何实现的?



HotSpot VM具体使用了长度为8的缓存数组,记录某个类从继承深度0到7的超类。HotSpot把类继承深度在7以内的超类叫做“主要超类型”(primary super),把所有其它超类型(接口、数组相关以及超过深度7的超类)叫做“次要超类型”(secondary super)。
对“主要超类型”的子类型判断不需要像Kaffe或JamVM那样沿着super链做遍历,而是直接就能判断子类型关系是否成立。这样,类的继承深度对HotSpot VM做子类型判断的性能影响就变得很小了。
对“次要超类型”,则是让每个类型把自己的“次要超类型”混在一起记录在一个数组里,要检查的时候就线性遍历这个数组。留意到这里把接口类型、数组类型之类的子类型关系都直接记录在同一个数组里了,只要在最初初始化secondary_supers数组时就分情况填好了,而不用像Kaffe、JamVM那样每次做instanceof运算时都分开处理这些情况。

举例来说,如果有下述类继承关系:
Apple <: Fruit <: Plant <: Object
并且以Object为继承深度0,那么对于Apple类来说,它的主要超类型就有:
0: Object
1: Plant
2: Fruit
3: Apple
这个信息就直接记录在Apple类的primary_supers数组里了。Fruit、Plant等类同理。

如果我们有这样的代码:
Object f = new Apple();
boolean result = f instanceof Plant;

也就是变量f实际指向一个Apple实例,而我们要问这个对象是否是Plant的实例。
可以知道f的实际类型是Apple;要测试的Plant类的继承深度是1,拿Apple类里继承深度为1的主要超类型来看是Plant,马上就能得出结论是true。
这样就不需要顺着Apple的继承链遍历过去一个个去看是否跟Plant相等了。

字节码
instanceof indexbyte1 indexbyte2
执行时,objectref出栈, indexbyte1 indexbyte2构建一个指向当前类运行时常量池的索引值。 为一个类、接口、数组类型的符号引用
如果objectref为null,那么instanceof指令将int 0推入栈
如果objectref可以转换为这个类,则1入栈,否则0入栈

Javainstanceof是一个关键字,用于判断一个对象是否是一个类的实例或者是一个类的子类的实例。它的语法是:object instanceof class。当object是一个类的实例或者是该类的子类的实例时,instanceof运算符返回true,否则返回false。在Java中,我们可以使用instanceof关键字来进行类型检查,以便在程序中做出相应的逻辑判断和处理。下面是一个示例代码: ```java class Animal { } class Dog extends Animal { } public class Main { public static void main(String[] args) { Animal animal1 = new Animal(); Animal animal2 = new Dog(); System.out.println(animal1 instanceof Animal); // 输出 true System.out.println(animal1 instanceof Dog); // 输出 false System.out.println(animal2 instanceof Animal); // 输出 true System.out.println(animal2 instanceof Dog); // 输出 true } } ``` 在上面的代码中,animal1是Animal类的实例,animal2是Dog类的实例。通过使用instanceof关键字,我们可以判断animal1是否是Animal类的实例,animal2是否是Animal类的实例,以及animal2是否是Dog类的实例。根据输出结果,我们可以看到animal1 instanceof Animal返回true,表示animal1是Animal类的实例;animal1 instanceof Dog返回false,表示animal1不是Dog类的实例;animal2 instanceof Animal返回true,表示animal2是Animal类的实例;animal2 instanceof Dog返回true,表示animal2是Dog类的实例。这样我们就可以根据instanceof的结果来做出相应的处理逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值