☕ ¿Qué es Java?
Java es un lenguaje de programación de propósito general, orientado a objetos y diseñado para ser independiente de la plataforma donde se ejecute. Su filosofía fundacional se resume en el lema «Write Once, Run Anywhere» (WORA): un programa escrito en Java puede ejecutarse en cualquier dispositivo que disponga de una Máquina Virtual de Java (JVM), sin necesidad de recompilarlo.
Desde su lanzamiento público en 1995, Java se ha consolidado como uno de los lenguajes de programación más utilizados del mundo. Se emplea en una enorme variedad de contextos: desde aplicaciones empresariales de gran escala y sistemas bancarios hasta aplicaciones móviles Android, servidores web, sistemas embebidos y plataformas de big data. Según el índice TIOBE, Java se mantiene de forma consistente entre los tres lenguajes más populares a nivel global.
Java es un lenguaje fuertemente tipado, lo que significa que el tipo de cada variable debe declararse explícitamente y el compilador verifica la compatibilidad de tipos antes de la ejecución. Esta característica, junto con su gestión automática de memoria mediante el garbage collector, reduce considerablemente los errores comunes de programación y contribuye a la robustez del código producido.
📜 Historia de Java: de Oak a Oracle
La historia de Java comienza en 1991, cuando un equipo de ingenieros de Sun Microsystems liderado por James Gosling inició el proyecto «Green». El objetivo original no era crear un lenguaje para ordenadores de escritorio, sino desarrollar un lenguaje para dispositivos electrónicos de consumo como televisores inteligentes y electrodomésticos conectados, una visión que se adelantó décadas al concepto actual de Internet de las Cosas (IoT).
El lenguaje se llamó inicialmente Oak (roble), inspirado en un árbol que Gosling veía desde la ventana de su oficina. Sin embargo, al descubrir que ese nombre ya estaba registrado como marca comercial, el equipo lo rebautizó como Java, en referencia a un tipo de café procedente de la isla de Java (Indonesia), bebida que el equipo consumía en grandes cantidades durante el desarrollo.
El verdadero despegue de Java se produjo en 1995, coincidiendo con la explosión de Internet. Sun Microsystems presentó Java al mundo y lanzó el navegador HotJava, capaz de ejecutar applets Java incrustados en páginas web. Poco después, Netscape Navigator integró soporte para applets Java, lo que catapultó su adopción masiva.
| Año | Hito | Versión |
|---|---|---|
| 1991 | Inicio del proyecto Green en Sun Microsystems | — |
| 1995 | Lanzamiento público de Java 1.0 | JDK 1.0 |
| 1998 | Java 2: Swing, Collections Framework | J2SE 1.2 |
| 2004 | Generics, autoboxing, enums, for-each | J2SE 5.0 |
| 2010 | Oracle adquiere Sun Microsystems | — |
| 2014 | Expresiones lambda y Stream API | Java 8 (LTS) |
| 2017 | Nuevo ciclo de releases semestrales | Java 9+ |
| 2018 | Primera LTS del nuevo ciclo | Java 11 (LTS) |
| 2021 | Sealed classes, pattern matching | Java 17 (LTS) |
| 2023 | Virtual threads, record patterns | Java 21 (LTS) |
En 2010, Oracle Corporation adquirió Sun Microsystems por aproximadamente 7.400 millones de dólares. Desde entonces, Oracle gestiona el desarrollo de Java, manteniendo un ciclo de lanzamiento semestral (marzo y septiembre) con versiones LTS cada dos años. La última versión con soporte a largo plazo es Java 21 LTS, lanzada en septiembre de 2023.
⚙️ Características principales de Java
Java fue diseñado desde el principio con un conjunto de características que lo diferencian de otros lenguajes de su generación. Estas propiedades explican su longevidad y su adopción masiva en entornos empresariales:
Orientado a objetos
Todo en Java gira en torno a objetos y clases. Soporta los cuatro pilares de la programación orientada a objetos: encapsulamiento, herencia, polimorfismo y abstracción. A diferencia de lenguajes como C++, Java no permite funciones globales sueltas: todo método debe pertenecer a una clase.
Independiente de la plataforma
El código fuente Java (.java) se compila a bytecode (.class), un formato intermedio que no depende de ningún sistema operativo ni arquitectura de procesador. La JVM instalada en cada plataforma se encarga de interpretar o compilar ese bytecode en instrucciones nativas. Esto permite que el mismo archivo .class se ejecute en Windows, Linux, macOS o cualquier otro sistema que disponga de una JVM.
Robusto y seguro
Java elimina los punteros explícitos (a diferencia de C/C++), gestiona la memoria automáticamente mediante el garbage collector, verifica los tipos en tiempo de compilación, comprueba los límites de los arrays en tiempo de ejecución y dispone de un sistema de excepciones que obliga a manejar los errores de forma explícita. Además, la JVM incluye un verificador de bytecode y un gestor de seguridad que impiden la ejecución de código malicioso.
Multihilo (multithreaded)
Java incluye soporte nativo para la programación concurrente mediante la clase Thread y la interfaz Runnable. Desde Java 21, el lenguaje incorpora además los virtual threads (hilos virtuales), que permiten crear millones de hilos ligeros con un coste mínimo de memoria, revolucionando la programación concurrente en el servidor.
Alto rendimiento
Aunque Java es un lenguaje interpretado por la JVM, las implementaciones modernas utilizan compilación JIT (Just-In-Time) que traduce el bytecode a código nativo durante la ejecución. Esto permite un rendimiento muy cercano al de lenguajes compilados como C++, especialmente en aplicaciones de larga duración donde el JIT tiene tiempo de optimizar las rutas más frecuentes.
| Característica | Descripción | Beneficio práctico |
|---|---|---|
| Orientado a objetos | Todo es una clase; soporta herencia, polimorfismo, encapsulamiento | Código modular y reutilizable |
| Multiplataforma | Bytecode ejecutable en cualquier JVM | Un solo código para todos los SO |
| Robusto | Sin punteros, garbage collector, excepciones obligatorias | Menos bugs en producción |
| Seguro | Verificador de bytecode, sandbox, gestor de seguridad | Protección contra código malicioso |
| Multihilo | Threads nativos y virtual threads (Java 21+) | Aplicaciones concurrentes eficientes |
| Alto rendimiento | Compilación JIT, optimización en tiempo de ejecución | Rendimiento cercano a C++ en servidor |
| Distribuido | Soporte nativo para TCP/IP, HTTP, RMI | Ideal para sistemas en red |
🖥️ La Máquina Virtual de Java (JVM)
La JVM (Java Virtual Machine) es el componente fundamental que hace posible la independencia de plataforma de Java. Se trata de una máquina virtual que actúa como capa intermedia entre el bytecode Java y el hardware real del ordenador. Cada sistema operativo tiene su propia implementación de JVM, pero todas entienden el mismo bytecode.
El proceso completo funciona así: el programador escribe código fuente en archivos .java. El compilador javac transforma ese código en archivos .class que contienen bytecode. Cuando se ejecuta el programa, la JVM carga esos archivos .class, verifica que el bytecode sea válido y seguro, y lo ejecuta utilizando una combinación de interpretación y compilación JIT.
Código fuente (.java)
│
▼ javac (compilador)
Bytecode (.class)
│
▼ JVM (máquina virtual)
│
┌────┴────┐
│ Windows │ Linux │ macOS │ ...
└─────────┘─────────┘─────────┘
El mismo .class se ejecuta en cualquier plataforma con JVM
📦 Ediciones de Java: SE, EE y ME
Java se distribuye en tres ediciones principales, cada una orientada a un tipo diferente de desarrollo:
| Edición | Nombre completo | Uso principal | Ejemplos de uso |
|---|---|---|---|
| Java SE | Standard Edition | Aplicaciones de escritorio y base del lenguaje | Herramientas, utilidades, aprendizaje |
| Java EE | Enterprise Edition (ahora Jakarta EE) | Aplicaciones empresariales y servidores web | APIs REST, microservicios, portales corporativos |
| Java ME | Micro Edition | Dispositivos con recursos limitados | IoT, tarjetas SIM, sistemas embebidos |
Para aprender Java, la edición Java SE es el punto de partida obligatorio. Incluye todas las clases y APIs fundamentales del lenguaje: tipos de datos, colecciones, entrada/salida, concurrencia, networking y más. Las ediciones EE y ME se construyen sobre SE, añadiendo funcionalidades específicas para sus respectivos dominios.
javax.* a jakarta.*, pero la funcionalidad se mantiene y evoluciona activamente.
🔧 JDK, JRE y JVM: diferencias clave
Uno de los puntos de confusión más frecuentes para quienes se inician en Java es la diferencia entre JDK, JRE y JVM. Los tres están relacionados pero cumplen funciones distintas, y se organizan de forma concéntrica:
┌─────────────────────────────────────────────┐
│ JDK (Java Development Kit) │
│ ┌─────────────────────────────────────────┐ │
│ │ JRE (Java Runtime Environment) │ │
│ │ ┌─────────────────────────────────────┐│ │
│ │ │ JVM (Java Virtual Machine) ││ │
│ │ │ - Carga bytecode ││ │
│ │ │ - Verifica seguridad ││ │
│ │ │ - Ejecuta (interpreta + JIT) ││ │
│ │ └─────────────────────────────────────┘│ │
│ │ + Bibliotecas estándar (java.lang, │ │
│ │ java.util, java.io, java.net...) │ │
│ └─────────────────────────────────────────┘ │
│ + javac (compilador) │
│ + jdb (depurador) │
│ + javadoc (documentación) │
│ + jar (empaquetador) │
│ + jshell (REPL interactivo desde Java 9) │
└─────────────────────────────────────────────┘
Para programar en Java se necesita el JDK. El JRE sería suficiente para ejecutar programas ya compilados, pero desde Java 11 Oracle ya no distribuye el JRE como producto independiente: al instalar el JDK se obtiene también el entorno de ejecución completo.
💾 Instalación del JDK paso a paso
Para comenzar a programar en Java es necesario instalar el JDK (Java Development Kit). Existen varias distribuciones gratuitas y fiables:
| Distribución | Proveedor | Licencia | Recomendado para |
|---|---|---|---|
| Oracle JDK | Oracle | NFTC (gratuita) | Producción empresarial |
| Eclipse Temurin | Adoptium | Open Source (GPLv2+CE) | Desarrollo y aprendizaje |
| Amazon Corretto | Amazon | Open Source (GPLv2+CE) | Entornos AWS |
| Azul Zulu | Azul Systems | Open Source | Microservicios |
Instalación en Windows
El proceso de instalación en Windows consta de tres pasos fundamentales: descargar el instalador, ejecutarlo y configurar las variables de entorno.
:: 1. Establecer JAVA_HOME (ruta donde se instaló el JDK)
setx JAVA_HOME "C:\Program Files\Java\jdk-21"
:: 2. Añadir el directorio bin al PATH del sistema
setx PATH "%PATH%;%JAVA_HOME%\bin"
:: 3. Verificar la instalación
java -version
javac -version
Instalación en Linux (Ubuntu/Debian)
# Actualizar repositorios
sudo apt update
# Instalar OpenJDK 21
sudo apt install openjdk-21-jdk
# Verificar la instalación
java -version
# Salida esperada: openjdk version "21.0.x" ...
javac -version
# Salida esperada: javac 21.0.x
Instalación en macOS
# Instalar mediante Homebrew
brew install openjdk@21
# Crear enlace simbólico para que el sistema lo detecte
sudo ln -sfn /opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk \
/Library/Java/JavaVirtualMachines/openjdk-21.jdk
# Verificar
java -version
java (la JVM) como javac (el compilador) están accesibles desde la terminal. Si el comando javac -version no se reconoce, la variable PATH no está configurada correctamente.
🚀 Tu primer programa en Java: Hola Mundo
El programa «Hola Mundo» es el ejemplo clásico para verificar que el entorno de desarrollo funciona correctamente y para comprender la estructura básica de un programa Java. Aunque es sencillo, ilustra varios conceptos fundamentales del lenguaje.
/**
* Primer programa en Java.
* Demuestra la estructura básica: clase, método main y salida por consola.
*/
public class HolaMundo {
public static void main(String[] args) {
System.out.println("¡Hola, Mundo!");
System.out.println("Bienvenido al curso de Java de Ciberaula.");
}
}
// Salida esperada:
// ¡Hola, Mundo!
// Bienvenido al curso de Java de Ciberaula.
Analicemos cada elemento de este programa:
| Elemento | Significado |
|---|---|
public class HolaMundo | Declara una clase pública llamada HolaMundo. El nombre del archivo debe coincidir: HolaMundo.java |
public static void main(String[] args) | El método principal: punto de entrada del programa. La JVM busca exactamente esta firma para iniciar la ejecución |
System.out.println() | Imprime una línea de texto en la consola. System es una clase, out es su flujo de salida estándar, y println es el método que imprime con salto de línea |
# Paso 1: Compilar el archivo fuente
javac HolaMundo.java
# Genera: HolaMundo.class (bytecode)
# Paso 2: Ejecutar el programa (sin extensión .class)
java HolaMundo
# Salida:
# ¡Hola, Mundo!
# Bienvenido al curso de Java de Ciberaula.
# Alternativa desde Java 11: ejecución directa sin compilar explícitamente
java HolaMundo.java
java NombreArchivo.java. Esto es muy útil para pruebas rápidas y aprendizaje.
🔄 Proceso de compilación e interpretación
Java utiliza un modelo híbrido que combina compilación e interpretación. Este proceso de dos fases es lo que permite la portabilidad del código entre distintas plataformas:
Fase 1 — Compilación: el compilador javac analiza el código fuente (.java), verifica la sintaxis y los tipos, y genera bytecode (.class). El bytecode es un conjunto de instrucciones de bajo nivel diseñado para la JVM, no para ningún procesador real específico.
Fase 2 — Ejecución: la JVM carga el bytecode, lo verifica y lo ejecuta. Las JVM modernas utilizan un compilador JIT (Just-In-Time) que detecta las secciones de código ejecutadas con mayor frecuencia (hot spots) y las compila a código máquina nativo para maximizar el rendimiento.
# Compilar
javac HolaMundo.java
# Ver el bytecode descompilado (herramienta javap incluida en el JDK)
javap -c HolaMundo.class
# Salida parcial:
# public static void main(java.lang.String[]);
# Code:
# 0: getstatic #7 // Field java/lang/System.out
# 3: ldc #13 // String ¡Hola, Mundo!
# 5: invokevirtual #15 // Method PrintStream.println
# 8: return
🛠️ Entornos de desarrollo (IDE) recomendados
Aunque es posible escribir código Java con un simple editor de texto y compilar desde la terminal, los IDE (Integrated Development Environment) proporcionan herramientas que aceleran enormemente el desarrollo: autocompletado inteligente, depuración visual, refactorización automática, integración con sistemas de control de versiones y gestión de dependencias.
| IDE | Desarrollador | Licencia | Características destacadas |
|---|---|---|---|
| IntelliJ IDEA | JetBrains | Community (gratis) / Ultimate (pago) | Autocompletado superior, refactorización avanzada, soporte Kotlin nativo. El IDE más popular entre desarrolladores Java profesionales. |
| Eclipse | Eclipse Foundation | Open Source (EPL) | Extensible mediante plugins, larga trayectoria, gran comunidad. Base de Jakarta EE Tools. |
| Visual Studio Code | Microsoft | Open Source (MIT) | Ligero, extensiones Java de Red Hat/Microsoft, ideal para proyectos pequeños y aprendizaje. |
| Apache NetBeans | Apache Foundation | Open Source (Apache 2.0) | Soporte nativo para Maven/Gradle, editor visual de interfaces Swing. |
⚔️ Java frente a otros lenguajes
Una de las preguntas más habituales al elegir un lenguaje de programación es cómo se compara Java con otras opciones populares. La siguiente tabla resume las diferencias más relevantes:
| Aspecto | Java | Python | C++ | JavaScript |
|---|---|---|---|---|
| Paradigma | OO estricto | Multiparadigma | Multiparadigma | Multiparadigma |
| Tipado | Estático y fuerte | Dinámico y fuerte | Estático y fuerte | Dinámico y débil |
| Compilación | Bytecode + JIT | Interpretado | Nativo | Interpretado / JIT |
| Rendimiento | Alto | Medio-bajo | Muy alto | Medio-alto (V8) |
| Gestión memoria | Garbage collector | Garbage collector | Manual | Garbage collector |
| Curva aprendizaje | Media | Baja | Alta | Baja-media |
| Uso principal | Empresas, Android | IA, datos, scripting | Sistemas, juegos | Web frontend/backend |
Java ocupa un nicho privilegiado: ofrece un rendimiento significativamente superior al de Python, una seguridad y gestión de memoria muy superiores a C++, y un ecosistema empresarial sin rival. Su tipado estático atrapa errores en tiempo de compilación, algo que lenguajes dinámicos como Python o JavaScript solo detectan en tiempo de ejecución.
🌍 Aplicaciones reales de Java en la industria
Java se utiliza en prácticamente todos los sectores tecnológicos. Estas son algunas de las áreas donde su presencia es dominante:
Aplicaciones empresariales: la mayoría de las grandes corporaciones (bancos, aseguradoras, telecomunicaciones, administración pública) construyen sus sistemas back-end con Java. Frameworks como Spring Boot y Jakarta EE dominan el desarrollo de microservicios y APIs REST en el entorno corporativo.
Desarrollo Android: Java fue el lenguaje oficial de Android desde sus inicios en 2008. Aunque Kotlin es ahora el lenguaje preferido por Google para nuevas aplicaciones, millones de aplicaciones Android existentes están escritas en Java, y el conocimiento de Java sigue siendo un requisito habitual para desarrolladores Android.
Big Data: el ecosistema de Big Data se construyó mayoritariamente sobre Java. Herramientas como Apache Hadoop, Apache Spark, Apache Kafka y Elasticsearch están escritas en Java o en lenguajes de la JVM. Esto convierte a Java en un lenguaje esencial para ingenieros de datos.
Computación en la nube: los principales proveedores de nube (AWS, Google Cloud, Azure) ofrecen SDKs nativos para Java, y la mayor parte de la infraestructura interna de estos servicios utiliza Java. Amazon, por ejemplo, es uno de los mayores usuarios de Java del mundo.
🧩 Ejemplo integrador: calculadora de notas
El siguiente ejemplo reúne varios conceptos fundamentales de Java: declaración de clase, método main, variables, arrays, bucles, condicionales y salida por consola. Simula una calculadora que recibe las notas de un estudiante, calcula la media y determina si ha aprobado.
/**
* Calculadora de notas de un estudiante.
* Demuestra: arrays, bucles, condicionales y formateo de salida.
*/
public class CalculadoraNotas {
public static void main(String[] args) {
// Notas del estudiante (sobre 10)
double[] notas = {7.5, 8.0, 6.5, 9.0, 5.5};
String[] asignaturas = {
"Programación", "Bases de Datos",
"Redes", "Sistemas Operativos", "Matemáticas"
};
// Calcular suma y media
double suma = 0;
for (double nota : notas) {
suma += nota;
}
double media = suma / notas.length;
// Mostrar resultados por asignatura
System.out.println("╔══════════════════════════════════╗");
System.out.println("║ BOLETÍN DE CALIFICACIONES ║");
System.out.println("╠══════════════════════════════════╣");
for (int i = 0; i < notas.length; i++) {
String estado = notas[i] >= 5.0 ? "APROBADO" : "SUSPENSO";
System.out.printf("║ %-20s %4.1f %-8s ║%n",
asignaturas[i], notas[i], estado);
}
System.out.println("╠══════════════════════════════════╣");
System.out.printf("║ Media: %.2f ║%n", media);
// Resultado final
if (media >= 9.0) {
System.out.println("║ Calificación: SOBRESALIENTE ║");
} else if (media >= 7.0) {
System.out.println("║ Calificación: NOTABLE ║");
} else if (media >= 5.0) {
System.out.println("║ Calificación: APROBADO ║");
} else {
System.out.println("║ Calificación: SUSPENSO ║");
}
System.out.println("╚══════════════════════════════════╝");
}
}
// Salida esperada:
// ╔══════════════════════════════════╗
// ║ BOLETÍN DE CALIFICACIONES ║
// ╠══════════════════════════════════╣
// ║ Programación 7.5 APROBADO ║
// ║ Bases de Datos 8.0 APROBADO ║
// ║ Redes 6.5 APROBADO ║
// ║ Sistemas Operativos 9.0 APROBADO ║
// ║ Matemáticas 5.5 APROBADO ║
// ╠══════════════════════════════════╣
// ║ Media: 7.30 ║
// ║ Calificación: NOTABLE ║
// ╚══════════════════════════════════╝
✏️ Ejercicios prácticos resueltos
Practica lo aprendido con estos ejercicios progresivos. Intenta resolverlos antes de consultar la solución.
Ejercicio 1: Datos personales (Nivel básico)
Escribe un programa Java que declare variables para nombre, edad y ciudad, y muestre por consola un mensaje con estos datos formateados.
Ver solución
public class DatosPersonales {
public static void main(String[] args) {
String nombre = "María García";
int edad = 22;
String ciudad = "Madrid";
System.out.println("=== Ficha Personal ===");
System.out.println("Nombre: " + nombre);
System.out.println("Edad: " + edad + " años");
System.out.println("Ciudad: " + ciudad);
System.out.printf("Resumen: %s, %d años, de %s.%n", nombre, edad, ciudad);
}
}
// Salida esperada:
// === Ficha Personal ===
// Nombre: María García
// Edad: 22 años
// Ciudad: Madrid
// Resumen: María García, 22 años, de Madrid.
Ejercicio 2: Conversor de temperatura (Nivel intermedio)
Crea un programa que convierta temperaturas de Celsius a Fahrenheit y viceversa. Declara un array con las temperaturas 0, 20, 37, 100 en Celsius y muestra su equivalencia en Fahrenheit usando la fórmula: F = C × 9/5 + 32.
Ver solución
public class ConversorTemperatura {
public static void main(String[] args) {
double[] celsius = {0, 20, 37, 100};
System.out.println("┌────────────┬────────────────┐");
System.out.println("│ Celsius │ Fahrenheit │");
System.out.println("├────────────┼────────────────┤");
for (double c : celsius) {
double f = c * 9.0 / 5.0 + 32;
System.out.printf("│ %6.1f °C │ %8.1f °F │%n", c, f);
}
System.out.println("└────────────┴────────────────┘");
}
}
// Salida esperada:
// ┌────────────┬────────────────┐
// │ Celsius │ Fahrenheit │
// ├────────────┼────────────────┤
// │ 0.0 °C │ 32.0 °F │
// │ 20.0 °C │ 68.0 °F │
// │ 37.0 °C │ 98.6 °F │
// │ 100.0 °C │ 212.0 °F │
// └────────────┴────────────────┘
Ejercicio 3: Verificador de números primos (Nivel avanzado)
Escribe un programa que determine si un número es primo. El programa debe verificar los números del 1 al 20 y mostrar cuáles son primos y cuáles no.
Ver solución
public class VerificadorPrimos {
/**
* Determina si un número es primo.
* Un número primo solo es divisible por 1 y por sí mismo.
*/
public static boolean esPrimo(int numero) {
if (numero < 2) {
return false;
}
// Solo necesitamos comprobar hasta la raíz cuadrada
for (int i = 2; i <= Math.sqrt(numero); i++) {
if (numero % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
System.out.println("Números primos del 1 al 20:");
System.out.println("─".repeat(30));
int contadorPrimos = 0;
for (int i = 1; i <= 20; i++) {
if (esPrimo(i)) {
System.out.printf(" %2d → PRIMO%n", i);
contadorPrimos++;
} else {
System.out.printf(" %2d → no primo%n", i);
}
}
System.out.println("─".repeat(30));
System.out.printf("Total de primos encontrados: %d%n", contadorPrimos);
}
}
// Salida esperada (parcial):
// 1 → no primo
// 2 → PRIMO
// 3 → PRIMO
// 4 → no primo
// 5 → PRIMO
// ...
// Total de primos encontrados: 8
❓ Preguntas frecuentes sobre ¿Qué es Java? Historia, características y primer programa
Las dudas más comunes respondidas de forma clara y directa.
💬 Foro de discusión
¿Tienes dudas sobre ¿Qué es Java? Historia, características y primer programa? Comparte tu pregunta con la comunidad.
Todavía no hay mensajes. ¡Sé el primero en participar!