Что "@Override" там в java?
public class Animal {
public void eat() { System.out.println("I eat like a generic Animal."); }
}
public class Wolf extends Animal {
@Override
public void eat() { System.out.println("I eat like a wolf!"); }
}
Есть ли у @Override
какая-то функциональность или просто комментарий?
Ответы
Ответ 1
Из учебников по Java на annotations:
@Override
- аннотация @Override
сообщает компилятору, что элемент предназначен для переопределения элемента объявлено в суперклассе (переопределение методы будут обсуждаться в урок под названием "Интерфейсы и Наследование" ).
// mark method as a superclass method
// that has been overridden
@Override
int overriddenMethod() { }
Хотя для этого не требуется аннотации при переопределении метода, это помогает предотвратить ошибки. Если метод, отмеченный @Override
, не может правильно переопределить метод в одном из его суперклассы, компилятор генерирует ошибку.
Посмотрим на пример, указанный в спецификациях Java Language, 9.6.1.4 Override. Скажем, вы хотите переопределить метод equals
в этом случае, но вы написали:
public boolean equals(Foo that) { ... }
вместо:
public boolean equals(Object that) { ... }
Хотя этот код является законным, аннотация объявления метода equals
с помощью @Override
приведет к ошибке времени компиляции, потому что вы на самом деле не переопределяете ее, вы перегружаете ее. Это может вызвать неприятные ошибки, а тип аннотации Override
помогает при раннем обнаружении их.
Ответ 2
Обозначение переопределения представляет собой аннотацию времени компиляции, которая заставляет java-компилятор выдать ошибку, если метод, содержащий эту аннотацию, фактически не переопределяет метод родительского класса.
Вы можете попытаться изменить класс Вольфа, чтобы не расширять класс Animal, и если присутствует аннотация Override, он покажет вам ошибку времени компиляции
Ответ 3
что-то вроде этого предупреждает во время компиляции, бросая ошибку компиляции, если вы не переопределяете метод.
подобный Q здесь - Когда вы используете аннотацию @Override Java и почему?
Ответ 4
Он работает как комментарий, но также как утверждение о том, что вы на самом деле чем-то переопределяете. Если вы используете @Override, но на самом деле это не переопределяет, компилятор будет генерировать ошибку. Подробнее см. страницу документации.
Ответ 5
Если вы удалите метод "eat" из родительского класса или опечатаете его как "ест" в подклассе, ваш код теперь не скомпилируется. Без аннотации @Override вы можете сделать это, и ваш код все равно будет компилироваться, он просто не будет делать то, что вы хотите (а именно, переопределить метод).
Ответ 6
Во время выполнения он ничего не делает, но он помогает поймать ошибки:
Если вы считаете, что можете переопределить метод, но не можете (из-за проблемы с заданием или типами параметров), без аннотации, код будет компилироваться в нечто бесполезное (например: ваш метод не будет вызываться, но суперкласс, который вы случайно не переопределили, вызывается).