多态的核心是用父类或接口声明方法参数,子类对象自动向上转型,运行时按实际类型执行重写逻辑;需定义统一契约、子类重写方法、避免类型判断,确保扩展性与类型安全。
核心是用父类类型声明方法参数,让子类对象通过向上转型自动适配,运行时按实际类型执行对应逻辑。
定义统一的父类或接口
这是多态传递的前提。父类需提供公共行为契约(比如抽象方法或默认实现),子类各自重写。
- 推荐优先使用接口,更灵活、解耦更强;若需共享字段或默认逻辑,可用抽象类
- 方法签名中参数类型必须是这个父类或接口,不能是具体子类
- 例如:
void feed(Animal animal),而非void feed(Dog dog)或void feed(Cat cat)
子类继承并重写关键方法
每个子类覆盖父类中被调用的方法,确保行为差异化。Java 运行时会自动绑定到实际对象的版本。
- 重写必须满足:方法名、参数列表、返回类型一致;访问权限不能更严格
- 避免在方法内用
instanceof或强制转换判断类型——这破坏多态初衷 - 像
Dog.makeSound()输出"Woof!",Cat.makeSound()输出"Meow!",调用方完全无感
方法调用时直接传入子类实例
只要子类是父类的合法子类型,编译器允许直接传参,无需显式转型。
- 写法自然:
feed(new Dog())、feed(new Cat())、feed(new Bird()) - 集合场景更明显:可把
List<Animal>传给void batchFeed(List<Animal> animals),混装任意子类 - 新增子类(如
Fish)只需实现Animal,原方法不用动一行代码
注意边界和常见误区
多态不是万能的,要守住类型安全和设计简洁性。
- 只能调用父类声明过的方法——子类独有的方法(如
Dog.bark())在父类参数签名下不可见 - 若真需子类特有操作,应考虑是否契约设计不合理,或改用策略模式等替代方案
- 避免为“兼容”而把父类塞满所有子类可能用到的方法,导致臃肿和语义模糊

















