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

你可能感兴趣的:(java静态方法的继承)