JavaRush/Java блог/Random UA/Різниця між ключовими словами this і super в Java
grishin
27 рівень

Різниця між ключовими словами this і super в Java

Стаття з групи Random UA
учасників
thisі super- це два спеціальні ключові слова в Java, які представляють відповідно поточний екземпляр класу та його суперкласу. Java-програмісти часто плутають ці слова і виявляють слабку поінформованість про їхні спеціальні властивості, про які нерідко запитують на інтерв'ю Java Сore. Ось, наприклад, пара питань, з того, що відразу спадає на думку, про thisі super, Чи можна привласнити інше значення ключовому слову thisв Java? і яка різниця між ключовими словами thisта superв Java. Не знаєте? Що ж, тут я відповіді не даю — її можна знайти наприкінці статті. Різниця між ключовими словами this і super в Java - 1Так ось, як я вже сказав на початку, головна відмінність між thisі superJava в тому, що thisпредставляє поточний екземпляр класу, в той час якsuper- поточний екземпляр батьківського класу. Ось один із прикладів використання змінних thisі superви напевно вже бачабо приклади викликів конструкторів одного з іншого, т.зв. виклики конструкторів по ланцюжку, це можливо завдяки використанню ключових слів thisта super. Усередині класу для виклику свого конструктора без аргументів використовується this(), тоді як super()використовується для виклику конструктора без аргументів, або як його ще називають конструктора за замовчуванням батьківського класу. Між іншим, у такий спосіб викликати можна як конструктор без аргументів, а й взагалі будь-який інший конструктор, передавши йому відповідні параметри. Незабаром ми побачимо приклад такого thisвикористання super. Ще thisйsuperJava використовуються для звернення до змінних екземпляра класу та його батька. Взагалі, до них можна звертатися і без префіксів superі this, але якщо в поточному блоці такі змінні не перекриваються іншими змінними, тобто. якщо в ньому немає локальних змінних з такими ж іменами, інакше використовувати імена з префіксами доведеться обов'язково, але це не біда, т.к. у такому вигляді вони навіть більш читальні. Класичним прикладом такого підходу є використання thisвсередині конструктора, який приймає параметр з таким самим ім'ям, як і у змінної екземпляра. Далі у статті ми дізнаємося, які ще є відмінності між super, thisі розглянемо деякі приклади їх використання.

Чим this і super схожі

Перш ніж розглядати відмінності ключових слів thisі superдавайте подивимося на деякі їх подібності:
  1. І this, і super- це нестатичні змінні, відповідно їх не можна використовувати у статичному контексті, а це означає, що їх не можна використовувати у методі main. Це спричинить помилку під час компіляції "на нестатичну змінну thisне можна посилатися зі статичного контексту". Те саме відбудеться, якщо в методі main скористатися ключовим словом super.

  2. І this, і superможуть використовуватися всередині конструкторів для виклику інших конструкторів по ланцюжку, нпр., this() і super() викликають конструктор без аргументів спадкового та батьківського класів відповідно.
У прикладі нижче ми спочатку передаємо виклик з конструктора без аргументів класу B конструктор цього ж класу B, який приймає один параметр типу , Stringз якого, у свою чергу, за допомогою super("")викликається конструктор з одним аргументом з суперкласу.
class A{

    A(){
        System.out.println("Конструктор без аргументов класса A");
    }

    A(String args){
        System.out.println("Конструктор с одним аргументом класса A");
    }
}

class B extends A{

   B(){
        this(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        System.out.println("Конструктор с одним аргументом класса B");
    }
}

// Тест-класс и вывод
public class Test {

    public static void main(String args[]) {
       B b = new B();
    }

}
Висновок: Конструктор з одним аргументом класу A Конструктор з одним аргументом класу B Конструктор без аргументів класу B
  1. Усередині конструктора thisі superповинні стояти вище за всі інші вирази, на самому початку, інакше компілятор видасть повідомлення про помилку. З чого випливає, що в одному конструкторі не може бути одночасно і this(), і super().

Відмінності у super та this

Тепер ми знаємо як використовувати ключові слова superта thisй розуміємо для чого вони потрібні. Але є ще один варіант використання цих ключових слів, про який я не сказав – у Внутрішніх класах, де з їхньою допомогою дуже зручно посилатися на зовнішній клас, використовуючи форму запису Outer. thisдля його поточного екземпляра та Outer. super- Для його батька. Не забудьте замість Outer підставити ім'я зовнішнього класу. А тепер давайте коротко перерахуємо головні відмінності між ключовими словами thisтаsuper
  1. змінна thisпосилається на поточний екземпляр класу, у якому вона використовується, тоді як superна поточний екземпляр батьківського класу.

  2. Кожен конструктор за відсутності явних викликів інших конструкторів неявно викликає за допомогою super()конструктор без аргументів батьківського класу, при цьому у вас завжди залишається можливість викликати будь-який інший конструктор за допомогою або this(), або super().
Мабуть, це все, що можна сказати про відмінності між ключовими словами thisі superJava і про те, як вони використовуються в програмах. Як ми побачабо, основне їхнє призначення - викликати один конструктор з іншого та посилатися на змінні екземпляри, оголошені в поточному класі та його батьківському класі. Не забувайте, що це не зовсім звичайні змінні, а зараз – відповідь на моє запитання, яке я ставив у першому параграфі. Ні, змінної thisне можна надати нове значення, тому що вона оголошена як final. Можете спробувати зробити це в IDE - отримайте помилку компіляції "не можна надати нове значення змінній this- вона оголошена як final". Оригінал статті тут .
Коментарі (1)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Гаркін
Рівень 12
11 квітня, 19:25
побачабо = побачимо ? бачабо = бачили? ні, не бачаб :)