JAVA学习笔记--instanceof关键字
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
严格来说,instanceof 是 Java 的一个二元操作符(双目运算符),类似于 ==,>,< 等操作符。用来测试一个对象是否是为一个类的实例,用法为:
1 | boolean result = obj instanceof class |
其中 obj 为一个对象,Class 表示一个类或者一个接口。
当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
重点:
值得注意的是 obj 必须为引用类型,不能是基本类型。例如以下代码:
1 2 3 | int i = 0 ; System.out.println(i instanceof Integer); // 编译不通过 System.out.println(i instanceof Object); // 编译不通过 |
所以,instanceof 运算符只能用作对象的判断。
当 obj 为 null 时,直接返回 false,因为 null 没有引用任何对象。
1 2 3 | int i = 0 ; System.out.println(i instanceof Integer); // 编译不通过 System.out.println(i instanceof Object); // 编译不通过 |
所以,obj 的类型必须是引用类型或空类型,否则会编译错误。
当 class 为 null 时,会发生编译错误,错误信息如下:
Syntax error on token "null", invalid ReferenceType
所以 class 只能是类或者接口。
编译器会检查 obj 能否转换成右边的 class 类型,如果不能转换则直接报错,如果不能确定类型,则通过编译。这句话有些难理解,下面我们举例说明。
1 2 3 4 5 | Person p1 = new Person(); System.out.println(p1 instanceof String); // 编译报错 System.out.println(p1 instanceof List); // false System.out.println(p1 instanceof List<?>); // false System.out.println(p1 instanceof List<Person>); // 编译报错 |
上述代码中,Person 的对象 p1 很明显不能转换为 String 对象,那么p1 instanceof String
不能通过编译,但p1 instanceof List
却能通过编译,而instanceof List<Person>
又不能通过编译
可以理解成以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | boolean result; if (obj == null ) { result = false ; // 当obj为null时,直接返回false } else { try { // 判断obj是否可以强制转换为T T temp = (T) obj; result = true ; } catch (ClassCastException e) { result = false ; } } |
在 T 不为 null 和 obj 不为 null 时,如果 obj 可以转换为 T 而不引发异常(ClassCastException),则该表达式值为 true ,否则值为 false 。所以对于上面提出的问题就很好理解了,p1 instanceof String
会编译报错,是因为(String)p1
是不能通过编译的,而(List)p1
可以通过编译。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人