冰浪

          哥已不再年輕 - 堅(jiān)定夢想,畢生追求!
          posts - 85, comments - 90, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          [原]java語言中方法覆蓋的一點(diǎn)思考

          Posted on 2007-02-16 20:15 冰浪 閱讀(443) 評論(1)  編輯  收藏 所屬分類: Java

          ????????? 在java的繼承中,我們可以在子類中定義一方法去覆蓋父類中定義的同名同參方法,這叫方法覆蓋。其中有一點(diǎn)讓我?guī)捉?jīng)思考:父類的私有方法不能被子類覆蓋。
          ??? 我們先來看一個(gè)例程(引用孫MM的,呵呵):
          //Sub.java? ,例程1?
          class Base
          {
          ?private String showMe()
          ?{
          ??return "Base";
          ?}
          ?public void print()
          ?{
          ??System.out.print(showMe());//調(diào)用誰的showMe()方法呢?
          ?}
          }

          class Sub extends Base
          {
          ?public String showMe()
          ?{
          ??return "Sub";
          ?}
          ?public static void main(String[] args)
          ?{
          ??Sub sub=new Sub();
          ??sub.print();
          ?}
          }

          從例程中我們可以看到,在父類Base中定義了一private訪問權(quán)限的showMe()方法,在子類Sub中又定義了public訪問權(quán)限的showMe()方法。
          運(yùn)行這個(gè)例程,得到的打印結(jié)果是“Base”。
          同樣,我們將例程做些修改:將Base類的showMe()方法的訪問權(quán)限改為public,即:
          //Sub.java? ,例程2
          class Base
          {
          ?public String showMe()
          ?{
          ??return "Base";
          ?}
          ?public void print()
          ?{
          ??System.out.print(showMe());
          ?}
          }
          class Sub extends Base
          {
          ?public String showMe()
          ?{
          ??return "Sub";
          ?}
          ?public static void main(String[] args)
          ?{
          ??Sub sub=new Sub();
          ??sub.print();
          ?}
          }
          再次運(yùn)行例程,得到的打印結(jié)果是“Sub”。

          兩次結(jié)果不一致,很顯然是private在作怪,對!一開始我就提到了這點(diǎn):父類的私有方法不能被子類覆蓋。

          在例程2中,sub.print()所調(diào)用的是自己的showMe()方法,此時(shí),Sub類的showMe()方法已覆蓋了父類的方法,所以在Sub類中繼承Base類的print()方法所調(diào)用的就是自己的showMe()方法。

          而在例程1中,Sub類的showMe()方法并不能覆蓋父類Base的showMe()方法,這兩個(gè)showMe()方法之間并不存在覆蓋關(guān)系。此時(shí)先要明白一點(diǎn):print()方法是在Base類中定義的,所以當(dāng)執(zhí)行sub.print()這句代碼時(shí),JVM首先在sub實(shí)例對象時(shí)無法找到匹配的showMe()方法,所以就直接調(diào)用其父類的showMe()方法。然而在例程2中,Sub類的showMe()方法已覆蓋其父類的相應(yīng)方法,所以JVM在sub實(shí)例對象里找到了相匹配的自己的showMe()方法,所以調(diào)用其來執(zhí)行,不再調(diào)用父類的方法。


          評論

          # re: [原]java語言中方法覆蓋的一點(diǎn)思考  回復(fù)  更多評論   

          2007-02-16 20:34 by 喜來了
          不光是private的方法不能重載,static, final都不能重載
          主站蜘蛛池模板: 鲁山县| 林甸县| 遂宁市| 如皋市| 长阳| 仙桃市| 胶州市| 堆龙德庆县| 洛宁县| 江华| 涿州市| 奉化市| 遂昌县| 弋阳县| 东源县| 铜川市| 乡宁县| 灌云县| 天长市| 克什克腾旗| 凤山县| 望江县| 鞍山市| 三江| 泸定县| 潮安县| 武宁县| 大港区| 桑日县| 上饶县| 永年县| 武城县| 万全县| 龙泉市| 凤冈县| 民丰县| 开鲁县| 遂昌县| 永顺县| 阳朔县| 柳江县|