Posted on 2009-07-16 23:12
leekiang 阅读(2079)
评论(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.blogjava.net/jiangmin/articles/69386.html
http://www.blogjava.net/forgood/archive/2009/01/11/250870.html