Java – Parte 1 – Introducción – Datos Primitivos

Bienvenido al mundo de Java, uno de los lenguajes de programación más robustos, seguros y utilizados en el ámbito empresarial a nivel global. En esta sesión, no solo aprenderemos a escribir nuestro primer programa, sino que desentrañaremos cómo Java interactúa con la máquina a nivel arquitectónico.

1.1 La Arquitectura de Java: JDK, JRE y JVM

Para programar en Java como un profesional, es crucial entender su ecosistema. Java no compila directamente a código máquina (código binario específico para un procesador como x86 o ARM), sino que utiliza un enfoque híbrido de dos pasos.

  • El Principio WORA: Write Once, Run Anywhere (Escribe una vez, ejecuta donde sea). Este es el superpoder de Java. Puedes escribir y compilar tu código en Windows, y ese mismo archivo compilado se ejecutará en Linux o macOS sin modificar una sola línea.
  • El Compilador (javac): Transforma nuestro código fuente legible por humanos (archivos .java) en Bytecode (archivos .class). El bytecode es un conjunto de instrucciones optimizadas, pero independientes de la plataforma.
  • JVM (Java Virtual Machine): Es el corazón de Java. Es una máquina virtual que simula ser una computadora real. La JVM toma el bytecode y lo traduce en tiempo real a instrucciones de código máquina nativas del sistema operativo donde se está ejecutando. Esto lo logra en gran parte gracias al JIT Compiler (Just-In-Time), que optimiza las traducciones sobre la marcha para mejorar el rendimiento.
  • JRE (Java Runtime Environment): Es el entorno de ejecución. Contiene la JVM y las bibliotecas estándar de Java (Standard Library) necesarias para ejecutar programas Java. Si solo quieres usar una app hecha en Java, solo necesitas el JRE.
  • JDK (Java Development Kit): Es el kit completo para desarrolladores. Contiene el JRE (para ejecutar), la JVM, y herramientas de desarrollo como el compilador (javac), el empaquetador (jar), y herramientas de depuración (debuggers).

1.2 Instalación y Configuración del Entorno (Variables de Entorno)

Para comenzar a programar, necesitamos instalar el JDK. Recomendamos usar distribuciones libres como Eclipse Temurin (Adoptium) o el OpenJDK estándar.

Instalación en entornos Linux (tipo Red Hat/Fedora/Rocky Linux): Abrimos la terminal y ejecutamos el gestor de paquetes DNF para instalar la versión más reciente del entorno de desarrollo de OpenJDK:

sudo dnf install java-latest-openjdk-devel

Para verificar la instalación, ejecuta java -version y javac -version.

Instalación en Windows y el temido «PATH»:

  1. Descarga el instalador .msi o .exe del JDK desde el sitio oficial de Oracle o Adoptium y sigue el asistente.
  2. Configurar Variables de Entorno: El sistema operativo necesita saber dónde están las herramientas de Java para ejecutarlas desde cualquier consola.
    • Ve a Propiedades del Sistema > Configuración avanzada del sistema > Variables de entorno.
    • Crea una nueva variable de sistema llamada JAVA_HOME y asigna como valor la ruta de instalación (ej: C:\Program Files\Java\jdk-21).
    • Busca la variable Path, dale a Editar, y añade una nueva línea con la ruta: %JAVA_HOME%\bin.

El IDE (Entorno de Desarrollo Integrado): Escribir código en el Bloc de notas es posible, pero ineficiente. Utilizaremos un IDE que nos ofrezca autocompletado, resaltado de sintaxis y depuración. Las opciones líderes son IntelliJ IDEA (Community Edition es gratuita y muy potente), Eclipse o Visual Studio Code (con el Extension Pack for Java).

1.3 Anatomía del Código: Diseccionando el «Hola Mundo»

Vamos a analizar la estructura mínima viable de un programa en Java. Crea un archivo llamado HolaMundo.java

public class HolaMundo {
    public static void main(String[] args) {
        System.out.println("¡Hola, mundo Java!");
    }
}

¿Qué hace cada palabra reservada?

  • public: Es un modificador de acceso. Indica que esta clase es pública y accesible desde otras partes del programa o por la propia JVM para iniciar la ejecución.
  • class: Define que estamos creando una «Clase». En Java, que es un lenguaje puramente Orientado a Objetos, todo código debe existir dentro de una clase.
  • HolaMundo: El identificador (nombre) de la clase. Regla de oro: El nombre de la clase pública debe coincidir exactamente con el nombre del archivo (HolaMundo.java).
  • static: Permite que el método main sea invocado por la JVM sin necesidad de crear (instanciar) un objeto previo de la clase HolaMundo.
  • void: Indica que este método ejecuta una acción pero no «devuelve» ningún dato al finalizar.
  • main: Es el nombre del método. La JVM está programada estrictamente para buscar un método llamado main con esta firma exacta como punto de partida del programa.
  • String[] args: Es un arreglo (array) de cadenas de texto. Permite recibir argumentos desde la línea de comandos cuando ejecutamos el programa.
  • System.out.println(...): Es la instrucción para imprimir texto en la salida estándar (la consola) y añadir un salto de línea al final.

1.4 Variables, Tipos de Datos Primitivos y Gestión de Memoria

Java es un lenguaje de tipado estático y fuerte. Esto significa que toda variable debe ser declarada con un tipo de dato específico en tiempo de compilación, y el compilador es estricto en cuanto a qué valores pueden almacenarse en ella.

La memoria en Java divide la información, pero para los tipos primitivos, los valores se almacenan directamente en una zona de memoria muy rápida llamada Stack (Pila).

Tipos Primitivos (Los 8 fundamentales):

  1. Enteros:
    • byte: 8 bits (-128 a 127). Útil para ahorrar memoria en grandes arreglos.
    • short: 16 bits (-32,768 a 32,767).
    • int: 32 bits (aprox. -2 billones a 2 billones). Es el estándar por defecto.
    • long: 64 bits. Para números masivos. (Requiere sufijo ‘L’, ej: 3000000000L).
  2. Punto Flotante (Decimales):
    • float: 32 bits. Precisión simple (Requiere sufijo ‘f’, ej: 3.14f).
    • double: 64 bits. Precisión doble. Estándar por defecto para decimales.
  3. Caracteres y Booleanos:
    • char: 16 bits. Almacena un solo carácter Unicode (ej: 'A'). Usa comillas simples.
    • boolean: Representa un valor de verdad: true (verdadero) o false (falso).

int edad = 28;
double temperatura = 36.5;
boolean sistemaActivo = true;
char inicial = 'W';

1.5 Operadores y Type Casting (Conversión de Tipos)

Java nos permite operar sobre estas variables. Además de los aritméticos (+, -, *, /, % para el residuo), relacionales (==, !=, >, <) y lógicos (&& AND, || OR, ! NOT), es vital entender el Casting.

Casting Implícito (Ensanchamiento): Sucede automáticamente cuando pasamos un tipo de dato más pequeño a uno más grande, ya que no hay riesgo de pérdida de datos.

int numeroEntero = 100;
double numeroDecimal = numeroEntero; // Automáticamente se convierte a 100.0

Casting Explícito (Estrechamiento): Forzamos la conversión de un tipo grande a uno más pequeño. Debemos indicar explícitamente el tipo entre paréntesis, y hay riesgo de pérdida de precisión.

double pi = 3.14159;
int piEntero = (int) pi; // El valor de piEntero será 3 (se truncan los decimales)