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

正文內(nèi)容

java多形性ppt課件-wenkub

2022-11-03 04:52:58 本頁面
 

【正文】 一個稍微不同的角度說明了問題: 13 ?現(xiàn)在,仍然返回樂器( Instrument) 示例。因此編譯器認可上述語句,不會提示一條出錯消息。這里,很容易理解 “ 圓屬于形狀的一種類型 ” 等概念。 這意味著我們通常不必決定是否應(yīng)進行后期綁定 —— 它是自動發(fā)生的。也就是說,編譯器此時依然不知道對象的類型,但方法調(diào)用機制能自己去調(diào)查,找到正確的方法主體。 ?上述程序最令人迷惑不解的地方全與早期綁定有關(guān),因為在只有一個 Instrument句柄的前提下,編譯器不知道具體該調(diào)用哪個方法。所以在這種情況下,編譯器怎樣才能知道 Instrument句柄指向的是一個Wind, 而不是一個 Brass或 Stringed呢?編譯器無從得知。這樣一來,類型的整個操作過程就顯得極難管理,有失控的危險。 假設(shè)按照前面的推論,加入 Stringed( 弦樂)和Brass( 銅管)這兩種 Instrument( 樂器) ? 6 ? 這樣做當然行得通,但卻存在一個極大的弊端:必須為每種新增的 Instrument類編寫與類緊密相關(guān)的方法。Instrument里的接口必須存在于 Wind中,因為 Wind是從Instrument里繼承得到的。 4 ?可將一個對象作為它自己的類型使用,或者作為它的基礎(chǔ)類型的一個對象使用。 ? 1)編譯時多形 在編譯階段,具體調(diào)用哪個被重載的方法,編譯器會根據(jù)參數(shù)的不同來靜態(tài)確定調(diào)用相應(yīng)的方法。 ? 2)運行時多形 由于子類繼承了父類所有的屬性(私有的除外),所以子類對象可以作為父類對象使用。取得一個對象句柄,并將其作為基礎(chǔ)類型句柄使用的行為就叫作 “ 上溯造型 ” —— 因為繼承樹的畫法是基礎(chǔ)類位于最上方。從 Wind向 Instrument的上溯造型可能 “ 縮小 ” 那個接口,但不可能把它變得比Instrument的接口還要小。這意味著第一次就要求多得多的編程量。 ?假如只寫一個方法,將基礎(chǔ)類作為自變量或參數(shù)使用,而不是使用那些特定的衍生類,豈不是會簡單得多?也就是說,如果能不顧衍生類,只讓自己的代碼與基礎(chǔ)類打交道,那么省下的工作量將是難以估計的。為了理解這個問題,這里探討一下 “ 綁定 ” 這個主題。 ?解決的方法就是 “ 后期綁定 ” ,它意味著綁定在運行期間進行,以對象的類型為基礎(chǔ)。 ?不同的語言對后期綁定的實現(xiàn)方法是有所區(qū)別的。它可有效地 “ 關(guān)閉 ” 動態(tài)綁定,編譯器就可為 final方法調(diào)用生成效率更高的代碼。下面繼承圖展示了它們的關(guān)系: 11 ?上溯造型可用下面這個語句簡單地表現(xiàn)出來: Shape s = new Circle()。 12 ?當調(diào)用其中一個基礎(chǔ)類方法時(已在衍生類里覆蓋): ()。由于存在多形性,所以可根據(jù)自己的需要向系統(tǒng)里加入任意多的新類型,同時毋需更改 tune()方法。 14 ?對于樂器例子,假設(shè)在基礎(chǔ)類里加入更多的方法,以及一系列新類,那么會出現(xiàn)什么情況呢?下面是示意圖: ? ?多形性是一種至關(guān)重要的技術(shù),它允許程序員 “ 將發(fā)生改變的東西同沒有發(fā)生改變的東西區(qū)分開 ” 。 ?之所以要建立這個通用接口,原因就是它能為不同的子類型作出不同的表示。換言之, Instrument的作用僅僅是表達接口,而不是表達一些具體的實施細節(jié)。無論如何,最好的方法都是在編譯期間捕捉到問題。 17 ? 包含了抽象方法的一個類叫作 “ 抽象類 ” 。通過這種方法,編譯器可保證抽象類的 “ 純潔性 ” ,不必擔心會誤用它。如果一個類沒必要擁有任何抽象方法,而且想禁止那個類的所有實例,這種能力就會顯得非常有用??蓪⑵湎胂鬄橐粋€ “ 純 ” 抽象類。 ?接口這樣描述自己: “ 對于實現(xiàn)我的所有類,看起來都應(yīng)該象我現(xiàn)在這個樣子 ” 。有些面向?qū)ο蟮某绦蛟O(shè)計語言采用了一個名為 “ protocol”( 協(xié)議)的關(guān)鍵字,它做的便是與接口相同的事情。要表達的意思是 “接口看起來就象那個樣子,這兒是它具體的工作細節(jié) ”。由于接口根本沒有具體的實施細節(jié) —— 也就是說,沒有與存儲空間與 “ 接口 ” 關(guān)聯(lián)在一起 —— 所以沒有任何辦法可以防止多個接口合并到一起。所以在合并多個接口的時候, C++的問題不會在 Java中重演。將所有接口名置于 implements關(guān)鍵字的后面,并用逗號分隔它們。這樣便帶來了一個問題:到底應(yīng)該使用一個接口還是一個抽象類呢?若使用接口,可以同時獲得抽象類以及接口的好處。 26 :通過繼承擴展接口 ?利用繼承技術(shù),可方便地為一個接口添加新的方法聲明,也可以將幾個接口合并成一個新接口。 28 :常數(shù)分組 ?如確實不想放棄額外的類型安全性,可構(gòu)建象下面這樣的一個類: 29 :初始化接口中的字段 ?接口中定義的字段會自動具有 static和 final屬性。 30 ?將一個類定義置入另一個類定義中。 ?通常,對內(nèi)部類的需要并不是特別明顯的,至少不會立即感覺到自己需要使用內(nèi)部類。 ?更典型的一種情況是,一個外部類擁有一個特殊的方法,它會返回指向一個內(nèi)部類的句柄。所以可以非常方便地隱藏實施細節(jié)。在返回語句中發(fā)生的上溯造型 —— 除了指向基礎(chǔ)類 Destination的一個句柄之外,沒有任何東西超出 dest()的邊界之外。然而,在定義它的那個作用域之外,它是不可使用的。而且看起來似乎更讓人摸不著頭腦的是,準備創(chuàng)建一個 Contents對象: return new Contents() 但在這之后,在遇到分號之前,又說: “ 等一等,讓我先在一個類定義里再耍一下花招 ” : return new Contents() { private int i = 11。由 new表達式返回的句柄會自動上溯造型成一個 Contents句柄。 38 :方法和作用域中的內(nèi)部類 ?在匿名內(nèi)部類中, Contents是用一個默認構(gòu)建器創(chuàng)建的。相反,它標志著用于包含匿名類的那個表達式的結(jié)束。這正是我們將 dest()的自變量設(shè)為 final的原因。所以實際上,一個實例初始化模塊就是一個匿名內(nèi)部類的構(gòu)建器。除此以外,內(nèi)部類擁有對封裝類所有元素的訪問權(quán)限。 o是個不屬于 SSelector一部分的句柄,而是位于封裝類里的一個 private字段。這是如何實現(xiàn)的呢?內(nèi)部類必須擁有對封裝類的特定對象的一個引用,而封裝類的作用就是創(chuàng)建這個內(nèi)部類。在這個創(chuàng)建過程中
點擊復(fù)制文檔內(nèi)容
教學課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1