Boa tarde amigo, não sei se consegui compreender sua duvida. Você esta com duvidas na implementação do for na seguinte sintaxe for(int x : funcionários) ou com a esta sintaxe for(int i = 0; i < this.livre; i++) ?
Se não me engano você se refere a primeira...
Bom, essa forma de loop chama-se foreach que consiste em realizar a leitura da lista, jogando a cada interação o conteúdo atual para uma variável do mesmo tipo da lista e desta forma, podendo utilizar essa variável.
public class Empresa {
String nome;
int cnpj;
Funcionario[] funcionarios;
int livre = 0;
void adicionar(Funcionario f) {
this.funcionarios[this.livre] = f;
this.livre++;
}
//Acredito que o parâmetro seria um Array de funcionários (como foi declaro mais acima)
void mostraFuncionarios(Funcionario [] funcionarios) {
//Aqui, como você esta interagindo com uma lista de funcionários, a variável tem que ser do tipo Funcionário para poder receber um funcionário da lista a cada loop.
for(Funcionario x : funcionarios) {
//Como o foreach não trabalha explicitamente com índices, o recomentado para você verificar a posição dos funcionários, seria criar uma variável do tipo inteiro para incrementar a cada loop
int aux =0;
System.out.println("Funcionário na posição: " + aux);
//Aqui basta usar a variavel "x" que você escolheu no inicio do for pra receber o objeto da lista, assim tendo acesso a todos os atributos e métodos do funcionário atual
System.out.println("R$" + x.salario);
}
}
}
Não sei se consegui te ajudar, mas, qualquer coisa basta perguntar e se possível especificar em qual parte do código você esta com dificuldade ;)