Em Java, um recurso dos primitivos e seus wrappers é o autoboxing/unboxing. Vamos nos aprofundar nesse conceito. Como já aprendemos, Java é uma linguagem orientada a objetos. Isso significa que todos os programas escritos em Java são feitos de objetos. Primitivos não são objetos. Mas mesmo assim, uma variável wrapper pode receber um valor primitivo. Este processo é chamado de autoboxing. Da mesma forma, uma variável primitiva pode receber um objeto wrapper. Este processo é chamado de unboxing. Por exemplo:
public class Main {
public static void main(String[] args) {
int x = 7;
Integer y = 111;
x = y; // Unboxing
y = x * 123; // Autoboxing
}
}
Na linha 5, atribuímos y, que é um objeto Inteiro , ao primitivo x . Como você pode ver, não precisamos realizar nenhuma etapa adicional: o compilador sabe que int e Integer são, essencialmente, a mesma coisa. Isso é desembalar. Algo semelhante está acontecendo com o autoboxing na linha 6: o valor primitivo (x * 123) é facilmente atribuído ao objeto y . Este é um exemplo de autoboxing. É por isso que o termo inclui a palavra "auto": porque você não precisa fazer nada de especial para atribuir primitivas aos seus objetos wrapper correspondentes (e vice-versa). Tudo acontece automaticamente. Conveniente, hein? :) Vemos outro exemplo da conveniência do autoboxing/unboxing ao trabalhar com métodos. Isso ocorre porque os argumentos do método também são autoboxed e unboxed. Por exemplo, se um método recebe dois objetos Integer como entradas, podemos facilmente passar int s comuns!
public class Main {
public static void main(String[] args) {
printNumber(7);// A standard int, not even an int variable
}
public static void printNumber(Integer i) {
System.out.println("You entered the number " + i);
}
}
Saída:
You entered the number 7
Também funciona na outra direção:
public class Main {
public static void main(String[] args) {
printNumber(new Integer(632));
}
public static void printNumber(int i) {
System.out.println("You entered the number " + i);
}
}
Um ponto importante que você precisa lembrar é o seguinte: autoboxing e unboxing não funcionam para arrays!
public class Main {
public static void main(String[] args) {
int[] i = {1,2,3,4,5};
printArray(i);// Error, this won't compile!
}
public static void printArray(Integer[] arr) {
System.out.println(Arrays.toString(arr));
}
}
Tentar passar um array de primitivas para um método que recebe um array de objetos resultará em um erro de compilação. Concluindo, vamos comparar brevemente primitivos e wrappers mais uma vez.
Primitivos:
- Tenha vantagens de desempenho
- Permita-nos não violar o princípio “tudo é um objeto”, o que significa que números, caracteres e valores booleanos não violam este conceito
- Expanda as possibilidades de trabalhar com esses valores fornecendo métodos e campos convenientes
- São necessários quando um método só funciona com objetos
GO TO FULL VERSION