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