Pessoal, eis uma dúvida sobre encaixotamento(boxing)

3 respostas
diegohsi

/*Pessoal, eis uma dúvida sobre encaixotamento(boxing). De acordo com o que li, uma classe Wrapper é inalterável.
* Pois bem, segue o meu código abaixo que aceita uma valor normalmente sem ocorrer erro de compilação e nem de execução.
* Por que??????
* Sei que o java 5 desempacota e empacota automaticamente, mas não consigo compreender o que esta ocorrendo.
*/

public class AutoBoxingTeste {
	Integer i1 = new Integer(1);
	Integer i2 = new Integer(2);
	
	void testeAutoBoxing() {
		i1 = i2 + 7;
		System.out.println("Por que aceirou i1 = i2 + 7 se objetos Wrappers são imutáveis?");
	}
	
	public static void main(String[] args) {
		AutoBoxingTeste a = new AutoBoxingTeste();
		a.testeAutoBoxing();
	}
}

3 Respostas

ViniGodoy

O que ele fez foi isso aqui:

i1 = new Integer(i2.getValue() + 7);

Note que se você inserir um System.out.println(i2) na linha 7, ele continuará imprimindo 2. Portanto, o valor de i2 não foi alterado.

O valor de i1 foi alterado, mas o que mudou não foi o wrapper que o continha, mas sim, foi criado um novo wrapper e apenas a referência de i1 trocou de lugar. Para testar isso:

void testeAutoBoxing() {  
   Integer teste = i1; //teste e i1 apontam para o mesmo lugar
   i1 = i2 + 7;   //Cria o novo e faz i1 apontar para o novo
   System.out.println(teste); //Note que o valor de teste não mudou

   System.out.println("Por que aceirou i1 = i2 + 7 se objetos Wrappers são imutáveis?");  
}
diegohsi

Hmm certo, na verdade ele cria uma nova referencia para a mesma variável ? no caso i1 ?

robsonsm

Classes Wrapper são imutáveis, mas as variaveis de referencia não.

Criado 28 de julho de 2010
Ultima resposta 28 de jul. de 2010
Respostas 3
Participantes 3