Почему объект 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»