JavaRush /Java блог /Random UA /Ключове слово this {у прикладах}
Автор
Jesse Haniel
Главный архитектор программного обеспечения в Tribunal de Justiça da Paraíba

Ключове слово this {у прикладах}

Стаття з групи Random UA
На JavaRush студентів буквально з перших лекцій знайомлять із ключовим словом this. І з часом стає зрозуміло, що все ж таки воно означає. Але багато хто, обернувшись назад, напевно, чесно собі скажуть, що довго не могли усвідомити дзен цього ключового слова. У статті відкриваємо завісу таємниць застосування ключовика thisдля тих, хто досі не може… Welcome! Якщо ви візьмете довідник Шилдта по Java , то на 171 сторінці ви прочитаєте про те, що ключове слово thisпотрібно для того, щоб метод міг послатися на об'єкт, що його викликав. На цьому, власне, можна було б і закінчити. Але нам потрібна конкретика. Ключове слово this {у прикладах} - 1Як правило, застосовувати thisпотрібно у двох випадках:
  1. Коли у змінної екземпляра класу та змінної методу/конструктора однакові імена;
  2. Коли потрібно викликати конструктор одного типу (наприклад, за замовчуванням конструктор або параметризований) з іншого. Це ще називається очевидним викликом конструктора.
Ось і все, насправді не так багато, — лише два випадки, коли застосовується це страшне ключове слово. Тепер розглянемо ці дві ситуації на прикладах.

Приклад перший - у змінної екземпляра та методу однакові імена

Припустимо, у нас є клас Human, для якого визначено поле «ім'я»: Ключове слово this {у прикладах} - 2Давайте для змінної nameстворимо сеттер (setter цілком робочий і ніякої каверзи тут немає): Ключове слово this {у прикладах} - 3Зверніть увагу, що в метод (сеттер) setNameми передаємо змінну String newName. Ми ввели нову змінну і (загалом) могли назвати її як завгодно, адже вона буде видно тільки в межах {фігурних дужок} методу setName. Зверніть увагу, що в сеттері є один рядок:
name = newName;
Тобто за фактом ми запровадабо нову змінну newNameі привласнабо її вже існуючій у класі змінній name. Багатьом програмістом здавалося це дивним — вводити змінну з новим ім'ям, якщо в результаті йдеться про те саме. Про ім'я в класі Human. Тому розробники мови замислабося над тим, щоб зручно зробити використання одного імені змінної. Іншими словами, навіщо мати два імені для змінної, що позначає одне й те саме. Тобто хотілося б зробити якось так: Ключове слово this {у прикладах} - 4Але в цьому випадку виникає проблема . У нас тепер дві змінні, які називаються однаково. Один String nameналежить класу Human, а інший String nameйого методу setName. Тому Java – машина не знає, яку змінну ви маєте на увазі, коли пишете рядок у сеттері:
name = name;
Java бере найближчу - nameз методу setName:
Ключове слово this {у прикладах} - 5
і виходить, що ви просто надаєте значення змінної nameз цього методу, їй же. Що звичайно не має жодного сенсу. Тому потрібен був якийсь спосіб, щоб відрізнити змінну з nameкласу Human, від змінної з nameметоду . setNamethisHuman
Ключове слово this {у прикладах} - 6
Тобто thisпошлеться на об'єкт, що викликав, як було сказано на початку статті. Внаслідок чого ім'я людини через сетер setNameбуде встановлено об'єкту, що створюється. Нижче наведено програмний код без використання ключового слова this. У коді створюється об'єкт класу Humanта присвоюється йому ім'я:
Ключове слово this {у прикладах} - 7
А нижче програмний код з ключовим словом this:
public class Solution{
    public static void main(String[] args) {
        Human human1 = new Human();
        human1.setName("Volodya");
        human1.print();
    }
}
class Human{
    String name;
    public String getName() {
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    void print(){
        System.out.println(name);
    }
}
Таким чином, тут thisдозволяє не вводити нові змінні для позначення того самого, що дозволяє зробити код менш «перевантаженим» додатковими змінними.

Приклад другий — Застосування цього для явного виклику конструктора

Виклик одного конструктора з іншого може стати в нагоді тоді, коли у вас (як не дивно) кілька конструкторів і вам не хочеться в новому конструкторі переписувати код ініціалізації, наведений у конструкторі раніше. Заплутав? Все не так страшно, як здається. Подивіться на код нижче, у ньому два конструктори класу Human:
class Human{
    int age;
    int weight;
    int height;

    Human(int age, int weight){
        this.age = age;
        this.weight = weight;
    }
    Human(int age, int weight, int height){
        //ви викликаєте конструктор із двома параметрами
        this(age, weight);
        //і додаєте мінливу змінну
        this.height = height;
    }
}
Тут у нас спочатку наводиться конструктор із двома параметрами, який приймає int ageі int weight. Допустимо, ми написали в ньому два рядки коду:
this.age = age;
this.weight = weight;
а потім вирішабо додати ще один конструктор, з трьома параметрами, який крім віку та ваги набуває ще й зростання. У новому конструкторі ви могли б написати так:
this.age = age;
this.weight = weight;
this.height = height;
Але замість того, щоб повторювати вже написаний раніше код цього конструктора, ви можете за допомогою ключового слова thisявно викликати конструктор з двома параметрами:
this(age, weight);
// і дописуєте змінну, що бракує:
this.height = height;
Таким чином, ви ніби говорите конструктору з трьома параметрами:
  • Виклич this (цей) конструктор, який має два параметри.
  • і додати змінну, що бракує.
Ось і все =). Насамкінець зазначимо, що ключове слово this в Java використовується лише у складі методів чи конструкторів екземпляра класу. Але неявно ключове слово thisпередається у всі методи, крім статичних (тому thisчасто називають неявним параметром) і може бути використане для звернення до об'єкта, що викликав метод. Боятися цього ключового слова не треба, бо Thisне страшно.
Ключове слово this {у прикладах} - 9
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