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 схожі
Перш ніж розглядати відмінності ключових слів
this
і
super
давайте подивимося на деякі їх подібності:
- І
this
, і super
- це нестатичні змінні, відповідно їх не можна використовувати у статичному контексті, а це означає, що їх не можна використовувати у методі main. Це спричинить помилку під час компіляції "на нестатичну змінну this
не можна посилатися зі статичного контексту". Те саме відбудеться, якщо в методі main скористатися ключовим словом super
.
- І
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("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
Висновок: Конструктор з одним аргументом класу A Конструктор з одним аргументом класу B Конструктор без аргументів класу B
- Усередині конструктора
this
і super
повинні стояти вище за всі інші вирази, на самому початку, інакше компілятор видасть повідомлення про помилку. З чого випливає, що в одному конструкторі не може бути одночасно і this()
, і super()
.
Відмінності у super та this
Тепер ми знаємо як використовувати ключові слова
super
та
this
й розуміємо для чого вони потрібні. Але є ще один варіант використання цих ключових слів, про який я не сказав – у Внутрішніх класах, де з їхньою допомогою дуже зручно посилатися на зовнішній клас, використовуючи форму запису Outer.
this
для його поточного екземпляра та Outer.
super
- Для його батька. Не забудьте замість Outer підставити ім'я зовнішнього класу. А тепер давайте коротко перерахуємо головні відмінності між ключовими словами
this
та
super
- змінна
this
посилається на поточний екземпляр класу, у якому вона використовується, тоді як super
на поточний екземпляр батьківського класу.
- Кожен конструктор за відсутності явних викликів інших конструкторів неявно викликає за допомогою
super()
конструктор без аргументів батьківського класу, при цьому у вас завжди залишається можливість викликати будь-який інший конструктор за допомогою або this()
, або super()
.
Мабуть, це все, що можна сказати про відмінності між ключовими словами
this
і
super
Java і про те, як вони використовуються в програмах. Як ми побачабо, основне їхнє призначення - викликати один конструктор з іншого та посилатися на змінні екземпляри, оголошені в поточному класі та його батьківському класі. Не забувайте, що це не зовсім звичайні змінні, а зараз – відповідь на моє запитання, яке я ставив у першому параграфі. Ні, змінної
this
не можна надати нове значення, тому що вона оголошена як final. Можете спробувати зробити це в IDE - отримайте помилку компіляції "не можна надати нове значення змінній
this
- вона оголошена як final".
Оригінал статті тут .
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