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