1. Los 8 Tipos Primitivos en Memoria
Java no guarda objetos para todo. Los primitivos son valores matemáticos directos almacenados en la pila de ejecución, sin sobrecarga de punteros. Se dividen en enteros, punto flotante, carácter y booleano.
Ideal para buffers de red o streaming de archivos donde el consumo de RAM debe ser mínimo.
2. Casting de Tipos: Ensanchamiento vs Truncado
Cuando un tipo pequeño se asigna a uno más grande (Widening), la conversión es automática y segura. Pero al forzar un tipo mayor en uno menor (Narrowing), Java descarta los bits superiores sin avisar, produciendo desbordamientos.
El bit más significativo es 1, indicando un número negativo en complemento a dos (-128 + 2 = -126).
3. La Trampa de la División Entera y el Módulo (%)
En Java, operar entre enteros siempre da un entero. Si hacés 5 / 2, el resultado es 2, no 2.5: la parte decimal se desecha. El operador módulo (%) rescata el residuo de la división.
¡Cuidado con promedios! Si sumás 3 enteros y dividís por 3, perderás los decimales salvo que dividas por 3.0.
4. Evaluación de Cortocircuito (&& y ||)
Los operadores && y || no evalúan el segundo operando si el primero ya determina el resultado global. Esto previene catástrofes como NullPointerException o divisiones por cero.
Al ser el primer operando falso en un &&, Java no evalúa la derecha. Si usaras el operador simple &, Java evaluaría la derecha y lanzaría NullPointerException.
5. Inmutabilidad y Constantes con final
La palabra clave final impide que una variable sea reasignada una vez inicializada. Para verdaderas constantes universales, se combina con static y se nombra en UPPER_SNAKE_CASE.
Buenas Prácticas de Tipos en Java
- Elegir int por defecto: Para números enteros, int es el tipo nativo óptimo en CPU; usar long solo para IDs o marcas de tiempo gigantes.
- Cuidado con Narrowing: Hacer cast manual descarta bits superiores silenciosamente en complemento a dos.
- Divisiones exactas: Si querés decimales, asegurá que al menos un operando tenga .0 o cast a double.
- Siempre && y ||: Usar operadores de cortocircuito para proteger llamadas sobre variables que podrían ser null.