Dúvida com Array em exercício

E aí pessoal, estou com uma dúvida sobre Array num exercício, já consegui fazer a classe funcionar, porém, não entendi muito bem como que ocorre o processo.

class Funcionario {
	String nome;
	String departamento;
	String rg;
	Data dataDeEntrada;
	//Data dataDeEntrada = new Data();
	double salario;
}

class Empresa {
	String nomeEmpresa;
	Funcionario[] empregados;
	String cnpj;
	
	void adiciona(Funcionario f) {
		//procuraArray:
		for(int i = 0; i < empregados.length; i++) {
			if(empregados[i] == null) {
				this.empregados[i] = f;
				break;
			}
		}
	}
	void mostraEmpregados() {
		for(int i = 0; i<this.empregados.length; i++) {
			System.out.println("Funcionário na posição: " + i);
			System.out.println("Salário do funcionário: "+this.empregados[i].salario);
		}
	}
		
}
public class EmpresaTest {

	public static void main(String[] args) {
		Empresa empresa = new Empresa();
		empresa.empregados = new Funcionario[10];
		
		for(int i = 0; i < empresa.empregados.length; i++) {
			Funcionario f = new Funcionario();
			f.salario = 1000 + i * 100;
			empresa.adiciona(f);
		}
		
		empresa.mostraEmpregados();
		double b = empresa.empregados[7].salario;
		System.out.println(b);
		
	}

}

Na classe EmpresaTest, eu instanciei um novo objeto (empresa), e depois empresa.empregados como uma array com 10 posições, até ai, beleza. Fiz um loop for para preencher as posições da array empresa.empregados, e nesse loop ocorre a instanciação de um novo objeto Funcionario toda vez, e depois de usar o método salario() para definir o salario desse novo Funcionario “f”, utilizo o metodo adiciona() para adicionar o novo Funcionario, porém, não entendi muito bem como ocorre esse processo de instanciar um novo Funcionario no loop:

1ª: Se é criada um objeto “f” toda vez, então terei 10 objetos f?

2ª: Mas como eu consigo acessar o salario, por exemplo, do empresa.empregados[5], sendo que eu não defini a posição em que ele deveria ser posto, e só fiz o loop?

3ª: Por que eu não teria que ter f0, f1, f2, f3, f4… f9 ao invés de 10 "f"s?

Muito obrigado!

  1. Sim;
  2. No seu código, todas as vezes que for adicionar um novo funcionário, a posição de menor índice que ainda estiver null o receberá;
  3. Não entendi a terceira pergunta.

[quote=silasyudi]1. Sim;
2. No seu código, todas as vezes que for adicionar um novo funcionário, a posição de menor índice que ainda estiver null o receberá;
3. Não entendi a terceira pergunta.[/quote]

Por exemplo, na memória eu terei 10 f’s (f, f, f, f, f, f, f, f, f …), como o compilador consegue reconhecer o salário de empresa.empregados[5], mesmo que todos os objetos do tipo funcionário tenha o mesmo nome? Ou não importa o nome, já que o empresa.empregados[] seria uma referência para f ou vice-versa?

  1. Para você acessar o salario neste caso você deveria escreve empresa.empregados[5].salario, visto que o seu array é de funcionários e não de salários e quem tem salário são os objetos do tipo Funcionario.

  2. Quanto você escreve new Funcionario(); vocẽ esta falando para o compilador que a variável f agora referencia para outro local na memoria, ou seja cada vez que você deu new Funcionario() e guardou este valor no array ali foi guardados 10 referencias diferentes por isso o compilador sabe quem é quem quando você faz empresa.empreados[5].salario.

[quote=Cleidiano]1. Para você acessar o salario neste caso você deveria escreve empresa.empregados[5].salario, visto que o seu array é de funcionários e não de salários e quem tem salário são os objetos do tipo Funcionario.

  1. Quanto você escreve new Funcionario(); vocẽ esta falando para o compilador que a variável f agora referencia para outro local na memoria, ou seja cada vez que você deu new Funcionario() e guardou este valor no array ali foi guardados 10 referencias diferentes por isso o compilador sabe quem é quem quando você faz empresa.empreados[5].salario.[/quote]

Em relação ao empresa.empregados[5].salario eu já sabia, só esqueci de colocar ali na pergunta, obrigado mesmo assim :slight_smile:
Então, eu terei 10 objetos na memória, e apenas uma variável para f que referencia para todos esses objetos? Com isso não importa a quantidade de variáveis que faz referência, ex: f0, f1, f2, f3, f4, e essas variáveis referencia para cada posição do array?
Se alguém tiver uma imagem de como estaria a memória com os objetos e as referências de f, para facilitar o entendimento, eu agradeço.

Uma coisa muito importante para você aprender mas que desconfio que muita gente boa não sabe:

Objetos não têm nome, apenas as variáveis têm nome.

E as variáveis apontam (referenciam) objetos, elas não são os objetos.

Portanto, não é necessário ter várias variáveis f0, f1, … f99. Apenas um array f, que referencia 10 objetos (cada um dos objetos não tem um nome).

Então a array f seria uma variável ou um objeto? Vi em algum lugar que a array seria um objeto.
No caso, f referencia uma array empresa.empregados[] que faz referencia a um objeto Funcionario?

Array, em java, é um objeto, f é o nome da variável que contém a referência para o objeto array, cada objeto array pode guardar vários itens, cada item pode ser acessado usando o nome da variável que contém a referência para o objeto array mais o índice entre colchetes (ex: f[0], f[1], f[2], etc), no seu caso, cada item é uma “variável” (observe as aspas) que contém uma referência para um objeto Funcionário, cada referência aponta para um objeto Funcionário diferente, ou seja, cada referência pode ser tratada “como um objeto Funcionário”. Ex: f[0].nome = “Carlos”, etc.