Para que ficar discutindo, basta ir direto a fonte.

Retirado do java tutotial:

Pass by Value
In Java methods, arguments are passed by value. When invoked, the method receives the value of the variable passed in. When the argument is of primitive type, pass-by-value means that the method cannot change its value. When the argument is of reference type, pass-by-value means that the method cannot change the object reference, but can invoke the object's methods and modify the accessible variables within the object.
This is often the source of confusion--a programmer writes a method that attempts to modify the value of one its arguments and the method doesn't work as expected. Let's look at such method and then investigate how to change it so that it does what the programmer originally intended.
Consider this series of Java statements which attempts to retrieve the current color of a Pen object in a graphics application:
. . .
int r = -1, g = -1, b = -1;
pen.getRGBColor(r, g, b);
System.out.println("red = " + r +
                   ", green = " + g +
                   ", blue = " + b);
. . .
At the time when the getRGBColor method is called, the variables r, g, and b all have the value -1. The caller is expecting the getRGBColor method to pass back the red, green and blue values of the current color in the r, g, and b variables.
However, the Java runtime passes the variables' values (-1) into the getRGBColor method; not a reference to the r, g, and b variables. So you could visualize the call to getRGBColor like this: getRGBColor(-1, -1, -1).
When control passes into the getRGBColor method, the arguments come into scope (get allocated) and are initialized to the value passed into the method:
class Pen {
    int redValue, greenValue, blueValue;
    void getRGBColor(int red, int green, int blue) {
        // red, green, and blue have been created
        // and their values are -1
        . . .
    }
}
So getRGBColor gets access to the values of r, g, and b in the caller through its arguments red, green, and blue, respectively. The method gets its own copy of the values to use within the scope of the method. Any changes made to those local copies are not reflected in the original variables from the caller.
Now, let's look at the implementation of getRGBColor within the Pen class that the method signature above implies:
class Pen {
    int redValue, greenValue, blueValue;
    . . .
        // this method does not work as intended
    void getRGBColor(int red, int green, int blue) {
        red = redValue;
        green = greenValue;
        blue = blueValue;
    }
}
This method will not work as intended. When control gets to the println statement in the following code, which was shown previously, getRGBColor's arguments, red, green, and blue, no longer exist. Therefore the assignments made to them within the method had no effect; r, g, and b are all still equal to -1.
. . .
int r = -1, g = -1, b = -1;
pen.getRGBColor(r, g, b);
System.out.println("red = " + r +
                   ", green = " + g +
                   ", blue = " + b);
. . .
Passing variables by value affords the programmer some safety: Methods cannot unintentionally modify a variable that is outside of its scope. However, you often want a method to be able to modify one or more of its arguments. The getRGBColor method is a case in point. The caller wants the method to return three values through its arguments. However, the method cannot modify its arguments, and, furthermore, a method can only return one value through its return value. So, how can a method return more than one value, or have an effect (modify some value) outside of its scope?
For a method to modify an argument, it must be of a reference type such as an object or array. Objects and arrays are also passed by value, but the value of an object is a reference. So the effect is that arguments of reference types are passed in by reference. Hence the name. A reference to an object is the address of the object in memory. Now, the argument in the method is referring to the same memory location as the caller.
Let's rewrite the getRGBColor method so that it actually does what you want. First, you must introduce a new type of object, RGBColor, that can hold the red, green and blue values of a color in RGB space:
class RGBColor {
    public int red, green, blue;
}
Now, we can rewrite getRGBColor so that it accepts an RGBColor object as an argument. The getRGBColor method returns the current color of the pen by setting the red, green and blue member variables of its RGBColor argument:
class Pen {
    int redValue, greenValue, blueValue;
    void getRGBColor(RGBColor aColor) {
        aColor.red = redValue;
        aColor.green = greenValue;
        aColor.blue = blueValue;
    }
}
And finally, let's rewrite the calling sequence:
. . .
RGBColor penColor = new RGBColor();
pen.getRGBColor(penColor);
System.out.println("red = " + penColor.red +
                   ", green = " + penColor.green +
                   ", blue = " + penColor.blue);
. . .
The modifications made to the RGBColor object within the getRGBColor method affect the object created in the calling sequence because the names penColor (in the calling sequence) and aColor (in the getRGBColor method) refer to the same object.


At 16:57 21/5/2003 -0300, you wrote:
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] 
-------------------------------------------------------------------------

 

Responder a