国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

品味Java子類型多態(tài)的魅力

2019-11-18 10:41:33
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  摘要

  java程序員經(jīng)常運(yùn)用對(duì)象的多態(tài)性使其在適當(dāng)?shù)牡胤秸{(diào)用適當(dāng)?shù)姆椒ǎ@得很神奇。這種方法通過(guò)繼續(xù)機(jī)制來(lái)實(shí)現(xiàn)。然而,一個(gè)嚴(yán)謹(jǐn)?shù)膶?shí)驗(yàn)可以使其變得很明白,并揭示了,把多態(tài)性理解為與類型相關(guān)的概念更為合適,比繼續(xù)機(jī)制的解釋更好。這種理解可以幫助程序員更好的運(yùn)用多態(tài)。

                 ------WM.保羅 羅格斯

  “polymorphism(多態(tài))”一詞來(lái)自希臘語(yǔ),意為“多種形式”。多數(shù)Java程序員把多態(tài)看作對(duì)象的一種能力,使其能調(diào)用正確的方法版本。盡管如此,這種面向?qū)崿F(xiàn)的觀點(diǎn)導(dǎo)致了多態(tài)的神奇功能,勝于僅僅把多態(tài)看成純粹的概念。

  Java中的多態(tài)總是子類型的多態(tài)。幾乎是機(jī)械式產(chǎn)生了一些多態(tài)的行為,使我們不去考慮其中涉及的類型問(wèn)題。本文研究了一種面向類型的對(duì)象觀點(diǎn),分析了如何將對(duì)象能夠表現(xiàn)的行為和對(duì)象即將表現(xiàn)的行為分離開來(lái)。拋開Java中的多態(tài)都是來(lái)自繼續(xù)的概念,我們?nèi)匀豢梢愿械剑琂ava中的接口是一組沒有公共代碼的對(duì)象共享實(shí)現(xiàn)。

  多態(tài)的分類

  多態(tài)在面向?qū)ο笳Z(yǔ)言中是個(gè)很普遍的概念.雖然我們經(jīng)常把多態(tài)混為一談,但實(shí)際上有四種不同類型的多態(tài)。在開始正式的子類型多態(tài)的細(xì)節(jié)討論前,然我們先來(lái)看看普通面向?qū)ο笾械亩鄳B(tài)。

  LUCa Cardelli和Peter Wegner("On Understanding Types, Data Abstraction, and Polymorphism"一文的作者, 文章參考資源鏈接)把多態(tài)分為兩大類----特定的和通用的----四小類:強(qiáng)制的,重載的,參數(shù)的和包含的。他們的結(jié)構(gòu)如下:

品味Java子類型多態(tài)的魅力(圖一)

  在這樣一個(gè)體系中,多態(tài)表現(xiàn)出多種形式的能力。通用多態(tài)引用有相同結(jié)構(gòu)類型的大量對(duì)象,他們有著共同的特征。特定的多態(tài)涉及的是小部分沒有相同特征的對(duì)象。四種多態(tài)可做以下描述:

  強(qiáng)制的:一種隱式做類型轉(zhuǎn)換的方法。

  重載的:將一個(gè)標(biāo)志符用作多個(gè)意義。

  參數(shù)的:為不同類型的參數(shù)提供相同的操作。

  包含的:類包含關(guān)系的抽象操作。

  我將在講述子類型多態(tài)前簡(jiǎn)單介紹一下這幾種多態(tài)。
  強(qiáng)制的多態(tài)

  強(qiáng)制多態(tài)隱式的將參數(shù)按某種方法,轉(zhuǎn)換成編譯器認(rèn)為正確的類型以避免錯(cuò)誤。在以下的表達(dá)式中,編譯器必須決定二元運(yùn)算符‘+’所應(yīng)做的工作:

  2.0 + 2.0

  2.0 + 2

  2.0 + "2"

  第一個(gè)表達(dá)式將兩個(gè)double的操作數(shù)相加;Java中非凡聲明了這種用法。

  第二個(gè)表達(dá)式將double型和int相加。Java中沒有明確定義這種運(yùn)算。不過(guò),編譯器隱式的將第二個(gè)操作數(shù)轉(zhuǎn)換為double型,并作double型的加法。做對(duì)程序員來(lái)說(shuō)十分方便,否則將會(huì)拋出一個(gè)編譯錯(cuò)誤,或者強(qiáng)制程序員顯式的將int轉(zhuǎn)換為double。

  第三個(gè)表達(dá)式將double與一個(gè)String相加。Java中同樣沒有定義這樣的操作。所以,編譯器將double轉(zhuǎn)換成String類型,并將他們做串聯(lián)。

  強(qiáng)制多態(tài)也會(huì)發(fā)生在方法調(diào)用中。假設(shè)類Derived繼續(xù)了類Base,類C有一個(gè)方法,原型為m(Base),在下面的代碼中,編譯器隱式的將Derived類的對(duì)象derived轉(zhuǎn)化為Base類的對(duì)象。這種隱式的轉(zhuǎn)換使m(Base)方法使用所有能轉(zhuǎn)換成Base類的所有參數(shù)。

