抽象类管“怎么复用”,接口管“怎么约定”:抽象类定义“是什么”(如animal),支持构造器、成员变量和部分实现,单继承;接口定义“能做什么”(如flyable),仅含常量和行为契约,支持多实现。

抽象类和接口不是“差不多的替代品”,而是解决两类不同问题的工具:一个管“怎么复用”,一个管“怎么约定”。
设计意图:一个是类族模板,一个是行为合同
抽象类回答的是“它是什么”。比如Animal抽象类,表达“狗是动物、猫是动物”这种层级归属关系。它的存在是为了把子类共有的字段(如name)、通用逻辑(如eat())抽出来,避免重复写。它天然带继承结构,也允许部分实现——80%流程固定,20%留给子类填空,这就是模板方法模式的根基。
接口回答的是“它能做什么”。比如Flyable接口,不关心你是鸟还是无人机,只要能飞,就实现它。它定义的是能力契约,不绑定类型体系,也不承载状态。多个不相关的类可以实现同一个接口,这是打破单继承限制、实现横向能力扩展的关键。
语法特性:构造器、字段、方法实现权限完全不同
抽象类支持:
- 构造方法(供子类初始化时调用)
- 任意修饰符的成员变量(private、protected、普通字段都行)
- 抽象方法 + 具体方法 + 静态方法 + final方法
- 只能被单继承(extends一个)
接口支持:
- 无构造器(不能实例化,也不能被new)
- 所有字段默认是public static final(只能是常量)
- 抽象方法(隐式public abstract)、默认方法(default)、静态方法(static)
- 可被多实现(implements多个),也可被接口继承(extends多个接口)
什么时候该用抽象类,什么时候该用接口
选抽象类,当:
- 多个子类明显属于同一类族(比如PaymentChannel下有支付宝、微信、银联)
- 它们共享字段(如channelId、timeout)和通用流程(如签名校验、流水生成)
- 你想强制子类走一套骨架流程,只开放少数钩子让它们定制
选接口,当:
- 不同类需要统一对外暴露某组行为(比如OrderService和UserService都要支持exportData())
- 你希望一个类既能是Runnable,又能是Serializable,还能是Cloneable
- 你在设计公共SDK或跨团队协作协议,需要明确“必须提供什么”,但不干预“怎么实现”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











