instanceof 用于运行时判断对象是否属于某类型或其子类/实现类,依据对象实际类型而非声明类型;它检查类继承关系,返回布尔值,不进行类型转换,null 返回 false,基本类型不支持。

Java 中的 instanceof 运算符不是用来“获取”对象实际类型,而是**运行时判断对象是否属于某类型(或其子类/实现类)**,它依赖 JVM 对象头中存储的确切类信息,与变量声明类型完全无关。
它看的是对象本身,不是变量怎么声明的
多态下常见写法如 Animal a = new Dog(),编译器只知道 a 是 Animal 类型,但 instanceof 会穿透引用,直接检查 a 所指向的那个对象——也就是堆里那个 Dog 实例的真实类型。
-
a instanceof Dog→ true(它是 Dog 实例) -
a instanceof Animal→ true(Dog 是 Animal 的子类,满足 is-a 关系) -
a instanceof Cat→ false(和 Cat 没有继承或实现关系)
判断逻辑基于类层次结构向上匹配
JVM 在运行时执行以下步骤:
- 读取对象头中的实际类(比如
Dog.class) - 检查该类是否与右操作数类型相同
- 若不同,则沿继承链向上查找:是否是其父类、祖先类,或是否实现了目标接口
- 只要任一路径成立,就返回 true;否则 false
例如:new ArrayList() instanceof Serializable 为 true,因为 ArrayList 虽未显式 implements,但其父类 AbstractList 实现了 Serializable。
立即学习“Java免费学习笔记(深入)”;
它不等于 getClass(),也不做类型转换
instanceof 判断的是“能不能算作某类型”,而 obj.getClass() == X.class 判断的是“是不是 exactly 这个类”:
-
new ArrayList() instanceof List→ true -
new ArrayList().getClass() == List.class→ false(List是接口,不能 new)
注意:instanceof 只返回布尔值,不做任何转换。要调用子类特有方法,仍需配合显式强转:if (a instanceof Dog) { Dog d = (Dog) a; d.bark(); }
null 和基本类型是禁区
这些情况必须留意:
-
null instanceof Xxx→ 恒为 false(不会抛异常) -
int i = 5; i instanceof Integer→ 编译报错(左操作数必须是引用类型) -
String.class instanceof Class→ true(Class是类,String.class是Class的实例)


















