publicstaticvoidmain(String[]args){List<Repetition>l=newArrayList<Repetition>();Repetitiona=newRepetition();a.teste="teste";l.add(a);a=null;for(Repetitionf:l){System.out.println(f.teste);// imprime teste porque? não deveria dar Nullpointer exception?}}
1° Ele imprime “teste” por que voce colocou o objeto dentro da lista, e lá dentro ele guarda a referencia, e voce colocando =null voce só mudou a referencia desse lugar, mas mesmo depois do add se voce tivesse usado a mesma referencia para mudar o resultado seria diferente.
2° É impossivel voce estar fazendo isso.
Repetitiona=newRepetition();a="x";
Esses objetos não são do mesmo tipo, não ia nem compilar.
marcelo.bellissimo
Cara, que classe Repetition é essa? O segundo trecho nem deveria compilar…
adriano_si
Cara… posta a tua classe Repetition… isso ta muito estranho e acho que a resposta esta la…
D
Dota
Eu troquei la em cima eu fiz errado, estou fazendo testes aqui, a classe é so pra entendimento mesmo.
D
Dota
Marky.Vasconcelos:
1° Ele imprime “teste” por que voce colocou o objeto dentro da lista, e lá dentro ele guarda a referencia, e voce colocando =null voce só mudou a referencia desse lugar, mas mesmo depois do add se voce tivesse usado a mesma referencia para mudar o resultado seria diferente.
Não entendi isso
D
Dota
A lista guarda a referencia do meu objeto Repetition contido em “a” ok, mas quando eu faço a=null, não tem mais referencia nenhuma.
No outro exemplo quando eu faço a.teste receber um outro valor, como na lista é o mesmo objeto tb e trocado isso eu entendi.
eltonads
Você está confundindo cara…
Uma referência é um ponteiro. A lista não guarda o objeto, guarda a referência, um ponteiro… a localização do objeto na memória.
A sua variável “a” guarda a mesma referência… Ao adicionar o objeto na lista, a lista agora tem um apontador pro objeto, que tem o mesmo valor da variável “a”.
Quando você removeu a referência de “a”, você não removeu a referência da lista, portanto, ela ainda aponta pro objeto na memória.
Algo assim… =)
D
Dota
eltonads:
Você está confundindo cara...
Uma referência é um ponteiro. A lista não guarda o objeto, guarda a referência, um ponteiro... a localização do objeto na memória.
A sua variável "a" guarda a mesma referência... Ao adicionar o objeto na lista, a lista agora tem um apontador pro objeto, que tem o mesmo valor da variável "a".
Quando você removeu a referência de "a", você não removeu a referência da lista, portanto, ela ainda aponta pro objeto na memória.
Algo assim... =)
Opa agora entendi então seria mesma coisa de fazer:
Repetition a = new Repetition();
Repetition b = a;
Onde se a = null, b ainda continuará referenciando o objeto criado.
Frantic_Avenger
eltonads:
Você está confundindo cara…
Uma referência é um ponteiro. A lista não guarda o objeto, guarda a referência, um ponteiro… a localização do objeto na memória.
A sua variável “a” guarda a mesma referência… Ao adicionar o objeto na lista, a lista agora tem um apontador pro objeto, que tem o mesmo valor da variável “a”.
Quando você removeu a referência de “a”, você não removeu a referência da lista, portanto, ela ainda aponta pro objeto na memória.
Algo assim… =)
O mesmo que eu pensei.
No primeiro caso você faz a apontar para null, porém a List ainda aponta para o objeto que a apontava (logo o GC não irá limpar este objeto). No segundo caso você alterou o valor deste objeto (objeto qual a e list fazem referencia) logo o valor para onde a list se referenciava foi alterado.