搜尋
首頁Javajava教程抽象:解碼 Java 中的接口

Abstraction: Decoding Interfaces in Java

在 Java 中,介面充當類別必須遵守的契約。由於介面僅提供可以做什麼的知識(透過方法簽署)並且隱藏它是如何完成的(透過將實作留給那些實作介面),它實現了抽象什麼如何的分離是抽象背後的核心思想。

在Java 8 中,介面的發展超越了純粹的抽象行為,支援預設靜態 方法來提高靈活性和向後相容性

這篇文章深入探討了介面、它們的主要特性以及介面和抽象類別之間的區別,並透過程式碼範例來幫助您掌握概念。


什麼是介面?

Java 中的介面指定實作類別必須遵循的一組行為(方法)。它只包含方法簽章常數。與抽象類別相比,介面透過使一個類別能夠實現多個介面來允許多重繼承

介面的主要特點:

  • 介面中的變數隱式是公共的、靜態的、最終的。

  • 所有方法都是隱式公有和抽象的(Java 8 之前)。

  • 一個類別可以實作多個介面,克服類別的單一繼承限制。

  • Java 8開始,介面還可以包含預設方法和靜態方法,增強向後相容性。


基礎:介面語法

package oops.interfaces;

public interface InterfaceBasics {

    // Variables are public, static, and final by default
    // Initialization can only be done with declaration (No Static Blocks)
    // Compiler Interpretation: public static final int id = 90;
    int id = 90;

    // Abstract method (public and abstract by default)
    // Compiler Interpretation: public abstract void abstractMethod();
    void abstractMethod();

    // Default method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public default void concreteMethod()
    default void concreteMethod() {
        System.out.println("Concrete Method Called");
    }

    // Static method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public static void staticMethod()
    static void staticMethod() {
        System.out.println("Static Method Called");
    }
}

關鍵概念解釋:

1。介面中的變數:

  • public:任何實作該介面的類別都可以存取。
  • static:可以直接使用介面名稱存取。
  • Final:一旦初始化就防止值被修改,以確保一致性。

注意:靜態最終變數可以在宣告時或在靜態區塊內初始化。但是,由於介面不允許靜態區塊,因此這些變數必須在聲明期間初始化

2。抽象方法:

  • 這些是方法簽章,沒有任何主體或實作。
  • 它們在介面中預設是公開的
  • 所有抽象方法必須由實作類別重寫

3。預設方法:

  • Java 8中引入,為介面中的方法提供預設實作
  • 這些方法預設是公共的
  • 實作類別可以覆蓋它們,但它不是強制性的
  • 這裡,「預設」不是存取修飾符;它只是表明該方法不是抽象的並且可以有具體的實現。
  • 此功能可協助開發人員擴充現有介面,而不會破壞向後相容性

4。靜態方法:

  • 靜態方法屬於介面
  • 只能使用介面名稱存取它們。
  • 這些方法預設是公共的
  • 它們不透過實作類別繼承
  • 靜態方法不能被覆蓋

用 Java 實作介面

package oops.interfaces;

public interface InterfaceBasics {

    // Variables are public, static, and final by default
    // Initialization can only be done with declaration (No Static Blocks)
    // Compiler Interpretation: public static final int id = 90;
    int id = 90;

    // Abstract method (public and abstract by default)
    // Compiler Interpretation: public abstract void abstractMethod();
    void abstractMethod();

    // Default method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public default void concreteMethod()
    default void concreteMethod() {
        System.out.println("Concrete Method Called");
    }

    // Static method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public static void staticMethod()
    static void staticMethod() {
        System.out.println("Static Method Called");
    }
}

關鍵概念解釋:

  1. 方法存取:
    使用類別實例 obj 存取預設方法 (concreteMethod()) 和重寫方法 (abstractMethod()),示範如何呼叫這兩種類型的方法。

  2. 存取介面變數:
    可以使用介面名稱 (InterfaceBasics.id) 和實作類別名稱 (InterfaceBasicsImpl.id) 來存取介面變數 id。這表示介面中的靜態最終變數是繼承的,允許實作類別引用該變數。

  3. 靜態方法存取:
    靜態方法 staticMethod() 只能使用介面名稱 (InterfaceBasics.staticMethod()) 來呼叫。嘗試透過實作類別 (InterfaceBasicsImpl.staticMethod()) 存取它會導致編譯時錯誤,因為介面中的靜態方法不是繼承的。


