
当使用父类类型(如 List)存储子类对象时,无法直接调用子类独有的成员(如 Child.getAge()),需通过 instanceof 类型检查配合显式向下转型才能安全访问。
当使用父类类型(如 `list
在面向对象编程中,将子类对象存入父类引用的集合(如 List
要安全访问子类特有成员,必须执行运行时类型判定 + 向下转型。推荐写法如下:
Parent p = list.get(1);
if (p instanceof Child) {
Child child = (Child) p; // 显式向下转型
System.out.println(child.getAge()); // ✅ 正确访问
}
⚠️ 注意事项:
- 永远避免无条件强制转型(如 (Child) list.get(1)),否则在运行时遇到非 Child 对象会抛出 ClassCastException;
- Java 14+ 支持模式匹配的 instanceof(更简洁):
if (p instanceof Child child) { System.out.println(child.getAge()); // child 已自动声明并赋值 } - 若业务逻辑频繁依赖子类特有行为,应反思设计:是否该使用访问者模式、策略接口,或重构为组合优于继承,避免“向上造型后又急着向下转型”的反模式;
- 当前代码中 Child 类重复定义了 private String name,导致与父类 name 字段隐藏(field hiding),不仅浪费内存,还易引发逻辑混淆——建议移除子类中的冗余 name 字段,复用父类受保护字段(可将 Parent.name 改为 protected 或提供受保护 setter)。
总结:类型安全是多态使用的基石。instanceof 检查不是权宜之计,而是保障健壮性的必要步骤;而真正优雅的解决方案,往往始于对继承关系与职责边界的重新审视。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











