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

5 respostas
frooid

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

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

5 Respostas

nel

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:

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

Pessoa p = listPessoas.get(0);

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.

JoaoBluSCBR

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.

A

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?

nel

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

List<Pessoa> listPessoas = new ArrayList<Pessoa>();
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

Espero ter sido claro com o código.

frooid

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!

Criado 26 de agosto de 2011
Ultima resposta 26 de ago. de 2011
Respostas 5
Participantes 4