接口是“能做什么”的契约,只声明行为;抽象类是“是什么”的半成品,可含部分实现。接口无构造器和实例字段,抽象类均可有。类单继承抽象类但可多实现接口。

接口和抽象类根本不是一回事,别混着用。它们都用来定义规范、支持多态,但设计目的、语法限制和使用场景完全不同。
核心定位不同
接口是“能做什么”的契约——只声明行为,不关心怎么实现;抽象类是“是什么”的半成品——定义一类事物的共性骨架,可以带部分实现。
比如:Animal 抽象类可以有 name 字段、sleep() 默认实现;而 Flyable 接口只能声明 fly() 方法,不许有状态。
语法能力差异明显
- 接口中所有方法默认是 public abstract(Java 8+ 可加 default 和 static 方法)
- 接口不能有构造器、不能有实例字段(只能有 public static final 常量)
- 抽象类可以有构造器、普通字段、普通方法、静态方法、甚至 private 方法
- 一个类只能继承一个抽象类,但能实现多个接口
什么时候选接口,什么时候选抽象类?
优先用接口:需要定义能力组合(如可序列化+可比较+可克隆)、强调解耦、未来可能跨类型复用(鸟会飞、飞机也会飞)。
立即学习“Java免费学习笔记(深入)”;
考虑抽象类:有一组子类共享大量代码逻辑、需要初始化共用状态(比如父类构造器设默认值)、或想强制子类继承某种结构(比如模板方法模式)。
实际项目里常搭配用:抽象类实现通用逻辑,再让子类实现特定接口,兼顾复用与灵活性。
小提醒:别为了“高级感”硬套
初学时容易把抽象类当“更牛的接口”,其实它更重“继承关系”。如果只是想约束方法签名,就用接口;如果真需要父子间代码复用和状态共享,再上抽象类。
基本上就这些。理解清楚“契约 vs 骨架”这个本质,选型就不纠结了。















