Objetos

Olha gente:

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

	List<Repetition> l = new ArrayList<Repetition>();
	
	Repetition a = new Repetition();
	
	a.teste = "teste";
	
	l.add(a);
	
	a = null;
	
	for(Repetition f : l){
		
		System.out.println(f.teste); // imprime teste porque? não deveria dar Nullpointer exception?
		
	}
				
}[/code]

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

	List<Repetition> l = new ArrayList<Repetition>();
	
	Repetition a = new Repetition();
	
	a.teste = "teste";
	
	l.add(a);
	
	a.teste = "x";
	
	for(Repetition f : l){
		
		System.out.println(f.teste); // agora imprime x, pq?
		
	}
		
		
}[/code]

Pq quando a referencia foi null ele imprimiu o que foi adicionado anteriormente?

E quando eu alterei o nome imprimiu o nome alterado?

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.

Repetition a = new Repetition();
a = "x";

Esses objetos não são do mesmo tipo, não ia nem compilar.

Cara, que classe Repetition é essa? O segundo trecho nem deveria compilar…

Cara… posta a tua classe Repetition… isso ta muito estranho e acho que a resposta esta la…

Eu troquei la em cima eu fiz errado, estou fazendo testes aqui, a classe é so pra entendimento mesmo.

[quote=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.
[/quote]

Não entendi isso

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.

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… =)

[quote=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… =)[/quote]

Opa agora entendi então seria mesma coisa de fazer:

[code]Repetition a = new Repetition();

Repetition b = a;[/code]

Onde se a = null, b ainda continuará referenciando o objeto criado.

[quote=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… =)[/quote]

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.

Flw

Flw

Exatamente. =)