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

首頁 > 編程 > Java > 正文

JAVA 多態 由淺及深介紹

2019-11-26 16:14:53
字體:
來源:轉載
供稿:網友

什么是多態?

     

多態分兩種:

(1)   編譯時多態(設計時多態):方法重載。

 

(2)   運行時多態:JAVA運行時系統根據調用該方法的實例的類型來決定選擇調用哪個方法則被稱為運行時多態。(我們平時說得多的事運行時多態,所以多態主要也是指運行時多態)

 

運行時多態存在的三個必要條件:
一、要有繼承(包括接口的實現);
二、要有重寫;
三、父類引用指向子類對象。

 


--------------------------------------------------------------------------------

 

詳細解釋:

 

運行時多態的解釋:a.運行時多態是指程序中定義的引用變量所指向的具體類型和b.通過該引用變量發出的方法調用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定.

 

1.程序序中定義的引用變量所指向的具體類型不確定(即一個引用變量倒底會指向哪個類的實例對象) 。
 

例子 :

driver 類中 drive 方法 (Vehicle類 vehicle){}

•oneDriver.drive( new car() )
•oneDriver.drive( new bus() )
其中vehicle 變量無法確定具體使用哪個子類實例。

 

1.通過該引用變量發出的方法調用在編程時并不確定(該引用變量發出的方法調用到底是哪個類中實現的方法) 。
 

例子 : 廚師,園丁,理發師的Cut 方法調用.persion.cut().

 


--------------------------------------------------------------------------------

 

 

多態的好處:

1.可替換性(substitutability)。多態對已存在代碼具有可替換性。例如,多態對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。

2.可擴充性(extensibility)。多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,很容易增添球體類的多態性。

3.接口性(interface-ability)。多態是超類通過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。如圖8.3 所示。圖中超類Shape規定了兩個實現多態的接口方法,computeArea()以及computeVolume()。子類,如Circle和Sphere為了實現多態,完善或者覆蓋這兩個接口方法。

4.靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。

5.簡化性(simplicity)。多態簡化對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。

 

 

實際運用:

結合配置文件的使用,聯系Spring框架,利用反射,動態的調用類,同時不用修改源代碼,直接添加新類和修改配置文件,不需要重啟服務器便可以擴展程序。

 


--------------------------------------------------------------------------------

 

小結:

使用父類類型的引用指向子類的對象,該引用調用的師父類中定義的方法和變量,變量不能被重寫(覆蓋);如果子類中重寫了父類中的一個方法,那么在調用這個方法的時候,將會調用子類中的這個方法;

         注意特殊情況,如果該父類引用所調用的方法參數列表未定義,就調用該父類的父類中查找,如果還沒找到就強制向上類型轉換參數列表中的參數類型,具體優先級高到低依次如下:

this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

 


--------------------------------------------------------------------------------

 

經典筆試題(混合重載和重寫):

(一)相關類

復制代碼 代碼如下:

class A {
         public String show(D obj)...{
                return ("A and D");
         }
         public String show(A obj)...{
                return ("A and A");
         }
}
class B extends A{
         public String show(B obj)...{
                return ("B and B");
         }
         public String show(A obj)...{
                return ("B and A");
         }
}
class C extends B...{}
class D extends B...{}

 

(二)問題:以下輸出結果是什么?

        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        System.out.println(a1.show(b));   ①
        System.out.println(a1.show(c));   ②
        System.out.println(a1.show(d));   ③
        System.out.println(a2.show(b));   ④
        System.out.println(a2.show(c));   ⑤
        System.out.println(a2.show(d));   ⑥
        System.out.println(b.show(b));     ⑦
        System.out.println(b.show(c));     ⑧
        System.out.println(b.show(d));     ⑨   

(三)答案

              ①   A and A
              ②   A and A
              ③   A and D
              ④   B and A
              ⑤   B and A
              ⑥   A and D
              ⑦   B and B
              ⑧   B and B
              ⑨   A and D

