Если вам не удалось вызвать super в конструкторе, то компилятор добавит супер-вызов без аргументов в качестве родительского конструктора для первой строки тела конструктора.
Так же, как в ранее опубликованном коде
public class Foo
{
}
или
public class Foo
{
public Foo()
{
}
}
компилятор сгенерирует код, который соответствует правилам Java. Все объекты являются подклассами java.lang.Object, поэтому компилятор скомпилирует его так, как если бы оно было написано
// All classes extend Object. This is Java, after all.
public class Foo extends java.lang.Object
{
public Foo()
{
// When constructing Foo, we must call the Object() constructor or risk
// some parts of Foo being undefined, like getClass() or toString().
super()
}
}
Но если у суперкласса нет конструктора, соответствующего параметрам, вы должны вызвать соответствующий несоответствующий конструктор суперкласса.
public class LightBlue extends java.awt.Color
{
public LightBlue()
{
// There is no Color() constructor, we must specify the suitable super class
// constructor. We chose Color(int red, int green, int blue).
super(172, 216, 230);
}
}
В других случаях, возможно, существует конструктор, который соответствует сигнатуре конструктора подкласса, но по какой-либо причине вы не хотите передавать параметры непосредственно конструктору суперкласса.
public class HSVColor extends Color
{
public HSVColor(int hue, int saturation, int value)
{
super(...code converting HSV to Red...,
...code converting HSV to Green...,
...code converting HSV to Blue);
}
}
Если вы не указали явно конструктор суперкласса, то компилятор добавит конструктор суперкласса по умолчанию без аргументов. Однако, если этот конструктор не существует, компилятор не будет компилировать класс, поскольку неясно, какой из представленных конструкторов является правильным для вызова.
Это вопрос стиля, но вы можете решить всегда включать вызов super (). Если вы решили это сделать, это будет потому, что вы хотите напомнить читателю, что объекты базового класса должны быть созданы как часть объекта подкласса, и вы хотите сделать конкретный конструктор суперкласса явным. Традиционно всегда включаемый вызов super () является довольно странным, поскольку традиционно код выводится только в том случае, если он отличается от поведения по умолчанию.