Problema com preenchimento de array via classe Main

Galera… To com o seguinte problema:

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:

Cadastro 1: Joao
impressão:
nome: Joao

Cadastro 2: Jose
impressão:
nome: Jose
nome: Jose

Cadastro 3: Mateus
impressão:
nome: Mateus
nome: Mateus
nome: Mateus

Aí vai o código:

[code]public class Professor extends Academico {

Vector professores = new Vector();

.
.
.

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…

VALEUUUUUUU

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 :stuck_out_tongue:

Não, antes eu até tava colocando static, mas fica dentro do método main a chamada dos métodos não static como tá alí:

[code]CursoTeste ct = new CursoTeste();

switch (opcao)
{
case 1:
ct.cadastraProf();
break;
} [/code]

Tb pensei que fosse o problema do static, mas não resolveu :frowning:

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.

Thingol,

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. :frowning:

Não sei se fiz certo…

Você poderia utilizar o ArrayList no lugar de Vector, garanto que fazendo isso ja ajuda muito,

Mas antes faça o que o Thingol falou,

Depois vc pode tentar imprimir os objetos do ArrayList utilizando o enhaced for.

falows

Mas num é esse o problema não… Eu já tentei com ArrayList, com Array normal e agora com Vector… Com os 3 dá o mesmo problema…

Cara,

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.

Sorte

Galera,

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…

Brigadão!!!

Vamos por partes com um pouco de Orientação à Objeto:

A classe Professor representa somente 1 professor, não todos.

[code]
public class Professor
{
// Digamos que professor tenha somente nome e data de aniversario.
private String nome;
private String aniversario;

// Construtor da classe, somente aqui definimos os seus dados.
public Professor(String nome, String aniversario)
{
    this.nome = nome;
    this.aniversario = aniversario;
}

public String toString()
{
    return "Professor " + nome + " - Nasc.: " + aniversario;
}

}[/code][code]
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Curso
{

// 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);
}

}[/code]