3.7 What is displayed when the following piece of code is compiled and executed?
class Test {
   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;
   }
}
希望能够详细说这道题。把知识点说道

解决方案 »

  1.   

    输出2,3因为Java中类的成员变量不会被覆盖,所以
    Base b = new Subclass();
    System.out.println(b.x);//这样得到的是Base 类中的x值
    System.out.println(b.method());//方法会被覆盖,所以调用的是Subclass的method方法
    而在Subclass中return x的x实际上是Subclass中的x而不是Base的
      

  2.   

    如果你了解C++ 的继承的话,这个就很容易理解了。
    new Subclass(); 这个方法,至少会在内存中分配两个int 变量空间,来存放Base.x 和Subclass.x。但是,这个类还会存在一个指针,指向Subclass 的函数表(无法指向Base 的函数表,这个和C++ 还是有那么一点点区别的)。
    b.x 代表着读取Base.x 内存空间的值
    而b.method() 则会根据指针指向Subclass.method(),而在这个方法里,会返回Subclass.x 这个内存空间的值。