Int X Integer

a pessoal para q serve a class wrapper e qual a diferença:

int x = 5;
Integer x = 20;

e sobre o autoboxing, boxing… qual sua função… to lendo a kathy mais conseguir entender a diferença entre isso… olhei no deitel tb… eles nao foi claro… se alguem puder dar esse help ai agradeço…

É 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!

As classes wrapper serverm para empacotar tipos de dados primitivos (int, short, char… ) em objetos (Integer, Short, Character…) para que possam ser usados em estruturas de dados que só se aplicam em objetos. E.g.: voce não pode usar um Vector, um ArrayList ou uma Stack para armazenar valores int ou char, voce deve usar Integer, ou Character.
As funcionalidades do autoboxing e autounboxing permitem que voce supostamente grave um int numa destas estruturas, e o java converte para Integer, na hora de ler o java converte denovo o Integer em int.

exemplo:

java.util.Stack<Integer> pilha = new Stack();
int a = 10;
pilha.push(a);

ps:que eu me lembre o autoboxing e autounboxing so existem depois do j2se5

Espero ter ajudado mais que atrapalhado…
Rodrigo,

kra, eu sei q nao fui q abri o topico, mas obrigadão ai vei, esclareceu bastante tb sobre as classes wrappers

eu tava vendo aqui em casa eu consigo fazer autoboxing, tipo um Integer receber um int, mas na facul q o java é a versao 4 eu tenho q usar cast

brigadao ai cara pela explicação

boa explicacao da galea ai valeu, agora percebi a diferença ente int X Integer. valeu mesmo…

Parabens Otima explicação .

Explicação muito fodah vlws!

Cara, que explicação. Muito bom, muito bom.

quando é interessante usar tipos primitivos ao inves de seus respectivos objetos ? performance ?