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

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

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

Перш ніж розглядати відмінності ключових слів this і super. давайте подивимося на деякі їх подібності:

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

2) І this. і super можуть використовуватися всередині конструкторів для виклику інших конструкторів по ланцюжку, нпр. this () і super () викликають конструктор без аргументів посяде і батьківського класів відповідно.

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


3) Всередині конструктора this і super повинні стояти вище всіх інших виразів, на самому початку, інакше компілятор видасть повідомлення про помилку. З чого випливає, що в одному конструкторі не може бути одночасно і this (), і super ().

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

1) змінна this посилається на поточний екземпляр класу, в якому вона використовується, тоді як super - на поточний екземпляр батьківського класу.

2) Кожен конструктор при відсутності явних викликів інших конструкторів неявно викликає за допомогою super () конструктор без аргументів батьківського класу, при цьому у вас завжди залишається можливість явно викликати будь-який інший конструктор за допомогою яких this (), або super ().

Мабуть, це все, що можна сказати про відмінності між ключовими словами this і super в Java і про те, як вони використовуються в програмах. Як ми побачили, основне їхнє призначення - викликати один конструктор з іншого і посилатися на змінні екземпляра, оголошені в поточному класі і його батьківському класі. Не забувайте, що це не зовсім звичайні змінні, а зараз - відповідь на моє запитання, яке я ставив у першому параграфі. Ні, змінної this можна присвоїти нове значення, тому що вона оголошена як final. Можете спробувати зробити це в IDE - отримаєте помилку компіляції «не можна присвоїти нове значення змінної this - вона оголошена як final».

1) змінна this посилається на поточний екземпляр класу, в якому вона використовується, тоді як super - на поточний екземпляр батьківського класу. хотів уточнити по super. написано, що вона посилається на екземпляр батьківського класу. тобто, якщо беремо приклад з тексту. створюємо по одному об'єкту:

тепер якщо в коді класу B ми зустрінемо згадка super (не в конструкторі, а десь в інших методах наприклад) - то воно посилається на objA виходить?
а якщо у нас буде ще:

на що тепер буде посилатися super?

спасибі за відповідь, навіть якщо він здасться дуже нубскім)

Чогось не бачив цього питання раніше, ось тільки тепер помітив :-)
В даному випадку ключове слово super, використане в коді класу B, буде посилатися на той об'єкт батьківського класу А, який входить до складу об'єкта B. Адже коли створюється об'єкт будь-якого класу, будь-якого класу - спочатку створюються об'єкти всіх його батьківських класів, а вже в кінці тільки - об'єкт самого класу.
Тобто об'єкт класу В складається насправді з 2-х, а точніше - 3-х об'єктів: об'єкта класу Object, об'єкта класу А і об'єкта самого класу В.
У вашому прикладі super НЕ буде посилатися ні на об'єкт objA, ні на об'єкт objA1.

Добридень! Не зовсім зрозуміло вираз «3) ... З чого випливає, що в одному конструкторі не може бути одночасно і this (), і super ()» А як же завдання level15.lesson02.task04, в якій є конструктор (приклад коду) Заранее спасибо . -)
public static class AgathaChristieBook extends Book
public String name;
public AgathaChristieBook (String name)
super ( «Agatha Christie»);
this.name = name;
>

Тут this використовується для поля, а мова йде про виклик іншого конструктора this (), тобто ось так не можна: