На JavaRush студентів буквально з перших лекцій знайомлять із ключовим словом
і виходить, що ви просто надаєте значення змінної
Тобто
А нижче програмний код з ключовим словом
this
. І з часом стає зрозуміло, що все ж таки воно означає. Але багато хто, обернувшись назад, напевно, чесно собі скажуть, що довго не могли усвідомити дзен цього ключового слова. У статті відкриваємо завісу таємниць застосування ключовика this
для тих, хто досі не може… Welcome! Якщо ви візьмете довідник Шилдта по Java , то на 171 сторінці ви прочитаєте про те, що ключове слово this
потрібно для того, щоб метод міг послатися на об'єкт, що його викликав. На цьому, власне, можна було б і закінчити. Але нам потрібна конкретика. Як правило, застосовувати this
потрібно у двох випадках:
- Коли у змінної екземпляра класу та змінної методу/конструктора однакові імена;
- Коли потрібно викликати конструктор одного типу (наприклад, за замовчуванням конструктор або параметризований) з іншого. Це ще називається очевидним викликом конструктора.
Приклад перший - у змінної екземпляра та методу однакові імена
Припустимо, у нас є класHuman
, для якого визначено поле «ім'я»: Давайте для змінної name
створимо сеттер (setter цілком робочий і ніякої каверзи тут немає): Зверніть увагу, що в метод (сеттер) setName
ми передаємо змінну String newName
. Ми ввели нову змінну і (загалом) могли назвати її як завгодно, адже вона буде видно тільки в межах {фігурних дужок} методу setName
. Зверніть увагу, що в сеттері є один рядок:
name = newName;
Тобто за фактом ми запровадабо нову змінну newName
і привласнабо її вже існуючій у класі змінній name
. Багатьом програмістом здавалося це дивним — вводити змінну з новим ім'ям, якщо в результаті йдеться про те саме. Про ім'я в класі Human
. Тому розробники мови замислабося над тим, щоб зручно зробити використання одного імені змінної. Іншими словами, навіщо мати два імені для змінної, що позначає одне й те саме. Тобто хотілося б зробити якось так: Але в цьому випадку виникає проблема . У нас тепер дві змінні, які називаються однаково. Один String name
належить класу Human
, а інший String name
його методу setName
. Тому Java – машина не знає, яку змінну ви маєте на увазі, коли пишете рядок у сеттері:
name = name;
Java бере найближчу - name
з методу setName
:
name
з цього методу, їй же. Що звичайно не має жодного сенсу. Тому потрібен був якийсь спосіб, щоб відрізнити змінну з name
класу Human
, від змінної з name
методу . setName
this
Human
this
пошлеться на об'єкт, що викликав, як було сказано на початку статті. Внаслідок чого ім'я людини через сетер setName
буде встановлено об'єкту, що створюється. Нижче наведено програмний код без використання ключового слова this
. У коді створюється об'єкт класу Human
та присвоюється йому ім'я:
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
передається у всі методи, крім статичних (тому this
часто називають неявним параметром) і може бути використане для звернення до об'єкта, що викликав метод. Боятися цього ключового слова не треба, бо This
не страшно.