Модуль Наследование и Полиморфизм продолжается темой об Абстрактных классах и методах. Абстрактный класс — это, по сути, незавершенный чертеж. Вы не можете создать его экземпляр через new, но можете наследоваться от него.
Ключевое слово abstract используется для:
- Классов: чтобы запретить создание объектов этого типа.
- Методов: чтобы объявить сигнатуру метода без реализации (тела). Наследники обязаны переопределить такие методы.
Это мощный инструмент для создания гибкой архитектуры приложений. Выполните практические задания, чтобы понять, как создавать контракты для классов-наследников.
- Модуль 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. Ключевое слово abstract
В этом задании вам предстоит поработать с ключевым словом abstract в Java. Дан код класса Shape, который содержит метод draw() без тела. Чтобы код стал корректным, необходимо объявить класс и метод абстрактными. Впишите пропущенное ключевое слово 'abstract' в двух указанных местах, чтобы код успешно компилировался. Обратите внимание, что абстрактный метод не имеет реализации и завершается точкой с запятой, а абстрактный класс не может быть инстанциирован.
public input1S class Shape {
public input2S void draw();
}2. Запрет создания экземпляра
В приведённом фрагменте кода на Java допущена ошибка, связанная с попыткой создания экземпляра абстрактного класса. Найдите строку, в которой происходит эта попытка, и исправьте её, чтобы код стал корректным. Обратите внимание, что абстрактные классы не могут быть инстанцированы напрямую.
abstract class Animal { abstract void makeSound();} class Dog extends Animal { void makeSound() { System.out.println("Woof!"); }} public class Main { public static void main(String[] args) { Animal myAnimal = new Animal(); // Ошибка здесь myAnimal.makeSound(); }}3. Реализация метода в наследнике
В данном задании необходимо правильно переопределить абстрактный метод area() из класса Figure в классе Circle. Выберите из выпадающих списков подходящие элементы для модификатора доступа, возвращаемого типа и сигнатуры метода (имя и параметры), чтобы код успешно компилировался и соответствовал принципам наследования и полиморфизма. Обратите внимание на правила переопределения методов в Java.
abstract class Figure {
public abstract double area();
}
class Circle extends Figure {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
input1S input2S input3S {
return Math.PI * radius * radius;
}
}4. Абстрактный vs Конкретный
В левой колонке приведены характеристики классов и методов в Java, связанные с абстрактными и конкретными элементами. В правой колонке указаны соответствующие термины. Сопоставьте каждую характеристику слева с подходящим термином справа. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок терминов перемешан.
5. Создание наследника
Из предложенных строк соберите корректный класс Dog, который наследует абстрактный класс Animal и реализует метод makeSound(). Класс должен выводить в консоль строку 'Woof!'. Лишние строки в решение включать не нужно.
public class Dog extends Animal { @Override public void makeSound() { System.out.println("Woof!"); }}public abstract class Animal { public void makeSound(); System.out.println("Meow!");6. Полиморфизм с абстрактным классом
Проанализируйте приведённый код на Java. В нём определён абстрактный класс AbstractShape с абстрактным методом draw(), а также класс Square, который его наследует и переопределяет этот метод. В методе main создаётся объект Square и присваивается переменной типа AbstractShape, после чего вызывается метод draw(). Выберите, какая строка будет выведена на экран в результате выполнения программы.
abstract class AbstractShape {
abstract void draw();
}
class Square extends AbstractShape {
@Override
void draw() {
System.out.println("Drawing a square with side 5");
}
}
public class Main {
public static void main(String[] args) {
AbstractShape shape = new Square();
shape.draw();
}
}7. Выделение абстрактных методов
В приведённом коде абстрактного класса Java выделите только те методы, которые являются абстрактными. Обратите внимание на ключевое слово abstract и отсутствие тела метода (вместо тела — точка с запятой). Доступные типы для разметки: 'Абстрактный метод', 'Конкретный метод', 'Конструктор', 'Поле класса'.
public abstract class Animal {
private String name;
private int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract {{String~|~t1}} {{getSound~|~t2}}();
public abstract {{void~|~t3}} {{move~|~t4}}();
public void sleep() {
System.out.println("Sleeping...");
}
}