Passagem por referência em java

Como se faz passagem por referência (ponteiro) em java? Aceito qualquer gambiarra!

Enfim eu quero fazer isso::

public void f(){ int x = 5; g(x); } public void g(int x){ x=10; // quando ele faz isso a variavel x método f() tem que valer 10 }

Cara… no caso naum rola… pq mesmo se vc usar uma Wrapper tipo Integer… vc vai receber uma nova referencia pro mesmo objeto, mas quando vc usa o operador de atribuicao vc esta referenciando a variavel para um novo objeto.
Neste cas oque vc pode fazer eh retornar o valor e seguir…

Para que isso fucionasse vc teria que ter um metodo tipo setValue(int value); na wrapper… dai funcionaria blz! Maaaas… a saida eh essa ou criar o seu proprio Wrapper…
[]'s

public void f(){
   int x = 5;
   x = g(x);
 }

 public int g(int x){
   return x+10;
 }

Tô pensando em fazer um objeto, colocar as minhas variaveis lá e pronto. Usar esse objeto e fim. É o jeito mais bonito (ou menos feio…) que eu consegui pensar.

Estou estudando para o SCJP 1.5 e vai aí uma canja que eu revisava ainda hoje (coincidências não existem, você foi quem descuidou dos detalhes… rss… provérbios, ah provérbios… um dia ainda faço um livro com os meus).

Vamos lá:

void bar(){
    Foo f = new Foo();

    doStuff(f);
}

void doStuff(Foo g){
    g.setName("Boo");
    g = new Foo();
}

No exemplo acima instanciar g novamente não irá “re-instanciar” f, de tal forma que vc pode alterar o estado do objeto, ou seja, suas variáveis mas não sobrepor (fazer novo new). Neste caso estamos falamos de objetos mas no caso de tipos primitivos a coisa fica pior pq não irá nem mesmo o estado da variável passada como parâmetro, afinal, por ser primitiva não se instancia e sim altera-se somente seu estado.

É isso!

Olá

Java sempre passa parametros por valor.
http://www.javaranch.com/campfire/StoryCups.jsp

furutani:

Sobre o uso de objetos eu li o mesmo trecho do livro que você hoje. Por isso conclui que usar um objeto é o jeito… eu taco as minhas variaveis lá e fim… o objeto não vai ter nexo nenhum mas… funciona e fica arrumado. Melhor do que sair retornando listas de coisas nos meus métodos (um mínimo de estética também).

jwcunha:

Eu sei… mas existe o vasto universo da gambiarra. Uma gambiarra bonitinha já tá ótimo.

Um array também é um objeto.
Portanto, você pode fazer isto, mas é muito feio e não é prático:

 public void f(){
   int[] x = new int[]{5};
   g(x);
   System.out.println (x[0]); // imprime 10
 }
 public void g(int[] x){
   x[0]=x[0] + 5;  // no seu caso, volta 10
 }

Acho que, no caso específico, você deveria fazer:

 public void f(){
   int x = 5;
   x = g(x);
 }
 public int g(int x){
   return x + 5;  // no seu caso, volta 10
 }

C# tem a passagem de valores por referência, mas ele faz isso internamente criando um novo objeto temporário (parecido com o tal array de 1 posição que mostrei para você), e é obrigatório usar a palavra-chave “ref” tanto na declaração quanto na chamada:

 public void f(){
   int x = 5;
   g(ref x);
 }
 public void g(ref int x){
   x=10; 
 }