本篇文章給大家談?wù)労喪龀橄箢惡徒涌诘膮^(qū)別,以及接口與抽象類的異同對應(yīng)的知識點(diǎn),文章可能有點(diǎn)長,但是希望大家可以閱讀完,增長自己的知識,最重要的是希望對各位有所幫助,可以解決了您的問題,不要忘了收藏本站喔。
如何理解java的抽象類和接口的區(qū)別
首先,來理解一下抽象類和接口的概念。
眾所周知,Java是面向?qū)ο蟮某绦蛘Z言,而面向?qū)ο笾械乃械膶ο螅蠖际峭ㄟ^類來描述的。相反,并不是所有的類都適合來描述對象,比如抽象類。抽象類中沒有足夠的信息來描述一個(gè)具體的對象,所以它是抽象的。
而接口,是高度抽象類型,是抽象方法的集合,接口并不是類,而是對類的一組需求的描述。這些類要遵循接口描述的統(tǒng)一格式來定義。如果類遵從了某個(gè)特定接口,就代表它履行了這項(xiàng)服務(wù)。
然后,來理解一下抽象類和接口的相同點(diǎn)。
其一,都不能被實(shí)例化。
其二,接口只有在其實(shí)現(xiàn)類實(shí)現(xiàn)了其中所有的方法、抽象類的子類也都實(shí)現(xiàn)了所有的抽象方法后,才可以被實(shí)例化。
再然后,來理解一下抽象類和接口的不同點(diǎn)。
抽象類:
abstract關(guān)鍵字修飾抽象方法只有聲明,無方法體只能繼承不能實(shí)例化包含抽象方法的類一定是抽象類,但抽象類不一定包含抽象方法抽象類中的抽象方法的修飾符只能是public或者protected,默認(rèn)為public一個(gè)類只能繼承一個(gè)抽象類子類繼承抽象類時(shí),必須實(shí)現(xiàn)全部的抽象方法,否則也必須為抽象類可以包含成員變量、成員方法、構(gòu)造方法;但是構(gòu)造方法不能用于實(shí)例化,只是供子類調(diào)用如抽象類Animal,有成員屬性name、構(gòu)造方法:
接口:
interface關(guān)鍵字修飾方法只能有聲明,不能有方法體,默認(rèn)為publicabstract。JDK1.8之后,可以有default類型的方法,可以有方法體只能實(shí)現(xiàn)不能實(shí)例化所有方法只能是publicabstract。JDK1.8之后,可以有default類型的方法,可以有方法體一個(gè)類可以實(shí)現(xiàn)多個(gè)接口可以包含變量,但隱式默認(rèn)為publicstaticfinalJDK1.8中的新特性,新增了默認(rèn)方法(default):允許接口含有非抽象的方法,但必須用default修飾;default方法可以子類調(diào)用,子類也可不比對其實(shí)現(xiàn);如子類實(shí)現(xiàn)了多個(gè)接口,且這些接口均包含有默認(rèn)方法,則子類必須重寫該默認(rèn)方法。新增了靜態(tài)方法:允許接口使用static關(guān)鍵字修飾方法并提供實(shí)現(xiàn),即為靜態(tài)方法;接口的靜態(tài)方法只能通過接口進(jìn)行調(diào)用,調(diào)用方式為:接口名:方法名。如接口Climb,通用行為climb:
舉個(gè)栗子,Cat類繼承Animal、且實(shí)現(xiàn)Climb,具有動物特性和攀爬行為:
運(yùn)行一下,看一下調(diào)用順序和結(jié)果。
果然,先調(diào)用了抽象父類的構(gòu)造方法,然后是子類的構(gòu)造方法。
最后,來總結(jié)一下抽象類和接口。
接口的設(shè)計(jì)目的為:對類的行為進(jìn)行約束,是一種通用的行為規(guī)范;
抽象類的設(shè)計(jì)目的為:類的通用模板,提高代碼復(fù)用性。
允許接口中只有一個(gè)抽象方法對不對
是正確的接口中方法都為抽象方法。下面給你說一下抽象類和接口的區(qū)別:抽象類由abstract關(guān)鍵字來修飾,接口由interface關(guān)鍵字來修飾。抽象類中除了有抽象方法外,也可以有數(shù)據(jù)成員和非抽象方法;而接口中所有的方法必須都是抽象的,接口中也可以定義數(shù)據(jù)成員,但必須是常量。
c中抽象類和接口類的區(qū)別
抽象類和接口的區(qū)別:
1.類是對對象的抽象,可以把抽象類理解為把類當(dāng)作對象,抽象成的類叫做抽象類.而接口只是一個(gè)行為的規(guī)范或規(guī)定,微軟的自定義接口總是后帶able字段,證明其是表述一類類“我能做。。。”.抽象類更多的是定義在一系列緊密相關(guān)的類間,而接口大多數(shù)是關(guān)系疏松但都實(shí)現(xiàn)某一功能的類中.
2.接口基本上不具備繼承的任何具體特點(diǎn),它僅僅承諾了能夠調(diào)用的方法;
3.一個(gè)類一次可以實(shí)現(xiàn)若干個(gè)接口,但是只能擴(kuò)展一個(gè)父類
4.接口可以用于支持回調(diào),而繼承并不具備這個(gè)特點(diǎn).
5.抽象類不能被密封。
6.抽象類實(shí)現(xiàn)的具體方法默認(rèn)為虛的,但實(shí)現(xiàn)接口的類中的接口方法卻默認(rèn)為非虛的,當(dāng)然您也可以聲明為虛的.
7.(接口)與非抽象類類似,抽象類也必須為在該類的基類列表中列出的接口的所有成員提供它自己的實(shí)現(xiàn)。但是,允許抽象類將接口方法映射到抽象方法上。
8.抽象類實(shí)現(xiàn)了oop中的一個(gè)原則,把可變的與不可變的分離。抽象類和接口就是定義為不可變的,而把可變的座位子類去實(shí)現(xiàn)。
9.好的接口定義應(yīng)該是具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個(gè)類只是實(shí)現(xiàn)了這個(gè)接口的中一個(gè)功能,而不得不去實(shí)現(xiàn)接口中的其他方法,就叫接口污染。
10.盡量避免使用繼承來實(shí)現(xiàn)組建功能,而是使用黑箱復(fù)用,即對象組合。因?yàn)槔^承的層次增多,造成最直接的后果就是當(dāng)你調(diào)用這個(gè)類群中某一類,就必須把他們?nèi)考虞d到棧中!后果可想而知.(結(jié)合堆棧原理理解)。同時(shí),有心的朋友可以留意到微軟在構(gòu)建一個(gè)類時(shí),很多時(shí)候用到了對象組合的方法。比如asp.net中,Page類,有ServerRequest等屬性,但其實(shí)他們都是某個(gè)類的對象。使用Page類的這個(gè)對象來調(diào)用另外的類的方法和屬性,這個(gè)是非常基本的一個(gè)設(shè)計(jì)原則。
11.如果抽象類實(shí)現(xiàn)接口,則可以把接口中方法映射到抽象類中作為抽象方法而不必實(shí)現(xiàn),而在抽象類的子類中實(shí)現(xiàn)接口中方法.
抽象類和接口的區(qū)別是什么
抽象類表示該類中可能已經(jīng)有一些方法的具體定義,但是接口就僅僅只能定義各個(gè)方法的界面(方法名,參數(shù)列表,返回類型),并不關(guān)心具體細(xì)節(jié)。
接口是引用類型的,和抽象類的相似之處有三點(diǎn):
不能實(shí)例化;
包含未實(shí)現(xiàn)的方法聲明;
派生類必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員)。
抽象類與接口緊密相關(guān)。然而接口又比抽象類更抽象,這主要體現(xiàn)在它們的差別上:
類可以實(shí)現(xiàn)無限個(gè)接口,但僅能從一個(gè)抽象(或任何其他類型)類繼承,從抽象類派生的類仍可實(shí)現(xiàn)接口,從而得出接口是用來解決多重繼承問題的。
抽象類當(dāng)中可以存在非抽象的方法,可接口不能,且它里面的方法只是一個(gè)聲明必須用public來修飾沒有具體實(shí)現(xiàn)的方法。
抽象類中的成員變量可以被不同的修飾符來修飾,可接口中的成員變量默認(rèn)的都是靜態(tài)常量(staticfinal)。
抽象類是對象的抽象,然而接口是一種行為規(guī)范。
類和接口有什么關(guān)系
設(shè)計(jì)思想不同,使用動機(jī)不同.
抽象類和接口設(shè)計(jì)的時(shí)候,設(shè)計(jì)思想不同.設(shè)計(jì)抽象類是自下而上的過程,因?yàn)檎{(diào)用者子類需要某些屬性和特有行為,所以調(diào)用者繼承抽象類設(shè)計(jì)接口是自上而下的過程,接口規(guī)范某一行為,我某類需要這個(gè)行為,調(diào)用者實(shí)現(xiàn)某接口
開發(fā)者使用的時(shí)候,使用動機(jī)不同.開發(fā)者繼承抽象類是為了使用抽象類的屬性和行為;開發(fā)者實(shí)現(xiàn)接口只是為了使用接口的行為.
區(qū)別總結(jié):
區(qū)別一:抽象類只能單繼承,接口能多實(shí)現(xiàn)
區(qū)別二:抽象類是一個(gè)類,可以被任意權(quán)限修飾符修飾,靜態(tài)和非靜態(tài)屬性,final和非final屬性,可以有抽象方法和非抽象方法;
接口只能被public,final修飾,只能有靜態(tài)方法,即使沒有顯示的聲明,而且是不可修改的;
區(qū)別三:抽象的事物不同:抽象類是對類的抽象,接口是對行為的抽象; 抽象類是對整個(gè)類抽象,包括屬性,行為; 接口是對類的行為(局部)進(jìn)行抽象;
區(qū)別四:定義的時(shí)候,定義抽象類和接口的思想不同; 設(shè)計(jì)抽象類是自下而上的過程,我子類需要,所以我定義抽象類; 設(shè)計(jì)接口是自上而下的過程,我接口規(guī)范某一行為,我某類需要這個(gè)行為,我實(shí)現(xiàn)某接口;
核心區(qū)別:
調(diào)用者使用動機(jī)不同,實(shí)現(xiàn)接口是為了使用他規(guī)范的某一個(gè)行為;
繼承抽象類是為了使用這個(gè)類屬性和行為.
再簡單點(diǎn)說:
我們知道抽象類是從子類中發(fā)現(xiàn)公共部分,然后泛化成抽象類,子類繼承該父類即可,但是接口不同。實(shí)現(xiàn)它的子類可以不存在任何關(guān)系,共同之處。例如貓、狗可以抽象成一個(gè)動物類抽象類,具備叫的方法。鳥、飛機(jī)可以實(shí)現(xiàn)飛Fly接口,具備飛的行為,這里我們總不能將鳥、飛機(jī)共用一個(gè)父類吧!所以說抽象類所體現(xiàn)的是一種繼承關(guān)系,要想使得繼承關(guān)系合理,父類和派生類之間必須存在"
is
-a"關(guān)系,即父類和派生類在概念本質(zhì)上應(yīng)該是相同的。對于接口則不然,并不要求接口的實(shí)現(xiàn)者和接口定義在概念本質(zhì)上是一致的,僅僅是實(shí)現(xiàn)了接口定義的規(guī)則而已。關(guān)于簡述抽象類和接口的區(qū)別和接口與抽象類的異同的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。