Абстрактные классы и методы

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

Тренажер по Java

Модуль Наследование и Полиморфизм продолжается темой об Абстрактных классах и методах. Абстрактный класс — это, по сути, незавершенный чертеж. Вы не можете создать его экземпляр через new, но можете наследоваться от него.

Ключевое слово abstract используется для:

  • Классов: чтобы запретить создание объектов этого типа.
  • Методов: чтобы объявить сигнатуру метода без реализации (тела). Наследники обязаны переопределить такие методы.

Это мощный инструмент для создания гибкой архитектуры приложений. Выполните практические задания, чтобы понять, как создавать контракты для классов-наследников.

Список тем

1. Ключевое слово abstract

id: 40494_abs_kw_01_replace

В этом задании вам предстоит поработать с ключевым словом abstract в Java. Дан код класса Shape, который содержит метод draw() без тела. Чтобы код стал корректным, необходимо объявить класс и метод абстрактными. Впишите пропущенное ключевое слово 'abstract' в двух указанных местах, чтобы код успешно компилировался. Обратите внимание, что абстрактный метод не имеет реализации и завершается точкой с запятой, а абстрактный класс не может быть инстанциирован.

Заполните пропуски
public input1S class Shape {
    public input2S void draw();
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Запрет создания экземпляра

id: 40494_abs_inst_02_error

В приведённом фрагменте кода на 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 сек.
Показать подсказку

3. Реализация метода в наследнике

id: 40494_abs_impl_03_select

В данном задании необходимо правильно переопределить абстрактный метод 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;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Абстрактный vs Конкретный

id: 40494_abs_diff_04_compare

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Имеет тело метода
Не имеет тела
Можно создать объект
Нельзя создать объект
Конкретный класс
Абстрактный метод
Абстрактный класс
Конкретный метод
Сообщения
Проверить
Показать подсказку

5. Создание наследника

id: 40494_abs_child_05_build

Из предложенных строк соберите корректный класс 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!");
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Полиморфизм с абстрактным классом

id: 40494_abs_poly_06_predict

Проанализируйте приведённый код на 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. Выделение абстрактных методов

id: 40494_abs_sig_07_highlight

В приведённом коде абстрактного класса 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...");
    }
}
Поле класса
Конкретный метод
Конструктор
Абстрактный метод
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру