MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          java靜態方法的繼承

          Posted on 2009-07-16 23:12 leekiang 閱讀(2084) 評論(1)  編輯  收藏 所屬分類: java
          父類(Father)如果定義了一個靜態方法,如:
          protected synchronized static void echo(String str) throws Exception
          {? ???
          ? ????? System.out.println(str);
          ? ? ? ? Thread.sleep(10000);
          }
          Son和Daughter繼承了父類,在兩個線程里面相繼調用Son.echo();和Daughte.echo.會發現后調用的要等到先調用的完后才能調用,所以echo方法并不是真正的被子類繼承了,它們用的還是Father的方法。
          如果把靜態方法改稱非靜態的,用new出來的對象調用則不會出現上述情況。

          static方法不能被override,而不是不能繼承.

          如果Son類里有個同樣的echo方法,
          然后Father p= new Son();p.echo();此時實際調用的是Father的,注意這與非靜態方法不一樣。

          如何調用父類的靜態私有方法?
          private?static?boolean test(String?s) thows Exception
          ????{
          ????? Class?c?
          = Test.class;
          ????? Method?m;
          ????? Object?ret?
          =?null;
          ? ??? m?=?c.getDeclaredMethod("test", new?Class[]?{ String.class});
          ????? m.setAccessible(
          true);//必須加
          ????? ret?
          =?m.invoke(null,?new?Object[]?{ s?});//第一個參數必須為null
          ? ? ?
          return?((Boolean)?ret).booleanValue();
          ????}


          再來一個例子:

          public?class?Father?{
          ????
          private?static?String?n?=?"";
          ????
          public?static?void?name()?{
          ????????n?
          =?"father";
          ????}
          ????
          public?static?String?getN()?{
          ????????
          return?n;
          ????}
          }

          public?class?Son?extends?Father?{
          ????
          private?static?String?n?=?"";
          ????
          public?static?String?getN()?{
          ????????
          return?n;
          ????}
          ????
          public?static?void?name()?{
          ????????
          //Father.name();
          ????????n="son";
          ????}
          }

          public?class?TestStatic?{
          ????
          public?static?void?main(String[]?args)?{
          ????????Son.name();??
          ? ? ? ? System.out.println(Father.getN()
          +"-"+Son.getN());
          ????}
          }
          如果Son沒有name()方法或者name()方法里是"Father.name();",則輸出是"father-"
          如果Son的name()方法有自己的實現(見上面代碼),則輸出"-son"。


          參考:
          http://bbs.chinaunix.net/archiver/?tid-583540.html
          http://www.aygfsteel.com/jiangmin/articles/69386.html
          http://www.aygfsteel.com/forgood/archive/2009/01/11/250870.html


          評論

          # re: java靜態方法的繼承  回復  更多評論   

          2012-10-03 10:57 by 李慶文
          synchronized ,不知道你的第一段代碼里加了這個關鍵是干嘛用的呢?好像沒什么用處。Thread.sleep的時候,是整個線程停止了那些時間,而且這里好像只有一個線程,就是main的這個線程。并不能說明父類的靜態方法沒被子類繼承。
          主站蜘蛛池模板: 精河县| 岱山县| 常山县| 舟曲县| 兴城市| 东海县| 柘荣县| 通道| 内黄县| 汤原县| 甘肃省| 凤城市| 肥城市| 石景山区| 甘泉县| 中宁县| 夏津县| 三台县| 武功县| 同心县| 玛沁县| 太保市| 九台市| 沁水县| 葫芦岛市| 永嘉县| 伊川县| 杭州市| 宜春市| 连云港市| 威宁| 昭通市| 土默特左旗| 安乡县| 科尔| 灌云县| 合江县| 宝山区| 临朐县| 汉阴县| 社会|