面向對象設計的關鍵在於抽象——建立「問題空間」到「方案空間」的理想映射。抽象類和接口是抽象過程的核心產物。
若類中不包含足夠信息描述具體對象,即為抽象類。它對一類特征相同但細節不同的對象進行抽象。
public abstract class Bird {
private String color;
public String getColor() { return color; }
public void setColor(String color) { this.color = color; }
public Bird() {}
// 抽象方法:無方法體,強制子類實現
public abstract void sing();
}
// 具體子類
class Magpie extends Bird {
@Override
public void sing() {
System.out.println("I can sing in a whisper.");
}
}
abstract 關鍵字修飾類abstract 修飾,無方法體接口是方法特征的集合,是契約,規定「能做什麼」。設計中要依賴抽象,而非具體實現。
如 USB 接口:無論硬盤、U盤、手機,實現 USB 規範即可連接電腦。
public interface IFly {
void fly(); // 默認 public abstract
}
// 鵲鳥實現飛行
class Magpie extends Bird implements IFly {
@Override
public void sing() {
System.out.println("I can sing in a whisper.");
}
@Override
public void fly() {
System.out.println("我會飛了!");
}
}
若需增加游泳功能,同理定义 ISwim 接口,避免污染鳥類體系。
public、abstract、default(隱式)interfacepublic abstract(Java 8 前),實現類必須 public 實現public static final(常量)default、static、private 方法| 維度 | 抽象類 | 接口 |
|---|---|---|
| 關系類型 | is-a(繼承關系) | like-a(行為契約) |
| 繼承/實現 | 單繼承 extends | 多實現 implements |
| 方法實現 | 可有默認實現 | Java 8 前全抽象,8+ 可 default |
| 構造方法 | 可有 | 不可有 |
| 成員變量 | 任意 | 僅常量 static final |
| 訪問修飾符 | 任意 | 方法默認 public |
Serializable、Cloneable、Comparable)// 客戶端不依賴具體實現
UserService userService = container.getBean(UserService.class); // IoC 注入
userService.register(user);
// 系統間交互:雙方約定接口,不關心內部實現
public interface PaymentService {
boolean pay(Order order);
}
// 支付寶、微信支付各自實現,業務代碼零修改切換
體現的設計原則:
需要定義類型契約?
├─ 是 → 接口
└─ 否 → 需要共享代碼/狀態?
├─ 是 → 抽象類
└─ 否 → 具體類
關注「老姜談技術」,微信號:helojava,每日一帖技術雞湯。
