Passar por Valor e Referência
Olá Amigos,
Procurei aqui no fórum mas não achei nada que falasse a diferença entre passagem por Valor e passagem por Referência. Acho que já lí algo que em java os objetos são sempre por referência.
Preciso saber como preciso fazer para ter um método e passar por referência uma variável primitiva int ou short e as vezes por referencia uma Short e Integer.
Valeu!
Romulo.asm
Curtidas 0
Respostas
Marcos Pereira
09/04/2009
Em Java, parametros são *sempre* passados por valor. No caso de objetos, o que geralmente confunde a galera é que uma copia da *referencia* é passada e não uma copia do objeto. Ou seja, se vc fizer algo como:
O objeto "original" continua imutado. "obj" é uma nova referencia para o objeto e não a mesma. Agora, se fosse assim:
Aqui sim o objeto (mas não a referencia) seria atualizado já que tanto "original" quanto "obj" apontam para o mesmo objeto, apesar de, ressalto novamente, não serem a mesma referencia. Em tempo, há um tutorial sobre isso aqui no JavaFree. Dá uma olhada na parte de tutorias que vc encontra. No caso de passar tipos primitivos para tentar altera-los como se estivesse usando um ponteiro de C, vc não vai conseguir isso. Nem mesmo usando as wrapper classes já que elas criam objetos imutaveis. Se quiser fazer algo do genero vc mesmo vai ter que criar as suas wrapper classes, mas nada que dê muito trabalho.
valeuz...
public static void aMethod(MyObject obj) {
obj = new MyObject();
}
public static void main(String[] args) {
MyObject original = new MyObject();
aMethod(original) ;
}
public static void aMethod(MyObject obj) {
obj.setProperty("new value");
}
public static void main(String[] args) {
MyObject original = new MyObject();
aMethod(original) ;
}
GOSTEI 0
Marcos Pereira
09/04/2009
Facilitando a vida:
http://www.javafree.com.br/forum/viewtopic.php?t=1375
Esse é o tutorial do qual falei no post acima.
valeuz...
GOSTEI 0
Marcos Pereira
09/04/2009
imagina que se vc faz passagem por referencia....
quando voce passa um numero para um método... e vc altera esse numero.... voce altera essa referencia.... ou seja.... alterou a fonte do numero passado....
por valor... voce passa um numero igual ao que vc passou antes.... mas se alterar... ele (fonte) nao será alterado..... para isso temos o return...
+- assim:
metodo para incrementar 1 à um numero se fosse passado por referencia:
mas no java não é assim.... se voce fizer isto.... vai imprimir 10 nos 2
no java vc tem que fazer assim (passar por valor)
Ok ?
Espero ter ajudado
Abracao
public void incrementa(int i) {
i++;
}
int x = 10;
System.out.println(x); //imprime 10
incrementa(x);
System.out.println(x); //imprime 11
public int incrementa(int i) {
return i++;
}
int x = 10;
System.out.println(x); //imprime 10
x = incrementa(x);
System.out.println(x); //imprime 11
}
GOSTEI 0
Bruno Borges
09/04/2009
soh pra martelar na cabeça de vcs: Java eh sempre por Valor...
agora, se vc quer "simular" uma passagem de um tipo primitivo, "por referencia" (apenas pensando no conceito, e nao no q realmente acontece na vm)... a dica eh vc passar seu primitivo, dentro de um array :)
pronto, vc tah passando o primitivo "por referencia"... mas pra nao confundir, jah vo fala antes de alguem pirar: o q fizemos aki foi uma passagem por valor... arrays sao sempre objetos, mesmo arrays de tipos primitivos... nós passamos o objeto "array com um item, no valor de 1,99" pro metodo... o metodo alterou o valor da posicao 0, e pronto... :) o q fizemos nao foi nada mais do q um "get e setValor" no array... :)
(entenderam?) :!:
...
int total = calculaAe(new double[]{1.99}, 10);
...
public void calculaAe(double[] valor, int qtdade) {
valor[0] = valor[0] * qtdade;
}GOSTEI 0
Bruno Borges
09/04/2009
agora, alguem deve se perguntar (com certeza, todo mundo q começa em java se pergunta isso, hehehe)
se eu to passando um objeto por valor, q nem faço com os primitivos, pq q eu consigo recuperar o atributo q foi alterado?!?! simples... na real na real, verdade verdadeira... o q foi passado nao foi O objeto... foi A referencia ao objeto... digamos assim, o ponteiro pro objeto... manja? tanto q... imagine isso:
eh... vai imprimir 20... ;P pois no metodo "nuncaVaiAcontecer" eu nao recebi a referencia à variavel, e sim a referencia pro objeto q ela apontava... e o q eu fiz com a variavel "obj" foi apenas apontar pra outro obj... a variavel "vinte" continua apontando pro "Integer(20)"
public void hahahaDuvido() {
Object vinte = new Integer(20);
nuncaVaiAcontecer(vinte);
System.out.println(vinte); // isso aki vai imprimir o q? 10 ou 20?
}
public void nuncaVaiAcontecer(Object obj) {
obj = new Integer(10);
}GOSTEI 0
Bruno Borges
09/04/2009
um post de 2009 e me esta sendo muito util!!! :mrgreen:
e que com certeza deve ajudar quem está começando.
eu ja ia abrir um!!!
GOSTEI 0