Precedencia this() e super()

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???

Muito Obrigado

Abraços

respondendo p/ mim mesmo! rs

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???

Abraços

valew seufagner!
entendi sim!

mas eu ainda fiquei em duvida em relação ao super()

pelo que sei o compilador insere um super() se isto não for feito no construtor, pois todas as classes descendem de java.lang.Object, correto?

então se eu tivesse a seguinte situação:

public class Pai(){
    ...
    Pai(String nome, String rg){
    ...
    }
  
    Pai(String nome){   
    this(nome, "");
    ...
    }
}

nos construtores não seria incluido um super() p/ a Object?

e como ficaria o construtor com somente um parametro?
this(nome,"");
super();

ou
super();
this(nome, “”);

eu tentei compilar aqui e as duas situações o javac me retornou um erro pois as duas instruções deveriam vir primeiro…

enendeu +/- minha duvida?

Valeu!
Abraços

hummm realmente!
agora ficou bem mais claro!!!

valeu cara!!!

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
}

deu pra entender a necessidade?

nao precisa chamar super() explicitamente…

ex:

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…

dont worry!