<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小偉

    我的java筆記

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      29 隨筆 :: 1 文章 :: 23 評論 :: 0 Trackbacks

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

    一、通過繼承中超類對象引用變量引用子類對象來實現

    舉例說明:
    //
    定義超類 superA
    class superA
    {
    int i = 100;
    void fun()
    {
    System.out.println(“This is superA”);
    }
    }
    //
    定義 superA 的子類 subB
    class subB extends superA
    {
    int m = 1;
    void fun()
    {
    System.out.println(“This is subB”);
    }
    }
    //
    定義 superA 的子類 subC
    class subC extends superA
    {
    int n = 1;
    void fun()
    {
    System.out.println(“This is subC”);
    }
    }

    class Test
    {
    public static void main(String[] args)
    {
    superA a;
    subB b = new subB();
    subC c = new subC();
    a=b;
    a.fun(); (1)
    a=c;
    a.fun(); (2)
    }
    }

    運行結果為:
    This is subB
    This is subC

    上述代碼中 subB subC 是超類 superA 的子類,我們在類 Test 中聲明了 3 個引用變量 a, b, c ,通過將子類對象引用賦值給超類對象引用變量來實現動態方法調用。也許有人會問: 為什么 (1) (2) 不輸出: This is superA” java 的這種機制遵循一個原則:當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。
    所以,不要被上例中 (1) (2) 所迷惑,雖然寫成 a.fun() ,但是由于 (1) 中的 a b 賦值,指向了子類 subB 的一個實例,因而 (1) 所調用的 fun() 實際上是子類 subB 的成員方法 fun() ,它覆蓋了超類 superA 的成員方法 fun() ;同樣 (2) 調用的是子類 subC 的成員方法 fun()

    另外,如果子類繼承的超類是一個抽象類,雖然抽象類不能通過 new 操作符實例化,但是可以創建抽象類的對象引用指向子類對象,以實現運行時多態性。具體的實現方法同上例。
    不過,抽象類的子類必須覆蓋實現超類中的所有的抽象方法,否則子類必須被 abstract 修飾符修飾,當然也就不能被實例化了。

    二、通過接口類型變量引用實現接口的類的對象來實現

    接口的靈活性就在于 規定一個類必須做什么,而不管你如何做 。我們可以定義一個接口類型的引用變量來引用實現接口的類的實例,當這個引用調用方法時,它會根據實際引用的類的實例來判斷具體調用哪個方法,這和上述的超類對象引用訪問子類對象的機制相似。

    舉例說明:
    //
    定義接口 InterA
    interface InterA
    {
    void fun();
    }
    //
    實現接口 InterA 的類 B
    class B implements InterA
    {
    public void fun()
    {
    System.out.println(“This is B”);
    }
    }

    //
    實現接口 InterA 的類 C
    class C implements InterA
    {
    public void fun()
    {
    System.out.println(“This is C”);
    }
    }

    class Test
    {
    public static void main(String[] args)
    {
    InterA a;
    a= new B();
    a.fun();
    a = new C();
    a.fun();
    }
    }
    輸出結果為:
    This is B
    This is C

    上例中類 B 和類 C 是實現接口 InterA 的兩個類,分別實現了接口的方法 fun() ,通過將類 B 和類 C 的實例賦給接口引用 a 而實現了方法在運行時的動態綁定,充分利用了 一個接口,多個方法 展示了 Java 的動態多態性。

    需要注意的一點是: Java 在利用接口變量調用其實現類的對象的方法時,該方法必須已經在接口中被聲明,而且在接口的實現類中該實現方法的類型和參數必須與接口中所定義的精確匹配。

    結束語:以上就是 java 運行時多態性的實現方法,大家在編程過程中可以靈活運用,但是在性能要求較高的代碼中不提倡運用運行時多態,畢竟 Java 的運行時動態方法調用較之普通的方法調用的系統開銷是比較大的。

    posted on 2006-11-21 22:23 小偉 閱讀(280) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲第一永久AV网站久久精品男人的天堂AV| 99re热精品视频国产免费| 亚洲中文字幕无码一久久区| 亚洲免费黄色网址| 国产日韩AV免费无码一区二区| 色偷偷尼玛图亚洲综合| 亚洲精品视频在线播放| 久久夜色精品国产噜噜噜亚洲AV| 亚洲精品成人在线| 中文字幕不卡亚洲| 亚洲人成网77777亚洲色| 国产亚洲精品拍拍拍拍拍| 亚洲精品国产高清不卡在线| 亚洲免费日韩无码系列| 久久精品亚洲乱码伦伦中文| 亚洲综合色自拍一区| 亚洲国产无套无码av电影| 亚洲国产一区在线| 亚洲黄色中文字幕| 亚洲暴爽av人人爽日日碰| 国产亚洲人成在线影院| 国产免费无码一区二区| 亚洲综合免费视频| 成人国产mv免费视频| 国产亚洲一区二区在线观看| 亚洲国语精品自产拍在线观看| 久久精品国产亚洲AV高清热| 亚洲国产精品无码久久久| 美女羞羞视频免费网站| 无码精品国产一区二区三区免费| 国产成人免费高清激情明星 | 亚洲熟伦熟女新五十路熟妇 | 亚洲国产人成精品| 久久久久亚洲精品美女| 久久精品国产亚洲AV天海翼| eeuss草民免费| 毛片免费vip会员在线看| 亚洲婷婷五月综合狠狠爱| 亚洲AV女人18毛片水真多| 日韩在线永久免费播放| 亚洲精品动漫人成3d在线|