ArrayList retornando o mesmo valor

Bom eu estou estudando POO através do java, eu tenho 4 classes

todas private, meu código está funcionando, porém no arraylist toda vez que eu adiciono um novo aluno os valores anteriores do array são substituidos pelo novo valor por exemplo se eu adiciono a aluna Maria e depois o aluno Mario, percorrendo o array o [0] e o [1] são o aluno Mario ao invés de Mario e Maria.

package br.com.teste.repositorio;

import java.util.ArrayList;
import br.com.teste.entidade.Aluno;

public class CadastroAluno {
    public CadastroAluno() {

    }
    public Aluno aluno = new Aluno();
    ArrayList<Aluno> alunos = new ArrayList<Aluno>();

    public void inserirAluno(Aluno aluno, int contador) {
        alunos.add(contador, aluno);
    }

    public void imprimirAlunos() {
        int contador = 0;
        while(contador < alunos.size()) {
            System.out.println("#===================================#");
            System.out.println("Contador: "+ contador);
            System.out.println("# MATRICULA: "+ alunos.get(contador).getMatricula());
            System.out.println("# NOME: "+ alunos.get(contador).getNome());
            System.out.println("# CURSO: "+ alunos.get(contador).getCursoNome());
            System.out.println("# PERIODOS: "+ alunos.get(contador).getCursoPeriodos());
            System.out.println("#===================================#");

            contador += 1;
        }
    }
}

Estou tendando entender porque o valor adicionado anteriormente não está sendo salvo e sim substituído pelo novo.

OBS: Está é a classe que pega os valores da classe Aluno e injeta eles no array.

CÓDIGO SENDO EXECUTADO

#=========================#
*    1- Inserir aluno     *
*  2- Pesquisar pelo nome *
*    3 - Remover aluno    *
*    4- Imprimir todos    *
*         5- Sair         *
#=========================#
Escolha uma opção: 1
Aluno número 1
Digite a matricula: 2019002
Digite o nome do aluno: Maria
Digite o nome do curso: História
Digite a quantidade de periodos: 5
Adicionar outro aluno? s
Aluno número 2
Digite a matricula: 2019003
Digite o nome do aluno: Mario
Digite o nome do curso: ADS
Digite a quantidade de periodos: 5
Adicionar outro aluno? n

#=========================#
*    1- Inserir aluno     *
*  2- Pesquisar pelo nome *
*    3 - Remover aluno    *
*    4- Imprimir todos    *
*         5- Sair         *
#=========================#
Escolha uma opção: 4
#===================================#
# CONTADOR: 0
# MATRICULA: 2019003
# NOME: Mario
# CURSO: ADS
# PERIODOS: 5
#===================================#
#===================================#
#CONTADOR: 1
# MATRICULA: 2019003
# NOME: Mario
# CURSO: ADS
# PERIODOS: 5
#===================================#

#=========================#
*    1- Inserir aluno     *
*  2- Pesquisar pelo nome *
*    3 - Remover aluno    *
*    4- Imprimir todos    *
*         5- Sair         *
#=========================#
Escolha uma opção:

Sem os get o valor retornado é br.com.teste.entidade.Aluno@a3a380.

São vários pontos… Vou colocar em itens.

  • Vc não tem um array, mas sim uma lista.

  • Ao inserir um aluno, vc não precisa passar o índice da lista, basta usar o método add, passando somente o aluno. Me parece que seu problema está aí.

  • Qual a ideia por trás de ter um aluno público e já instanciado?

  • Pq sua lista alunos tem acesso default?

  • Via de regra, a inicialização/instanciação de membros deve ser feita dentro do construtor;

  • Pq vc não usa um for melhorado para imprimir os alunos?

      for ( Aluno a : alunos ) {
          System.out.println("# MATRICULA: "+ a.getMatricula());
      }
    
  • Se vai incrementar o contador em 1, pq não usar contador++?

É uma ativida do curso, o professor passou algumas classes como base para criar o resto do código, então to me virando bastante pois não sei muita coisa de java estudo mais js, provalvemente tem muita gambiarra de pesquisas que fiz, passei horas programando estava cheio de novo então depois com mais calma analisei minha classe principal e vi que faltava o:

register.aluno = new Aluno();

para poder registrar os novos alunos, coloquei no código e deu certo. Porém meu código está bastante grande e confuso…

Você poderia me explicar pq quando eu retorno a variavel alunos, a lista me retorna o nome do pacote?

Pq eu tenho outra função a fazer um metodo que retorna Aluno ele recebe uma String nome ele pesquisa o nome do aluno na lista e tem que retornar esse aluno porém quando eu retorno o alunos o valor é br.com.teste.entidade.Aluno@a3a380

preciso passar o return o aluno, penso que se eu passar o alunos como retorno eu possa usar um if e else na classe principal para definir se aluno existe mostra os dados, se não retorna erro.