Ответ
Переопределение методов (method overriding) — это механизм в объектно-ориентированном программировании, позволяющий дочернему классу предоставить свою, специфическую реализацию метода, который уже определён в его родительском классе.
Условия корректного переопределения в Java:
- Та же сигнатура: Имя метода, тип, количество и порядок параметров должны совпадать.
- Совместимый возвращаемый тип: В Java 5+ допускается ковариантный возвращаемый тип (можно вернуть подтип исходного типа).
- Нельзя сужать модификатор доступа: Доступ в дочернем классе должен быть таким же или шире (public → public, protected → public/protected).
- Нельзя добавлять новые проверяемые исключения: Можно добавлять только непроверяемые (unchecked) или сужать тип исключений.
Пример переопределения:
class Animal {
// Метод, который будет переопределён
public void makeSound() {
System.out.println("The animal makes a sound");
}
protected String getFood() {
return "some food";
}
}
class Dog extends Animal {
// Переопределение метода makeSound()
@Override // Аннотация @Override — строгая рекомендация для проверки компилятором
public void makeSound() {
System.out.println("The dog barks: Woof!");
}
// Ковариантный возвращаемый тип (String — подтип Object)
@Override
public String getFood() {
return "dog food";
}
}
Что нельзя переопределить?
finalметоды.staticметоды (это скрытие метода, а не переопределение).privateметоды (они не видны в дочернем классе).
Зачем это нужно? Переопределение — основа полиморфизма времени выполнения (runtime polymorphism). Оно позволяет объектам дочерних классов отвечать на одни и те же вызовы методов по-разному, что делает код гибким и расширяемым.