Java接口和抽象類(lèi)的區(qū)別

類(lèi)是對(duì)象的模板,抽象類(lèi)和接口可以看做是具體的類(lèi)的模板均牢。

由于從某種角度講糠雨,接口是一種特殊的抽象類(lèi),它們的淵源頗深徘跪,有很大的相似之處甘邀,所以在選擇使用誰(shuí)的問(wèn)題上很容易迷糊。我們首先分析它們具有的相同點(diǎn)垮庐。
都代表類(lèi)樹(shù)形結(jié)構(gòu)的抽象層鹃答。在使用引用變量時(shí),盡量使用類(lèi)結(jié)構(gòu)的抽象層突硝,使方法的定義和實(shí)現(xiàn)分離测摔,這樣做對(duì)于代碼有松散耦合的好處。
都不能被實(shí)例化解恰。
都能包含抽象方法锋八。抽象方法用來(lái)描述系統(tǒng)提供哪些功能,而不必關(guān)心具體的實(shí)現(xiàn)护盈。

下面說(shuō)一下抽象類(lèi)和接口的主要區(qū)別挟纱。

  1. 抽象類(lèi)可以為部分方法提供實(shí)現(xiàn),避免了在子類(lèi)中重復(fù)實(shí)現(xiàn)這些方法腐宋,提高了代碼的可重用性紊服,這是抽象類(lèi)的優(yōu)勢(shì)檀轨;而接口中只能包含抽象方法,不能包含任何實(shí)現(xiàn)欺嗤。
public abstract class A{
    public abstract void method1();
    public void method2(){
        //A method2
    }
}
public class B extends A{
    public void method1(){
        //B method1
    }
}
public class C extends A{
    public void method1(){
        //C method1
    }
}

抽象類(lèi)A有兩個(gè)子類(lèi)B参萄、C,由于A中有方法method2的實(shí)現(xiàn)煎饼,子類(lèi)B讹挎、C中不需要重寫(xiě)method2方法,我們就說(shuō)A為子類(lèi)提供了公共的功能吆玖,或A約束了子類(lèi)的行為筒溃。method2就是代碼可重用的例子。A 并沒(méi)有定義 method1的實(shí)現(xiàn)沾乘,也就是說(shuō)B怜奖、C 可以根據(jù)自己的特點(diǎn)實(shí)現(xiàn)method1方法,這又體現(xiàn)了松散耦合的特性翅阵。

再換成接口看看:

public interface A{
    public void method1();
    public void method2();
}
public class B implements A{
    public void method1(){
        //B method1
    }
    public void method2(){
        //B method2
    }
}
public class C implements A{
    public void method1(){
        //C method1
    }
    public void method2(){
        //C method2
    }
}

接口A無(wú)法為實(shí)現(xiàn)類(lèi)B歪玲、C提供公共的功能,也就是說(shuō)A無(wú)法約束B(niǎo)怎顾、C的行為。B漱贱、C可以自由地發(fā)揮自己的特點(diǎn)現(xiàn)實(shí) method1和 method2方法槐雾,接口A毫無(wú)掌控能力。

  1. 一個(gè)類(lèi)只能繼承一個(gè)直接的父類(lèi)(可能是抽象類(lèi))幅狮,但一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口募强,這個(gè)就是接口的優(yōu)勢(shì)。
interface A{
    public void method2();
}
interface B{
    public void method1();
}
class C implements A,B{
    public void method1(){
        //C method1
    }
    public void method2(){
        //C method2
    }
}
//可以如此靈活的使用C崇摄,并且C還有機(jī)會(huì)進(jìn)行擴(kuò)展擎值,實(shí)現(xiàn)其他接口
A a=new C();
B b=new C();
abstract class A{
    public abstract void method1();
}
abstract class B extends A{
    public abstract void method2();
}
class C extends B{
    public void method1(){
        //C method1
    }
    public void method2() {
        //C method2
    }
}

對(duì)于C類(lèi),將沒(méi)有機(jī)會(huì)繼承其他父類(lèi)了逐抑。

