Почему объект upcast вызывает метод подкласса, который переопределяет метод суперкласса?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему объект upcast вызывает метод подкласса, который переопределяет метод суперкласса?

Сообщение Anonymous »

В процессе изучения Java я знаю, что объект upcast будет вызывать метод подкласса, который переопределяет метод суперкласса. Например, JLS 8.4.8.1:

Пример 8.4.8.1-1. Переопределение

Код: Выделить всё

class Point {
int x = 0, y = 0;
void move(int dx, int dy) { x += dx; y += dy; }
}
class SlowPoint extends Point {
int xLimit, yLimit;
void move(int dx, int dy) {
super.move(limit(dx, xLimit), limit(dy, yLimit));
}
static int limit(int d, int limit) {
return d > limit ? limit : d < -limit ? -limit : d;
}
}
Здесь класс SlowPoint переопределяет объявления метода перемещения
класса Point своим собственным методом перемещения, который ограничивает расстояние, которое
/>точка может перемещаться при каждом вызове метода. Когда метод move
вызывается для экземпляра класса SlowPoint, всегда будет вызываться переопределяющее
определение в классе SlowPoint, даже если
ссылка на объект SlowPoint берется из переменной, тип которой
Point.


Сегодня я попытался найти соответствующие спецификации в JLS. Я нашел несколько соответствующих абзацев, но это меня смутило:
JLS 15.12.1:

Для типа При поиске необходимо учитывать шесть случаев, в зависимости от
формы, которая предшествует левой скобке вызова метода:
...
• Если форма — ИмяВыражения. [TypeArguments] Идентификатор, то
типом для поиска является объявленный тип T переменной, обозначенной
ExpressionName, если T является классом или тип интерфейса
или верхнюю границу
T, если T является переменной типа.

Согласно этому правилу, если есть Суперкласс superclass = new Subclass();
Тогда для superclass.Identifier();,

Код: Выделить всё

superclass
разрешается как ИмяВыражения. Но объявленный тип суперкласса — это Суперкласс, а не Подкласс. Таким образом, вызов метода должен искать в суперклассе, а не в подклассе. Разве это не противоречие?
Я подозреваю, что что-то упустил или что-то не так понял, поэтому обращаюсь за помощью сюда.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -method-of

Вернуться в «JAVA»