Posted on 2009-07-16 23:12
leekiang 閱讀(2083)
評論(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://m.tkk7.com/jiangmin/articles/69386.html
http://m.tkk7.com/forgood/archive/2009/01/11/250870.html