🔍核心问题:
abstract class和interface该怎么选
1、抽象类:共享实现的基类
🎯 What
带有部分实现的类模板,用于定义"IS-A"关系的共同基础
→ 本质: 共享代码和状态的骨架
⚙️ How
→ 关键特征:有字段、构造器、具体方法、单继承
java
abstract class Animal {
protected String name; // 共享状态(字段)
public Animal(String name) { // 共享构造逻辑
this.name = name;
}
public void sleep() { // 共享默认行为
System.out.println(name + " sleeps");
}
public abstract void sound(); // 子类必须实现
}
class Dog extends Animal { // 单继承
public void sound() { // 强制实现抽象方法
System.out.println("Bark!");
}
}
💡 Why
因为需要共享状态和行为 :当多个子类有相同的字段、构造逻辑、默认方法时,抽象类避免代码重复,确保子类遵循统一结构
→ 设计动机:代码复用 + 类型层次统一
✅ 选择场景:需要共享状态/构造逻辑/默认实现 + 单继承关系
2、接口:能力契约的定义
🎯 What
纯行为契约 ,用于定义"CAN-DO"关系的能力标准
→ 本质:跨类层级的能力协议
⚙️ How
java
interface Swimmable {
void swim(); // 行为契约
default void dive() { // 可选默认实现 (Java 8+)
System.out.println("Diving");
}
}
class Fish implements Swimmable { // 可多实现
public void swim() { // 必须实现核心契约
System.out.println("Swimming");
}
}
class Duck extends Animal implements Swimmable, Flyable { // 多能力
public void swim() { System.out.println("Duck swimming"); }
}
💡 Why
因为需要解耦和多继承 :当不同类需要相同能力,但无法共享实现时,接口提供统一契约,不强制实现细节,支持一个对象具备多种能力
→ 设计动机:行为标准化 + 灵活扩展
✅ 选择场景:跨类层级的能力定义 + 多继承需求 + 解耦设计
3、总结
💎 一句话关联
抽象类 :
"它是什么 " → 用继承+共享代码 构建 → 为了代码复用和统一
接口 :"它能做什么 " → 用实现+契约 定义 → 为了灵活扩展和解耦
🚀 决策指南(30秒选择)
| 问题 | → 抽象类 | → 接口 |
|---|---|---|
| 需要共享字段/状态吗? | ✅ 是 | ❌ 否 |
| 需要构造器初始化吗? | ✅ 是 | ❌ 否 |
| 需要部分默认实现吗? | ✅ 是 | ✅ Java 8+ default方法 |
| 需要多继承能力吗? | ❌ 否 | ✅ 是 |
| 这是本质属性还是行为能力? | 本质属性(IS-A) | 行为能力(CAN-DO) |