Dúvida em uma questão

Alguém poderia me explicar porque o código abaixo não compila?

class Super{
	public int a;
	protected Super(int a){
		this.a = a;
	}
}

class Sub extends Super{
	public Sub(int a){ super(a); }
	public Sub(){ this.a = 5; }
}

O compilador Java gera o seguinte erro:

cannot find symbol symbol : constructor Super() location: class Super public Sub(){ this.a = 5; } ^ 1 error

O mais engraçado é que mesmo tirando o “this.a = 5” o código também não compila! :shock:

class Super{
	public int a;
	protected Super(int a){
		this.a = a;
	}
}

class Sub extends Super{
	public Sub(int a){ super(a); }
	public Sub(){  }
}

E o mesmo erro ocorre:

cannot find symbol symbol : constructor Super() location: class Super public Sub(){ } ^ 1 error

Alguma idéia do que está acontecendo?

Pq em Super vc nao tem um construtor explicito dessa forma:

[code]public Super(){

}[/code]

Agora pq vc teria que criar um em Super tb? Pq toda chamada a um construtor de uma classe, é chamado na primeira linha do corpo deste construtor o construtor de sua superclass logo vc nao tem um construtor sem parametros em sua superclass, pq quando vc criou o construtor subrecarregado, o construtor default que a JVM cria pra vc nao existe mais, entao se vc quiser um construtor sem parametros vc tera que criar um.

espero ter te ajudado…

Você tem 2 opções. Ou faz isso:

class Super{
	public int a;
	protected Super(int a){
		this.a = a;
	}
}

class Sub extends Super{
	public Sub(int a){ super(a); }
	public Sub(){ super(1);  }
}

ou isso:

class Super{
	public int a;

        protected Super(){
		
	}
	protected Super(int a){
		this.a = a;
	}
}

class Sub extends Super{
	public Sub(int a){ super(a); }
	public Sub(){  }
}

brrodo aproveitando o topico dele percebi algo interessante, se puder me responder ficarei agradecido, fazendo uns testes aqui olha só:

[code]public class Super {

public int a;

public Super(int a){
	this.a = a;
	System.out.println(this.a);
}

public Super(){
	System.out.println("passei aqui");
}

}[/code]

[code]public class Sub extends Super{

public Sub(int a) {
	System.out.println(a);
	// TODO Auto-generated constructor stub
}

	public Sub() {
	
}

	public static void main(String[] args) {
		
		new Sub(10);
		// imprime "passei aqui".
	}

}[/code]

Pq ele vai no construtor sem parametros sendo que foi chamado o construtor com parametro?

O construtor COM PARAMETRO que foi chamado, foi o da classe Sub.
A primeira linha do construtor COM PARAMETRO da classe Sub que é gerada implicitamente é “super();”, então quando ele é invocado ele chama o construtor SEM PARÂMETRO da classe Super, que imprime “passei aqui”.

A saída total da execução desse código é:
“passei aqui
10”

hum, vlw brrodo.

Muito obrigado pelas explicações pessoal! Agora eu entendi. Não tinha a mínima idéia de que o construtor default da superclasse era chamado automaticamente pelo construtor da subclasse… :wink:

Tiago nesse caso nao é mais o default, o default quem cria é a JVM a partir do momento que vc criou um construtor vc nao tem mais um construtor default.