首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 介面機制詳解(二):定義、實現、多實現組合與面向介面編程實戰

     編輯:Java 相關知識

介面本質:設計與實現分離的契約

介面定義「做什麼」,不限定「怎麼做」。類似 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); }
}

實現介面:implements 關鍵字

[修飾符] 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() { ... }
    
    // 類自己的字段、構造器、方法...
}

多實現組合示例:USB 設備體系

// 介面定義
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);

介面繼承介面:extends 多重繼承

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() { }
}

面向介面編程 (OOP → OOIP) 核心優勢

  1. 解耦:高層模塊依賴抽象介面,不依賴具體實現(依賴倒置原則 DIP)。
  2. 可替換性:運行期動態切換實現(插件、策略模式、JDBC 驅動)。
  3. 可測試性:單元測試易於 Mock 介面(Mockito: when(mock.read()).thenReturn(data))。
  4. 多實現共存:同一介面多種實現並存(List → ArrayList/LinkedList)。
  5. 契約優先開發:團隊並行開發,先定介面,再分頭實現。

經典案例:JDBC 驅動模型

// 標準介面 (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");

介面 vs 抽象類:補充對比

場景選介面選抽象類
已有父類✓ (單繼承限制)✗
需共享字段/構造器✗✓
需 protected/private 方法✗ (JDK 9 前)✓
定義能力/標記✓ (Serializable, Cloneable)✗
提供骨架默認實現✓ (default, JDK 8+)✓ (模板方法)
二進制兼容演進✓ (default 不破壞實現類)✓ (新增非抽象方法安全)

常見陷阱與規範

  • 常量污染:實現類繼承介面常量,implements Constants 會將常量引入類命名空間,不推薦,改用 final class Constants。
  • 默認方法衝突:多介面同名 default 方法 → 實現類必須顯式覆寫並指定 InterfaceA.super.method()。
  • 函數式介面退化:@FunctionalInterface 保證單抽象方法,誤加第二個抽象方法編譯報錯。
  • 介面膨脹:單一職責,拆分細粒度介面(ISP 原則),避免「上帝介面」。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved