instanceof用于判断对象是否为某类(或子类)实例或实现某接口,返回boolean;仅适用于引用类型,null时恒为false,右操作数须编译期已知且与左操作数有继承/实现关系。

instanceof 用于判断一个对象是否是某个类(或其子类)的实例,或是否实现了某个接口。它返回 boolean 值,只能用于引用类型,且左操作数为对象引用,右操作数必须是类、接口或数组类型(编译期已知)。
基本语法和使用前提
格式:object instanceof Type
- 如果
object为null,结果恒为false(不会抛异常) -
Type必须与object的编译时类型有继承/实现关系,否则编译报错 - 运行时会检查
object实际指向的对象是否属于Type或其子类型
判断子类实例的典型场景
常用于多态下安全地向下转型(downcast)前做类型校验:
Animal a = new Dog(); // 编译时类型 Animal,运行时类型 Dog
if (a instanceof Dog) {
Dog d = (Dog) a; // 安全转型
d.bark();
}
- 若去掉
instanceof直接强转,当a实际是Cat时会抛ClassCastException - 注意:不能用
instanceof判断泛型类型(如list instanceof ArrayList<String>会编译错误),因泛型在运行时被擦除
配合 sealed class 和 pattern matching(Java 14+)
Java 14 引入预览版模式匹配,Java 16+ 正式支持 instanceof 模式匹配,可直接声明并绑定变量:
立即学习“Java免费学习笔记(深入)”;
if (obj instanceof String s) {
System.out.println("Length: " + s.length()); // s 已自动转换并作用域有效
} else if (obj instanceof Integer i) {
System.out.println("Value: " + i);
}
- 变量
s和i只在对应if或else if块内有效 - 比传统写法更简洁、安全,避免重复转型
- 仍遵循原有语义:
null结果为false,不进入分支
常见误区提醒
以下写法容易出错:
-
new Object() instanceof String→ 编译通过,运行返回false -
String s = null; s instanceof String→ 返回false,不是NullPointerException -
int i = 5; i instanceof Integer→ 编译错误,基本类型不能用instanceof -
list instanceof List<String>→ 编译错误,“参数化类型不能用于 instanceof”


















