class Base {
int i = 99;
public void amethod () {
System.out.println (“Base.amethod ”);
}
Base () {
amethod ();
}
}
public class RType extends Base {
int i = -1;
public static void main (String argv []) {
Base b = new RType ();
System.out.println (b.i);
b.amethod ();
}
public void amethod () {
System.out.println (“RType.amethod ”);
}
}输出结果:
RType.amethod
99
RType.amethod为什么不是
Base.amethod 
99
RType.amethod

解决方案 »

  1.   

    因為RType 也 定義了 amethod 
      

  2.   

    执行Base b = new RType (); 时要调用父类的构造器,父类构造器有调用amethod ();而子类中对amethod ();覆盖了,所以要调用子类中的amethod ();(叫虚方法调用)输出为:RType.amethod。
      

  3.   

        原因是这段代码创建了一个 RType 类的实例但是把它赋予一个指向Base 类的引用。
        在这种情况下,涉及的任何域,比如i,都会指向Base 类中的值,但是方法的调用将
    会指向实际类中的方法而不是引用句柄中的方法。