《Java 程序設(shè)計(jì)基礎(chǔ)》 課件 第八章-面向?qū)ο蟮幕咎卣鱛第1頁(yè)
《Java 程序設(shè)計(jì)基礎(chǔ)》 課件 第八章-面向?qū)ο蟮幕咎卣鱛第2頁(yè)
《Java 程序設(shè)計(jì)基礎(chǔ)》 課件 第八章-面向?qū)ο蟮幕咎卣鱛第3頁(yè)
《Java 程序設(shè)計(jì)基礎(chǔ)》 課件 第八章-面向?qū)ο蟮幕咎卣鱛第4頁(yè)
《Java 程序設(shè)計(jì)基礎(chǔ)》 課件 第八章-面向?qū)ο蟮幕咎卣鱛第5頁(yè)
已閱讀5頁(yè),還剩30頁(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程序設(shè)計(jì)基礎(chǔ)面向?qū)ο蠡咎卣髅嫦驅(qū)ο蠡咎卣髦饕獌?nèi)容18.1抽象和封裝(重點(diǎn))8.2繼承(重點(diǎn))8.3多態(tài)(重點(diǎn)、難點(diǎn))教學(xué)目標(biāo)2能理解抽象的概念能正確使用抽象的思想設(shè)計(jì)程序能理解繼承的概念能正確描述無(wú)法使用繼承的兩種情況能描述final關(guān)鍵字的作用能正確區(qū)分super與this關(guān)鍵字的作用能理解多態(tài)的概念能正確使用多態(tài)簡(jiǎn)化程序能理解面向基類的編程思想能理解向上轉(zhuǎn)型和向下轉(zhuǎn)型的概念能正確區(qū)分向上轉(zhuǎn)型和向下轉(zhuǎn)型什么是抽象3有些資料把抽象和封裝、繼承、多態(tài)一起并稱為面向?qū)ο蟮乃拇筇卣鳎ǖ髁鞯恼f(shuō)法,仍然是三大特征)。面向?qū)ο笤O(shè)計(jì)首先要做的就是抽象,也就是根據(jù)用戶的業(yè)務(wù)需求抽象出類,并關(guān)注這些類的屬性和方法,將現(xiàn)實(shí)世界中的對(duì)象抽象成程序設(shè)計(jì)中的類。程序員開發(fā)出來(lái)的軟件是需要滿足用戶需求的,所以程序員做分析和設(shè)計(jì)的依據(jù)是用戶需求,這通常就是軟件開發(fā)前期形成的“需求規(guī)格說(shuō)明書”。面向?qū)ο笤O(shè)計(jì)時(shí),首先要閱讀用戶需求,找出需求中名詞部分用來(lái)確定類和擁有靜態(tài)特征的屬性,找出動(dòng)詞部分確定動(dòng)態(tài)行為的方法?!白廛囅到y(tǒng)”需求抽象分析4分析一個(gè)“租車系統(tǒng)”的部分需求。在控制臺(tái)輸出“請(qǐng)選擇要租車的類型:(1代表轎車,2代表卡車)”,等待用戶輸入。如果用戶選擇的是轎車,則在控制臺(tái)輸出“請(qǐng)選擇轎車品牌:(1代表紅旗,2代表長(zhǎng)城)”,等待用戶輸入。如果用戶選擇的是卡車,則在控制臺(tái)輸出“請(qǐng)選擇卡車噸位:(1代表5噸,2代表10噸)”,等待用戶輸入。在控制臺(tái)輸出“請(qǐng)給所租的車起名:”,等待用戶輸入車名。所租的車油量默認(rèn)值為20升,車輛損耗度為0(表示剛保養(yǎng)完的車,無(wú)損耗)。具有顯示所租車輛信息功能,顯示的信息包括車名、品牌/噸位、油量和車損度。“租車系統(tǒng)”需求抽象分析5首先我們進(jìn)行抽象,發(fā)現(xiàn)需求里的類并定義類的屬性和方法:發(fā)現(xiàn)名詞。通過(guò)閱讀需求,發(fā)現(xiàn)需求中有類型、轎車、卡車、品牌、紅旗、長(zhǎng)城等名詞。確定類和屬性。通過(guò)分析,車名、油量、車損度、品牌這些名詞依附于轎車這個(gè)名詞,車名、油量、車損度、噸位依附于卡車這個(gè)名詞,所以可以將轎車、卡車抽象成類,依附于這些類的名詞抽象成屬性。確定方法。通過(guò)分析需求的動(dòng)詞,發(fā)現(xiàn)顯示車輛信息是轎車和卡車的行為,所以可以將這個(gè)行為抽象成類的方法。同樣地,不是所有依附于類名詞的動(dòng)詞都需要抽象成類的方法,只有需要參與業(yè)務(wù)處理的動(dòng)詞才能確定成方法?!白廛囅到y(tǒng)”需求抽象分析6據(jù)對(duì)轎車和卡車的抽象,可以得到如圖所示的結(jié)果封裝“租車系統(tǒng)”的轎車類和卡車類7把所有的屬性都設(shè)置為私有屬性,每個(gè)私有屬性都提供getter和setter公有的方法,封裝后的類圖如下圖所示封裝“租車系統(tǒng)”的轎車類和卡車類8上述封裝過(guò)于簡(jiǎn)單,沒(méi)有考慮需求,接下來(lái)進(jìn)一步閱讀需求,可以發(fā)現(xiàn)以下幾點(diǎn)。租車時(shí)可以指定車的類型和品牌(或噸位),之后不允許修改。油量和車損度租車時(shí)取默認(rèn)值,只有通過(guò)車的加油和行駛的行為改變其油量和車損度值,不允許修改。根據(jù)需求,應(yīng)對(duì)轎車類和卡車類做如下修改。由于要求了車的屬性值不允許修改,因此去掉所有的setter方法,但保留所有的getter方法。提供addOil()、drive()這兩個(gè)公有的方法,實(shí)現(xiàn)車的加油和行駛的行為。至少需要提供一個(gè)構(gòu)造方法,實(shí)現(xiàn)對(duì)類型和品牌(或噸位)的初始化。封裝“租車系統(tǒng)”的轎車類和卡車類9調(diào)整后的類圖如圖所示抽象和封裝的具體體現(xiàn)10抽象,實(shí)際上是一個(gè)分析的過(guò)程,是根據(jù)需求的表述歸納實(shí)體的類型、屬性和行為,其產(chǎn)出物是類圖。類圖勾勒了實(shí)體應(yīng)該具備哪些屬性和行為,但未涉及細(xì)節(jié)。封裝,實(shí)則就是將抽象得到的模型轉(zhuǎn)變?yōu)榫唧w實(shí)現(xiàn)。它的要點(diǎn)是,盡可能對(duì)外隱藏細(xì)節(jié),Java中的手段就是使用private,所以在前面案例中所有的屬性都是private。抽象,是歸納提煉;封裝則是在實(shí)現(xiàn)中依據(jù)業(yè)務(wù)需求盡量隱藏細(xì)節(jié)。為什么要使用繼承11用繼承可以大大減少冗余代碼,提高代碼的復(fù)用性。我們之間添加的Car.java和Truck.java中的代碼,可以發(fā)現(xiàn)現(xiàn)有代碼存在著以下的不足Car類和Truck類中的代碼大量重復(fù):例如二者都存在name、oil、loss屬性,相應(yīng)的getter方法,以及addOil()、drive()等方法。對(duì)于整體結(jié)構(gòu)相似的Car類和Truck類,如果要修改其中的一個(gè)類的方法,另外一個(gè)類的方法要不要修改呢?例如,如果要將Car類中的addOil()方法改為fuelUp()方法,那么Truck類中是否也需要做相應(yīng)的修改呢?顯然,目前這種做法給后期的代碼維護(hù)帶來(lái)了麻煩。為什么要使用繼承12上述的問(wèn)題可以使用繼承解決。繼承可以使得子類沿用父類的成員(屬性和方法)。當(dāng)多個(gè)子類具有相同的成員時(shí),就可以考慮將這些成員提取出來(lái),放到父類中,然后再用子類去繼承這個(gè)父類,也就是將一些相同的成員提取到了更高的層次中。繼承的關(guān)鍵字是extends,語(yǔ)法形式如下。classAextendsB{類定義部分}以上表示A類繼承B類,B類稱為父類、超類或基類;A類稱為子類、衍生類或?qū)С鲱?。無(wú)法繼承的兩種特殊情況13以下是兩種特殊的情況不能使用繼承子類無(wú)法繼承父類的構(gòu)造方法子類不能繼承父類中不符合訪問(wèn)權(quán)限的成員方法重寫14有的時(shí)候,父類繼承而來(lái)的方法不能滿足子類的需要,此時(shí)就可以在子類中對(duì)父類的同名方法進(jìn)行覆蓋,這就是重寫。final關(guān)鍵字15重寫在語(yǔ)法上需要滿足如下條件。重寫方法與被重寫方法同名,參數(shù)列表也必須相同。重寫方法的返回值類型必須和被重寫方法的返回值類型相同或是其子類。重寫方法不能縮小被重寫方法的訪問(wèn)權(quán)限。同時(shí)調(diào)用父類子類16以下是借助于super()同時(shí)調(diào)用父類及子類的示例代碼publicclassCarextendsVehicle{privateStringbrand="紅旗";publicCar(Stringname,Stringbrand){super(name);//使用super關(guān)鍵字,調(diào)用父類的構(gòu)造方法this.brand=brand;}...}父類中沒(méi)有無(wú)參構(gòu)造器的兩種常見處理方式17在子類構(gòu)造方法第一行顯式的通過(guò)super([參數(shù)列表]),調(diào)用父類的某一個(gè)有參構(gòu)造方法publicclassSup{publicSup(Stringarg){//父類中沒(méi)有無(wú)參構(gòu)造方法,只有有參構(gòu)造方法}}classSubextendsSup{publicSub(){super("argValue");//顯式的通過(guò)super([參數(shù)列表]),調(diào)用父類的有參構(gòu)造方法//..}}父類中沒(méi)有無(wú)參構(gòu)造器的兩種常見處理方式18先通過(guò)this([參數(shù)列表])調(diào)用本類中的其他構(gòu)造方法,再在其他構(gòu)造方法中通過(guò)super([參數(shù)列表])顯式的調(diào)用父類的構(gòu)造方法publicclassSup{publicSup(Stringarg){}}classSubextendsSup{publicSub(){this(1);//先調(diào)用本類的其他構(gòu)造方法}publicSub(inta){super("argValue");//再調(diào)用父類的構(gòu)造方法}}調(diào)用父類中被重寫的方法19但如何調(diào)用父類中被重寫的那個(gè)方法呢?使用super關(guān)鍵字,即可以使用super明確調(diào)用父類中的方法publicclassSup{publicvoidinfo(){}}classSubextendsSup{publicvoidinfo(){}publicvoidshow(){info();//或()。調(diào)用的是子類中的方法();//使用super調(diào)用父類中的方法}}調(diào)用父類中被重寫的方法20在使用super明確調(diào)用父類中的方法時(shí),一種常見的做法是,通過(guò)super對(duì)父類中已有的方法進(jìn)行補(bǔ)充classSubextendsSup{publicvoidinfo(){();//調(diào)用父類的info()System.out.println("thisissubclassinfo");//進(jìn)行一些額外的代碼補(bǔ)充}...}繼承相關(guān)問(wèn)題的總結(jié)21對(duì)于“在子類繼承了父類后,子類繼承父類的方法”這一問(wèn)題總結(jié)如下:子類可以直接沿用父類的方法;子類可以重寫父類的方法;子類可以在父類提供方法的基礎(chǔ)上,額外新增一些功能。super與this關(guān)鍵字的區(qū)別與聯(lián)系22super與this的區(qū)別如下:this代表當(dāng)前對(duì)象本身,而super代表父類對(duì)象。使用this可以調(diào)用當(dāng)前對(duì)象的屬性或方法,使用super可以調(diào)用父類對(duì)象的屬性或方法。使用this可以調(diào)用當(dāng)前類中的其他構(gòu)造方法,使用super可以調(diào)用父類中的構(gòu)造方法。super與this關(guān)鍵字的區(qū)別與聯(lián)系23super與this的聯(lián)系如下:super和this都指向一個(gè)對(duì)象,因此super和this的本質(zhì)都是引用。二者都可以調(diào)用類或?qū)ο蟮膶傩?、方法。在使用super()或this()調(diào)用構(gòu)造方法時(shí),都必須寫在構(gòu)造方法的第一行。因此,在一個(gè)構(gòu)造方法內(nèi)部,不可能同時(shí)使用super()和this()來(lái)調(diào)用其他的構(gòu)造方法。什么是多態(tài)24在漢語(yǔ)中經(jīng)常存在著“一詞多義”的情景。例如“打”這個(gè)字是什么意思呢?“打籃球”、“打水”、“打架”中“打”的含義各不相同,因此要想確定某個(gè)具體的“打”字的含義,就必須將“打”放入具體的語(yǔ)境,通過(guò)上下文來(lái)斷定。在程序開發(fā)中也存在著類似于這種“一詞多義”的特征——多態(tài)。向上轉(zhuǎn)型25見向上轉(zhuǎn)型,實(shí)際就是父類的引用指向子類對(duì)象,如下

父類引用=new子類();示例 Vehicle是父類,Car是子類

Vehiclev=newCar();動(dòng)態(tài)綁定與靜態(tài)綁定26動(dòng)態(tài)綁定是指在編譯期間方法并不會(huì)和“引用”的類型綁定在一起,而是在程序運(yùn)行的過(guò)程中,JVM需要根據(jù)具體的實(shí)例對(duì)象才能確定此時(shí)要調(diào)用的是哪個(gè)方法。重寫方法遵循的就是動(dòng)態(tài)綁定。例如,父類Sup和子類Sub都定義了info()方法,此時(shí)執(zhí)行以下代碼。Supx=newSub();();由于Sub類重寫了Sup中的info()方法,在編譯期間info()方法不會(huì)和任何一個(gè)具體的類綁定起來(lái),而是在運(yùn)行期間,會(huì)列舉出Sub類中info()的方法和從父類Sup繼承過(guò)來(lái)的info()方法,然后根據(jù)當(dāng)前的實(shí)例對(duì)象是Sub對(duì)象,選擇調(diào)用Sub類中的info()方法。動(dòng)態(tài)綁定與靜態(tài)綁定27有動(dòng)態(tài)綁定,自然就有靜態(tài)綁定。靜態(tài)綁定是指程序編譯期的綁定。以下的類信息,使用的就是靜態(tài)綁定機(jī)制:final、static或private修飾的方法,以及重載方法和構(gòu)造方法。成員變量。面向基類的編程思想28在程序設(shè)計(jì)時(shí),一種推薦的編程思想是“面向基類”編程。也就是建議將面向的“對(duì)象”抽象為更高層次的基類。例如,Car和Truct是子類,Vehicle是父類。那么不建議通過(guò)drive(Carcar)或drive(Trucktruck)等方法,限制方法接收的參數(shù)是某一個(gè)具體的對(duì)象類型,而建議將這些對(duì)象抽象成一個(gè)共同的基類,如drive(Vehiclevehicle),這樣一來(lái)就可以利用多態(tài)的特性方便的對(duì)程序進(jìn)行擴(kuò)展,不必每增加一個(gè)具體的子類就得新增一個(gè)具體的方法。例如drive(Vehiclevehicle)就可以接收任何Vehicle以及子類對(duì)象,因此可以大大減少代碼的冗余度。向上轉(zhuǎn)型的局限性29向上轉(zhuǎn)型雖然可以減少代碼量,增加程序的可擴(kuò)展性,但同時(shí)也有自身的問(wèn)題。例如,在callShow(Vehiclev)方法中,只能調(diào)用Vehicle類的方法,不能調(diào)用Vehicle類子類特有的方法,這就是向上轉(zhuǎn)型的局限性。這個(gè)問(wèn)題的解決辦法就是向下轉(zhuǎn)型。顧名思義,向下轉(zhuǎn)型就是將一個(gè)父類轉(zhuǎn)換成一個(gè)子類的動(dòng)作。但要注意的是,向下轉(zhuǎn)型不是自動(dòng)進(jìn)行的,需要人為的進(jìn)行強(qiáng)制類型轉(zhuǎn)換。保證強(qiáng)制轉(zhuǎn)換的準(zhǔn)確性30程序員編程的過(guò)程中,在進(jìn)行對(duì)象的強(qiáng)制類型轉(zhuǎn)換時(shí),如何保證轉(zhuǎn)換的正確性呢?可以使用Java提供的instanceof運(yùn)算符(不是方法)來(lái)進(jìn)行預(yù)判斷。instanceof運(yùn)算符的語(yǔ)法形式如下。 對(duì)象instanceof類該運(yùn)算符判斷一個(gè)對(duì)象是否屬于一個(gè)類,返回值為true或false。筆試題31下列關(guān)于繼承的哪項(xiàng)敘述是正確的()?A在java中類允許多繼承B在java中一個(gè)類只能實(shí)現(xiàn)一個(gè)接口C在java中一個(gè)類不能同時(shí)繼承一個(gè)類和實(shí)現(xiàn)一個(gè)接口Djava的單一繼承使代碼更可靠筆試題32關(guān)于this與super的區(qū)別下面那項(xiàng)描述是錯(cuò)誤的()?Athis和super都可以調(diào)用類中的屬性、方法、構(gòu)造方法Bsupe

溫馨提示

  • 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)論