1.13 抽象类和接口的区别
接口是一種特殊的抽象類,接口和抽象類的淵源頗深,有很大的相似之處,所以在選擇使用誰的問題上很容易迷糊。
1)抽象類
在 Java 中,被關鍵字 abstract 修飾的類稱為抽象類;被 abstract 修飾的方法稱為抽象方法,抽象方法只有方法聲明沒有方法體。
抽象類有以下幾個特點:
- 抽象類不能被實例化,只能被繼承。
- 包含抽象方法的類一定是抽象類,但抽象類不一定包含抽象方法(抽象類可以包含普通方法)。
- 抽象方法的權限修飾符只能為 public、protected 或 default,默認情況下為 public。
- 一個類繼承于一個抽象類,則子類必須實現抽象類的抽象方法,如果子類沒有實現父類的抽象方法,那子類必須定義為抽象類。
- 抽象類可以包含屬性、方法、構造方法,但構造方法不能用來實例化對象,只能被子類調用。
2)接口
接口可以看成是一種特殊的類,只能用 interface 關鍵字修飾。
Java 中的接口具有以下幾個特點:
- 接口中可以包含變量和方法,變量被隱式指定為 public static final,方法被隱式指定為 public abstract(JDK 1.8 之前)。
- 接口支持多繼承,即一個接口可以繼承(extends)多個接口,間接解決了 Java 中類不能多繼承的問題。
- 一個類可以同時實現多個接口,一個類實現某個接口則必須實現該接口中的抽象方法,否則該類必須被定義為抽象類。
3)抽象類和接口的區別
相同特征
接口和抽象類很像,它們都具有如下特征。
- 接口和抽象類都不能被實例化,主要用于被其他類實現和繼承。
- 接口和抽象類都可以包含抽象方法,實現接口或繼承抽象類的普通子類都必須實現這些抽象方法。
不同特征
但接口和抽象類之間的差別非常大,這種差別主要體現在二者設計目的上。下面具體分析二者的差別。
接口作為系統與外界交互的窗口,接口體現的是一種規范。對于接口的實現者而言,接口規定了實現者必須向外提供哪些服務(以方法的形式來提供);對于接口的調用者而言,接口規定了調用者可以調用哪些服務,以及如何調用這些服務(就是如何來調用方法)。當在一個程序中使用接口時,接口是多個模塊間的耦合標準;當在多個應用程序之間使用接口時,接口是多個程序之間的通信標準。
從某種程度上來看,接口類似于整個系統的“總綱”,它制定了系統各模塊應該遵循的標準,因此一個系統中的接口不應該經常改變。一旦接口被改變,對整個系統甚至其他系統的影響將是輻射式的,會導致系統中大部分類都需要改寫。
抽象類則不一樣,抽象類作為系統中多個子類的共同父類,它所體現的是一種模板式設計。抽象類作為多個子類的抽象父類,可以被當成系統實現過程中的中間產品,這個中間產品已經實現了系統的部分功能(那些已經提供實現的方法),但這個產品依然不能當成最終產品,必須有更進一步的完善,這種完善可能有幾種不同方式。
除此之外,接口和抽象類在用法上也存在差別,如下表所示:
一個類最多只能有一個直接父類,包括抽象類,但一個類可以直接實現多個接口,通過實現多個接口可以彌補 Java 單繼承的不足。
4)抽象類和接口的應用場景
抽象類的應用場景:
接口的應用場景:
什么時候使用抽象類和接口:
- 如果擁有一些方法并且想讓它們有默認實現,則使用抽象類。
- 如果想實現多重繼承,那么必須使用接口。因為 Java 不支持多繼承,子類不能繼承多個類,但可以實現多個接口,因此可以使用接口。
- 如果基本功能在不斷改變,那么就需要使用抽象類。如果使用接口并不斷需要改變基本功能,那么就需要改變所有實現了該接口的類。
總結
以上是生活随笔為你收集整理的1.13 抽象类和接口的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.10 instanceof关键字
- 下一篇: 1.14 java内部类是什么鬼东西