Ir ao conteúdo

Posts recomendados

Postado

Olá! Estou tendo um problema bem chato na hora de tentar executar um código que pede nome, matrícula e 4 notas de um aluno e armazena em uma posição de um array do objeto 'Aluno' que criei. Segue o código da parte do erro:

 

for (int i = 0; i < 5; i++) {
    System.out.println("Qual o nome do aluno?");
    a.setNome(s.next());
    System.out.println("Qual o número de matrícula?");
    a.setMatricula(s.next());
    for (int j = 0; j < 4; j++) {
        System.out.println("Qual a nota " + (j + 1) + " do aluno?");
        notas[j] = s.nextInt();
    }
    a.setNotas(notas);
    alunos[i] = a;
} 

 

Nessa parte do código uso a variável 'a' do tipo 'Aluno' para armazenar as informações do um aluno para depois armazenar em um array do tipo 'Aluno' na posição 'i' que será incrementada a cada iteração, porém, todas as posições de 'alunos[]' acabam por receber apenas as informações do último aluno. Agradeço a quem puder me ajudar.

 

Uso o Java 8

Postado

Isso é um pouco complexo de entender, mas vou tentar explicar ...
quando você faz assim:

//Cria a lista
List<SomeObject> list = new ArrayList<SomeObject>();
//Cria um objeto e atribui um valor
SomeObject a = new SomeObject();
a.setAttribute("any value");
//adiciona o objeto na lista
list.set(0,a);
//Altera o valor do objeto
a.setAttribute("newValue")
//Vai apresentar 'newValue'
System.out.println(a.getAttribute);
//tb apresenta 'newValue', pois o objeto que foi incluído na lista ainda continua sendo o mesmo
System.out.println(list.get(0).getAttribute);

quando um objeto é criado no Java, ele separa um endereço de memória para esse objeto... esse endereço é 'linkado' com a variável que você usou ... no meu exemplo o objeto a, aponta para o endereço de memória criado com a instrução new SomeObject() ... Assim, se eu colocar esse valor numa lista, a lista só faz é linkar ao mesmo espaço de memória((Pra quem estudou linguagem C, passagem de parâmetros por referência) , o que é diferente de copiar o valor para outro local (passagem de parâmetros por valor) ...
Assim, toda vez que você for incluir um novo valor, você necessita dar um new SomeObject() para esse objeto a ... assim você desvincula aquele endereço e utiliza um endereço novo ... não sei se isso ficou claro, mas entenda, quando você não dá esse new, tanto o objeto na lista/vetor qto o objeto da variável são os mesmos

  • Curtir 1
Postado

@psykotico Entendi, então nesse caso uma maneira de corrigir isso seria "re-instânciando" o objeto 'a' a cada iteração 'for'? E precisa ser um 'ArrayList', não pode ser um array? Obrigado pela ajuda.

Postado
30 minutos atrás, Yuri Jorge disse:

Entendi, então nesse caso uma maneira de corrigir isso seria "re-instânciando" o objeto 'a' a cada iteração 'for'?

Sim, a cada passo você deveria "reinstância-lo" ...
 

31 minutos atrás, Yuri Jorge disse:

E precisa ser um 'ArrayList', não pode ser um array?

Não, pode ser um array ... usei um List apenas para demonstrar ... costume meu :) ...

  • Curtir 1
Postado

@psykotico Muito obrigado! Ótima explicação, vou testar agr.

adicionado 15 minutos depois

@psykotico Rodou certinho agr, só tive que "re-instânciar" o array também, mas por fim não teria conseguido sem a sua ajuda, valeu!

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!