為什麼要使用預設方法和靜態方法?

1. 預設方法

  • 在 Java 8 之前,向介面新增方法帶來了重大挑戰。任何新功能都需要更新所有實作類別,這通常會導致大型程式碼庫發生重大變更。
  • 透過引入預設方法,介面現在可以為新方法提供具體實作,確保向後相容性。這意味著現有類別可以保持不變,同時仍受益於新功能。
  • 這種設計選擇也為將流和 lambda 功能添加到集合框架鋪平了道路。

2. 靜態方法

  • 靜態方法提供與介面相關的實用函數,不需要透過實作類別來覆寫。
  • 透過將靜態方法綁定到介面本身並防止繼承,Java 避免了多個介面之間的方法名稱衝突可能引起的潛在歧義和混亂,通常稱為鑽石問題
  • 範例用例: 這是一個具有用於日誌記錄配置的靜態方法的介面的實際用例:
package oops.interfaces;

public interface InterfaceBasics {

    // Variables are public, static, and final by default
    // Initialization can only be done with declaration (No Static Blocks)
    // Compiler Interpretation: public static final int id = 90;
    int id = 90;

    // Abstract method (public and abstract by default)
    // Compiler Interpretation: public abstract void abstractMethod();
    void abstractMethod();

    // Default method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public default void concreteMethod()
    default void concreteMethod() {
        System.out.println("Concrete Method Called");
    }

    // Static method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public static void staticMethod()
    static void staticMethod() {
        System.out.println("Static Method Called");
    }
}
  • 在此範例中,靜態方法 getDefaultLogFileName() 提供了一種擷取預設日誌檔案名稱的方法,同時保持實作簡潔並封裝在介面內。

介面與抽象類別有何不同?

即使使用預設方法,介面仍然與抽象類別不同:

Aspect Interface Abstract Class
Methods Can have abstract, default, and static methods Can have abstract and non-abstract methods
Variables Only public, static, and final variables Can have any access modifier and instance variables
Inheritance Supports multiple inheritance Supports single inheritance
Constructors Cannot have constructors Can have constructors
方面 介面 抽象類別 標題> 方法 可以有抽象、預設和靜態方法 可以有抽象和非抽象方法 變數 僅限公用、靜態和最終變數 可以有任何存取修飾符和實例變數 繼承 支援多重繼承 支援單一繼承 建構子 不能有建構子 可以有建構子 表>

預設方法應該僅用於擴充現有介面需要向後相容的地方。它們不能取代抽象類別。


有關介面的常見面試問題

1。介面變數可以修改嗎?

不,介面變數是隱式最終變量,這意味著它們的值一旦分配就不能更改。

package oops.interfaces;

public interface InterfaceBasics {

    // Variables are public, static, and final by default
    // Initialization can only be done with declaration (No Static Blocks)
    // Compiler Interpretation: public static final int id = 90;
    int id = 90;

    // Abstract method (public and abstract by default)
    // Compiler Interpretation: public abstract void abstractMethod();
    void abstractMethod();

    // Default method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public default void concreteMethod()
    default void concreteMethod() {
        System.out.println("Concrete Method Called");
    }

    // Static method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public static void staticMethod()
    static void staticMethod() {
        System.out.println("Static Method Called");
    }
}

2。我們可以宣告一個預設方法和靜態方法嗎?

預設方法提供了可以透過實現類別覆蓋的具體實現,從而實現靈活性。相反,靜態方法屬於介面本身,不能被重寫,並提供實用功能。因此,兩者不能一起使用。

package oops.interfaces;

// A class implementing the InterfaceBasics interface
public class InterfaceBasicsImpl implements InterfaceBasics {

    // Mandatory: Override all abstract methods from the interface
    @Override
    public void abstractMethod() {
        System.out.println("Overridden Method Called");
    }

