接口和抽象类的区别?如何选择?
请全面对比Java中接口(interface)和抽象类(abstract class)的异同点,包括语法层面、设计层面和使用场景。Java 8/9新增的default方法、static方法和私有方法如何影响选择?
回答
Yahuda
| 维度 | 抽象类 | 接口 |
|---|---|---|
| 定义 | abstract class | interface |
| 继承 | 单继承(extends) | 多实现(implements,可多个) |
| 构造方法 | 可以有 | 不能有 |
| 成员变量 | 任意类型 | public static final(常量) |
| 方法 | 抽象+具体方法 | 抽象+default+static(Java 8)+私有方法(Java 9) |
| 访问修饰符 | 任意 | public(Java 9前方法默认public) |
设计角度:抽象类建模「is-a」关系(如Dog extends Animal);接口建模「can-do」能力(如Flyable)。
如何选择:有共同状态(字段)或部分实现用抽象类;需要多继承能力或定义行为契约用接口。Java 8后接口功能增强,但设计理念不同。推荐优先使用接口进行抽象。