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

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

[code]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();
}

}[/code]

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:

[code]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?”);
} [/code]

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

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