抽象類的定義及使用_第1頁(yè)
抽象類的定義及使用_第2頁(yè)
抽象類的定義及使用_第3頁(yè)
抽象類的定義及使用_第4頁(yè)
抽象類的定義及使用_第5頁(yè)
已閱讀5頁(yè),還剩5頁(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)介

1、1、課程名稱:抽象類的定義及使用抽象類的定義及使用ATIONINFRASTRURUNTIMECOMPUTECONTENT2、知識(shí)點(diǎn)2.1、 上次課程的主要知識(shí)點(diǎn)對(duì)象多態(tài)性總結(jié)如下: 向上轉(zhuǎn)型(90%):為了實(shí)現(xiàn)參數(shù)類型的統(tǒng)一,但是向上轉(zhuǎn)型一定要與方法覆寫產(chǎn)生關(guān)聯(lián); 向下轉(zhuǎn)型(1%):為了調(diào)用子類特殊的方法實(shí)現(xiàn),但是向下轉(zhuǎn)型前必須要首先發(fā)生向上轉(zhuǎn)型,會(huì)存在操作的安全隱患,可以使用instanceof進(jìn)行判斷,但是不推薦這樣使用; 不轉(zhuǎn)型(9%):為了方便操作直接使用系統(tǒng)類或者是一些功能類,例如:String簡(jiǎn)單Java類。2.2、 本次預(yù)計(jì)講解的知識(shí)點(diǎn)1、 抽象類的基本定義;2、 抽象類的使用原

2、則。3、具體內(nèi)容()不會(huì)抽象類與接口,Java=沒(méi)學(xué)第(1)頁(yè)共(9)頁(yè)3.1、 抽象類的基本概念abstract關(guān)鍵字來(lái)進(jìn)行抽象方法的定義,而如果說(shuō)現(xiàn)在在一個(gè)類之中需要定義一個(gè)沒(méi)有方法體的方法,那么可以利用包含有抽象方法的類就可以使用abstract來(lái)定義成為抽象類。print()類的核心組成:屬性、方法,但是在學(xué)習(xí)完繼承操作之后,會(huì)發(fā)現(xiàn)子類存在有一種覆寫父類方法的機(jī)制,而且這一機(jī)制直接與對(duì)象的多態(tài)性有關(guān)。于是這樣就會(huì)出現(xiàn)一個(gè)問(wèn)題:假設(shè)現(xiàn)在使用的是普通類,并且在這個(gè)類里面有一個(gè)方法print()。classApublicvoidprint()System.out.println(HelloW

3、orld!);但是這個(gè)A類在設(shè)計(jì)之初有一個(gè)要求,希望繼承它的子類一定要覆寫這個(gè)print()方法。但事實(shí)上,這個(gè)時(shí)候的子類完全可以靈活的選擇是否需要覆寫方法。但是由于只是一個(gè)普通方法,所以對(duì)于子類是否覆寫沒(méi)有任何的要求,于是這樣就會(huì)出現(xiàn)一個(gè)漏洞,父類無(wú)法強(qiáng)制要求子類覆寫方法。如果只依靠普通類的繼承,那么根本就不能夠?qū)ψ宇惍a(chǎn)生限制,所以就可以利用抽象類和抽象方法來(lái)解決此類問(wèn)題。范例:定義抽象類abstractclassApublicvoidfun()System.out.println(*);publicabstractvoidprint();/沒(méi)有方法體,使用abstract聲明抽象方法的特點(diǎn)

4、:一個(gè)是使用了abstract關(guān)鍵字定義,另外一個(gè)是方法的后面沒(méi)有“”,表示沒(méi)有方法體。范例:錯(cuò)誤的使用抽象類publicclassTestDemopublicstaticvoidmain(Stringargs口)Aa=newA();本處直接采用了關(guān)鍵字new實(shí)例化了抽象類對(duì)象,但是在程序編譯的時(shí)候就會(huì)出現(xiàn)如下的錯(cuò)誤提示信息。抽象類是不能夠直接進(jìn)行對(duì)象實(shí)例化操作的。因?yàn)橐坏╊惖膶?duì)象實(shí)例化了,就意味著可以調(diào)用類中的所有方法了,但是抽象方法只是一個(gè)聲明,并沒(méi)有具體的方法體。所以在實(shí)際的開發(fā)之中,對(duì)于抽象類的使用原則如下: 抽象類必須有子類,子類利用extends關(guān)鍵字來(lái)繼承抽象類,一個(gè)子類只能夠繼

5、承一個(gè)父類; 抽象類的子類(如果不是抽象類),那么必須要覆寫抽象類中的全部抽象方法; 抽象類可以利用對(duì)象的向上轉(zhuǎn)型機(jī)制,通過(guò)子類對(duì)象進(jìn)行實(shí)例化操作。第(2)頁(yè)共(9)頁(yè)abstractclassApublicvoidfun()System.out.println(*“publicabstractvoidprint();/沒(méi)有方法體,使用abstract聲明classBextendsApublicvoidprint()System.out.println(這個(gè)方法是強(qiáng)制子類要覆寫的方法。);publicclassTestDemopublicstaticvoidmain(Stringargs口)A

6、a=newB();/向上轉(zhuǎn)型a.print();/被子類所覆寫過(guò)的方法QBffSS:C:Windavw4yst*m32emd.#k*true你好E:m9demojauacTestDemo.jauaE:mydemojauaTestDemo這個(gè)方法是強(qiáng)制子類要覆寫的方法。抽象類與普通類相比最大的好處是強(qiáng)制定義了子類的實(shí)現(xiàn)要求。本質(zhì)上講抽象類就是比普通類多了一些抽象方法的定義而已。在實(shí)際的設(shè)計(jì)之中,父類的設(shè)計(jì)是最重要的,普通類與抽象類相比,明顯抽象類的約束更加的嚴(yán)格,所以在實(shí)際的開發(fā)之中,不會(huì)幾乎不會(huì)出現(xiàn)普通類定義子類的情況,大多數(shù)都是繼承抽象類。3.2、 抽象類的相關(guān)說(shuō)明整個(gè)的設(shè)計(jì)結(jié)構(gòu)里面多了抽象

7、類的定義,那么多了一個(gè)定義之后,就需要與原始的結(jié)構(gòu)有一些對(duì)比。1、 抽象類不能使用final關(guān)鍵字來(lái)定義,因?yàn)槌橄箢惐仨氂凶宇悾鴉inal不能子類;2、 抽象類就是比普通類多了抽象方法而已,但是普通類中的所有結(jié)構(gòu)抽象類都可以定義,包括:普通方法、構(gòu)造方法、屬性、常量等內(nèi)容,而且子類對(duì)戲那個(gè)也符合于對(duì)象實(shí)例化流程,默認(rèn)先調(diào)用父類中的無(wú)參構(gòu)造,而后再執(zhí)行子類自己的構(gòu)造。abstractclassApublicstaticfinalStringINFO=HELLO;publicA()this.fun();publicvoidfun()System.out.println(*“第(3)頁(yè)共(9)頁(yè))

8、publicabstractvoidprint();/沒(méi)有方法體,使用abstract聲明)classBextendsApublicvoidprint()System.out.println(這個(gè)方法是強(qiáng)制子類要覆寫的方法。);)publicclassTestDemopublicstaticvoidmain(Stringargs口)Aa=newB();/向上轉(zhuǎn)型a.print();/被子類所覆寫過(guò)的方法)SBC;WindciArs5yst*m32errid.tx*這個(gè)方法是強(qiáng)制子類要覆寫的方法。E:mydemojauacTestDemo.jauaE:mgdQii0jauaTostD&itio*

9、關(guān)*MW舞*MMX聶*景美XXM*興*景這個(gè)方法是強(qiáng)制子類要覆寫的方法.E:mgdemo范例:思考題abstractclassApublicA()/2、默認(rèn)調(diào)用父類構(gòu)造this.print();/3、調(diào)用print()方法)publicabstractvoidprint();/沒(méi)有方法體,使用abstract聲明)classBextendsAprivateintnum=50;publicB(intnum)/1、傳遞內(nèi)容過(guò)來(lái),在子類對(duì)象實(shí)例化前先實(shí)例化父類對(duì)象this.num=num;)publicvoidprint()/4、調(diào)用此方法執(zhí)行,但是此時(shí)子類對(duì)象還未實(shí)例化,內(nèi)容沒(méi)有賦值System.

10、out.println(num=+this.num);/5、只能夠輸出對(duì)應(yīng)數(shù)據(jù)的類型默認(rèn)值)publicclassTestDemopublicstaticvoidmain(Stringargs)newB(100);)第(4)頁(yè)共(9)頁(yè)本程序的解決關(guān)鍵思路:子類對(duì)象實(shí)例化前一定要先實(shí)例化父類對(duì)象,也就是說(shuō)此時(shí),子類對(duì)象的屬性都沒(méi)有內(nèi)容。3、 抽象類中可以沒(méi)有抽象方法,但是依然不可能使用關(guān)鍵字new進(jìn)行對(duì)象的實(shí)例化操作;abstractclassA)publicclassTestDemopublicstaticvoidmain(Stringargs)Aa=newA();)FEH哲理員:C:Win

11、doiArsXiysternS2tmd0回|停媼num-9E:mydenojauacTestDemo.jauaTestDemoJaua:S;錯(cuò)誤:口是抽象的;無(wú)法實(shí)例化Aa=nowA();八1個(gè)錯(cuò)誤3E:mydemo/_1“II因?yàn)轭怉上存在有abstract關(guān)鍵字,所以此處無(wú)法進(jìn)行對(duì)象的直接實(shí)例化。4、 外部抽象類上不允許使用static聲明,但是內(nèi)部抽象類中可以使用static聲明,這樣表明的是一個(gè)外部抽象類;范例:定義普通的內(nèi)部抽象類abstractclassApublicabstractvoidprintA();abstractclassBpublicabstractvoidprint

12、B();)classXextendsApublicvoidprintA()classYextendsBpublicvoidprintB()范例:在內(nèi)部抽象類中使用staticabstractclassApublicabstractvoidprintA();staticabstractclassB第(5)頁(yè)共(9)頁(yè)publicabstractvoidprintB();)classXextendsA.BpublicvoidprintB()5、 抽象類中可以存在有static方法,而且static方法不受實(shí)例化對(duì)象的控制范例:直接通過(guò)抽象類產(chǎn)生實(shí)例化對(duì)象abstractclassA/此類設(shè)計(jì)之初考

13、慮到N年后的發(fā)展,需要有子類,但是N年前不需要子類publicabstractvoidprintA();privatestaticclassBextendsA在A類里面直接定義實(shí)現(xiàn)的子類publicvoidprintA()System.out.println(HelloWorld.);publicstaticAgetInstance()returnnewB();classCextendsApublicvoidprintA()System.out.println(*“publicclassTestDemopublicstaticvoidmain(Stringargs)Aa=A.getInstan

14、ce();a.printA();Aa1=newC();/留給用戶做的a1.printA();日后如果發(fā)現(xiàn),在系統(tǒng)類庫(kù)中有某個(gè)抽象類可以直接利用一個(gè)static方法取得實(shí)例化對(duì)象的時(shí)候不要覺得陌生。以上出現(xiàn)的幾種形式有一些是在后面講解系統(tǒng)類庫(kù)中會(huì)出現(xiàn)的問(wèn)題,現(xiàn)階段看看就完了3.3、 抽象類實(shí)際應(yīng)用一一模版設(shè)計(jì)模式清楚了抽象類產(chǎn)生動(dòng)機(jī)以及抽象類的使用之后,下面就必須搞清楚一個(gè)問(wèn)題,抽象類與普通類到底有那些區(qū)別?現(xiàn)在假設(shè)有三個(gè)物種:機(jī)器人:補(bǔ)充能量+工作;,人:吃飯+工作+睡覺;豬:吃+睡覺。現(xiàn)在要求實(shí)現(xiàn)一種命令的模式,不管是何種物種,只要傳遞指定的指令就可以進(jìn)行操作。第(6)頁(yè)共(9)頁(yè)命令處理范

15、例:實(shí)現(xiàn)程序操作abstractclassAction/定義的是行為,行為一定不是具體的publicstaticfinalintEAT=1;publicstaticfinalintSLEEP=2;publicstaticfinalintWORK=5;publicvoidcommand(intflag)/執(zhí)行命令switch(flag)/數(shù)值用switch判斷最好caseEAT:this.eat();break;caseSLEEP:this.sleep();break;caseWORK:this.work();break;publicabstractvoideat();/因?yàn)檫@些具體的行為如何執(zhí)

16、行不知道publicabstractvoidsleep();/交由子類根據(jù)自己的實(shí)際情況完成publicabstractvoidwork();范例:定義子類classRobotextendsActionpublicvoideat()第(7)頁(yè)共(9)頁(yè)System.out.println(機(jī)器人補(bǔ)充能量);)publicvoidsleep()publicvoidwork()System.out.println(機(jī)器人正在工作);classPersonextendsActionpublicvoideat()System.out.println(人在吃飯);publicvoidsleep()Sys

17、tem.out.println(人在休息”);publicvoidwork()System.out.println(人在努力工作);classPigextendsActionpublicvoideat()System.out.println(豬在啃食槽);publicvoidsleep()System.out.println(豬在養(yǎng)膘);publicvoidwork()不同的子類有著自己不同的操作支持。范例:程序測(cè)試publicclassTestDemopublicstaticvoidmain(Stringargs口)fun(newPig();System.out.println(*);fun(newRobot();System.out.println(*);/接收的是行為fun(newPerson();publicstaticvoidfun(Actionact)act.eat();act.sleep();act.work();第(8)頁(yè)共(9)頁(yè)厘為CWindo5ystern32tmd.ex*|;回E:rnydemojauaTestDeno豬在啃食槽豬在養(yǎng)膘機(jī)器人補(bǔ)充能量機(jī)器人正在工作MMXMXMMMXMXKXMMMXMKXXXM3HEMMXMMKKXMXMMMMMXKXXX人在吃飯

溫馨提示

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