Java 中何時使用抽象類,何時使用介面?


一個 介面 可以用來定義契約行為,它也可以充當兩個系統之間互動的契約,而抽象類主要用於為子類定義預設行為,這意味著所有子類都應該執行相同的功能。

何時使用抽象類

  • 如果我們使用繼承的概念,那麼抽象類是一個不錯的選擇,因為它為派生類提供了一個通用的基類實現。
  • 如果我們想要宣告非公共成員,抽象類也是一個不錯的選擇。在介面中,所有方法都必須是公共的。
  • 如果我們希望將來新增新方法,那麼抽象類是更好的選擇。因為如果我們向介面新增新方法,那麼所有已實現該介面的類都必須更改以實現新方法。
  • 如果我們希望建立元件的多個版本,請建立抽象類。抽象類提供了一種簡單易行的方法來對我們的元件進行版本控制。透過更新基類,所有繼承類都會自動更新更改。另一方面,一旦建立了介面,就不能更改。如果需要介面的新版本,我們必須建立一個全新的介面。
  • 抽象類具有允許更好的向前相容性的優勢。一旦客戶端使用介面,我們就無法更改它;如果他們使用抽象類,我們仍然可以新增行為而不會破壞現有程式碼。
  • 如果我們希望在元件的所有實現中提供通用的已實現功能,請使用抽象類。抽象類允許我們部分實現我們的類,而介面不包含任何成員的實現。

示例

abstract class Car {
   public void accelerate() {
      System.out.println("Do something to accelerate");
   }
   public void applyBrakes() {
      System.out.println("Do something to apply brakes");
   }
   public abstract void changeGears();
}

現在,任何想要例項化的汽車都必須實現 changeGears() 方法。

class Alto extends Car {
   public void changeGears() {
      System.out.println("Implement changeGears() method for Alto Car");
   }
}
class Santro extends Car {
   public void changeGears() {
      System.out.println("Implement changeGears() method for Santro Car");
   }
}

何時使用介面

  • 如果我們建立的功能將對各種不同的物件有用,請使用介面。抽象類應該主要用於密切相關的物件,而介面最適合為不相關的類提供通用功能。
  • 當我們認為 API 在一段時間內不會發生變化時,介面是一個不錯的選擇。
  • 當我們想要擁有類似於多重繼承的東西時,介面也很好,因為我們可以實現多個介面。
  • 如果我們正在設計小的、簡潔的功能塊,請使用介面。如果我們正在設計大型功能單元,請使用抽象類。

示例

public interface Actor {
   void perform();
}
public interface Producer {
   void invest();
}

如今,大多數演員都足夠富有,可以製作自己的電影。如果我們使用介面而不是抽象類,我們可以同時實現演員製片人。此外,我們可以定義一個擴充套件這兩者的新的演員製片人介面。

public interface ActorProducer extends Actor, Producer{
   // some statements
}

更新於: 2023年9月2日

44K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告