CodeGym /Blogue Java /Random-PT /Autoboxing e Unboxing em Java
John Squirrels
Nível 41
San Francisco

Autoboxing e Unboxing em Java

Publicado no grupo Random-PT
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
Invólucros:
  • 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
Para reforçar o que você aprendeu, sugerimos que você assista a uma vídeo aula do nosso Curso Java
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION