第4章-類(lèi)的多態(tài)_第1頁(yè)
第4章-類(lèi)的多態(tài)_第2頁(yè)
第4章-類(lèi)的多態(tài)_第3頁(yè)
第4章-類(lèi)的多態(tài)_第4頁(yè)
第4章-類(lèi)的多態(tài)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(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)介

第4章類(lèi)的多態(tài)掌握多態(tài)的優(yōu)勢(shì)和應(yīng)用場(chǎng)合掌握父類(lèi)和子類(lèi)之間的類(lèi)型轉(zhuǎn)換掌握instanceof運(yùn)算符的使用使用父類(lèi)作為方法形參實(shí)現(xiàn)多態(tài)本章目標(biāo)為什么使用多態(tài)5-1寵物生病了,需要主人給寵物看病不同寵物看病過(guò)程不一樣不同寵物恢復(fù)后體力值不一樣

打針

吃藥

吃藥

療養(yǎng)狗狗Q仔為什么使用多態(tài)5-2編寫(xiě)主人類(lèi)編寫(xiě)給狗狗看病的方法編寫(xiě)給Q仔看病的方法編寫(xiě)測(cè)試方法調(diào)用主人類(lèi)給狗狗看病的方法調(diào)用主人類(lèi)給Q仔看病的方法為什么使用多態(tài)5-3編碼實(shí)現(xiàn)publicclassMaster{publicvoidCure(Dogdog){if(dog.getHealth()<50){dog.setHealth(60);System.out.println("打針、吃藥");

}

}

publicvoidCure(Penguinpenguin){

if(penguin.getHealth()<50)

penguin.setHealth(70);

System.out.println("吃藥、療養(yǎng)");

}}

主人類(lèi)……Mastermaster=newMaster();master.Cure(dog);master.Cure(penguin);……測(cè)試方法為什么使用多態(tài)5-4如果又需要給XXX看病,怎么辦?添加X(jué)XX類(lèi),繼承Pet類(lèi)修改Master類(lèi),添加給XXX看病的方法使用多態(tài)優(yōu)化設(shè)計(jì)頻繁修改代碼,代碼可擴(kuò)展性、可維護(hù)性差為什么使用多態(tài)5-5使用多態(tài)優(yōu)化后的代碼……Petpet=newDog();Mastermaster=newMaster();master.Cure(pet);……測(cè)試方法publicclassDogextendsPet{publicvoidtoHospital(){this.setHealth(60);System.out.println("打針、吃藥");

}}publicclassPenguinextendsPet{publicvoidtoHospital(){this.setHealth(70);System.out.println("吃藥、療養(yǎng)");

}}publicclassMaster{publicvoidCure(Petpet){if(pet.getHealth()<50)pet.toHospital();}}主人類(lèi)Dog類(lèi)Penguin類(lèi)1234又要給XXX看病時(shí),只需:1.編寫(xiě)XXX類(lèi)繼承Pet類(lèi)(舊方案也需要)2.創(chuàng)建XXX類(lèi)對(duì)象(舊方案也需要)3.其他代碼不變(不用修改Master類(lèi))什么是多態(tài)生活中的多態(tài)你能列舉出一個(gè)多態(tài)的生活示例嗎?程序中的多態(tài)多態(tài):同一個(gè)引用類(lèi)型,使用不同的實(shí)例而執(zhí)行不同操作父類(lèi)引用,子類(lèi)對(duì)象同一種事物,由于條件不同,產(chǎn)生的結(jié)果也不同如何實(shí)現(xiàn)多態(tài)3-1用多態(tài)實(shí)現(xiàn)打印機(jī)分為黑白打印機(jī)和彩色打印機(jī)不同類(lèi)型的打印機(jī)打印效果不同黑白打印機(jī)彩色打印機(jī)打印如何實(shí)現(xiàn)多態(tài)3-2使用多態(tài)實(shí)現(xiàn)思路編寫(xiě)父類(lèi)編寫(xiě)子類(lèi),子類(lèi)重寫(xiě)父類(lèi)方法運(yùn)行時(shí),使用父類(lèi)的類(lèi)型,子類(lèi)的對(duì)象計(jì)算機(jī)可以連接各種打印機(jī)無(wú)論連接何種打印機(jī)打印方法都相同根據(jù)連接打印機(jī)不同,效果也不同如何實(shí)現(xiàn)多態(tài)3-3編碼實(shí)現(xiàn)實(shí)現(xiàn)多態(tài)的兩個(gè)要素:1.方法重寫(xiě)2.使用父類(lèi)類(lèi)型abstractclassPrinter(){

print(Stringstr);}classColorPrinterextendsPrinter(){

print(Stringstr){System.out.println("輸出彩色的"+str);}}classBlackPrinterextendsPrinter(){

print(Stringstr){System.out.println("輸出黑白的"+str);}}publicstaticvoidmain(String[]args){

Printerp=newColorPrinter();p.print();p=newBlackPrinter();p.print();}父類(lèi)子類(lèi)運(yùn)行同一種操作方式,不同的操作對(duì)象只能調(diào)用父類(lèi)已經(jīng)定義的方法方法重寫(xiě)方法重寫(xiě)的規(guī)則在繼承關(guān)系的子類(lèi)中重寫(xiě)的方法名、參數(shù)、返回值類(lèi)型必須與父類(lèi)相同私有方法不能繼承因而也無(wú)法重寫(xiě)

位置方法名參數(shù)表返回值訪問(wèn)修飾符方法重寫(xiě)子類(lèi)相同相同相同不能比父類(lèi)更嚴(yán)格方法重載同類(lèi)相同不相同無(wú)關(guān)無(wú)關(guān)方法重寫(xiě)方法重載VSinstanceof運(yùn)算符該運(yùn)算符用來(lái)判斷一個(gè)對(duì)象是否屬于一個(gè)類(lèi)或者實(shí)現(xiàn)了一個(gè)接口,結(jié)果為true或false在強(qiáng)制類(lèi)型轉(zhuǎn)換之前通過(guò)instanceof運(yùn)算符檢查對(duì)象的真實(shí)類(lèi)型,可以避免類(lèi)型轉(zhuǎn)換異常,從而提高代碼健壯性對(duì)象instanceof

類(lèi)或接口/***測(cè)試instanceof運(yùn)算符的使用。*@author北大青鳥(niǎo)*/publicclassTestPoly2{publicstaticvoidmain(String[]args){Petpet=newPenguin("楠楠","Q妹");

//Petpet=newDog("歐歐","雪娜瑞");

pet.eat();

if(petinstanceofDog){

Dogdog=(Dog)pet;

dog.catchingFlyDisc();

}elseif(petinstanceofPenguin){

Penguinpgn=(Penguin)pet;

pgn.swimming();

}

}}publicclassTestPoly2{publicstaticvoidmain(String[]args){//Petpet=newPenguin("楠楠","Q妹");

Petpet=newDog("歐歐","雪娜瑞");

pet.eat();

if(petinstanceofDog){Dogdog=(Dog)pet;dog.catchingFlyDisc();}elseif(petinstanceofPenguin){Penguinpgn=(Penguin)pet;pgn.swimming();}}}指導(dǎo)——實(shí)現(xiàn)喂養(yǎng)寵物功能2-1訓(xùn)練要點(diǎn):子類(lèi)到父類(lèi)的自動(dòng)類(lèi)型轉(zhuǎn)換使用父類(lèi)作為方法形參實(shí)現(xiàn)多態(tài)多態(tài)可以減少代碼量,可以提高代碼的可擴(kuò)展性和可維護(hù)性需求說(shuō)明:實(shí)現(xiàn)喂養(yǎng)寵物功能不同寵物吃的東西不同主人可以喂養(yǎng)不同類(lèi)型寵物講解需求說(shuō)明指導(dǎo)——實(shí)現(xiàn)喂養(yǎng)寵物功能2-2實(shí)現(xiàn)思路:在Pet類(lèi)添加吃飯的抽象方法子類(lèi)實(shí)現(xiàn)吃飯方法Master類(lèi)編寫(xiě)喂養(yǎng)方法,使用Pet類(lèi)型作為參數(shù)運(yùn)行時(shí),調(diào)用喂養(yǎng)方法時(shí),傳遞一個(gè)子類(lèi)的對(duì)象publicclassPet{protectedabstractvoideat();}publicPetfeed(Petpet){pet.eat();}publicclassDogextendsPet{publicvoideat(){super.health=super.health+3;}}Pet類(lèi)Dog類(lèi)Master類(lèi)完成時(shí)間:25分鐘練習(xí)——實(shí)現(xiàn)與寵物玩耍功能需求說(shuō)明:主人和狗狗玩接飛盤(pán)游戲,狗狗健康值減少10,與主人親密度增加5主人和企鵝玩游泳游戲,企鵝健康值減少10,與主人親密度增加5提示:Dog類(lèi)添加catchingFlyDisc()方法,實(shí)現(xiàn)接飛盤(pán)功能Penguin類(lèi)添加swimming()方法,實(shí)現(xiàn)游泳功能主人添加play(Petpet)方法如果pet代表Dog就玩接飛盤(pán)游戲如果pet代表Penguin就玩游泳游戲完成時(shí)間:25分鐘小結(jié)什么是多態(tài)?使用的多態(tài)有什么好處?指導(dǎo)——計(jì)算總租金2-1訓(xùn)練要點(diǎn):多態(tài)的使用使用父類(lèi)類(lèi)型作為方法參數(shù)需求說(shuō)明:在前面汽車(chē)租賃系統(tǒng)的基礎(chǔ)上,實(shí)現(xiàn)計(jì)算多種車(chē)輛總租金的功能現(xiàn)在有客戶租用:2輛寶馬1輛別克商務(wù)艙1輛金龍(34)座租5天共多少租金?講解需求說(shuō)明指導(dǎo)——計(jì)算總租金2-2實(shí)現(xiàn)思路:完成時(shí)間:35分鐘MotoVehile[]motos=newMotoVehile[4];motos[0]=newCar("寶馬550i","京NY28588");motos[1]=newCar("寶馬550i","京NNN328");motos[2]=newCar("別克林蔭大道","京NY28588");motos[3]=newBus("金龍",34);1、創(chuàng)建車(chē)的對(duì)象,放在數(shù)組中CalcTotalRent(MotoVehile[]motos){doubletotalRent=0.0D;for(inti=0;i<motos.length;++i){totalRent+=motos[i].CalRent(5);}returntotalRent;}2、循環(huán)調(diào)用CalcRent方法,計(jì)算總租金小結(jié)為什么可以實(shí)現(xiàn)這樣的效果?再次理解什么是多態(tài)?再次理解多態(tài)有什么好處?指導(dǎo)——購(gòu)置

溫馨提示

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