public static final 常量、public abstract 方法(Java 8+ 還可有 default/static 方法)。interface 定義,implements 實現。專家預先定義比較規則:int compareTo(Object obj),返回正/負/零表大/小/等。
因「按什麼屬性比」不可預知,故方法必須是抽象的。
若放在抽象類 → 所有類未必能繼承該抽象類(單繼承限制);
放在接口 → 任意類皆可 implements Comparable,完美解耦。
import 接口;implements 接口(可多個,用逗號分隔);| 特性 | 抽象類 | 接口 |
|---|---|---|
| 成員變量 | 任意 | 只能 static final |
| 方法 | 可有非 abstract 方法 | 全部隱式 abstract(Java 8 前) |
| 構造器 | 有(供子類調用) | 無 |
| 繼承規則 | 單繼承 | 可多實現 |
| 默認實現 | 可提供 | Java 8 前不可,需委托模式 |
Door 及其子類)。Alarm 接口)。錯誤示範:在 Door 加 alarm() → 違反「接口隔離原則」,門與報警器概念混淆。
正確做法:
abstract class Door { abstract void open(); abstract void close(); }
interface Alarm { void alarm(); }
class AlarmDoor extends Door implements Alarm { ... }
清晰表達:AlarmDoor 本質是 Door,同時具備 Alarm 能力。若本質是報警器再有門功能,則反過來定義。
接口與抽象類雖相似,但表達的領域概念關系截然不同。準確理解「Is-A」與「Has-A」,靈活選擇,才能設計出高內聚、低耦合、易擴展的系統。