在以下代码的情况下,super如何工作? (java)

时间:2019-03-19 06:10:58

标签: java inheritance polymorphism super

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对象上调用对key对象的super调用。

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

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

3 个答案:

答案 0 :(得分:2)

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

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

因此它打印"Yellow 1"并调用m2的超类的Magenta,因此:

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

答案 1 :(得分:2)

m1()实例上调用Key时,将调用类m1的方法Yellow,因为它是Key类的继承者,并且不会在其中覆盖。

因此,如果您查看m1()的{​​{1}}内部,它将首先打印Yellow,然后它将调用超类"Yellow 1"的方法Magenta,将打印m2()

以下是可视化效果:

enter image description here

答案 2 :(得分:0)

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

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

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

Java中的超级关键字

  

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

     

将super与变量一起使用:当派生类出现这种情况   和基类具有相同的数据成员。

     

将super与方法配合使用:当我们要调用父级时使用   类方法。