首頁 >Java >java教程 >抽象:抽象類別與接口

抽象:抽象類別與接口

Patricia Arquette
Patricia Arquette原創
2024-11-03 16:43:02325瀏覽

Abstraction: Abstract Class vs Interface

在Java 中設計軟體時,在抽象類別介面之間進行選擇會對靈活性、可維護性和可讀性產生很大影響。在這篇文章中,我們將探討它們的主要區別,何時使用其中一種,並查看實際範例來幫助您掌握這個概念。


抽象類別和介面之間的主要區別

功能 抽象類別 介面 標題>
Feature Abstract Class Interface
Purpose Achieves partial implementation Achieves complete abstraction
Method Implementations Can have both abstract and concrete methods All methods are abstract (except default/static methods in Java 8 )
Multiple Inheritance A class can extend only one abstract class A class can implement multiple interfaces
Fields/Variables Can have instance variables of any type All variables are implicitly public, static, and final
Constructors Can have constructors Cannot have constructors
Inheritance Support Can implement multiple interfaces Cannot extend an abstract class
Use Case Useful for sharing common code and state Useful for defining a contract across unrelated classes
目的 實作部分實作 實作完整抽象 方法實作 可以同時具有抽象方法和具體方法 所有方法都是抽象的(Java 8 中預設/靜態方法除外) 多重繼承 一個類別只能擴充一個抽象類別 一個類別可以實作多個介面 欄位/變數 可以有任何類型的實例變數 所有變數都是隱式的public、static 和final 建構子 可以有建構子 不能有建構子 繼承支持 可以實現多個介面 無法擴充抽象類別 用例 有助於分享通用程式碼和狀態 對於跨不相關的類別定義契約很有用 表>

何時使用抽象類別與介面?

在下列情況下使用抽象類別

  • 您需要在相關類別之間共享狀態或行為

    範例:員工可以使用通用的 getDetails() 方法擁有姓名和 ID 等字段,在其子類別 Manager 和 Lead 之間共用。

    abstract class Employee {
        String name;
        int id;
    
        Employee(String name, int id) {
            this.name = name;
            this.id = id;
        }
    
        // Concrete method shared among subclasses
        public void getDetails() {
            System.out.println(name + " (ID: " + id + ")");
        }
    
        // Abstract method to be implemented by subclasses
        abstract double getSalary();
    }
    
    class Manager extends Employee {
        Manager(String name, int id) {
            super(name, id);
        }
    
        @Override
        double getSalary() {
            return 75000;
        }
    }
    
  • 您想要定義子類別可以使用的欄位和建構子

  • 您需要提供子類別部分實作實用方法

在下列情況下使用介面

  • 您想要在不相關的類別之間定義共同行為

    範例:Car 和 Drone 都可以實現 Operaable 接口,因為它們共享 start() 方法,但屬於不相關的類別。

    interface Operable {
        void start();
        void stop();
    }
    
    class Car implements Operable {
        @Override
        public void start() {
            System.out.println("Car started.");
        }
    
        @Override
        public void stop() {
            System.out.println("Car stopped.");
        }
    }
    
    class Drone implements Operable {
        @Override
        public void start() {
            System.out.println("Drone started.");
        }
    
        @Override
        public void stop() {
            System.out.println("Drone stopped.");
        }
    }
    
  • 你需要多重繼承來組合不同的行為。例如,一個類別可以同時實作 Runnable 和 Serialized。

  • 您想要定義預設方法來新增功能而不破壞向後相容性。


訪談見解

常見面試問題:

  1. 為什麼介面不能有建構子?

    由於介面定義了純抽象,因此不需要建構子。只有包含一些實作的抽象類別需要建構函數來初始化狀態。

  2. 為什麼要使用抽象類別而不是介面?

    在以下情況下使用抽象類別:

    • 您需要在相關類別之間共用程式碼
    • 您想要定義狀態(欄位) 和建構子。
  3. 抽象類別可以實作介面嗎?

    是的!抽象類別可以實作一個或多個介面。他們甚至可以提供介面方法的預設實作。

  4. 可以在同一個類別中同時使用抽象類別和介面嗎?

    是的,一個類別可以擴充抽象類別實作多個介面。這允許靈活的設計模式和多重繼承。


總結

  • 當您需要部分實作以及跨相關類別共享狀態時,抽象類別是理想的選擇。它們允許使用公共字段、建構函數和實用方法。
  • 介面最適合完全抽象、多重繼承以及為不相關的類別定義常見行為。它們允許您使用預設方法發展您的程式碼庫,同時保持向後相容性。

透過掌握差異並知道何時使用它們,您將能夠更好地設計可擴展、可維護的軟體系統。


相關貼文

  • Java 基礎

  • 陣列面試重點

  • Java 記憶體基礎

  • Java 關鍵字要點

  • 集合架構重點

編碼快樂!

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn