接口的核心價值在於「多上溯造型」——一個對象可被視為多種類型。本文通過一個「英雄技能」示例,展示:
① 多接口實現 (CanFight/CanSwim/CanFly)
② 抽象基類 ActionCharacter 封裝共性邏輯 (fight())
③ 子類 Hero 組合繼承與實現,滿足「單繼承、多實現」語法規則。
// 三個行為接口
interface CanFight { void fight(); }
interface CanSwim { void swim(); }
interface CanFly { void fly(); }
// 基類提供預設 fight 實現,減少子類重複代碼
class ActionCharacter {
public void fight() { System.out.println("基礎攻擊"); }
}
// 英雄:繼承基類 + 實現三接口
class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly {
@Override public void fly() { System.out.println("翱翔天際"); }
@Override public void swim() { System.out.println("潛游深海"); }
// fight() 繼承自 ActionCharacter,可選擇 @Override 覆寫
}
// 測試:上溯造型為不同接口類型調用
public class Adventure {
static void t(CanFight x) { x.fight(); }
static void u(CanSwim x) { x.swim(); }
static void v(CanFly x) { x.fly(); }
static void w(ActionCharacter x) { x.fight(); }
public static void main(String[] args) {
Hero hero = new Hero();
t(hero); // CanFight 視角
u(hero); // CanSwim 視角
v(hero); // CanFly 視角
w(hero); // ActionCharacter 視角
}
}
extends 在前,implements 在後,否則編譯報錯。Hero 實例可自動向上轉型為任意實現的接口或父類類型,方法調用走動態分派。ActionCharacter 提供 fight() 默認行為,Hero 免去實現 CanFight.fight(),體現「接口定義契約,基類提供通用邏輯」的設計模式。Java 8+ 允許接口定義 default 方法,可進一步減少基類:
interface CanFight {
void fight();
default void combo() { fight(); fight(); System.out.println("連招!"); }
}
但 default 方法無法訪問實例字段(接口無狀態),複雜邏輯仍建議放入抽象基類。
設計原則:「面向接口編程,基類封裝變化」。
Hero依賴CanFight/CanSwim/CanFly抽象,而非具體實現;ActionCharacter封裝共性fight(),若未來改為「魔法攻擊」只需調整基類,符合開閉原則。