多維度分析:抽象類和接口的區(qū)別

【編者按】本文作者是Sebastian Malaca沼溜,是面向?qū)ο缶幊痰目駸嵴叱碧荩粩嗌罨芯空麧嵈a和高代碼質(zhì)量骗灶。本文中,作者通過多個(gè)方面深入剖析抽象類和接口的區(qū)別秉馏,并結(jié)合經(jīng)驗(yàn)供讀者借鑒學(xué)習(xí)耙旦,本文系OneAPM工程師編譯整理。

在開發(fā)人員崗位面試時(shí)萝究,是否了解抽象類和接口之間的基本區(qū)別是一個(gè)很重要的考量因素免都。

顯而易見锉罐?

完全不是。筆者面試過很多人绕娘,通常問的第一個(gè)問題是關(guān)于接口和抽象類的區(qū)別脓规。但實(shí)際上很少有程序員能給出正確的答案。

就這個(gè)問題來說险领,初級程序員可能都會清楚之間的區(qū)別抖拦,可能也并不一定理解其背后的原因,但其結(jié)構(gòu)上的差異舷暮,特別是針對特定語言(幾乎和所有的面向?qū)ο蟮恼Z言一樣)應(yīng)該深入了解。

同時(shí)噩茄,筆者也發(fā)現(xiàn)其他職位候選人(有時(shí)甚至是高級職位)竟然也不知道這之間的差異下面,或者只知道的一個(gè)或幾個(gè)。

如果只是需要了解這些內(nèi)容那并不難绩聘,但這些都是面向?qū)ο蟮幕A(chǔ)知識沥割,因此想要設(shè)計(jì)良好的代碼必須對其有一個(gè)深入的認(rèn)識。

下面將詳細(xì)介紹這些基礎(chǔ)知識凿菩。

繼承

下面將從眾所周知的接口和抽象類的區(qū)別開始机杜。這種差異是關(guān)于繼承的,任何類都可以實(shí)現(xiàn)多個(gè)接口衅谷,但是只能擴(kuò)展一個(gè)類椒拗,也只能有一個(gè)父類。

多個(gè)類擴(kuò)展是一個(gè)語言特性获黔,它存在于一些面向?qū)ο蟮恼Z言蚀苛。為什么呢?因?yàn)樗鼛淼膯栴}往往多于價(jià)值玷氏。

當(dāng)一個(gè)類有許多父類時(shí)堵未,有一個(gè)情況就是完全相同的方法會聲明多個(gè),因此必須顯式地「告知」究竟需要的是哪一個(gè)盏触。

這樣的代碼通常難以維護(hù)渗蟹,因?yàn)閷ζ溥M(jìn)行的任何修改或者重構(gòu)都必須小心地檢查。另一方面赞辩,如果一個(gè)類需要擴(kuò)展(至少)兩個(gè)擁有相同方法的類雌芽,那么 DRY 規(guī)則顯然會被破壞(因此需要從別處下手),或者說會干擾到 Single Responsibility Principle (SAP)诗宣。

「如果多個(gè)類的繼承如此糟糕膘怕,為什么它可以實(shí)現(xiàn)許多接口呢?」——如果這樣的問題在你的腦海盤旋召庞,我不得不承認(rèn)這是一個(gè)絕妙的問題岛心。

然而来破,答案很簡單。每一個(gè)接口都是基于函數(shù)而不是一個(gè)類去實(shí)現(xiàn)忘古。所以徘禁,即使實(shí)現(xiàn)十個(gè)不同的接口,每個(gè)包含相同的方法聲明髓堪,內(nèi)部也不會發(fā)生沖突送朱。接口保證了方法的存在,而不是去說明方法的實(shí)現(xiàn)干旁,這意味著驶沼,只要不違反 SRP ,你完全可以實(shí)現(xiàn)多個(gè)接口争群。

方法的可見度

接口中的所有方法都是 Public 的回怜,但對于抽象類的聲明并沒有這樣的規(guī)則,當(dāng)然不能是 Private 换薄。為什么不能 Private玉雾?因?yàn)橐粋€(gè)抽象方法需要在子類中實(shí)現(xiàn),但 Private 無法訪問子類轻要,因此不抽象類不可能存在 Private 屬性复旬。

