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”.
publicclassFuncionario{publicStringnome;publicdoublesalario;}publicclassEmpresa{publicStringnome;publicStringcnpj;Funcionario[]funcionarios=newFuncionario[5];Funcionariof=newFuncionario();//Alternativa encontrada}publicclassPrograma{publicstaticvoidmain(String[]args){Empresaempresa=newEmpresa();empresa.nome="Empresa x ";empresa.cnpj="CNPF X";for(inti=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}}}}
Na verdade, vc não precisa de outra referência ao objeto.
Quando vc criou:
Funcionario[]funcionarios=newFuncionario[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(inti=0;i<empresa.funcionarios.length;i++){empresa.funcionarios[i]=newFuncionario();empresa.funcionarios[i].nome="Fulano";System.out.println("Nome do funcionario "+i+": "+empresa.funcionarios[i].nome);}
Entendido?
marcoacsilva2 likes
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)
igomes1 like
"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
claytonsilva2 likes
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.Carmo1 like
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!!!