#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 с методами: это используется, когда мы хотим вызвать метод родительского класса.