Ao definir uma classe sem um construtor, o compilador irá definir implicitamente um construtor sem argumentos. Se, no entanto, você escreve um construtor, seja ele com ou sem argumentos, então o construtor não providencia nenhum construtor implicitamente. A primeira linha de um construtor deve ser
super() ou
this(). Se nenhum dos dois métodos é escrito explicitamente, o compilador irá inserir implicitamente
super(). Ambas chamadas não podem ser declaradas no corpo do mesmo construtor, ou
this(), ou
super(). Repare, no entanto, que, em algum momento, haverá a chamada para o construtor da superclasse por meio do super(). Caso a superclasse não tenha um construtor sem argumentos, então você deverá chamar explicitamente, no construtor da classe herdeira, o construtor com argumentos da superclasse. Vejamos um exemplo:
public class Animal{
public Animal(String s){}
}
public class Dog extends Animal{}
O código acima não compila, pois o compilador irá gerar implicitamente um construtor na classe Dog que chama o construtor sem argumentos da superclasse por meio do
super(), mas não há um construtor sem argumentos na classe Animal. Neste caso, o construtor de Dog deve ser explicitamente escrito e o construtor com argumentos da classe Animal chamado por meio de
super(objeto_string).
Construtores não podem ter retornos e devem ter o mesmo nome da classe. O construtor providenciado pelo compilador, quando não há nenhum explícito na classe, tem o mesmo nível de acesso que a classe. Construtores podem ser declarados como
private. Outro detalhe importante é que os métodos de uma instância só podem ser chamados depois que
super() foi executados. O seguinte código, portanto, é ilegal:
public class Dog{
public Dog(){
eat();
this(5);
}
public Dog(int n){
}
public void eat();
}
O compilador irá adicionar implicitamente a chamada a
super() no construtor com argumentos, mas o código não irá compilar ainda assim, pois no construtor sem argumentos há uma chamada a um método de instância, a saber,
eat(), antes que ocorra a chamada de
super. Antes do método super(), somente métodos estáticos podem ser chamados.