Почему объект 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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