В этом рассказе мы узнаем об этом ключевом слове в Java, как и где их использовать с помощью примеров.
это ключевое слово
В Java это ключевое слово используется для ссылки на текущий объект внутри метода или конструктора. Например:
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
.
Использование этого для неоднозначных имен переменных
В Java не разрешается объявлять две или более переменных с одинаковым именем внутри области видимости (области действия класса или области действия метода). Однако переменные и параметры экземпляра могут иметь одно и то же имя. Например:
class MyClass { // instance variable int age; // parameter MyClass(int age){ age = age; } }
В приведенной выше программе переменная экземпляра и параметр имеют одно и то же имя: age. Здесь компилятор Java сбит с толку из-за неоднозначности имени.
В такой ситуации мы используем это ключевое слово. Например:
Во-первых, давайте посмотрим на пример без использования ключевого слова 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, вызвавшим конструктор. Следовательно, переменной возраста присваивается значение 8.
Кроме того, если имя параметра и переменной экземпляра различаются, компилятор автоматически добавляет это ключевое слово. Например, код:
class Main { int age; Main(int i) { age = i; } }
эквивалентно:
class Main { int age; Main(int i) { this.age = i; } }
это с геттерами и сеттерами
Еще одно распространенное использование ключевого слова this
— в методах установки и получения класса. Например:
class Main { String name; // setter method void setName( String name ) { this.name = name; } // getter method String getName(){ return this.name; } public static void main( String[] args ) { Main obj = new Main(); // calling the setter and the getter method obj.setName("Toshiba"); System.out.println("obj.name: "+obj.getName()); } }
Вывод
obj.name: Toshiba
Здесь мы использовали ключевое слово this
:
- чтобы присвоить значение внутри метода установки
- для доступа к значению внутри метода получения
Использование этого в перегрузке конструктора
При работе с перегрузкой конструктора нам может потребоваться вызвать один конструктор из другого конструктора. В таком случае мы не можем вызвать конструктор явно. Вместо этого мы должны использовать ключевое слово this
.
Здесь мы используем другую форму этого ключевого слова. То есть this()
. Возьмем пример:
class Complex { private int a, b; // constructor with 2 parameters private Complex( int i, int j ){ this.a = i; this.b = j; } // constructor with single parameter private Complex(int i){ // invokes the constructor with 2 parameters this(i, i); } // constructor with no parameter private Complex(){ // invokes the constructor with single parameter this(0); } @Override public String toString(){ return this.a + " + " + this.b + "i"; } public static void main( String[] args ) { // creating object of Complex class // calls the constructor with 2 parameters Complex c1 = new Complex(2, 3); // calls the constructor with a single parameter Complex c2 = new Complex(3); // calls the constructor with no parameters Complex c3 = new Complex(); // print objects 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()
.
Это связано с тем, что вызов конструктора из другого конструктора добавляет накладные расходы и является медленным процессом. Еще одно огромное преимущество использования this()
заключается в уменьшении количества повторяющегося кода.
Примечание. Вызов одного конструктора из другого конструктора называется явным вызовом конструктора.
Передача в качестве аргумента
Мы можем использовать ключевое слово this
для передачи текущего объекта в качестве аргумента методу. Например:
class ThisExample { // declare variables int x; int y; ThisExample(int x, int y) { // assign values of variables inside constructor this.x = x; this.y = y; // value of x and y before calling add() System.out.println("Before passing this to addTwo() method:"); System.out.println("x = " + this.x + ", y = " + this.y); // call the add() method passing this as argument add(this); // value of x and y after calling 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); } }
Вывод
Before passing this to addTwo() method: x = 1, y = -2 After passing this to addTwo() method: x = 3, y = 0
В приведенном выше примере внутри конструктора ThisExample()
обратите внимание на строку:
add(this);
Здесь мы вызываем метод add()
, передавая this в качестве аргумента. Поскольку это ключевое слово содержит ссылку на объект obj класса, мы можем изменить значение x и y внутри метода add()
.