C c = new C();

Derived derived = new Derived();

c.m( derived );

  并且,隱式的強(qiáng)制轉(zhuǎn)換,可以避免類型轉(zhuǎn)換的麻煩,減少編譯錯(cuò)誤。當(dāng)然,編譯器仍然會(huì)優(yōu)先驗(yàn)證符合定義的對(duì)象類型。

  重載的多態(tài)

  重載答應(yīng)用相同的運(yùn)算符或方法,去表示截然不同的意義。‘+’在上面的程序中有兩個(gè)意思:兩個(gè)double型的數(shù)相加;兩個(gè)串相連。另外還有整型相加,長(zhǎng)整型,等等。這些運(yùn)算符的重載,依靠于編譯器根據(jù)上下文做出的選擇。以往的編譯器會(huì)把操作數(shù)隱式轉(zhuǎn)換為完全符合操作符的類型。雖然Java明確支持重載,但不支持用戶定義的操作符重載。

  Java支持用戶定義的函數(shù)重載。一個(gè)類中可以有相同名字的方法,這些方法可以有不同的意義。這些重載的方法中,必須滿足參數(shù)數(shù)目不同,相同位置上的參數(shù)類型不同。這些不同可以幫助編譯器區(qū)分不同版本的方法。

  編譯器以這種唯一表示的特征來(lái)表示不同的方法,比用名字表示更為有效。據(jù)此,所有的多態(tài)行為都能編譯通過(guò)。

  強(qiáng)制和重載的多態(tài)都被分類為特定的多態(tài),因?yàn)檫@些多態(tài)都是在特定的意義上的。這些被劃入多態(tài)的特性給程序員帶來(lái)了很大的方便。強(qiáng)制多態(tài)排除了麻煩的類型和編譯錯(cuò)誤。重載多態(tài)像一塊糖,答應(yīng)程序員用相同的名字表示不同的方法,很方便。

  參數(shù)的多態(tài)

  參數(shù)多態(tài)答應(yīng)把許多類型抽象成單一的表示。例如,List抽象類中,描述了一組具有同樣特征的對(duì)象,提供了一個(gè)通用的模板。你可以通過(guò)指定一種類型以重用這個(gè)抽象類。這些參數(shù)可以是任何用戶定義的類型,大量的用戶可以使用這個(gè)抽象類,因此參數(shù)多態(tài)毫無(wú)疑問(wèn)的成為最強(qiáng)大的多態(tài)。

  乍一看,上面抽象類似乎是java.util.List的功能。然而,Java實(shí)際上并不支持真正的安全類型風(fēng)格的參數(shù)多態(tài),這也是java.util.List和java.util的其他集合類是用原始的java.lang.Object寫的原因(參考我的文章"A PRimordial Interface?" 以獲得更多細(xì)節(jié))。Java的單根繼續(xù)方式解決了部分問(wèn)題,但沒有發(fā)揮出參數(shù)多態(tài)的全部功能。Eric Allen有一篇出色的文章“Behold the Power of Parametric Polymorphism”,描述了Java通用類型的需求,并建議給Sun的Java規(guī)格需求#000014號(hào)文檔"Add Generic Types to the Java Programming Language."(參考資源鏈接)

  包含的多態(tài)

  包含多態(tài)通過(guò)值的類型和集合的包含關(guān)系實(shí)現(xiàn)了多態(tài)的行為.在包括Java在內(nèi)的眾多面向?qū)ο笳Z(yǔ)言中,包含關(guān)系是子類型的。所以,Java的包含多態(tài)是子類型的多態(tài)。

  在早期,Java開發(fā)者們所提及的多態(tài)就特指子類型的多態(tài)。通過(guò)一種面向類型的觀點(diǎn),我們可以看到子類型多態(tài)的強(qiáng)大功能。以下的文章中我們將仔細(xì)探討這個(gè)問(wèn)題。為簡(jiǎn)明起見,下文中的多態(tài)均指包含多態(tài)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 缙云县| 甘德县| 景德镇市| 徐汇区| 淳化县| 高清| 汪清县| 德令哈市| 阳新县| 汉源县| 太白县| 阳东县| 牟定县| 汉寿县| 泰顺县| 临洮县| 钟祥市| 玛纳斯县| 开封县| 鄂伦春自治旗| 南雄市| 班戈县| 诏安县| 乌兰县| 息烽县| 虎林市| 大悟县| 常宁市| 修文县| 金堂县| 旬阳县| 四会市| 浙江省| 洛宁县| 黑龙江省| 井陉县| 阿图什市| 金昌市| 铁力市| 英德市| 柳江县|