Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Зачем добавлять в конструктор дочернего класса super(), если компилятор делает это автоматически?

#java #наследование #конструктор


Зачем добавлять в конструктор дочернего класса вызов super(), если компилятор делает
это автоматически? 

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


Ответы

Ответ 1



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

Ответ 2



Не обязательно в каждом конструкторе вызывать super(). Если базовый класс не содержит конструктора с аргументами, тогда в классах наследниках не обязательно писать super(), это подразумевается (эти вызовы расставит компилятор). Если же у базового класса есть конструктор с аргументами, тогда уже Вам необходимо указать эти аргументы, соответственно необходимо и конструктор базового класса вызвать. Можно так же передать управление какому-то конструктору из текущего класса, вызвав this(), но эта цепочка должна привести к вызову конструктора базового класса, рассмотрите этот пример class Base { int i; Base(int i) { this.i = i; } } public class Super extends Base { boolean b; String s; Super(String s, boolean b) { this(s); this.b = b; } Super(String s) { super(1); this.s = s; } } Таким образом директивы this и super позволяют переиспользовать конструкторы и не плодить одинаковый код инициализации

Комментариев нет:

Отправить комментарий