Аннотация @Override. Переопределение метода
Аннотация @Override используется перед объявлением метода и означает, что метод был переопределен.
Например, в классе Program есть единственный метод display().
public class Program {
public void display() {
System.out.println("program");
}
}
Так же есть класс JavaProgram, который является наследником класса Program. В нем есть метод display(), который помечен аннотацией @Override.
public class JavaProgram extends Program{
@Override
public void display() {
System.out.println("Java program");
}
}
Переопределение метода - это возможность определить метод так, чтобы его сигнатура (название, аргументы, возвращаемый тип) совпадала с сигнатурой метода класса-родителя, но реализация была специфична подклассу. Благодаря этому можно описать характерное поведение для нашего дочернего класса, в нашем случае - JavaProgram.
Program program = new Program();
program.display(); // program
JavaProgram javaProgram = new JavaProgram();
javaProgram.display(); // Java program
При переопределении метода необходимо помечать его аннотацией @Override. На то есть несколько причин:
- Увеличивается читаемость кода;
- Исключается риск опечатки в сигнатуре метода.
Если же не написать эту аннотацию, то все будет работать, но мы лишим себя преимуществ описанных выше.
Пример вызова метода класса-наследника через ссылку класса-родителя
JavaProgram также является Program. Поэтому можно создать объект от класса JavaProgram с типом Program.
Program javaProgram = new JavaProgram();
Тем самым будет возможность использовать только методы Program, но с реализацией от класса JavaProgram.
Создадим еще класс PhpProgram, и так же наследуемся от Program.
public class PhpProgram extends Program{
@Override
public void display() {
System.out.println("Php program");
}
}
Теперь можно создать несколько различных программ и в цикле вызвать метод display(),
Program program = new Program();
Program javaProgram = new JavaProgram();
Program phpProgram = new PhpProgram();List<Program> programs = new ArrayList<>();
programs.add(program);
programs.add(javaProgram);
programs.add(phpProgram);for (Program p : programs) {
p.display();
}
Вывод методов display():
program
Java program
Php program
В этом примере раскрывается не только суть переопределения, но и основная идея полиморфизма.