亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

對象的創建和存在時間

2019-11-18 12:09:48
字體:
來源:轉載
供稿:網友

  從技術角度說,OOP(面向對象程序設計)只是涉及抽象的數據類型、繼續以及多形性,但另一些問題也可能顯得非常重要。本節將就這些問題進行探討。
  最重要的問題之一是對象的創建及破壞方式。對象需要的數據位于哪兒,如何控制對象的“存在時間”呢?針對這個問題,解決的方案是各異其趣的。C++認為程序的執行效率是最重要的一個問題,所以它答應程序員作出選擇。為獲得最快的運行速度,存儲以及存在時間可在編寫程序時決定,只需將對象放置在堆棧(有時也叫作自動或定域變量)或者靜態存儲區域即可。這樣便為存儲空間的分配和釋放提供了一個優先級。某些情況下,這種優先級的控制是非常有價值的。然而,我們同時也犧牲了靈活性,因為在編寫程序時,必須知道對象的準確的數量、存在時間、以及類型。假如要解決的是一個較常規的問題,如計算機輔助設計、倉儲治理或者空中交通控制,這一方法就顯得太局限了。
  第二個方法是在一個內存池中動態創建對象,該內存池亦叫“堆”或者“內存堆”。若采用這種方式,除非進入運行期,否則根本不知道到底需要多少個對象,也不知道它們的存在時間有多長,以及準確的類型是什么。這些參數都在程序正式運行時才決定的。若需一個新對象,只需在需要它的時候在內存堆里簡單地創建它即可。由于存儲空間的治理是運行期間動態進行的,所以在內存堆里分配存儲空間的時間比在堆棧里創建的時間長得多(在堆棧里創建存儲空間一般只需要一個簡單的指令,將堆棧指針向下或向下移動即可)。由于動態創建方法使對象本來就傾向于復雜,所以查找存儲空間以及釋放它所需的額外開銷不會為對象的創建造成明顯的影響。除此以外,更大的靈活性對于常規編程問題的解決是至關重要的。
  C++答應我們決定是在寫程序時創建對象,還是在運行期間創建,這種控制方法更加靈活。大家或許認為既然它如此靈活,那么無論如何都應在內存堆里創建對象,而不是在堆棧中創建。但還要考慮另外一個問題,亦即對象的“存在時間”或者“生存時間”(Lifetime)。若在堆棧或者靜態存儲空間里創建一個對象,編譯器會判定對象的持續時間有多長,到時會自動“破壞”或者“清除”它。程序員可用兩種方法來破壞一個對象:用程序化的方式決定何時破壞對象,或者利用由運行環境提供的一種“垃圾收集器”特性,自動尋找那些不再使用的對象,并將其清除。當然,垃圾收集器顯得方便得多,但要求所有應用程序都必須容忍垃圾收集器的存在,并能默許隨垃圾收集帶來的額外開銷。但這并不符合C++語言的設計宗旨,所以未能包括到C++里。但java確實提供了一個垃圾收集器(Smalltalk也有這樣的設計;盡管Delphi默認為沒有垃圾收集器,但可選擇安裝;而C++亦可使用一些由其他公司開發的垃圾收集產品)。
  本節剩下的部分將討論操縱對象時要考慮的另一些因素。
  1 集合與繼續器
  針對一個特定問題的解決,假如事先不知道需要多少個對象,或者它們的持續時間有多長,那么也不知道如何保存那些對象。既然如此,怎樣才能知道那些對象要求多少空間呢?事先上根本無法提前知道,除非進入運行期。
  在面向對象的設計中,大多數問題的解決辦法似乎都有些輕率——只是簡單地創建另一種類型的對象。用于解決特定問題的新型對象容納了指向其他對象的句柄。當然,也可以用數組來做同樣的事情,那是大多數語言都具有的一種功能。但不能只看到這一點。這種新對象通常叫作“集合”(亦叫作一個“容器”,但AWT在不同的場合應用了這個術語,所以本書將一直沿用“集合”的稱呼。在需要的時候,集合會自動擴充自己,以便適應我們在其中置入的任何東西。所以我們事先不必知道要在一個集合里容下多少東西。只需創建一個集合,以后的工作讓它自己負責好了。
  幸運的是,設計優良的OOP語言都配套提供了一系列集合。在C++中,它們是以“標準模板庫”(STL)的形式提供的。Object Pascal用自己的“可視組件庫”(VCL)提供集合。Smalltalk提供了一套非常完整的集合。而Java也用自己的標準庫提供了集合。在某些庫中,一個常規集合便可滿足人們的大多數要求;而在另一些庫中(非凡是C++的庫),則面向不同的需求提供了不同類型的集合。例如,可以用一個矢量統一對所有元素的訪問方式;一個鏈接列表則用于保證所有元素的插入統一。所以我們能根據自己的需要選擇適當的類型。其中包括集、隊列、散列表、樹、堆棧等等。
  所有集合都提供了相應的讀寫功能。將某樣東西置入集合時,采用的方式是十分明顯的。有一個叫作“推”(Push)、“添加”(Add)或其他類似名字的函數用于做這件事情。但將數據從集合中取出的時候,方式卻并不總是那么明顯。假如是一個數組形式的實體,比如一個矢量(Vector),那么也許能用索引運算符或函數。但在許多情況下,這樣做往往會無功而返。此外,單選定函數的功能是非常有限的。假如想對集合中的一系列元素進行操縱或比較,而不是僅僅面向一個,這時又該怎么辦呢?
  辦法就是使用一個“繼續器”(Iterator),它屬于一種對象,負責選擇集合內的元素,并把它們提供給繼續器的用戶。作為一個類,它也提供了一級抽象。利用這一級抽象,可將集合細節與用于訪問那個集合的代碼隔離開。通過繼續器的作用,集合被抽象成一個簡單的序列。繼續器答應我們遍歷那個序列,同時毋需關心基礎結構是什么——換言之,不管它是一個矢量、一個鏈接列表、一個堆棧,還是其他什么東西。這樣一來,我們就可以靈活地改變基礎數據,不會對程序里的代碼造成干擾。Java最開始(在1.0和1.1版中)提供的是一個標準繼續器,名為Enumeration(枚舉),為它的所有集合類提供服務。Java 1.2新增一個更復雜的集合庫,其中包含了一個名為Iterator的繼續器,可以做比老式的Enumeration更多的事情。
  從設計角度出發,我們需要的是一個全功能的序列。通過對它的操縱,應該能解決自己的問題。假如一種類型的序列即可滿足我們的所有要求,那么完全沒有必要再換用不同的類型。有兩方面的原因促使我們需要對集合作出選擇。首先,集合提供了不同的接口類型以及外部行為。堆棧的接口與行為與隊列的不同,而隊列的接口與行為又與一個集(Set)或列表的不同。利用這個特征,我們解決問題時便有更大的靈活性。
  其次,不同的集合在進行特定操作時往往有不同的效率。最好的例子便是矢量(Vector)和列表(List)的區別。它們都屬于簡單的序列,擁有完全一致的接口和外部行為。但在執行一些特定的任務時,需要的開銷卻是完全不同的。對矢量內的元素進行的隨機訪問(存?。┦且环N常時操作;無論我們選擇的選擇是什么,需要的時間量都是相同的。但在一個鏈接列表中,若想到處移動,并隨機挑選一個元素,就需付出“慘重”的代價。而且假設某個元素位于列表較遠的地方,找到它所需的時間也會長許多。但在另一方面,假如想在序列中部插入一個元素,用列表就比用矢量劃算得多。這些以及其他操作都有不同的執行效率,具體取決于序列的基礎結構是什么。在設計階段,我們可以先從一個列表開始。最后調整性能的時候,再根據情況把它換成矢量。由于抽象是通過繼續器進行的,所以能在兩者方便地切換,對代碼的影響則顯得微不足道。
  最后,記住集合只是一個用來放置對象的儲藏所。假如那個儲藏所能滿足我們的所有需要,就完全沒必要關心它具體是如何實現的(這是大多數類型對象的一個基本概念)。假如在一個編程環境中工作,它由于其他因素(比如在Windows下運行,或者由垃圾收集器帶來了開銷)產生了內在的開銷,那么矢量和鏈接列表之間在系統開銷上的差異就或許不是一個大問題。我們可能只需要一種類型的序列。甚至可以想象有一個“完美”的集合抽象,它能根據自己的使用方式自動改變基層的實現方式。
  2 單根結構
  在面向對象的程序設計中,由于C++的引入而顯得尤為突出的一個問題是:所有類最終是否都應從單獨一個基礎類繼續。在Java中(與其他幾乎所有OOP語言一樣),對這個問題的答案都是肯定的,而且這個終級基礎類的名字很簡單,就是一個“Object”。這種“單根結構”具有許多方面的優點。
  單根結構中的所有對象都有一個通用接口,所以它們最終都屬于相同的類型。另一種方案(就象C++那樣)是我們不能保證所有東西都屬于相同的基本類型。從向后兼容的角度看,這一方案可與C模型更好地配合,而且可以認為它的限制更少一些。但假期我們想進行純粹的面向對象編程,那么必須構建自己的結構,以期獲得與內建到其他OOP語言里的同樣的便利。需添加我們要用到的各種新類庫,還要使用另一些不兼容的接口。理所當然地,這也需要付出額外的精力使新接口與自己的設計方案配合(可能還需要多重繼續)。為得到C++額外的“靈活性”,付出這樣的代價值得嗎?當然,假如真的需要——假如早已是C專家,假如對C有難舍的情結——那么就真的很值得。但假如你是一名新手,首次接觸這類設計,象Java那樣的替換方案也許會更省事一些。
  單根結構中的所有對象(比如所有Java對象)都可以保證擁有一些特定的功能。在自己的系統中,我們知道對每個對象都能進行一些基本操作。一個單根結構,加上所有對象都在內存堆中創建,可以極大簡化參數的傳遞(這在C++里是一個復雜的概念)。
  利用單根結構,我們可以更方便地實現一個垃圾收集器。與此有關的必要支持可安裝于基礎類中,而垃圾收集器可將適當的消息發給系統內的任何對象。假如沒有這種單根結構,而且系統通過一個句柄來操縱對象,那么實現垃圾收集器的途徑會有很大的不同,而且會面臨許多障礙。
  由于運行期的類型信息肯定存在于所有對象中,所以永遠不會碰到判定不出一個對象的類型的情況。這對系統級的操作來說顯得非凡重要,比如違例控制;而且也能在程序設計時獲得更大的靈活性。
  但大家也可能產生疑問,既然你把好處說得這么天花亂墜,為什么C++沒有采用單根結構呢?事實上,這是早

上一篇:分析和設計

下一篇:方法調用的綁定

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色噜噜狠狠狠综合曰曰曰| 亚洲少妇激情视频| 综合136福利视频在线| 欧美日韩国产一区中文午夜| 亚洲福利视频久久| 亚洲图片欧美午夜| 久国内精品在线| 久久亚洲国产成人| 国产91在线高潮白浆在线观看| 久久精品国产一区二区电影| 日韩视频免费看| 日韩中文字幕网址| 久久影视免费观看| 亚洲美女精品成人在线视频| 中日韩午夜理伦电影免费| 久久亚洲影音av资源网| 国产成人精品电影| 久久在线免费观看视频| 国产亚洲a∨片在线观看| 欧美性极品xxxx娇小| 国产欧美中文字幕| 亚洲一区二区福利| 性色av一区二区三区在线观看| 久久精品国产v日韩v亚洲| 日本午夜人人精品| 亚洲国产一区自拍| 在线精品91av| 国产精品亚发布| 日韩精品免费在线观看| 日本一区二区三区在线播放| 国产91|九色| 亚洲欧美制服第一页| 91精品国产免费久久久久久| 国产精品96久久久久久又黄又硬| 日韩视频在线免费| 欧美日韩另类视频| 精品欧美国产一区二区三区| 色婷婷**av毛片一区| 亚洲自拍偷拍在线| 亚洲欧美日韩天堂| 久久亚洲精品国产亚洲老地址| 国产精品wwww| 国产精品吴梦梦| 日韩欧美一区二区三区久久| 91伊人影院在线播放| 国产精品99久久久久久久久久久久| 亚洲一区二区自拍| 成人亚洲综合色就1024| 久久精品国产v日韩v亚洲| 丝袜美腿精品国产二区| 国产在线视频2019最新视频| 成年无码av片在线| 亚洲 日韩 国产第一| 911国产网站尤物在线观看| 欧美第一黄网免费网站| 国产精品久久久久久久久久东京| 亚洲丝袜在线视频| 国产精品午夜视频| 在线观看国产欧美| 亚洲欧美日韩直播| 亚洲国产成人久久| 国产精品人成电影在线观看| 97视频免费在线观看| 日韩亚洲欧美成人| 国产精品久久久久免费a∨大胸| 狠狠躁夜夜躁久久躁别揉| 欧美激情一区二区三区在线视频观看| 国产精品免费久久久久久| 色噜噜国产精品视频一区二区| 亚洲国产毛片完整版| 中文字幕精品在线视频| 国产精品欧美日韩一区二区| 精品国产91久久久久久| 亚洲高清免费观看高清完整版| 亚洲一区二区久久久久久| 国产欧美精品日韩精品| 日韩精品在线视频美女| 中文字幕少妇一区二区三区| 精品成人久久av| 91精品国产高清自在线看超| 精品久久久久久久久久久久久久| 欧美综合国产精品久久丁香| 日韩欧美在线第一页| 91欧美视频网站| 日韩精品在线私人| 亚洲免费一在线| 欧美国产精品va在线观看| 超碰97人人做人人爱少妇| 成人av色在线观看| 欧美日本高清视频| 亚洲精品v欧美精品v日韩精品| 日本一欧美一欧美一亚洲视频| 奇米4444一区二区三区| 国产在线999| 日韩中文第一页| 中文字幕亚洲综合久久| 国产成人综合av| 欧美巨乳美女视频| 亚洲r级在线观看| 91国偷自产一区二区三区的观看方式| 成人免费激情视频| 国产69精品久久久久久| 中文字幕日韩在线视频| 国产免费一区二区三区香蕉精| 疯狂做受xxxx高潮欧美日本| 国产精品色视频| 亚洲91精品在线| 亚洲精品日产aⅴ| 狠狠躁天天躁日日躁欧美| 一本久久综合亚洲鲁鲁| 伦伦影院午夜日韩欧美限制| 91精品免费视频| 亚洲精品动漫久久久久| 欧美中文字幕精品| 欧美激情视频在线观看| 欧美午夜美女看片| 在线观看日韩www视频免费| 国产精品丝袜白浆摸在线| 中文字幕日韩电影| 精品视频在线播放免| 一区二区三区国产视频| 亚洲mm色国产网站| 亚洲精品www久久久久久广东| 午夜免费在线观看精品视频| 热久久免费视频精品| 91精品啪aⅴ在线观看国产| 色老头一区二区三区在线观看| 欧美亚洲在线播放| 亚洲免费一在线| 色悠悠久久88| 国产成人免费av电影| 亚洲欧美变态国产另类| 欧美在线视频免费播放| 91超碰中文字幕久久精品| 亚洲va久久久噜噜噜久久天堂| 国产极品精品在线观看| 成人精品久久一区二区三区| 成人高清视频观看www| 日韩成人av网| 国产午夜精品久久久| 久久精品一偷一偷国产| 在线国产精品播放| 成人性生交xxxxx网站| 亚洲欧美日韩天堂| 中文字幕欧美精品日韩中文字幕| 久久精品电影一区二区| 久久久久久久久国产精品| 亚洲欧美国内爽妇网| 久久韩国免费视频| 国产成人拍精品视频午夜网站| 中文字幕日韩精品在线观看| 国产精品第100页| 亚洲免费电影在线观看| 欧美精品九九久久| 日韩一区二区av| 久久6免费高清热精品| 92裸体在线视频网站| 久久久精品美女| 亚洲全黄一级网站| 欧美精品手机在线| 精品美女永久免费视频| 日本精品一区二区三区在线| 亚洲va国产va天堂va久久| 亚洲在线观看视频网站|