Ha cara eu acho que entendi onde você está confundindo.
Quando eu faço: empresa.empregados = new Funcionario[10];
, não quer dizer que tenho um array com 10 Funcionarios dentro, quer dizer apenas que tenho 10 espaços disponíveis na memória para adicionar 1 Funcionario em cada posição.
Eu não posso simplesmente fazer:
empresa.funcionarios[0].nome = "Jorge";
porque vai dar nullPointerException.
Eu tenho que para cada posição fazer:
empresa.funcionarios[0] = new Funcionario();
empresa.funcionarios[1] = new Funcionario();
para a partir daí adicionar valores. Se for segui o seu raciocínio, alem de criar os 10 objetos do array eu teria de criar um 11° para ficar atualizando os valores de cada um, além disso você estaria quebrando o conceito de Orientação a Objeto ao criar um funcionário "Mutante" a "Mística" no caso :).
Imagine o seguinte empresa com 3 funcionários, usando a sua abordagem:
Empresa empresa = new Empresa();
empresa.empregados = new Funcionario[3];
Funcionario f = new Funcionario();
f.nome = "Jorge";
empresa.funcionarios[0] = new Funcionario();
empresa.funcionarios[0].nome = f.nome;
f.nome = "Sandro";
empresa.funcionarios[1] = new Funcionario();
empresa.funcionarios[1].nome = f.nome;
f.nome = "João";
empresa.funcionarios[2] = new Funcionario();
empresa.funcionarios[2].nome = f.nome;
nenhuma pessoa pode ser 3, a menos que você seja Deus :). Não tem problema algum nesse código, porém não tem a devida coerência, pois ninguém tem um nome pela manhã, outro a tarde e outro a noite, (algumas até tem :D). Imagina que eu quero dar uma altura pra cada um, eu teria que ir numa linha específica pra dizer a altura de Jorge, em outra pra dizer a altura de Sandro, perceba como isso vai ficando inviável. O mais correto seria fazer:
Funcionario jorge = new Funcionario();
Funcionario sandro = new Funcionario();
Funcionario joao = new Funcionario();
porque cada um tem sua própria identidade, veja que se eu quiser dizer a altura de joão, basta fazer joao.altura = 1.76. Mais uma vez, não ha problema em passar a referência pra seu array, desde que você como programador, garanta a integridade dela.
E em relação ao tamanho do array que você se referiu seja 10, 100, 1000, 10000... não existe mágica você vai ter que criar todos ele e adicionar dentro do array, por isso a sugestão do for:
Empresa empresa = new Empresa();
empresa.empregados = new Funcionario[1000000];
for (int i = 0; i < 1000000; i++) {
Funcionario f = new Funcionario();
empresa.adiciona(f);
}