Java es, desde hace casi tres décadas, uno de los lenguajes más utilizados del mundo para construir software que tiene que funcionar durante años, en máquinas distintas y bajo carga real. Antes de escribir una sola línea de código conviene entender qué problema vino a resolver Java, cómo consigue ejecutarse en cualquier sistema operativo sin recompilar, y qué significan exactamente las siglas JDK, JRE y JVM que aparecerán en cada tutorial, cada error y cada oferta de trabajo. Esta lección te da ese mapa mental. También te presenta BiblioTech, el proyecto que construirás de principio a fin a lo largo del curso y que convertirá cada concepto abstracto en algo que funciona.
Contenido
- Qué es Java y qué problemas resuelve
- El principio WORA: escribe una vez, ejecuta en cualquier sitio
- JDK, JRE y JVM: tres piezas que se confunden constantemente
- Las características del lenguaje, explicadas
- Breve historia y el calendario de versiones LTS
- Dónde se usa Java hoy
- El proyecto del curso: BiblioTech
- Errores Comunes y Consejos
- Ejercicios
- Qué es Java y qué problemas resuelve
Java es un lenguaje de programación de propósito general, orientado a objetos y de tipado estático, junto con una plataforma de ejecución (la máquina virtual y su biblioteca estándar). Esta doble naturaleza es importante: cuando alguien dice "trabajo con Java" no se refiere solo a una sintaxis, sino a todo un ecosistema de herramientas, librerías y servidores que se apoyan en la misma máquina virtual.
Java nació en Sun Microsystems a principios de los noventa, en un contexto en el que programar aplicaciones portables era doloroso. Los problemas concretos que atacó fueron:
- La dependencia del sistema operativo y del procesador. Un programa escrito en C se compilaba a instrucciones nativas de una arquitectura concreta. Llevarlo de Windows a Solaris significaba recompilar y, casi siempre, reescribir partes. Java introdujo un formato intermedio (bytecode) que se ejecuta igual en cualquier máquina que tenga una JVM.
- La gestión manual de memoria. En C y C++ el programador reserva y libera memoria a mano. Olvidarse de liberar produce fugas; liberar dos veces o usar un puntero ya liberado produce corrupciones difíciles de depurar. Java delegó eso en un recolector de basura automático.
- La aritmética de punteros y los desbordamientos. Java eliminó los punteros manipulables por el programador y añadió comprobación de límites en los accesos a memoria indexada. Muchos fallos de seguridad clásicos simplemente no pueden ocurrir.
- La falta de una biblioteca estándar rica. Java se distribuyó desde el principio con clases para texto, fechas, colecciones, red, hilos y entrada/salida. No había que buscar una librería distinta por cada sistema operativo.
El resultado es un lenguaje pensado para software de larga vida: aplicaciones empresariales que se mantienen diez o quince años, con equipos que rotan y donde la legibilidad y la estabilidad valen más que la brillantez sintáctica.
- El principio WORA: escribe una vez, ejecuta en cualquier sitio
El eslogan histórico de Java es WORA (Write Once, Run Anywhere): escribes el código una sola vez y se ejecuta en cualquier plataforma sin cambios. Esto no es magia, es una consecuencia directa de cómo se compila y ejecuta un programa Java.
El recorrido de tu código
- Escribes un fichero de código fuente con extensión
.java. Es texto plano legible por humanos. - El compilador
javaclo traduce a bytecode, un juego de instrucciones intermedio, y lo guarda en un fichero.class. Ese bytecode no es específico de Windows, Linux ni macOS: es específico de la máquina virtual de Java. - La JVM (Java Virtual Machine) instalada en cada sistema lee ese
.classy lo ejecuta. Internamente, un compilador JIT (Just-In-Time) traduce las partes más usadas del bytecode a instrucciones nativas del procesador real, para que el rendimiento sea alto.
flowchart TD
A["BiblioTechApp.java<br/>(código fuente, texto)"] -->|"javac"| B["BiblioTechApp.class<br/>(bytecode, portable)"]
B --> C{"JVM"}
C --> D["JVM en Windows<br/>→ instrucciones x86"]
C --> E["JVM en Linux<br/>→ instrucciones x86/ARM"]
C --> F["JVM en macOS<br/>→ instrucciones ARM (Apple Silicon)"]
La clave está en la bifurcación final: lo que se distribuye es el bytecode, y lo que cambia entre sistemas es la JVM, no tu programa. Cuando compilas el fichero BiblioTechApp.java en tu portátil y envías el .class resultante a un servidor Linux, ese servidor lo ejecuta sin recompilar nada.
Los matices honestos de WORA
WORA es real, pero conviene conocer sus límites desde el principio:
- Un programa compilado con un JDK 21 no se ejecuta en una JVM 17. La compatibilidad es hacia adelante (una JVM nueva ejecuta bytecode antiguo), no hacia atrás. Por eso la versión importa tanto.
- Si tu código usa rutas como
C:\datos\libros.txto llama a comandos del sistema, has introducido una dependencia de plataforma tú mismo. Java te da las herramientas para evitarlo, no te obliga a usarlas. - Detalles como la codificación de caracteres por defecto o el separador de línea han variado históricamente entre sistemas. Java moderno (17+) ha unificado buena parte de esto, por ejemplo fijando UTF-8 como codificación por defecto a partir de Java 18.
- JDK, JRE y JVM: tres piezas que se confunden constantemente
Esta es probablemente la confusión número uno de quien empieza. Las tres siglas describen capas concéntricas: el JDK contiene al JRE, y el JRE contiene a la JVM.
| Sigla | Nombre completo | Qué contiene | Para qué sirve | ¿Lo necesitas tú? |
|---|---|---|---|---|
| JVM | Java Virtual Machine | El motor que carga y ejecuta bytecode, el recolector de basura y el compilador JIT | Ejecutar el bytecode traduciéndolo a instrucciones nativas | Sí, pero nunca se instala sola |
| JRE | Java Runtime Environment | La JVM + la biblioteca estándar de clases (java.lang, java.util, java.io…) |
Ejecutar aplicaciones Java ya compiladas | Sí, va incluido en el JDK |
| JDK | Java Development Kit | El JRE + herramientas de desarrollo: javac (compilador), jshell, jar, javadoc, jdb (depurador), jlink |
Escribir, compilar y empaquetar programas | Sí: es lo que instalarás |
La regla práctica es simple: como desarrollador instalas el JDK y te olvidas del resto. El JRE por separado dejó de distribuirse a partir de Java 11; hoy se asume que quien ejecuta Java tiene un JDK completo o una imagen reducida creada con jlink.
Una analogía que suele funcionar: la JVM es el motor de un coche, el JRE es el coche completo listo para conducir, y el JDK es el coche más el taller con todas las herramientas para fabricar coches nuevos.
- Las características del lenguaje, explicadas
Las listas de "características de Java" suelen ser inútiles porque enumeran adjetivos sin explicarlos. Veamos qué significa cada uno en la práctica.
Orientado a objetos
En Java, el código se organiza en clases: plantillas que agrupan datos y las operaciones sobre esos datos. En lugar de tener por un lado unas variables sueltas con el título, el autor y el ISBN de un libro, y por otro unas funciones que operan sobre ellas, defines una clase Libro que contiene ambas cosas. Eso hace que el código crezca de forma ordenada: cuando el sistema tiene doscientas entidades distintas, cada una sabe cuidar de sus propios datos.
En este primer módulo trabajarás solo con variables sueltas dentro de un main, precisamente para que sientas la incomodidad de hacerlo así. En el módulo 3 convertirás esas variables en clases y verás la diferencia con tus propios ojos.
Tipado estático
Cada variable declara de qué tipo es, y el compilador comprueba antes de ejecutar que no haces operaciones imposibles. Si declaras que anioPublicacion es un número entero e intentas guardarle el texto "desconocido", el programa no llega a compilar. Esto tiene un coste (hay que escribir más) y una gran ventaja: una familia entera de errores se detecta en tu máquina, en segundos, y no en producción a las tres de la madrugada.
Gestión automática de memoria
Cuando creas objetos, Java reserva memoria por ti en una zona llamada heap. Cuando dejan de ser accesibles, un proceso en segundo plano llamado recolector de basura (garbage collector) libera esa memoria. No escribes free() ni delete. Esto elimina las fugas más comunes y los accesos a memoria liberada, aunque no te exime de pensar: guardar referencias a millones de objetos en una lista que nunca vacías sigue siendo una fuga, solo que de otro tipo.
Portabilidad
Ya la hemos visto: es la consecuencia del bytecode y la JVM. Su valor práctico es que puedes desarrollar en un portátil con Windows o macOS y desplegar en un servidor Linux con la certeza razonable de que el comportamiento será el mismo.
Robustez
Java hace muchas comprobaciones en tiempo de ejecución que otros lenguajes omiten: los accesos fuera de rango se detectan, las conversiones inválidas de tipo se detectan, y los errores se comunican mediante excepciones, un mecanismo estructurado para propagar y tratar fallos (lo verás a fondo en el módulo 6). El efecto es que un programa Java que falla suele hacerlo de forma ruidosa y localizable, con una traza que dice exactamente en qué línea ocurrió.
Concurrencia integrada
Java incorporó hilos de ejecución en el propio lenguaje desde la versión 1.0, algo poco habitual en su época. Un programa Java puede atender a miles de peticiones simultáneas, y la biblioteca estándar trae colas, pools de hilos y estructuras seguras para ello. Es una de las razones de su dominio en servidores. Lo trabajarás en el módulo 8, cuando BiblioTech tenga que enviar recordatorios en segundo plano sin bloquear al usuario.
- Breve historia y el calendario de versiones LTS
Java se publicó en 1995 bajo el paraguas de Sun Microsystems. Oracle adquirió Sun en 2010 y desde entonces mantiene el lenguaje junto con una comunidad amplia (el proyecto OpenJDK, que es la implementación de referencia y de código abierto).
Los hitos que más te afectan como desarrollador:
| Versión | Año | Qué aportó (resumen) |
|---|---|---|
| Java 5 | 2004 | Genéricos, enum, autoboxing, bucle for-each |
| Java 8 | 2014 | Lambdas, Streams, Optional, nueva API de fechas java.time |
| Java 11 | 2018 | Cliente HTTP moderno, var en lambdas, ejecución directa de ficheros fuente |
| Java 17 | 2021 | Registros, clases selladas, switch como expresión, coincidencia de patrones |
| Java 21 | 2023 | Hilos virtuales, patrones de registro, switch con patrones |
Qué significa LTS y cómo elegir
Desde 2018 Java publica una versión nueva cada seis meses (marzo y septiembre). La mayoría son versiones de feature release, con soporte solo hasta que sale la siguiente. Cada dos o tres años una de ellas se designa LTS (Long-Term Support): recibe actualizaciones de seguridad y correcciones durante años.
Las LTS actuales son 8, 11, 17 y 21 (y 25, publicada en 2025). Las implicaciones prácticas:
- En producción se usan casi siempre versiones LTS. Ninguna empresa quiere actualizar la base de su plataforma cada seis meses.
- Java 17 es hoy el mínimo razonable para un proyecto nuevo, y Java 21 es la elección más habitual si no hay restricciones. Este curso usa Java 17 como referencia y señala explícitamente lo que requiere una versión superior.
- Java 8 sigue vivo en muchísimo código empresarial heredado. Si entras en una empresa con una base de código antigua, es muy posible que te encuentres con él. Todo lo que aprendas aquí sigue siendo válido; simplemente algunas comodidades modernas no estarán disponibles.
- Dónde se usa Java hoy
Conviene saber qué puertas abre lo que estás aprendiendo:
- Backend empresarial. Es su terreno dominante. Bancos, aseguradoras, telecomunicaciones, administraciones públicas y comercio electrónico ejecutan sus servicios centrales sobre Java, normalmente con Spring Boot (módulo 11). Los sistemas que mueven dinero y que no pueden caerse suelen estar escritos en Java.
- Android. Durante años, el desarrollo Android fue Java puro. Hoy Kotlin es el lenguaje recomendado, pero Kotlin se ejecuta sobre la misma máquina virtual, interopera con Java y comparte librerías. Saber Java sigue siendo una base directa para el desarrollo móvil.
- Big data y procesamiento distribuido. Hadoop, Spark, Kafka, Elasticsearch, Flink: la infraestructura de datos moderna está escrita mayoritariamente en Java o Scala sobre la JVM.
- Herramientas y sistemas. IDEs como IntelliJ IDEA y Eclipse, servidores de integración como Jenkins, bases de datos como Cassandra y Neo4j.
- Sistemas embebidos y tarjetas inteligentes, un nicho menos visible pero real.
- El proyecto del curso: BiblioTech
Aprender a programar leyendo ejemplos desconectados entre sí no funciona. Por eso este curso construye un único sistema real, de forma incremental, desde la primera lección hasta la última.
El escenario
Nexus Software es una empresa de desarrollo con unas doscientas personas. Tiene una biblioteca técnica interna: varios cientos de libros de programación, arquitectura y gestión que los empleados toman prestados. Hasta ahora se gestionaba con una hoja de cálculo compartida, con los problemas previsibles: nadie sabe quién tiene qué, los libros desaparecen y no hay forma de saber cuánto tiempo lleva prestado cada ejemplar.
Tu encargo es construir BiblioTech, el sistema que sustituya esa hoja de cálculo.
Los datos con los que trabajarás durante todo el curso serán siempre los mismos, para que puedas centrarte en el concepto nuevo y no en entender el ejemplo:
| Elemento | Valores recurrentes |
|---|---|
| Empresa | Nexus Software |
| Empleados | Marta Ruiz, Diego Alonso, Nuria Vidal |
| Libros | "Java Efectivo" (ISBN 978-0000000001), "Patrones de Diseño" (ISBN 978-0000000002), "Refactorización" (ISBN 978-0000000003) |
| Clase principal | BiblioTechApp |
Cómo crece BiblioTech a lo largo del curso
flowchart LR
M1["Módulo 1<br/>Un programa lineal<br/>que calcula una multa"] --> M2["Módulos 2-3<br/>Menú interactivo<br/>y clases Libro/Empleado"]
M2 --> M3["Módulos 4-5<br/>Catálogo con<br/>colecciones"]
M3 --> M4["Módulos 6-7<br/>Errores controlados<br/>e importación CSV"]
M4 --> M5["Módulos 8-9<br/>Recordatorios en 2º plano<br/>y consulta remota"]
M5 --> M6["Módulos 10-12<br/>Streams, Spring,<br/>base de datos y web"]
Al terminar el curso habrás construido, paso a paso y entendiendo cada decisión, una aplicación con catálogo de libros, gestión de préstamos y reservas, cálculo de multas, importación y exportación de datos, tareas en segundo plano, acceso remoto, pruebas automatizadas y una interfaz web desplegada. No será un juguete: será un proyecto que puedes enseñar.
Dónde estás ahora
En este módulo 1 escribirás la primera versión de BiblioTechApp: un programa lineal, sin repeticiones ni decisiones complejas, que pide por consola los datos de un préstamo y emite un recibo con la multa calculada. Todo con un único método main, variables, operadores y entrada/salida por consola. Es deliberadamente limitado, y en la lección 01-07 analizaremos exactamente qué le falta y qué módulo lo resolverá.
Errores Comunes y Consejos
- Confundir el lenguaje Java con JavaScript. No tienen relación técnica alguna más allá del nombre, que fue una decisión de marketing de los años noventa. Sintaxis, ejecución y ecosistema son distintos.
- Instalar un JRE en lugar de un JDK. Es el clásico "¿por qué no funciona
javac?". Sin JDK no tienes compilador. Lo resolveremos en la lección siguiente. - Creer que WORA significa "funciona en cualquier versión". El bytecode es portable entre sistemas operativos, no entre versiones de JVM hacia atrás. Compilar con JDK 21 y ejecutar en JVM 17 produce el error
UnsupportedClassVersionError. - Elegir la última versión sin más. Para aprender, cualquier LTS reciente vale. Para un proyecto real, comprueba primero qué versión soportan tu framework, tu servidor y tu proveedor de nube.
- Consejo de método: teclea todos los ejemplos del curso a mano, sin copiar y pegar. Los errores de compilación que cometerás al hacerlo son parte esencial del aprendizaje, y aprender a leerlos (lección 01-03) te ahorrará cientos de horas.
- Consejo de recursos: acostúmbrate desde el primer día a consultar la documentación oficial de la API de Java. Es densa al principio, pero es la fuente de verdad y todo desarrollador Java la usa a diario.
Ejercicios
Ejercicio 1: El recorrido del código
Explica con tus palabras, y sin mirar el texto, qué ocurre desde que guardas un fichero BiblioTechApp.java hasta que ves el resultado en pantalla. Menciona los nombres de los ficheros intermedios y las herramientas implicadas. Después, responde: si envías únicamente el fichero .class a un compañero que usa Linux mientras tú usas Windows, ¿podrá ejecutarlo? ¿Y si tú compilaste con JDK 21 y él tiene instalada una JVM 17?
Ejercicio 2: Decidir la versión para Nexus Software
Nexus Software va a arrancar BiblioTech como proyecto nuevo. El equipo de sistemas mantiene otra aplicación que corre sobre Java 8 y pregunta si BiblioTech debería usar la misma versión "para simplificar". Elabora una recomendación razonada de tres o cuatro puntos: qué versión elegirías, qué argumentos darías, y qué riesgo real hay en cada opción.
Ejercicio 3: Investigación sobre el ecosistema
Busca tres aplicaciones o plataformas que uses (o de las que hayas oído hablar) y averigua si están construidas total o parcialmente sobre la JVM. Para cada una, anota qué parte del sistema usa Java y por qué crees que se eligió ese lenguaje en lugar de otro.
Soluciones
Solución 1
El recorrido tiene tres etapas:
- Edición.
BiblioTechApp.javaes texto plano. No es ejecutable; ninguna máquina lo entiende directamente. - Compilación. La herramienta
javac, incluida en el JDK, lee el.java, comprueba que la sintaxis y los tipos son correctos y generaBiblioTechApp.classcon bytecode. Si hay un error de tipos o de sintaxis, este paso falla y no se genera nada. - Ejecución. El comando
javaarranca una JVM, que carga el.class, verifica el bytecode e inicia su ejecución. El compilador JIT traduce a instrucciones nativas las partes que más se ejecutan, y el recolector de basura gestiona la memoria en paralelo.
Sobre las dos preguntas:
- Windows → Linux: sí funciona. Es exactamente el propósito de WORA. El
.classno contiene instrucciones de x86 ni de ARM, sino bytecode; la JVM de Linux lo traduce a lo que necesite esa máquina. - JDK 21 → JVM 17: no funciona. El fichero
.classlleva grabado un número de versión de formato. Una JVM 17 se niega a cargar un.classgenerado para 21 y lanzaUnsupportedClassVersionError. La compatibilidad de Java es hacia adelante (una JVM nueva ejecuta clases antiguas), no hacia atrás. Si necesitas compilar con un JDK moderno pero ejecutar en una JVM antigua, existe la opciónjavac --release 17, que genera bytecode compatible con esa versión.
Solución 2
Una recomendación defendible sería:
- Elegiría Java 21 (o, en su defecto, Java 17). Ambas son LTS, con soporte y actualizaciones de seguridad garantizadas durante años, y son las versiones que esperan hoy los frameworks del ecosistema.
- Argumento de productividad. Java 17 y 21 aportan características que reducen código repetitivo y errores: registros para modelar datos,
switchcomo expresión, coincidencia de patrones, text blocks. En un proyecto como BiblioTech, que va a modelar libros, empleados y préstamos, esto se nota desde el primer día. - Argumento de compatibilidad con el ecosistema. Las versiones actuales de Spring Boot exigen Java 17 como mínimo. Empezar en Java 8 cerraría la puerta a las versiones soportadas del framework que usaremos en el módulo 11.
- El riesgo real de cada opción. Elegir Java 21 no obliga a tocar la aplicación existente: dos aplicaciones pueden convivir en el mismo servidor con JVMs distintas, y hoy es habitual que cada servicio empaquete la suya (por ejemplo, en un contenedor). El riesgo verdadero está en la opción contraria: arrancar un proyecto nuevo en 2026 sobre Java 8 significa nacer con deuda técnica, sobre una versión cuyo soporte es de pago o limitado y que muchas librerías modernas ya no admiten.
Conclusión de la recomendación: la simplificación que propone el equipo de sistemas es aparente; el coste de mantener una versión obsoleta en un proyecto nuevo supera con mucho el de gestionar dos versiones.
Solución 3
No hay una única respuesta correcta, pero un buen desarrollo del ejercicio debería identificar patrones como estos:
- Una aplicación bancaria móvil. El backend (cuentas, transferencias, antifraude) suele ser Java con Spring. Motivos: madurez, transaccionalidad, disponibilidad de perfiles profesionales y décadas de código probado en el sector financiero.
- Una aplicación Android. La aplicación se ejecuta sobre ART, una máquina virtual que ejecuta bytecode derivado del de Java. Aunque hoy se escriba en Kotlin, todo el modelo de ejecución y buena parte de la API son herencia directa de Java.
- Un buscador interno o una plataforma de análisis. Elasticsearch está escrito en Java; Kafka y Spark también. Motivo: la JVM ofrece un rendimiento muy alto con gestión automática de memoria, excelente soporte de concurrencia y portabilidad entre los miles de servidores de un clúster.
Lo relevante del ejercicio no es acertar el dato, sino observar el patrón: Java domina donde importan la fiabilidad a largo plazo, la concurrencia y el mantenimiento por equipos grandes, más que donde importa escribir el prototipo en dos tardes.
Conclusión
Ya tienes el mapa. Java es a la vez un lenguaje y una plataforma; su portabilidad viene de compilar a bytecode y ejecutarlo sobre una JVM específica de cada sistema; el JDK es lo que instalarás porque contiene el compilador, el JRE y la JVM; y las versiones LTS (8, 11, 17, 21) marcan el ritmo real de la industria, con Java 17 como referencia de este curso. Sabes también que Java vive sobre todo en el backend empresarial, en Android y en la infraestructura de datos, y conoces el proyecto BiblioTech que darás forma módulo a módulo para Nexus Software.
Con la teoría situada, toca preparar el terreno. En la siguiente lección, Configuración del Entorno de Desarrollo, instalarás un JDK en tu sistema, comprobarás que java y javac responden, entenderás para qué sirven JAVA_HOME y PATH, compilarás y ejecutarás tu primer fichero desde la terminal, conocerás JShell y elegirás el IDE con el que trabajarás el resto del curso.
Curso de Programación en Java
Módulo 1: Introducción a Java
- Introducción a Java
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Operadores
- Entrada y Salida por Consola
- Tu Primer Programa Completo: BiblioTech
Módulo 2: Flujo de Control
- Sentencias Condicionales
- Bucles
- Sentencias Switch
- Break y Continue
- Depuración y Trazas de Ejecución
- Proyecto: Menú Interactivo de BiblioTech
Módulo 3: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Métodos
- Constructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
- La Clase Object: equals, hashCode y toString
Módulo 4: Programación Orientada a Objetos Avanzada
- Interfaces
- Clases Abstractas
- Clases Internas
- Clases Anónimas
- Expresiones Lambda
- Interfaces Funcionales y Referencias a Métodos
- Enumeraciones y Registros
Módulo 5: Estructuras de Datos y Colecciones
- Arreglos
- El Framework de Colecciones
- ArrayList
- LinkedList
- HashMap
- HashSet
- Cola y Deque
- Pila
- Ordenación y Búsqueda en Colecciones
Módulo 6: Manejo de Excepciones
- Introducción a las Excepciones
- Bloque Try-Catch
- Throw y Throws
- Excepciones Personalizadas
- Bloque Finally
- Try-with-resources y AutoCloseable
- Estrategias de Manejo de Errores y Logging
Módulo 7: Entrada/Salida de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Flujos de Archivos
- BufferedReader y BufferedWriter
- Serialización
- La API NIO.2: Path y Files
- Formatos de Intercambio: CSV y Properties
Módulo 8: Multihilo y Concurrencia
- Introducción al Multihilo
- Creación de Hilos
- Ciclo de Vida de un Hilo
- Sincronización
- Utilidades de Concurrencia
- Colecciones Concurrentes y Variables Atómicas
- Tareas Asíncronas con CompletableFuture
Módulo 9: Redes
- Introducción a las Redes
- Sockets
- ServerSocket
- DatagramSocket y DatagramPacket
- URL y HttpURLConnection
- El Cliente HTTP Moderno
Módulo 10: Temas Avanzados
- Genéricos
- Anotaciones
- Reflexión
- Características de Java 8: Streams y Optional
- Fechas y Horas con java.time
- Java 9 y Más Allá
- Memoria, Recolección de Basura y Rendimiento
Módulo 11: Frameworks y Librerías de Java
- Introducción a los Frameworks de Java
- Spring Framework
- Hibernate
- JUnit
- Maven
- Pruebas Avanzadas con Mockito
- Librerías Esenciales del Ecosistema
