编写如下代码public class A { 
   public String getValue() { 
       return getRealValue(); 
   } 
   private String getRealValue() { 
       return "a"; 
   } 
} public class AA extends A { 
   protected String getRealValue() { 
       return "aa"; 
   } 
} 使用代码测试:
A a = new AA(); 
System.out.println(a.getValue()); 
得到输出 “a”如果把A类中的private方法getRealValue修改为protected,那就得到“aa”。为什么呀?
-----------------
在core java中看到说类似于A a = new AA(); 这样的语句,虽然a为A类型,但a指向的存储空间所保存的数据仍然是AA类型的。那这样来说应该不管是private的getRealValue还是protected,都应该得到aa呀!

解决方案 »

  1.   

    父类的方法是private的话,子类就没有覆盖,
    如果不是private的话,调用的时候就动态绑定,调用子类自己的方法,就得到了楼主的结果
      

  2.   

    在面向对象中你忽略了一个问题,那就是在继承的时候,父类的修饰符不能比子类更严格,这样子子类没有办法继承下去了。你说的private String getRealValue(),他是父类的方法,那么子类不可能用protected覆盖它了,直接继承下来,所以调用是父类的,当你把它改成protected的时候,就可以覆盖了。你把父类和子类中的方法修饰符换一下试试。
      

  3.   

    在用子类初始化父类对象的时候,对象只能访问父类的属性和方法。当父类的方法为protected的时候,调用时会自动转想子类的同名方法。
      

  4.   

    派生类AA不能override(覆盖)基类A的私有成员方法,既然没有覆盖所以也就谈不上如core java中所指的动态绑定了。
    如果把A类中的private方法getRealValue修改为protected那么AA继承了getRealvalue()就可以覆盖它了。
      

  5.   

    在继承里,子类的修饰符要比父类的严格。
    A a = new AA(); 用子类创建父类,只有子类继承的变量和方法或改写父类的方法可用,而你的子类没有改写父类的方法,而是重新定义了一个新的方法了
      

  6.   

    a指向的存储空间所保存的数据确实仍然是AA类型,但调用的getValue()方法是其父类的.在a对象里并没有getValue()方法,即没有重写getValue()方法.而同时父类的getRealValue()是private的,不能被子类重写.
    所以过程大致如下:
    A a = new AA(); 
    System.out.println(a.getValue()); 
    a 在执行getValue()方法时会先向上转行成A类型,执行A类型的getValue().而A类型中的getRealValue()方法是是private的,故而在调用的时候不会动态绑定到AA类型的getRealValue(),所以还是调用A类型的getRealValue()方法.
      

  7.   

    这个无法override的,我在JBuilder2006里面将A中的private擦掉,变成package(或其他更高的)级别,AA中的getRealValue()方法就立刻变成了斜体(override method)。上面说的是废话。private methods之所以无法override还有一个原因,那就是在某些情况下,编译器会将private方法编译为内联函数(inline),而内联函数是永远不可能实现多态的