Discordo, a passagem de parâmetros em Java é SEMPRE por valor, veja abaixo, um trecho traduzido da página 19 do livro Complete Java 2 Certification Study Guide (3º edição) que explica esta confusão de conceitos. public void metodo1() { Label lbl = new Label(); lbl.setText("testo 1"); metodo2(lbl); System.out.println(lbl.getText()); } public void metodo2(Label arg) { arg.setText("texto 2"); } No exemplo acima é criado um objeto da classe Label com uma referência chamada lbl. Esta referência é passada como parâmetro, o que significa que uma cópia dela é passada para o método2. Agora temos 2 referências apontando para o mesmo objeto, o que significa que ambas as chamadas setText irão modificar o mesmo objeto. É importante notar que a cópia aqui é entre as referências e não entre objetos. Mais uma vez a passagem de argumentos é por valor mas o valor neste caso não é uma grandeza numérica mas um endereço. Paulo Paro. Fabio Eduardo Thomaz <[EMAIL PROTECTED]> on 21/05/2003 16:57:24 Please respond to [EMAIL PROTECTED] To: [EMAIL PROTECTED] cc: (bcc: Paulo Roberto Paro/Stefanini) Subject: Re: [java-list] Pergunta for Dummies um exemplo simples de que a passagem de parametros não é sempre por valor é a passagem de um array... o que se passa é uma referência... Ex.: //----------------------------------------------------- public class Teste { public static void setArray ( double dArray[] ) { dArray[0] = 10; dArray[1] = 20; } public static void main ( String[] args ) { double dArrayOriginal[] = {0,0}; System.out.println ( "Array antes da passagem de parâmetro:" ); System.out.println ( dArrayOriginal[0] + " | " + dArrayOriginal[1] ); setArray ( dArrayOriginal ); System.out.println ( "Array depois da passagem de parâmetro:" ); System.out.println ( dArrayOriginal[0] + " | " + dArrayOriginal[1] ); } } //----------------------------------------------------- []'s Fabio Eduardo Thomaz Rodrigo escreveu: >Bem, até onde sei a Classe String não pode ser alterada, logo quando vc >fizer o += ele irá instanciar uma nova String, logo a referência não será >mais a mesma. O exemplo que me deste não mudou minha opinião... Ainda >acredito que quando a passagem for de objetos será por referência e não por >valor... Se criar uma classe e passá-la como parametro e dentro deste >método, eu alterar algum valor da mesma isso refletirá no meu objeto... Veja >exemplo: > >public class Teste01 { > private int numero; > public Teste01(int i) { > setNumero( i ); > } > > public void setNumero( int i ) { > numero = i; > } > > public int getNumero() { > return numero; > } >} > >public class Teste { > > public static void main(String[] args) { > Teste01 t = new Teste01(10); > xxx( t ); > System.out.println( t.getNumero() ); > } > > private static void xxx( Teste01 i ) { > i.setNumero( 15 ); > } >} > >Veja, passei um objeto como parâmetro e ao setar o valor modificou o estado >do meu objeto... >Quanto ao que você disse de o append estar alterando uma propriedade interna >da classe... Bem, meus objetos são feitos de propriedades e métodos, e se eu >criasse dois objetos StringBuffer diferentes e passase um deles como >parâmetro alteraria apenas daquele objeto... Logo, referência... > > > >----- Original Message ----- >From: "Alexandro Strack" <[EMAIL PROTECTED]> >To: <[EMAIL PROTECTED]> >Sent: Wednesday, May 14, 2003 6:57 PM >Subject: Re: [java-list] Pergunta for Dummies > > >Oi Rodrigo, > > Não concordo com você. O que acontece na verdade é que a classe >StringBuffer é mutável (diferente de String que é não mutável) e logo o que >se passa é que o método append está alterando o valor de uma >propriedade(variável) interna da classe StringBuffer. Essa propriedade >armazena o valor. Para você ter a certeza do que estou falando mude de >StringBuffer para String e substitua o append por += . Você verá que >imprimirá JAVA. > > Para ir mais além mude todo o seu exemplo para trabalhar não com um >StringBuffer mas com um Integer. Verá que também não funcionará pois a >classe Integer é não mutável. > > Em resumo: a passagem de parâmetro é sempre por valor. > >Um abraço, > >Alexandro Strack >----- Original Message ----- >From: "Rodrigo" <[EMAIL PROTECTED]> >To: <[EMAIL PROTECTED]> >Sent: Saturday, May 10, 2003 7:16 PM >Subject: Re: [java-list] Pergunta for Dummies > > > > >>hehehe, o exemplo não foi, agora sim: >> >>--- >>public class Teste { >> >> public static void main(String[] args) { >> StringBuffer s = new StringBuffer( " Java" ); >> teste( s ); >> System.out.println( s ); >> } >> public static void teste( StringBuffer s ) { >> s.append( " é bala" ); >> } >>} >>---- >>A saída será "Java é bala" o q no meu ver significa que a passagem foi por >>referência já que alterei o meu objeto que passei por parâmetro... >> >>Fallow >>----- Original Message ----- >>From: "Rodrigo" <[EMAIL PROTECTED]> >>To: <[EMAIL PROTECTED]> >>Sent: Saturday, May 10, 2003 7:14 PM >>Subject: Re: [java-list] Pergunta for Dummies >> >> >> >> >>>Eu sou suspeito a falar, mas pelo que sei toda a passagem de objetos em >>> >>> >>java >> >> >>>é por referência, já as passagens de tipos básicos serão sempre por >>> >>> >>valor... >> >> >>>Desculpe-me se estiver errado... >>> >>>Segue um exemplo: >>> >>>----- Original Message ----- >>>From: "José Voss Junior" <[EMAIL PROTECTED]> >>>To: <[EMAIL PROTECTED]> >>>Sent: Wednesday, May 07, 2003 9:21 PM >>>Subject: Re: [java-list] Pergunta for Dummies >>> >>> >>>Correção, Passagem de Parametro em Java é somente por Valor!!!!! >>>----- Original Message ----- >>>From: Ricardo Jun Taniguchi <[EMAIL PROTECTED]> >>>To: <[EMAIL PROTECTED]> >>>Sent: Friday, May 02, 2003 5:36 PM >>>Subject: RE: [java-list] Pergunta for Dummies >>> >>> >>>Lembrando-se de que os parâmetros são passados por referência em Java, >>> >>> >>temos >> >> >>>que: >>> >>>new Boolean(true) à esquerda = objeto A instanciado com o parâmetro >>> >>> >true; > > >>>new Boolean(true) à direita = objeto B instanciado com o parâmetro true; >>> >>>Como a comparação == é feita por meio da verificação dos endereços dos >>>objetos e não pelo seu conteudo, naturalmente essa comparação daria >>> >>> >false. > > >>>Agora, se quiser que seja true, temos que fazer: >>> >>>if (new Boolean(true).equals(new Boolean(true))) >>> >>> >>>-----Original Message----- >>>From: Nelson [mailto:[EMAIL PROTECTED] >>>Sent: Tue 29-Apr-03 16:35 >>>To: SouJava >>>Cc: >>>Subject: [java-list] Pergunta for Dummies >>>Alguém pode me dizer, porque o código abaixo, imprime "false" ? >>> >>>class teste { >>> >>>public static void main(String[] args) { >>> >>>if (new Boolean(true) == new Boolean(true)) { >>> System.out.println("true"); >>> } else { >>> System.out.println("false"); >>> } >>> } >>>} >>> >>> >>> >>> >>> >>> >>> >>-------------------------------------------------------------------------- >>-- >> >> >>>---- >>> >>> >>>------------------------------ 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 >>>historico: http://www.mail-archive.com/java-list%40soujava.org.br >>>para sair da lista: envie email para >>> >>> >[EMAIL PROTECTED] > > >>------------------------------------------------------------------------- >> >> >>>------------------------------ 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 >>>historico: http://www.mail-archive.com/java-list%40soujava.org.br >>>para sair da lista: envie email para >>> >>> >[EMAIL PROTECTED] > > >>------------------------------------------------------------------------- >> >> >>> >>> >>------------------------------ 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 >>historico: http://www.mail-archive.com/java-list%40soujava.org.br >>para sair da lista: envie email para [EMAIL PROTECTED] >>------------------------------------------------------------------------- >> >> >> >> > >------------------------------ 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 >historico: http://www.mail-archive.com/java-list%40soujava.org.br >para sair da lista: envie email para [EMAIL PROTECTED] >------------------------------------------------------------------------- > > > >------------------------------ 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 >historico: http://www.mail-archive.com/java-list%40soujava.org.br >para sair da lista: envie email para [EMAIL PROTECTED] >------------------------------------------------------------------------- > > >um exemplo simples de que a passagem de parametros não é sempre por valor é a passagem de um array...
o que se passa é uma referência...
Ex.:
//-----------------------------------------------------
public class Teste
{
public static void setArray ( double dArray[] )
{
dArray[0] = 10;
dArray[1] = 20;
}
public static void main ( String[] args )
{
double dArrayOriginal[] = {0,0};
System.out.println ( "Array antes da passagem de parâmetro:" );
System.out.println ( dArrayOriginal[0] + " | " + dArrayOriginal[1] );
setArray ( dArrayOriginal );
System.out.println ( "Array depois da passagem de parâmetro:" );
System.out.println ( dArrayOriginal[0] + " | " + dArrayOriginal[1] );
}
}
//-----------------------------------------------------
[]'s
Fabio Eduardo Thomaz
Rodrigo escreveu:
Bem, até onde sei a Classe String não pode ser alterada, logo quando vc fizer o += ele irá instanciar uma nova String, logo a referência não será mais a mesma. O exemplo que me deste não mudou minha opinião... Ainda acredito que quando a passagem for de objetos será por referência e não por valor... Se criar uma classe e passá-la como parametro e dentro deste método, eu alterar algum valor da mesma isso refletirá no meu objeto... Veja exemplo: public class Teste01 { private int numero; public Teste01(int i) { setNumero( i ); } public void setNumero( int i ) { numero = i; } public int getNumero() { return numero; } } public class Teste { public static void main(String[] args) { Teste01 t = new Teste01(10); xxx( t ); System.out.println( t.getNumero() ); } private static void xxx( Teste01 i ) { i.setNumero( 15 ); } } Veja, passei um objeto como parâmetro e ao setar o valor modificou o estado do meu objeto... Quanto ao que você disse de o append estar alterando uma propriedade interna da classe... Bem, meus objetos são feitos de propriedades e métodos, e se eu criasse dois objetos StringBuffer diferentes e passase um deles como parâmetro alteraria apenas daquele objeto... Logo, referência... ----- Original Message ----- From: "Alexandro Strack" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Wednesday, May 14, 2003 6:57 PM Subject: Re: [java-list] Pergunta for Dummies Oi Rodrigo, Não concordo com você. O que acontece na verdade é que a classe StringBuffer é mutável (diferente de String que é não mutável) e logo o que se passa é que o método append está alterando o valor de uma propriedade(variável) interna da classe StringBuffer. Essa propriedade armazena o valor. Para você ter a certeza do que estou falando mude de StringBuffer para String e substitua o append por += . Você verá que imprimirá JAVA. Para ir mais além mude todo o seu exemplo para trabalhar não com um StringBuffer mas com um Integer. Verá que também não funcionará pois a classe Integer é não mutável. Em resumo: a passagem de parâmetro é sempre por valor. Um abraço, Alexandro Strack ----- Original Message ----- From: "Rodrigo" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Saturday, May 10, 2003 7:16 PM Subject: Re: [java-list] Pergunta for Dummieshehehe, o exemplo não foi, agora sim: --- public class Teste { public static void main(String[] args) { StringBuffer s = new StringBuffer( " Java" ); teste( s ); System.out.println( s ); } public static void teste( StringBuffer s ) { s.append( " é bala" ); } } ---- A saída será "Java é bala" o q no meu ver significa que a passagem foi por referência já que alterei o meu objeto que passei por parâmetro... Fallow ----- Original Message ----- From: "Rodrigo" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Saturday, May 10, 2003 7:14 PM Subject: Re: [java-list] Pergunta for DummiesEu sou suspeito a falar, mas pelo que sei toda a passagem de objetos emjavaé por referência, já as passagens de tipos básicos serão sempre porvalor...Desculpe-me se estiver errado... Segue um exemplo: ----- Original Message ----- From: "José Voss Junior" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Wednesday, May 07, 2003 9:21 PM Subject: Re: [java-list] Pergunta for Dummies Correção, Passagem de Parametro em Java é somente por Valor!!!!! ----- Original Message ----- From: Ricardo Jun Taniguchi <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Friday, May 02, 2003 5:36 PM Subject: RE: [java-list] Pergunta for Dummies Lembrando-se de que os parâmetros são passados por referência em Java,temosque: new Boolean(true) à esquerda = objeto A instanciado com o parâmetrotrue;new Boolean(true) à direita = objeto B instanciado com o parâmetro true; Como a comparação == é feita por meio da verificação dos endereços dos objetos e não pelo seu conteudo, naturalmente essa comparação dariafalse.Agora, se quiser que seja true, temos que fazer: if (new Boolean(true).equals(new Boolean(true))) -----Original Message----- From: Nelson [mailto:[EMAIL PROTECTED]] Sent: Tue 29-Apr-03 16:35 To: SouJava Cc: Subject: [java-list] Pergunta for Dummies Alguém pode me dizer, porque o código abaixo, imprime "false" ? class teste { public static void main(String[] args) { if (new Boolean(true) == new Boolean(true)) { System.out.println("true"); } else { System.out.println("false"); } } }-------------------------------------------------------------------------- ------ ------------------------------ LISTASOUJAVA ----------------------------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 historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para[EMAIL PROTECTED]------------------------------------------------------------------------------------------------------- LISTASOUJAVA ----------------------------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 historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para[EMAIL PROTECTED]------------------------------------------------------------------------------------------------------- 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 historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] ------------------------------------------------------------------------------------------------------- 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 historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] ------------------------------------------------------------------------- ------------------------------ 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 historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -------------------------------------------------------------------------
------------------------------ 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 historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -------------------------------------------------------------------------