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

下載本文檔

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

文檔簡介

詳細解析Java中抽象類和接口的區(qū)2007-09-2812:17來源:整理作者:doublel責任編輯:方舟·yesky評論在Java語言中, class和interface是支持抽象類定義的兩種機制。正是由于這兩種機制的存在,才賦予了Java強大的面向?qū)ο竽芰Α?class和interface者在進行抽象類定義時對于 class和interface的選擇顯得比較隨意。其實,兩者之間還是有很大的區(qū)別的,對于它們的選擇甚至反映出對于問題領(lǐng)域本質(zhì)的理解、對于設理解class和interface在Java語言中都是用來進行抽象類(本文中的抽象類并 class翻譯而來,它表示的是一個抽象體,而 class為Java語言中用于定義抽象類的法,請讀者注意區(qū)分)定義的,那么什么是抽象類,使用抽象類OCP的讀者一定知道,為了能夠?qū)崿F(xiàn)面向?qū)ο笤O計的一個最的原則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在抽象類中不能定義默認行為還存在另一個比較嚴重的問題,那就是可能會造成上的麻煩。因為如果后來想修改類的界面(一般通過 class或者interface來表示)以適應新的情況(比如,添加新的方法或者給已用的方法中添加新的參數(shù))時,就會 class來實現(xiàn)的,那么可能就只需要修改定義在 class中的默的每一個派生類中,了"onerule,oneplace"原則,造成代碼重復,同樣不利于以 class和interface間進行選擇時要非常的。從設計理念層面 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還要具有的功能。我們該如何設計針對該例子的類結(jié)構(gòu)(classinterface反映在設計理念上的區(qū)別,其他方面無關(guān)的問題都做了簡化或者忽略)?DooralarmclassDoor{voidopen();voidclose();voidalarm();}interfaceinterfaceDoor{voidopen();voidclose();voidalarm();}那么具有功能的AlarmDoor的定義方式如下classAlarmDoorextendsclassAlarmDoorextendsvoidopen(){…}voidclose(){…}void}classclassAlarmDoorimplementsDoor{voidopen(){…}voidclose(){…}void}這種方法了面向?qū)ο笤O計中的一個原則ISP(InterfaceSegregationPrinciple),在Door的定義中把Door概念本身固有的行為方法和另外一個概念"器"的Door這個概念的模塊會因為"器"這個概念的改變(比如:修改alarm方法的參數(shù))而改變,反之依然。既然open、close和alarm屬于兩個不同的概念,根據(jù)ISP原則應該把它們分別定 class方式定義;兩個概念都使用interface方式定義;一個概念使用 class方式定義,另一個概念使用interface方式定義。Java語言不支持多重繼承,所以兩個概念都使用class方式定義interface方式來定義,那么就反映出兩個問題:1、我們可能沒有理解清楚問題領(lǐng)域,AlarmDoor在概念本質(zhì)上到底是Door還是器?2、如果我們AlarmDoor在Door是一致的,那么我們在實現(xiàn)時就沒有能夠正確的揭示我們的設計意圖,因為在這兩個概念的定義上(均使用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}設計意圖。其實 class表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guā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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論