JavaRush /Java блог /Random /Кофе-брейк #236. Ключевое слово this в Java: способы и пр...

Кофе-брейк #236. Ключевое слово this в Java: способы и примеры использования

Статья из группы Random
Источник: Medium Благодаря этому руководству вы узнаете о предназначении ключевого слова this в Java, как и где его использовать на основе практических примеров. Кофе-брейк #236. Ключевое слово this в Java: способы и примеры использования - 1В 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().
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Sotonu Уровень 24
19 июля 2023
Довольно интересно. Теперь буду следить за данными статьями.