綜上所述鸠儿,接口和抽象類(lèi)各有優(yōu)缺點(diǎn),在接口和抽象類(lèi)的選擇上厕氨,必須遵守這樣一個(gè)原則:
行為模型應(yīng)該總是通過(guò)接口而不是抽象類(lèi)定義进每,所以通常是優(yōu)先選用接口,盡量少用抽象類(lèi)命斧。
選擇抽象類(lèi)的時(shí)候通常是如下情況:需要定義子類(lèi)的行為田晚,又要為子類(lèi)提供通用的功能。

如果你現(xiàn)在也在學(xué)習(xí)java国葬,在入門(mén)學(xué)習(xí)java的過(guò)程當(dāng)中缺乏系統(tǒng)的學(xué)習(xí)教程贤徒,或者說(shuō)缺乏一個(gè)交流技術(shù)的地方芹壕,你可以申請(qǐng)加入我的Java學(xué)習(xí)交流qun:六四一,一二一接奈,九四八踢涌。里面還有我這幾年整理的java學(xué)習(xí)手冊(cè),面試題鲫趁,開(kāi)發(fā)工具斯嚎,PDF文檔教程,你可以自行去下載挨厚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末堡僻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疫剃,更是在濱河造成了極大的恐慌钉疫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巢价,死亡現(xiàn)場(chǎng)離奇詭異牲阁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)壤躲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)城菊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碉克,你說(shuō)我怎么就攤上這事凌唬。” “怎么了漏麦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵客税,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我撕贞,道長(zhǎng)更耻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任捏膨,我火速辦了婚禮秧均,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘号涯。我一直安慰自己熬北,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布诚隙。 她就那樣靜靜地躺著讶隐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪久又。 梳的紋絲不亂的頭發(fā)上巫延,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天效五,我揣著相機(jī)與錄音,去河邊找鬼炉峰。 笑死畏妖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疼阔。 我是一名探鬼主播戒劫,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼婆廊!你這毒婦竟也來(lái)了迅细?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淘邻,失蹤者是張志新(化名)和其女友劉穎茵典,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宾舅,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡统阿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筹我。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扶平。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔬蕊,靈堂內(nèi)的尸體忽然破棺而出结澄,到底是詐尸還是另有隱情,我是刑警寧澤袁串,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布概而,位于F島的核電站呼巷,受9級(jí)特大地震影響囱修,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜王悍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一破镰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧压储,春花似錦鲜漩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刮刑,卻和暖如春喉祭,著一層夾襖步出監(jiān)牢的瞬間养渴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工泛烙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留理卑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓蔽氨,卻偏偏與公主長(zhǎng)得像藐唠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹉究,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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

  • (1)語(yǔ)法層面上的區(qū)別 1.一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi)宇立,而一個(gè)類(lèi)卻可以實(shí)現(xiàn)多個(gè)接口。 2.抽象類(lèi)中的成員變量可以是各...
    A安慕c閱讀 791評(píng)論 0 3
  • 接口interface和抽象類(lèi)abstract class的概念不一樣坊饶。接口是對(duì)動(dòng)作的抽象泄伪,抽象類(lèi)是對(duì)根源的抽象。...
    BestFei閱讀 445評(píng)論 0 2
  • Java提供和支持創(chuàng)建抽象類(lèi)和接口匿级。 它們的實(shí)現(xiàn)有共同點(diǎn)蟋滴,不同點(diǎn)在于: 接口中所有的方法隱含的都是抽象的。而抽象類(lèi)...
    Hacker_Jp閱讀 253評(píng)論 0 0
  • 留在我身邊痘绎,遠(yuǎn)近都接受
    白茶與露閱讀 142評(píng)論 0 0
  • 因?yàn)榍迕鞴?jié)到了津函,所以,這幾天的天氣十分反常孤页。前幾天還是風(fēng)和日麗尔苦,晴空萬(wàn)里。這兩天便感覺(jué)一下子回到了冬天行施,難道是傳說(shuō)...
    東方敏兒閱讀 168評(píng)論 0 5