在面向對象世界裡,「接口」不僅是語法關鍵字,更是抽象思維的核心工具。現實中我們認識事物,往往先關注「它能做什麼」(功能接口),而非「它怎麼做」(內部實現)。Java 的 interface 機制將這一思想落地:將「規範」與「實現」徹底分離,構建靈活可擴展的系統架構。
以「杯子」為例,定義其核心行為契約:
interface Cup {
void addWater(int amount); // 加水
void drinkWater(int amount); // 喝水
}
interface 特徵:
public abstract,無需(也不能)顯式聲明。public static final)。
具體類通過 implements 關鍵字承諾實現接口所有方法:
class MusicCup implements Cup {
private int water = 0;
@Override
public void addWater(int w) {
this.water += w;
}
@Override
public void drinkWater(int w) {
this.water = Math.max(0, this.water - w);
}
// 額外擴展:接口未規定的方法
public int waterContent() {
return water;
}
// 獨有功能:播放音樂
public void playMusic() {
System.out.println("♪♪♪");
}
}
關鍵規則:
abstract。
接口如同工業標準(如 USB、SQL、HTTP):
Cup 的類必有加水/喝水能力,否則編譯報錯。Cup 接口,不關心具體是 MusicCup、GlassCup 還是 ThermosCup。替換實現零修改消費端代碼。這正是「面向接口編程」的核心價值:依賴抽象,而非具體。
Java 類單繼承,但可實現多個接口,實現「行為混入」:
interface MusicPlayer {
void play();
}
class MusicCup implements Cup, MusicPlayer {
private int water = 0;
@Override public void addWater(int w) { water += w; }
@Override public void drinkWater(int w) { water = Math.max(0, water - w); }
@Override public void play() { System.out.println("La la la~"); }
}

一個對象可同時作為 Cup 與 MusicPlayer 使用,靈活組合業務能力,避免繼承層級爆炸。
JDK 8+ 允許接口定義 default 方法(提供默認實現,實現類可選覆寫)與 static 方法(工具方法),在不破壞現有實現類的前提下擴展接口功能,解決「接口擴展難」的歷史痛點。
接口是架構的骨架,實現是血肉。優秀的接口設計:單一職責、最小完備、穩定不變。讓變化發生在實現層,接口層成為系統穩定的錨點。