Источник: Medium
Благодаря этому руководству вы узнаете о предназначении ключевого слова this в Java, как и где его использовать на основе практических примеров.
В Java ключевое слово this используется для ссылки на текущий объект внутри метода или конструктора. Например:
class Main {
int instVar;
Main(int instVar){
this.instVar = instVar;
System.out.println("this reference = " + this);
}
public static void main(String[] args) {
Main obj = new Main(8);
System.out.println("object reference = " + obj);
}
}
Вывод:
this reference = Main@23fc625e
object reference = Main@23fc625e
В приведенном выше примере мы создали объект с именем obj класса Main. Затем мы печатаем ссылку на объект obj и ключевое слово this класса.
Как мы видим, ссылка на obj и на this одинаковая. Это означает, что this является ссылкой на текущий объект.
Использование ключевого слова this
Существуют несколько ситуаций, в которых используется ключевое слово this.1. Использование this для различия наименований переменных
В Java не разрешается объявлять две или более переменных с одинаковым именем внутри области видимости (области действия класса или области действия метода). Однако переменные и параметры экземпляра могут иметь одно и то же имя. Вот пример:
class MyClass {
// переменная экземпляра
int age;
// параметр
MyClass(int age){
age = age;
}
}
В этой программе переменная экземпляра и параметр имеют одно и то же имя: age. Поэтому компилятор Java сбит с толку. Чтобы решить проблему мы используем ключевое слово this. Но сначала давайте взглянем на пример, где this не используется:
class Main {
int age;
Main(int age){
age = age;
}
public static void main(String[] args) {
Main obj = new Main(8);
System.out.println("obj.age = " + obj.age);
}
}
Вывод:
obj.age = 0
В приведенном выше примере мы передали конструктору значение 8. Тем не менее, на выходе мы получаем 0. Это связано с тем, что компилятор Java запутался из-за неоднозначности имен между экземпляром переменной и параметром.
Теперь давайте перепишем этот код, используя ключевое слово this.
class Main {
int age;
Main(int age){
this.age = age;
}
public static void main(String[] args) {
Main obj = new Main(8);
System.out.println("obj.age = " + obj.age);
}
}
Вывод:
obj.age = 8
Теперь мы получили вполне ожидаемый результат. Это связано с тем, что при вызове конструктора this внутри него заменяется объектом obj, который вызывает конструктор. Следовательно, переменной age присваивается значение 8.
Кроме того, если имя параметра и переменной экземпляра различаются, компилятор автоматически добавляет ключевое слово this. Перед вами пример кода:
class Main {
int age;
Main(int i) {
age = i;
}
}
что эквивалентно:
class Main {
int age;
Main(int i) {
this.age = i;
}
}
2. Ключевое слово this с геттерами и сеттерами
Еще одно распространенное использование ключевого слова this — в методах классов setter и getter. Например:
class Main {
String name;
// метод setter
void setName( String name ) {
this.name = name;
}
// метод getter
String getName(){
return this.name;
}
public static void main( String[] args ) {
Main obj = new Main();
// вызов метода setter и getter
obj.setName("Toshiba");
System.out.println("obj.name: "+obj.getName());
}
}
Вывод:
obj.name: Toshiba
Здесь мы использовали ключевое слово this:- чтобы присвоить значение внутри метода setter
- для доступа к значению внутри метода getter
3. Использование this в перегрузке конструктора
При работе с перегрузкой конструктора нам может потребоваться вызвать один конструктор из другого конструктора. В данном случае мы не можем вызвать конструктор явно. Вместо этого мы должны использовать this в виде другой формы ключевого слова, то есть this(). Рассмотрим пример кода:
class Complex {
private int a, b;
// конструктор с двумя параметрами
private Complex( int i, int j ){
this.a = i;
this.b = j;
}
// конструктор с одним параметром
private Complex(int i){
// вызывает конструктор с двумя параметрами
this(i, i);
}
// конструктор без параметров
private Complex(){
// вызывает конструктор с одним параметром
this(0);
}
@Override
public String toString(){
return this.a + " + " + this.b + "i";
}
public static void main( String[] args ) {
// создание объекта класса Complex
// вызов конструктора с двумя параметрами
Complex c1 = new Complex(2, 3);
// вызывает конструктор с одним параметром
Complex c2 = new Complex(3);
// вызывает конструктор без параметров
Complex c3 = new Complex();
// выводим объекты
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
}
}
Вывод:
2 + 3i
3 + 3i
0 + 0i
В показанном выше примере мы использовали ключевое слово this для:- вызова конструктора Complex(int i, int j) из конструктора Complex(int i)
- вызова конструктора Complex(int i) из конструктора Complex()
System.out.println(c1);
Здесь, когда мы печатаем объект c1, то объект преобразуется в строку. В этом процессе вызывается toString(). Поскольку мы переопределяем метод toString() внутри нашего класса, то мы получаем вывод в соответствии с этим методом.
Одним из огромных преимуществ this() является уменьшение количества дублирующегося кода. Тем не менее, мы всегда должны быть осторожны, если решаем использовать this(). Это связано с тем, что вызов конструктора из другого конструктора добавляет сложность и сам по себе является довольно медленным процессом.
Примечание. Вызов одного конструктора из другого конструктора называется явным вызовом конструктора.
4. Передача this в качестве аргумента
Мы также можем использовать ключевое слово this для передачи текущего объекта в качестве аргумента метода. Перед вами пример кода:
class ThisExample {
// объявление переменных
int x;
int y;
ThisExample(int x, int y) {
// присваиваем значения переменных внутри конструктора
this.x = x;
this.y = y;
// значение x и y перед вызовом add()
System.out.println("Before passing this to addTwo() method:");
System.out.println("x = " + this.x + ", y = " + this.y);
// вызываем метод add(), передав this в качестве аргумента
add(this);
// значение x и y после вызова add()
System.out.println("After passing this to addTwo() method:");
System.out.println("x = " + this.x + ", y = " + this.y);
}
void add(ThisExample o){
o.x += 2;
o.y += 2;
}
}
class Main {
public static void main( String[] args ) {
ThisExample obj = new ThisExample(1, -2);
}
}
Вывод:
Перед передачей this методу addTwo():
x = 1, y = -2
После передачи this методу addTwo():
x = 3, y = 0
В этом примере обратите внимание на строку внутри конструктора ThisExample():
add(this);
В ней мы вызываем метод add(), передавая this в качестве аргумента. Поскольку это ключевое слово содержит ссылку на объект класса obj, мы можем изменить значение x и y внутри метода add().
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