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