public  class  Foo  
{  
   static  void  putout()  
   {  
       System.out.println("OK");  
   }  
}  
public  class  Fooing  extends  Foo  
{  
     static  void  putout()  
   {  
       System.out.println("Good");  
   }  
 
   public  static  void  main(String[]  args)  
   {  
     Foo  f=new  Fooing();  
     f.putout();  
       
   }  
}  
请问结果是什么?解释一下!

解决方案 »

  1.   

    有个毛结果
    编辑都不会通个两个public 类
      

  2.   

    大哥!不要老是用这样的名字。我给你详细讲一讲吧。
    输出“ok”,原因是这样的:
    因为Foo 和Fooing中的putout()是static的,静态(类)方法不属于某个实例,所以所谓的f.putout()中其实f的类型就是foo。因为你定义的是Foo f ,f.putout()这与后面的new什么没关系,因为它是个类方法,本质上它等同于Foo.putout() 。
    可能上面说的不明白,再考虑一个例子,如果你的例子中,putout()没有修饰符static,那么这个例子答案是“Good”,因为这时候putout()是与实例相关的,而你在定义实例的时候Foo f=new Fooing(); f的引用的对象实际是Fooing的实例,这时候你去调用putout()就会调用Fooing中的putout(),也就是“Good” 。
    一句话,调用类方法的时候就别考虑new的是什么,因为实际静态方法实际推荐使用类名引用的。如:Foo.putout() ,Fooing.putout() ,但是普通的方法一定要关注的是new 后面的类究竟是什么,主要不是用 super.putout(),那么就是指子类中的方法。