Выходное значение равно WuffRingding
, поскольку метод public String spielen(Hund h)
равен перегружен в дочернем классе Fuchs
до public String spielen(Fuchs f)
.Java вызывает метод типа, а не фактического экземпляра, когда метод перегружен.
Таким образом, здесь используется тип Hund
для переменной hybrid
, и поскольку вызываемый метод определяется навремя компиляции перегруженных методов. Перегруженный метод класса Hund
вызывается, хотя он указывает на экземпляр Fuchs
.
Теперь вы указали экземпляр Fuchs
в качестве параметра для spielen(Hund h)
который явно принимает тип Hund
в качестве параметра, это работает, так как Hund
является родителем Fuchs
и может содержать ссылку Fuchs
, что в сочетании с динамическим полиморфизмом во время выполнения / bellen
метода Fuchs
класс вызывается вместо Hund
, так как во время выполнения проверяется тип экземпляра, и он фактически указывает на экземпляр Fuchs
.
TLDR;
- Вызывается
spielen
для ссылки Hund
, вызывает spielen
класса Hund
при его перегрузке. - Передал экземпляр
Fuchs
, поэтому во время выполнения метод bellen
Fuchs
это вызовредактируется вместо Hund
из-за динамического метода диспетчеризации / полиморфизма времени выполнения .