Ключевое слово this

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

Тренажер по Java

this в Java — ссылка на текущий объект, внутри которого выполняется метод или конструктор. Её используют, чтобы обратиться к полю/методу текущего экземпляра и убрать неоднозначность, когда параметр имеет то же имя, что и поле: this.name = name;. Также this(...) вызывает другой конструктор этого же класса и должен стоять первой строкой конструктора.

Дальше — практические задания: как работает код, где нужен this, и как исправлять типичные ошибки.

Список тем

1. Присваивание полю при совпадении имён

id: 40479_th_01_replace_field_assign

В этом задании вам предстоит дополнить код класса Person, в котором конструктор принимает параметры, совпадающие по именам с полями класса. Из-за этого возникает неоднозначность: внутри конструктора имена параметров 'затеняют' поля объекта. Чтобы корректно присвоить значения полям, необходимо использовать ключевое слово this. Вставьте в указанные места пропусков правильные конструкции, чтобы код компилировался и работал как задумано.

Заполните пропуски
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        // Используйте ключевое слово this для разрешения конфликта имён
        input1S = name;
        input2S = age;
    }

    public void display() {
        // Для явного указания на поле класса также можно использовать this
        System.out.println("Имя: " + input3S + ", Возраст: " + this.age);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Ошибка: this(...) не первой строкой конструктора

id: 40479_th_02_error_this_call_position

В данном фрагменте кода класса Person допущена ошибка, связанная с использованием ключевого слова this для вызова другого конструктора. В одном из конструкторов вызов this(...) находится не на первой строке, что приводит к ошибке компиляции. Исправьте порядок строк в конструкторе с одним параметром, чтобы вызов this(...) стал первой исполняемой инструкцией, и код стал корректным.

Найдите ошибку и исправьте
public class Person {
    private String name;
    private int age;
 
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public Person(String name) {
        System.out.println("Создание объекта Person с именем " + name);
        this(name, 0);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Выбери правильные места для this

id: 40479_th_03_select_fill_this_usage

В данном фрагменте кода класса Employee, который наследует от Person, необходимо правильно использовать ключевые слова this и super для обращения к полям и методам. В коде есть четыре пропуска, обозначенных как input1, input2, input3 и input4. Выберите для каждого пропуска подходящий вариант из списка: this, super, имя поля (salary, name, age) или оставьте пустым. Учтите, что в Java this используется для обращения к полям и методам текущего объекта, а super - для обращения к членам родительского класса. Также помните о неоднозначности имен параметров и полей класса.

Нужно правильно расставить в пропуски предложенные варианты
public class Employee extends Person {
    private double salary;

    public Employee(String name, int age, double salary) {
        input1S(name, age);
        input2S.salary = salary;
    }

    public void setSalary(double salary) {
        input3S.salary = salary;
    }

    public void printInfo() {
        input4S.printInfo();
        System.out.println("Salary: " + this.salary);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Что выведет код: поле или параметр

id: 40479_th_04_predict_this_vs_param

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

Выберите правильный вариант ответа
public class Example {
    private int value;

    public Example(int value) {
        value = value;
    }

    public void printValue() {
        System.out.println(value);
    }

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

5. Собери цепочку конструкторов с this(...)

id: 40479_th_05_build_from_parts_constructors

Из предложенных строк соберите корректное определение класса Person на Java. Класс должен иметь приватные поля name (String) и age (int), а также два конструктора: первый конструктор принимает имя и возраст и присваивает их полям, второй конструктор принимает только имя и вызывает первый конструктор с возрастом 0 с помощью this(name, 0). Лишние строки, такие как ненужные конструкторы или поля, в решение не включайте.

Перетяните в правильном порядке строки из одного блока в другой
public class Person {
    private String name;
    private int age;
    public Person(String name, int age) { this.name = name; this.age = age; }
    public Person(String name) { this(name, 0); }
}
    public Person() { }
    private int score;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Отметь все использования this

id: 40479_th_06_click_target_this_usages

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

Кликните по всем фрагментам, которые подходят под условие задания.
public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        {{this.name~|~t1}} = name;
        {{this.age~|~t2}} = age;
    }

    public Student(String name) {
        {{this(name, 18)~|~t3}};
    }

    public void displayInfo() {
        System.out.println("Name: " + {{this.getName()~|~t4}});
        System.out.println("Age: " + age);
    }

    public String getName() {
        return {{name~|~t5}};
    }

    public void setName(String name) {
        {{this.name~|~t6}} = name;
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру