instanceof 是 Java 的保留关键字,它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型

下面针对几种可能遇到的情况来看看会有什么结果:

1. 基本类型

可以看到, 这种情况下会有编译错误,那如果右边改为引用类型呢?

此时可以看到,仍然有编译错误,那么再试试特殊的 null 呢?

好像也不行,由此可以得出,基本类型不能用于 instanceof 判断.

2. null

对于 null,我们可以看到它只能用来判断是否是引用类型,并且返回的总是 false,表明它不是任意一个引用类型的对象实例.

它用来判断是否是基本类型或 null 的对象时,也会有编译错误,不可用.

3. 引用类型

我们创建如下关系的类和接口:

               

对于如下代码:

public class TestInstanceof {public static void main(String[] args) {Dog dog = new Dog();Animal animal = new Animal();Animal cat = new Cat();System.out.println(dog instanceof Dog);     // trueSystem.out.println(dog instanceof Bark);    // trueSystem.out.println(animal instanceof Bark); // trueSystem.out.println(animal instanceof Dog);  // falseSystem.out.println(cat instanceof Animal);  // trueSystem.out.println(cat instanceof Cat);     // trueSystem.out.println(dog instanceof Cat);     // 编译错误System.out.println(dog instanceof Integer); // 编译错误System.out.println(dog instanceof int);     // 编译错误System.out.println(dog instanceof null);    // 编译错误}
}
  • 基本类型完全不能用于 instanceof 判断
  • null 只能放在 instanceof 关键字的左边

4. 数组类型

对引用类型示例稍加修改,可以得到数组类型用来判断时的情况:

public class TestInstanceof {public static void main(String[] args) {Dog[] dog = new Dog[3];Animal animal = new Animal();System.out.println(dog instanceof Dog[]);    // trueSystem.out.println(dog instanceof Bark[]);   // true}
}

特别地,基本类型的数组也是可以用来判断的:

public class TestInstanceof {public static void main(String[] args) {int[] ary = new int[3];System.out.println(ary instanceof int[]);    // true}
}

4. 应用场景

instanceof 关键字一般用于强制转换,在强转之前用它来判断是否可以强制转换:

public B convert(A a) {if (a instanceof B) {return (B) a;}return null;
}

5. 实现原理

用类似 Java 的伪代码来描述该原理如下所示:

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

总结:

  1. obj==null,返回 false
  2. (T) obj 不引发 ClassCastException,返回 true,否则返回 false

instanceof 详解相关推荐

  1. java中instanceof 详解_java中的instanceof用法详解

    instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...

  2. java中instanceof 详解,神奇的instanceof

    本文地址:http://www.dutycode.com/instanceof_shiyong_jiqiao.html 除非注明,文章均为 www.dutycode.com 原创,欢迎转载!转载请注明 ...

  3. JS之instanceof详解

    instanceof 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上. 语法:object instanceof constructor object:某个实例对象 co ...

  4. Day16-01 P71 面向对象12什么是多态 P72 对象13:instanceof和类型转换 P73 static关键字详解 P74 抽象类 P75 接口的定义与实现 P76N种内部类

    Day16-01 P71 面向对象12:什么是多态 //父类Person package com.oop.demo06;public class Person {public void run(){S ...

  5. Java基础(七): instanceof用法详解

    1.instanceof说明 instanceof 是 Java 的保留关键字. 作用是:测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型. instanceof是Java中的 ...

  6. java 泛型 .net_Java基础11:Java泛型详解

    本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...

  7. php开发面试题---php面向对象详解(对象的主要三个特性)

    php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...

  8. 泛型java 代码讲解_Java泛型详解

    2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...

  9. Spring AOP 增强框架 Nepxion Matrix 详解

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 概述 在<深入聊一聊 Spring AOP 实现机制>一文中,介绍了 Spring A ...

最新文章

  1. Unity游戏开发大师班
  2. 基于SSM实现个人健康管理系统
  3. ios开发(6)uiimageView
  4. TCP/IP 5.3.5 认证
  5. git commit时避免填写Commit Message
  6. java 科学计数_Java和甜蜜的科学
  7. java statement 参数_java statement详细用法
  8. java找不到数据库的表_GreenDao:no such table 找不到表的终极解决方案!
  9. oracle ogg 12c mysql_Oracle GoldenGate 下载
  10. Java订单交易_Java实现获取105发卡平台的订单信息
  11. python url拼接_简单一文教你如何用python爬虫爬取扇贝单词
  12. 《神经网络与深度学习》邱锡鹏编程练习_第一章numpy_tutorial答案分享
  13. C编程实例-“约瑟夫问题” 解法
  14. 音频-什么是PCM编码格式?
  15. 计算机主机的组成的两部分,计算机的主机由哪两个部分组成
  16. java 这么获取农历_用JAVA查询中国农历年
  17. 重庆5G最新规划:明年建成3万个5G基站,力争主城区5G全覆盖
  18. discuz gbk php在utf8,Discuz!X2 utf8升级为Discuz!X2.5 GBK 完美解决方案
  19. 腾讯云服务器部署(保姆级)
  20. PyQt5_Demo5

热门文章

  1. 基础知识——进制 与 进制转换 (C++ 程序)
  2. 100句解析高瓴650亿美元布局思路,未来三年最重要商业趋势
  3. 联想小新V4000如何进入BIOS设置
  4. 技术宅小伙:Angular入门 - ngIf和ngFor介绍
  5. Codeforces 940 F - Machine Learning(带修改莫队, 及注意事项)
  6. 2019年第十届蓝桥杯B组决赛
  7. 油烟净化器能不能过环保,该怎么做?
  8. Android直播APP源码中排行榜功能如何实现
  9. 有哪个比较靠谱的企业直播平台
  10. 弘辽科技:淘宝直通车出价的技巧汇总