为什么下面的程序输出结果为aa?子类的同名动态方法不是应该覆盖了父类的同名动态方法吗?
另,我的环境为JDK1.8 windows版
public class Main
{
public static void main(String args[]){
bb b=new bb();
b.p();
}
}
abstract class aa{
public void x(){
System.out.println("aa");
}
}
class bb extends aa{
public void x(){
System.out.println("bb");
}
public void p(){
super.x();
}
}

解决方案 »

  1.   

    你的p()方法是直接调用父类的x()
    b.x() 这个会输出 bb
      

  2.   

    所谓的重写,我理解是一下这种情况
    aa a = new bb()
    a.x()这个时候会打印出
    bb.super.x()调用的是父类中的x()方法
      

  3.   

    子类会可以覆盖父类的同名方法,同时子类允许用 super 调用父类被覆盖的方法。
      

  4.   

    在BB类中,p方法显示的调用父类AA的X方法,虽然BB重写了AA的X方法.如果BB b = new BB();  b.X()就应该打印bb.因为题主用的super.X();故应该打印aa
      

  5.   

    顶一下四楼大佬, super.xx()  兄弟super已经是父类了,可以通过super来调用父类被覆盖的方法