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

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:

É 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

1 curtida

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!!

1 curtida

Entendi perfeitamente!

Muito obrigado pela ajuda.

att.