freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)中英對(duì)照外文翻譯-對(duì)象的創(chuàng)建和存在時(shí)間-資料下載頁

2025-01-13 18:02本頁面
  

【正文】 的對(duì)象。用于解決特定問題的新型對(duì)象容納了指向其他對(duì)象的句柄。當(dāng)然,也可以用數(shù)組來做同樣的事情,那是大多數(shù)語言都具有的一種功能。但不能只看到這一點(diǎn)。這種新對(duì)象通常叫作“集合”(亦叫作一個(gè)“容器”,但AWT在不同的場(chǎng)合應(yīng)用了這個(gè)術(shù)語,所以本書將一直沿用“集合”的稱呼。在需要的時(shí)候,集合會(huì)自動(dòng)擴(kuò)充自己,以便適應(yīng)我們?cè)谄渲兄萌氲娜魏螙|西。所以我們事先不必知道要在一個(gè)集合里容下多少東西。只需創(chuàng)建一個(gè)集合,以后的工作讓它自己負(fù)責(zé)好了。幸運(yùn)的是,設(shè)計(jì)優(yōu)良的OOP語言都配套提供了一系列集合。在C++中,它們是以“標(biāo)準(zhǔn)模板庫”(STL)的形式提供的。Object Pascal用自己的“可視組件庫”(VCL)提供集合。Smalltalk提供了一套非常完整的集合。而Java也用自己的標(biāo)準(zhǔn)庫提供了集合。在某些庫中,一個(gè)常規(guī)集合便可滿足人們的大多數(shù)要求;而在另一些庫中(特別是C++的庫),則面向不同的需求提供了不同類型的集合。例如,可以用一個(gè)矢量統(tǒng)一對(duì)所有元素的訪問方式;一個(gè)鏈接列表則用于保證所有元素的插入統(tǒng)一。所以我們能根據(jù)自己的需要選擇適當(dāng)?shù)念愋?。其中包括集、?duì)列、散列表、樹、堆棧等等。所有集合都提供了相應(yīng)的讀寫功能。將某樣?xùn)|西置入集合時(shí),采用的方式是十分明顯的。有一個(gè)叫作“推”(Push)、“添加”(Add)或其他類似名字的函數(shù)用于做這件事情。但將數(shù)據(jù)從集合中取出的時(shí)候,方式卻并不總是那么明顯。如果是一個(gè)數(shù)組形式的實(shí)體,比如一個(gè)矢量(Vector),那么也許能用索引運(yùn)算符或函數(shù)。但在許多情況下,這樣做往往會(huì)無功而返。此外,單選定函數(shù)的功能是非常有限的。如果想對(duì)集合中的一系列元素進(jìn)行操縱或比較,而不是僅僅面向一個(gè),這時(shí)又該怎么辦呢?辦法就是使用一個(gè)“繼續(xù)器”(Iterator),它屬于一種對(duì)象,負(fù)責(zé)選擇集合內(nèi)的元素,并把它們提供給繼承器的用戶。作為一個(gè)類,它也提供了一級(jí)抽象。利用這一級(jí)抽象,可將集合細(xì)節(jié)與用于訪問那個(gè)集合的代碼隔離開。通過繼承器的作用,集合被抽象成一個(gè)簡(jiǎn)單的序列。繼承器允許我們遍歷那個(gè)序列,同時(shí)毋需關(guān)心基礎(chǔ)結(jié)構(gòu)是什么——換言之,不管它是一個(gè)矢量、一個(gè)鏈接列表、一個(gè)堆棧,還是其他什么東西。這樣一來,我們就可以靈活地改變基礎(chǔ)數(shù)據(jù),不會(huì)對(duì)程序里的代碼造成干擾。Java最開始()提供的是一個(gè)標(biāo)準(zhǔn)繼承器,名為Enumeration(枚舉),為它的所有集合類提供服務(wù)。Java ,其中包含了一個(gè)名為Iterator的繼承器,可以做比老式的Enumeration更多的事情。從設(shè)計(jì)角度出發(fā),我們需要的是一個(gè)全功能的序列。通過對(duì)它的操縱,應(yīng)該能解決自己的問題。如果一種類型的序列即可滿足我們的所有要求,那么完全沒有必要再換用不同的類型。有兩方面的原因促使我們需要對(duì)集合作出選擇。首先,集合提供了不同的接口類型以及外部行為。堆棧的接口與行為與隊(duì)列的不同,而隊(duì)列的接口與行為又與一個(gè)集(Set)或列表的不同。利用這個(gè)特征,我們解決問題時(shí)便有更大的靈活性。其次,不同的集合在進(jìn)行特定操作時(shí)往往有不同的效率。最好的例子便是矢量(Vector)和列表(List)的區(qū)別。它們都屬于簡(jiǎn)單的序列,擁有完全一致的接口和外部行為。但在執(zhí)行一些特定的任務(wù)時(shí),需要的開銷卻是完全不同的。對(duì)矢量?jī)?nèi)的元素進(jìn)行的隨機(jī)訪問(存?。┦且环N常時(shí)操作;無論我們選擇的選擇是什么,需要的時(shí)間量都是相同的。但在一個(gè)鏈接列表中,若想到處移動(dòng),并隨機(jī)挑選一個(gè)元素,就需付出“慘重”的代價(jià)。而且假設(shè)某個(gè)元素位于列表較遠(yuǎn)的地方,找到它所需的時(shí)間也會(huì)長(zhǎng)許多。但在另一方面,如果想在序列中部插入一個(gè)元素,用列表就比用矢量劃算得多。這些以及其他操作都有不同的執(zhí)行效率,具體取決于序列的基礎(chǔ)結(jié)構(gòu)是什么。在設(shè)計(jì)階段,我們可以先從一個(gè)列表開始。最后調(diào)整性能的時(shí)候,再根據(jù)情況把它換成矢量。由于抽象是通過繼承器進(jìn)行的,所以能在兩者方便地切換,對(duì)代碼的影響則顯得微不足道。最后,記住集合只是一個(gè)用來放置對(duì)象的儲(chǔ)藏所。如果那個(gè)儲(chǔ)藏所能滿足我們的所有需要,就完全沒必要關(guān)心它具體是如何實(shí)現(xiàn)的(這是大多數(shù)類型對(duì)象的一個(gè)基本概念)。如果在一個(gè)編程環(huán)境中工作,它由于其他因素(比如在Windows下運(yùn)行,或者由垃圾收集器帶來了開銷)產(chǎn)生了內(nèi)在的開銷,那么矢量和鏈接列表之間在系統(tǒng)開銷上的差異就或許不是一個(gè)大問題。我們可能只需要一種類型的序列。甚至可以想象有一個(gè)“完美”的集合抽象,它能根據(jù)自己的使用方式自動(dòng)改變基層的實(shí)現(xiàn)方式。2 單根結(jié)構(gòu)在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,由于C++的引入而顯得尤為突出的一個(gè)問題是:所有類最終是否都應(yīng)從單獨(dú)一個(gè)基礎(chǔ)類繼承。在Java中(與其他幾乎所有OOP語言一樣),對(duì)這個(gè)問題的答案都是肯定的,而且這個(gè)終級(jí)基礎(chǔ)類的名字很簡(jiǎn)單,就是一個(gè)“Object”。這種“單根結(jié)構(gòu)”具有許多方面的優(yōu)點(diǎn)。單根結(jié)構(gòu)中的所有對(duì)象都有一個(gè)通用接口,所以它們最終都屬于相同的類型。另一種方案(就象C++那樣)是我們不能保證所有東西都屬于相同的基本類型。從向后兼容的角度看,這一方案可與C模型更好地配合,而且可以認(rèn)為它的限制更少一些。但假期我們想進(jìn)行純粹的面向?qū)ο缶幊?,那么必須?gòu)建自己的結(jié)構(gòu),以期獲得與內(nèi)建到其他OOP語言里的同樣的便利。需添加我們要用到的各種新類庫,還要使用另一些不兼容的接口。理所當(dāng)然地,這也需要付出額外的精力使新接口與自己的設(shè)計(jì)方案配合(可能還需要多重繼承)。為得到C++額外的“靈活性”,付出這樣的代價(jià)值得嗎?當(dāng)然,如果真的需要——如果早已是C專家,如果對(duì)C有難舍的情結(jié)——那么就真的很值得。但假如你是一名新手,首次接觸這類設(shè)計(jì),象Java那樣的替換方案也許會(huì)更省事一些。單根結(jié)構(gòu)中的所有對(duì)象(比如所有Java對(duì)象)都可以保證擁有一些特定的功能。在自己的系統(tǒng)中,我們知道對(duì)每個(gè)對(duì)象都能進(jìn)行一些基本操作。一個(gè)單根結(jié)構(gòu),加上所有對(duì)象都在內(nèi)存堆中創(chuàng)建,可以極大簡(jiǎn)化參數(shù)的傳遞(這在C++里是一個(gè)復(fù)雜的概念)。利用單根結(jié)構(gòu),我們可以更方便地實(shí)現(xiàn)一個(gè)垃圾收集器。與此有關(guān)的必要支持可安裝于基礎(chǔ)類中,而垃圾收集器可將適當(dāng)?shù)南l(fā)給系統(tǒng)內(nèi)的任何對(duì)象。如果沒有這種單根結(jié)構(gòu),而且系統(tǒng)通過一個(gè)句柄來操縱對(duì)象,那么實(shí)現(xiàn)垃圾收集器的途徑會(huì)有很大的不同,而且會(huì)面臨許多障礙。由于運(yùn)行期的類型信息肯定存在于所有對(duì)象中,所以永遠(yuǎn)不會(huì)遇到判斷不出一個(gè)對(duì)象的類型的情況。這對(duì)系統(tǒng)級(jí)的操作來說顯得特別重要,比如違例控制;而且也能在程序設(shè)計(jì)時(shí)獲得更大的靈活性。3 集合庫與方便使用集合由于集合是我們經(jīng)常都要用到的一種工具,所以一個(gè)集合庫是十分必要的,它應(yīng)該可以方便地重復(fù)使用。這樣一來,我們就可以方便地取用各種集合,將其插入自己的程序。Java提供了這樣的一個(gè)庫,盡管它在Java (Java )。下溯造型與模板/通用性為了使這些集合能夠重復(fù)使用,或者“再生”,Java提供了一種通用類型,以前曾把它叫作“Object”。單根結(jié)構(gòu)意味著、所有東西歸根結(jié)底都是一個(gè)對(duì)象”!所以容納了Object的一個(gè)集合實(shí)際可以容納任何東西。這使我們對(duì)它的重復(fù)使用變得非常簡(jiǎn)便。為使用這樣的一個(gè)集合,只需添加指向它的對(duì)象句柄即可,以后可以通過句柄重新使用對(duì)象。但由于集合只能容納Object,所以在我們向集合里添加對(duì)象句柄時(shí),它會(huì)上溯造型成Object,這樣便丟失了它的身份或者標(biāo)識(shí)信息。再次使用它的時(shí)候,會(huì)得到一個(gè)Object句柄,而非指向我們?cè)缦戎萌氲哪莻€(gè)類型的句柄。所以怎樣才能歸還它的本來面貌,調(diào)用早先置入集合的那個(gè)對(duì)象的有用接口呢?在這里,我們?cè)俅斡玫搅嗽煨停–ast)。但這一次不是在分級(jí)結(jié)構(gòu)中上溯造型成一種更“通用”的類型。而是下溯造型成一種更“特殊”的類型。這種造型方法叫作“下溯造型”(Downcasting)。舉個(gè)例子來說,我們知道在上溯造型的時(shí)候,Circle(圓)屬于Shape(幾何形狀)的一種類型,所以上溯造型是安全的。但我們不知道一個(gè)Object到底是Circle還是Shape,所以很難保證下溯造型的安全進(jìn)行,除非確切地知道自己要操作的是什么。但這也不是絕對(duì)危險(xiǎn)的,因?yàn)榧偃缦滤菰煨统慑e(cuò)誤的東西,會(huì)得到我們稱為“違例”(Exception)的一種運(yùn)行期錯(cuò)誤。我們稍后即會(huì)對(duì)此進(jìn)行解釋。但在從一個(gè)集合提取對(duì)象句柄時(shí),必須用某種方式準(zhǔn)確地記住它們是什么,以保證下溯造型的正確進(jìn)行。下溯造型和運(yùn)行期檢查都要求花額外的時(shí)間來運(yùn)行程序,而且程序員必須付出額外的精力。既然如此,我們能不能創(chuàng)建一個(gè)“智能”集合,令其知道自己容納的類型呢?這樣做可消除下溯造型的必要以及潛在的錯(cuò)誤。答案是肯定的,我們可以采用“參數(shù)化類型”,它們是編譯器能自動(dòng)定制的類,可與特定的類型配合。例如,通過使用一個(gè)參數(shù)化集合,編譯器可對(duì)那個(gè)集合進(jìn)行定制,使其只接受Shape,而且只提取Shape。參數(shù)化類型是C++一個(gè)重要的組成部分,這部分是C++沒有單根結(jié)構(gòu)的緣故。在C++中,用于實(shí)現(xiàn)參數(shù)化類型的關(guān)鍵字是template(模板)。Java目前尚未提供參數(shù)化類型,因?yàn)橛捎谑褂玫氖菃胃Y(jié)構(gòu),所以使用它顯得有些笨拙。但這并不能保證以后的版本不會(huì)實(shí)現(xiàn),因?yàn)椤癵eneric”這個(gè)詞已被Java“保留到將來實(shí)現(xiàn)”(在Ada語言中,“generic”被用來實(shí)現(xiàn)它的模板)。Java采取的這種關(guān)鍵字保留機(jī)制其實(shí)經(jīng)常讓人摸不著頭腦,很難斷定以后會(huì)發(fā)生什么事情。
點(diǎn)擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1