08 julho 2009

[SCJP] Why this code printing false false?

Meu voucher chegou há pouco tempo, mais precisamente, na segunda (06/07/2009). E hoje, quando eu chego no trabalho disposto a recomeçar meus estudos, eu vejo um feed compartilhado por Raposo. A pergunta era: porque o código abaixo imprime "false false"?



Alguém consegue ler isso ai embaixo?

public class Fizz { int x = 5; public static void main(String[] args) { Fizz f1 = new Fizz(); Fizz f2 = new Fizz(); Fizz f3 = switchFizz(f1, f2); if(f1 == f3)f1 = f2; System.out.println((f2 == f3) + " " + (f2.x == f3.x)); } static Fizz switchFizz(Fizz f1, Fizz f2){ final Fizz z = f1; z.x = 6; return z; } }

A primeira coisa que eu fiz aqui foi formatar esse código... Fica bem mais fácil de ver. Não sei se no livro de onde isso ai foi tirado, o código tava formatado direitinho, mas enfim, facilita horrores...

public class Fizz { 
    int x = 5; 
    
    public static void main(String[] args) { 
        Fizz f1 = new Fizz(); 
        Fizz f2 = new Fizz(); 
        Fizz f3 = switchFizz(f1, f2); 
        if(f1 == f3)
            f1 = f2; 

        System.out.println((f2 == f3)+" "+(f2.x == f3.x)); 
    } 
 
    static Fizz switchFizz(Fizz f1, Fizz f2){ 
        final Fizz z = f1; 

        z.x = 6; 
        return z; 
    } 
} 

Fazendo isso, fica fácil ver o porque do código imprimir "false false". Após as linhas 5 e 6, f1 != f2 e f1.x == f2.x == 5, correto? Após a linha 7, f3 == f1 (veja a linha 15) e f1.x == f3.x == 6 (veja a linha 17).

Logo após a declaração das 3 variáveis locais, na linha 8, há uma condicional. Ela é processada, pois vimos que f1 == f3. Como resultado da linha 9, temos que f1 == f2 != f3, por assim dizer. A variável f2, que não foi alterada pelo switchFizz(), ainda possui f2.x == 5, o que nos leva a f1.x == f2.x = 5. E ainda temos f3.x == 6.

Ao chegar na linha do print, tempos (f2 == f3) com valor "false", e (f2.x == f3.x) com valor "false". Santo teste de mesa...

Fonte: CodeRanch



Creative Commons License
Esta obra está licenciada sob uma Licença Creative Commons.
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;