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
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.
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”
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…
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.