Когда вам нужно явно вызвать конструктор суперкласса? - PullRequest
95 голосов
/ 12 июня 2011

Скажем, у меня есть подкласс, который расширяет суперкласс.В каких случаях мне нужно явно набирать super(), чтобы запустить конструктор суперкласса?

Я смотрю на пример в книге об абстрактных классах, и когда они расширяют его с помощью неабстрактного подкласса, конструктор по умолчанию подкласса становится пустым, и есть комментарий, который говорит, что конструктор по умолчанию суперкласса будет,В то же время я также видел случаи, когда чья-то проблема явно не вызывала super().

Отличие от вызова конструктора суперкласса по умолчанию / не по умолчанию от конструктора подкласса по умолчанию / не по умолчанию?

Ответы [ 3 ]

139 голосов
/ 12 июня 2011

Вам никогда нужно просто

super();

Вот что будет, если вы ничего не укажете.Вам только необходимо указать конструктор для вызова, если:

  • Вы хотите вызвать конструктор суперкласса с параметрами
  • Вы хотите связать с другим конструктором втот же класс вместо конструктора суперкласса

Вы утверждаете, что:

В то же время я также видел случаи, когда чья-то проблема явно не вызывала супер().

Не могли бы вы привести примеры?Я не могу представить, как это возможно ...

10 голосов
/ 12 июня 2011

Если вы не вызовете супер-конструктор явно, будет вызван конструктор без аргументов (super ()).Это означает, что вы должны вызывать конкретный конструктор самостоятельно, если в суперклассе нет достижимого конструктора без аргументов.

Но достаточно часто вам все равно нужен другой конструктор, даже если вы можете использовать конструктор по умолчанию - зависит от вашего кода.

Также обратите внимание, что если конструктор не объявлен, компилятор генерирует общедоступный конструктор по умолчаниюавтоматически, но как только вы напишите свой собственный конструктор, этого больше не будет.

4 голосов
/ 12 июня 2011

Метод super() всегда вызывается в конструкторах подклассов, даже если он явно не написан в коде.

Единственный раз, когда вам нужно написать его, это если в суперклассе есть несколько super(...) методов с различными параметрами инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...