instanceof 通过运行时真实对象类型判断安全性,支持类、父类、接口检查,null 返回 false,配合类型检查可避免 ClassCastException,Java 14+ 支持模式匹配简化写法。

多态下用 instanceof 判断类型,核心是靠运行时真实对象身份做安全分支——声明类型只是“眼睛看到的”,而 instanceof 看的是“实际是谁”。它不解决“该不该设计成多态”,而是帮你在不得不处理混合类型时,稳住不崩。
判断是否属于某类或其子类
父类引用指向子类对象时,instanceof 会向上兼容:只要右边类型是左边对象实际类型的父类、自身类或实现的接口,就返回 true。
-
Animal a = new Dog();→a instanceof Animal为 true(Dog 是 Animal 子类) -
a instanceof Dog也为 true(正是 Dog 实例) -
a instanceof Cat为 false(Cat 和 Dog 无继承关系) -
null instanceof Dog恒为 false,不会抛异常
配合向下转型,避免 ClassCastException
多态中直接强转风险极高,必须先确认再转型。这是最典型也最必要的用法。
- ✅ 安全写法:
if (a instanceof Dog) { Dog d = (Dog) a; d.bark(); } - ❌ 危险写法:
Dog d = (Dog) a;—— 若 a 实际是 Cat 或 null,立刻崩溃 - Java 14+ 可用模式匹配简化:
if (a instanceof Dog d) { d.bark(); },d 自动绑定且作用域受限,更简洁也更防错
检查是否实现某个接口
接口不是类,但 instanceof 对接口完全支持,只要对象所属类实现了该接口,结果就是 true。
立即学习“Java免费学习笔记(深入)”;
-
Runnable r = () -> System.out.println("run");→r instanceof Runnable为 true -
Object obj = new ArrayList<>();→obj instanceof List为 true(ArrayList 实现了 List) - 注意:
obj instanceof List<String>编译失败——泛型擦除后无法识别具体参数类型
在集合遍历中逐个识别类型
像 List<Object> 或 List<Shape> 这类容器,元素类型在运行时已擦除,不能统一转型,必须每个元素单独判断。
- ✅ 正确方式:循环中用
if (item instanceof String)、else if (item instanceof Number)分支处理 - ❌ 错误方式:
((String) list.get(i)).length()—— 遇到 Integer 就抛异常 - Java 17+ 可用 switch 表达式配合模式匹配,语义更清晰,编译器还能提醒遗漏类型


















