В результате вывод строки tm.m(mm);
равен B, потому что вызванный метод - public void m( Top p )
класса Top .
Здесь две концепции:
- в строке
Top tm = new Middle();
, даже если вы соединили tm
с калькулятором среднего класса, это все равно ссылка на объект типа Top , поэтому методы tm
Объектом будут методы класса Top .Реализация этих методов заключается в том, что они написаны в верхнем классе, если они не переопределены в своем подклассе. - Сигнатура вовлеченного метода не совпадает в верхнем классе Top и егоподкласс Middle : метод
public void m( Top p )
не существует в среднем классе.Таким образом, метод высшего класса не переопределяется методом его подкласса.
Вы должны посмотреть на строки
tm.m(bb); // K
tb.m(bb); // X
в качестве примера того, что я говорю.На самом деле tm является Top, но метод public void m(Bottom)
существует в обоих классах Top и Middle, поэтому используется реализация класса Middle, и метод выводит «K» вместо «C».Та же причина для tb : это ссылка на объект Top, но в классе Top "granmother" метод public void m( Bottom p )
переопределяется, поскольку он находится в обоих классах с одинаковой сигнатурой.