面向對象編程(OOP)三大支柱——封裝、繼承、多態,在 Java 中通過類、抽象類、接口共同實現。本文系統梳理抽象類與接口的語法規則、設計哲學差異,並結合繼承、多態、封裝機制,構建完整知識體系。
abstract 返回類型 方法名(參數列表);abstract 修飾的類(無抽象方法也可)。不能實例化,只能被繼承。super(...))。public abstract class Animal {
protected String name;
public Animal(String name) { this.name = name; } // 構造器
public abstract void sound(); // 抽象方法
public void breathe() { System.out.println(name + " 呼吸中..."); } // 普通方法
}
| 規則 | 說明 |
|---|---|
| 非抽象子類 | 必須實現所有繼承的抽象方法 |
| 抽象方法 | 不能為 private(子類不可見)、static(屬類非實例)、final(不可重寫) |
| 字段/方法 | 可擁有任意修飾符的字段、普通方法、靜態方法、靜態代碼塊 |
public abstract,字段隱式 public static final(常量)。default 默認方法、static 靜態方法、private 私有方法。public interface Flyable {
void fly(); // 隱式 public abstract
default void land() { System.out.println("著陸"); } // 默認方法
static int maxHeight() { return 10000; } // 靜態方法
}
| 維度 | 抽象類 | 接口 |
|---|---|---|
| 繼承/實現 | 單繼承 extends | 多實現 implements |
| 方法實現 | 可有普通/靜態/構造器 | 僅 default/static/private 可有體 |
| 字段類型 | 任意 | 僅 public static final |
| 構造器 | 有 | 無 |
| 訪問修飾 | 任意 | 方法默認 public,字段默認 public static final |
| 維度 | 抽象類 | 接口 |
|---|---|---|
| 抽象對象 | 「是一種」事物整體(屬性+行為) | 「具備」行為能力(單一職責) |
| 關係類型 | is-a 繼承關係 | has-a/can-do 能力關係 |
| 設計模式 | 模板模式:定義算法骨架,子類填充細節 | 輻射式/策略模式:定義行為規範,多類實現 |
| 變更影響 | 新增方法可提供默認實現,子類不受影響 | 新增方法破壞所有實現類(Java 8 default 緩解) |
// 抽象類:鳥類整體抽象
abstract class Bird {
protected String name;
public Bird(String name) { this.name = name; }
public abstract void breed(); // 繁殖方式各異
}
// 接口:飛行能力
interface Flyable {
void fly();
}
// 具體鳥類
class Eagle extends Bird implements Flyable {
public Eagle() { super("老鷹"); }
public void breed() { System.out.println("產卵孵化"); }
public void fly() { System.out.println("高空滑翔"); }
}
class Penguin extends Bird { // 不實現 Flyable
public Penguin() { super("企鵝"); }
public void breed() { System.out.println("產卵孵化"); }
}
non-private 字段/方法super()extends| 特性 | 重寫 | 重載 |
|---|---|---|
| 關係 | 父子類 | 同一類內 |
| 方法簽名 | 完全相同 | 名稱相同,參數列表不同 |
| 返回類型 | 兼容(同類或子類) | 可任意 |
| 訪問權限 | ≥ 父類 | 無限制 |
| 多態體現 | 運行時多態 | 編譯時多態 |
this → super → super.super → ...,編譯期綁定靜態方法/字段,運行期綁定實例方法。
Animal a = new Dog();)JVM 根據對象實際類型而非引用類型分發方法調用。a.sound() 調用 Dog.sound()。
// 參數多態:接受所有 Animal 子類
public void feed(Animal a) { a.eat(); }
// 返回類型多態:工廠模式
public Animal create(String type) {
if ("dog".equals(type)) return new Dog();
return new Cat();
}
參考原文 A/B/C/D 繼承鏈與重載/重寫混合場景,核心判斷邏輯:
this.show(O) → super.show(O) → this.show((super)O) → super.show((super)O)將數據與操作綁定,隱藏內部實現,暴露受控接口。四大收益:
| 修飾符 | 同類 | 同包 | 子類(異包) | 非子類(異包) |
|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ |
default | ✅ | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ |
public class Student {
private String name;
private int age;
// 內部邏輯封裝
private String formatName(String n) { return "Student: " + n; }
private String formatAge(int a) { return a + " 歲"; }
// 對外接口
public String getName() { return name; }
public void setName(String name) { this.name = formatName(name); }
public int getAge() { return age; }
public void setAge(int age) {
if (age > 0 && age < 150) this.age = age; // 驗證
}
}
抽象類與接口是 Java 實現多態與擴展性的雙引擎。抽象類捕捉「是什麼」(共性結構),接口定義「能做什麼」(行為契約)。繼承實現代碼復用,多態實現運行時綁定,封裝守護內部不變量。掌握三者協作,方能設計出高內聚、低耦合、易演進的面向對象系統。