考研復(fù)試1-接口和抽象類區(qū)別_第1頁
考研復(fù)試1-接口和抽象類區(qū)別_第2頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

詳細(xì)解析Java中抽象類和接口的區(qū)2007-09-2812:17來源:整理作者:doublel責(zé)任編輯:方舟·yesky評論在Java語言中, class和interface是支持抽象類定義的兩種機(jī)制。正是由于這兩種機(jī)制的存在,才賦予了Java強(qiáng)大的面向?qū)ο竽芰Α?class和interface者在進(jìn)行抽象類定義時對于 class和interface的選擇顯得比較隨意。其實,兩者之間還是有很大的區(qū)別的,對于它們的選擇甚至反映出對于問題領(lǐng)域本質(zhì)的理解、對于設(shè)理解class和interface在Java語言中都是用來進(jìn)行抽象類(本文中的抽象類并 class翻譯而來,它表示的是一個抽象體,而 class為Java語言中用于定義抽象類的法,請讀者注意區(qū)分)定義的,那么什么是抽象類,使用抽象類OCP的讀者一定知道,為了能夠?qū)崿F(xiàn)面向?qū)ο笤O(shè)計的一個最的原則OCP(Open-ClosedPrinciple),抽象類是其中的關(guān)鍵所從語法定義層面 class和在語法層面,Java語言對于 class和interface給出了不同的定義方式,下面以定義一個名為Demo的抽象類為例來說明這種不同。使 class的方式定義Demo抽象類的方式如下classvoidmethod1();void…}interfaceDemointerfaceinterfaceDemo{voidmethod1();void…} class方式中,Demo可以有自己的數(shù)據(jù)成員,也可以有非 員方法,而在interface方式的實現(xiàn)中,Demo只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是staticfinal的,不過在interface中一般不定義數(shù)據(jù)成員),所有的成員方法都 的。從某種意義上說,interface是一種特殊形式的 從編程的角度來看 class和interface都可以用來實現(xiàn)"designby首先,class在Java語言中表示的是一種繼承關(guān)系,一個類只能使用一次繼承關(guān)系(Java轉(zhuǎn)注)interface。也JavaJava對于多重繼承的支持方面的一種折中考慮吧。其次,在classinterface在抽象類中不能定義默認(rèn)行為還存在另一個比較嚴(yán)重的問題,那就是可能會造成上的麻煩。因為如果后來想修改類的界面(一般通過 class或者interface來表示)以適應(yīng)新的情況(比如,添加新的方法或者給已用的方法中添加新的參數(shù))時,就會 class來實現(xiàn)的,那么可能就只需要修改定義在 class中的默的每一個派生類中,了"onerule,oneplace"原則,造成代碼重復(fù),同樣不利于以 class和interface間進(jìn)行選擇時要非常的。從設(shè)計理念層面 class和 class和interface的區(qū)別,這些層 class和interface class在Java語言中體現(xiàn)了一種繼承關(guān)系,要想使得繼承同的。對于interface來說則不然,并不要求interface的實現(xiàn)者和interface定義在概念本質(zhì)上是一致的,僅僅是實現(xiàn)了interface定義的契約而已。為了使論述便于理解,下面將openclose,此時我們可以通過classinterface來定義使 class方式定義classDoor{voidvoid}interfaceinterfaceinterfaceDoor{voidopen();voidclose();}其他具體的Door類型可以extends使用 class方式定義的Door或者implements使用interface方式定義的Door。看起來好像使用 class和interface如果現(xiàn)在要求Door還要具有的功能。我們該如何設(shè)計針對該例子的類結(jié)構(gòu)(classinterface反映在設(shè)計理念上的區(qū)別,其他方面無關(guān)的問題都做了簡化或者忽略)?DooralarmclassDoor{voidopen();voidclose();voidalarm();}interfaceinterfaceDoor{voidopen();voidclose();voidalarm();}那么具有功能的AlarmDoor的定義方式如下classAlarmDoorextendsclassAlarmDoorextendsvoidopen(){…}voidclose(){…}void}classclassAlarmDoorimplementsDoor{voidopen(){…}voidclose(){…}void}這種方法了面向?qū)ο笤O(shè)計中的一個原則ISP(InterfaceSegregationPrinciple),在Door的定義中把Door概念本身固有的行為方法和另外一個概念"器"的Door這個概念的模塊會因為"器"這個概念的改變(比如:修改alarm方法的參數(shù))而改變,反之依然。既然open、close和alarm屬于兩個不同的概念,根據(jù)ISP原則應(yīng)該把它們分別定 class方式定義;兩個概念都使用interface方式定義;一個概念使用 class方式定義,另一個概念使用interface方式定義。Java語言不支持多重繼承,所以兩個概念都使用class方式定義interface方式來定義,那么就反映出兩個問題:1、我們可能沒有理解清楚問題領(lǐng)域,AlarmDoor在概念本質(zhì)上到底是Door還是器?2、如果我們AlarmDoor在Door是一致的,那么我們在實現(xiàn)時就沒有能夠正確的揭示我們的設(shè)計意圖,因為在這兩個概念的定義上(均使用interface方式定義)反映不出上述含義。如果我們對于問題領(lǐng)域的理解是:AlarmDoorDoor,同時它有具有報classJava語言中表示一種繼承關(guān)系,而繼承關(guān)系在本質(zhì)上是"is-a"關(guān)系。所Doorabstarctclass方式來定義。另外,AlarmDoor又具有功能,說明它又能夠完成概念中定義的行為,所以概念可以通過interface方式定義。如下所示:classDoor{voidopen();voidclassDoor{voidopen();voidclose();}interfaceAlarm{voidalarm();}classAlarmDoorextendsDoorimplementsvoidopen(){…}voidclose(){…}void}設(shè)計意圖。其實 class表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系,大認(rèn)為AlarmDoor在概念本質(zhì)上是器,同時又具有Door的功能,那么上述的定義方式小classJava語言中表示的是一種繼承關(guān)系,一個類只能使用一次繼承interface。 class中可以有自己的數(shù)據(jù)成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是staticfinal的,不過在interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是 class和

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論