class Base { private String showMe() {
return "base";
} public void print() {
System.out.println(showMe());
}
}public class Sub extends Base { public String showMe() {
return "sub";
} public static void main(String[] args) {
Sub sub = new Sub();
sub.print();
}
}执行结果为“Base”。问题:为什么print()方法调用的是Base类的showMe()方法,而不是Sub类的showMe()方法?

解决方案 »

  1.   


    private String showMe() {
            return "base";
        }
    基类 base中这个方法是 私有的,子类没有办法重写,所以就是这个结果啦
      

  2.   

     public void print() {
            System.out.println(showMe());
        }你把这一句放在子类中,因为你重写showMe()方法,而调用print是在父类中调用的,所以只能调用父类中的方法,如果你把这一句放在子类中,则调用的是重写的方法,
    public void print() {
            System.out.println(super.showMe());
        }
    是调用父类中的方法,前提是showMe()为public
      

  3.   

    不是print放在哪里的问题,是#1所说的.
      

  4.   

    子类sub并没有重写父类base的print()方法   
    所以调用父类的print()方法 
    而父类方法当然不能调用子类的方法啊!!
      

  5.   

    刚去仔细想了一下   
    感觉过程应该是这样的:
    1 main()方法运行  用到print()方法 但是子类里并没有 所以去父类里面找
    2 在父类里找到print()方法  执行  又用到showMe() 方法
    3 父类本身找到了showMe()方法   发现是private的 所以子类不可能重写  所以不用再去子类里面查找showMe()方法
      

  6.   

    这么简单 因为 Sub 中没有 print() 方法 所以就是调用父类的 print() 方法
      

  7.   

    这个问题的关键在于print方法到底调用Base类的showMe()方法还是Sub类的showMe()方法。结果为"Base",因为print()方法在Base类中定义,因此print()方法会调用在Base类中定义的private类型的showMe()方法。如果Base类中的showMe()方法改为public类型,那么子类的showMe()方法会覆盖父类的该方法,结果就为"Sub"。
      

  8.   

    原因是由于基类中的showMe()方法是私有的,并不能被子类继承过来
     Sub sub = new Sub();
            sub.print();
    执行的时候,由于子类没有重写父类的print方法,所以会首先调用父类的print方法,
    其次,由于父类showMe()方法是私有,子类无法重写,这时候 只能再调用父类的showMe()方法了