Não exatamente. Você tirou uma frase para fora do
contexto. A passagem das propriedades e dos métodos é feita por referência, mas
mudar o parâmetro para outra referência não afeta o objeto
original.
...
public void metodo1 ( Object o1 )
{
o1 = qualquerCoisa;
}
não produz efeito algum. Mas:
public void metodo1 ( Object o1 )
{
o1.propriedade1 =
qualquerCoisa;
}
altera o valor da propriedade. E
public void metodo1 ( Object o1 )
{
o1.metodo2();
}
executa o método de o1, que pode por sua vez
alterar dados do próprio objeto. Mas a instância do objeto continua sendo a
mesma. O que muda são os valores de propriedades do mesmo.
----- Original Message -----
Sent: Thursday, November 07, 2002 7:56
AM
Subject: Re: [java-list] Duvida sobre
atribuicao de objetos...
Na verdade, a passagem de obejetos é por referência. Dê
uma olhada no texto que você mesmo tirou do site da sun. Lá diz:
"..., <b>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. </b>"
> Continuo afirmando que a passagem
de parâmetros é por valor. O trecho abaixo é tirado do Java Tutorial da SUN
(http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html): >
> 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. > >
--- > Jonatan Schroeder > [EMAIL PROTECTED] > >
> ----- Original Message ----- > From:
Carlos Eduardo Carvalho > To: [EMAIL PROTECTED]
> Sent: Tuesday, November 05, 2002 8:29
AM > Subject: Re: [java-list] Duvida sobre atribuicao de
objetos... > > > Jonatan, >
> Essa é uma afirmação perigosa de ser feita. Não sei se a
passagem de parâmetros em Java seria exatamente por valor, ao invés de por
referência. Nesse mesmo exemplo que você citou na mensagem abaixo, pode ser
simulada uma situação onde fica clara essa contradição. >
> Vamos supor que tenhamos dois métodos, executar() e
metodoAtribuicao(), como seguem abaixo. > > public
void executar() { > MeuBean a = new
MeuBean(); > MeuBean b = new
MeuBean(); > >
a.setNome("Teste Atribuicao"); >
> metodoAtribuicao(a, b); >
> System.out.println("Bean A:
"+a.getNome()); // A impressão na console
da > System.out.println("Bean B:
"+b.getNome()); // aplicação terá o mesmo valor > } >
> public void metodoAtribuicao(MeuBean a, MeuBean b)
{ >
b.setNome(a.getNome()); > } > > A
partir desta justificativa creio que seja mais correto dizer que a passagem de
parâmetros de objetos em métodos seja por referência, enquanto que a passagem
de parâmetros de tipos básicos do java em métodos seja por valor. É uma
questão meio confusa de se afirmar, mas se estiver errado,
corrijam-me! > > Falou! > >
Carlos Eduardo Teixeira Carvalho > Analista de Sistemas -
Fábrica de Software > Unitech Tecnologia de
Informação > > ----- Original Message
----- > From: Jonatan Schroeder
> To: [EMAIL PROTECTED] ; Sr.
Apocalipse > Sent: Monday, November 04, 2002
7:09 PM > Subject: Re: [java-list] Duvida sobre
atribuicao de objetos... > > > A
passagem de parâmetros em java é por valor, e não por referência. Então,
> > public void metodo_atribuicao(Object
a, Object b) { > a =
b; > } > >
não tem efeito algum. O objeto 'a' é passado ao método, mas quando você faz a
atribuição, você está fazendo com que o parâmetro a seja alterado, ou seja,
ele deixa de apontar para o local em que foi definido na chamada do método e
passa a apontar para o local do objeto b. >
> --- > Jonatan
Schroeder > [EMAIL PROTECTED] > >
> ----- Original Message -----
> From: Sr. Apocalipse
> To: [EMAIL PROTECTED] ; [EMAIL PROTECTED]
> Sent: Monday, November 04, 2002
2:22 PM > Subject: [java-list]
Duvida sobre atribuicao de objetos... > >
>
Galera, > Eu gostaria que alguém me
esclarecesse o seguinte ocorrido. >
Eu queria fazer uma atribuicao de dois objetos dentro de um metodo e
nao > consegui, quando retorna do
metodo a atribuicao é desfeita. Fora do metodo
a > atribuicao ocorre e um "aponta"
para o outro. > O exemplo está
abaixo: > > public void
teste(){ >
> Object a,
b; > > a =
new Vector(); > b
= new Date(); >
>
metodo_atribuicao(a,
b); > // Apos o
metodo_atribuicao, o objeto a nao esta "apontando" para
o > objeto
b > // ou seja, o objeto
a continua como Vector e o objeto b como Date. >
> a =
b; > // Agora sim o
objeto a "aponta" para o objeto
b > // ou seja, o objeto
a agora é Date e o objeto b tambem >
} > > public void
metodo_atribuicao(Object a, Object b)
{ > a =
b; > } >
>
_______________________________________________________________________ >
Yahoo! GeoCities > Tudo para criar o
seu site: ferramentas fáceis de usar, espaço de sobra e
acessórios. > http://br.geocities.yahoo.com/ >
> ------------------------------
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]
>
------------------------------------------------------------------------- >
________________________________________________________ Paulo
"gangrel-br" R. C. Siqueira Programador e Fanático por Jogos :) Mogi das
Cruzes -
SP
__________________________________________________________________________ Encontre
sempre uma linha desocupada com o Discador BOL! http://sac.bol.com.br/discador.html Ainda
não tem AcessoBOL? Assine já! http://sac.bol.com.br
------------------------------
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]
-------------------------------------------------------------------------
|