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
membri
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
  • Popolari
  • Nuovi
  • Vecchi
Devi avere effettuato l'accesso per lasciare un commento
Questa pagina non ha ancora commenti