1
resposta

Exercício 8

Olá! Pelo o que eu entendi, quando o código chega na classe B, vai ser executada a condição até satisfazê-la; mas enquanto não a satisfazer, o argumento do método main (32) vai ser decrementado e jogado para a subclasse C (imediata à B) até satisfazer a condição if(i<0) e finalizar o método da classe B.

Para chegar ao método da classe B novamente (e ser decrementado), o argumento tem de passar pela primeira linha do método da classe C (System.out.println("b");), para chegar na linha em que ele é transferido para o método da classe B.

A minha dúvida é: se a cada decremento, o método da classe B joga o i(32) para o método da classe C, sendo que esse tem como primeira instrução de execução a impressão da letra b, para depois ser jogado na classe B, por que só imprime duas letras b?

1 resposta

Oi Philippo, tudo bem?

Na verdade a interpretação deve ser a seguinte:

class Teste {
    public static void main(String[] args) throws IOException  {
        new E().x(32); // chama o método x de D (Já que E não tem esse método)
    }
}

abstract class D extends C {
    void x(int i) throws IOException {
        super.x(i); // Chama o método em C
    }
}

abstract class C extends B {
    void x(int i) throws IOException {
        System.out.println("b"); // Imprime "b"
        super.x(i); // chama o método de B (na primeira chamada o i é 32 e na segunda é -1)
    }
}

class B {
    void x(int i) throws IOException {
        if(i<0) return; 
        this.x(-1); // chama o método em D passando -1
        System.out.println("c"); // imprime "c"
    }
}