Passagem de parâmetro: porque isso acontece? [RESPONDIDO]

3 respostas
peron

Olá companheiros,

Estava aqui estudando e me deparei com um problema que não consigo entender.

public class TesteObjetos {

    protected int numero;

    /**
     *
     */
    public TesteObjetos() {
	numero = 1;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
	TesteObjetos t1 = new TesteObjetos();
	TesteObjetos t2 = new TesteObjetos();
	t1.alteraValor(t1);
	System.out.println(t1.numero); //saida é 2
	t2.trocaReferencia(t2);
	System.out.println(t2.numero); //saida é 1

    }

    public void trocaReferencia(TesteObjetos t) {
	t = new TesteObjetos();
	t.numero = 2;
    }

    public void alteraValor(TesteObjetos t) {
	t.numero = 2;
    }
}

dado o código acima, porque que quando eu dentro do método trocaReferencia troco a referência de t, ele ignora minhas alterações?

Sei que java sempre passa Objetos como referência, portanto, nao deveria referenciar o novo objeto?

Porém o que acontece é que ele simplesmente mantém o 1 objeto…

SUPONHO que isso seja porque o objeto foi criado dentro do método, então seu escopo é só dentro do método e ele se perde quando o metodo termina. é isso?

alguma luz?

grato desde já por qualquer ajuda :slight_smile:

3 Respostas

Rafael_Nunes

É mais ou menos a questão do escopo. Em Java todas as passagens de parâmetro são por valor, inclusive objetos, só que no caso de objetos o que é passado, é uma cópia do valor da referência do objeto.

Nas linhas 16 e 17 você cria dois objetos (A e B)

Na linha 18, está passando uma cópia da refência do objeto A para o método, e quando modifica o valor do atributo número, está trocando o valor do atributo no objeto A, ao qual t1 se referencia.

Na linha 20 você está passando a cópia da referência para o objeto B, porém na linha 26, você cria uma novo objeto © e a referência passa a apontar para este objeto.
Na linha 27 você modifica o valor do atributo, mas do atributo do objeto C. E na linha 21 ao imprimir, está imprimindo o valor do atributo do objeto B

J

Olá amigo!!

1°) Referências não armazenam objetos e sim endereços onde se podem encontrar os objetos referidos.

2°) Ao passar uma referência como parâmetro para um método, o que será passado será o seu valor (o endereço) e não a referência.

Nesse método:

public void trocaReferencia(TesteObjetos t) { t = new TesteObjetos(); t.numero = 2; }

Você só modificou o endereço para o qual a referência t está apontando!! t2 continua apontando para o mesmo endereço!!

Se ainda tiver dúvidas, posta aew!!

Flw!! Espero ter ajudado!!

peron

Entendi perfeitamente!

Muito obrigado pela ajuda.

att.

Criado 28 de setembro de 2006
Ultima resposta 28 de set. de 2006
Respostas 3
Participantes 3