История вопроса:
В первых версиях Java был заложен механизм наследования, позволяющий дочернему классу расширять поведение родительского. Для обращения к членам родительского класса используется ключевое слово super, унаследованное из C++.
Проблема:
Иногда возникает необходимость явно обратиться к методу или полю родительского класса, если они были переопределены или скрыты. Без правильного использования super возможны ошибки или некорректное поведение, например, при работе с конструкторами.
Решение:
С помощью super можно:
Пример:
class Animal { void makeSound() { System.out.println("Animal sound"); } } class Dog extends Animal { void makeSound() { super.makeSound(); // Animal sound System.out.println("Bark"); } }
Ключевые особенности:
Может ли вызов super быть не первой строкой конструктора?
Нет. Вызов конструктора родителя с помощью super() обязан быть первой строкой конструктора. Если это ограничение нарушено — компилятор выдаст ошибку.
Можно ли использовать super в статических методах или контексте?
Нет. Ключевое слово super применимо только в неконстантном (экземплярном) контексте, так как относится к иерархии объектов, а не классов.
Можно ли через super обратиться к приватному методу родителя?
Нет. Privete-методы не видны потомкам — даже через super. Только public, protected и package-private методы или поля могут быть доступны через super.
Разработчик забывает явно вызвать super() в конструкторе производного класса, а у суперкласса нет конструктора по умолчанию.
Плюсы:
Минусы:
Переопределённый метод в подклассе сначала вызывает super-реализацию, а затем расширяет её дополнительной логикой.
Плюсы:
Минусы: