Полиморфизм позволяет переменной родительского типа хранить ссылку на объект любого класса-потомка. Это один из ключевых принципов ООП в Java.
Пример: Animal animal = new Dog(); — переменная типа Animal ссылается на объект Dog.
Что происходит при вызове методов:
- Вызывается версия метода из реального типа объекта (Dog), а не из типа переменной (Animal)
- Это называется динамическое связывание — решение о том, какой метод вызвать, принимается во время выполнения
Полиморфизм упрощает работу с коллекциями разных объектов и делает код гибким. В этих практических заданиях вы разберётесь, как это работает на примерах.
- Модуль 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. Полиморфная ссылка
В этом задании вам предстоит продемонстрировать понимание полиморфизма в 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(); // Полиморфный вызов метода
}
}2. Ошибка приведения типов
В этом фрагменте 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. Какой метод вызовется?
Рассмотрите приведенный ниже код на 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. Допустимые присваивания
Перед вами список выражений на 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. Разметь части объявления
Разметьте части объявления переменной в Java, указав для каждого выделенного фрагмента, является ли он типом переменной, именем переменной, оператором присваивания или типом создаваемого объекта. Это задание поможет лучше понять конструкцию, где ссылка родительского типа указывает на объект дочернего класса, что является основой полиморфизма в Java.
{{Animal~|~t1}} {{animal~|~t2}} {{=~|~t3}} new {{Dog~|~t4}}();6. Анализ вызовов методов
Проанализируйте 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();
}
}
}7. Проверка типа объекта
В этом задании вам необходимо заполнить пропуски в Java-коде, который демонстрирует проверку типа объекта с помощью оператора instanceof и последующее приведение типа. Код использует иерархию классов Animal, Dog и Cat. Выберите из выпадающего списка подходящие элементы, чтобы код корректно проверял, является ли объект animal экземпляром класса Dog, и приводил его к этому типу для вызова метода bark().
Animal animal = new Dog();
if (animal input1S input2S) {
Dog dog = (input3S) animal;
dog.bark();
}8. Собери полиморфный код
Из предложенных строк соберите корректную 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>(); }}