java集合框架通过父类或接口类型声明泛型(如list)实现多态,允许存入子类实例并自动调用各自重写的方法,配合抽象类或接口定义行为契约,确保类型安全与运行时动态分发。

Java 中多态在集合框架中统一处理不同对象,核心是用父类或接口类型声明集合元素,实际存入各种子类实例,调用时自动执行各自重写的方法。
用泛型约束为统一类型
声明集合时指定父类或接口作为泛型参数,比如 List<animal></animal> 或 List<shape></shape>。这样编译器只允许添加该类型及其子类对象,既保证类型安全,又保留运行时多态能力。
- 不能直接存
new String()进List<animal></animal>,避免类型混乱 - 但
new Dog()、new Cat()都可以加入,因为它们是Animal的子类 - 泛型擦除后,JVM 仍能根据实际对象类型调用对应方法
遍历时无需判断类型
用增强 for 循环或迭代器遍历集合时,直接调用统一方法名(如 draw()、sound()),JVM 自动按每个元素的真实类型分发到对应实现。
- 不用写
if (obj instanceof Dog)或强制转型 - 避免冗长的条件分支,代码简洁且易于扩展
- 新增子类(如
Bird)只需继承并重写方法,原遍历逻辑完全不用改
配合抽象方法或接口定义行为契约
父类应定义为 abstract class 或 interface,把共性行为声明为抽象方法(如 public abstract void render();)。子类必须实现,确保集合中每个对象都支持该操作。
- 接口更灵活,适合无关类之间统一行为(如
Comparable、Runnable) - 抽象类适合有共用字段或部分实现的场景(如共享
name、age属性) - 不建议用普通
class作集合泛型,否则子类可能未重写关键方法,导致运行时行为不符合预期
实际例子:图形绘制系统
假设有一组图形对象,需要统一渲染:
List<shape> shapes = new ArrayList();
shapes.add(new Circle(5.0));
shapes.add(new Rectangle(4.0, 6.0));
shapes.add(new Triangle(3.0, 4.0, 5.0));
for (Shape s : shapes) {
s.draw(); // 各自调用 Circle.draw()、Rectangle.draw() 等
}</shape>
只要 Circle、Rectangle、Triangle 都继承自 Shape 并重写了 draw(),这段代码就可稳定工作,增删图形类型都不影响主流程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











