Exericio Simulado

4 respostas
C
class Wrench {
   public static void main(String [] args) {
     Wrench w = new Wrench();   Wrench w2 = new Wrench();
     w2 = go(w,w2);
    System.out.print(w2 == w);
   }
   static Wrench go(Wrench wr1, Wrench wr2) {
     Wrench wr3 = wr1;  wr1 = wr2;  wr2 = wr3;
     return wr3;
   }
 }

Alguem pode me explicar porque o resultado é true ?? Eu ja fiz varias vezes no papel e para mim a resposta é false sem duvidas!!! para mim w1 ira apontar para o segundo objeto criado e w3 apontado para o primeiro objeto criado.

Alguem entende pra me explicar? Ja fiz na ide e realmente deu true!

4 Respostas

Gravitor91w

Está certo, é true mesmo. O go() apenas te ilude trocando os dois valores, pois o que retorna é o wr3, que ainda possui o valor de w.

CarlosEduardoDantas

a resposta pro seu problema é o seguinte… em java, os parametros são passados por valor, não por referência… ou seja… esse método go(Wrench,Wrench) passou o endereço de memória das variáveis locais w,w2 correto?só que passou uma cópia desses endereços, entao wr1 está apontando para o mesmo endereço de memória que w e wr2 está apontando para o mesmo endereço de memória que w2.

quando vc faz wr1 = wr2; e wr2 = wr3; está modificando o endereço no qual as variáveis locais wr1 e wr2 referenciarão, porém nada acontece com w e w2 já que são outras variáveis.

Resultado… tu retorna um wr3 que na verdade está apontando para o mesmo endereço de memória que w e que wr1 antes de receber wr2 e esse wr3 é atribuído a w2 que no final das contas aponta pro mesmo lugar que w. :wink:

JimMorrison

java so passa por valor tipos primitivos e String, outros objetos são por referencia…
o retorno do metodo go eh a referencia recebida no seu primeiro parametro…

se na linha quatro eu to dizendo q w2 = go(w, w2)
na linha 8 w3 = w (pois a referencia de w foi o q passei na variavel de metodo wr1)
na linha 9 eu retorno w3

entao w2 == wr3 e wr3 == w

pois o metodo go nao faz nada alem de retornar wr1 !

CarlosEduardoDantas

JimMorrison:
java so passa por valor tipos primitivos e String, outros objetos são por referencia…
o retorno do metodo go eh a referencia recebida no seu primeiro parametro…

se na linha quatro eu to dizendo q w2 = go(w, w2)
na linha 8 w3 = w (pois a referencia de w foi o q passei na variavel de metodo wr1)
na linha 9 eu retorno w3

entao w2 == wr3 e wr3 == w

pois o metodo go nao faz nada alem de retornar wr1 !

na verdade, esse conceito de passar objetos por referência é um pouco “discutível”, pois os parâmetros de go(Wrench,Wrench) estão apontando para o mesmo endereço de memória que w e w2, porém são variáveis distintas, ou seja… foi copiado para wr1 o endereço que w está apontando e foi copiado para wr2 o endereço que w2 está apontando. Se wr1 modifica algum valor do seu objeto, também modificará em w, porém se wr1 referenciar outro objeto ou null, nada acontecerá com w porque são 2 variáveis distintas…

concluindo que, apesar de as duas referenciarem o mesmo cara, wr1 não é w e wr2 não é w2, apenas o conteúdo que está em w foi COPIADO para wr1 e o conteudo de w2 foi copiado para wr2…

ufa… :lol:

Criado 26 de setembro de 2007
Ultima resposta 26 de set. de 2007
Respostas 4
Participantes 4