Для чего нужно ключевое слово super в Java?

Ответ

Ключевое слово super в Java используется для обращения к членам родительского класса (суперкласса) из дочернего класса (подкласса). Основные случаи применения:

  1. Вызов конструктора родительского класса
    Первая строка конструктора подкласса может содержать super() для вызова конструктора суперкласса.

  2. Доступ к методам/полям родителя
    Если подкласс переопределяет метод, можно вызвать оригинальную версию через 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.