抽象類和接口區(qū)別

抽象類與接口是java語言中對抽象概念進行定義的兩種機制骆膝,正是由于他們的存在才賦予java強大的面向?qū)ο蟮哪芰β椤K麄儍烧咧g對抽象概念的支持有很大的相似浴井,甚至可以互換久脯,但是也有區(qū)別纳胧。

一、抽象類

?????? 我們都知道在面向?qū)ο蟮念I(lǐng)域一切都是對象帘撰,同時所有的對象都是通過類來描述的跑慕,但是并不是所有的類都是來描述對象的。如果一個類沒有足夠的信息來描述一個具體的對象骡和,而需要其他具體的類來支撐它相赁,那么這樣的類我們稱它為抽象類。比如new Animal()慰于,我們都知道這個是產(chǎn)生一個動物Animal對象钮科,但是這個Animal具體長成什么樣子我們并不知道,它沒有一個具體動物的概念婆赠,所以他就是一個抽象類绵脯,需要一個具體的動物佳励,如狗、貓來對它進行特定的描述蛆挫,我們才知道它長成啥樣赃承。

??????在面向?qū)ο箢I(lǐng)域由于抽象的概念在問題領(lǐng)域沒有對應(yīng)的具體概念,所以用以表征抽象概念的抽象類是不能實例化的悴侵。

??????同時瞧剖,抽象類體現(xiàn)了數(shù)據(jù)抽象的思想,是實現(xiàn)多態(tài)的一種機制可免。它定義了一組抽象的方法抓于,至于這組抽象方法的具體表現(xiàn)形式有派生類來實現(xiàn)。同時抽象類提供了繼承的概念浇借,它的出發(fā)點就是為了繼承捉撮,否則它沒有存在的任何意義。所以說定義的抽象類一定是用來繼承的妇垢,同時在一個以抽象類為節(jié)點的繼承關(guān)系等級鏈中巾遭,葉子節(jié)點一定是具體的實現(xiàn)類。(不知這樣理解是否有錯!!!高手指點….)

??????在使用抽象類時需要注意幾點:

?????????1闯估、抽象類不能被實例化灼舍,實例化的工作應(yīng)該交由它的子類來完成,它只需要有一個引用即可睬愤。

?????????2片仿、抽象方法必須由子類來進行重寫。

?????????3尤辱、只要包含一個抽象方法的抽象類砂豌,該方法必須要定義成抽象類,不管是否還包含有其他方法光督。

?????????4阳距、抽象類中可以包含具體的方法,當然也可以不包含抽象方法结借。

?????????5筐摘、子類中的抽象方法不能與父類的抽象方法同名。

?????????6船老、abstract不能與final并列修飾同一個類咖熟。

?????????7、abstract 不能與private柳畔、static馍管、final或native并列修飾同一個方法。薪韩、

??????實例:

??????定義一個抽象動物類Animal确沸,提供抽象方法叫cry()捌锭,貓、狗都是動物類的子類罗捎,由于cry()為抽象方法观谦,所以Cat、Dog必須要實現(xiàn)cry()方法桨菜。如下:

public abstract class Animal {

? ? public abstract void cry();

}

public class Cat extends Animal{

? ? @Override

? ? public void cry() {

? ? ? ? System.out.println("貓叫:喵喵...");

? ? }

}

public class Dog extends Animal{

? ? @Override

? ? public void cry() {

? ? ? ? System.out.println("狗叫:汪汪...");

? ? }

}

public class Test {

? ? public static void main(String[] args) {

? ? ? ? Animal a1 = new Cat();

? ? ? ? Animal a2 = new Dog();


? ? ? ? a1.cry();

? ? ? ? a2.cry();

? ? }

}

?創(chuàng)建抽象類和抽象方法非常有用,因為他們可以使類的抽象性明確起來,并告訴用戶和編譯器打算怎樣使用他們.抽象類還是有用的重構(gòu)器,因為它們使我們可以很容易地將公共方法沿著繼承層次結(jié)構(gòu)向上移動豁状。(From:Think in java )

?二、接口

??????接口是一種比抽象類更加抽象的“類”倒得。這里給“類”加引號是我找不到更好的詞來表示替蔬,但是我們要明確一點就是,接口本身就不是類屎暇,從我們不能實例化一個接口就可以看出。如new Runnable();肯定是錯誤的驻粟,我們只能new它的實現(xiàn)類根悼。

