Java имеет динамическую диспетчеризацию метода, но это только одна диспетчеризация, основанная на типе среды выполнения объекта, метод которого вы вызываете.Не существует динамической диспетчеризации, основанной на типах аргументов во время выполнения, вместо этого метод (если имеется несколько перегруженных методов на выбор) выбирается во время компиляции на основе объявленных типов.
foxi.spielen (гибрид)
foxi
, как известно, Fuchs
.У вас есть следующие перегруженные методы
- public String spielen (Hund h);(унаследовано от Хунда)
- public String spielen (Fuchs f);(объявлено в Fuchs)
hybrid
объявлено как Hund
, поэтому будет вызван первый метод.Неважно, что это на самом деле Fuchs
во время выполнения.Вы получите второй метод с foxi.spielen((Fuchs)hybrid)
.
Может быть, вы намеревались переопределить вместо перегрузки метода?Тогда это действительно напечатало бы ваш ожидаемый результат.Но этого не произошло, потому что для переопределения метода, вы должны точно соответствовать типам параметров.Если вы намереваетесь переопределить метод, вы должны использовать аннотацию @Override
, которая предупредит вас о таких ошибках.