java編程思想版第7章多形性_第1頁
java編程思想版第7章多形性_第2頁
java編程思想版第7章多形性_第3頁
java編程思想版第7章多形性_第4頁
java編程思想版第7章多形性_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

7(Polymorphism33.1.2:252-253其中,方法Music.tune()接收一個(gè)Instrument句柄,同時(shí)也接收從tune()簡WindInstrument(樂器:253-254這樣做當(dāng)然行得通,但卻存在一個(gè)極大的弊端:必須為每種新增的難管理,有失控的。對(duì)于Music.java的性可通過運(yùn)行程序加以體會(huì)輸出是Wind.y()。tune()方法:publicstaticvoidtune(Instrumenti)//i.}它接收Instrument句柄。所以在這種情況下,編譯器怎樣才能知道無從得知。為了深入了理解這個(gè)問題,我們有必要探討一下“綁定”這個(gè)(Binding程序運(yùn)行以前執(zhí)行綁定(由編譯器和程序,如果有的話,就叫作“早期綁定。大家以前或許從未聽這個(gè)術(shù)語,因?yàn)樗谌魏纬绦蚧Z言里都是不可能的。C編譯器只有法調(diào)用,那就是“早期綁定。上述程序最令人迷惑不解的地方全與早期綁定有關(guān),因?yàn)樵谥挥幸粋€(gè)Instrument句柄的前提下,編譯器不知體該調(diào)用哪個(gè)方法Java中綁定的所有方法都采用后期綁定技術(shù),除非一個(gè)方法已被成為什么要把一個(gè)方法成final呢?正如上一章的那樣,它能防止其知道Java里綁定的所有方法都通過后期綁定具有多形性以后,就可以相應(yīng)代碼正常地工作。或者換用另法,我們可以“將一條消息發(fā)給一個(gè)對(duì)象,OOPSquar(Triangl(257Shapes=new面看起來似乎屬于錯(cuò)誤操作(將一種類型分配給另一個(gè)當(dāng)我們調(diào)用其中一個(gè)基礎(chǔ)類方法時(shí)(已在衍生類里覆蓋柄。那么編譯器怎樣才能知道該做其他任何事情呢?但此時(shí)實(shí)際調(diào)用的是257-258returnCircle,SquareShapemain()ShaperandShape()的調(diào)Shape,但不知除此之外任何具體的情(編譯器同樣不知draw()259候發(fā)出正確的調(diào)用,編譯器毋需獲得任何特殊的。對(duì)draw()的所有調(diào)用都true()方法。在求,那么對(duì)基礎(chǔ)類接口進(jìn)行的方法根本不需要改變,260即使tune()位于一個(gè)獨(dú)立的文件里,而將新方法添加到Instrument的接口,260-262Instrument3。法y()的接口會(huì)在被覆蓋的過程中發(fā)生變化。這意味著我們實(shí)際并沒有“覆263這里還向大家引入了另一個(gè)易于的概念。在InstrumentX中,y()方WindX中,y()采用一個(gè)NoteX句柄它有一個(gè)標(biāo)識(shí)符n即便我們使“y(NoteXNoteX)”JavanoteX,這樣可把它與類名區(qū)分開?!癐nstrumentX(MIDDLE_CintInstrumentX.Instrument對(duì)所有與基礎(chǔ)類的簽名相符的衍生類方法都可以通過動(dòng)態(tài)綁定機(jī)制進(jìn)行調(diào)Instrumentvoid象方法,類就必須指定成(抽象。否則,編譯器會(huì)向我們報(bào)告一條出即使不包括任何方法,亦可將一個(gè)類成“抽象類。如果一個(gè)266266-268staticfinalinterfacepublic(同名的一個(gè)文件內(nèi)269可決定將一個(gè)接口中的方法明確定義“public”但即便不明確定義,它們也會(huì)默認(rèn)為public。所以在實(shí)現(xiàn)一個(gè)接,來自接口的方法必須定中對(duì)一個(gè)方法的——Java編譯器不允許我們那樣做。在Instrument例子的修本中,大家可明確地看出這一點(diǎn)。注意接口中的每個(gè)方法都嚴(yán)格地是一個(gè),它是編譯器唯一允許的。除此以外,270-271Java“xJava272。。272-273fight()CanFightActionCharacterHerofight()提供一個(gè)具體的定義。接口的規(guī)則是:我們可以Herofight()ActionCharacterHero274-275DangerousMonsterMonsterDragonZillastaticfinalCC++enum275-276Javastaticfinalpublic為稱為“魔術(shù)數(shù)字,它產(chǎn)生的代碼是非常難以的。(注釋①:276-277RichHoffarthE-mailequals(),main()尾部展接口中定義的字段會(huì)自動(dòng)具有static和final277-278由于字段是static的,所以它們會(huì)在首次裝載類之后、以及首次任何278當(dāng)然,字段并不是接口的一部分,而是保存于那個(gè)接口的 區(qū)可控制一個(gè)類在另一個(gè)類里的“可見性。然而,須認(rèn)識(shí)到內(nèi)部類與以前(33.1.2278-279若在ship(),內(nèi)部類的使用看起來和其他任何類都沒什么分別。在279-280若想在除外部類非staticmain()中展示的那樣。有些大題小做。Java(280-281所以除了Parcel3之外,其他任何東西都不能它。PDestination被設(shè)為其他任何東西都不能PDestination。這意味著客戶程序員對(duì)這些成員的認(rèn)(protected,因?yàn)槲覀儾荒躢lassTestprivate計(jì)人員可完全其他人依賴類型編碼,并可將具體的實(shí)施細(xì)節(jié)完全隱。能不屬于公共接口類的任何額外方法。這樣一來,Java編譯器也有機(jī)會(huì)生普通(非內(nèi)部)privateprotected——publicContents一個(gè)類,用于實(shí)現(xiàn)一個(gè)接一個(gè)類,用于擴(kuò)展擁有非默認(rèn)構(gòu)建器的一個(gè)一個(gè)類,用于執(zhí)行字段初始一個(gè)類,通過實(shí)例初始化進(jìn)行構(gòu)建(內(nèi)部類不可擁有構(gòu)建器283Contents283盡管是含有具體實(shí)施細(xì)節(jié)的一個(gè)普通類,但 也作為它所有衍生283在上面的代碼中,我們注意到Wrap有一個(gè)要求使用自變量的構(gòu)建器,284意可為相同內(nèi)每個(gè)類內(nèi)部的一個(gè)內(nèi)部類使用類標(biāo)識(shí)符PDestination,這樣Destination284-285TrackingSlipif285除此以外,這個(gè)類是的——它沒有名字。而且看起來似乎更讓人摸不著頭腦ContentsreturnnewreturnnewContents(){privateinti=11;publicintvalue(){returni;?!?。classMyContentsextendsContents{privateinti=11;publicintvalue(){returni;}returnnew286-287“newWrap(x)”中傳遞x類不能擁有一個(gè)構(gòu)建器這和在調(diào)用super()述的兩個(gè)例子中,分號(hào)并不標(biāo)志著類主體的結(jié)束(C++不同。相反,它標(biāo)志著用于包含類的那個(gè)表達(dá)式的結(jié)束。因此,它完全等價(jià)于在其他任何若試圖定義一個(gè)內(nèi)部類,并想使用在內(nèi)部類外部定義的一個(gè)對(duì)象,則編譯器要求外部對(duì)象為final屬性這正是dest()的自變量設(shè)為final以有效地為一個(gè)內(nèi)部類創(chuàng)建一個(gè)構(gòu)建器:(if)的一部分執(zhí)行所以實(shí)際上一個(gè)實(shí)例初始化模塊就是一個(gè)內(nèi)部類的構(gòu)建器。對(duì)象封裝或生成了內(nèi)部類)的一個(gè)。所以它們能那個(gè)封裝對(duì)象的成員— 釋②289-290在C++中,沒有指向一個(gè)封裝對(duì)象的,也不存在默認(rèn)的權(quán)限。add()SequenceSelector(end()ObjectObject內(nèi)部類必須擁有對(duì)封裝類的特定對(duì)象的一個(gè)而封裝類的作用就是創(chuàng)建這個(gè)內(nèi)部類。隨后,當(dāng)我們封裝類的一個(gè)成員時(shí),就利用那個(gè)(隱藏)的來中,要求對(duì)封裝類對(duì)象的句柄進(jìn)行初始化。若不能那個(gè)句柄,編譯器就會(huì)報(bào)staticstaticstaticstaticstatic不能從static內(nèi)部類的一個(gè)對(duì)象中一個(gè)外部類對(duì)象staticstaticstatic291-292staticContentsDestinationstatic只位于接口名空間內(nèi)部:292static292-293TestBed$Tester(為運(yùn)行程序,請(qǐng)使用“javaTestBed$Tester”命令??蓪⑦@個(gè)類用于測(cè)試,但不需在自己的最終發(fā)this舉個(gè)例子來說,在Sequence.SSelector類中,它的所有方法都能產(chǎn)生外部類Sequence的句柄,方法是采用Sequence.this的形式。結(jié)果獲得的句柄會(huì)293-294形式并外部類名Parcel11此時(shí)必須利用外部類的一個(gè)對(duì)象生成內(nèi)部類Parcel11.Contentsc=p.newstatic294-295295-296NewEgg()296-297g()y.f()f()被覆蓋版本。輸出結(jié)果如下:NewEgg2()g()f()SunJava1.1(GUI,1.1AWTGUI299訴我們何時(shí)該運(yùn)行它。當(dāng)然,ready()也可以在一個(gè)衍生類中被覆蓋,將建action()是就緒后需要調(diào)用的方法,而description()提供了與有299-300EventSet可容納100個(gè)(若在這里使用來自第8章的一個(gè)“真實(shí)”集在這里用于下一個(gè)可用的空間而next(下一個(gè)幫助我們尋找列表中的下一個(gè),了解自己是否已經(jīng)循環(huán)到頭。在對(duì)getNext()的調(diào)用中,這一點(diǎn)是至EventremoveCurrent()getNext()注意removeCurrent()并不只是指示一些標(biāo)志,對(duì)象不再使用。相反,它將句柄設(shè)為null。這一點(diǎn)是非常重要的,因?yàn)榧偃缡占靼l(fā)現(xiàn)一個(gè)句柄好將其設(shè)為null,使收集器能夠正常地清除它們。對(duì)象,而且addEvent()允許我們向這個(gè)列表加入新。但最重要的方法是run()。該方在EventSet中遍歷,搜索一個(gè)準(zhǔn)備運(yùn)行的Event對(duì)象——description(),然后將從列表中刪去?!癊ventaction(),它施細(xì)節(jié)會(huì)完全隱,可以安全地修改?,F(xiàn)在要請(qǐng)大家思考控制框架的一種具體實(shí)施方式,它設(shè)計(jì)用來控制溫室action()內(nèi)編寫相應(yīng)的控制代碼。題;原來的例子在《C++Inside&OutJavaGreenhouseControls302-305于外部類GreenhouseControls,所以內(nèi)部類可以毫無阻礙地那些字段。此action()方法也涉及到某些形式的硬件控制,這通常都要求發(fā)出對(duì)Java于多重繼承:Bell擁有Event的所有方法,而且也擁有外部類GreenhouseControlsRestart負(fù)責(zé)對(duì)系統(tǒng)進(jìn)行初始化,所以會(huì)添加所有必要的。當(dāng)然,一種個(gè)練習(xí)會(huì)要求大家修改這個(gè)例子,從而達(dá)到這個(gè)目標(biāo)Restart()僅僅是使系統(tǒng)能夠定期重啟。在main()中,我們需要做的全部事情就是創(chuàng)建一個(gè)GreenhouseControlsRestart一項(xiàng)特殊任務(wù):檢查對(duì)象是否得到了正確的構(gòu)建。一個(gè)衍生類只能它自己的成員,不能基礎(chǔ)類的成員(這些成員通常都具有private屬性。只有基礎(chǔ)306-307對(duì)自己進(jìn)行了宣布。其中最重要的類是SandwichSandwich307-308按順序調(diào)用成員初始化模塊并且能基礎(chǔ)類的任何public和protected成員。這意味著當(dāng)我們?cè)谘苌惾缓笤谶M(jìn)入衍生類構(gòu)建器以后我們?cè)诨A(chǔ)類能夠的所有成員都已(亦即通過合成方法置于類內(nèi)的對(duì)象在類內(nèi)(bcl會(huì)有助于我們確定所有基礎(chǔ)類成員以及當(dāng)前對(duì)象的成員對(duì)象均已獲得正確的初始化。但不幸的是,這種做法并不適用于所有情況,這將在下一節(jié)具體說明。finalize()方法——如果已經(jīng)設(shè)計(jì)了某個(gè)特殊的清除進(jìn)程,要求它必須作為收集的一部分進(jìn)行。覆蓋衍生類的finalize()時(shí),務(wù)必記住調(diào)用309-311是否應(yīng)調(diào)用super.finalize()。這個(gè)標(biāo)志的設(shè)置建立在命令行參數(shù)的基礎(chǔ)Characteristic以看到,無論是否調(diào)用了基礎(chǔ)類收尾模塊,Characteristic每個(gè)被覆蓋的finalize()至少要擁有對(duì)protected成員的權(quán)力,因?yàn)槌羞^程中消除權(quán)限“友好的”比“受到保護(hù)的”具有更小的權(quán)限。311Frog311-312這件事情,那么對(duì)于調(diào)用的方法,它要的成員可能尚未得到正確的初始化—在Glyph中,draw()方法是“抽象的( 覆蓋。事實(shí)上,我們?cè)赗oundGlyph中不得不對(duì)其進(jìn)行覆蓋。但Glyph構(gòu)建器會(huì)在采取其他任何操作之前,為對(duì)象分配的空間初始化成二進(jìn)制零0,這是由于步驟(1)造成的。按照原先的順序調(diào)用成員初始化代碼錯(cuò)誤會(huì)很輕易地忽略,而且要花很長的時(shí)間才能找出。final。這些方法不能被覆蓋,所以不會(huì)出現(xiàn)上述潛在的問題。315-316StageActorHappyActorgo()會(huì)產(chǎn)生特定的行為。但由于句柄在運(yùn)行期間SadActorago()act()覆蓋,如下面這所示:316317。但這種想法又屬于另一個(gè)。經(jīng)過細(xì)致的研究,我們發(fā)現(xiàn)擴(kuò)展接口對(duì)于318318重新核實(shí)對(duì)象的準(zhǔn)確類型使自己能那個(gè)類型的擴(kuò)展方法在后面的小節(jié)里,(在繼承結(jié)構(gòu)中向上移動(dòng)所以為了獲取具體的類型信息——亦即在分級(jí)結(jié)構(gòu)中向下移動(dòng)——須使用“(舉個(gè)例子來說并不真319為解決這個(gè)問題,必須有一種辦法能夠保證

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論