public class Test8 {
     public static void main(String [] args){
         Base b = new Subclass();
         System.out.println(b.x);
         System.out.println(b.method());
     }
}
class Base{
     int x = 2;
     int method(){
         return x;
     }
}
class Subclass extends Base{
     int x = 3;
     int method(){
         return x;
     }

此程序的结果为什么是2 3,请指教!

解决方案 »

  1.   

    首先,楼主应该知道自己创建的的那个subClass对象给向上转型为Base对象处理
    (Base b = new Subclass();)然后我给楼主介绍一下多态和绑定的问题。一般通过对象调用这个对象的字段(如你的程序中:b.x),是进行前期绑定的。所谓前期绑定就是说,调用什么是在编译的时候就已经决定的。因为你的程序把subClass对象当作Base对象处理,所以在编译的时候就会把x跟Base对象的x绑定起来,因此输出的是Base的2。另外,通过对象调用一个方法时(b.method()),是进行后期绑定的,也说成是“运行时绑定”。这个跟多态有关。这个编译的时候,编译器还是把你的subClass对象当作Base对象处理,但是方法的调用是在运行的时候才调用的。运行的时候发生了一个很奇特的事情就是JVM竟然知道你那个向上转型的Base对象其实本质是一个subClass对象,因此JVM会调用cubClass的method方法 ,而不是Base的method方法。这个也是多态的一个例子。不过,当对象调用final和static的方法时却不是进行后期绑定的,也是进行前期绑定。这个你可以试试。
      

  2.   

    看看here:
    http://blog.csdn.net/f_acme/archive/2006/02/28/611878.aspx