Java 25 ejecuta un solo archivo fuente con un comando y un void main a secas, sin una clase que escribir antes. Aprende qué trae el JDK, por qué Java 25 es la versión que conviene aprender y cómo leer errores de compilación y excepciones.
Toda variable de Java guarda un valor primitivo o una referencia a un objeto. Saber cuál explica el desbordamiento silencioso, el paso por valor, == frente a equals y por qué dos Integer con 128 no son iguales.
El if y los bucles de Java se parecen a los de C, con algunas reglas que atrapan bugs reales. El switch antiguo cae al siguiente caso por defecto, y las switch expressions lo corrigen y hacen que el compilador revise cada valor de un enum.
Una clase de Java describe qué guarda un objeto y qué puede hacer, y un constructor decide cómo empieza cada objeto. Aprende campos, this, constructores, private, static y final ejecutando programas pequeños.
Los strings de Java nunca cambian, así que cada edición crea uno nuevo. Aprende los métodos de String y sus trampas, por qué += en un bucle lo copia todo, StringBuilder, text blocks, Unicode y arrays con los helpers de Arrays.
Un record de Java declara en una línea una pequeña clase de datos inmutable, y el compilador escribe su constructor, sus métodos de acceso, equals, hashCode y toString. Aprende qué te da un record, qué rechaza y dónde se queda corto.
Una interfaz dice qué puede hacer un tipo, la herencia le da a una clase todo lo que hace su padre, y la composición envuelve un objeto. Aprende métodos default, super, clases abstractas y la trampa de la clase base frágil ejecutando programas pequeños.
Los sealed types le dan a Java una lista cerrada de subtipos, y el pattern matching permite que un switch pruebe y desarme cada uno. Juntos convierten un caso olvidado en un error de compilación en lugar de un bug silencioso.
Java divide las excepciones en comprobadas, que el compilador te obliga a manejar, y no comprobadas, que no. Aprende try, catch y finally, cómo lanzar y envolver bien las excepciones, y cómo try-with-resources cierra todo en orden inverso.
Un HashMap de Java encuentra las claves con hashCode y equals, así que un contrato roto o una clave que cambia después de put hace desaparecer entradas. Aprende las reglas, por qué TreeSet usa compareTo y qué colección elegir.
Los genéricos permiten que el compilador revise lo que entra en una lista, una caja o un método, y luego borran esa información antes de que el programa se ejecute. Aprende límites, comodines, PECS y a leer una firma del JDK con programas pequeños.
Las lambdas de Java convierten un pequeño comportamiento en un valor, y los streams encadenan esos valores en pipelines perezosos. Mira cómo se ejecuta de verdad un pipeline, qué collectors conviene usar y cuándo un bucle simple se lee mejor.
Java deja que cualquier referencia sea null, así que un valor ausente puede romper el código lejos de donde se perdió. Objects y Optional hacen visible ese valor ausente, y java.time te obliga a decir qué momento, y en qué ciudad, quieres decir.
Arma un proyecto Java de dos módulos solo con javac, jar y java. Mira cómo encajan los paquetes, los imports, el classpath, los archivos JAR y module-info.java, y qué agregan Maven y Gradle encima.
Dónde guarda Java tus variables y objetos, cómo decide el recolector de basura qué liberar, por qué un programa con recolección de basura igual puede tener fugas o quedarse sin memoria, y cómo el JIT hace el código más rápido cuanto más tiempo corre.
Dos hilos de Java que actualizan la misma variable pueden perder escrituras en silencio. Mira por qué count++ es una carrera, cómo la arreglan synchronized, volatile, los atomics y los locks, y cómo forzar y detectar un deadlock.
Los executors de Java ejecutan tus tareas en un pool fijo de hilos y te devuelven un Future. Aprende submit, invokeAll, la cancelación, las cadenas de CompletableFuture, los timeouts, los semáforos y las colas bloqueantes, con una salida que no varía.
Java puede ejecutar cien mil tareas bloqueantes sobre unos pocos hilos del SO. Mira cómo se montan y desmontan los hilos virtuales, qué los sigue anclando, por qué ScopedValue reemplaza a ThreadLocal y cómo StructuredTaskScope cancela el trabajo que falla.
El JDK de Java puede llamar y servir HTTP sin bibliotecas. Aprende HttpClient, síncrono y asíncrono, y luego construye un pequeño servicio de tareas en JSON sobre el HttpServer incorporado, con hilos virtuales, códigos de estado correctos y un apagado limpio.
Arma un pequeño ejecutor de pruebas solo con el JDK a partir de una anotación y reflexión, prueba código package-private con –patch-module y distribuye un servicio Java como JAR modular, imagen de runtime de jlink e instalador de jpackage.