Мастерство переопределения методов в Java: примеры, правила и ключевое слово super
Мастерство переопределения методов в Java
Изучите переопределение методов в Java на практике: примеры, ключевые правила и мощное ключевое слово super.
На прошлой неделе мы рассмотрели наследование — ключевую возможность ООП, позволяющую подклассу наследовать свойства и поведение от суперкласса. Теперь погрузимся в переопределение методов — когда подкласс предоставляет свою реализацию метода, уже определенного в родительском классе.
Пример 1: Базовое переопределение метода
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { @Override public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
Вывод:
I am a dog.
В этом фрагменте и Animal, и Dog объявляют displayInfo(). Когда экземпляр Dog вызывает его, выполняется реализация подкласса, демонстрируя переопределение.
Обратите внимание на аннотацию @Override. Она сообщает компилятору, что метод должен заменить версию суперкласса; если сигнатуры не совпадают, компилятор выдаст ошибку. Хотя она не обязательна, это лучшая практика, защищающая от случайных ошибок.
Правила переопределения в Java
- Имена методов, типы возвращаемых значений и списки параметров должны быть идентичны в обоих классах.
- Final или static методы не могут быть переопределены.
- Абстрактные методы в суперклассе должны быть переопределены его конкретными подклассами.
Использование super для вызова метода суперкласса
Можем ли мы все еще вызвать метод родителя после переопределения? Безусловно — используйте ключевое слово super.
Пример 2: Использование super
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { public void displayInfo() { super.displayInfo(); System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
Вывод:
I am an animal. I am a dog.
Здесь Dog сначала вызывает Animal.displayInfo() через super, затем добавляет свое сообщение.
Помните, конструкторы не наследуются, поэтому нет «переопределения конструкторов». Однако подкласс может вызвать конструктор суперкласса с super() — см. руководство Java super keyword.
Уровни доступа при переопределении
Переопределенные методы могут отличаться по видимости, но только в сторону расширения доступа.
Если метод суперкласса protected, подкласс может объявить его protected или public, но не private.
Пример 3: Изменение видимости
class Animal { protected void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
Вывод:
I am a dog.
Поскольку public предоставляет более широкий доступ, чем protected, переопределение допустимо.
Переопределение абстрактных методов
Абстрактные классы часто объявляют методы без тел. Любой конкретный подкласс должен предоставить реализацию; иначе компилятор выдаст ошибку. Мы подробно рассмотрим абстрактные классы в будущем руководстве.
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Типы аннотаций в Java: предопределенные, кастомные и мета-аннотации
- Метод String.length() в Java: как получить длину строки (пример)
- Освоение String.indexOf() в Java: поиск подстрок и практические примеры
- Понимание String.charAt() в Java: синтаксис, возвращаемый тип, исключения и пример
- Освоение String.compareTo() в Java: синтаксис, сценарии использования и примеры
- Метод String.contains() в Java: как проверить наличие подстроки — примеры
- Освоение String.endsWith() в Java: проверка суффиксов строки с примерами