Полиморфизм: ссылка родителя на объект потомка

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

Тренажер по Java

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

Пример: Animal animal = new Dog(); — переменная типа Animal ссылается на объект Dog.

Что происходит при вызове методов:

  • Вызывается версия метода из реального типа объекта (Dog), а не из типа переменной (Animal)
  • Это называется динамическое связывание — решение о том, какой метод вызвать, принимается во время выполнения

Полиморфизм упрощает работу с коллекциями разных объектов и делает код гибким. В этих практических заданиях вы разберётесь, как это работает на примерах.

Список тем

1. Полиморфная ссылка

id: 40492_poly_01_fill_ref

В этом задании вам предстоит продемонстрировать понимание полиморфизма в Java, а именно работу с полиморфной ссылкой — ссылкой родительского класса на объект класса-потомка. Вам дан фрагмент кода, в котором создается объект класса-наследника, но переменная для его хранения объявлена с типом родительского класса. В коде пропущены ключевые элементы: тип переменной (родительский класс), оператор создания объекта и имя класса-потомка. Ваша задача — заполнить пропуски так, чтобы код успешно компилировался и выполнялся, демонстрируя принцип подстановки Барбары Лисков.

Заполните пропуски
// Родительский класс
class Vehicle {
    void move() {
        System.out.println("Транспортное средство движется");
    }
}

// Класс-потомок
class Car extends Vehicle {
    @Override
    void move() {
        System.out.println("Автомобиль едет по дороге");
    }
}

public class Main {
    public static void main(String[] args) {
        // Создание объекта потомка через ссылку родителя
        input1S myVehicle = input2S input3S();
        myVehicle.move(); // Полиморфный вызов метода
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Ошибка приведения типов

id: 40492_poly_02_error_cast

В этом фрагменте Java-кода, демонстрирующем полиморфизм, допущена ошибка приведения типов. Ссылка типа Animal указывает на объект Dog, но при попытке вызвать метод bark(), специфичный для класса Dog, происходит ошибка компиляции, так как метод bark() не определен в классе Animal. Найдите и исправьте строку с ошибкой, чтобы код успешно скомпилировался и выполнился, вызвав метод bark() для объекта Dog.

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

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

id: 40492_poly_03_predict_method

Рассмотрите приведенный ниже код на Java, который демонстрирует полиморфизм через наследование. Обратите внимание на объявление классов Parent и Child, создание объекта Child через ссылку типа Parent и вызов метода display(). Выберите правильный вариант того, что будет выведено в консоль при выполнении программы.

Выберите правильный вариант ответа
class Parent {
    void display() {
        System.out.println("Display from Parent");
    }
}

class Child extends Parent {
    @Override
    void display() {
        System.out.println("Display from Child");
    }
}

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

4. Допустимые присваивания

id: 40492_poly_04_sort_types

Перед вами список выражений на Java, представляющих присваивания в иерархии классов: Object -> Animal -> Dog/Cat. Ваша задача — распределить эти выражения по двум категориям: «Скомпилируется» и «Ошибка компиляции». Обратите внимание на принципы полиморфизма: присваивание допустимо, если тип переменной является супертипом (или тем же типом) типа создаваемого объекта, иначе возникает ошибка компиляции. Каждое выражение должно оказаться строго в одной категории.

Перетяните элементы в соответствующие блоки
Скомпилируется
Ошибка компиляции
Animal a = new Dog();
Object o = new Cat();
Animal b = new Animal();
Object obj = new Animal();
Dog d = new Animal();
Cat c = new Object();
Dog d2 = new Cat();
Animal a2 = new Object();
Сообщения
Проверить
Показать подсказку

5. Разметь части объявления

id: 40492_poly_05_highlight_parts

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

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
{{Animal~|~t1}} {{animal~|~t2}} {{=~|~t3}} new {{Dog~|~t4}}();
Тип переменной
Тип создаваемого объекта
Имя переменной
Оператор присваивания
Сообщения
Проверить
Показать подсказку

6. Анализ вызовов методов

id: 40492_poly_06_analyze_calls

Проанализируйте Java-код сверху, который демонстрирует полиморфизм через ссылку родительского класса на объекты потомков. Ваша задача — расставить шаги снизу в правильном порядке, чтобы восстановить логику выполнения программы: от создания массива до вызова переопределенных методов. Шаги перемешаны — перетащите их в правильную последовательность, отражающую, как программа инициализирует объекты и выводит результаты в консоль.

abstract class Animal {
    public abstract void speak();
}

class Dog extends Animal {
    @Override
    public void speak() {
        System.out.println("Гав");
    }
}

class Cat extends Animal {
    @Override
    public void speak() {
        System.out.println("Мяу");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal[] animals = new Animal[2];
        animals[0] = new Dog();
        animals[1] = new Cat();
        
        for (Animal a : animals) {
            a.speak();
        }
    }
}
Расположите элементы в логичном порядке
В массив добавляется объект класса Cat как второй элемент (индекс 1).
Запускается цикл for-each для перебора всех элементов массива animals.
Создается массив типа Animal[] для хранения объектов животных (размер 2).
Во второй итерации цикла вызывается метод speak() для объекта Cat, что выводит "Мяу" в консоль.
В массив добавляется объект класса Dog как первый элемент (индекс 0).
В первой итерации цикла вызывается метод speak() для объекта Dog, что выводит "Гав" в консоль.
Сообщения
Проверить
Показать подсказку

7. Проверка типа объекта

id: 40492_poly_07_select_instanceof

В этом задании вам необходимо заполнить пропуски в Java-коде, который демонстрирует проверку типа объекта с помощью оператора instanceof и последующее приведение типа. Код использует иерархию классов Animal, Dog и Cat. Выберите из выпадающего списка подходящие элементы, чтобы код корректно проверял, является ли объект animal экземпляром класса Dog, и приводил его к этому типу для вызова метода bark().

Нужно правильно расставить в пропуски предложенные варианты
Animal animal = new Dog();
if (animal input1S input2S) {
    Dog dog = (input3S) animal;
    dog.bark();
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Собери полиморфный код

id: 40492_poly_08_build_polymorphic

Из предложенных строк соберите корректную Java-программу, демонстрирующую полиморфизм: создание объекта-потомка через ссылку родительского типа. Программа должна объявить переменную типа List, создать объект ArrayList, добавить элемент и вывести его. Две строки являются лишними и содержат ошибки присваивания — их включать в решение не нужно.

Перетяните в правильном порядке строки из одного блока в другой
import java.util.List;
import java.util.ArrayList;
public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        ArrayList<String> list = new List<>();
        list.add("Полиморфизм");
        System.out.println(list.get(0));
        list = new List<String>();
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру