Переопределение методов (overriding) — это механизм ООП, при котором подкласс предоставляет собственную реализацию метода, уже определённого в его суперклассе. Метод в подклассе должен иметь аналогичное имя, параметры и тип возвращаемого значения (или быть его подтипом).
Ключевые правила:
@Override помогает обнаружить ошибки на этапе компиляции.Пример:
class Animal { public void sound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Woof"); } }
Вопрос: "Можно ли переопределить статический метод в Java?"
Ответ: Нет, статические методы нельзя переопределить. Они скрываются (method hiding). Если объявить статический метод с такой же сигнатурой в подклассе, будет происходить скрытие, а не переопределение.
Пример:
class A { static void print() { System.out.println("A"); } } class B extends A { static void print() { System.out.println("B"); } } A obj = new B(); obj.print(); // напечатает "A"
История
На проекте один из разработчиков попытался "переопределить" static-метод в наследуемом классе, ожидая вызова версии из подкласса по ссылке суперкласса. Это привело к неожиданным результатам: вызывался метод суперкласса, из-за чего программа работала некорректно.
История
Важно использовать аннотацию
@Override. В одном проекте разработчик сделал ошибку в имени метода при переопределении, и без аннотации компилятор не выдал ошибку. В результате по схеме наследования вызывался метод базового класса (по умолчанию), что вызвало неправильную логику в бизнес-процессах.
История
Перекрытие checked-исключений: разработчик добавил в переопределённый метод выбрасывание нового checked-исключения, не заданного в исходной сигнатуре. Код скомпилировался с ошибкой и пришлось менять архитектуру, так как это нарушает правило переопределения исключений.