GARANTIR DESCONTO

Fórum Passar por Valor e Referência #565431

09/04/2009

0

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

Romulo.asm

Responder

Posts

09/04/2009

Marcos Pereira

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:
public static void aMethod(MyObject obj) {
   obj = new MyObject();
}

public static void main(String[] args) {
   MyObject original = new MyObject();
  aMethod(original) ;
}
O objeto "original" continua imutado. "obj" é uma nova referencia para o objeto e não a mesma. Agora, se fosse assim:
public static void aMethod(MyObject obj) {
   obj.setProperty("new value");
}

public static void main(String[] args) {
   MyObject original = new MyObject();
  aMethod(original) ;
}
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...
Responder

Gostei + 0

09/04/2009

Marcos Pereira

Facilitando a vida: http://www.javafree.com.br/forum/viewtopic.php?t=1375 Esse é o tutorial do qual falei no post acima. valeuz...
Responder

Gostei + 0

09/04/2009

Marcos Pereira

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:
public void incrementa(int i) {
  i++;
}

int x = 10;
System.out.println(x); //imprime 10
incrementa(x);
System.out.println(x); //imprime 11
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)
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
}
Ok ? Espero ter ajudado Abracao
Responder

Gostei + 0

09/04/2009

Bruno Borges

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 :)
...
    int total = calculaAe(new double[]{1.99}, 10);
...
  public void calculaAe(double[] valor, int qtdade) {
    valor[0] = valor[0] * qtdade;
  }
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?) :!:
Responder

Gostei + 0

09/04/2009

Bruno Borges

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:
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);
}
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)"
Responder

Gostei + 0

03/05/2013

Bruno Borges

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!!!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar