强制转换成功仅当父类引用实际指向子类对象,否则抛classcastexception;必须用instanceof判断再转换,jvm保证其与强转结果一致。

只有当父类引用实际指向子类对象时,强制转换才可能成功;否则必定抛出 ClassCastException。这不是语法问题,而是运行时类型检查失败。
为什么直接 (Child) parent 会崩溃
Java 虚拟机在执行强制转换时,会检查对象头中真实的类信息,而非变量声明类型。如果 parent 是用 new Parent() 创建的,哪怕它被声明为 Parent 类型,其真实类型仍是 Parent —— 此时转成 Child 必然失败。
- 崩溃现象:程序抛出
java.lang.ClassCastException: Parent cannot be cast to Child - 典型误用场景:从 JSON 反序列化得到
Parent对象后,未经判断就强转为某个具体子类 - 关键点:声明类型(compile-time type)和实际类型(runtime type)不一致,且后者不兼容目标子类
必须加 instanceof 判断再转换
这是最常用、最稳妥的防御式写法。JVM 保证 instanceof 的判断结果与后续强制转换结果严格一致 —— 如果它返回 true,那 (Child) parent 就绝不会抛异常。
- 正确写法:
if (parent instanceof Child) { Child child = (Child) parent; child.childMethod(); } - 注意:
instanceof对null安全,返回false,所以无需额外判空 - 避免嵌套:不要写成
if (parent != null && parent instanceof Child),多余 - Java 14+ 支持模式匹配简化:
if (parent instanceof Child child),此时child已是转换后变量,作用域限于 if 块内
业务对象转换时容易忽略的继承链陷阱
当存在多层继承(如 Animal → Mammal → Dog),或接口实现混用(如 Animal implements Pet),仅靠一层 instanceof 可能不够。
- 错误假设:
animal instanceof Dog为false,就认为它“不是狗”,但其实它可能是GoldenRetriever(继承自Dog),仍可安全转为Dog - 更健壮的判断应基于业务语义:若只需调用
Dog定义的方法,用animal instanceof Dog即可;若需调用GoldenRetriever特有方法,则必须明确判断该子类 - Lombok 场景下尤其明显:使用
@SuperBuilder构建的PoliceStation赋值给Station字段后,必须先确认再转,否则station.getPoliceStationName()编译不通过,运行也无意义
真正危险的不是不会写 (Child) parent,而是没想清楚「这个父类引用到底是不是我想要的那个子类实例」—— 类型检查不是可选步骤,是访问子类特有字段或方法前的必要守门人。










