Переопределение методов (@Override)
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 22 из 87.
Method overriding позволяет подклассу предоставить собственную реализацию method, который уже определён в его parent class. Это способ, с помощью которого дочерние классы настраивают унаследованное поведение в соответствии со своими конкретными потребностями.
Когда вы выполняете overriding метода, версия в подклассе полностью заменяет версию parent для объектов этого подкласса. method должен иметь то же имя и те же параметры, что и method parent, а тип возвращаемого значения должен быть таким же, как у parent (или его подтипом):
public class Animal {
public void makeSound() {
System.out.println("Some generic sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow!");
}
}Аннотация @Override сообщает compiler, что вы намерены переопределить method parent. Хотя это необязательно, настоятельно рекомендуется её использовать, поскольку compiler обнаружит ошибки, если вы случайно неправильно напишете имя method или укажете неверные параметры:
@Override
public void makeSound() { } // Правильно — компилятор проверяет это
public void makesound() { } // Опечатка! Создаёт новый метод вместо переопределенияКогда вы вызываете переопределённый method, Java выполняет версию, которая принадлежит фактическому типу объекта:
Dog dog = new Dog();
dog.makeSound(); // Вывод: Woof!
Cat cat = new Cat();
cat.makeSound(); // Вывод: Meow!Помни из предыдущего урока, что ты можешь использовать super.methodName() внутри переопределённого method, если всё ещё хочешь включить behavior parent вместе с новым кодом.
Задание
ЛегкоДавайте создадим систему уведомлений, которая демонстрирует, как подклассы могут переопределять методы parent, чтобы реализовать собственное специализированное поведение. Вы увидите, как аннотация @Override помогает обнаруживать ошибки и как каждый подкласс может настраивать унаследованные методы.
Вы создадите три файла, чтобы организовать свой код:
Notification.java: Создайте parent class, представляющий generic notification. В нём должны быть:- private field для
message(String) - constructor, который accepts message
- method
getMessage(), возвращающий message - method
send(), который prints:Sending notification: [message]
- private field для
EmailNotification.java: Создайте подкласс, который extends Notification и настраивает способ отправки notifications по email:- private field для email address получателя
recipient(String) - constructor, который принимает и message, и recipient, используя
super(message)для части, относящейся к parent - Переопределите method
send(), используя annotation@Override, чтобы вывести:Emailing [recipient]: [message]
- private field для email address получателя
Main.java: Продемонстрируйте, как одно и то же имя method создаёт разное behavior в зависимости от типа object. Вы получите два inputs: message и email address. Создайте обычный Notification и EmailNotification с одним и тем же message, затем выполнитеsend()для каждого, чтобы увидеть разные Output.
Вы получите два inputs: message (String) и email address получателя (String).
Ваш Output должен содержать две строки: сначала результат method send() из parent, затем результат переопределённой версии в EmailNotification. Это демонстрирует, как overriding method позволяет подклассам заменять унаследованное behavior собственной реализацией.
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Читаем входные данные
String message = scanner.nextLine();
String recipient = scanner.nextLine();
// TODO: Create a Notification object with the message
// TODO: Create an EmailNotification object with the message and recipient
// TODO: Call send() on the Notification object
// TODO: Call send() on the EmailNotification object
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java