冰浪

          哥已不再年輕 - 堅(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)思考:父類的私有方法不能被子類覆蓋。
          ??? 我們先來看一個例程(引用孫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)行這個例程,得到的打印結(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()方法,此時,Sub類的showMe()方法已覆蓋了父類的方法,所以在Sub類中繼承Base類的print()方法所調(diào)用的就是自己的showMe()方法。

          而在例程1中,Sub類的showMe()方法并不能覆蓋父類Base的showMe()方法,這兩個showMe()方法之間并不存在覆蓋關(guān)系。此時先要明白一點(diǎn):print()方法是在Base類中定義的,所以當(dāng)執(zhí)行sub.print()這句代碼時,JVM首先在sub實(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都不能重載
          主站蜘蛛池模板: 芜湖县| 积石山| 额敏县| 防城港市| 南岸区| 苍溪县| 嘉荫县| 桐梓县| 北京市| 阿尔山市| 定安县| 禄丰县| 宁德市| 蒙阴县| 象州县| 江门市| 南陵县| 抚顺市| 宣武区| 礼泉县| 乐东| 武胜县| 田阳县| 海盐县| 鸡泽县| 昭觉县| 龙口市| 会宁县| 深圳市| 准格尔旗| 荔波县| 普陀区| 美姑县| 柯坪县| 玉山县| 射洪县| 黄冈市| 潼南县| 连州市| 巍山| 达拉特旗|