Пример 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;
}
}
класса 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