关键在于用父类或接口类型声明集合并存入子类对象,运行时自动调用各自重写的方法;通过抽象类或接口定义统一契约(如shape或drawable及draw()方法),子类实现后即可被统一处理,新增子类无需修改原有遍历逻辑。

关键在于用父类或接口类型声明集合,实际存入子类对象,运行时自动调用各自重写的方法。
用抽象类或接口定义统一契约
先明确共性行为,比如所有图形都要能绘制,就定义抽象类 Shape 或接口 Drawable,声明公共方法 draw()。子类如 Circle、Rectangle 必须实现该方法。这样它们才具备“可被统一处理”的前提。
声明父类/接口类型的集合并添加子类实例
不直接用具体子类类型,而是:
- 写 List
shapes = new ArrayList(); - 然后 shapes.add(new Circle());
- 再 shapes.add(new Rectangle());
编译期检查确保只存合法子类;运行时每个元素调用 draw(),会分别执行圆形或矩形自己的绘制逻辑,无需 if-else 判断类型。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
遍历调用时自动绑定具体实现
对集合做统一操作即可:
- for (Shape s : shapes) { s.draw(); }
- 新增一个 Triangle 类,只要继承 Shape 并重写 draw(),原有遍历代码完全不用改
这种设计把“行为差异”封装在子类内部,集合只关心“它能 draw”,不关心“怎么 draw”。
注意不能直接访问子类特有功能
如果 Circle 有独有方法 getRadius(),不能直接写 shapes.get(0).getRadius()——因为 Shape 类型没这个方法。真需要时,得先判断再强转:
- if (shapes.get(0) instanceof Circle) { ((Circle) shapes.get(0)).getRadius(); }
这说明多态容器的初衷是统一行为,不是为了混搭调用所有细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










