| 維度 | 接口 | 抽象類 |
|---|---|---|
| 本質 | 行為契約 | 實體模板 |
| 關鍵詞 | 能做什麼 | 是什麼 |
| 繼承關係 | 實現,可多實現 | 繼承,僅單繼承 |
| 方法實現 | JDK 8 前全抽象,JDK 8+ 可 default/static | 可含具體/抽象方法 |
| 構造器 | 無 | 有(供子類調用) |
| 字段 | 隱式 public static final | 任意修飾符 |
// 接口
public interface Flyable {
void fly(); // 隱式 public abstract
default void land() { ... } // JDK 8 默認方法
static void checkLicense() {} // JDK 8 靜態方法
}
// 抽象類
public abstract class Human {
private String name; // 實例字段
public Human(String name) { this.name = name; } // 構造器
public abstract void think(); // 抽象方法
public void eat() { ... } // 具體方法
}
// 抽象類定義骨架
public abstract class AbstractExporter {
public final void export(Data data) {
validate(data);
doExport(data);
notifyDone();
}
protected abstract void doExport(Data data); // 子類實現
private void validate(Data data) { ... }
private void notifyDone() { ... }
}
// 接口定義可插拔策略
public interface CompressStrategy {
byte[] compress(byte[] data);
}
public class ZipStrategy implements CompressStrategy { ... }
public class GzipStrategy implements CompressStrategy { ... }
// 組合使用
public class CsvExporter extends AbstractExporter {
private CompressStrategy compressor;
public CsvExporter(CompressStrategy compressor) { this.compressor = compressor; }
@Override protected void doExport(Data data) {
byte[] raw = toCsv(data);
byte[] compressed = compressor.compress(raw);
writeToFile(compressed);
}
}
抽象類建模「是什麼」,接口建模「能做什麼」。優先用接口定義契約,配合抽象類複用代碼,接口隔離變化點,構建高內聚低耦合系統。