关键字super在java谜题中的作用

关键字super在java谜题中的作用,java,inheritance,private,super,Java,Inheritance,Private,Super,我的问题是为什么输出是BO,D1而不是BO,B1。我不明白super关键字如何起到调用子类而不是父类的方法的作用。因为类B中的方法m0是私有的,它不会被类D覆盖。所以super关键字确保调用的测试函数的版本来自于超类(特别是B.test(),而不是反复调用D.test() 但这并不能完全回答你的问题 第二项之所以是D1而不是B0,是因为D.m1()多态性地覆盖了B.m1() 第一项之所以是B0而不是D0,是因为D.m0()不会覆盖B.m0(),因为B.m0是私有的。方法m0在类B中是私有的。因此

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

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

所以super关键字确保调用的测试函数的版本来自于超类(特别是B.test(),而不是反复调用D.test()

但这并不能完全回答你的问题

第二项之所以是D1而不是B0,是因为D.m1()多态性地覆盖了B.m1()


第一项之所以是B0而不是D0,是因为D.m0()不会覆盖B.m0(),因为B.m0是私有的。

方法m0在类B中是私有的。因此继承时,m0方法是私有的,不会在类D中继承。因此,执行类B的方法m0并打印“BO”

但是当执行这个.m1()时,它被类D中的方法m1覆盖。因此它打印“D1”

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();
    }


}