Java Аннотации были введены в Java версии 1.5 и на данный момент аннотация @Override представляет собой одну из встроенных Java-аннотаций. Когда мы применяем эту аннотацию к методу, то это сообщает компилятору, что мы пытаемся переопределить метод суперкласса.
Давайте посмотрим простой пример переопределения метода в Java.
MainClass.java
|
1 2 3 4 5 6 7 8 9 |
package ua.com.prologistic; public class MainClass { public void doSomething(String str){ System.out.println("Метод класса MainClass : " + str); } } |
Теперь давайте создадим подкласс и переопределеним метод doSomething(String str) класса MainClass.
ChildClass.java
|
1 2 3 4 5 6 7 8 9 10 |
package ua.com.prologistic; public class ChildClass extends MainClass{ //@Override public void doSomething(String str){ System.out.println("Вызов в дочернем классе : " + str); } } |
Обратите внимание, что на примере выше @Override аннотация закомментирована.
Теперь давайте создадим тестовый класс, чтобы проверить переопределение в работе.
OverrideTest.java
|
1 2 3 4 5 6 7 8 9 10 |
package ua.com.prologistic; public class OverrideTest { public static void main(String[] args) { MainClass mc = new ChildClass(); mc.doSomething("Переопределили"); } } |
Результат выполнения программы:
|
1 |
Вызов в дочернем классе : Переопределили |
Здесь объект mc имеет тип MainClass, но во время выполнения это объект класса ChildClass, поэтому, когда мы вызываем метод doSomething(String str), Java ищет реализацию в ChildClass и выводит её на экран.
Теперь давайте изменим метод doSomething(String str) класса MainClass, как показано ниже:
|
1 2 3 4 |
//Изменили аргумент со String на Object public void doSomething(Object str){ System.out.println("Метод класса MainClass : " + str); } |
В данном случае компилятор не выдаст никаких предупреждений или ошибок. Результатом выполнения этой программы будет:
|
1 |
Метод класса MainClass : Переопределили |
Причина в том, что метод MainClass doSomething(Object str) больше не переопределяется классом ChildClass и, следовательно, идет вызов реализации MainClass.
Если вы раскомментировать аннотацию @Override в ChildClass, то получите следующее сообщение об ошибке компиляции:
1 Метод doSomething(String) класса ChildClass должен переопределить или реализовать метод суперкласса
Лучше решать такие проблемы во время компиляции, а не во время работы программы. Поэтому всегда используйте аннотацию @Override, когда вы пытаетесь переопределить метода суперкласса.