接著回歸主題。正如上文寫道的冲泥,接口是一個(gè)函數(shù)的保證驹碍,你可以把它當(dāng)作使用接口的類和實(shí)現(xiàn)這個(gè)接口的類之間的一個(gè)合約——保證一個(gè)特定類將實(shí)現(xiàn)所有聲明的方法。這也是為什么這些方法必須是 Public 的原因凡恍。因?yàn)楸粐?yán)格的限制到了實(shí)現(xiàn)上幸冻,所以其他一切都不成問題。

然而咳焚,當(dāng)涉及到抽象類時(shí)并非這樣洽损。我們總是可以有不同的類組,除了這幾方面基本上不同以外革半,其他地方幾乎一樣碑定,類體的公共方法也是非常相似的。在這種情況下又官,可以創(chuàng)建 Protected 方法來保持類之間的差異延刘。Template Method 就是一個(gè)很典型的例子。

聲明和定義

接口只能包含方法聲明六敬,而抽象類還可以包含方法的定義碘赖。

接口的重點(diǎn)在于提供特定函數(shù),而抽象類還在于子類實(shí)現(xiàn)的相似性,不僅僅是其中的函數(shù)普泡。

常量

接口和抽象類中都可以定義常量播掷。這是因?yàn)檫@些值不依賴于特定對象,對它們來說都是相同的撼班。

屬性

抽象類可以包含屬性歧匈,但接口卻不能。原因與聲明和定義是一樣的砰嘁。

總結(jié)

除了說明差異件炉,筆者也試圖解釋它產(chǎn)生的原因。這不僅是因?yàn)槿藗儼l(fā)明某個(gè)語言時(shí)的突發(fā)奇想矮湘,而是源于語言背后所支撐的理念斟冕。

原文鏈接:Differences Between Abstract Class and Interface

OneAPM 是應(yīng)用性能管理領(lǐng)域的新興領(lǐng)軍企業(yè),能幫助企業(yè)用戶和開發(fā)者輕松實(shí)現(xiàn):緩慢的程序代碼和 SQL 語句的實(shí)時(shí)抓取缅阳。想閱讀更多技術(shù)文章宫静,請?jiān)L問OneAPM 官方博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末券时,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伏伯,更是在濱河造成了極大的恐慌橘洞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件说搅,死亡現(xiàn)場離奇詭異炸枣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弄唧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門适肠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人候引,你說我怎么就攤上這事侯养。” “怎么了澄干?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵逛揩,是天一觀的道長。 經(jīng)常有香客問我麸俘,道長辩稽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任从媚,我火速辦了婚禮逞泄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己喷众,他們只是感情好各谚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侮腹,像睡著了一般嘲碧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上父阻,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天愈涩,我揣著相機(jī)與錄音,去河邊找鬼加矛。 笑死履婉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斟览。 我是一名探鬼主播毁腿,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苛茂!你這毒婦竟也來了已烤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤妓羊,失蹤者是張志新(化名)和其女友劉穎胯究,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躁绸,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裕循,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了净刮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剥哑。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淹父,靈堂內(nèi)的尸體忽然破棺而出株婴,到底是詐尸還是另有隱情,我是刑警寧澤暑认,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布督暂,位于F島的核電站,受9級特大地震影響穷吮,放射性物質(zhì)發(fā)生泄漏逻翁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一捡鱼、第九天 我趴在偏房一處隱蔽的房頂上張望八回。 院中可真熱鬧,春花似錦、人聲如沸缠诅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽管引。三九已至士败,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褥伴,已是汗流浹背谅将。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留重慢,地道東北人饥臂。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像似踱,于是被迫代替她去往敵國和親隅熙。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法核芽,類相關(guān)的語法囚戚,內(nèi)部類的語法,繼承相關(guān)的語法轧简,異常的語法驰坊,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)吉懊,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 先來看看抽象類和接口的定義: 抽象類(abstract class): 使用abstract修飾符修飾的類假勿。官方點(diǎn)...
    IT廢柴閱讀 53,780評論 7 45
  • 一個(gè)WordPress主題至少包含以下兩個(gè)文件: style.css index.php 好借嗽,現(xiàn)在就開始我們的Wo...
    弈梵說閱讀 898評論 0 0
  • 既然它是一灘死水, 那么請你转培, 不要隨便亂丟石頭恶导。 死寂的水面, ...
    孤羅閱讀 476評論 0 1