【问题标题】:How the key word super works in java-Java Puzzle关键词super在java中的作用-Java拼图
【发布时间】:2015-11-07 09:09:43
【问题描述】:
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 关键字如何扮演调用子类而不是父类的方法的角色。

【问题讨论】:

    标签: java inheritance private super


    【解决方案1】:

    方法m0在B类中是私有的,所以在继承时,m0方法是私有的,在D类中没有被继承。所以,B类的方法m0被执行,打印出“BO”。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2018-05-30
          • 2011-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-15
          • 2016-08-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多