冰浪

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

          [原]java語言中方法覆蓋的一點思考

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

          ????????? 在java的繼承中,我們可以在子類中定義一方法去覆蓋父類中定義的同名同參方法,這叫方法覆蓋。其中有一點讓我?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()方法。
          運行這個例程,得到的打印結(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();
          ?}
          }
          再次運行例程,得到的打印結(jié)果是“Sub”。

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

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

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


          評論

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

          2007-02-16 20:34 by 喜來了
          不光是private的方法不能重載,static, final都不能重載
          主站蜘蛛池模板: 嘉禾县| 曲周县| 宁波市| 兴安盟| 井研县| 白河县| 富裕县| 长春市| 东台市| 依兰县| 荔波县| 谷城县| 阿城市| 宜兰县| 茂名市| 临泉县| 乐都县| 定远县| 西贡区| 绥化市| 苏尼特左旗| 长治市| 光泽县| 延川县| 台东市| 苍山县| 白朗县| 英吉沙县| 绵竹市| 沿河| 子洲县| 曲水县| 乐至县| 平塘县| 登封市| 连城县| 保定市| 垫江县| 南宁市| 盱眙县| 龙陵县|