instanceof 是 Java 中用于判断对象是否为某类、其子类或实现某接口的运算符,返回 boolean;要求左操作数非 null 且类型兼容才为 true,null 恒返回 false,右侧必须是编译期确定的类型。

instanceof 是 Java 中用于判断对象是否为某个类(或其子类)的实例,或是否实现了某个接口的运算符。它返回 boolean 值,用法简单但有几点必须注意,否则容易出错或抛异常。
基本语法和使用场景
语法格式为:对象 instanceof 类型,其中“类型”可以是类、接口、数组类型等。只有当左侧对象非 null 且实际类型与右侧类型兼容时,结果才为 true。
- 如果左边是
null,无论右边是什么类型,结果恒为false(不会报错) - 右侧类型必须在编译期可识别,不能是运行时动态字符串(比如不能写
obj instanceof classNameStr) - 常用于向下转型前的安全检查,避免
ClassCastException
典型安全转型写法
直接强制转型有风险,加上 instanceof 判断可提升健壮性:
Object obj = "hello";
if (obj instanceof String) {
String s = (String) obj; // 安全转型
System.out.println(s.length());
}
如果不加判断就转型:String s = (String) obj;,一旦 obj 实际不是 String 类型,就会在运行时报错。
立即学习“Java免费学习笔记(深入)”;
与接口、父类、泛型擦除的关系
instanceof 支持接口和继承链判断:
-
list instanceof List→ 对ArrayList、LinkedList都返回true -
child instanceof Parent→ 子类实例对父类类型返回true -
不能用于带泛型的具体参数类型,如
list instanceof List<string></string>编译不通过(因泛型擦除,JVM 不保留类型参数信息)
常见误区提醒
以下写法看似合理,实则错误或无效:
-
"abc" instanceof Integer→ 编译通过,但结果恒为false(字符串不可能是整数实例) -
new Object() instanceof String→ 编译通过,运行结果为false -
obj instanceof MyInterface→ 若obj为null,结果是false,不是NullPointerException - 误以为能检测“运行时具体类名”,其实它只认类型兼容性,不关心是不是精确等于某类(除非该类没有子类)


















