Eu estou estudando p/ certificação e em um simulado vi uma questão que perguntava sobre o código abaixo:
class Pai {
Pai() {
System.out.println("Pai");
}
Pai(int valor) {
System.out.println("Pai int: " + valor);
}
}
class Filho extends Pai {
Filho() {
System.out.println("Filho");
}
Filho(int valor) {
super(valor);
this();
}
}
public class Teste {
public static void main(String[] args) {
Pai p = new Pai();
Filho primeiro = new Filho();
}
}
bom na classe filho o segundo construtor contem o this() e o super(), lembro que os dois devem vir primeiro no construtor e confirmei isso compilando o código, minha duvida é sobre o this() no construtor, não me lembro de usa-lo dessa forma em um contrutor, mas achei mesmo estranho não haver um precedencia entre eles…
em que caso devo usar this() desta forma no construtor???
posso usar o this() para chamar outro construtor caso eu faça a sobrecarga de construtores e passar os parametros
ex. this (param1, param2)
mas continuo com duvida de não existem um precedencia em this() e super()
ambos sempre devem vir na primeira linha, agora se quando não coloco o this() a JVM insere uma na hora da compilação e se eu precisar usar herança a JVM não vai fazer isso “automagicamente”???
qual a diferencia se eu fizer isso???
ele primeiro tenta chamar o construtor vazio da superclasse…
o ultimo da pilha a ser executado é o da classe que voce instanciou.
exemplo:
class A extends B{
A(){
super(“algo”);
// faz mais coisas
}
A(int x){
// faz mais coisas
}
}
class B{
B(String s){
…
}
}
isso vai dar erro! pois veja que na classe A eu declaro um construtor que recebe um int, porem, implicitamente a jvm sempre vai procurar por um construtor vazio na superclasse… como B nao tem um, ele da erro de compilacao… porem, se chamasse explicitamente o construtor de B que recebe uma String, ele nao daria erro…
A(int x){
super(“agora nao vai dar erro”);
// faz mais coisas
}
public class Pai(){
…
Pai(String nome, String rg){
…
}
Pai(String nome){
this(nome, "");
...
}
}
… main… {
Pai papai = new Pai(“sei que”);
}
o construtor Pai(String nome) chama outro construtor que por sua vez, mesmo que voce nao coloque um super() explicitamente antes de qualquer declaracao dentro do construtor Pai(String nome, String rg) ele vai chamar este…