java集合中实现多态的关键是用父类或接口类型声明集合,如list,子类对象自动向上转型并运行时动态绑定方法;新增子类无需修改遍历代码;接口更适用于无继承关系的类统一行为。

Java 中多态在集合框架中统一管理不同对象,关键不是“存什么”,而是“用什么类型去装”——必须用父类或接口类型声明集合,让子类对象通过向上转型自然融入,运行时自动调用各自重写的方法。
用父类/接口类型声明集合,不是 Object
不能写 List 来“凑合混存”,那样取出来全是 Object 引用,连 toString() 以外的方法都调不了,失去多态意义。正确做法是:
- 定义清晰的抽象层:比如
Animal抽象类或Drawable接口 - 声明集合时就锁定契约:
List<animal> animals = new ArrayList();</animal> - 添加时直接传子类实例:
animals.add(new Dog()); animals.add(new Cat());—— 这就是自动向上转型,无需(Animal)强转
遍历时统一调用,行为由实际类型决定
循环里只写一句 a.makeSound(),JVM 在运行期查对象真实 class,跳转到对应子类方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
new Dog()实例执行的是Dog.makeSound() -
new Cat()实例执行的是Cat.makeSound() - 新增
Bird类?只要继承Animal并重写,原有循环代码完全不用改
接口比抽象类更灵活,尤其适合无继承关系的类
当不同类之间没有父子关系(比如 Button、Timer、Logger 都要支持 start()),接口是更自然的选择:
- 定义
interface Startable { void start(); } - 让各类分别实现:
Button implements Startable、Timer implements Startable - 集合声明为
List<startable> tasks = new ArrayList();</startable>,混装无压力
不能直接调用子类特有方法,需安全向下转型
集合里用 Animal 引用,就只能访问 Animal 中声明的方法。如果真要调 Dog.guardHouse():
- 先判断:
if (a instanceof Dog) - 再转型:
((Dog) a).guardHouse(); - 不建议在主流程里大量写这种逻辑——说明抽象设计可能不够到位,优先考虑把共性行为提到接口或父类中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










