java-Java 谜题中关键字 super 的工作原理

How the key word super works in java-Java Puzzle

public class B {

    public B() {

    }

    private void m0(){
        System.out.println("BO");
    }
    public void m1(){
        System.out.println("B1");

    }

    public void test(){
        this.m0();
        this.m1();
    }
}



public class D extends B{

    /**
     * 
     */
    public D() {

    }

    public void m0(){
        System.out.println("DO");
    }
    public void m1(){
        System.out.println("D1");

    }

    public void test(){
      super.test();
    }

    public static void main(String[] args) {
        B d=new D();
        d.test();
    }


}

我的问题是为什么输出是 BO,D1 而不是 BO,B1。我不明白 super 关键字如何发挥调用子 class 而不是父 class 的方法的作用。

因为 class B 中的方法 m0 是私有的,所以它不会被 class D 覆盖。

所以 super 关键字确保被调用的测试函数的版本来自 super class (具体来说 B.test() 而不是回溯调用 D.test() ).

但这并不能准确回答您的问题。

第二项是 D1 而不是 B0 的原因是 D.m1() 多态性地覆盖了 B.m1()。

第一项是 B0 而不是 D0 的原因是 D.m0() 不会覆盖 B.m0() 因为 b.m0 是私有的。

方法m0在classB中是private的。所以在继承时,m0方法是私有的,在classD中不被继承。所以,classB的方法m0是执行并打印 "BO"。

但是执行this.m1()时,被classD中的m1方法重写了,所以打印"D1"