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]
É 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?
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.
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?