Переопределение методов в Java: настройка поведения суперкласса
Если подкласс наследует метод суперкласса, он может его переопределить (override), если метод не помечен final. Переопределение позволяет подклассу реализовать поведение, специфичное для его типа.
Пример переопределения
class Animal {
public void move() { System.out.println("Animals can move"); }
}
class Dog extends Animal {
public void move() { System.out.println("Dogs can walk and run"); }
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal();
Animal b = new Dog(); // ссылка Animal, объект Dog
a.move(); // метод Animal
b.move(); // метод Dog (полиморфизм)
}
}
Результат:
Animals can move
Dogs can walk and run
На этапе компиляции проверяется тип ссылки (Animal имеет move). Во время выполнения JVM определяет реальный тип объекта (Dog) и вызывает его метод.
Ошибка при вызове метода подкласса через ссылку суперкласса
Animal b = new Dog();
b.bark(); // ОШИБКА компиляции: у Animal нет метода bark()
Правила переопределения методов
- Сигнатура (имя + параметры) должна совпадать точно.
- Возвращаемый тип — тот же или подтип (ковариантность).
- Модификатор доступа не может быть строже (public → public/protected, но не private).
- Можно переопределять только унаследованные instance-методы.
finalметоды нельзя переопределять.staticметоды нельзя переопределять (могут быть скрыты — re-declared).- Конструкторы не переопределяются.
- Исключения: можно бросать любые unchecked; checked — только те же или уже более узкие (подтипы) или меньше по количеству.
- В том же пакете: можно переопределять не private/final.
- В другом пакете: только public/protected не final.
Использование super при переопределении
Для вызова версии суперкласса внутри переопределённого метода:
class Dog extends Animal {
public void move() {
super.move(); // вызов метода Animal
System.out.println("Dogs can walk and run");
}
}
Результат:
Animals can move
Dogs can walk and run
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Метод String.length() в Java: как получить длину строки (пример)
- Освоение String.indexOf() в Java: поиск подстрок и практические примеры
- Понимание String.charAt() в Java: синтаксис, возвращаемый тип, исключения и пример
- Освоение String.compareTo() в Java: синтаксис, сценарии использования и примеры
- Метод String.contains() в Java: как проверить наличие подстроки — примеры
- Освоение String.endsWith() в Java: проверка суффиксов строки с примерами
- Замена строк в Java: replace(), replaceAll() и replaceFirst() подробно
- Ключевое слово static в Java: переменные, методы и блоки — практические примеры