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