ArrayList sobrescrevendo valores do objeto

Olá, sou iniciante em java e o meu ArrayList está sobrescrevendo os dados do objeto, alguém saberia me dizer o que está acontecendo? segue meu código fonte.

import java.util.ArrayList;

public class Main {
	public static void main(String[] args) {
		ArrayList<Pessoa> listaPessoas = new ArrayList<Pessoa>();
		Pessoa pessoa = new Pessoa();
		pessoa.setNome("João");
		pessoa.setIdade(58);
		listaPessoas.add(pessoa);
		pessoa.setNome("Maria");
		pessoa.setIdade(39);
		listaPessoas.add(pessoa);
		for(int i = 0; i < listaPessoas.size(); i++) {
			System.out.println("Nome "+listaPessoas.get(i).getNome());
			System.out.println("Idade "+listaPessoas.get(i).getIdade());
		}
	}
}

A saída está sobrescrevendo:
Nome Maria
Idade 39
Nome Maria
Idade 39

Não é o ArrayList que está sobrescrevendo, é quando você redefine os valores dos atributos da variável pessoa, por se tratar da mesma referência.
A List (especificamente suas implementações, ArrayList e LinkedList) não são caixas, como se pode imaginar, onde você coloca os objetos. Elas apenas referenciam a posição de memória do objeto inserido em cada posição.
Assim sendo, se você tem isso:

Pessoa pessoa = new Pessoa();
pessoa.setNome("João");
pessoa.setIdade(58);
listaPessoas.add(pessoa);
pessoa.setNome("Maria");
pessoa.setIdade(39);
listaPessoas.add(pessoa);

Você terá a mesma referência em posições diferentes, causando o problema.
Como corrigir?
Para cada nova “pessoa”, crie uma instância nova

pessoa = new Pessoa();
1 curtida

Obrigado darlan_machado, consegui resolver o problema com sua dica :sunglasses:, coisa simples mas para quem está aprendendo é uma dor de cabeça.