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

Exercício 8

Olá! Esse código não está claro em dois pontos. Sabendo que o resultado é bbc, eu tenho as seguintes dúvidas:

Por quê quando a condição entra em "if(i<0) return;" ele não executa a linha "this.x(-1);" 5 mas executa a linha 6 " System.out.println("c" + i);"?

6 respostas

Poste o código completo

Oi Matheus, segue, desculpe eu achei que havia postado o 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);
    }
}
Leandro, Na verdade, o "return;" pára a execução do método pra valer. Nem a linha 5 nem a 6 são executadas... Agora, o fato de imprimir "c" no final tem a ver com o fluxo do código, que é bem confuso. Perceba que o método B.x é chamado 2 vezes: a primeira com o valor 32, a segunda com o valor -1. É na primeira chamada, com o valor 32 (> 0), que é impresso o "c".
solução!

Oi Alexandre,

eu agradeço o seu retorno. Eu ainda estou confuso mas você ajudou a esclarecer melhor o funcionamento desse código, minha dúvida ainda está no return. Eu coloquei algumas mensagens no programa e observei que quando ele executa a linha 3(if(i<0) return;) pela primeira vez o valor de "i" é 32 e como 32 não é menor que zero eleexecuta a linha 4(this.x(-1); enviando esse valor para a class D.

Na segunda passagem pela linha linha 3(if(i<0) return;) "i" passa a valer -1 e a codição da linha 3 passa a ser verdadeira então ele não executa a linha 4(this.x(-1);

Minha dúvida é se o return finaliza a execução do método porque ele executa a linha 5(System.out.println("c");) e faz a impressão de "C". Ele não deveria sair do método?

Estou enviado o meu código com algumas mensagem para ajudar no entendimento. Obrigado.

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" + i); super.x(i); } } abstract class D extends C { void x(int i) throws IOException { System.out.println("passou D" + i); super.x(i); } } class E extends D { E(){ System.out.println("passou E"); } } class A { public static void main(String[] args) throws IOException { new E().x(32); } }

Leandro,

O return realmente para a execução do método B.x(-1). A vez que imprime "c" é a primeira chamada!

Vamos simular a execução:

```

A.main():

....executa new E()

........chama E.x(32)

........E.x(32):

............repassa para D.x(32)

............D.x(32):

................chama super.x(32), ou seja, C.x(32)

................C.x(32):

....................imprime "b"

....................chama super.x(32), ou seja, B.x(32)

....................B.x(32):

........................32 > 0 (continua)

........................chama this.x(-1), ou seja, D.x(-1)

........................D.x(-1):

............................chama super.x(-1), ou seja, C.x(-1)

............................C.x(-1):

................................imprime "b"

................................chama super.x(-1), ou seja, B.x(-1)

................................B.x(-1):

....................................-1 < 0 (retorna)

................................termina B.x(-1)

............................termina C.x(-1)

........................termina D.x(-1)

........................imprime "c"

....................termina B.x(32)

................termina C.x(32)

............termina D.x(32)

........termina E.x(32)

termina A#main

```

Alexandre,

obrigado pelo retorno.