抽象类和接口的区别
详细示例见 接口与抽象类。
对比表
| 对比项 | 抽象类 | 接口 |
|---|---|---|
| 关键字 | abstract class | interface |
| 继承/实现 | extends,单继承 | implements,可多实现 |
| 构造器 | 有 | 无 |
| 实例字段 | 可有 | 仅 public static final 常量 |
| 方法 | 抽象 + 普通具体方法 | 抽象;Java 8+ default/static;Java 9+ private |
| 访问修饰 | 较自由 | 方法默认 public |
| 设计语义 | is-a(狗是动物) | can-do(鸟能飞) |
| 典型用途 | 共享状态 + 部分实现 | 能力契约、多继承式组合 |
怎么选
需要共享字段状态? → 抽象类
需要多继承多种能力? → 接口
is-a 继承体系? → 抽象类
can-do 能力组合? → 接口
回调 / 策略 / Lambda? → 函数式接口
常见追问
Q:Java 8 以后接口有 default 方法,还要抽象类吗?
A:要。接口仍不能存实例字段;抽象类适合「模板方法 + 共享状态」的继承体系。
Q:一个类能 extends 多个类吗?
A:不能。多「父类型」能力靠 implements 多个接口。
Q:接口 default 方法冲突怎么办?
A:实现类必须重写,用 A.super.method() 显式选择。
Q:抽象类能 implements 接口吗?
A:能。抽象类实现接口时可只实现部分,剩余留给子类。