Использование super

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

Тренажер по Java

Ключевое слово super в Java используется в наследовании: оно позволяет обратиться к членам родительского класса и вызвать его конструктор. Это нужно, когда подкласс расширяет поведение базового класса и при этом не должен «терять» инициализацию родителя. Частые случаи: super(...) в конструкторе (обычно первой строкой) и обращение к методу/полю родителя (super.method()). В уроке будут задания и тесты по теме, чтобы закрепить использование super в ООП и понять, как работает код в иерархии классов.

  • Пример: class B extends A { B(){ super(); } }
Список тем

1. Вызов конструктора родителя

id: 40490_super_01_replace_ctor_call

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

2. Вызов метода родителя через super

id: 40490_super_02_replace_super_method

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

3. Исправить неверное расположение super(...)

id: 40490_super_03_error_super_not_first

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

4. Собрать классы с наследованием и super

id: 40490_super_04_build_from_parts_inheritance

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

5. Порядок вызовов конструкторов

id: 40490_super_05_predict_constructor_chain

Проанализируйте фрагмент кода с конструктором базового класса и конструкторами подкласса, где используется явный вызов 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: что к чему

id: 40490_super_06_compare_this_vs_super

В этом задании по теме наследования и полиморфизма в Java нужно сопоставить формы использования this и super с их точным смыслом. В левой колонке приведены различные выражения, связанные с конструкторами, полями и методами, а в правой — их описания. Сопоставьте каждый вариант слева с корректным объяснением справа, чтобы закрепить понимание различий между обращением к текущему объекту и к его суперклассу.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
this();
super();
this.field;
super.field;
this.method();
super.method();
Обращение к полю текущего объекта, даже если его имя скрыто параметром или локальной переменной
Вызов реализации метода из непосредственного суперкласса, обходя переопределённую версию в текущем классе
Вызов конструктора непосредственного суперкласса из конструктора подкласса
Вызов другого конструктора того же класса из конструктора текущего класса
Вызов метода на текущем объекте с учётом полиморфизма и возможного переопределения в подклассе
Обращение к полю, определённому в суперклассе, когда одноимённое поле скрыто в подклассе
Сообщения
Проверить
Показать подсказку

7. Отметить корректные обращения к super

id: 40490_super_07_click_target_super_usage

Перед вами фрагмент кода на 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. Дополнить переопределение с вызовом родителя

id: 40490_super_08_select_fill_override_call

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