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