MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

java静态方法的继承

Posted on 2009-07-16 23:12 leekiang 阅读(1933) 评论(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(nullnew 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


评论

# re: java静态方法的继承  回复  更多评论   

2012-10-03 10:57 by 李庆文
synchronized ,不知道你的第一段代码里加了这个关键是干嘛用的呢?好像没什么用处。Thread.sleep的时候,是整个线程停止了那些时间,而且这里好像只有一个线程,就是main的这个线程。并不能说明父类的静态方法没被子类继承。

只有注册用户登录后才能发表评论。


网站导航: