Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida relacionada a manipulação de objetos

Tenho o trecho de código abaixo e o resultado que ele dá.

    public static void main(String[] args) {
        Casa casaNula = new Casa();
        Casa casaColorida = new Casa("verde","rua 3");

        casaColorida.changeCasa(casaColorida);

        System.out.println(casaNula.toString());
        System.out.println(casaColorida.toString());
    }
    public class Casa {
        private String  cor;
        private String  endereco;

        public Casa () {}

        public Casa (String cor, String endereco) {
            this.cor = cor;
            this.endereco = endereco;
        }
        public void changeCasa (Casa a) {
            a.setCor("amarela");
            a = new Casa();
        }
        ...
        //Getters e Setters
        ...
    }

Retorno

Cor : null Endereco : null

Cor : amarela Endereco : rua 3

A dúvida que tenho:

Por que quando altero a cor de 'a' no método changeCasa o objeto casaColorida consegue refletir a mudança, mas quando eu atribuo uma nova instância de Casa em 'a' essa alteração não é refletida?

    public void changeCasa (Casa a) {
        a.setCor("amarela");
        a = new Casa();
    }

Gostaria também de saber se isso tem um nome e onde posso encontrar uma aula ou artigo que desenvolva sobre o assunto.

2 respostas
solução!

Boa noite, Hugarty! Como vai?

Seus questionamentos são muito bons e são dúvidas comuns de muitas pessoas que estão começando a adentrar no sertão do Java! Vamos lá para as respostas!

Por que quando altero a cor de 'a' no método changeCasa o objeto casaColorida consegue refletir a mudança, mas quando eu atribuo uma nova instância de Casa em 'a' essa alteração não é refletida?

Essa situação ocorre pois quando vc faz casaColorida.changeCasa(casaColorida) o que ocorre é que vc faz o parâmetro a do método changeCasa() se referir ao mesmo objeto ao qual casaColorida se refere! E, já respondendo a sua segunda pergunta, isso se chama referência! Nos cursos básicos de Java aqui da Alura vc deve encontrar alguma aula que trate sobre esse assunto quando se introduz o conceito de objetos e programação orientada a objeto.

Fazendo uma alegoria pra vc entender melhor o que acontece, imagine que eu sou a variável casaColorida. Quando é feito Casa casaColorida = new Casa("verde","rua 3"), ao fazer new um novo objeto é criado, guardado numa gaveta e eu fico encarregado de ficar de olho nessa gaveta. De modo que sempre que alguém quiser acessar aquele objeto é só pedir pra mim ( a variável casaColorida ), pois eu saberei onde o tal objeto está guardado!

Daí, quando se faz casaColorida.changeCasa(casaColorida) o que ocorre é que vc entra em cena representando o parâmetro a do método changeCasa()! E vc, assim como eu, tbm fica responsável por ficar de olho na mesma gaveta onde é guardado aquele objeto que foi criado na instrução comentada no parágrafo anterior! Sendo assim, quando se faz a.setCor("amarela"), é feito um acesso e alteração no tal objeto guardado na mesma gaveta que estamos de olho.

Por fim, mas não menos importanto, no momento seguinte, quando é feito a = new Casa(), um novo objeto do tipo Casa é criado, guardado numa outra gaveta diferente, vc deixa de olhar para a gaveta que eu tbm estou olhando e passa a olhar para a nova gaveta do objeto recém criado.

Sendo assim, no final das contas, eu estarei olhando para a gaveta a qual sempre olhei e vc estará olhando para uma nova gaveta. Isso até o método changeCasa() terminar de executar, pois nesse momento vc ( o parâmetro a ) deixará de existir.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Perfeito, meu caro professor!