抽象类表达is-a关系,体现子类与父类的血缘继承;接口表达like-a关系,体现松耦合的能力契约。设计时应先判断“B是A的一种吗?”选抽象类,“B能做A规定的事吗?”选接口。

核心就看关系本质:抽象类表达 is-a(是一种),接口表达 like-a(像一种、具备某种能力)。
抽象类体现 is-a 关系
子类和抽象父类在概念上属于同一类事物,有天然的血缘继承逻辑。
- 比如
Circle是一种Shape,Dog是一种Animal,用抽象类建模很自然 - 抽象类可含字段、构造器、具体方法和抽象方法,承载家族共性状态与行为
- Java 不允许多继承抽象类,正因为它强调“唯一父源”的归属感
接口体现 like-a 关系
实现类和接口之间没有血缘,只是“恰好支持某组行为”,是松耦合的契约关系。
- 比如
Car可以 像 一个Runnable(能跑)、像 一个Alarmable(能报警),但它显然不是“跑者”或“报警器”的一种 - 接口只定义能力规范,不关心谁来实现、怎么实现,也不携带状态
- 一个类可以
implements多个接口,正因为它可以同时具备多种独立能力
设计选型时的关键判断
遇到两个类型,先问自己一句:
立即学习“Java免费学习笔记(深入)”;
- “B 是 A 的一种吗?” → 是,优先考虑抽象类(is-a)
- “B 能做 A 所规定的事吗?” → 是,且不强调身份归属,用接口(like-a)
- 现实中常混合使用:比如
AirConditioner extends Cooler implements Heater,既承认它是制冷设备的一种,又扩展加热能力
补充一个常见误区
有人觉得“接口更高级所以优先用”,其实不然。如果硬把 MySQLConnection 和 PostgreSQLConnection 都塞进一个 DBConnection 接口,就模糊了它们“都是数据库连接”这一本质 is-a 关系;此时更适合抽象类统一管理连接生命周期、重试逻辑等共性,再让接口负责扩展事务、批处理等可选能力。


















