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

          java靜態(tài)方法的繼承

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

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

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

          如何調(diào)用父類(lèi)的靜態(tài)私有方法?
          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?});//第一個(gè)參數(shù)必須為null
          ? ? ?
          return?((Boolean)?ret).booleanValue();
          ????}


          再來(lái)一個(gè)例子:

          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沒(méi)有name()方法或者name()方法里是"Father.name();",則輸出是"father-"
          如果Son的name()方法有自己的實(shí)現(xiàn)(見(jiàn)上面代碼),則輸出"-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


          評(píng)論

          # re: java靜態(tài)方法的繼承  回復(fù)  更多評(píng)論   

          2012-10-03 10:57 by 李慶文
          synchronized ,不知道你的第一段代碼里加了這個(gè)關(guān)鍵是干嘛用的呢?好像沒(méi)什么用處。Thread.sleep的時(shí)候,是整個(gè)線程停止了那些時(shí)間,而且這里好像只有一個(gè)線程,就是main的這個(gè)線程。并不能說(shuō)明父類(lèi)的靜態(tài)方法沒(méi)被子類(lèi)繼承。
          主站蜘蛛池模板: 城口县| 长岭县| 阿拉善左旗| 九台市| 绥化市| 平山县| 湘阴县| 鸡泽县| 平果县| 台湾省| 洮南市| 永善县| 永昌县| 四子王旗| 石楼县| 黑龙江省| 阳城县| 彭泽县| 桦甸市| 石嘴山市| 伊宁市| 松桃| 万盛区| 彭州市| 霍山县| 壶关县| 东安县| 嘉兴市| 沧源| 宣恩县| 穆棱市| 三穗县| 龙井市| 庆阳市| 亳州市| 宁化县| 西盟| 清苑县| 阜阳市| 南召县| 宁远县|