Как работает super в случае приведенного ниже кода? (java)

#java #oop #inheritance #polymorphism #super

#java #ооп #наследование #полиморфизм #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");
    }
}
  

Почему, если я создаю ключевой объект

(Используя Yellow var1 = new Key(); ) и

call m1(); ,

почему он не печатает, Yellow1nYellow2? Вместо этого он печатает Yellow 1nMagenta 2,

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

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

который является желтым, будет вызывать m2();.

Ответ №1:

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

Итак, если вы заглянете внутрь m1() of Yellow , он сначала напечатает "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.m2() , его вызовы переходят к методу суперкласса m2();

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

Ключевое слово Super в Java

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

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

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