En Java, una característica de las primitivas y sus envoltorios es el autoboxing/unboxing. Profundicemos en este concepto. Como ya hemos aprendido, Java es un lenguaje orientado a objetos. Eso significa que todos los programas escritos en Java están hechos de objetos. Los primitivos no son objetos. Pero aun así, a una variable contenedora se le puede asignar un valor primitivo. Este proceso se llama autoboxing. De manera similar, a una variable primitiva se le puede asignar un objeto contenedor. Este proceso se llama unboxing. Por ejemplo:
public class Main {
public static void main(String[] args) {
int x = 7;
Integer y = 111;
x = y; // Unboxing
y = x * 123; // Autoboxing
}
}
En la línea 5, asignamos y, que es un objeto entero , a la primitiva x . Como puede ver, no tenemos que realizar ningún paso adicional: el compilador sabe que int e Integer son, esencialmente, la misma cosa. Eso es unboxing. Algo similar sucede con el autoboxing en la línea 6: el valor primitivo (x * 123) se asigna fácilmente al objeto y . Este es un ejemplo de autoboxing. Es por eso que el término incluye la palabra "auto": porque no tienes que hacer nada especial para asignar primitivas a sus correspondientes objetos contenedores (y viceversa). Todo sucede automáticamente. Conveniente, ¿eh? :) Vemos otro ejemplo de la conveniencia del autoboxing/unboxing cuando se trabaja con métodos. Esto se debe a que los argumentos del método también están autoencuadrados y sin encuadrar. Por ejemplo, si un método toma dos objetos Integer como entradas, ¡podemos pasar fácilmente int s ordinarios en su lugar!
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);
}
}
Producción:
You entered the number 7
También funciona en la otra dirección:
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 que debes recordar es este: ¡el autoboxing y unboxing no funcionan para matrices!
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));
}
}
Intentar pasar una matriz de primitivas a un método que toma una matriz de objetos dará como resultado un error de compilación. En conclusión, comparemos brevemente las primitivas y los contenedores una vez más.
Primitivos:
- Tener ventajas de rendimiento
- Permítanos no violar el principio de "todo es un objeto", lo que significa que los números, caracteres y valores booleanos no violan este concepto.
- Amplíe las posibilidades de trabajar con estos valores proporcionando métodos y campos convenientes.
- Son necesarios cuando un método sólo funciona con objetos.