Переопределение методов позволяет дочернему классу изменить поведение метода, унаследованного от родителя. Это ключевая часть полиморфизма в Java.
Аннотация @Override не обязательна, но настоятельно рекомендуется — она помогает компилятору проверить, что метод действительно переопределяет родительский, а не создаёт новый.
- Сигнатура метода должна совпадать с родительским
- Модификатор доступа может быть таким же или менее строгим
- Тип возвращаемого значения должен совпадать или быть подтипом
В заданиях ты разберёшься с правилами переопределения, научишься использовать @Override и поймёшь, как вызывается нужная версия метода при работе с объектами.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Добавь аннотацию Override
В этом задании представлены два класса: 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");
}
}2. Собери переопределённый метод
Из предложенных строк соберите корректный переопределённый метод makeSound() в классе Cat, который наследует Animal. Метод должен выводить в консоль сначала строку 'Meow', затем строку 'The cat meows.'. Одна из строк лишняя и в решение входить не должна.
@Overridepublic void makeSound() { System.out.println("Meow"); System.out.println("The cat meows.");} System.out.println("Woof");3. Ошибка в переопределении
В приведённом фрагменте кода на Java есть ошибка, связанная с переопределением метода. Класс-наследник пытается переопределить метод родительского класса, но допущена синтаксическая ошибка, из-за которой переопределение не происходит. Найдите и исправьте строку с ошибкой, чтобы метод в классе-наследнике корректно переопределял родительский метод.
class Animal { void makeSound() { System.out.println("Some sound"); }} class Dog extends Animal { @Override void makeSound() { System.out.println("Bark"); }}4. Какой метод вызовется?
Проанализируйте представленный код на 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. Разметь элементы метода
Разметьте элементы переопределённого метода в Java. Для каждого выделенного фрагмента укажите, является ли он аннотацией, модификатором доступа, типом возвращаемого значения или именем метода. Это задание поможет закрепить понимание структуры объявления метода и ключевых элементов, используемых при переопределении.
{{@Override~|~t1}} {{public~|~t2}} {{String~|~t3}} {{toString~|~t4}}() {
return "Some string";
}6. Правильное переопределение
В этом задании представлен код с переопределением метода в классе-наследнике. Вам нужно заполнить пропуски, выбрав из выпадающих списков подходящие элементы, чтобы переопределение метода было корректным с точки зрения правил Java. Обратите внимание на модификатор доступа, тип возвращаемого значения и тип параметра — они должны соответствовать требованиям переопределения. Учтите, что в Java переопределяющий метод может иметь ковариантный тип возврата и не может сужать модификатор доступа.
class Animal {
protected Number makeSound(String name) {
return 10;
}
}
class Cat extends Animal {
@Override
input1S input2S makeSound(input3S name) {
return 5;
}
}7. Найди переопределённые методы
Внимательно изучите приведенный код на 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()
Проанализируйте приведённый код на 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. Дополни родительский метод
В этом задании вам нужно дополнить переопределённый метод в классе-потомке. Метод должен сначала вызвать реализацию из родительского класса с помощью ключевого слова super, а затем добавить своё поведение — вывод дополнительной строки. Заполните пропуски в коде так, чтобы метод работал корректно и выводил две строки: сначала результат работы родительского метода, затем строку "Woof!". Обратите внимание на синтаксис вызова метода родителя и вывода на экран в Java.
class Dog extends Animal {
@Override
void makeSound() {
// Вызовите метод родителя
input1S
// Затем выведите строку "Woof!"
input2S
}
}10. Ошибка с @Override
В приведённом фрагменте кода Java используется аннотация @Override, но метод не переопределяет метод из родительского класса. Найдите и исправьте ошибку в сигнатуре метода, чтобы он корректно переопределял родительский метод. Обратите внимание на имя метода и список параметров.
class Animal { void makeSound() { System.out.println("Some sound"); }} class Dog extends Animal { @Override void makeNoise() { System.out.println("Bark"); }}