Posted on 2009-07-16 23:12
leekiang 閱讀(2082)
評(píng)論(1) 編輯 收藏 所屬分類:
java
父類(Father)如果定義了一個(gè)靜態(tài)方法,如:
protected synchronized static void echo(String str) throws Exception
{? ???
? ????? System.out.println(str);
? ? ? ? Thread.sleep(10000);
}
Son和Daughter繼承了父類,在兩個(gè)線程里面相繼調(diào)用Son.echo();和Daughte.echo.會(huì)發(fā)現(xiàn)后調(diào)用的要等到先調(diào)用的完后才能調(diào)用,所以echo方法并不是真正的被子類繼承了,它們用的還是Father的方法。
如果把靜態(tài)方法改稱非靜態(tài)的,用new出來的對(duì)象調(diào)用則不會(huì)出現(xiàn)上述情況。
static方法不能被override,而不是不能繼承.
如果Son類里有個(gè)同樣的echo方法,
然后Father p= new Son();p.echo();此時(shí)實(shí)際調(diào)用的是Father的,注意這與非靜態(tài)方法不一樣。
如何調(diào)用父類的靜態(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();
????}
再來一個(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沒有name()方法或者name()方法里是"
Father.name();",則輸出是"father-"。
如果Son的name()方法有自己的實(shí)現(xiàn)(見上面代碼),則輸出"-son"。
參考:
http://bbs.chinaunix.net/archiver/?tid-583540.html
http://www.tkk7.com/jiangmin/articles/69386.html
http://www.tkk7.com/forgood/archive/2009/01/11/250870.html