一、前言
-
1.1、instanceof
是 Java 的保留关键字,一个二元操作符(和 ==,>,< 是同一类东东) -
1.2、
作用:测试它左边的对象是否是它右边的类的实例 -
1.3、
返回值:返回 boolean 的数据类型。 - 接下来通过本文给大家介绍 Java 中的 instanceof 用法详解及 instanceof 是什么意思,需要的朋友参考下吧
二、instanceof 的说明、解释
-
2.1、
说明:- (1). 一个类的 实例 包括本身的实例, 以及所有直接或间接子类的实例
- (2).instanceof 左边操作元显式声明的类型与右边操作元必须是 同种类 或有 继承关系, 即位于继承树的同一个分支上, 否则会编译出错!
-
2.2、
-
2.2.1_demo01_:
double obj = 1; if (obj instanceof Double) System.out.println("true"); // 无输出 --> 不成立
- 编译信息: Incompatible conditional operand types double and Double 错误
- 分析:obj 必须是对象的实例。不能是基础数据类型。
-
2.2.2_demo02_:
String obj = 1.0 + ""; if (obj instanceof Double) System.out.println("true"); // 无输出:
- 编译信息:Incompatible conditional operand types String and Double” 错误
- 分析:String 和 Double 不是位于继承树的 同一个分支 上。
-
2.2.3_demo03_:
if(null instanceof Object) System.out.println("true"); else System.out.println("false"); // 输出:false String obj = null; if (obj instanceof Object){System.out.println("true"); else System.out.println("false"); // 输出:false
- 分析:null 用操作符 instanceof 测试任何类型时都是返回 false 的
-
2.2.4_demo04_:
String obj = null; if (obj instanceof null) System.out.println("true"); else System.out.println("false");
- 编译信息:Syntax error on token “null”, invalid ReferenceType” 标记 ”null” 上的语法错误,无效引用类型
-
2.2.5_demo05_:前方高能,务必仔细阅读!!!
class Student {} public class Test {public static void main(String[] args){ // 第 1 组 System.out.println(new Student() instanceof String); // 编译时错误 System.out.println(new Student() instanceof Exception); // 编译时错误 System.out.println(new Student() instanceof Object); // 输出时 true // 第 2 组 System.out.println(new Student() instanceof List); // 输出 false System.out.println(new Student() instanceof List<?>); // 输出 false System.out.println(new Student() instanceof List<String>); // 编译错误 System.out.println(new Student() instanceof List<Object>); // 编译错误 // 第 3 组 System.out.println(new String() instanceof List); // 编译错误 System.out.println(new String() instanceof List<?>); // 编译错误 // 第 4 组 System.out.println(null instanceof Object); // 输出错误,同 demo03 } }
-
分析:
-
- 对于第 1 组:与下面一起论述
- 对于第 2 组:
-
疑惑 1:为什么用 student() 测试 String 时编译报错,测试 List 的时编译通过
- 猜测 :(1) 难道是 instanceof 对 接口 在编译时不作检查呢,(2)还是由于 List 类型本身在编译时不确定具体类型导致的
- 推翻猜测:与第 3 组用 String 对象测试 List<> 和 List<?> 时结果大不相同
- 论据 :翻看 Java 书籍时发现:instanceof 的这些表现都是跟cast 操作符是有点关系的,就是说当我们在 instanceof 方法时,编译器会检查这个对象能够 cast 到右边的类型。如果不能 cast 则直接报错,如果不能 确定 类型,则通过编译,具体看 运行时 定。
-
疑惑2:Student 已经确定类型了啊,List 类型也是确定的啊,为什么能够编译通过呢,而 String 却不行呢?“
- 猜测:难道是自己定义的类和系统定义的类在编译处理上有不同?
-
推论 :可能是因为 final 关键字的区别造成的,我们发现不论
String、Integer、Long
等都是 最终类,他们的处理类似于编译器对常量的处理,故而可以通过编译 -
论据 :其实当我们在自定义的类前面加上
final
关键字的时候,其表现就跟String、Integer、Long
这些最终类测试 instanceof 表现的一样了。
-
-
三、instanceof 的用法
- 用法:
result = object instanceof class
-
参数:
-
result
:布尔类型值 -
object
:类的对象 -
class
:对象类
-
- 说明:如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
四、综述
- 相信任何一个认真读完以上内容的人都会对 instanceof 的用法、理解更加深刻!
- 希望作者的文章可以被您采纳!您的支持是作者坚持的无限动力!Thanks!