Java this: где и как его использовать?

В этой статье мы узнаем об этом ключевом слове в 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); ) )

Выход :

 эта ссылка = Main @ 23fc625e ссылка на объект = Main @ 23fc625e

В приведенном выше примере мы создали объект с именем obj класса Main. Затем мы печатаем ссылку на объект obj и thisключевое слово класса.

Здесь мы видим, что ссылки для obj и thisодинаковы. Значит, это не что иное, как ссылка на текущий объект.

Использование этого ключевого слова

Существуют различные ситуации, в которых thisобычно используется ключевое слово.

Использование этого для неоднозначности имен переменных

В Java не разрешено объявлять две или более переменных с одинаковыми именами внутри области (области класса или области метода). Однако переменные экземпляра и параметры могут иметь одно и то же имя. Например,

 class MyClass ( // instance variable int age; // parameter MyClass(int 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); ) )

Выход :

 mc.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.

Кроме того, если имя параметра и переменной экземпляра отличается, компилятор автоматически добавляет это ключевое слово. Например, код:

 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);

Here, when we print the object c1, the object is converted into a string. In this process, the toString() is called. Since we override the toString() method inside our class, we get the output according to that method.

One of the huge advantages of this() is to reduce the amount of duplicate code. However, we should be always careful while using this().

This is because calling constructor from another constructor adds overhead and it is a slow process. Another huge advantage of using this() is to reduce the amount of duplicate code.

Note: Invoking one constructor from another constructor is called explicit constructor invocation.

Passing this as an Argument

We can use this keyword to pass the current object as an argument to a method. For example,

 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); ) )

Выход :

 Перед передачей в метод addTwo (): x = 1, y = -2 После передачи в метод addTwo (): x = 3, y = 0

В приведенном выше примере внутри конструктора ThisExample()обратите внимание на строку

 add(this);

Здесь мы вызываем add()метод, передавая его в качестве аргумента. Поскольку это ключевое слово содержит ссылку на объект obj класса, мы можем изменить значение x и y внутри add()метода.

Интересные статьи...