2013-09-18 2 views
0

В ArrayList.java, почему есть ArrayList(int initialCapacity) конструктор, вызывающий super()?Почему ArrayList's constuctor (ArrayList (int initialCapacity)) вызывает конструктор по умолчанию суперкласса?

Я знаю, что он пытается вызвать конструктор по умолчанию суперкласса, т. Е. AbstractList(). Но нет абсолютно никакой реализации в AbstractList().

protected AbstractList() { 
} 

В любом случае конструктор по умолчанию суперкласса будет вызываться в этом случае.
Что нужно написать super()?

+4

Должен быть вызван конструктор суперкласса, super(), если конструктор не указан. Вещи идут за кулисами даже с пустым конструктором. Вызов его явно, возможно, что-то сказал автору (например, напомнил людям, чтобы они не «исправляли» его, чтобы положить в конструктор annother), не весь код для компьютера –

+7

'super()' вызывается в любом случае, как вы сказали. Я предполагаю, что это просто вопрос стиля, чтобы называть его явно. – Thomas

+0

Некоторые IDE (затмение) с помощью некоторой проверки стиля могут пометить конструктор с помощью значка предупреждения о смелости, не вызывающего супер явно. –

ответ

4

Тот факт, что конструктор AbstractList ничего не делает, не означает, что его не нужно вызывать. Точнее, пустой конструктор фактически ничего не делает. JVM все еще делает вещи, когда вызывается конструктор, даже если он пуст. Вы всегда должны вызывать конструктор при создании объектов, и каждый конструктор всегда должен сначала вызвать конструктор суперкласса (за исключением, конечно, Object).

Если вы не указали super() в конструкторе ArrayList, он по-прежнему будет называться implictly по умолчанию. Написание его явно считается хорошим стилем для некоторых разработчиков. То же самое относится к объявлению пустого конструктора по умолчанию, который также будет использоваться по умолчанию. Хотя здесь немного непоследовательности. Если они придерживались той же конвенции, я предполагаю, что это должно быть

protected AbstractList() { 
    super(); 
} 
+0

Считается хорошим стилем. – EJP

+0

@EJP занятый ;-) –

+0

Да @stonedsquirrel Я согласен с вашей точкой. Если они следуют стандарту кодирования, тогда защита AbstractList() и защищенная AbstractCollection() также предполагают содержать super(), но в настоящее время это не – rockyPeoplesChamp

1

Там нет необходимости писать это - super() излишни, но это не делает никакого вреда.

Хорошие разработчики (например, сами по себе), которые знают спецификацию, поймут, что super() называется неявным образом перед любым другим кодом в конструкторе, если не указано явно.

+0

Спасибо, что обратились ко мне как к хорошему разработчику, так и к вашему ответу :) – rockyPeoplesChamp

Смежные вопросы