(四)分析

        ①②③比較好理解,一般不會出錯。④⑤就有點糊涂了,為什么輸出的不是"B and B”呢?!!先來回顧一下多態性。

        運行時多態性是面向對象程序設計代碼重用的一個最強大機制,動態性的概念也可以被說成“一個接口,多個方法”。Java實現運行時多態性的基礎是動態方法調度,它是一種在運行時而不是在編譯期調用重載方法的機制。

        方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫(Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型但同時參數列表也得不同。

        當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。 (但是如果強制把超類轉換成子類的話,就可以調用子類中新添加而超類沒有的方法了。)

        好了,先溫習到這里,言歸正傳!實際上這里涉及方法調用的優先問題 ,優先級由高到低依次為:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。讓我們來看看它是怎么工作的。

        比如④,a2.show(b),a2是一個引用變量,類型為A,則this為a2,b是B的一個實例,于是它到類A里面找show(B obj)方法,沒有找到,于是到A的super(超類)找,而A沒有超類,因此轉到第三優先級this.show((super)O),this仍然是a2,這里O為B,(super)O即(super)B即A,因此它到類A里面找show(A obj)的方法,類A有這個方法,但是由于a2引用的是類B的一個對象,B覆蓋了A的show(A obj)方法,因此最終鎖定到類B的show(A obj),輸出為"B and A”。

        再比如⑧,b.show(c),b是一個引用變量,類型為B,則this為b,c是C的一個實例,于是它到類B找show(C obj)方法,沒有找到,轉而到B的超類A里面找,A里面也沒有,因此也轉到第三優先級this.show((super)O),this為b,O為C,(super)O即(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是類B的一個對象,因此直接鎖定到類B的show(B obj),輸出為"B and B”。

        按照上面的方法,可以正確得到其他的結果。

        問題還要繼續,現在我們再來看上面的分析過程是怎么體現出藍色字體那句話的內涵的。它說:當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。還是拿a2.show(b)來說吧。

        a2是一個引用變量,類型為A,它引用的是B的一個對象,因此這句話的意思是由B來決定調用的是哪個方法。因此應該調用B的show(B obj)從而輸出"B and B”才對。但是為什么跟前面的分析得到的結果不相符呢?!問題在于我們不要忽略了藍色字體的后半部分,那里特別指明:這個被調用的方法必須是在超類中定義過的,也就是被子類覆蓋的方法。B里面的show(B obj)在超類A中有定義嗎?沒有!那就更談不上被覆蓋了。實際上這句話隱藏了一條信息:它仍然是按照方法調用的優先級來確定的。它在類A中找到了show(A obj),如果子類B沒有覆蓋show(A obj)方法,那么它就調用A的show(A obj)(由于B繼承A,雖然沒有覆蓋這個方法,但從超類A那里繼承了這個方法,從某種意義上說,還是由B確定調用的方法,只是方法是在A中實現而已);現在子類B覆蓋了show(A obj),因此它最終鎖定到B的show(A obj)。這就是那句話的意義所在。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜视频一区二区| 国产精品视频中文字幕91| 国产一区二区av| 亚洲高清av在线| 久久久久国产一区二区三区| 国产999在线观看| 午夜精品美女自拍福到在线| 色综合影院在线| 91成人免费观看网站| 日韩中文字幕网址| 欧美日韩成人在线播放| 欧美激情一区二区三区高清视频| 国产日韩在线一区| 色婷婷综合久久久久| 亚洲人成网站色ww在线| 亚洲欧美激情四射在线日| 成人在线视频福利| 欧美美女15p| 亚洲国产精品人久久电影| 日韩毛片中文字幕| 久久这里有精品视频| 国产成人久久久精品一区| 日本高清不卡的在线| 日日狠狠久久偷偷四色综合免费| 国产精品对白刺激| 日韩一区二区三区在线播放| 欧亚精品中文字幕| 国产精品美女www| 这里只有视频精品| 国产视频久久久久| 国产精品成人aaaaa网站| 久久久亚洲国产天美传媒修理工| 久久影视电视剧凤归四时歌| 精品国产依人香蕉在线精品| 九九热99久久久国产盗摄| 91av在线播放视频| 国产精品∨欧美精品v日韩精品| 亚洲一区二区三区四区在线播放| 亚洲精品91美女久久久久久久| 国产男人精品视频| 亚洲偷熟乱区亚洲香蕉av| 欧美成在线视频| 91欧美日韩一区| xxxx性欧美| 久久国内精品一国内精品| 九九热视频这里只有精品| 亚洲老头同性xxxxx| 国产日韩欧美在线视频观看| 中文字幕在线精品| 在线亚洲国产精品网| 国产欧美日韩高清| 人人做人人澡人人爽欧美| 欧美精品手机在线| 成人福利免费观看| 不卡av在线网站| 97在线精品视频| 欧美成aaa人片在线观看蜜臀| 久久韩国免费视频| 国产美女久久精品香蕉69| 国产精品成人v| 大桥未久av一区二区三区| 国产成人精品电影| 久久久久亚洲精品国产| 欧美日韩国产一区二区三区| 日韩中文在线中文网三级| 国产精品www网站| 欧美精品成人在线| 国产999视频| 色噜噜狠狠狠综合曰曰曰88av| 久久国产天堂福利天堂| 青青草国产精品一区二区| 国产一区私人高清影院| 久久激情视频免费观看| 国产在线高清精品| 国产精品免费视频xxxx| 大荫蒂欧美视频另类xxxx| 国产精品久久久久久影视| 国产欧美日韩免费| 久久精品小视频| 美日韩精品免费观看视频| 亚洲精品国产免费| 亚洲理论在线a中文字幕| 国产精品福利无圣光在线一区| 最好看的2019的中文字幕视频| 最近2019中文免费高清视频观看www99| 国产丝袜一区二区三区| 丰满岳妇乱一区二区三区| 精品亚洲一区二区三区| 久久精品免费电影| 亚洲在线免费视频| 国产精品久久久久秋霞鲁丝| 青青久久av北条麻妃海外网| www国产精品视频| 欧美激情一区二区三区在线视频观看| 亚洲最新av在线网站| 久久精品视频在线观看| 精品国产31久久久久久| 日韩精品中文字幕在线| 日韩美女视频免费在线观看| 欧洲成人午夜免费大片| 亚洲欧美视频在线| 91在线精品播放| 91精品久久久久久久久久久久久| 欧美日韩国产精品一区二区三区四区| 亚洲国产中文字幕久久网| 国产精品白嫩初高中害羞小美女| 国产精品wwww| 在线观看欧美视频| 88国产精品欧美一区二区三区| 色悠悠久久久久| 欧美老肥婆性猛交视频| 欧美日韩国产一区中文午夜| 一区二区三区在线播放欧美| 欧美成年人视频网站欧美| 精品亚洲aⅴ在线观看| 中文字幕日韩欧美在线视频| 国产啪精品视频网站| 麻豆成人在线看| 欧美激情精品久久久久久黑人| 91日本在线视频| 欧美激情精品久久久久久免费印度| 亚洲第一精品夜夜躁人人爽| 国产成人精品一区二区在线| 亚洲欧美三级伦理| 国产激情999| 中文字幕在线精品| 欧美综合激情网| 久久精品99久久香蕉国产色戒| 欧美久久精品一级黑人c片| 亚洲www视频| 最新69国产成人精品视频免费| 色综合久久88色综合天天看泰| 中文字幕精品在线| 日韩欧美亚洲范冰冰与中字| 69av视频在线播放| 4444欧美成人kkkk| 久久这里有精品| 欧美老女人性生活| 欧美激情中文字幕乱码免费| 欧美亚洲另类制服自拍| 欧美激情精品久久久久久黑人| 国产精品久久97| 亚洲欧美色婷婷| 国产精品电影网| 亚洲第一精品电影| 欧美成人在线免费| 1769国产精品| 欧美性xxxxxx| 色噜噜久久综合伊人一本| 欧美高清在线视频观看不卡| 亚洲精品资源美女情侣酒店| 久久精品国产亚洲精品| 欧美黑人性猛交| 色yeye香蕉凹凸一区二区av| 亚洲第一视频在线观看| 亚洲成人精品av| 亚洲成avwww人| 亚洲人成网站999久久久综合| 美女少妇精品视频| 青青青国产精品一区二区| 狠狠色噜噜狠狠狠狠97| 国产精品视频一| 欧美精品手机在线| 国产精品久久久久久网站|