ArrayList de objeto sobrepondo todas posições ao .add

2 respostas
V

a cada objeto adicionado com o método add, acontece que o ultimo objeto adicionado está sendo adicionado em todas as posições anteriores

Main

public static void main(String[] args) {

    List<Pessoa> psR = new ArrayList<Pessoa>();
    Pessoa ps = new Pessoa();
    Scanner in = new Scanner(System.in);
    int cont = 0;
    do {
        System.out.print("nome: ");
        ps.setNome(in.nextLine());
        System.out.print("idade: ");
        ps.setIdade(Integer.parseInt(in.nextLine()));
        psR.add(ps);
        System.out.println(psR);
        System.out.print("cont? ");
        cont = Integer.parseInt(in.nextLine());

    } while (cont != 0);
     
}

classe Pessoa

public class Pessoa {
    private String nome;
    private int idade;

    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public int getIdade() {
        return idade;
    }
    public void setIdade(int idade) {
        this.idade = idade;
    }
    @Override
    public String toString() {
        return "Pessoa{" + "nome=" + nome + ", idade=" + idade + '}';
    }
}

Console

nome: viny
idade: 18
[Pessoa{nome=viny, idade=18}]
cont? 1
nome: joao
idade: 19
[Pessoa{nome=joao, idade=19}, Pessoa{nome=joao, idade=19}]
cont? 1
nome: vitor
idade: 28
[Pessoa{nome=vitor, idade=28}, Pessoa{nome=vitor, idade=28}, Pessoa{nome=vitor, idade=28}]
cont?

ja testei com String e funciona normalmente, apenas usando um classe objeto que esse problema ocorre

2 Respostas

Francisco_Chaves

A referencia ao objeto Pessoa está sendo a mesma, assim quando você adicionar na lista está adicionado o mesmo objeto. Com a String funcionar, por causa que a cada modificação na String é criado uma nova referencia a outro objeto, como se tivesse utilizado o new para instanciar.

Exemplo:

//Um objeto
String nome = "Francisco";
//outro objeto
nome = "Francisco Chaves";

Desta forma funcionar:

Main

public static void main(String[] args) {
	 List<Pessoa> psR = new ArrayList<Pessoa>();
	    
	    Scanner in = new Scanner(System.in);
	    int cont = 0;
	    do {
	    	Pessoa ps = new Pessoa();
	        System.out.print("nome: ");
	        ps.setNome(in.nextLine());
	        System.out.print("idade: ");
	        ps.setIdade(Integer.parseInt(in.nextLine()));
	        psR.add(ps);
	        System.out.println(psR.toString());
	        System.out.print("cont? ");
	        cont = Integer.parseInt(in.nextLine());

	    } while (cont != 0);
	     
}
V

entendi o problema, obrigado, deu certo aqui.

Criado 29 de janeiro de 2017
Ultima resposta 29 de jan. de 2017
Respostas 2
Participantes 2