Java 初学者必看:接口 vs 抽象类,到底有什么区别?
你是不是也曾在学习 Java 的时候,被接口和抽象类搞得一头雾水?它们看起来都能定义方法、都不能直接实例化,那到底该用哪个?今天我们就用最通俗的方式,帮你彻底搞懂!
一、 举个栗子:开一家奶茶店
想象你要开一家"统一标准"的奶茶连锁店:
- 所有分店都必须提供「珍珠奶茶」;
- 但每家店可以根据当地口味,决定加不加椰果、布丁等配料;
- 同时,所有分店都要遵守总部制定的「服务规范」,比如必须微笑服务、必须30秒内出杯......
这个时候,你就需要两种"模板":
- 抽象类:定义通用功能 + 可选实现(比如默认微笑服务);
- 接口:只规定"必须做什么",不关心怎么做(比如必须提供珍珠奶茶)。
二、什么是抽象类?
abstract class 奶茶店 {
// 已经实现的方法(通用逻辑)
public void 微笑服务() {
System.out.println("欢迎光临!");
}
// 抽象方法(子类必须实现)
public abstract void 制作珍珠奶茶();
}
特点:
- 用
abstract关键字声明; - 可以有 普通方法 (带实现)和 抽象方法(无实现);
- 子类用
extends继承,且 只能继承一个 抽象类; - 可以有构造器、成员变量、静态方法等。
三、 什么是接口?
interface 饮品标准 {
// 默认是 public static final 的常量
int 最低温度 = 0;
// 默认是 public abstract 的方法(Java 8+ 支持 default 方法)
void 提供珍珠奶茶();
// Java 8 起可以有默认实现
default void 快速出杯() {
System.out.println("30秒内完成!");
}
}
特点:
- 用
interface声明; - 方法默认是
public abstract(不能有方法体,除非是default或static); - 类用
implements实现接口,可以实现多个接口; - 不能有构造器,不能有实例变量(只有常量)。
四、核心区别对比表
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 关键字 | abstract class |
interface |
| 继承/实现方式 | extends(单继承) |
implements(多实现) |
| 方法实现 | 可部分实现 | Java 8 前不能实现;8+ 可用 default |
| 成员变量 | 可以有各种变量 | 只能有 public static final 常量 |
| 构造器 | 有 | 无 |
| 设计目的 | "是什么"关系 | "能做什么"关系 |
五、 什么时候用哪个?
-
用抽象类 :当你有一组紧密相关的类,它们共享很多代码逻辑(比如动物类都有"呼吸"方法),但某些行为需要子类自己定义。
-
用接口 :当你想定义一种能力或契约,多个不相关的类都可以具备(比如"会飞"这个能力,鸟、飞机、超人都可以实现)。
记住一句话:
抽象类是"模板",接口是"协议"。
六、 思考题
思考一下:下面场景该用接口还是抽象类?
- 定义"交通工具",都有"启动"和"停止"方法,但电动车和燃油车实现不同。
- 定义"可支付"功能,手机、手表、POS机都能支付。
答案:
1 → 抽象类(因为都是交通工具,有共性)
2 → 接口(不同设备,只要具备"支付"能力即可)