É comum ouvirmos dizer que em Java, tudo é objeto, ou melhor, tudo é Object. Mas não é bem assim… Em java, quase tudo é Object. Os tipos de dado em java dividem-se em objetos e tipos primitivos.
Objetos são estruturas de dados que apresentam estado e/ou comportamento. Um classe em java especifica os estados(campos) e comportamentos(métodos) de um objeto.
Um tipo primitivo é apenas um valor armazenado em uma posição de memória. A unica informação que temos a respeito de um valor desses é o seu tipo, que em java pode ser:
:arrow: boolean
:arrow: byte
:arrow: short
:arrow: char
:arrow: int
:arrow: long
:arrow: float
:arrow: double
Um tipo primitivo não é um objeto, não pode ser tratado como objeto. Tanto que em java você, por exemplo, não pode atribuir null a uma referência de um tipo primitivo:
int idade;
idade = null; //Isso aqui não compila... teste
Existem casos em que representamos alguma informação do mundo real através de um tipo primitivo, mas precisamos também utilizar essa informação em “algum lugar” onde seja exigido um objeto, e não um tipo primitivo.
Um exemplo bem básico desta situação: Imagine que queremos ter uma lista que aumente ou diminua de tamanho dinamicamente. Esta lista servirá para armazenarmos números inteiros entrados pelo usuário. Quando o usuário parar de entrar com valores, calcularemos a média dos valores entrados.
A tal da lista dinâmica pode ser um ArrayList:
ArrayList valoresEntrados = new ArrayList();
Depois, teriamos que pegar cada inteiro digitado pelo usuário:
Scanner sc = new Scanner(System.in);
do{
System.out.println();
System.out.print("Entre com um inteiro positivo (inteiro negativo para terminar): ")
int valor = sc.nextInt();
if(valor >= 0){
//...continua...
}
}while(valor >= 0);
E, para cada um destes inteiros, adicioná-los à lista.
do{
...
if(valor >= 0){
valoresEntrados.add(valor);
}
}while(valor >= 0);
Só que aí temos um problema: O método add da classe ArrayList pede por parâmetro um objeto do tipo Object, e estamos passando um valor int. Como vimos antes, int é um tipo primitivo, e um tipo primitivo [/u]não é[u] um objeto. Configura-se aqui então o caso em que queremos ter um dado de um tipo primitivo (valor) e queremos também utilizar este dado em um contexto onde só se aplicam objetos (valoresEntrados.add(Object)).
E agora? Quer dizer então que em Java eu não posso ter um ArrayList que armazene ints? Nem tão pouco um ArrayList de qualquer outro tipo primitivo? Resposta: Isso mesmo! Você não pode ter tal ArrayList… :shock: .
Porém, Java te dá uma saída pra este problema: As classes wrapper.
Em inglês, o verbo “to wrap” quer dizer envolver. É exatamente pra isso que serve uma classe wrapper: Envolver um tipo primitivo. E pra que diabos eu quero “envolver um tipo primitivo”? Simples! Pra poder tratar o seu tipo primitivo como se fosse um objeto!!! É como se a classe wrapper fosse um envelope, dentro do qual você guarda o tipo primitivo.
Em java, temos uma classe wrapper para cada tipo primitivo:
boolean :arrow: java.lang.Boolean
:idea: byte :arrow: java.lang.Byte
:idea: short :arrow: java.lang.Short
:idea: char :arrow: java.lang.Character
:idea: int :arrow: java.lang.Integer
:idea: long :arrow: java.lang.Long
:idea: float :arrow: java.lang.Float
:idea: double :arrow: java.lang.Double
Perceba como essas classes wrapper são úteis no nosso exemplo do “ArrayList de int”: Podemos agora “envolver” o valor em um objeto da classe wrapper Integer, e então adicioná-lo ao nosso valoresEntrados
Scanner sc = new Scanner(System.in);
do{
System.out.println();
System.out.print("Entre com um inteiro positivo (inteiro negativo para terminar): ")
int valor = sc.nextInt();
if(valor >= 0){
Integer wrapper = new Integer(valor);
valoresEntrados(wrapper);
}
}while(valor >= 0);
Basicamente, é pra isso que serve as classes wrapper.
Tenho um compromisso agora, e por isso não terei tempo de falar sobre autoboxing agora, mas, em linhas gerais, o autoboxing é a capacidade do Java5 de, automaticamente, entvolver um tipo primitivo em um respectivo objeto wrapper, conforme ele dectar tal necessidade.
Espero ter ajudado!