java-多態(tài)的理解

什么是多態(tài)

  • 面向?qū)ο蟮娜筇匦裕悍庋b夷野、繼承、多態(tài)拇泛。從一定角度來看滨巴,封裝和繼承幾乎都是為多態(tài)而準備的。這是我們最后一個概念俺叭,也是最重要的知識點恭取。
  • 多態(tài)的定義:指允許不同類的對象對同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式熄守。(發(fā)送消息就是函數(shù)調(diào)用)蜈垮。
  • 實現(xiàn)多態(tài)的技術(shù)稱為:動態(tài)綁定(dynamic binding),是指在執(zhí)行期間判斷所引用對象的實際類型柠横,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法窃款。
  • 多態(tài)的作用:消除類型之間的耦合關(guān)系。
  • 現(xiàn)實中牍氛,關(guān)于多態(tài)的例子不勝枚舉晨继。比方說按下 F1 鍵這個動作,如果當前在 Flash 界面下彈出的就是 AS 3 的幫助文檔搬俊;如果當前在 Word 下彈出的就是 Word 幫助紊扬;在 Windows 下彈出的就是 Windows 幫助和支持。同一個事件發(fā)生在不同的對象上會產(chǎn)生不同的結(jié)果唉擂。
  • 多態(tài)存在的三個必要條件 1餐屎、要有繼承; 2玩祟、要有重寫腹缩; 3、父類引用指向子類對象。

上菜

public class A {

    public String show(D obj) {              //方法一
        return ("A and D");
    }

    public String show(A obj) {              //方法二
        return ("A and A");
    }

    static class B extends A {

        public String show(B obj) {              //方法三
            return ("B and B");
        }

        public String show(A obj) {              //方法四
            return ("B and A");
        }
    }

    static class C extends B {

    }

    static class D extends B {

    }


    public static void main(String[] args) {
        A a2 = new B();

        A a1 = new A();
        B b = new B();
        C c = new C();
        D d = new D();

        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));

        // 創(chuàng)建了B對象 類型是A 藏鹊,調(diào)用超類函數(shù)润讥,子類重寫了 調(diào)用子類的
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));

        // 子類沒有 去找超類
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));
        
        System.out.println("10--" + d.show(d));

    }

}

實驗結(jié)果

1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
10--A and D

讓我們分析一下,理清其中各個類的繼承關(guān)系

  • 那我們開始分析輸出A a1 = new A();這是普通的創(chuàng)建對象盘寡,故a1擁有調(diào)用方法一和方法二的能力楚殿。那么究竟調(diào)用哪個方法呢,這里面涉及方法的重載竿痰。其實脆粥,在編譯的時候,編譯器已經(jīng)進行了前期綁定影涉,即把show()变隔;方法與類中的方法主體2進行綁定。就是說常潮,在編譯時弟胀,系統(tǒng)就已經(jīng)知道應(yīng)該調(diào)用哪個方法,即使你有方法的重載喊式。
  • 故 a1.show(b)會與方法二綁定孵户;a1.show(c)會與方法二綁定;a1.show(d)會與方法一綁定岔留。且都在編譯時完成綁定夏哭。
  • 但A a2 = new B();就涉及了多態(tài) 了,B實現(xiàn)了向上轉(zhuǎn)型献联。創(chuàng)建了一個父類引用竖配,指向子類對象。這樣的做法很常見里逆,因為這樣不僅增加了靈活性(父類引用可以隨時指向任意子類對象)进胯,也提高了擴展性。但要知道的是原押,向上轉(zhuǎn)型的缺點胁镐,就是不能調(diào)用子類中有而父類沒有的方法
  • 故A a2 = new B();中诸衔,方法四對方法二進行了重寫盯漂,所以a2擁有調(diào)用方法一和方法四的能力,而方法三不能調(diào)用(由上一段可知)笨农。所以就缆,在編譯時, a2.show(b)會與方法四綁定谒亦; a2.show(c)會與方法四綁定竭宰; a2.show(d)會與方法一綁定空郊。
  • B b = new B();這是普通的創(chuàng)建子類對象,B繼承于A羞延,且方法四重寫了方法二渣淳,所以b擁有調(diào)用方法一脾还,方法三伴箩,方法四的能力。所以b.show(b)會與方法三綁定鄙漏,b.show(c)會與方法三綁定嗤谚,b.show(d)會與方法一綁定。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怔蚌,一起剝皮案震驚了整個濱河市巩步,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桦踊,老刑警劉巖椅野,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異籍胯,居然都是意外死亡竟闪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門杖狼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼蛤,“玉大人,你說我怎么就攤上這事蝶涩±砼螅” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵绿聘,是天一觀的道長嗽上。 經(jīng)常有香客問我,道長熄攘,這世上最難降的妖魔是什么兽愤? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鲜屏,結(jié)果婚禮上烹看,老公的妹妹穿的比我還像新娘。我一直安慰自己洛史,他們只是感情好惯殊,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著也殖,像睡著了一般土思。 火紅的嫁衣襯著肌膚如雪务热。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天己儒,我揣著相機與錄音崎岂,去河邊找鬼。 笑死闪湾,一個胖子當著我的面吹牛冲甘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播途样,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼江醇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了何暇?” 一聲冷哼從身側(cè)響起陶夜,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裆站,沒想到半個月后条辟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡宏胯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年羽嫡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胳嘲。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡厂僧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出了牛,到底是詐尸還是另有隱情颜屠,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布鹰祸,位于F島的核電站甫窟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛙婴。R本人自食惡果不足惜粗井,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望街图。 院中可真熱鬧浇衬,春花似錦、人聲如沸餐济。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽絮姆。三九已至醉冤,卻和暖如春秩霍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚁阳。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工铃绒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人螺捐。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓颠悬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親归粉。 傳聞我的和親對象是個殘疾皇子椿疗,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354