Как работает супер в случае кода ниже?(Джава) - PullRequest
2 голосов
/ 19 марта 2019
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,

, которые предполагают, что вызов super для объекта Key на самом деле не вызывается для объекта Key.

Я смущен тем, как супер работает здесь, я думал, что это сделает его суперклассом ключа,

желтый, будет вызывать m2 ();. 1018 *

Ответы [ 3 ]

2 голосов
/ 19 марта 2019

Когда вы вызываете m1() для экземпляра Key, метод m1 класса Yellow вызывается, поскольку он наследуется классом Key и не переопределяется внутри него.

Так что, если вы заглянете внутрь m1() из Yellow, он сначала напечатает "Yellow 1", а затем вызовет метод m2() суперкласса *1012*, который напечатает "Magenta 2".

Вот визуализация:

enter image description here

2 голосов
/ 19 марта 2019

Вы создаете экземпляр объекта класса Yellow и вызываете метод m1.Это работает следующим образом:

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

Таким образом, он печатает "Yellow 1" и вызывает m2 суперкласса, который равен Magenta, поэтому:

System.out.println("Magenta 2");
0 голосов
/ 19 марта 2019

Ключевое слово Super обозначает объект Суперкласса,

Поэтому, когда вы звоните super.m2(), его вызовы переходят в метод суперкласса m2();

если вы вызываете метод m2 () желтого класса, просто вызовите m2() без использования super.

Супер-ключевое слово в Java

Ключевое слово super в java - это ссылочная переменная, которая используется для ссылаются на объекты родительского класса.

Использование super с переменными: этот сценарий происходит, когда производный класс и базовый класс имеет одинаковые члены данных.

Использование super с методами: используется, когда мы хотим вызвать parent метод класса.

...