A vantagem disso e' performance. Nao sei se voce
programa em C++ ou nao, mas toda vez que voce passa um
objeto por referencia vc requer uma alocacao na heap,
o que custa mais caro em termos de performance do que
um parametro passado na stack. Entao por exemplo, se
voce tiver que escrever uma classe wrapper para poder
alterar um valor int dentro de uma funcao, o seu
programa esta fazendo basicamente as seguintes
operacoes:

- criar instancia da classe wrapper -> alocacao
dinamica na heap
- colocar valor inteiro dentro desta instancia
- coloca referencia na stack
- chama funcao MudaValor

Dentro da funcao MudaValor.
- Dereferencia a referencia (que nada mais e' que um
pointer)
- altera o valor atraves do pointer
- retorna

Quando vc passa por referencia, voce executa as
seguintes operacoes:
- coloca valor inteiro na stack
- chama funcao
Dentro da funcao MudaValor:
- altera valor na stack
- retorna

O numero de operacoes e' significativamente menor. Ai'
tambem tem outra coisa relacionada que eu notei que o
pessoal nao entendeu muito bem porque o C# tem
structs.

Quando voce declara:

class Point
{
  int x;
  int y;
}

em C#, funciona exatamente igual a Java. Ou seja,
quando voce faz:

Point p = new Point()
p.x = 1;
p.y = 2;

voce esta' fazendo por tras:
- Aloca instancia na Heap de 8 bytes (2 inteiros)
- incrementa o stack pointer para guardar a referencia
a instancia na heap
- dereferencia o pointer
- atraves do pointer muda o valor de x
- atraves do pointer muda o valor de y

Agora em C#, para evitar o custo da dereferencia do
pointer ou alocacao na heap, se voce usa structs:

struct Point
{
  int x;
  int y;
}

O compilador entende que esse e' um tipo de valor,
logo, isso vai ser alocado sempre na Stack:

Point p = new Point()
p.x = 1;
p.y = 2;

- Incrementa o stack pointer em 8 posicoes
- altera o valor de x na stack
- altera o valor de y na stack

note que nenhuma alocacao dinamica teve que acontecer.

Em outras palavras, structs em C# e' completamente
diferente de structs em C/C++. Alem disso a razao dele
existir e' a mesma porque o Java nao deriva int e char
de Object: performance. A diferenca aqui e' que em C#
voce pode levar esse ganho de performance para tipos
definidos pelo usuario, enquanto que em Java, voce
esta preso ao que foi especificado pela linguagem.

My 2 cents.

Marcelo Uemura
Software Design Engineer
Microsoft Corporation - MSDN

Disclaimer: o conteudo dessa mensagem e' minha opiniao
pessoal e de maneira nenhuma representa uma posicao
oficial da Microsoft.  



--- "Sergio Oliveira Jr." <[EMAIL PROTECTED]> wrote:
> 
> Realmente Java faz uma cópia da referencia antes de
> passá-la para a função, 
> mas estou curioso para saber qual é a diferença que
> isso faz na prática?
> 
> Posso estar errado, mas acho que toda essa confusão
> veio da diferença que em 
> C++ Strings são mutáveis e em Java não são.
> 
> O ponto é: Não dá para alterar a cópia da referência
> que ficou fora da 
> função de dentro da função.
> 
> Em C++ vc pode fazer isso MESMO PARA OBJETOS
> IMUTÁVEIS:
> 
> altereIsso(&a, &b, &c);
> 
> Em Java não dá para fazer isso para OBJETOS
> IMUTÁVEIS:
> 
> altereIsso(a, b, c); // Não dá se for imutável.
> 
> Se for imutável em Java vc terá que fazer:
> 
> a = altereIsso(a);
> b = altereIsso(b);
> c = altereIsso(c);
> 
> NA MINHA CABEÇA ISSO É MAIS UMA DIFERENÇA NA SINTAXE
> DA LINGUAGEM DO QUE UMA 
> VANTAGEM. Mas pode ser que alguém apresente algum
> caso em que isso seria 
> realmente uma vantagem de C++/C#.
> 
> -----------------------------------
> Sergio Oliveira Jr.
> Sun Certified Java Programmer
> Desenvolvedor e Consultor Java
> Empresa SmartJava
> WWW.SMARTJAVA.COM.BR
> "Dê ao homem um peixe e alimente-o
> por um dia. Ensine-o a pescar e
> alimente-o por uma vida."
> -----------------------------------
> 
> 
> 
> >From: "Luiz Fernando Bicalho" <[EMAIL PROTECTED]>
> >Reply-To: [EMAIL PROTECTED]
> >To: <[EMAIL PROTECTED]>
> >Subject: RE: [java-list] Re: Artigo Java x C#
> >Date: Thu, 4 Oct 2001 10:06:10 -0300
> >
> >entao o cara esta certo, e passagem por valor
> >
> >
> >
> >-----Original Message-----
> >From: Ricardo Santiago
> [mailto:[EMAIL PROTECTED]]
> >Sent: quinta-feira, 4 de outubro de 2001 07:58
> >To: [EMAIL PROTECTED]
> >Subject: Re: [java-list] Re: Artigo Java x C#
> >
> >
> >
> >Cara, neste caso voce esta MUDANDO a referencia que
> >voce recebeu.
> >Voce esta criando uma NOVA referencia e tentando
> >atribuir ` referencia que voce recebeu como
> parametro.
> >
> >Mas a passagem de objetos EH por referencia (as
> >referencias sao passadas por valor)
> >
> >Exemplo:
> >
> >class Numero {
> >
> >   private int value;
> >
> >   public Numero(int value) {
> >     this.value = value;
> >   }
> >
> >   public void inc() {
> >     value++;
> >   }
> >
> >   public int getValue() {
> >     return value;
> >   }
> >
> >   public static void main(String [] s) {
> >     Numero num = new Numero(1);
> >     System.out.println("num " + num.getValue());
> >     increment(num);
> >     System.out.println("num " + num.getValue());
> >   }
> >
> >   private static void increment(Numero num) {
> >     num.inc();
> >   }
> >
> >}
> >
> >Ricardo Munhoz Santiago
> >
> >--- Leonardo Souza Mario Bueno
> <[EMAIL PROTECTED]>
> >wrote:
> > > Nain, nain. Java nco tem passagem por referencia
> nem
> > > para objetos.
> > >
> > > Ex:
> > >
> > >     public void inc(Integer i) {
> > >         i = new Integer(i.intValue()++);
> > >         System.out.println("i = " + i); // i = 2
> > >     }
> > >
> > >     i = new Integer(1);
> > >     inc(i);
> > >     System.out.println("i = " + i); // i = 1
> > >
> > > Resultado:
> > >
> > > i = 2
> > > i = 1
> > >
> > > Ao chamar inc(i) i passada uma referencia ao
> objeto
> > > i por valor.. ou seja,
> > > mudangas na referencia dentro do metodo nco
> terco
> > > efeito fora dele..
> > >
> > > []'s,
> > >
> > > Leonardo.
> > >
> > > ----- Original Message -----
> > > From: "Carlos E O Chierici"
> <[EMAIL PROTECTED]>
> > > To: <[EMAIL PROTECTED]>
> > > Sent: Wednesday, October 03, 2001 1:35 PM
> > > Subject: Re: [java-list] Re: Artigo Java x C#
> > >
> > >
> > > > A passagem de parametros em Java funciona
> assim:
> > > >
> > > > - P/ objetos: por referencia
> > > > - P/ primitivos: por valor
> > > >
> > > > Veja o exemplo:
> > > >
> > > > public class Teste
> > > > {
> > > >    public void run()
> > > >    {
> > > >       TObj obj = new TObj();
> > > >       obj .i = 3;
> > > >       System.out.println(obj.i); // obj.i = 3
> > > >       NovoInt(obj);
> > > >       System.out.println(obj.i); // obj.i = 5
> > > >    }
> > > >
> > > >    public void NovoInt(TObj meuObj)
> > > >    {
> > > >       meuObj.i = 5;
> > > >    }
> > > >
> > > >    public static void main(String args[])
> > > >    {
> > > >       Teste t = new Teste();
> > > >        t.run();
> > > >    }
> > > > }
> > > >
> > > > class TObj
> > > > {
> > > >    public int i;
> > > > }
> > > >
> > > >
> > > > []s
> > > >
> > > > Carlos E O Chierici
> > > > [EMAIL PROTECTED]
> > > >
> > > > ----- Original Message -----
> > > >
> > > > From: <[EMAIL PROTECTED]>
> > > > To: <[EMAIL PROTECTED]>
> > > > Sent: Wednesday, October 03, 2001 9:52 AM
> > > > Subject: RE: [java-list] Re: Artigo Java x C#
> > > >
> 
=== message truncated ===


__________________________________________________
Do You Yahoo!?
NEW from Yahoo! GeoCities - quick and easy web site hosting, just $8.95/month.
http://geocities.yahoo.com/ps/info1

------------------------------ LISTA SOUJAVA ---------------------------- 
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP 
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED] 
-------------------------------------------------------------------------

Responder a