Imagine o cenário : Você tem duas classes que fazem uso da estrutura aluno( o aluno possui nota e nome), o que seria mais inteligente: Criar dentro em cada uma das duas classes uma classe aluno ou criar uma classe genérica pra aluno e importar nos dois arquivos?
O mais inteligente a se fazer é criar uma classe genérica para funcionar nas duas, além de você escrever só uma vez ao invés de duas, imagine se tivesse que fazer uma modificação na classe aluno e essa classe tivesse nos dois arquivos? Você teria que modificar o arquivo duas vezes ao invés de modificar uma vez só na classe separada.
Resumindo:
Nesse caso, a classe aluno nada mais é que uma estrutura genérica que contem o que o aluno tem: notas e nome . Assim toda vez que eu precisar de um aluno eu já tenho lá a classe pronta, sem eu precisar escrever ela novamente.
Questão de como a classe foi referenciada na classe turma
Perceba a estrutura da classe Turma :
class Turma {
Aluno[] alunos;
void imprimeNotas(){
for(int i = 0; i < this.alunos.length; i++){
Aluno aluno = this.alunos[i];
if (aluno == null) continue;
System.out.println(aluno.nota);
}
}
}
Perceba que dentro da classe a variável alunos nada mais é que um array de tamanho indefinido de aluno, ou seja o valor só vai ser definido na hora que eu inicializar a variável alunos.
Bom sabemos que precisa se inicializar a variável alunos para utilizar ela, e sendo um array eles se inicializam da seguinte forma :
nomeDavariavel = new tipoDaVariavel[10];
ou
tipoDavariavel nomeVetor[] = new tipoDavariavel[10];
ps:no lugar onde ta escrito tipoDaVariavel substitua pelo tipo da variável. Exemplo int, String, char, etc..
Logo quando no código você escreve
Turma fj11 = new Turma();
fj11.alunos = new Aluno[10];
O computador entende como : Crie um objeto do tipo Turma e ponha na variável chamada fj11. Após isso vá e inicialize a variável alunos que é um array e agora o array vai ter um tamanho de 10, ou seja dentro dela vai caber 10 objetos do tipo Aluno.
Mas perceba que também é necessário inicializar esses 10 objetos do tipo aluno e no código já faz isso :
fj11.alunos[0] = new Aluno();
fj11.alunos[0] = new Aluno() quer dizer o seguinte: vá no array alunos e pegue a primeira posição dele(lembrando que a posição dos arrays começam em 0 e não em 1) e inicialize essa posição.
Perceba que isso ocorre com as outras posições :
Inicializando a segunda posição:
fj11.alunos[1] = new Aluno();
Inicializando a terceira posição :
fj11.alunos[2] = new Aluno();
.
Ficou meio extenso mas espero ter ajudado!