Por que usar PASSAGEM DE PARAMETROS POR VALOR E (NÃO)POR REFERENCIA?

[b]Amigos,
Estou estudando os fundamentos da linguagem para a certificação SCJP5 e ainda não consigo dominar esses conceitos
de passagem de parametros por valor e nao por referencia. Não sei quando e por que usá-los…
Alguém poderia lançar uma luz?

Valeu![/b] :roll:

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=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/

Pango,
Eu tenho o seguinte código que passa parametros por valor e como vc esclareceu o conteudo da variável não se altera:

package adilson; public class PassagemVariavel{ static int Preco=10; public static void main(String args[]){ System.out.println(Preco); Soma(Preco); System.out.println(Preco); } static void Soma(int Parcela){ Parcela=+20; } }
Ai, eu pergunto, por que usar uma passagem por Valor? Por que eu quero que o valor de minha variavel não se altere
com o processamento do método, né? Quando uso por referencia? Li um livro que dizia não haver passagem por referencia
no Java só por valor…Eu não sei quando usar uma ou quando usar outra…teria por ai um exemplo de passagem por referencia?
Olha , obrigado pelas respostas…
:lol:

[b]rmendes08,

Obrigado pelo artigo, estou lendo…valeu![/b] :smiley:

[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.

Um exemplo de passagem por referência

public class Aluno{

public String nome;

public static void main(String args[]){

Aluno aluno = new Aluno();
aluno.nome = "Bruno";

System.out.println(aluno.nome);

alteraNome(aluno);

System.out.println(aluno.nome);

}

public static void alteraNome(Aluno a){

a.nome = "Rafael";

}
}

Quando eu passo o objeto aluno para o método alteraNome eu passo a referência do objeto aluno, então qualquer alteração feita nele é feita no objeto aluno original então você verá que o nome vai alterar

Mais tem uma coisa interessante, olha o exemplo abaixo, altere o método alteraNome


public static void alteraNome(Aluno a){

a = new Aluno();
a.nome = "Rafael";

}

Agora o objeto original não é afetado, porque eu criei um objeto em cima dele, então essa passagem por referência é perdida, e ele trabalha como se fosse passagem por valor

Roda esse exemplo que você vai entender

Valewss

[quote=BRUCE WAYNE]Ai, eu pergunto, por que usar uma passagem por Valor? Por que eu quero que o valor de minha variavel não se altere
com o processamento do método, né? Quando uso por referencia? Li um livro que dizia não haver passagem por referencia
no Java só por valor…Eu não sei quando usar uma ou quando usar outra…teria por ai um exemplo de passagem por referencia?
Olha , obrigado pelas respostas…
:lol: [/quote]

No Java, você não tem como definir se quer passar um parâmetro por valor ou por referência, isto é determinado pela própria linguagem. Já no Visual Basic, por exemplo, isto é possível usando as palavras reservadas ByVal e ByRef.

A vantagem da passagem por valor é que você tem certeza que a sua variável original não será alterada pelo método. Já na passagem por referência, o método pode alterar o seu objeto sem que você saiba, ou até mesmo deixá-lo em um estado inconsistente. Para evitar este tipo de problema, utilize objetos imutáveis sempre que possível. Objetos imutáveis são aqueles que, após a inicialização, não podem ter nenhum de seus atributos alterados, ou sejam, nenhum método publico deles altera nenhum de seus atributos.

Bruno e Pango,
Obrigado pelas respostas…já esclareceram mais que as 500 páginas do meu livro…rs

Valeu!

Jovem,

E um dos itens que sempre cito em minhas aulas da graduação e pós graduação, passagem de parametros por valor ocorrem com primitivos, passagem de valores por referencia ocorrem com objetos.

Abs,

[b]Prof.Kanin,

Obrigado pela dica…

Abraços![/b]

>>>

[b]Wellington,

vc está dizendo que discorda do professor Kanin? isso não é então aplicável a todos os problemas?

Não entendi sua fala poderia esclarecer pra gente?

valeu amigo.[/b] :roll:

Não existe passagem por referência em Java. Só existe passagem por valor.
O valor de um primitivo é o próprio valor dele, enquanto o valor de uma variável de referência (variável de tipos de classes) é o endereço do objeto na memória e não o objeto em si. Por isso algumas pessoas falam, erroneamente, que primitivos são passados por valor e objetos por referência.

No Google você vai achar vários resultados sobre essa discussão, além de aqui no GUJ.

[]'s

OI David,

Entendi.
Obrigado por sua ajuda :lol:

Há uma exceção aqui. Que são as Strings que, por sua característica, têm comportamento similar à de primitivos apesar de ser um objeto.