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

Java 入門教學 (16):介面 - 突破單一繼承限制的關鍵機制

     編輯:Java 相關知識

從「飛行器」例子理解介面必要性

假設遊戲有三種飛行器:Plane、Bird、SpiderMan。它們都要會 takeoff()、fly()、land()。

若用抽象類 Flyer:

public abstract class Flyer {
    public abstract void takeoff();
    public abstract void fly();
    public abstract void land();
}

SpiderMan 已經繼承 SuperMan,Java 單一繼承 限制導致無法同時 extends Flyer。這時介面登場:

public interface Flyer {
    void takeoff();
    void fly();
    void land();
}

public class SpiderMan extends SuperMan implements Flyer {
    @Override public void takeoff() { /* 射蛛絲起飛 */ }
    @Override public void fly() { /* 蛛絲擺盪 */ }
    @Override public void land() { /* 落地滾動 */ }
}

SpiderMan 同時擁有 SuperMan 能力與 Flyer 契約,完美解決單一繼承痛點。

介面四大核心特性

  1. 全抽象方法 (Java 7 前):介面方法預設 public abstract,不可有方法主體。
  2. 常數欄位:介面欄位預設 public static final,只能定義常數。
  3. 多實作:class A implements B, C, D,一個類別可實作多個介面。
  4. 介面繼承介面:interface C extends A, B,介面間可多重繼承 (因皆為抽象,無鑽石繼承問題)。

Java 8+ 介面新能力:預設方法與靜態方法

public interface Flyer {
    void takeoff();
    void fly();
    void land();

    // 預設方法:提供預設實作,實作類可選擇覆寫
    default void hover() {
        System.out.println("懸停中...");
    }

    // 靜態方法:屬於介面本身,不可被覆寫,常用工具方法
    static String getFlyerType(Class clazz) {
        return clazz.getSimpleName() + " 是飛行器";
    }
}
  • default 讓介面演進不破壞既有實作類。
  • static 替代過去的 Utils 類別,將輔助方法直接放在介面。

介面 vs 抽象類:選型決策表

場景選擇理由
定義「是一種」核心身分,需共享狀態/建構子抽象類可有 instance field、建構子、非 public 方法
定義「具備某能力」、多類別跨層級共用介面可多實作、無狀態、Java 8+ 可提供預設行為
需要序列化、遠端呼叫 (RMI/WebService)介面介面可直接 extends Serializable
API 公開給第三方實作介面介面約束更鬆散,利於 SPI 機制

實作介面的強制規則

  1. 實作類必須覆寫介面所有 非 default 方法。
  2. 覆寫方法的存取權限 不能比介面更嚴格 (介面預設 public,實作必須 public)。
  3. 若不想全部實作,類別必須宣告 abstract。

實戰範例:可比較、可序列化、可複製

public class Product implements Comparable, Serializable, Cloneable {
    private Long id;
    private String name;
    private BigDecimal price;

    @Override public int compareTo(Product o) { return this.id.compareTo(o.id); }
    @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }
    // Serializable 無需實作方法,標記介面即可
}

總結

  • 介面是「契約」,定義能做什麼,不關心怎麼做。
  • 突破單一繼承,讓類別同時擁有多重身分。
  • Java 8 default/static 方法讓介面可演進、可攜帶工具邏輯。
  • 設計原則:面向介面程式設計,變數宣告用介面型別 List<T> list = new ArrayList<>(),降低耦合。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved