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] -------------------------------------------------------------------------