Java това: Къде и как да го използвам?

В тази статия ще научим за тази ключова дума в 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, който е извикал конструктора. Следователно на възрастовата променлива се присвоява стойност 8.

Също така, ако името на параметъра и променливата на екземпляра е различно, компилаторът автоматично добавя тази ключова дума. Например кодът:

 class Main ( int age; Main(int i) ( age = i; ) )

е еквивалентно на:

 class Main ( int age; Main(int i) ( this.age = i; ) )

това с Getters and Setters

Друга често използвана 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ключова дума:

  • за да присвоите стойност в метода на задаване
  • за достъп до стойност вътре в метода на гетера

Използване на това в Constructor Overloading

Докато работим с претоварване на конструктора, може да се наложи да извикаме един конструктор от друг конструктор. В такъв случай не можем да извикаме конструктора изрично. Вместо това трябва да използваме 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()метода.

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