CodeGym /Java Blog /Random-IT /Autoboxing e Unboxing in Java
John Squirrels
Livello 41
San Francisco

Autoboxing e Unboxing in Java

Pubblicato nel gruppo Random-IT
In Java, una caratteristica delle primitive e dei loro wrapper è l'autoboxing/unboxing. Approfondiamo questo concetto. Come abbiamo già imparato, Java è un linguaggio orientato agli oggetti. Ciò significa che tutti i programmi scritti in Java sono costituiti da oggetti. I primitivi non sono oggetti. Ma anche così, a una variabile wrapper può essere assegnato un valore primitivo. Questo processo è chiamato autoboxing. Allo stesso modo, a una variabile primitiva può essere assegnato un oggetto wrapper. Questo processo è chiamato unboxing. Per esempio:

public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // Unboxing
       y = x * 123; // Autoboxing
   }
}
Nella riga 5 assegniamo y, che è un oggetto intero , alla primitiva x . Come puoi vedere, non dobbiamo fare alcun passo aggiuntivo: il compilatore sa che int e Integer sono, essenzialmente, la stessa cosa. Questo è l'unboxing. Qualcosa di simile sta accadendo con l'autoboxing alla riga 6: il valore primitivo (x * 123) viene facilmente assegnato all'oggetto y . Questo è un esempio di autoboxing. Ecco perché il termine include la parola "auto": perché non devi fare nulla di speciale per assegnare le primitive ai corrispondenti oggetti wrapper (e viceversa). Tutto avviene automaticamente. Comodo, eh? :) Vediamo un altro esempio della comodità dell'autoboxing/unboxing quando si lavora con i metodi. Questo perché anche gli argomenti del metodo sono autoboxed e unboxed. Ad esempio, se un metodo accetta due oggetti Integer come input, possiamo facilmente passare invece gli int ordinari !

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);
   }
}
Produzione:
You entered the number 7
Funziona anche nella direzione opposta:

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);
   }
}
Un punto importante che devi ricordare è questo: l'autoboxing e l'unboxing non funzionano per gli array!

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));
   }
}
Il tentativo di passare un array di primitive a un metodo che accetta un array di oggetti risulterà in un errore di compilazione. In conclusione, confrontiamo ancora una volta brevemente le primitive e i wrapper.

Primitivi:

  • Avere vantaggi in termini di prestazioni
Involucri:
  • Permettici di non violare il principio "tutto è un oggetto", il che significa che numeri, caratteri e valori booleani non violano questo concetto
  • Espandi le possibilità di lavorare con questi valori fornendo metodi e campi convenienti
  • Sono necessari quando un metodo funziona solo con oggetti
Per rafforzare ciò che hai imparato, ti suggeriamo di guardare una lezione video dal nostro corso Java
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION