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