java 多態產生的疑問

          對于標準的多態示例程序
          Class A {
          public void test(){
          System.out.println("A");
          }
          }
          Public Class B extends A{
          //@override 有無都不會報錯
          public void test(){
          System.out.println("B");
          }
          public static void main(String[] arguments){
              A a=new B();
              a.test();
          }
          }
          /*output:
          B
          *///:~
          這個程序很好的示意了向上轉型后A對B實例的test的調用。
          然而并不是所有的類型的方法都能夠支持多態。對于是private的方法,我們應該格外注意。
           1

          package cn.edu.neu.deepweb407.gui;

          public class A {
          private  void test(){
           System.out.println("A");
          }

          public static void main(String[] arg1s) {
           A a=new B();
           a.test();
          }
          }
          class B extends A{
           public void test(){
            System.out.println("B");
           }
          }

          16/*output:
          17A
          18*/
          //:~
          這個結論是,a.test()調用的是A類的方法test。因為B中的test方法并不是覆蓋了A類的方法。因此,A調用的只是他自身的test方法。大家注意的是,盡量不要在子類中聲明和父類私有方法相同名稱的方法。

          posted on 2012-07-10 17:27 scorpio小蝎 閱讀(409) 評論(7)  編輯  收藏

          評論

          # re: java 多態產生的疑問 2012-07-11 09:06 rubyliu12

          你這個也太扯淡了吧
          你代碼里B有繼承A嗎?沒繼承的話A a=new B();這樣編譯能通過?
          最后A類是私有的test的方法的話
          A a=new B();
          a.test();可以這么寫?不知道樓主是這么編譯和運行及得出的結論。看樓主的其他文章感覺也不是剛出道的菜鳥啊。
            回復  更多評論   

          # re: java 多態產生的疑問 2012-07-11 09:43 scorpio小蝎

          @rubyliu12
          謝謝指正,代碼貼錯了,已修改。   回復  更多評論   

          # re: java 多態產生的疑問 2012-07-11 09:56 scorpio小蝎

          @rubyliu12
          A類中 private test() 的方法由于main方法是在A類中 所以可以調用。這只是個demo。其實際意義是,如果A類中public方法調用了A類的private方法,而由于子類重寫了A類的private方法,將會出現如題所述的問題。有問題歡迎指教   回復  更多評論   

          # re: java 多態產生的疑問 2012-07-11 09:59 scorpio小蝎

          class A {
          private void test(){
          System.out.println("A");
          }
          public void get(){
          test();
          }
          }
          public class B extends A{
          //@override 不能有,因為private的方法被自動認為是final的且不能被訪問。
          public void test(){
          System.out.println("B");
          }

          public static void main(String[] args) {
          A a=new B();
          a.get();
          }
          }  回復  更多評論   

          # re: java 多態產生的疑問 2012-07-11 10:00 rubyliu12

          而由于子類重寫了A類的private方法?
          private的方法是私有的存在被子類重寫這樣的說話。  回復  更多評論   

          # re: java 多態產生的疑問 2012-07-11 10:08 scorpio小蝎

          @rubyliu12
          按照概念來講,不能叫做重寫,因該叫做子類新增了方法,但是形式上以及方法名是一模一樣的,很多新人都不會注意這點,為了區分才提出的。  回復  更多評論   

          # re: java 多態產生的疑問 2012-07-11 10:09 scorpio小蝎

          @rubyliu12 這句話里有提到,并不是真正意義的覆蓋“這個結論是,a.test()調用的是A類的方法test。因為B中的test方法并不是覆蓋了A類的方法。因此,A調用的只是他自身的test方法。大家注意的是,盡量不要在子類中聲明和父類私有方法相同名稱的方法。”不過你這個問題提的很不錯,這樣子大家看得更清楚了
            回復  更多評論   


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


          網站導航:
           
          <2012年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 昌吉市| 青海省| 沁水县| 浪卡子县| 崇仁县| 休宁县| 台南市| 禄劝| 洛浦县| 新河县| 通州区| 通道| 淮滨县| 亚东县| 牙克石市| 新乡市| 从化市| 侯马市| 阿瓦提县| 景谷| 阳原县| 长泰县| 开化县| 宜都市| 安阳市| 报价| 襄汾县| 拜城县| 南阳市| 巫山县| 林州市| 临猗县| 佛教| 板桥市| 沁阳市| 丁青县| 汤原县| 娄底市| 慈溪市| 中阳县| 秭归县|