Tenho uma classe Main e outra Professor. Na main tenho um switch dentro do método main e através dele chamo outros métodos da classe Main. Mas a cada vez que faço um cadastro novo de professor o array que está na classe professor fica só com esse último professor, repetindo ele. Tipo assim:
public void cadastrarProfessor(EstruturaProfessor dados)
{
System.out.println("ENTROU");
professores.addElement(dados);
System.out.println(this); //Imprime os dados do professor corrente
imprimir();
}
public void imprimir()
{
for (int k = 0 ; k < professores.size(); k++)
{
EstruturaProfessor obj = (EstruturaProfessor)professores.get(k);
System.out.printf("IMPRIMIR--> Nome: %s\n", obj.nome);
}
}
} //fim classe Professor
public class CursoTeste {
public static void main(String[] args) {
Scanner leOpcao = new Scanner(System.in);
int opcao = 1;
CursoTeste ct = new CursoTeste();
while (opcao != 0)
{
System.out.println("1. Cadastrar Professor");
System.out.println("0. Sair");
System.out.println("Digite a opcao desejada: ");
opcao = leOpcao.nextInt();
switch (opcao)
{
case 1:
ct.cadastraProf();
break;
}
}
}//fim método main
EstruturaProfessor ep = new EstruturaProfessor();
Professor objProf = new Professor(" ", 0 , " ", " ", " ");
String nomeExcluir;
// Método cadastra professor - CASE 1
public void cadastraProf()
{
Scanner scanProf = new Scanner(System.in);
System.out.println("Digite o nome do professor: ");
objProf.setNome(scanProf.nextLine());
ep.nome = objProf.getNome();
System.out.println("Digite o registro universitário do professor: ");
objProf.setRU(scanProf.nextLine());
ep.ru = objProf.getRU();
objProf.cadastrarProfessor(ep);
}// fim método cadastraProf
} //fim classe CursoTeste[/code]
BOM, SE ALGUÉM PUDER ME AJUDAR, TÁ FEIO O NEGÓCIO AQUI… JÁ TENTEI DE TUDO E TENHO CERTEZA QUE É BOBEIRA…
Hum, você não declarou alguma coisa como “static” sem precisar?
Não estou dizendo no código que você postou, mas no resto do seu código, que você não postou
Cada vez que você cadastra um novo professor, é necessário criar um novo objeto Professor.
Como você só criou um objeto, o mesmo professor será cadastrado N vezes ao ser adicionado à lista.
Acho que é só isso.
Onde é que você cria um novo objeto Professor é que vou deixar para você quebrar um pouco a cabeça.
Eu coloquei a instanciação do objeto objProf dentro do próprio método cadastraProf() e agora parece que toda vez que cadastro um novo professor fica somente ele no vetor professores.
Ao que parece no primeiro momento você está utilizando sempre o mesmo professor (instancia), com isso você sempre alterava os atributos da mesma instancia, então no array aparecia sempre o ultimo que vc cadastrou (que na verdade é a mesma instancia de sempre).
Depois você tentou instanciar um novo professor para cada cadastro (que é o correto), porém com esta modelagem atual isto não é permitido. Isso acontece porque cada entidade professor carrega seu proprio array de professores, por isso toda vez que você cria uma nova instancia e adiciona ela mesma para o array você está perdendo o array anterior, que estava na instancia anterior.
Para resolver este problema voce precisa colocar o array de professores fora da classe Professor, com isso voce pode instanciar quantos professores quiser e adicionar neste array, e eles estarão lá. Sugiro que este array fique na classe CursoTeste.
Faça o teste.
Espero ter ajudado, se eu não fui claro é só falar.
Valeu mesmo pelo tempo disponibilizado com minha dúvida…
Miguel, é isso mesmo… Criei direto na classe CursoTeste e deu certo… É que eu queria deixar na classe Professor toda a parte de implementação, por isso pensei daquele jeito…
// Aqui declaramos uma lista de professores cadastrados
// Assim ele terá um escopo para toda a vida deste objeto
private static List<Professor> professores;
// Usamos o mesmo Scanner para todo o objeto:
private static Scanner in;
// Ambos são static por que só atributos static
// podem ser usados por métodos static
// este é um bloco static, tudo aqui será executado
// quando esta classe for criada
public static void main(String[] args)
{
// Aqui criamos a lista fisicamente.
professores = new ArrayList<Professor>();
// E instanciamos o leitor
in = new Scanner(System.in);
int opcao = 1;
while (opcao != 0)
{
System.out.println("1. Cadastrar Professor");
System.out.println("2. Listar Professores");
System.out.println("0. Sair");
System.out.println("Digite a opcao desejada: ");
// Usamos o Leitor aqui
// Lembre-se, in é static para poder ser usado de fora deste método
opcao = in.nextInt();
// um pequeno hack pra ele pegar os dados certos
in.nextLine();
switch (opcao)
{
case 1:
// cadastraProf também é static pelo mesmo motivo.
cadastraProf();
break;
case 2:
// O proprio ArrayList tem seu método toString que
// itera por todos os objetos chamando seus toStrings
// mais uma formatação especial.
System.out.println(professores);
break;
}
}
}
public static void cadastraProf()
{
System.out.println("Digite o nome do professor: ");
// Pegamos o nome e colocamos numa variavel local.
// Usamos o mesmo Leitor novamente aqui
// já que o escopo dele é para todo o objeto, podemos usar
// em qualquer lugar neste objeto. Simples né?
String nome = in.nextLine();
System.out.println("Digite a data de aniversário do professor: ");
// O mesmo com seu aniversario
// e por último o mesmo leitor novamente.
String aniv = in.nextLine();
// Agora vamos por partes.
// Declaramos o professor
Professor prof;
// Instanciamos o professor usando new.
// Sempre um novo objeto usa new (MUITO IMPORTANTE).
// Ao mesmo tempo passamos seus dados para o construtor.
prof = new Professor(nome, aniv);
// por fim colocamos o professor na lista de professores:
professores.add(prof);
// E pronto, professor cadastrado!
// Por último fazemos o extra de imprimir o professor que
// acabamos de colocar
// Mas como, o professor não está dentro da lista?
// Sim, mas a referencia para ele continua a existir neste escopo
// prof é uma variável local para este método.
// E segundo, como ele imprimiu? Não chamei nada!
// o método toString é executado automaticamente
// para converter para o tipo necessário que println
// recebe, uma String
System.out.println(prof);
}