    public static void main(String[] args) {
        InterfaceBasics obj = new InterfaceBasicsImpl();

        // Calling interface's default and overridden methods
        obj.concreteMethod();  // Output: Default Method Called
        obj.abstractMethod();  // Output: Overridden Method Called

        // Accessing interface variables (static and final by default)
        // Interface variables are inherited
        // Possible with both interface name and implementing class name
        System.out.println(InterfaceBasics.id);        // Output: 90
        System.out.println(InterfaceBasicsImpl.id);    // Output: 90

        // Cannot assign a value to final variable 'id'
        InterfaceBasicsImpl.id = 100;  // --> Compile Error

        // Calling static method using interface name
        // Cannot access using implementing class name
        // Interface static methods are NOT inherited
        InterfaceBasics.staticMethod();  // Output: Static Method Called
    }
}

3。為什麼介面中的靜態方法不能被繼承?

靜態方法與介面本身相關聯,而不是與類別的任何特定實例相關聯,這意味著它們屬於整個介面。如果透過實作類別繼承靜態方法,則可能會導致呼叫哪個方法的歧義和混亂,特別是如果多個介面定義具有相同名稱的方法

例如:

package oops.interfaces.example;

public interface Logger {

    // Using a variable to store the default log file name
    String DEFAULT_LOG_FILE_NAME = "application.log";

    // Static method to get the default log file name with configuration
    static String getDefaultLogFileName() {
        // Simulating configuration retrieval
        // Could be from a properties file or environment variable
        String logFileName = System.getenv("LOG_FILE_NAME");

        // If a log file name is set in the environment, return it;
        // Otherwise, return the default
        if (logFileName != null && !logFileName.isEmpty()) {
            return logFileName;
        } else {
            return DEFAULT_LOG_FILE_NAME;
        }
    }
}

public class FileLogger implements Logger {

    public static void main(String[] args) {
        // Using the interface variable
        String defaultLogFile = Logger.DEFAULT_LOG_FILE_NAME;

        // Using the static method
        if ("FILE".equals(System.getenv("LOG_TYPE"))) {
            defaultLogFile = Logger.getDefaultLogFileName();
        }

        System.out.println("Log file used: " + defaultLogFile);
    }
}

透過將靜態方法僅綁定到接口,Java 保持了清晰度並避免了方法解析中的潛在衝突,從而導致了臭名昭著的多重繼承鑽石問題


結論

Java 中的介面透過定義實作類別必須遵守的行為,在實作抽象方面發揮著至關重要的作用。隨著 Java 8 中 default靜態方法 的引入,介面變得更加強大,允許向後相容並直接在介面內提供實用方法。

但是,介面並不能取代抽象類別。當您需要為行為定義契約時,尤其是當需要多重繼承時,應該使用它們。


重點:

  • 介面透過定義類別應該做什麼來提供抽象,而不指定如何做。

  • 介面中的
  • 變數總是公共的、靜態的和最終的。

  • 預設方法和靜態方法,在 Java 8 中引入,允許介面內的向後相容性和實用程式實作。

  • 介面中的靜態方法不會被繼承,確保其用法清晰。

了解如何以及何時使用介面不僅可以提高您的編碼技能,還可以幫助您為圍繞OOP 概念Java 設計模式面試問題做好準備。


相關貼文

  • Java 基礎

  • 陣列面試重點

  • Java 記憶體基礎

  • Java 關鍵字要點

  • 集合架構重點

編碼快樂!

以上是抽象:解碼 Java 中的接口的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

如何在Java中實施功能編程技術?如何在Java中實施功能編程技術?Mar 11, 2025 pm 05:51 PM

本文使用lambda表達式,流API,方法參考和可選探索將功能編程集成到Java中。 它突出顯示了通過簡潔性和不變性改善代碼可讀性和可維護性等好處

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何將Java的Nio(新輸入/輸出)API用於非阻滯I/O?如何將Java的Nio(新輸入/輸出)API用於非阻滯I/O?Mar 11, 2025 pm 05:51 PM

本文使用選擇器和頻道使用單個線程有效地處理多個連接的Java的NIO API,用於非阻滯I/O。 它詳細介紹了過程,好處(可伸縮性,性能)和潛在的陷阱(複雜性,

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用Java的插座API進行網絡通信?如何使用Java的插座API進行網絡通信?Mar 11, 2025 pm 05:53 PM

本文詳細介紹了用於網絡通信的Java的套接字API,涵蓋了客戶服務器設置,數據處理和關鍵考慮因素,例如資源管理,錯誤處理和安全性。 它還探索了性能優化技術,我

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具