Dúvida - Criação de vários objetos

Oi pessoal, tudo bem? Eu criei uma ArrayList de pessoas para adicionar cada objeto que eu criava, porém eu fiz isto usando apenas uma variável da classe Pessoa. O programa funciona, só que não teria que dar pau? Eu não estou sobrescrevendo a referencia para o objeto?? Para falar bem a verdade minha dúvida é saber como isto funciona rsrs

[code]public static void main(String[] args) {

	// Declaracao de variaveis
	ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
	String menu;
	int opcao;

	Scanner entrada = new Scanner(System.in);
	menu = "\n 1.Inserir";
	menu += "\n 2.Consultar";
	menu += "\n 3.Excluir";
	menu += "\n\n Entre com a sua opção: ";

	do {

		System.out.println(menu);

		opcao = entrada.nextInt();
		Pessoa p = new Pessoa();

		switch (opcao) {
		case 1: // inserir

			System.out.println(p.getPrimeiroNome());

			System.out.print("Nome: ");
			p.setPrimeiroNome(entrada.next());

			p.inserir(p.getPrimeiroNome());

			pessoas.add(p);
			
			break;

		case 2:

			for (Pessoa pes : pessoas) {
				System.out.println(pes.getPrimeiroNome());

			} //restante do código[/code]

Oi!

É claro que não, você está dando um new a cada iteração do seu laço de repetição, ou seja, cria uma nova instancia, referência ao objeto.
Eis uma forma de sobrescrever a referência:

[code]List listPessoas = new ArrayList();
// supoe que a lista já esteja preenchida
Pessoa pessoa = listPessoas.get(0);
pessoa = new Pessoa();

Pessoa p = listPessoas.get(0);[/code]

Quando você deu o get na sua lista, você pegou o objeto dela, a referência.
Se você executar qualquer modificação nesse objeto dentro do mesmo método, mesmo contexto, a objeto contido em sua lista sofrerá todas as modificações executadas na referência dela. Ela tem a referência ao Objeto, entende?

No caso, se Pessoa estivesse preenchido na posição 0, nome, endereço por exemplos, quando você fizesse o get novamente, conforme demonstrei, mesmo sem adicionar o objeto a lista novamente por referência ele sofreu modificação. Nesse caso, recebeu inclusive uma nova referência e a antiga será descartada, como se você tivesse “limpado o objeto”.

Do modo como apresentou, para cada iteração é criado um novo objeto, portanto, não há sobrescrita.
Conseguiu entender?

Abraços.

Java não grava referências , grava valores.
Um parâmetro sempre é passado por valor,
então quando vc deposita na lista uma variavel,
os valores dela são depositados e ela pode
ser reutilizada.

Não dá pau.

Bom, na verdade a cada interação do seu do{}while vc está criando uma nova instancia da classe Pessoa, a referencia a variável p deixa de existir ao final da interação, mas, como vc adiciona ela ao arraylist a jvm não vai descartar ela, dai vem uma nova interação e vc cria outra instancia diferente que nada tem a ver com a instancia da interação anterior. É como se numa linguagem que usa ponteiros vc alocasse uma nova posição de memória para p a cada interação do do{}while, sacou?

Só para demonstração caso eu não tenha sido claro:

[code]List listPessoas = new ArrayList();
Pessoa pessoa = listPessoas.get(0);
System.out.println("Nome: " + pessoa.getNome());
// Imprimiu “José”

pessoa.setNome(“Joaquim”);

Pessoa p = listPessoas.get(0);
System.out.println("Nome: " + p.getNome());
// Imprimiu “Joaquim”
p = new Pessoa();

Pessoa p1 = listPessoas.get(0);
System.out.println("Nome: " + p1.getNome());
// Imprimiu null[/code]

Espero ter sido claro com o código.

Pessoal,estou surpreso com a agilidade e qualidade das respostas.
Muito obrigado!

Com as explicações acima consegui compreender o conceito.

Abraço a todos!