小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java多態(tài)總結(jié)

 啊哈s1md2immc9 2018-04-24

面向?qū)ο?/a>的三大特性:javascript:;' class='gotosearch' style='color: #002be5'>封裝、繼承、多態(tài)。從一定角度來看,封裝和繼承幾乎都是為多態(tài)而準(zhǔn)備的。這是我們最后一個(gè)概念,也是最重要的知識點(diǎn)。

1.定義:

多態(tài):指允許不同類的對象對同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式。(發(fā)送消息就是函數(shù)調(diào)用)

2.實(shí)現(xiàn)多態(tài)的技術(shù)稱為:動態(tài)綁定(dynamic binding),是指在執(zhí)行期間判斷所引用對象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法。

3.作用消除類型之間的耦合關(guān)系。

4.現(xiàn)實(shí)中,關(guān)于多態(tài)的例子不勝枚舉。比方說按下F1 鍵這個(gè)動作,如果當(dāng)前在Flash 界面下彈出的就是AS 3 的幫助文檔;如果當(dāng)前在Word 下彈出的就是Word 幫助;在Windows 下彈出的就是Windows 幫助和支持。同一個(gè)事件發(fā)生在不同的對象上會產(chǎn)生不同的結(jié)果。

5.下面是多態(tài)存在的三個(gè)必要條件,要求大家做夢時(shí)都能背出來!

多態(tài)存在的三個(gè)必要條件

一、要有繼承;

二、要有重寫;

三、父類引用指向子類對象。

6.多態(tài)的好處

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

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

3)接口性(interface-ability:態(tài)是超類通過方法簽名,向子類提供了一個(gè)共同接口,由子類來完善或者覆蓋它而實(shí)現(xiàn)的。如圖8.3 所示。圖中超類Shape規(guī)定了兩個(gè)實(shí)現(xiàn)多態(tài)的接口方法,computeArea()以及computeVolume()。子類,如CircleSphere為了實(shí)現(xiàn)多態(tài),完善或者覆蓋這兩個(gè)接口方法。

4)靈活性(flexibility:它在應(yīng)用中體現(xiàn)了靈活多樣的操作,提高了使用效率。

5)簡化性(simplicity:多態(tài)簡化對應(yīng)用軟件的代碼編寫和修改過程,尤其在處理大量對象的運(yùn)算和操作時(shí),這個(gè)特點(diǎn)尤為突出和重要。

 

7.Java中多態(tài)的實(shí)現(xiàn)方式接口實(shí)現(xiàn),繼承父類進(jìn)行方法重寫,同一個(gè)類中進(jìn)行方法重載

8.Java中多態(tài)的分類

java中,多態(tài)大致可以分為以下幾種情況:

1)person為父類,student為子類。那么:person p=new student();

2)fliable為接口,bird為實(shí)現(xiàn)接口的類,那么:fliable f=new bird();

3)fliable抽象類,bird為繼承fliable的類,那么:fliablef=new bird()

多態(tài)時(shí)需要說明p聲明為父類的引用,但他實(shí)際為子類引用。但是他只能調(diào)用父類中的方法。如果子類中的方法覆蓋了父類方法,那么將調(diào)用父類方法虛方法調(diào)用。接口多態(tài)也是同樣的,也許你會問,如果f要調(diào)用自己的方法,那豈不是出錯(cuò)了?其實(shí)這里也是方法的覆蓋,因?yàn)閷?shí)現(xiàn)接口的子類肯定會實(shí)現(xiàn)接口中的方法,所以此種情況下調(diào)用的是bird中的方法。但是如果bird有一個(gè)方法在接口中沒有定義,那么f不能調(diào)用。

9.instanceof運(yùn)算符

java語言的多態(tài)機(jī)制導(dǎo)致了引用變量的聲明類型和其實(shí)際引用對象的類型可能不一致,再結(jié)合虛方法調(diào)用規(guī)則可以得出結(jié)論:聲明為同種類型的兩個(gè)引用變量調(diào)用同一個(gè)方法時(shí)也可能會有不同的行為。這里就引入了instanceof運(yùn)算符。

那么如果我聲明了person p=new student();我想將p轉(zhuǎn)為student的可不可以?當(dāng)然可以,但是就得強(qiáng)制轉(zhuǎn)換了(兒子想成為父親直接來,父親想成為兒子你就強(qiáng)來)。

通常在強(qiáng)制轉(zhuǎn)換時(shí)加上instanceof來判斷。

if(p instanceof student) {student s=studentp}

多態(tài)貫穿于java整個(gè)學(xué)習(xí),比如在異常處理時(shí)寫catch語句,我們規(guī)定必須子類異常寫在前,父類異常寫在后。為什么呢?原因就是多態(tài)了。我們的catch語句格式:catchException e)。java程序在產(chǎn)生異常時(shí)會自動生成一個(gè)異常對象,如果先產(chǎn)生一個(gè)子類異常,并且父類異常寫在前,那么根據(jù)多態(tài)肯定會執(zhí)行此catch語句,執(zhí)行完一條catch語句后將會跳出。

10.實(shí)例

關(guān)于JAVA多態(tài)性雖然自己也不是很懂,但是下面的這個(gè)例子讓我理解了一些:

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{}

class E

{

      public static void main(String [] args)

     {

       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

 

****有個(gè)好心人的解答****

   該問題的關(guān)鍵有兩點(diǎn):

   一是子類與父類的關(guān)系,二是重載方法的調(diào)用問題。

   子類對象可以直接當(dāng)成父類對象使用,但反過來就不可以。舉例來說,人是父類,學(xué)生是人的子類,所以學(xué)生對象一定具備人對象的屬性,但是人對象就未必具有學(xué)生對象的特性。所以學(xué)生對象可以當(dāng)做人對象來使用,但是人對象就不能當(dāng)做學(xué)生對象使用。注意當(dāng)把子類對象當(dāng)成父類對象使用時(shí),子類對象將失去所有的子類特性,只保留與父類同名的屬性和方法(同名方法不僅是函數(shù)名相同,而且參數(shù)類型也要一樣,否則不予保留)。

   一個(gè)類中如果定義了重載的方法,則系統(tǒng)在調(diào)用方法時(shí),會根據(jù)參數(shù)的類型自動選擇調(diào)用合適的方法。

 

    1) a1.shows(b),A中沒有含有B類參數(shù)的方法,但是含有A類參數(shù)的方法,根據(jù)子類對象父類可用的原則,所以調(diào)用方法

    public String show(A obj)...{return ('A and A');} 

 

    2) a1.show(c),C類是B類的子類,而B類又是A類的子類,所以C類對象可以當(dāng)制作A類對象使用。結(jié)果同上。

 

    3) a1.show(d),根據(jù)參數(shù)類型直接調(diào)用A中的方法

     public String show(D obj)...{

               return ('A and D');}

 

    4) a2.show(b),a2本來是一個(gè)B對象,但是將其賦給了A類變量,所以a2只保留了與父類A同名的屬性和方法。a2.show(b)調(diào)用B類中的保留的與父類同名同參方法

     public String show(A obj)...{

               return ('B and A');

        } 

   5) a2.show(c),B類的保留方法中沒有C類參數(shù)方法,但是有含有C的父類B的參數(shù)方法,所以調(diào)用的方法

            public String show(A obj)...{

               return ('B and A');

        }

  我覺得這樣解釋更合理:a2本來是類B的一個(gè)對象,但是又將值賦給了類A,CB的子類,BA的子類,因此a2保留了類B中與A同名的屬性和方法。

    6) a2.show(d),調(diào)用的是A類中的

            public String show(D obj)...{

               return ('A and D');

        }

    7) b.show(b),調(diào)用B類中的

            public String show(B obj)...{

               return ('B and B');

        }

    8) b.show(c)B類中沒有C類參數(shù)的方法,但是有B類參數(shù)的方法,所以調(diào)用方法         

       public String show(B obj)...{

               return ('B and B');

        }

    9) b.show(d),解釋同8

 

 

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多