介面定義「做什麼」,不限定「怎麼做」。類似 USB 標準:規定 4 针腳定義(電源、數據±、地),不限定設備內部實現(滑鼠、鍵盤、風扇、U盤)。實現類只要符合契約即可互換,極大降低耦合。
[修飾符] interface InterfaceName [extends Parent1, Parent2...] {
// 常量:隱式 public static final
int MAX_SIZE = 100; // 等價 public static final int MAX_SIZE = 100;
String DEFAULT_ENCODING = "UTF-8";
// 抽象方法:隱式 public abstract
void connect(); // 等價 public abstract void connect();
String readData(int length);
boolean writeData(byte[] data);
// JDK 8+ default 方法(有實現,可被覆寫)
default void close() {
System.out.println("Default close");
}
// JDK 8+ static 方法(屬於介面,不可覆寫)
static InterfaceName createDefault() {
return new DefaultImpl();
}
// JDK 9+ private 方法(default 間共享邏輯)
private void log(String msg) { System.out.println(msg); }
}
[修飾符] class ClassName [extends SuperClass] implements Interface1, Interface2... {
// 必須實現所有抽象方法(除非類聲明 abstract)
@Override public void connect() { ... }
@Override public String readData(int len) { ... }
@Override public boolean writeData(byte[] data) { ... }
// 可選覆寫 default 方法
@Override public void close() { ... }
// 類自己的字段、構造器、方法...
}
// 介面定義
public interface USB {
int VOLTAGE = 5; // 常量
byte[] readData();
void writeData(byte[] data);
}
// 實現類 1:電腦
public class Computer implements USB {
private int memorySize;
@Override public byte[] readData() {
// 從內存讀取邏輯
return new byte[0];
}
@Override public void writeData(byte[] data) {
// 寫入內存邏輯
}
}
// 實現類 2:數碼相機
public class DigitalCamera implements USB {
private String vendorName;
@Override public byte[] readData() {
// 從 SD 卡讀取邏輯
return new byte[0];
}
@Override public void writeData(byte[] data) {
// 寫入 SD 卡邏輯
}
}
// 使用:面向介面編程
public class USBPort {
public void transfer(USB device1, USB device2, int length) {
byte[] data = device1.readData();
device2.writeData(data);
}
}
// 任意 USB 設備組合均可工作
new USBPort().transfer(new Computer(), new DigitalCamera(), 1024);
interface A { void a(); }
interface B { void b(); }
interface C extends A, B { void c(); } // C 擁有 a(), b(), c()
class Impl implements C {
public void a() { }
public void b() { }
public void c() { }
}
when(mock.read()).thenReturn(data))。List → ArrayList/LinkedList)。// 標準介面 (java.sql)
public interface Driver { Connection connect(String url, Properties info); }
public interface Connection { Statement createStatement(); void close(); }
public interface Statement { ResultSet executeQuery(String sql); }
// MySQL 實現
public class MySQLDriver implements Driver { ... }
public class MySQLConnection implements Connection { ... }
// PostgreSQL 實現
public class PGDriver implements Driver { ... }
// 應用代碼零修改切換數據庫
String url = "jdbc:mysql://localhost:3306/db"; // 或 postgresql://...
Connection conn = DriverManager.getConnection(url, "user", "pwd");
| 場景 | 選介面 | 選抽象類 |
|---|---|---|
| 已有父類 | ✓ (單繼承限制) | ✗ |
| 需共享字段/構造器 | ✗ | ✓ |
| 需 protected/private 方法 | ✗ (JDK 9 前) | ✓ |
| 定義能力/標記 | ✓ (Serializable, Cloneable) | ✗ |
| 提供骨架默認實現 | ✓ (default, JDK 8+) | ✓ (模板方法) |
| 二進制兼容演進 | ✓ (default 不破壞實現類) | ✓ (新增非抽象方法安全) |
implements Constants 會將常量引入類命名空間,不推薦,改用 final class Constants。InterfaceA.super.method()。