Objetos

10 respostas
D

Olha gente:

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?
			
		}
					
	}
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?
			
		}
			
			
	}

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

E quando eu alterei o nome imprimiu o nome alterado?

10 Respostas

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.

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.

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

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

D

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

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
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.

Flw

Flw

eltonads

Exatamente. =)

Criado 31 de agosto de 2010
Ultima resposta 31 de ago. de 2010
Respostas 10
Participantes 6