instanceof用于判断对象是否为某类或其子类的实例,或是否实现某接口,返回boolean值;null时恒为false,仅支持引用类型,Java 14+支持模式匹配绑定变量。

instanceof 用于判断一个对象是否是某个类(或其子类)的实例,或者是否实现了某个接口。它返回 boolean 值:true 表示符合类型关系,false 表示不符合或对象为 null。
基本语法和运行逻辑
格式为:object instanceof Type,其中 Type 必须是编译期已知的类、接口或数组类型。
- 如果
object为null,结果恒为false(不会抛异常) - 如果
Type是类,要求object的实际运行时类型是该类本身,或是其直接/间接子类 - 如果
Type是接口,只要object的实际类型实现了该接口,就返回true - 编译阶段会检查类型兼容性:若
object的编译时类型与Type完全无关(如String和FileOutputStream),编译失败
常见使用场景
主要用于安全的向下转型(downcast)前的类型校验,避免 ClassCastException。
- 先用
instanceof判断,再强转:if (obj instanceof Dog) {<br> Dog d = (Dog) obj;<br> d.bark();<br>} - 处理多态集合中的不同子类型,比如
List<Animal>中混有Dog、Cat,可分别处理 - 在重写的
equals()方法中判断参数是否为同一类型:if (!(obj instanceof Person)) return false;
注意边界情况
有些行为容易误解,需特别留意:
立即学习“Java免费学习笔记(深入)”;
- 不能用于基本类型:
int i = 5; i instanceof Integer编译报错(instanceof只接受引用类型) - 泛型擦除后无法检测真实泛型类型:
list instanceof ArrayList<String>不合法,只能写list instanceof ArrayList - 数组类型支持:
new String[3] instanceof Object[]为true;new int[3] instanceof int[]也合法 - 对于匿名内部类或 Lambda 表达式,可判断其是否实现某接口:
Runnable r = () -> {}; r instanceof Runnable返回true
替代方案(Java 14+)
模式匹配增强后,instanceof 可直接绑定变量,更简洁安全:
- 旧写法:
if (obj instanceof String) {<br> String s = (String) obj;<br> System.out.println(s.length());<br>} - 新写法(Java 14 起预览,Java 16 正式支持):
if (obj instanceof String s) {<br> System.out.println(s.length()); // s 已自动强转并作用于 if 块内<br>}


















