Ответ
Ключевое слово super в Java используется для обращения к членам родительского класса (суперкласса) из дочернего класса (подкласса). Основные случаи применения:
-
Вызов конструктора родительского класса
Первая строка конструктора подкласса может содержатьsuper()для вызова конструктора суперкласса. -
Доступ к методам/полям родителя
Если подкласс переопределяет метод, можно вызвать оригинальную версию черезsuper.methodName().
Пример:
class Parent {
void display() {
System.out.println("Parent method");
}
}
class Child extends Parent {
@Override
void display() {
super.display(); // Вызов метода родителя
System.out.println("Child method");
}
}
Важно: super() в конструкторе вызывается неявно, если не указан явно (только для конструктора по умолчанию).
Ответ 18+ 🔞
А, ну вот, опять про этот ваш super! Слушай, это же элементарно, Ватсон, ёпта. Представь себе, что у тебя есть папаша-класс, а у него — сынок-класс, который всё от него унаследовал. Так вот, super — это как крикнуть этому сынку: «Эй, ты! Не забывай, кто твой отец! Спроси у бати, как правильно делать!»
Ну, например, первое и главное — вызов конструктора бати. Это как будто ты строишь свой дом (конструктор подкласса), но фундамент-то у тебя уже отцовский. Так вот, первым делом ты должен этот фундамент залить, то есть вызвать super(). А иначе что получится? Дом без фундамента — пизда рулю. Если не напишешь явно, компилятор, такой хитрожопый, сам его подставит, но только если у бати есть конструктор без параметров. А если нет — тут тебе и привет, ошибка компиляции. Сам вмандюрь, чувак.
class Папаша {
Папаша(String имя) { // Без дефолтного конструктора
System.out.println("Папаша " + имя);
}
}
class Сынок extends Папаша {
Сынок() {
super("Иванов"); // Без этой строчки — нихуя не скомпилируется!
System.out.println("А я Сынок");
}
}
Второй случай — когда ты хочешь добраться до методов или полей родителя, которые сынок, такой распиздяй, переопределил или спрятал. Ну, например, сынок заявил: «Я сам метод display() напишу!» А потом охуел и понял, что без отцовской версии него нихуя не работает. Вот тут super и выручает — крикни super.display(), и батя тебе поможет.
class Parent {
void display() {
System.out.println("Parent method"); // Мудрость предков
}
}
class Child extends Parent {
@Override
void display() {
super.display(); // Сначала спросим у папаши, как делать
System.out.println("Child method"); // А потом уж своё добавим
}
}
Иначе, если просто вызвать display(), будет бесконечная рекурсия или своя версия — и ты нихуя от родительской логики не увидишь. Доверия ебать ноль к такому коду.
Запомни главное: super — это не какая-то абстрактная хуйня, а конкретная ссылка на непосредственного родителя. Не на дедушку, а именно на папу. И если ты его не используешь там, где надо, получишь или ошибку, или поведение, от которого потом сам от себя охуеешь. Всё гениальное просто: хочешь воспользоваться наследием — уважай предков через super.