??????接口是用來建立類與類之間的協(xié)議,它所提供的只是一種形式蜀撑,而沒有具體的實現(xiàn)挤巡。同時實現(xiàn)該接口的實現(xiàn)類必須要實現(xiàn)該接口的所有方法,通過使用implements關(guān)鍵字酷麦,他表示該類在遵循某個或某組特定的接口矿卑,同時也表示著“interface只是它的外貌,但是現(xiàn)在需要聲明它是如何工作的”沃饶。

??????接口是抽象類的延伸母廷,java了保證數(shù)據(jù)安全是不能多重繼承的,也就是說繼承只能存在一個父類糊肤,但是接口不同琴昆,一個類可以同時實現(xiàn)多個接口,不管這些接口之間有沒有關(guān)系馆揉,所以接口彌補了抽象類不能多重繼承的缺陷业舍,但是推薦繼承和接口共同使用,因為這樣既可以保證數(shù)據(jù)安全性又可以實現(xiàn)多重繼承升酣。

??????在使用接口過程中需要注意如下幾個問題:

?????????1舷暮、個Interface的方所有法訪問權(quán)限自動被聲明為public。確切的說只能為public噩茄,當然你可以顯示的聲明為protected下面、private,但是編譯會出錯巢墅!

?????????2诸狭、接口中可以定義“成員變量”券膀,或者說是不可變的常量,因為接口中的“成員變量”會自動變?yōu)闉閜ublic static final驯遇∏郾颍可以通過類命名直接訪問:ImplementClass.name。

?????????3叉庐、接口中不存在實現(xiàn)的方法舒帮。

???? ??? 4、實現(xiàn)接口的非抽象類必須要實現(xiàn)該接口的所有方法陡叠。抽象類可以不用實現(xiàn)玩郊。

????? ? ?5、不能使用new操作符實例化一個接口枉阵,但可以聲明一個接口變量译红,該變量必須引用(refer to)一個實現(xiàn)該接口的類的對象⌒肆铮可以使用 instanceof 檢查一個對象是否實現(xiàn)了某個特定的接口侦厚。例如:if(anObject instanceof Comparable){}。

????? ? ?6拙徽、在實現(xiàn)多接口的時候一定要避免方法名的重復刨沦。

三、抽象類與接口的區(qū)別

??????盡管抽象類和接口之間存在較大的相同點膘怕,甚至有時候還可以互換想诅,但這樣并不能彌補他們之間的差異之處。下面將從語法層次和設(shè)計層次兩個方面對抽象類和接口進行闡述岛心。

?3.1語法層次

??????在語法層次来破,java語言對于抽象類和接口分別給出了不同的定義。下面已Demo類來說明他們之間的不同之處忘古。

??????使用抽象類來實現(xiàn):

public abstract class Demo {

? ? abstract void method1();

?????void method2(){

? ? ? ? //實現(xiàn)

? ? }

}

?使用接口來實現(xiàn)

interface Demo {

? ? void method1();

? ? void method2();

}

抽象類方式中讳癌,抽象類可以擁有任意范圍的成員數(shù)據(jù),同時也可以擁有自己的非抽象方法存皂,但是接口方式中晌坤,它僅能夠有靜態(tài)、不能修改的成員數(shù)據(jù)(但是我們一般是不會在接口中使用成員數(shù)據(jù))旦袋,同時它所有的方法都必須是抽象的骤菠。在某種程度上來說,接口是抽象類的特殊化疤孕。

??????對子類而言商乎,它只能繼承一個抽象類(這是java為了數(shù)據(jù)安全而考慮的),但是卻可以實現(xiàn)多個接口祭阀。

3.2設(shè)計層次

??????上面只是從語法層次和編程角度來區(qū)分它們之間的關(guān)系鹉戚,這些都是低層次的鲜戒,要真正使用好抽象類和接口,我們就必須要從較高層次來區(qū)分了抹凳。只有從設(shè)計理念的角度才能看出它們的本質(zhì)所在遏餐。一般來說他們存在如下三個不同點:

??????1、 抽象層次不同赢底。抽象類是對類抽象失都,而接口是對行為的抽象。抽象類是對整個類整體進行抽象幸冻,包括屬性粹庞、行為,但是接口卻是對類局部(行為)進行抽象洽损。

??????2庞溜、 跨域不同。抽象類所跨域的是具有相似特點的類碑定,而接口卻可以跨域不同的類强缘。我們知道抽象類是從子類中發(fā)現(xiàn)公共部分,然后泛化成抽象類不傅,子類繼承該父類即可,但是接口不同赏胚。實現(xiàn)它的子類可以不存在任何關(guān)系访娶,共同之處。例如貓觉阅、狗可以抽象成一個動物類抽象類崖疤,具備叫的方法。鳥典勇、飛機可以實現(xiàn)飛Fly接口劫哼,具備飛的行為,這里我們總不能將鳥割笙、飛機共用一個父類吧权烧!所以說抽象類所體現(xiàn)的是一種繼承關(guān)系,要想使得繼承關(guān)系合理伤溉,父類和派生類之間必須存在"is-a" 關(guān)系般码,即父類和派生類在概念本質(zhì)上應(yīng)該是相同的。對于接口則不然乱顾,并不要求接口的實現(xiàn)者和接口定義在概念本質(zhì)上是一致的板祝, 僅僅是實現(xiàn)了接口定義的契約而已。

??????3走净、 設(shè)計層次不同券时。對于抽象類而言孤里,它是自下而上來設(shè)計的,我們要先知道子類才能抽象出父類橘洞,而接口則不同捌袜,它根本就不需要知道子類的存在,只需要定義一個規(guī)則即可震檩,至于什么子類琢蛤、什么時候怎么實現(xiàn)它一概不知。比如我們只有一個貓類在這里抛虏,如果你這是就抽象成一個動物類博其,是不是設(shè)計有點兒過度?我們起碼要有兩個動物類迂猴,貓慕淡、狗在這里,我們在抽象他們的共同點形成動物抽象類吧沸毁!所以說抽象類往往都是通過重構(gòu)而來的峰髓!但是接口就不同,比如說飛息尺,我們根本就不知道會有什么東西來實現(xiàn)這個飛接口携兵,怎么實現(xiàn)也不得而知,我們要做的就是事前定義好飛的行為接口搂誉。所以說抽象類是自底向上抽象而來的徐紧,接口是自頂向下設(shè)計出來的。

四炭懊、總結(jié)

??????1并级、 抽象類在java語言中所表示的是一種繼承關(guān)系,一個子類只能存在一個父類侮腹,但是可以存在多個接口嘲碧。

??????2、 在抽象類中可以擁有自己的成員變量和非抽象類方法父阻,但是接口中只能存在靜態(tài)的不可變的成員數(shù)據(jù)(不過一般都不在接口中定義成員數(shù)據(jù))愈涩,而且它的所有方法都是抽象的。

??????3加矛、抽象類和接口所反映的設(shè)計理念是不同的钠署,抽象類所代表的是“is-a”的關(guān)系,而接口所代表的是“l(fā)ike-a”的關(guān)系荒椭。

??????抽象類和接口是java語言中兩種不同的抽象概念谐鼎,他們的存在對多態(tài)提供了非常好的支持,雖然他們之間存在很大的相似性。但是對于他們的選擇往往反應(yīng)了您對問題域的理解狸棍。只有對問題域的本質(zhì)有良好的理解身害,才能做出正確、合理的設(shè)計草戈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塌鸯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唐片,更是在濱河造成了極大的恐慌丙猬,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件费韭,死亡現(xiàn)場離奇詭異茧球,居然都是意外死亡,警方通過查閱死者的電腦和手機星持,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門抢埋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人督暂,你說我怎么就攤上這事揪垄。” “怎么了逻翁?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵饥努,是天一觀的道長。 經(jīng)常有香客問我八回,道長酷愧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任辽社,我火速辦了婚禮,結(jié)果婚禮上翘鸭,老公的妹妹穿的比我還像新娘滴铅。我一直安慰自己,他們只是感情好就乓,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布汉匙。 她就那樣靜靜地躺著,像睡著了一般生蚁。 火紅的嫁衣襯著肌膚如雪噩翠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天邦投,我揣著相機與錄音伤锚,去河邊找鬼。 笑死志衣,一個胖子當著我的面吹牛屯援,可吹牛的內(nèi)容都是我干的猛们。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼狞洋,長吁一口氣:“原來是場噩夢啊……” “哼弯淘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吉懊,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤庐橙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后借嗽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體态鳖,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年淹魄,在試婚紗的時候發(fā)現(xiàn)自己被綠了郁惜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡甲锡,死狀恐怖兆蕉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缤沦,我是刑警寧澤虎韵,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站缸废,受9級特大地震影響包蓝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜企量,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一测萎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧届巩,春花似錦硅瞧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘾英,卻和暖如春枣接,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缺谴。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工但惶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓榆骚,卻偏偏與公主長得像片拍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妓肢,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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