Olá! Estou com dúvida nessa questão aqui, é de concurso:
"Sejam as classes seguintes escritas em Java:
class A {int x; A(){setX(10);} int getX(){return x;} void setX(int y) {x=y;}}
class B extends A {B(){ x+=100; }}
class C extends B { C(){ this(10); x*=2; } C(int y) {setX(y+getX());}}
A execução da sentença new C().getX() retorna que valor?"
Eu escrevi no papel e fui tentar executar na cabeça, não consegui chegar na resposta que é 240, então coloquei no Eclipse e enchi de print pra tentar entender:
class A {
int x;
A(){
setX(10);
System.out.println("Saiu do construtor de A valendo: "+x);
}
int getX(){
System.out.println("Saiu do método getX de A valendo: "+x);
return x;
}
void setX(int y)
{
x=y;
System.out.println("Usou metodo setX de A, atribuindo y que vale: "+y);
}
}
class B extends A {
B(){
x+=100;
System.out.println("Saiu do construtor de B valendo: "+x);
}
}
class C extends B {
C()
{
this(10);
x*=2;
System.out.println("Saiu do construtor de C valendo: "+x);
}
C(int y)
{
System.out.println("Usou método C que soma " + y + " Ao getX que vale: " + getX());
setX(y+getX());
}
}
Daí na classe teste rodei:
System.out.println( new C().getX()) ;
Que deu no console:
Usou metodo setX de A, atribuindo y que vale: 10
Saiu do construtor de A valendo: 10
Saiu do construtor de B valendo: 110
Saiu do método getX de A valendo: 110
Usou método C que soma 10 Ao getX que vale: 110
Saiu do método getX de A valendo: 110
Usou metodo setX de A, atribuindo y que vale: 120
Saiu do construtor de C valendo: 240
Saiu do método getX de A valendo: 240
240
Então ao chamar new C().getX(); eu entendi que vai lá no construtor da super classe A, o construtor dela executa:
setX(10);
Vai pro construtor da Clase Filha B, que adiciona 100, dando 110.
Daí por que agora roda o método getX() da superclasse A de novo? A partir daí não entendi mais.