Senhres, 

  Resolvi dar meu testemunho nessa questão visando
  contribuir para o seu esclarecimento, 
  visto que a mesma já povoou essa lista por diversas 
  vezes.
  Meu objetivo não é tomar partido e sim 
  participar - espero com sucesso.
  Aqueles que discordarem por favor não se sintam
  ofendidos, pois como já coloquei acima, estou apenas
  dando meu testemunho.
  O que será exposto abaixo
  já foi empregado em vários projetos com sucesso.

  Em java a passagem de objetos como parametros
  ocorre por referência. Seria muito pesado o 
  processamento de replicar objetos que são compostos
  de outros objetos que por sua vez podem ser 
  compostos por outros e assim sucessivamente.
  (Fato que ocorre muito em nossos projetos)

  AGORA!!! Existem objetos que
  devido a sua arquitetura interna não permitem
  que seu valor seja alterado. Fazem parte
  desses objetos: String, Integer, Long, ...
  por exemplo.
  Após instanciarmos uma String não mais poderemos
  mudar seu valor. String não tem método setValue() 
  ou setText() ou coisa parecida em sua lista de
  métodos.

  No código java abaixo:

    String a;
    a = "Hello World";

  O código que o compilador realmente gera é
  
   a = new String("Hello World");

  Entao , em a= "Hello World"
  não estamos alterando o valor da
  String , estamos instanciando uma nova String com
  um novo valor.

  Essa particularidade desses objetos "especiais" 
  foram nessárias por questões de performance.

  Quando precisarmos de uma String que tenha seu
  conteúdo real alterado, devemos usar a classe
  StringBuffer que permite alterações de 
  conteúdo com uma infinidade de métodos em sua
  iterface para fazer tal ação.

  Então, o caso particular STRING 
  ( Como também algumas poucas outras ) não pode
  ser usado como exemplo de como Java passa
  objetos como parametros. Pois, procedendo
  assim estamos usando
  casos particulares para serem a regra natural.

  Apenas para ilustar o que foi dito acima 
  façam testes com um objeto do tipo Date por
  exemplo.

  Código do Exemplo:

  import java.util.*;
import javax.swing.*;

public class PassagemParametro  {

    public PassagemParametro() {


    }

    public static void main(String[] args) {
        String s = "Hello";
        System.out.println(s + " - Valor inicial de
s.");
        tentaAlterarString(s);
        System.out.println(s + " - Oh! não consegui
alterar s.");

        Date d = new Date(0);
        System.out.println(d + " - Valor inicial de
d.");
        alteraData(d);
        System.out.println(d + " - CONSEGUI!!!!
Alterei d.");
    }

    public static String tentaAlterarString(String s)
{
        s = "Alo";
        return s;
    }

    public static Date alteraData(Date d) {
        d.setTime(100000000);
        return d;
    }
}
  

Atenciosamente,


Hélio

 --- Adriano Andrulis <[EMAIL PROTECTED]> escreveu:
> Pior é que ele não tá. Mesmo em objetos, são
> passadas cópias das referências
> aos objetos. O que é permitido é usar a copia para
> alterar atributos do
> objeto ou executar seus métodos.
> Se por acaso voce alterar o valor da variavel do
> metodo local, a variavel
> original continua com o mesmo valor.
> 
> Da uma olhada no seguinte código:
> 
> public class Copia {
>     public String teste;
>     public Copia(String str) {
>          teste = str;
>      }
> }
> 
> public class TestaCopia {
>     public static void main(String[] args) {
>         Copia cp = new Copia("x") ;
>         mudarRef(cp); //se fosse passagem por
> referencia, aqui ele mudaria a
> referencia
>         System.out.println(cp.teste); //se fosse por
> referencia imprimiria
> "y"
>     }
>     public void mudarRef(Copia copia) {
>         copia = new Copia("y");
>     }
> 
> }
> 
> Espero não ter complicado mais.
> 
> Abraços,
> Adriano Andrulis
> 
> 
> ----- Original Message -----
> From: "Henrique Viecili" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Monday, November 11, 2002 3:36 PM
> Subject: RE: [java-list] Duvida sobre atribuicao de
> objetos...
> 
> 
> 
> tah maluco? onde tu leu isso?
> 
> henrique
> 
> On Wed, 6 Nov 2002, Denard Costa Soares wrote:
> 
> > Galera,
> >
> > Em java, não existe passagem por referência, é
> sempre por valor. Sem
> exceção.
> > Tipos primitivos ou não, é por valor.
> >
> > Abraços,
> > Denard C. Soares
> >
>
----------------------------------------------------------------
> > Se você não perde cabeça quando todos ao redor já
> perderem, talvez você
> apenas não esteja entendendo a situação.
> >
>
-----------------------------------------------------------------
> >
> > -----Original Message-----
> > From: Mário Roberto Porto Filho
> [mailto:mario@;cmagnani.com.br]
> > Sent: quarta-feira, 6 de novembro de 2002 13:23
> > To: [EMAIL PROTECTED]
> > Subject: RES: [java-list] Duvida sobre atribuicao
> de objetos...
> >
> > Concordo com o Carlos..........é uma questão
> perigosa e todo mundo sempre
> confunde, é normal até !!!
> > Mas em Java todos os objetos são passados por
> referência ( Para passar o
> valor, deve se utilizar o método clone() de
> java.lang)...
> > Os tipos básicos são passados por valor, mesmo
> vetores de tipos básicos
> passam seu valor e não sua referência !!!....
> > Até mais !!!!
> > -----Mensagem original-----
> > De: Carlos Eduardo Carvalho
> [mailto:carlosetc@;unitech.com.br]
> > Enviada em: terça-feira, 5 de novembro de 2002
> 08:29
> > Para: [EMAIL PROTECTED]
> > Assunto: 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 <mailto:jona.s@;uol.com.br>
> > To: [EMAIL PROTECTED] ; Sr.
> <mailto:sr_apocalipse@;yahoo.com.br>
> 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
> <mailto:sr_apocalipse@;yahoo.com.br>
> > 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;
> 
=== message truncated === 

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

Responder a