当使用父类类型集合(如 List)存储子类对象时,无法直接调用子类独有的方法或字段;需通过 instanceof 类型检查配合显式向下转型才能安全访问子类成员。
当使用父类类型集合(如 `list
在面向对象编程中,将子类对象存入父类引用的集合(如 List
要安全访问子类特有成员,必须进行运行时类型判断 + 向下转型。推荐写法如下:
Parent p = list.get(1);
if (p instanceof Child childRef) { // Java 14+ 推荐的模式匹配语法(更简洁安全)
System.out.println(childRef.getAge()); // ✅ 正确访问子类字段
}
若使用 Java 8–13,可采用传统写法:
Parent p = list.get(1);
if (p instanceof Child) {
Child child = (Child) p;
System.out.println(child.getAge());
}
⚠️ 注意事项:
- 切勿跳过类型检查直接强制转型(如 (Child) list.get(1)),否则可能触发 ClassCastException;
- 子类中重复声明 private String name; 属于字段隐藏(field hiding),不仅造成冗余,还使 Parent 的 name 字段不可达,违背封装原则;应删除 Child 中的 name 字段,复用父类字段;
- 若业务逻辑频繁需要访问子类特有属性,应反思设计:是否应引入接口(如 Aged)、使用访问者模式,或重构为组合关系,避免过度依赖类型判断。
总结:类型安全的向下转型是解决该问题的标准方案,但其存在本身往往是设计信号——建议优先通过抽象共性、提取接口或使用泛型限定(如 List extends Parent> 配合通配符方法)来提升代码健壮性与可维护性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











