Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida Aula 2 exercício 8

Temos o seguinte código :

import java.io.*;
class B {
    void x(int i) throws IOException {
        if(i<0) return;
        this.x(-1);
        System.out.println("c");
    }
}
abstract class C extends B {
    void x(int i) throws IOException {
        System.out.println("b");
        super.x(i);
    }
}
abstract class D extends C {
    void x(int i) throws IOException {
        super.x(i);
    }
}
class E extends D {
}
class A {
    public static void main(String[] args) throws IOException  {
        new E().x(32);
    }
}

Gostaria de entender pq é impresso "c" já que o retun no if encessa a execução do método

1 resposta
solução!

Nesse caso há uma chamada recursiva ao método. Ao entrar pela primeira vez no método temos i=32;

class B { //primeira chamada
    void x(int i) throws IOException {
        if(i<0) return; //como i > 32 não entra aqui
        this.x(-1); //ocorre uma chamada ao próprio método passando i=-1
        System.out.println("c");
    }
}

Após isso ocorre a segunda chamada:

class B { //chamada recursiva
    void x(int i) throws IOException {
        if(i<0) return; //ocorre o retorno dessa ocorrência
        this.x(-1); 
        System.out.println("c");
    }
}

Por fim o retorno faz com que a primeira chamada da função volte na linha this.x(-1) por conta do return dessa chamada. Após isso ocorre o print "c" e acaba o método.

class B { //primeira chamada
    void x(int i) throws IOException {
        if(i<0) return;
        this.x(-1); //volta a partir daqui 
        System.out.println("c"); //print "c"
    }
}