Переопределение методов (Override)

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

Переопределение методов позволяет дочернему классу изменить поведение метода, унаследованного от родителя. Это ключевая часть полиморфизма в Java.

Аннотация @Override не обязательна, но настоятельно рекомендуется — она помогает компилятору проверить, что метод действительно переопределяет родительский, а не создаёт новый.

  • Сигнатура метода должна совпадать с родительским
  • Модификатор доступа может быть таким же или менее строгим
  • Тип возвращаемого значения должен совпадать или быть подтипом

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

Список тем

1. Добавь аннотацию Override

id: 40491_ovr_01_replace

В этом задании представлены два класса: Animal (родительский) и Dog (дочерний). Класс Dog наследует от Animal и должен переопределить метод makeSound. Однако в коде пропущена аннотация, указывающая на переопределение метода, и тип возвращаемого значения метода. Ваша задача — дополнить код, вставив в указанные места правильную аннотацию и тип возвращаемого значения, чтобы метод makeSound в классе Dog корректно переопределял метод из родительского класса и код компилировался без ошибок.

Заполните пропуски
class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    input1S
    public input2S makeSound() {
        System.out.println("Bark");
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Собери переопределённый метод

id: 40491_ovr_02_build

Из предложенных строк соберите корректный переопределённый метод makeSound() в классе Cat, который наследует Animal. Метод должен выводить в консоль сначала строку 'Meow', затем строку 'The cat meows.'. Одна из строк лишняя и в решение входить не должна.

Перетяните в правильном порядке строки из одного блока в другой
@Override
public void makeSound() {
    System.out.println("Meow");
    System.out.println("The cat meows.");
}
    System.out.println("Woof");
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Ошибка в переопределении

id: 40491_ovr_03_error

В приведённом фрагменте кода на Java есть ошибка, связанная с переопределением метода. Класс-наследник пытается переопределить метод родительского класса, но допущена синтаксическая ошибка, из-за которой переопределение не происходит. Найдите и исправьте строку с ошибкой, чтобы метод в классе-наследнике корректно переопределял родительский метод.

Найдите ошибку и исправьте
class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
}
 
class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Какой метод вызовется?

id: 40491_ovr_04_predict

Проанализируйте представленный код на Java, в котором используется наследование и переопределение методов. Определите, какой метод будет вызван при выполнении программы, и выберите соответствующий вариант вывода. Обратите внимание на типы переменных и создаваемые объекты.

Выберите правильный вариант ответа
class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Woof! Woof!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myPet = new Dog();
        myPet.makeSound();
    }
}
Сообщения
Проверить
Показать подсказку

5. Разметь элементы метода

id: 40491_ovr_05_highlight

Разметьте элементы переопределённого метода в Java. Для каждого выделенного фрагмента укажите, является ли он аннотацией, модификатором доступа, типом возвращаемого значения или именем метода. Это задание поможет закрепить понимание структуры объявления метода и ключевых элементов, используемых при переопределении.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
{{@Override~|~t1}} {{public~|~t2}} {{String~|~t3}} {{toString~|~t4}}() {
    return "Some string";
}
Тип возврата
Имя метода
Аннотация
Модификатор доступа
Сообщения
Проверить
Показать подсказку

6. Правильное переопределение

id: 40491_ovr_06_select

В этом задании представлен код с переопределением метода в классе-наследнике. Вам нужно заполнить пропуски, выбрав из выпадающих списков подходящие элементы, чтобы переопределение метода было корректным с точки зрения правил Java. Обратите внимание на модификатор доступа, тип возвращаемого значения и тип параметра — они должны соответствовать требованиям переопределения. Учтите, что в Java переопределяющий метод может иметь ковариантный тип возврата и не может сужать модификатор доступа.

Нужно правильно расставить в пропуски предложенные варианты
class Animal {
    protected Number makeSound(String name) {
        return 10;
    }
}

class Cat extends Animal {
    @Override
    input1S input2S makeSound(input3S name) {
        return 5;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Найди переопределённые методы

id: 40491_ovr_07_click

Внимательно изучите приведенный код на Java. В нем определен родительский класс Animal и дочерний класс Dog. Ваша задача — найти и отметить только те методы в классе Dog, которые переопределяют методы родительского класса Animal. Не отмечайте методы, которые являются новыми (не наследуются и не переопределяют) в классе Dog, а также не отмечайте методы родительского класса.

Кликните по всем фрагментам, которые подходят под условие задания.
class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
    
    void eat() {
        System.out.println("Eating");
    }
    
    void sleep() {
        System.out.println("Sleeping");
    }
}

class Dog extends Animal {
    @Override
    void {{makeSound~|~t1}}() {
        System.out.println("Bark");
    }
    
    @Override
    void {{eat~|~t2}}() {
        System.out.println("Dog eats meat");
    }
    
    void {{bark~|~t3}}() {
        System.out.println("Barking loudly");
    }
    
    void {{play~|~t4}}() {
        System.out.println("Playing with ball");
    }
}
Сообщения
Проверить
Показать подсказку

8. Вызов super.method()

id: 40491_ovr_08_predict_super

Проанализируйте приведённый код на Java. В нём создана иерархия классов с переопределением метода. Переопределённый метод вызывает родительскую версию через super.method() и добавляет свой вывод. Определите, какой результат будет выведен в консоль после выполнения программы.

Выберите правильный вариант ответа
class Animal {
    void makeSound() {
        System.out.println("The animal makes a sound.");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        super.makeSound();
        System.out.println("The dog barks.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        myDog.makeSound();
    }
}
Сообщения
Проверить
Показать подсказку

9. Дополни родительский метод

id: 40491_ovr_09_replace_super

В этом задании вам нужно дополнить переопределённый метод в классе-потомке. Метод должен сначала вызвать реализацию из родительского класса с помощью ключевого слова super, а затем добавить своё поведение — вывод дополнительной строки. Заполните пропуски в коде так, чтобы метод работал корректно и выводил две строки: сначала результат работы родительского метода, затем строку "Woof!". Обратите внимание на синтаксис вызова метода родителя и вывода на экран в Java.

Заполните пропуски
class Dog extends Animal {
    @Override
    void makeSound() {
        // Вызовите метод родителя
        input1S
        // Затем выведите строку "Woof!"
        input2S
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

10. Ошибка с @Override

id: 40491_ovr_10_error_annot

В приведённом фрагменте кода Java используется аннотация @Override, но метод не переопределяет метод из родительского класса. Найдите и исправьте ошибку в сигнатуре метода, чтобы он корректно переопределял родительский метод. Обратите внимание на имя метода и список параметров.

Найдите ошибку и исправьте
class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
}
 
class Dog extends Animal {
    @Override
    void makeNoise() {
        System.out.println("Bark");
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру