在物件導向程式設計(OOP)的世界裡,「類別」是建構軟體的基石。它將現實世界中同類事物的特徵(屬性)與行為(方法)封裝起來。例如一個 Student 類別,包含學號、姓名、年齡等屬性,以及學習、吃飯等方法。但當系統複雜度提升,我們需要更靈活的機制來定義「規範」與「共享邏輯」,這就是抽象類與介面登場的舞台。
abstract 返回類型 方法名();),無方法主體,強制子類實作。abstract 修飾。它可以擁有建構子、非抽象方法、私有欄位,但無法直接實例化(不能 new AbstractClass())。Acount a = new HAcount();),調用抽象方法實則調用子類覆寫後的實作。getInterest())。public abstract class Acount {
private double total = 2000;
public Acount() {}
// 抽象方法:計算利息,強制子類實作
public abstract double getInterest();
// 普通方法:共享邏輯
public void setTotal(double total) { this.total = total; }
public double getTotal() { return total; }
}
public class HAcount extends Acount { // 活期帳戶
public double getInterest() { return this.getTotal() * 0.02; }
}
public class StaticAcount extends Acount { // 定期帳戶
public double getInterest() { return this.getTotal() * 0.03; }
}
// 使用多態
Acount a = new HAcount();
System.out.println(a.getInterest()); // 動態綁定到 HAcount.getInterest()
關鍵點:抽象類封裝了「是什麼」(共同屬性/方法)與「必須做什麼」(抽象方法),是 is-a 關係 的延伸。
interface 宣告。public static final 常數;方法預設為 public abstract(可省略修飾符)。implements 實作介面,可實作多個介面,突破單一繼承限制。public interface Jinshu { // 金屬介面
int DENSITY = 8; // 隱含 public static final
void shine(); // 隱含 public abstract
}
public interface Huobi { // 貨幣介面
void change();
}
public class Gold implements Huobi, Jinshu { // 同時實作多個介面
public void shine() { System.out.println("黃金閃閃發光!"); }
public void change() { System.out.println("黃金可以交換!"); }
public static void main(String[] args) {
Jinshu js = new Gold(); js.shine();
Huobi hb = new Gold(); hb.change();
System.out.println(js.DENSITY);
}
}
關鍵點:介面定義「能做什麼」(行為契約),支援 has-a / can-do 關係,是解耦合的利器。
類別 = 員工:具體執行任務,什麼都要自己做(全實作)。
抽象類 = 經理:部分工作自己做(普通方法),部分下放給員工(抽象方法),又說又做。
介面 = 老闆:只下指令(定義方法),完全不做事(無實作),純粹規範。
| 維度 | 抽象類 | 介面 |
|---|---|---|
| 關鍵字 | abstract class | interface |
| 繼承/實作 | 單一繼承 | 多重實作 |
| 方法類型 | 抽象 + 非抽象 | Java 8 前:全抽象;Java 8+:default/static/private 方法 |
| 欄位 | 任意修飾符 | 隱含 public static final |
| 建構子 | 有(供子類 super() 調用) | 無 |
| 設計意圖 | 強調 is-a 共享核心邏輯 | 強調 can-do 定義行為契約 |
| 存取修飾符 | 任意 | 方法隱含 public |
// 核心屬性:開、關 —— 屬於門的本質,用抽象類
abstract class Door {
abstract void open();
abstract void close();
}
// 額外功能:警報 —— 非本質,用介面
interface Alarm {
void alarm();
}
// 繼承 Door 並實作 Alarm
class AlarmDoor extends Door implements Alarm {
public void open() { System.out.println("門開啟"); }
public void close() { System.out.println("門關閉"); }
public void alarm() { System.out.println("警報觸發!"); }
}
設計原則:「將變化點提取為介面,將共同點提取為抽象類」,實現高內聚、低耦合。
default 方法更強化了介面演進能力)。掌握抽象類與介面的邊界與協作,是寫出可擴充、可維護 Java 系統的關鍵能力。