这是因为方法覆盖的原因,你的base B = new SubClass();所以它调用的是subclass的实例的方法。

解决方案 »

  1.   

    是多态性问题,
    b实际指向的是一个subClass类(子类)的对象,其上溯造型到base(父类)
    此时,b(儿子)是以父亲的身分出现,别人要访问b的属性时,得到的当然是父亲的属性值,也就是b.x为2
    而b.method()方法执行的是b儿子的方法,因为父亲能做的事,儿子可不一定会啊,所以返回的是3.
      

  2.   

    还是不懂,为什么b.x调用b中的x,而b.method()却调用subclass中的方法呢
      

  3.   

    icy_csdn不是说的很清楚了吗?
      

  4.   

    为什么访问属性的时候用base类的,而访问方法的时候用subclass类的呢?这一点能将清楚吗?既然上溯造型到父类,那么b.method()也应该调用父类的啊?!
      

  5.   

    有2是因为-变量覆盖和方法覆盖-有区别,不论你实际上赋给b的是什么,b.x都指向b类的实例变量,而b.method()在会动态寻找到子类的方法。这个问题就这么解释了,具体可以看看关于对象模型的书。
      

  6.   

    b被造型成Base后,b.x指的是Base的x,但是Base的method方法被subclass覆盖了,所以当调用b.method()时调用的是subclass的。如果你不覆盖method,你就可以运行Base中的方法了
      

  7.   

    再作个小比喻
    先前说过,b(儿子)是以父亲的身份出现的,既然是以父亲的身份出现的,那么b的身份就是父亲,即其b的属性是父亲的属性,也就是说b.x=2;
    对于方法b.method()而言,是要b(儿子)做件事情,当然是b(儿子)自己做,又不是他父亲做。因此,b.method()返回的是3。