Ключевое слово super в Java используется в наследовании: оно позволяет обратиться к членам родительского класса и вызвать его конструктор. Это нужно, когда подкласс расширяет поведение базового класса и при этом не должен «терять» инициализацию родителя. Частые случаи: super(...) в конструкторе (обычно первой строкой) и обращение к методу/полю родителя (super.method()). В уроке будут задания и тесты по теме, чтобы закрепить использование super в ООП и понять, как работает код в иерархии классов.
- Пример:
class B extends A { B(){ super(); } }
- Модуль 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 так, чтобы конструктор класса-наследника корректно вызывал конструктор родительского класса с параметром. Используйте механизм наследования и ключевое слово, позволяющее обратиться к конструктору базового класса. Ваша задача — вставить недостающие элементы вызова так, чтобы поле name инициализировалось через конструктор Person, а код успешно компилировался и отражал правильную структуру инициализации объектов Employee.
class Person {
private String name;
public Person(String name) {
this.name = name;
}
}
class Employee extends Person {
private int id;
public Employee(String name, int id) {
input1Sinput2S;
this.id = id;
}
}2. Вызов метода родителя через super
Дополните фрагмент кода, в котором метод speak() в классе Dog переопределяет одноимённый метод родительского класса Animal. Внутри переопределённого метода нужно сначала вызвать реализацию метода из базового класса, а затем вывести собственное сообщение подкласса. Заполните пропуски так, чтобы вызов родительской реализации происходил корректно и при обращении к методу speak() у Dog сначала выполнялся код из Animal, а затем код из Dog.
class Animal {
void speak() {
System.out.println("Животное издает звук");
}
}
class Dog extends Animal {
@Override
void speak() {
// Вызов родительской реализации
input1Sinput2Sinput3Sinput4S;
System.out.println("Собака лает");
}
}3. Исправить неверное расположение super(...)
В фрагменте Java-кода показаны два класса: базовый Vehicle и подкласс Car. В конструкторе класса Car допущены ошибки, связанные с использованием вызова конструктора родительского класса через super(...): нарушен порядок операторов и есть синтаксическая проблема. Исправьте строки конструктора Car так, чтобы вызов super(...) был оформлен по правилам Java, код успешно компилировался и логика инициализации полей не изменилась.
class Vehicle { String brand; Vehicle(String brand) { this.brand = brand; }}class Car extends Vehicle { int maxSpeed; Car(String brand, int maxSpeed) { this.maxSpeed = maxSpeed; super(brand) }}4. Собрать классы с наследованием и super
Из предложенных строк соберите корректную Java-программу с тремя классами: базовым классом Person, классом-наследником Student, который расширяет Person и в своём конструкторе вызывает super(name), и классом Main с методом main. В методе main должен создаваться объект Student, после чего при его создании в консоль выводится сообщение из конструктора базового класса Person. Расположите строки так, чтобы структура классов и фигурные скобки были корректными. Одна из строк лишняя и не должна входить в итоговое решение.
class Person { public Person(String name) { System.out.println("Person: " + name); }}class Student extends Person { public Student(String name) { super(name); }}public class Main { public static void main(String[] args) { new Student("Alex"); }}class Teacher extends Person { }5. Порядок вызовов конструкторов
Проанализируйте фрагмент кода с конструктором базового класса и конструкторами подкласса, где используется явный вызов super(...). Определите порядок вызова конструкторов при создании объекта и выберите вариант, который корректно отражает последовательность строк, выводимых в консоль.
class A {
A(String msg) {
System.out.println("A(" + msg + ")");
}
}
class B extends A {
B() { super("from B"); System.out.println("B()"); }
}
public class Main {
public static void main(String[] args) {
new B();
}
}6. this и super: что к чему
В этом задании по теме наследования и полиморфизма в Java нужно сопоставить формы использования this и super с их точным смыслом. В левой колонке приведены различные выражения, связанные с конструкторами, полями и методами, а в правой — их описания. Сопоставьте каждый вариант слева с корректным объяснением справа, чтобы закрепить понимание различий между обращением к текущему объекту и к его суперклассу.
this();super();this.field;super.field;this.method();super.method();7. Отметить корректные обращения к super
Перед вами фрагмент кода на Java с классом Employee, который наследуется от Person. В нём есть несколько выражений с super и похожие конструкции. Ваша задача — выделить все фрагменты, где super используется корректно: вызов конструктора родительского класса, обращение к его методам или полям из конструктора или обычного (нестатического) метода. Не выделяйте обращения к this, обычные вызовы без super и случаи использования super из статического метода.
class Employee extends Person {
String company;
Employee(String name, String company) {
{{super(name)~|~t1}}; this.company = company; {{this.printInfo()~|~t2}};
}
@Override
void printInfo() {
{{super.printInfo()~|~t3}}; {{printInfo()~|~t4}};
}
static void log(Employee e) { {{super.printInfo()~|~t5}}; e.printInfo(); }
}8. Дополнить переопределение с вызовом родителя
В фрагменте кода с классами Animal и Dog есть пропуски, обозначенные input1, input2 и input3. Выберите из выпадающего списка подходящие фрагменты кода так, чтобы метод speak() в дочернем классе корректно вызывал реализацию родителя через super и добавлял дополнительный вывод, а в методе main действительно вызывался переопределённый метод у объекта Dog.
class Animal { public void speak() {
System.out.println("Animal speaks");
} }
class Dog extends Animal { @Override
public void speak() {
input1S.speak();
input2S.println("Dog barks loudly");
} }
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
a.input3S();
}
}