[quote=rmendes08][quote=pango]Um breve resumo:
No Java, variáveis de tipo primitivo (int, float, boolean, char, etc…) são passadas por valor. Objetos são passados por referência. Mas qual é a diferença entre elas?
Na passagem por valor, o método recebe uma cópia da variável. Logo, independente do que o método faça, é garantido que a variável original não será alterada. Já na passagem por referência, o método recebe, óbvio, uma referência (ou seja, o endereço de memória) para o objeto. Isto quer dizer que, ao alterar qualquer atributo no objeto passado como parâmetro, o objeto original também será alterado.[/quote]
A rigor, Java passa somente por valor. Quando se passa uma variável de referência para um método, este recebe uma cópia da referência. Consequentemente, você acessa o mesmo objeto, mas se você atribuir um novo objeto para a referência, o novo objeto é acessado somente no escopo do método. Tenho um (único) artigo sobre isso:
http://compmakeart.wordpress.com/2011/01/09/java-passa-por-valor-sempre/[/quote]
Cara,
Se você considerar que, na passagem de um objeto como parâmetro, o que o método recebe é na verdade o “valor” do endereço de memória onde está o objeto (ou seja, sua referência), você pode até dizer que Java só tem passagem por valor. Mas eu acho que esta é uma visão meio radical.
Eu entendo que a distinção entre passagem por valor e passagem por referência é se a alteração da variável-parâmetro se reflete ou não na variável original. Por este motivo, considero que uma variável objeto é passada como referência.
Quando você atribui um novo objeto a uma referência, você está na verdade descartando a referência anterior. Mas a referência original (a que está no método chamador) continua apontando para o mesmo lugar de antes.