3
respostas

Instanciando objetos com a mesma referencia

Com esse bloco de codigo está intanciando objetos sempre com a mesma referencia?

for (int i = 0; i < 5; i++) {
        Funcionario f = new Funcionario();
        f.salario = 1000 + i * 100;
        empresa.adiciona(f);
    }
3 respostas

No Java o NEW é o instanciador. NEW trata de reservar memória o suficiente para o objeto e criar automaticamente uma referência a ele.

Então nesse caso toda vez que você faz um

Funcionario f = new Funcionario();

A instância do objeto muda. Você pode verificar isso fazendo um sysout no Funcionario F. Irá acontecer algo tipo assim no seu console:

Funcionario@30e79eb3

Funcionario@366412da

Funcionario@6411c21b

Funcionario@49deadf0

Entretanto se você mudar um pouco o código e colocar a instancia do funcionário para fora do laço.

   Funcionario f =  new Funcionario();

    for (int i = 0; i < 5; i++) {

          f.setSalario(1000 + i * 100);
           System.out.println(f);
    }

Verá que o resultado do sysout será algo assim:

Funcionario@30e79eb3

Funcionario@30e79eb3

Funcionario@30e79eb3

Funcionario@30e79eb3

Ou seja, só uma instância.

Espero ter ajudado.

Muito obrigado :)

Minha pergunta era se é o mesmo objeto? Dentro do laco esta instanciando em cada iteracao um objeto do tipo Funcionario mas sempre com a mesma referencia.

Então, não é o mesmo objeto. NEW trata de reservar memória o suficiente para o objeto e criar automaticamente uma referência a ele.

Toda vez que você instância o funcionário F está criando um outro objeto na memorial com uma nova referencia.

Ao fazer esse procedimento por trás o Java está apontando (uso de ponteiros) para outro espaço de memória.

Você pode validar esse funcionamento com o seguinte exemplo :

ArrayList<Funcionario> funcs = new ArrayList<Funcionario>();

        for (int i = 0; i < 5; i++) {
            Funcionario f =  new Funcionario();

            f.setSalario(1000 + i * 100);

            funcs.add(f);
        }

        for (Funcionario funcionario : funcs) {

            System.out.println(funcionario.getSalario());

        }

Nele para cada NEW ou seja, objeto novo. Adicionei dentro de uma ArrayList e em seguida mostrei o conteúdo do ArrayList com os funcionários dentro deles e seus respectivos salários.

Se fosse o mesmo objeto iria sempre mudar o valor do salário para o último. Mas como são objetos diferentes os valores são diferentes para cada Funcionário F.

Resultado do SysOut fica:

1000 1100 1200 1300 1400

Espero que tenha ficado claro agora.

Muito Obrigado :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software