this в Java — ссылка на текущий объект, внутри которого выполняется метод или конструктор. Её используют, чтобы обратиться к полю/методу текущего экземпляра и убрать неоднозначность, когда параметр имеет то же имя, что и поле: this.name = name;. Также this(...) вызывает другой конструктор этого же класса и должен стоять первой строкой конструктора.
Дальше — практические задания: как работает код, где нужен this, и как исправлять типичные ошибки.
- Модуль 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. Присваивание полю при совпадении имён
В этом задании вам предстоит дополнить код класса 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);
}
}2. Ошибка: this(...) не первой строкой конструктора
В данном фрагменте кода класса 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. Выбери правильные места для this
В данном фрагменте кода класса 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);
}
}4. Что выведет код: поле или параметр
Проанализируйте представленный код на 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(...)
Из предложенных строк соберите корректное определение класса 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;6. Отметь все использования this
Внимательно изучите приведённый фрагмент кода на 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;
}
}