【问题标题】:How does super work in the case of the code below? (java)在下面的代码中 super 如何工作? (爪哇)
【发布时间】:2019-03-19 06:10:58
【问题描述】:
public class Magenta
{
    public void m3()
    {
        System.out.println("Magenta 3");
        m2();
    }
    public void m2()
    {
        System.out.println("Magenta 2");
    }
}
public class Yellow extends Magenta
{
    public void m1()
    {
        System.out.println("Yellow 1");
        super.m2();
    }
    public void m2()
    {
        System.out.println("Yellow 2");
    }
}
public class Key extends Yellow
{
    public void m2()
    {
        System.out.println("Key 2");
    }
}

如果我构造一个Key对象,为什么会这样

(使用Yellow var1 = new Key();)和

call m1();,

为什么不打印Yellow1\nYellow2? 而是打印Yellow 1\nMagenta 2,

这表明对 Key 对象的 super 调用实际上并未在 Key 对象上调用。

我对 super 在这里的工作方式感到困惑,我认为它会被解释为 key 的超类,

这是黄色的,将调用 m2();。

【问题讨论】:

    标签: java oop inheritance polymorphism super


    【解决方案1】:

    当您在 Key 实例上调用 m1() 时,将调用类 Yellow 的方法 m1,因为它由 Key 类继承,而不是在其中被覆盖。

    因此,如果您查看Yellow 中的m1(),它将首先打印"Yellow 1",然后调用超类Magenta 的方法m2(),该方法将打印"Magenta 2"

    这是一个可视化:

    【讨论】:

      【解决方案2】:

      您正在实例化 Yellow 类的对象并调用 m1 方法。其工作原理如下:

      System.out.println("Yellow 1");
      super.m2();
      

      所以它打印"Yellow 1"并调用超类的m2,即Magenta,所以:

      System.out.println("Magenta 2");
      

      【讨论】:

        【解决方案3】:

        Super 关键字表示 Super Class 的对象,

        因此,当您调用 super.m2() 时,它的调用将转到 Super 类方法 m2();

        如果您调用黄色类的 m2() 方法,只需调用 m2() 而不使用 super

        Java 中的超级关键字

        java中的super关键字是一个引用变量,用于 引用父类对象。

        使用 super 和变量:这种情况发生在派生类 和基类具有相同的数据成员。

        使用super with methods:当我们想调用父级时使用 类方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-15
          • 1970-01-01
          • 1970-01-01
          • 2014-04-17
          • 2021-10-16
          • 1970-01-01
          相关资源
          最近更新 更多