Java.... passagem de parâmetro por referência ou valor?

Vários programadores, experiêntes em outras linguagems, questionam-me sobre como funciona a passagem de parâmetros no Java.

Quando de trata de passagem de Objetos como parâmetros, o mais importante a se lembrar é que não está passando nem mesmo a variável de referência real, mas em vez disso, uma cópia dos bits dessa variável, portanto quando pasar uma variável de referência, estará passando uma cópia dos bits que representam como um objeto específico pode ser acessado. Ou seja, você está passando uma cópia do ponteiro.

Pra entender oque escrevi acima, pense que quando você está passando um objeto como parâmetro você está usando passagem de parâmetros por referência, afinal este é o efeito/comportamento, isto quer dizer que uma alteração no parâmetro dentro do método afetará a variável original.


Quando uma variável primitiva é passada para um método, ela é passada por valor, o que signfica: "passar por cópia dos bits de variável".

Para entender isto, pense que quando trabalhamos com uma variável primitiva, e passamos ela como parâmetro, essa passagem é feita por valor. Isto quer dizer que quando alteramos ela dentro de um método, esta alteração não se reflete na variável original.

Abaixo segue um código para exemplificar o conceito.



package com.gms.valoroureferencia;
import java.awt.Dimension;
public class Teste {
public static void main(String[] args) {
objeto();
primitivo();
}

public static void objeto(){
System.out.println("TESTE DE PASSAGEM DE
PARAMETROS COM OBJETOS");
Dimension dimension = new Dimension(5, 10);
System.out.println("antes d = " + dimension.height);
modify(dimension);
System.out.println("depois d = " + dimension.height);
}

public static void modify(Dimension dim) {
dim.height = dim.height + 2;
System.out.println("dim = " + dim.height);
}

public static void primitivo(){
System.out.println("\nTESTE DE PASSAGEM DE
PARAMETROS COM TIPOS PRIMITIVOS");
int inteiro = 10;
System.out.println("antes inteiro = " + inteiro);
modify(inteiro);
System.out.println("depois inteiro = " + inteiro);
}

public static void modify(int i){
i = i +2;
System.out.println("i = " + i);
}
}

4 comentários:

Neves disse...

Resumindo, o Java não possui passagem por referência para primitivos?

Joao Bellotti disse...

Parâmetros em java são passados apenas por valor, não existe passagem por referência em java, seus conceitos estão errados sobre referência. Dê uma olhada por aí..

Calazans disse...
Este comentário foi removido pelo autor.
Calazans disse...

David Flanagan diz em seu livro Java o Guia Essencial - O'Reilly

Terminologia passar por Valor
"Java é uma linguagem que passa "por valor", entretanto, quando um tipo por referência é envolvido, o valor que é passado é uma referência. Mas isso ainda não é a mesma coisa que passar por referência, se Java fosse uma linguagem de passar por referência, quando um tipo por referência fosse passado para um método, ele seria passado como uma referência à uma referência."

Obs: "var" do Object Pascal, "ref" do C#