
在多态集合(如 List<Parent>)中,无法直接调用子类独有的成员(如 Child.getAge()),需通过类型检查与向下转型实现安全访问。
在多态集合(如 `list
在面向对象编程中,将子类对象存入父类引用的集合(如 List<Parent>)是常见做法,但这也带来了访问限制:编译器仅允许调用 Parent 类声明的方法和字段。正如示例代码所示,list.get(1) 返回的是 Parent 类型引用,尽管实际对象是 Child 实例,但 getAge() 并未在 Parent 中定义,因此编译失败。
要安全获取子类特有成员,必须显式执行运行时类型检查 + 向下转型(downcast)。推荐使用 instanceof 运算符配合强制转换,既避免 ClassCastException,又保持代码健壮性:
Parent p = list.get(1);
if (p instanceof Child) {
Child child = (Child) p; // 安全转型
System.out.println(child.getAge()); // ✅ 正确输出 10
}⚠️ 注意事项:
- 切勿跳过类型检查:直接 (Child) list.get(1) 可能抛出 ClassCastException(例如当元素实为 Parent 实例时);
- 避免字段遮蔽(Shadowing):示例中 Child 类重复声明了 private String name;,导致父类 name 字段被遮蔽,破坏封装且易引发逻辑错误——应删除子类中的冗余 name 字段,统一通过继承的 getName()/setName() 操作;
- 设计建议:若多个子类共需某属性(如 age),可将其上提至 Parent 并设为 protected 或提供受控访问器;若确属子类专属,则 instanceof + 转型是标准、清晰的解决方案;
- 现代替代方案:Java 14+ 可结合模式匹配简化写法(if (p instanceof Child c) { System.out.println(c.getAge()); }),进一步提升可读性与安全性。
总之,在保持多态优势的同时精准访问子类特性,关键在于尊重类型系统——用 instanceof 守门,以转型解锁能力。
立即学习“Java免费学习笔记(深入)”;


















