Referência a objeto

7 respostas
Joabe.Carmo

Boa tarde! Sou iniciante e minha dúvida é a seguinte: Porque tive que criar 2 referências para o mesmo objeto? Num primeiro momento, quando escrevi a linha do “for” consegui acessar acessar o objeto Funcionario pela referencia funcionarios. Mas no segundo momento, quando quis definir os valores dos atributos, eu não pude acessá-lo sem criar uma segunda instância usando a referência “f”.

public class Funcionario {
	public String nome;
	public double salario;
}

public class Empresa {
	public String nome;
	public String cnpj;
	Funcionario[] funcionarios = new Funcionario[5];
	Funcionario f = new Funcionario(); //Alternativa encontrada
}

public class Programa {
	public static void main(String[] args){
		Empresa empresa = new Empresa();
		empresa.nome = "Empresa x ";
		empresa.cnpj = "CNPF X";

                for(int i = 0; i < empresa.funcionarios.length; i ++){
                    if(empresa.funcionarios[i] == null){
                             empresa.funcionarios[i].nome = "x"; //nullPointerException aqui se não tivesse criado a segunda referência para o mesmo objeto.
                             System.out.println(empresa.f.nome = "x"); //Alternativa encontrada
                    }
                }
       }
}

7 Respostas

claytonsilva

Na verdade, vc não precisa de outra referência ao objeto.
Quando vc criou:

Funcionario[] funcionarios = new Funcionario[5];

vc inicializou o seu Array de Funcionários, mas não criou as instâncias de Funcionario dentro dele.
Então, dessa forma, vc terá um Array de tamanho 5 para Funcionario, porém em cada uma dessas posições terá null.

Quando vc faz:

vc não está se referenciando ao objeto Funcionario da posição i do seu array, (ele ainda é um null. por isso a nullpointer). mas sim ao Funcionario f = new Funcionario();

O que vc pode fazer é instanciar o seu objeto da posição i. Ficando o seu FOR dessa forma:

for(int i = 0; i < empresa.funcionarios.length; i ++){
     empresa.funcionarios[i] = new Funcionario();
     empresa.funcionarios[i].nome = "Fulano";
     System.out.println("Nome do funcionario " + i  + ": " + empresa.funcionarios[i].nome);
 }

Entendido?

marcoacsilva

Como o colega de cima disse, você apenas declarou um array do tipo Funcionário com 5 posições se memória alocadas. Entretanto, vc precisa fazer um new em cada posição.

Joabe.Carmo

Acredito que eu esteja fazendo confusão com algo pela pergunta seguinte mas farei pra entender melhor.
Estou entendo sim mas porque eu consigo acessar o array inteiro quando escrevo

empresa.funcionarios.length

mas não consigo acessar as posições do array sem dar um new em cada posição? De qualquer forma eu precisei instanciar o array mais de uma vez. A primeira dentro da classe empresa e as outras dando um new em cada posição do array na linha

empresa.funcionarios[i] = new Funcionario()

Eu não apenas declarei um array eu inicializei ele. Criei um objeto. Quando usamos o “new” não estamos criando um objeto? (Onde estou errado nessas afirmações? rsrs)

igomes

"mas não consigo acessar as posições do array sem dar um new em cada posição? "
Primeiro vc cria as posições, por mais que seja um new, vc está criando somente as posições:
new Funcionario[5] ;
Com isso vc evita um arrayindexofbounds sendo que vc tem de 0 até a 4, ponto.
Sendo assim todas estão null.
"De qualquer forma eu precisei instanciar o array mais de uma vez."
Não vc não precisa instanciar o array mais de uma vez. Isso já está feito na sua classe Empresa.
Depois vc precisa de objetos para popular seu array.
new Funcionario() // é uma coisa
new Funcionario[5] // é outra coisa

claytonsilva

Isso mesmo… vc instanciou ou Array… e não os objetos Funcionario dentro dele. Todos eles são null.
Exatamente como o @igomes diferenciou aí no final da resposta dele.

Joabe.Carmo

Entendi perfeitamente @igomes @claytonsilva @marcoacsilva! Confusão desfeita e dúvida sanada. Muitíssimo obrigado a todos! Quando vierem a Florianópolis, avisem pra gente tomar uma cerveja! kkkkkkk Vlw Demais!!! :slightly_smiling: :+1:

claytonsilva

Tamo junto!:+1:

Criado 7 de março de 2016
Ultima resposta 8 de mar. de 2016
Respostas 7
Participantes 4