java方法参数用基类或接口类型接收子类对象是多态最典型落地方式,需满足父类形参、子类实参、方法重写和运行时绑定四要素,配合集合可统一处理多种子类对象。

Java 中方法参数用基类类型接收子类对象,是多态最典型、最实用的落地方式。关键不是“参数本身多态”,而是通过父类形参 + 子类实参 + 方法重写 + 运行时绑定,让同一方法调用产生不同行为。
参数声明用父类或接口类型
方法定义时,把参数类型设为父类(如 Animal)或接口(如 Shape),而不是具体子类(Dog、Circle)。这样编译器允许传入任意符合继承/实现关系的子类实例。
- ✅ 正确写法:
public void feed(Animal animal)—— 可传new Dog()、new Cat() - ❌ 错误写法:
public void feed(Dog dog)或public void feed(Dog | Cat dog)—— 后者语法非法,Java 不支持联合类型作形参(JDK 21 的模式匹配也不改变此规则)
实参必须是子类对象,且方法需被重写
仅声明父类参数还不够。要真正体现多态效果,必须满足:子类重写了该方法,且调用时实际传入的是子类实例。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Animal a = new Dog(); feed(a);→ 调用的是Dog.feed(),不是Animal.feed() - 如果
Dog没重写feed(),则仍执行父类逻辑 —— 多态不会自动发生,依赖重写 - 接口场景同理:
Shape s = new Rectangle(); draw(s);→ 执行Rectangle.draw()
配合集合或框架设计,体现统一处理能力
这种参数设计常用于需要批量、统一操作多种子类的场景,比如绘图系统、事件处理器、策略调度等。
- 集合中存多个子类对象:
List<animal> zoo = Arrays.asList(new Dog(), new Cat(), new Bird());</animal> - 遍历调用同一方法:
for (Animal a : zoo) { a.speak(); }—— 自动分发到各子类实现 - 框架扩展友好:新增
Fish类只需继承Animal并重写方法,无需修改原有feed()或循环逻辑
注意泛型与多态的配合边界
泛型可增强类型安全,但不能替代多态机制;两者结合需明确分工:
- 泛型解决编译期类型约束(如
List<animal></animal>不允许 add(String)) - 多态解决运行时行为选择(
animal.move()到底走哪个子类逻辑) - 避免误区:
List<dog></dog>不能赋值给List<animal></animal>—— 泛型不协变,这是类型系统限制,不影响方法参数层面的向上转型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










