Problema com preenchimento de array via classe Main
9 respostas
J
joanes
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:
publicclassProfessorextendsAcademico{Vectorprofessores=newVector();...publicvoidcadastrarProfessor(EstruturaProfessordados){System.out.println("ENTROU");professores.addElement(dados);System.out.println(this);//Imprime os dados do professor corrente imprimir();}publicvoidimprimir(){for(intk=0;k<professores.size();k++){EstruturaProfessorobj=(EstruturaProfessor)professores.get(k);System.out.printf("IMPRIMIR--> Nome: %s\n",obj.nome);}}}//fim classe ProfessorpublicclassCursoTeste{publicstaticvoidmain(String[]args){ScannerleOpcao=newScanner(System.in);intopcao=1;CursoTestect=newCursoTeste();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){case1:ct.cadastraProf();break;}}}//fim método mainEstruturaProfessorep=newEstruturaProfessor();ProfessorobjProf=newProfessor(" ",0," "," "," ");StringnomeExcluir;// Método cadastra professor - CASE 1publicvoidcadastraProf(){ScannerscanProf=newScanner(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
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
J
joanes
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í:
Tb pensei que fosse o problema do static, mas não resolveu :-(
T
thingol
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.
J
joanes
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.
Não sei se fiz certo…
FilhoDoRei
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
J
joanes
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…
miguel.horlle
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
J
joanes
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!!!
B
Bruno_Laturner
Vamos por partes com um pouco de Orientação à Objeto:
A classe Professor representa somente 1 professor, não todos.
publicclassProfessor{// Digamos que professor tenha somente nome e data de aniversario.privateStringnome;privateStringaniversario;// Construtor da classe, somente aqui definimos os seus dados.publicProfessor(Stringnome,Stringaniversario){this.nome=nome;this.aniversario=aniversario;}publicStringtoString(){return"Professor "+nome+" - Nasc.: "+aniversario;}}
importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassCurso{// Aqui declaramos uma lista de professores cadastrados// Assim ele terá um escopo para toda a vida deste objetoprivatestaticList<Professor>professores;// Usamos o mesmo Scanner para todo o objeto:privatestaticScannerin;// 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 criadapublicstaticvoidmain(String[]args){// Aqui criamos a lista fisicamente.professores=newArrayList<Professor>();// E instanciamos o leitorin=newScanner(System.in);intopcao=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étodoopcao=in.nextInt();// um pequeno hack pra ele pegar os dados certosin.nextLine();switch(opcao){case1:// cadastraProf também é static pelo mesmo motivo.cadastraProf();break;case2:// 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;}}}publicstaticvoidcadastraProf(){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é?Stringnome=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.Stringaniv=in.nextLine();// Agora vamos por partes.// Declaramos o professorProfessorprof;// Instanciamos o professor usando new.// Sempre um novo objeto usa new (MUITO IMPORTANTE).// Ao mesmo tempo passamos seus dados para o construtor.prof=newProfessor(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 StringSystem.out.println(prof);}}