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 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Animal a = new Dog(); feed(a);→ 调用的是Dog.feed(),不是Animal.feed() - 如果
Dog没重写feed(),则仍执行父类逻辑 —— 多态不会自动发生,依赖重写 - 接口场景同理:
Shape s = new Rectangle(); draw(s);→ 执行Rectangle.draw()
配合集合或框架设计,体现统一处理能力
这种参数设计常用于需要批量、统一操作多种子类的场景,比如绘图系统、事件处理器、策略调度等。
立即学习“Java免费学习笔记(深入)”;
- 集合中存多个子类对象:
List<Animal> zoo = Arrays.asList(new Dog(), new Cat(), new Bird()); - 遍历调用同一方法:
for (Animal a : zoo) { a.speak(); }—— 自动分发到各子类实现 - 框架扩展友好:新增
Fish类只需继承Animal并重写方法,无需修改原有feed()或循环逻辑
注意泛型与多态的配合边界
泛型可增强类型安全,但不能替代多态机制;两者结合需明确分工:
- 泛型解决编译期类型约束(如
List<Animal>不允许 add(String)) - 多态解决运行时行为选择(
animal.move()到底走哪个子类逻辑) - 避免误区:
List<Dog>不能赋值给List<Animal>—— 泛型不协变,这是类型系统限制,不影响方法参数层面的向上转型

















