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 }
廣告