日期:2014-05-20  浏览次数:20699 次

一个小程序,难道无数人,来看看!
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();    
             
      }    
}    
请问结果是什么?解释一下!

------解决方案--------------------
有个毛结果
编辑都不会通个两个public 类
------解决方案--------------------
应该是输出OK,不过你别用这么吓人的标题了,听不到好话的.
------解决方案--------------------
是ok
------解决方案--------------------

------解决方案--------------------
大哥!不要老是用这样的名字。我给你详细讲一讲吧。
输出“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(),那么就是指子类中的方法。
------解决方案--------------------
这也难倒无数人??