JAVA語(yǔ)言與編程專題Java語(yǔ)言的接口和抽象類課件_第1頁(yè)
JAVA語(yǔ)言與編程專題Java語(yǔ)言的接口和抽象類課件_第2頁(yè)
JAVA語(yǔ)言與編程專題Java語(yǔ)言的接口和抽象類課件_第3頁(yè)
JAVA語(yǔ)言與編程專題Java語(yǔ)言的接口和抽象類課件_第4頁(yè)
JAVA語(yǔ)言與編程專題Java語(yǔ)言的接口和抽象類課件_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

什么是接口

Java接口是一些方法特征的集合,沒(méi)有方法的實(shí)現(xiàn)。這些方法在不同的地方被實(shí)現(xiàn)時(shí),可以具有完全不同的行為。Java接口本身沒(méi)有任何實(shí)現(xiàn),因?yàn)镴ava接口不涉及具體,而只描述public行為,所以Java接口比Java抽象類更為抽象化。一個(gè)Java接口的方法只能是抽象的和公開的,Java接口不能有構(gòu)造方法。實(shí)現(xiàn)一個(gè)共同的Java接口的兩個(gè)類常常完全不同,但是有一組相同的方法。一些看上去毫不相干的類,可以因?yàn)樘峁┫囝愃频姆?wù),從而具有相同的接口。比如說(shuō),兩個(gè)實(shí)現(xiàn)Runnable接口的類除了都有一個(gè)publicvoidrun()方法之外,可能沒(méi)有其他任何的共同點(diǎn)。什么是接口Java接口是一些方法特征的集合,1接口和類主要區(qū)別接口僅僅描述方法的特征,而不給出方法的實(shí)現(xiàn);類不僅給出方法的特征,而且給出方法的實(shí)現(xiàn)。

接口把方法的特征和方法的實(shí)現(xiàn)分割開來(lái)。這種分割,體現(xiàn)在接口常常代表一個(gè)角色,它包裝與該角色相關(guān)的操作和屬性,而實(shí)現(xiàn)這個(gè)接口的類便是扮演這個(gè)角色的演員。一個(gè)角色可以由不同的演員來(lái)演,而不同的演員之間除了扮演同一個(gè)角色之外,并不要求有其它的任何共同之處。接口和類主要區(qū)別接口僅僅描述方法的特征,而不給出方法的實(shí)現(xiàn);2為什么使用接口1.接口是對(duì)可插人性的保證在一個(gè)類等級(jí)結(jié)構(gòu)中的任何一類都可以實(shí)現(xiàn)一個(gè)接口,這個(gè)接口會(huì)影響到此類的所有子類,但是不會(huì)影響到此類的任何超類。此類將不得不實(shí)現(xiàn)這個(gè)接口所規(guī)定的方法,而其子類則可以從此類自動(dòng)繼承到這些方法,當(dāng)然也可以選擇置換掉所有的這些方法,或者其中的某一些方法。這時(shí)候,這些子類就具有了可插入性。為什么使用接口1.接口是對(duì)可插人性的保證在3關(guān)聯(lián)的可插入性一個(gè)對(duì)象需要完成一項(xiàng)任務(wù),所以需要知道其他的對(duì)象,并且調(diào)用其他對(duì)象的方法。這個(gè)對(duì)象對(duì)其他對(duì)象的知識(shí)叫做關(guān)聯(lián)(Association)。

如果一個(gè)關(guān)聯(lián)不是針對(duì)一個(gè)具體類的,而是針對(duì)一個(gè)接口的,那么任何實(shí)現(xiàn)這個(gè)接口的類就都可以滿足要求。換言之,當(dāng)前對(duì)象并不在意所關(guān)聯(lián)的是哪一個(gè)具體類,而僅僅關(guān)心這個(gè)類是否實(shí)現(xiàn)了某一個(gè)接口。這樣一來(lái),就可以動(dòng)態(tài)地將這個(gè)關(guān)聯(lián)從一個(gè)具體類轉(zhuǎn)換到另一個(gè)具體類,而這樣做的唯一條件是它們都實(shí)現(xiàn)某個(gè)接口。關(guān)聯(lián)的可插入性一個(gè)對(duì)象需要完成一項(xiàng)任務(wù),所以4例如:不要使用下面的聲明語(yǔ)句:Vectoremployees=newVector();//Vector是Java的一個(gè)類而應(yīng)該使用下面的聲明語(yǔ)句:Listemployees=newVector();//List是Java的一個(gè)接口這樣作的好處是,在決定將Vector類型轉(zhuǎn)換成ArrayList時(shí),需要改動(dòng)得很少:Listemployees=newArrayList();例如:5調(diào)用的可插入性同樣,一個(gè)對(duì)象不可避免地需要調(diào)用其他對(duì)象的方法。這種調(diào)用不一定非得是某一個(gè)具體類,而可以是一個(gè)接口。這樣一來(lái),任何實(shí)現(xiàn)了這個(gè)接口的具體類都可以被當(dāng)前對(duì)象調(diào)用;而當(dāng)前對(duì)象到底調(diào)用的是哪一個(gè)具體類的實(shí)例則完全可以動(dòng)態(tài)地決定。因此,接口提供了關(guān)聯(lián)以及方法調(diào)用上的可插入性,軟件系統(tǒng)的規(guī)模越大,生命周期越長(zhǎng),接口的重要性就越大。接口使得軟件系統(tǒng)在靈活性和可擴(kuò)展性、可插入性方面得到保證。調(diào)用的可插入性同樣,一個(gè)對(duì)象不可避免地需要調(diào)6例如:publicclassexample{ListmyList;publicexample(ListaList){myList=aList;}publicintgetSize(){returnmyList.size()}

publicstaticvoidmain(Stringargs[]){ArrayListemployees=newArrayList();exampleep=newexample(employees);System.out.println(ep.getSize());}}例如:72.Java接口(以及Java抽象類)用來(lái)聲明一個(gè)新的類型

Java設(shè)計(jì)師應(yīng)當(dāng)主要使用Java接口和抽象類將軟件單位與內(nèi)部和外部耦合起來(lái)。換言之,應(yīng)當(dāng)使用Java接口和抽象類而不是具體類進(jìn)行變量的類型聲明、參量的類型聲明、方法的返回類型聲明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。當(dāng)然,一個(gè)更好的做法是僅僅使用Java接口,而不要使用抽象Java類來(lái)做到上面這些。

在理想的情況下,一個(gè)具體Java類應(yīng)當(dāng)只實(shí)現(xiàn)Java接口和抽象類中聲明過(guò)的方法,而不應(yīng)當(dāng)給出多余的方法。2.Java接口(以及Java抽象類)用來(lái)聲明一個(gè)新的類型83.Java接口(以及Java抽象類)一般用來(lái)作為一個(gè)類型的等級(jí)結(jié)構(gòu)的起點(diǎn)Java的類型是以類型等級(jí)結(jié)構(gòu)(TypeHierarchy)的方式組織起來(lái)在一個(gè)類型等級(jí)結(jié)構(gòu)里面,一個(gè)類型可以有一系列的超類型(Supertype),這時(shí)這個(gè)類型叫做其超類型的子類型。如果一個(gè)類已經(jīng)有一個(gè)主要的超類型,那么通過(guò)實(shí)現(xiàn)一個(gè)接口,這個(gè)類可以擁有另一個(gè)次要的超類型。這種次要的超類型就叫做混合類型(MixingType)。

如前面所談到的,當(dāng)一個(gè)具體類處于一個(gè)類的等級(jí)結(jié)構(gòu)之中的時(shí)候,為這個(gè)具體類定義一個(gè)混合類型是可以保證基于這個(gè)類型的可插入性的關(guān)鍵。因此,混合類型是一個(gè)非常重要的概念。

顯然,Java接口是實(shí)現(xiàn)混合類型的最理想的工具。3.Java接口(以及Java抽象類)一般用來(lái)作為一個(gè)類型9

什么是抽象類

抽象類僅提供一個(gè)類型的部分實(shí)現(xiàn)。抽象類可以有實(shí)例變量,以及一個(gè)或多個(gè)構(gòu)造方法。抽象類可以同時(shí)有抽象方法和具體方法。

一個(gè)抽象類不會(huì)有實(shí)例,這些構(gòu)造方法不能被客戶端調(diào)用來(lái)創(chuàng)建實(shí)例。一個(gè)抽象類的構(gòu)造方法可以被其子類調(diào)用,從而使一個(gè)抽象類的所有子類都可以有一些共有的實(shí)現(xiàn),而不同的子類可以在此基礎(chǔ)上有其自己的實(shí)現(xiàn)。抽象類和子類的這種關(guān)系實(shí)際上是模版方法模式的應(yīng)用。什么是抽象類抽象類僅提供一個(gè)類型的部分實(shí)現(xiàn)10抽象類的用途Java抽象類與Java接口一樣,都用來(lái)聲明一個(gè)新的類型,并且作為一個(gè)類型的等級(jí)結(jié)構(gòu)的起點(diǎn)。但是,Java接口具有比Java抽象類更好的特性,因此,應(yīng)當(dāng)優(yōu)先使用Java接口聲明一個(gè)超類型。抽象類通常代表一個(gè)抽象概念,它提供一個(gè)繼承的出發(fā)點(diǎn)。而具體類則不同,具體類可以實(shí)例化,應(yīng)當(dāng)給出一個(gè)有商業(yè)邏輯實(shí)現(xiàn)的對(duì)象模版。由于抽象類不可以實(shí)例化,因此一個(gè)設(shè)計(jì)師設(shè)計(jì)一個(gè)新的抽象類,一定是用來(lái)繼承的。而這一個(gè)聲明倒過(guò)來(lái)也是對(duì)的:具體類不是用來(lái)繼承的。抽象類的用途Java抽象類與Java接口一樣11抽象類應(yīng)當(dāng)擁有盡可能多的共同代碼

在一個(gè)從抽象類到多個(gè)具體類的繼承關(guān)系中,共同的代碼應(yīng)當(dāng)盡量移動(dòng)到抽象類里。在一個(gè)繼承的等級(jí)結(jié)構(gòu)中,共同的代碼應(yīng)當(dāng)盡量向等級(jí)結(jié)構(gòu)的上方移動(dòng)。

把重復(fù)的代碼從子類里面移動(dòng)到超類里面,可以提高代碼的復(fù)用率。由于代碼在共同的超類而不是幾個(gè)子類中出現(xiàn),在代碼發(fā)生改變時(shí),設(shè)計(jì)師只需要修改一個(gè)地方。這對(duì)代碼的復(fù)用明顯是有利的。

一個(gè)對(duì)象從超類繼承而來(lái)的代碼,在不使用時(shí)不會(huì)造成對(duì)資源的浪費(fèi)。抽象類應(yīng)當(dāng)擁有盡可能多的共同代碼在一個(gè)從抽象類12抽象類抽象類具體類抽象類具體類具體類代碼集中的方向抽象類抽象類具體類抽象類具體類具體類代碼集中的方向13代碼重構(gòu)的建議ABCAB重構(gòu)為設(shè)計(jì)師應(yīng)當(dāng)將類A和類B的共同代碼盡量移動(dòng)到抽象超類C里面,這樣可以保證最大限度的復(fù)用。代碼重構(gòu)的建議ABCAB重構(gòu)為設(shè)計(jì)師應(yīng)當(dāng)將類A和14抽象類應(yīng)當(dāng)擁有盡可能少的數(shù)據(jù)與代碼的移動(dòng)方向相反的是,數(shù)據(jù)的移動(dòng)方向是從抽象類到具體類,也即從繼承的等級(jí)結(jié)構(gòu)的高端向等級(jí)結(jié)構(gòu)的低端移動(dòng)。

一個(gè)對(duì)象的數(shù)據(jù)不論是否使用都會(huì)占用資源,因此數(shù)據(jù)應(yīng)當(dāng)盡量放到具體類或者等級(jí)結(jié)構(gòu)的低端。抽象類應(yīng)當(dāng)擁有盡可能少的數(shù)據(jù)與代碼的移動(dòng)方向15抽象類抽象類具體類抽象類具體類具體類數(shù)據(jù)集中的方向抽象類抽象類具體類抽象類具體類具體類數(shù)據(jù)集中的方向16抽象類的使用1、針對(duì)抽象編程,不要針對(duì)具體編程這就是依賴倒轉(zhuǎn)原則(InverseDependency)。換言之,應(yīng)當(dāng)針對(duì)抽象類編程,不要針對(duì)具體子類編程,這一原則點(diǎn)出了抽象類對(duì)代碼復(fù)用的一個(gè)最重要的作用。2、正確使用繼承在Java語(yǔ)言中,繼承關(guān)系可以分成兩種:一種是類對(duì)接口的實(shí)現(xiàn),稱做接口繼承;另一種是類對(duì)類的繼承,稱做實(shí)現(xiàn)繼承。第二種繼承關(guān)系是很容易被濫用的一種復(fù)用工具。正如前面所指出的,抽象類是用來(lái)繼承的,因此抽象類注定要與繼承關(guān)聯(lián)在一起,只要可能,盡量使用合成(Composition),而不要使用繼承來(lái)達(dá)到復(fù)用的目的。抽象類的使用1、針對(duì)抽象編程,不要針對(duì)具體編程17什么時(shí)候才應(yīng)當(dāng)使用繼承復(fù)用繼承代表“一般化/特殊化”關(guān)系,其中基類代表一般,而衍生類代表特殊,衍生類將基類特殊化或擴(kuò)展化。只有當(dāng)以下的條件全部被滿足時(shí),才應(yīng)當(dāng)使用繼承關(guān)系:(1)子類是超類的一個(gè)特殊種類,而不是超類的一個(gè)角色,也就是要區(qū)分“Has-A”與“Is-A”兩種關(guān)系的不同。Has-A關(guān)系應(yīng)當(dāng)使用聚合關(guān)系描述,而只有Is-A關(guān)系才符合繼承關(guān)系。

什么時(shí)候才應(yīng)當(dāng)使用繼承復(fù)用繼承代表“一般化/特18(2)子類具有擴(kuò)展超類的責(zé)任,而不是具有置換掉(Override)或注銷掉(Nullify)超類的責(zé)任。

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論