ajuda em java

docpt

Power Member
Ola boa noite.

estou com duvidas em saber a diferença o significado do procedimento troca3 e troca4 quando estes são chamados

Eis o seguinte excerto programa:

Código:
static void troca3(Inteiro u, Inteiro v) {
Inteiro aux = u; u = v; v = aux;
}
 
static void troca4(Inteiro u, Inteiro v) {
int aux = u.valor; u.valor = v.valor; v.valor = aux;
}
 
...
 
int x = 0, y = 2;
troca1(x,y);
 
int[] a = { 2, 3 };
troca2(a,0,1);
 
Inteiro u = new Inteiro(); u.valor = 5;
Inteiro v = new Inteiro(); v.valor = 7;
troca3(u,v);
troca4(u,v);
.......

desde já obrigado
 
Última edição pelo moderador:
Assim lido por alto e na diagonar... o troca3 troca a referência para os objectos. Ou seja, eles não são modificados apenas reatribuidos. O troca4 troca mesmo os valores!
 
Assim lido por alto e na diagonar... o troca3 troca a referência para os objectos. Ou seja, eles não são modificados apenas reatribuidos. O troca4 troca mesmo os valores!


O troca4 então fica no fiinal u.valor=7 e v.valor=5;

Agora no troca3 é que não percebo troca as referencias quer dizer que os valores ficam como estão mas a referencia é trocada.

resumidamente é isto certo?

obrigado
 
Código:
Inteiro u = new Inteiro(); u.valor = 5;
Inteiro v = new Inteiro(); v.valor = 7;
System.out.println(u); // ref1
System.out.println(v); // ref2
troca3(u,v);
System.out.println(u); // ref2
System.out.println(v); // ref1
System.out.println(u.valor); // 7
System.out.println(v.valor); // 5
troca4(u,v);
System.out.println(u); // ref2
System.out.println(v); // ref1
System.out.println(u.valor); // 5
System.out.println(v.valor); // 7
Nada como olhar para uns outputs.
 
Última edição:
Código:
Inteiro u = new Inteiro(); u.valor = 5;
Inteiro v = new Inteiro(); v.valor = 7;
System.out.println(u); // ref1
System.out.println(v); // ref2
troca3(u,v);
System.out.println(u); // ref2
System.out.println(v); // ref1
System.out.println(u.valor); // 7
System.out.println(v.valor); // 5
troca4(u,v);
System.out.println(u); // ref2
System.out.println(v); // ref1
System.out.println(u.valor); // 5
System.out.println(v.valor); // 7
Nada como olhar para uns outputs.

Sendo isto java, não vai imprimir as referências, e sim os valores para onde apontam (não sei se era essa a tua intenção, se não, sorry :P).

Código:
static void troca3(Inteiro u, Inteiro v) {
Inteiro aux = u; u = v; v = aux;
}
 
static void troca4(Inteiro u, Inteiro v) {
int aux = u.valor; u.valor = v.valor; v.valor = aux;
}
A diferença é que o troca3 tens 2 variáveis em memória e 3 apontadores.
No inicio u aponta para mem1, v aponta para mem2; depois da função fica u aponta mem2 e v aponta para mem1, sem que os valores em memória tenham sido alterados, apenas os apontadores.

Em troca4 tens 3 variáveis em memória e 3 apontadores.
No inicio u aponta para mem1, v aponta para mem2, no decorrer da função é criada uma mem3 que assume o valor de mem1, o valor de mem1 é modificado para igual a mem2, e mem2 para mem3; depois da função u aponta para mem1 (mas já modificada), v aponta para mem2 (também modificada) e mem3 é descartada.

Penso que o intuito desse exemplo é aprenderes a diferença entre modificar o valor e a referência das variáveis.

(Para te contextualizares em Java todos os objectos são referências, logo quando fazes obj1 = obj2, estás apenas a igualar as referências, não os valores).

Espero ter sido claro e que tenha ajudado.
 
Imagina que Inteiro é uma mesa e Valor uma gaveta dessa mesa.
Referencia é o onde essas mesas estao.
Uma mesa esta na sala(referencia) e outra na cozinha(referencia).

troca3 troca a sala(referencia) com a cozinha(referencia) mantendo as mesas(Inteiros) no mesmo sitio. Quando entramos agora na cozinha(referencia), temos la a mesa(Inteiro) da antiga sala(referencia) com a respectiva gaveta(Valor). Quando entramos na nova sala(referencia), temos la a mesa(Inteiro) da antiga cozinha(referencia) com a respectiva gaveta(Valor).

troca4 troca apenas as gavetas(Valores) das mesas(Inteiros), mantendo a sala e cozinha(referencias). A mesa(Inteiro) da sala(referencia) mantem-se na sala, mas com a gaveta(Valor) da mesa da cozinha(referencia). A mesa da cozinha(referencia) mantem-se na cozinha(referencia), mas com a gaveta(Valor) da mesa(Inteiro) da sala(referencia).


Espero nao ter complicado mais.... :)
 
[C4];4043602 disse:
Imagina que Inteiro é uma mesa e Valor uma gaveta dessa mesa.
Referencia é o onde essas mesas estao.
Uma mesa esta na sala(referencia) e outra na cozinha(referencia).

troca3 troca a sala(referencia) com a cozinha(referencia) mantendo as mesas(Inteiros) no mesmo sitio. Quando entramos agora na cozinha(referencia), temos la a mesa(Inteiro) da antiga sala(referencia) com a respectiva gaveta(Valor). Quando entramos na nova sala(referencia), temos la a mesa(Inteiro) da antiga cozinha(referencia) com a respectiva gaveta(Valor).

troca4 troca apenas as gavetas(Valores) das mesas(Inteiros), mantendo a sala e cozinha(referencias). A mesa(Inteiro) da sala(referencia) mantem-se na sala, mas com a gaveta(Valor) da mesa da cozinha(referencia). A mesa da cozinha(referencia) mantem-se na cozinha(referencia), mas com a gaveta(Valor) da mesa(Inteiro) da sala(referencia).


Espero nao ter complicado mais.... :)



Obrigado, percebido muito obrigado mesmo..
 
Back
Topo