Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Ordem de como a classe super é chamada em Herança

Estou com dificuldade para entender o resultado da saída do seguinte código abaixo

import java.io.*;

class Alpha{

        void x(double i){
        System.out.println("Entrei Alpha ");
        if(i < 0){
            System.out.println("Sim");
            return;
        }
        this.x(-1);
        System.out.println("---------");
        System.out.println("af + " + i);     
    }
}

class B extends Alpha {
    void x(double i){
    System.out.println("Entrei em b ");
    System.out.println("a " +  i);
    System.out.println("----------");
    super.x(i);
           System.out.println("c + " + i);
    System.out.println("----------");
    }
}
class A {
    public static void main(String[] args){
        new B().x(32);
    }
}

Essa é a saída do meu código

Entrei em b
a 32.0
----------
Entrei Alpha
Entrei em b
a -1.0
----------
Entrei Alpha
Sim
c + -1.0
----------
---------
af + 32.0
c + 32.0
----------

Eu não entendi porque ele executou o System assim no final

af + 32.0
c + 32.0

o valor de i estava em -1 e pelo fluxo do console e também já tinha imprimido o valor c com -1.

Alguém sabe me dizer porque o comportamento do código ficou dessa forma?

2 respostas
solução!

Olá Ivan, tudo bem?

Quando foi invocado essa linha:

 this.x(-1);

o código foi para o método x(double i) da classe B, correto? Perceba que ainda tem duas linhas abaixo que ficam "pendente de serem executadas":

System.out.println("---------");
System.out.println("af + " + i);

essas duas linhas serão executadas quando o programa finalizar a segunda chamada do método x da classe B.

Logo depois, como ainda tem a primeira chamada à classe B, ainda serão executadas as linhas:

        System.out.println("c + " + i);
        System.out.println("----------");

Pensa nessas execuções como uma pilhagem de chamadas, quando o um método chama o outro e ainda não terminou de ser executado (ainda tem linhas que precisam rodar para concluir a execução do método) essas linhas serão executadas depois que terminar de executar a nova chamada a o outro método que foi feita.

Obrigado pelo esclarecimento ;)