关键词super如何在java-Java Puzzle中起作用

时间:2015-08-14 07:24:09

标签: java inheritance private super

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关键字如何扮演调用子类的方法而不是父类的角色。

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

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

但这并没有完全回答你的问题。

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

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

答案 2 :(得分:0)

方法m0在B类中是私有的。因此在继承时,m0方法是私有的,并且不在D类中继承。因此,执行B类的方法m0和" BO"打印出来。

但是当执行this.m1()时,它会被D类中的方法m1覆盖。所以它会打印" D1"