关键在于方法形参声明为父类或接口类型,子类对象直接传入即可自动适配——无需转型、if判断或重载;如void feed(animal animal)可接收dog、cat、bird等任意子类实例,且子类须重写非private/static/final方法以实现运行时多态。

关键在于方法形参声明为父类或接口类型,子类对象直接传入即可自动适配——不需要转型、不写 if 判断、也不用重载多个版本。
参数类型必须是父类或接口
方法签名里别写具体子类,而是用抽象层作为参数类型:
- Java 示例:void feed(Animal animal),而不是 void feed(Dog dog) 或 void feed(Cat cat)
- 支持任意子类传参:feed(new Dog())、feed(new Cat())、feed(new Bird()) 全部合法
- 集合场景更直观:void batchFeed(List
animals) 可接收混装的子类列表
子类必须重写父类中被调用的方法
运行时能执行不同逻辑,前提是子类提供了自己的实现:
- 父类方法不能是 private、static 或 final;子类需用 @Override 显式重写
- 例如:Dog.makeSound() 输出 "Woof!",Cat.makeSound() 输出 "Meow!",调用方完全无感
- 新增 Fish 类?只要继承 Animal 并重写 makeSound(),原方法一行都不用改
别在方法内部做类型判断或强转
一旦出现 instanceof 或 (Dog) animal,就说明多态没用对:
- 这种写法把行为差异又拉回调用方,破坏了封装,也违背开闭原则
- 如果真需要调用子类特有方法(如 Dog.bark()),说明契约设计不合理——该方法不该出现在当前调用链中
- 可考虑提取新接口、拆分职责,或改用策略模式等替代方案
接口比抽象类更推荐作为统一类型
优先用接口定义行为契约,解耦更强、复用更广:
- 一个类可实现多个接口,但只能继承一个类;比如 Logger、Notifier、Exporter 各自独立定义
- 接口不带状态和默认逻辑,避免父类塞进大量“可能用到”的方法,导致语义模糊
- 若需共享字段或基础实现(如通用 ID、通用校验),再考虑抽象类
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











