instanceof 通过检查对象在内存中的实际类型是否属于指定类或其子类(或实现接口)来判断,若匹配则返回 true,否则返回 false。它要求左侧操作数不能是基本数据类型,且编译时类型必须与右侧可转换,否则报错。运行时 jvm 会检查对象的实际类信息,支持多态向下转型前的安全校验。

编译期类型检查如何限制 instanceof 的使用
编译器在解析 instanceof 时,会严格检查左侧变量的声明类型是否与右侧类存在继承或实现关系。如果两者毫无关联,代码将无法通过编译。这种静态检查确保了类型安全的边界,防止对完全无关的对象进行无意义的类型判断。

public class Main {
public static void main(String[] args) {
Object obj = new String("test");
// 正确:String 是 Object 的子类
if (obj instanceof String) {
System.out.println("Is String");
}
// 错误示例(编译失败):Integer 与 String 无继承关系
// if (obj instanceof Integer) { ... }
}
}
运行时多态下的类型判断结果
当对象是多态引用时,instanceof 依据的是对象创建时的实际类型,而非引用变量的声明类型。这意味着即使引用被声明为父类或接口,只要实际对象是该类的实例,判断即为真。这体现了 Java 动态绑定的核心机制,确保类型检查反映真实状态。
立即学习“Java免费学习笔记(深入)”;

class Animal {}
class Dog extends Animal {}
public class Test {
public static void main(String[] args) {
Animal a = new Dog();
// 结果为 true,因为实际对象是 Dog
boolean result = a instanceof Dog;
System.out.println(result);
}
}
使用 null 值作为 instanceof 左操作数的结果
当 instanceof 的左侧操作数为 null 时,无论右侧是什么类,表达式始终返回 false。这是语言规范定义的明确行为,避免了空指针异常,允许开发者在不显式检查 null 的情况下安全地进行类型判断。


















