java集合中多态的关键是用父类或接口类型声明(如list),存入不同子类对象,运行时动态绑定方法;只能调用父类/接口定义的方法,子类特有方法需instanceof判断后强制转型,但应避免;泛型保障类型安全、自动扩容、ide智能提示,新增子类无需修改原有遍历逻辑。

Java 中多态在集合中存储不同子类对象,关键不是“存得下”,而是“存得对、用得稳”——用父类或接口类型声明集合,实际装入多个子类实例,靠 JVM 运行时动态绑定方法,既安全又可扩展。
用统一父类型声明集合,不存 Object 或具体子类
不能写 List<object></object> 或 List<dog></dog>,那样就失去多态意义。正确做法是:
- 定义抽象类(如
Animal)或接口(如Drawable),声明通用行为(如makeSound()、draw()) - 集合声明为
List<animal></animal>或List<drawable></drawable> - 往里 add 的是
new Dog()、new Cat()、new Circle()等具体子类对象
添加后只能调用父类/接口声明的方法
编译器只认集合声明的类型。比如:
-
animals.get(0).makeSound()✅ 可以调用——makeSound()在Animal中已定义 -
animals.get(0).fetchBall()❌ 编译报错——fetchBall()是Dog特有方法,Animal没有该声明
如果真要调用子类特有方法,必须先判断再转型:if (obj instanceof Dog) ((Dog) obj).fetchBall();,但这会破坏多态初衷,应尽量避免。
比数组更安全灵活:泛型 + 动态扩容
相比 Animal[] 数组,List<animal></animal> 优势明显:
- 泛型提供编译期类型检查:不会误存
String或Integer进去 - 无需预估容量,add 时自动扩容
- IDE 能准确提示可用方法,开发体验好
新增子类零改动,遍历逻辑完全复用
只要新类继承同一父类或实现同一接口,它就能直接加入现有集合:
- 加一个
Parrot extends Animal,重写makeSound() - 把它
add到List<animal></animal>中 - 原有 for-each 循环或 stream 操作一行不用改,
s.makeSound()自动执行鹦鹉版本
这才是多态在集合中真正发挥价值的地方:统一管理、开闭原则落地、维护成本低。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











