instanceof 是运行时类型检查机制,通过读取对象头中的确切类信息,判断实际类型是否为目标类、其子类或实现的接口,与声明类型无关,仅用于安全向下转型前的校验。

instanceof 在多态类型转换中,本质是运行时检查对象的实际类型是否与目标类型兼容,而不是看引用变量的声明类型。
基于对象的运行时类型标识
Java 虚拟机在创建对象时,会在对象头中记录其**确切的类信息**(即运行时类型)。instanceof 运算符正是读取并比对该信息:它不关心你用什么类型声明的变量(比如 Animal a = new Dog() 中的 Animal),而是直接查看 a 所指向的那个对象——它是不是 Dog 类或其子类的实例。
沿类层次结构向上匹配
虚拟机会按如下逻辑判断:
- 如果对象的实际类就是目标类,返回 true
- 如果对象的实际类是目标类的**直接或间接子类**,也返回 true
- 如果对象实现了目标接口(且该接口被实际类声明实现),同样返回 true
- 若目标类与对象类型无继承/实现关系,或对象为 null,一律返回 false
与编译期类型无关,纯运行时行为
编译器只确保右边的类名在编译期存在(不能是字符串或变量),但整个判断过程发生在程序运行时。这意味着:
- 即使你写 Animal a = new Cat(),a instanceof Dog 仍为 false,因为运行时对象是 Cat
- 父类引用指向哪个具体子类,instanceof 就能识别出哪个子类——这是它支撑安全向下转型的核心能力
- 它不会受泛型擦除、代理类或动态生成类干扰(只要类型关系在运行时真实成立)
不等于类型转换,只是转换前的必要检查
instanceof 本身不做任何转换,它只回答“能不能转”;真正的强制转换(如 (Dog) a)必须由程序员显式写出。它的价值在于:避免在不确定类型时盲目强转,从而防止 ClassCastException。








