多态的核心是通过统一类型(接口或抽象类)调用不同实现类,运行时自动执行具体逻辑;接口定义行为契约,抽象类封装共性骨架,二者组合实现规范与复用兼顾。

多态在接口与抽象类组合设计中,核心是让不同实现类通过统一类型(接口或抽象父类)被调用,运行时自动执行各自的具体逻辑。这种组合不是“二选一”,而是各司其职:接口定义能力契约,抽象类提供共性骨架,两者协同支撑灵活、可扩展的多态行为。
用接口定义行为契约,实现跨类别的多态统一
接口不关心“是什么”,只约定“能做什么”。多个无关类(如 Payment、Notification、Logger)可以实现同一接口,从而被同一段代码处理:
- 定义
Processor接口,含process()方法; -
EmailSender、SmsSender、PushSender都实现它; - 业务方法接收
Processor类型参数,无需知道具体是哪种发送器——调用processor.process()时,自动触发对应实现。
这样,新增 WhatsAppSender 只需实现接口,原有调度逻辑完全不用改,真正体现“对扩展开放”。
用抽象类封装共性逻辑,减少子类重复代码
当多个实现类有相同字段、初始化流程或部分通用方法时,抽象类比接口更合适。它把“怎么做”的一部分固化下来,子类专注差异点:
立即学习“Java免费学习笔记(深入)”;
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 抽象类
BaseAnimal含name字段、breath()具体方法、makeSound()抽象方法; -
Dog和Cat继承它,只需实现makeSound(); - 调用
animal.breath()总是复用父类逻辑,而animal.makeSound()则根据实际类型动态分派。
此时多态既依赖继承关系(抽象类→子类),又依靠方法重写机制,运行时准确绑定到子类实现。
组合使用:接口 + 抽象类,兼顾规范与复用
典型模式是“接口定义能力,抽象类作为默认实现载体”。例如:
- 定义
Drawable接口,声明draw(); - 提供
AbstractShape抽象类,实现getDrawableArea()、管理color字段,并声明抽象getOutline(); -
Circle和Rectangle同时继承AbstractShape并实现Drawable(或直接让抽象类实现接口); - 上层代码可用
Drawable d = new Circle();多态调用,也可用AbstractShape s = new Circle();复用公共逻辑。
这种结构让接口保持轻量、高内聚,抽象类承担复用职责,二者不冲突反而互补。
注意多态生效的关键前提
无论用接口还是抽象类,多态要真正起作用,必须满足三个硬性条件:
- 存在继承(
extends)或实现(implements)关系; - 子类/实现类重写了父类/接口中的方法(非静态、非私有);
- 使用父类型(接口名或抽象类名)声明引用,指向子类型对象,例如
Runnable task = new MyThread();或Animal a = new Dog();。
如果直接用子类类型声明,或者调用的是未被重写的方法(如父类私有方法、静态方法),就无法触发运行时动态绑定。

















