代码如下:
class SuperBase{ void print(SuperBase a){ System.out.print("Super ");}}
class Base extends SuperBase{  void print(Base a){ System.out.print("Base ");} }
class Derived extends Base{ static void print(Derived c) { System.out.print("Derived "); }}public class Test {
public static void main (String [] args)  {
SuperBase a1 = new SuperBase();
SuperBase b1 = new Base();
Base c1 = new Derived(); a1.print(new Base());     // line1,输出Super
b1.print(new Derived());  // line2,输出Super
c1.print(new Derived());  // line3,输出Base

}
}SuperBase,Base,Derived 三个类的print方法应该算重载(overload),
第一个:line1 里的new Base()被向上转型(upCasting),所以调用SuperBase的pring()方法输出"Super"。
第二个:应该是传说的动态绑定,所以应该调用Base里的print()方法的。为何没有呢?(注:难到因为Base()里没有Base(new Derived()这个构造函数,又转向了SuperBase里??))
第三个:解释不下去了,高手说说吧......

解决方案 »

  1.   

    static void print(Derived c)注意这里的static 所以说Derived并没有对父类覆盖
      

  2.   

    去掉static也是一样的结果呀.希望有大牛来解惑.........
    up~!
      

  3.   

    覆盖方法的规则:
       1、具有相同的signature(即方法名,参数类型,顺序都一样)
       2、比它所覆盖的方法访问性更宽。
       3、比它所覆盖的方法抛出更少的异常(即:同样或子类的异常,或不抛出)。unchecked异常不遵守这条规则,比如:RuntimeException()
       4、静态的不能被非静态覆盖. 非静态的不能被静态覆盖.这样理解的话,问题很明显,Base和Derived 都不是覆写(override)父类的方法,所以这里是方法的重载而不是覆写,不具有多态的特性.既然不是多态,调用方法就是根据编译期类型(或者说形式类型)来调用.
    比如
    SuperBase a1 = new SuperBase();
    a1的编译期类型就是SuperBase,所以他调用SuperBase的print方法,打印Super
      

  4.   

    呵呵,没看到lss的。。不然不发了>_<