应先用 instanceof 再强转,因直接强转类型不匹配时会抛 classcastexception;instanceof 运行时安全返回布尔值,可避免异常。java 14+ 支持模式匹配写法 if (obj instanceof dog dog) {...},自动完成判断、转换与变量声明。

instanceof 是 Java 中用于类型检查的关键字,它能在运行时判断一个对象是否是某个类(或其子类)的实例。在执行向下转型(即从父类引用转为子类引用)前,用 instanceof 先做安全校验,能有效避免 ClassCastException。
为什么要先用 instanceof 再强转?
向下转型的前提是:该引用实际指向的对象,确实是目标子类(或其子类)的实例。如果直接强转而对象真实类型不匹配,JVM 会在运行时抛出 ClassCastException。而 instanceof 在编译期不报错、运行时安全返回 true 或 false,让你有机会跳过非法转换。
标准写法:先判断,再转换
推荐模式如下:
- 用
if (obj instanceof TargetType)判断是否可安全转为目标类型 - 确认为
true后,再执行强制类型转换 - 避免在条件表达式中直接强转(如
(TargetType)obj放在 if 里),否则仍可能抛异常
示例:
Object obj = new Dog(); // Dog 是 Animal 的子类
if (obj instanceof Animal) {
Animal a = (Animal) obj; // 安全:obj 确实是 Animal 类型
if (a instanceof Dog) {
Dog d = (Dog) a; // 安全:a 实际是 Dog 实例
d.bark();
}
}
注意几个关键细节
- instanceof 对 null 返回 false,不会抛空指针异常,所以无需额外判 null(但业务逻辑中仍需按需处理 null)
- 不能用于基本类型(如
int、boolean),只适用于引用类型 - 右边的操作数必须是类、接口或类型变量;若类不存在或不可见,编译报错
- 如果子类重写了父类方法,用 instanceof 判断后强转调用的仍是子类实现,这是多态的基础保障
Java 14+ 的简化写法:模式匹配(instanceof + 变量声明)
从 Java 14 开始(正式定稿于 Java 16),支持 instanceof 模式匹配,可一步完成判断和赋值:
if (obj instanceof Dog dog) { // 自动完成判断 + 强转 + 声明局部变量 dog
dog.bark(); // dog 已是 Dog 类型,可直接使用
}
// 此处 dog 变量作用域仅限于 if 块内
这种写法更简洁、更安全,且编译器会确保 dog 非 null,也杜绝了重复强转或作用域外误用的问题。











