深入分析java中的关键字instanceof

简介: instanceof关键字虽然没有final、static这些关键字用的多,但是也是非常重要的,尤其是面试。因此花了一些时间整理了一下。

一、认识instanceof关键字


其实instanceof就是一个操作符,语法形式很简单:

A instanceof B


A通常是引用变量,B通常是一个类或者是接口,表示的含义有三个:


(1)A是否是B的实例,

(2)A是否是B子类的实例

(3)A是否是B接口实现类的实例


也就是说我们平时使用instanceof关键字一般作为判断左右两侧是否有继承或者是实现关系。带着上面的问题,下面我们就具体看看如何去使用这个关键字。


二、使用instanceof关键字


为了表述上面三个含义,我们先给出一个继承关系图,然后去实现。

v2-ffb104872ded541e8fe636faaaf4a094_1440w.jpg

上面这张类图继承关系已经很明确了,我们用代码看一下:


三、代码验证


interface Play{}
class Human{}
class Man extends Human implements Play{}      
class Soldier extends Man {} 
class Woman extends Human {}  
public class Test {    
    public static void main(String[] args) {    
       //把这几个类的实例都创建出来
        Human human=new Human();
        Man man = new Man();
        Woman woman=new Woman();
        Soldier soldier = new Soldier();
        //然后我们挨个测试一下
        //1、Human是谁的实例
        test(new Human()); 
        //2、Man是谁的实例
        test(new Man());
        //3、Soldier是谁的实例
        test(new Soldier());
        //4、Woman是谁的实例
        test(new Woman());
    }      
    public static void test(Object p) {
        if (p instanceof Human)
            System.out.println(p.getClass() + "  是类Human的实例");
        if (p instanceof Man)
            System.out.println(p.getClass() + "  是类Man的实例");
        if (p instanceof Soldier)
            System.out.println(p.getClass() + "  是类Soldier的实例");
        if (p instanceof Woman)
            System.out.println(p.getClass() + "  是类Woman的实例");
        if (p instanceof Play)
            System.out.println(p.getClass() + "  是接口Play的实例");
    }
}

在这里我们对四个类进行了测试。下面我们输出一下结果:


(1)Human是谁的实例呢?


在文章一开始我们已经给出,Human其实是一个根类,没有继承任何父类,也没有实现任何接口。所以他的输出也很简单

class com.fdd.instanceofTest.Human  是类Human的实例

他自己只能是自己的实例了。


(2)Man是谁的实例?

Man继承了Human,实现了Play接口,因此他是Human的实例,同时也是Play接口的实例。

class com.fdd.instanceofTest.Man  是类Human的实例
class com.fdd.instanceofTest.Man  是类Man的实例
class com.fdd.instanceofTest.Man  是接口Play的实例

(3)Soldier是谁的实例?

Soldier继承了Man类,但是这里却没有实现Play接口,我们先看一下输出吧。

class com.fdd.instanceofTest.Soldier  是类Human的实例
class com.fdd.instanceofTest.Soldier  是类Man的实例
class com.fdd.instanceofTest.Soldier  是类Soldier的实例
class com.fdd.instanceofTest.Soldier  是接口Play的实例

也就是说,父亲有的儿子也有,父类实现的接口,子类也默认实现了。


(4)Woman是谁的实例?

如果你理解了上面的Man,那么Woman你应该能够理解,Woman只继承了Human类,所以他应该有两个,一个是Human的实例,一个是自己的实例

class com.fdd.instanceofTest.Woman  是类Human的实例
class com.fdd.instanceofTest.Woman  是类Woman的实例


四、总结


instanceof关键字用起来还是比较简单的,还记得我们在文章一开始提出的三个含义嘛?现在我们给其解答一下:


(1)A是A本身的实例,

(2)A是A父类(或者是父类的父类)的实例

(3)A是A接口(或者是父类的接口)的实例


既然instanceof是一个关键字,那说明jvm虚拟机能够正确的识别这个java指令。那么jvm如何去识别呢?


instanceof的指令格式是:instanceof|indexbyte1|indexbyte2。

指令执行前后的栈顶状态:objectref=>。。。


indexbyte1和indexbyte2用于构造对当前类的常量池的索引,objectref为reference类型,可以是某个类,数组的实例或者是接口。在实现instanceof指令的时候,首先是对indexbyte1和indexbyte2构造的常量池索引进行解析,然后根据java规范判断解析的类是不是objectref的一个实例,最后在栈顶写入结果。


这一段看不懂没关系,这是在jvm的操作,一般面试的时候要是问道,你只要把其如何使用搞清楚就好了,非要显得牛逼一点,那就看看instanceof指令在jvm是如何实现的就好。

相关文章
|
2月前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
79 1
|
3月前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到内存不足时会抛出OutOfMemoryError(OOM)异常。常见OOM情况包括:1) **Java堆空间不足**:大量对象未被及时回收或内存泄漏;2) **线程栈空间不足**:递归过深或大量线程创建;3) **方法区溢出**:类信息过多,如CGLib代理类生成过多;4) **本机内存不足**:JNI调用消耗大量内存;5) **GC造成的内存不足**:频繁GC但效果不佳。解决方法包括调整JVM参数(如-Xmx、-Xss)、优化代码及使用高效垃圾回收器。
148 15
常见java OOM异常分析排查思路分析
|
4月前
|
Java 程序员
Java 一个 Scanner.nextInt 造成的奇怪问题及分析解决过程
Java 一个 Scanner.nextInt 造成的奇怪问题及分析解决过程
|
29天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
52 2
|
1月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
22 2
|
2月前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
19 1
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
50 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
2月前
|
安全 Java 测试技术
🌟 Java 零基础 | 详解 instanceof 运算符
【10月更文挑战第1天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
36 1
|
2月前
|
Java
如何从Java字节码角度分析问题|8月更文挑战
如何从Java字节码角度分析问题|8月更文挑战
|
2月前
|
安全 网络协议 Java
Java反序列化漏洞与URLDNS利用链分析
Java反序列化漏洞与URLDNS利用链分析
55 3