Menu
Coddy logo textTech

Переопределение методов (@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 вместе с новым кодом.

challenge icon

Задание

Легко

Давайте создадим систему уведомлений, которая демонстрирует, как подклассы могут переопределять методы parent, чтобы реализовать собственное специализированное поведение. Вы увидите, как аннотация @Override помогает обнаруживать ошибки и как каждый подкласс может настраивать унаследованные методы.

Вы создадите три файла, чтобы организовать свой код:

  • Notification.java: Создайте parent class, представляющий generic notification. В нём должны быть:
    • private field для message (String)
    • constructor, который accepts message
    • method getMessage(), возвращающий message
    • method send(), который prints: Sending notification: [message]
  • 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]
  • 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
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Java