Módulo 00: Introducción a la programación y a Java
Objetivos del módulo
- Entender cómo es un ordenador desde el punto de vista de quien programa: CPU, memoria, almacenamiento y dispositivos de entrada/salida
- Saber qué son un programa, un algoritmo y un lenguaje de programación
- Distinguir los niveles de lenguaje: código máquina, ensamblador y alto nivel
- Comprender la diferencia entre compilar, interpretar y la compilación JIT
- Conocer los grandes paradigmas de programación
- Repasar la historia de Java y su modelo de versiones (cadencia semestral y versiones LTS)
- Entender las piezas de la plataforma Java: JVM, bytecode, JRE y JDK
- Conocer las principales distribuciones del JDK y dónde se usa Java hoy
- Conocer las fases del ciclo de vida del desarrollo de un programa
1. ¿Por qué aprender a programar?
Programar es dar instrucciones a un ordenador para que resuelva un problema por nosotros. Detrás de cada aplicación que usas a diario (el móvil, el banco, los videojuegos, la web del instituto o la universidad) hay personas que han escrito esas instrucciones.
Aprender a programar no consiste en memorizar un lenguaje, sino en aprender a pensar de forma ordenada:
- Descomponer un problema grande en problemas pequeños.
- Describir con precisión, paso a paso, cómo se resuelve cada uno.
- Comprobar que la solución funciona en todos los casos, también en los raros.
- Expresar esa solución en un lenguaje que el ordenador pueda ejecutar.
📘 Concepto: Un ordenador es una máquina muy rápida pero completamente literal: hace exactamente lo que le dices, ni más ni menos, aunque lo que le digas no tenga sentido. Programar es aprender a decirle las cosas con total precisión.
En este curso usaremos Java, uno de los lenguajes más utilizados del mundo en empresas, administraciones públicas y universidades. Es el lenguaje del módulo de Programación de los ciclos de DAM y DAW y el de muchas asignaturas de primer curso de los grados de Informática.
💡 Consejo: No te agobies si al principio todo parece muy abstracto. En este módulo no vas a escribir casi código: vas a construir el mapa mental que necesitas para entender lo que ocurre cuando, en el módulo 01, escribas y ejecutes tu primer programa.
2. El ordenador visto por un programador
No necesitas saber electrónica para programar, pero sí conocer las cuatro piezas con las que trabaja todo programa.
Figura 1. Arquitectura de von Neumann: las partes de un ordenador conectadas por el bus del sistema.
2.1. La arquitectura de von Neumann
Casi todos los ordenadores actuales (portátiles, móviles, servidores, consolas) siguen el modelo que describió el matemático John von Neumann en 1945. Su gran idea fue que el programa y los datos se guardan juntos en la misma memoria. Así, para cambiar lo que hace el ordenador no hay que recablearlo: basta con cargar otro programa en memoria.
| Componente | Qué hace | Analogía en una cocina |
|---|---|---|
| CPU (procesador) | Ejecuta las instrucciones, una detrás de otra, a miles de millones por segundo | El cocinero |
| Memoria principal (RAM) | Guarda el programa que se está ejecutando y los datos con los que trabaja | La encimera: rápida, a mano, pero se limpia al cerrar |
| Almacenamiento secundario (SSD, disco duro) | Guarda ficheros de forma permanente (programas, documentos, fotos) | La despensa: cabe mucho, pero hay que ir a buscarlo |
| Dispositivos de entrada | Introducen datos: teclado, ratón, micrófono, cámara, red | Los pedidos que llegan |
| Dispositivos de salida | Muestran resultados: pantalla, impresora, altavoces, red | Los platos que salen |
| Bus del sistema | Conjunto de “cables” que comunica todas las piezas | Los pasillos de la cocina |
2.2. La CPU por dentro
El procesador tiene tres partes principales:
- Unidad de control (UC): dirige todo. Lee la siguiente instrucción de la memoria, averigua qué significa (la decodifica) y da las órdenes necesarias.
- Unidad aritmético-lógica (ALU): hace las operaciones: sumas, restas, multiplicaciones, comparaciones (¿es
amayor queb?) y operaciones lógicas (Y, O, NO). - Registros: unas pocas celdas de memoria dentro de la propia CPU, ultrarrápidas, donde se guardan los datos con los que se opera en cada momento.
La CPU repite sin parar el ciclo de instrucción:
- Búsqueda (fetch): la UC trae de la RAM la siguiente instrucción.
- Decodificación (decode): averigua qué operación es y qué datos necesita.
- Ejecución (execute): la ALU realiza la operación y el resultado se guarda en un registro o en memoria.
📘 Concepto: Un procesador de 3 GHz realiza unos 3 000 millones de ciclos de reloj por segundo. Cada instrucción es extremadamente sencilla (“suma estos dos números”, “copia este dato aquí”, “si el resultado es cero, salta a esa instrucción”), pero a esa velocidad se pueden hacer cosas muy complejas.
2.3. Memoria RAM frente a almacenamiento
Esta distinción es fundamental para entender qué pasa cuando ejecutas un programa:
| Característica | Memoria RAM | Almacenamiento (SSD/disco) |
|---|---|---|
| Velocidad | Muy rápida (nanosegundos) | Más lenta (microsegundos o milisegundos) |
| Capacidad típica | 8-64 GB | 256 GB - varios TB |
| ¿Se borra al apagar? | Sí (es volátil) | No (es permanente) |
| ¿Qué guarda? | El programa en ejecución y sus datos (variables) | Ficheros: tu código .java, los .class, documentos… |
Cuando haces doble clic en un programa, el sistema operativo copia el programa del disco a la RAM y la CPU empieza a ejecutar sus instrucciones desde allí. Cuando en el módulo 03 declares una variable como int edad = 18;, ese 18 vivirá en la RAM mientras el programa se ejecute, y desaparecerá cuando termine.
⚠️ Importante: Si quieres que un dato sobreviva al cierre del programa (por ejemplo, la lista de alumnos de una aplicación), tienes que guardarlo en un fichero o en una base de datos. Lo veremos en el módulo 17.
2.4. Todo son bits
Dentro del ordenador todo (números, letras, imágenes, instrucciones) se representa con bits: ceros y unos, que eléctricamente son “no hay tensión” y “hay tensión”.
| Unidad | Equivale a | Ejemplo |
|---|---|---|
| bit | 0 o 1 | Encendido/apagado |
| byte | 8 bits | Un carácter como A (en ASCII es 01000001) |
| kilobyte (KB) | 1 000 bytes | Un fichero .java pequeño |
| megabyte (MB) | 1 000 KB | Una foto del móvil |
| gigabyte (GB) | 1 000 MB | La RAM de un portátil se mide en GB |
| terabyte (TB) | 1 000 GB | Un disco externo |
💡 Consejo: Técnicamente, 1 KiB (kibibyte) son 1 024 bytes y 1 KB son 1 000 bytes, aunque en el día a día mucha gente usa “KB” para ambos. En el módulo 03 verás que el tamaño en bytes de cada tipo de dato de Java (
byte,int,long…) determina qué valores puede guardar.
2.5. El sistema operativo
Entre tu programa y el hardware hay una capa de software muy importante: el sistema operativo (Windows, macOS, Linux, Android…). Se encarga de:
- Cargar los programas en memoria y repartir la CPU entre todos los que se ejecutan a la vez.
- Gestionar los ficheros y carpetas del almacenamiento.
- Controlar los dispositivos de entrada y salida (drivers).
- Ofrecer a los programas servicios como “abre este fichero” o “escribe esto en pantalla”.
Cada sistema operativo ofrece esos servicios de forma distinta, y cada procesador (Intel/AMD x64, ARM de Apple o de los móviles) entiende instrucciones distintas. Como verás en la sección 7, este es justo el problema que Java resolvió de forma brillante.
3. Programa, algoritmo y lenguaje de programación
3.1. Algoritmo
📘 Concepto: Un algoritmo es una secuencia finita y ordenada de pasos precisos que resuelve un problema. No depende de ningún ordenador ni de ningún lenguaje: una receta de cocina o las instrucciones para montar un mueble son algoritmos.
Ejemplo: algoritmo para calcular la nota media de un examen con dos partes.
1. Pedir la nota de la parte teórica.
2. Pedir la nota de la parte práctica.
3. Sumar las dos notas.
4. Dividir la suma entre 2.
5. Mostrar el resultado.
Un buen algoritmo cumple tres propiedades que estudiaremos a fondo en el módulo 02:
- Finito: termina después de un número limitado de pasos.
- Preciso: cada paso indica exactamente qué hacer, sin ambigüedades (“echa un poco de sal” no es preciso).
- Definido: si lo ejecutas dos veces con los mismos datos, obtienes el mismo resultado.
3.2. Programa
📘 Concepto: Un programa es un algoritmo escrito en un lenguaje de programación, de forma que un ordenador pueda ejecutarlo. El texto que escribe el programador se llama código fuente.
El algoritmo de la nota media, escrito en Java, quedaría así (no te preocupes por entender cada palabra todavía; lo harás en los módulos 01, 03 y 04):
import java.util.Scanner;
public class NotaMedia {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Nota de teoría: ");
double teoria = teclado.nextDouble(); // paso 1
System.out.print("Nota de práctica: ");
double practica = teclado.nextDouble(); // paso 2
double media = (teoria + practica) / 2; // pasos 3 y 4
System.out.println("Nota media: " + media); // paso 5
}
}
Si lo ejecutas e introduces un 6 y un 8, verás:
Nota de teoría: 6
Nota de práctica: 8
Nota media: 7.0
Fíjate en que cada paso del algoritmo se corresponde con una o varias líneas del programa. Primero se piensa el algoritmo y después se traduce al lenguaje. Este orden (pensar antes de teclear) es la clave para programar bien.
3.3. Lenguaje de programación
📘 Concepto: Un lenguaje de programación es un lenguaje artificial, con un vocabulario (palabras reservadas como
class,if,while), una sintaxis (reglas de escritura, como terminar las sentencias con;) y una semántica (qué significa cada construcción), diseñado para expresar algoritmos que un ordenador pueda ejecutar.
A diferencia del español, un lenguaje de programación no admite ambigüedades ni faltas de ortografía. Si en lugar de System.out.println escribes system.out.println (con minúscula), el programa no funcionará. Al principio esto resulta frustrante; enseguida te acostumbrarás a leer los mensajes de error, que en el módulo 01 aprenderás a interpretar.
| Término | Qué es | Ejemplo |
|---|---|---|
| Problema | Lo que queremos resolver | Calcular la nota media |
| Algoritmo | Los pasos para resolverlo, independientes del lenguaje | Pedir, sumar, dividir, mostrar |
| Lenguaje de programación | El idioma en el que se escribe el programa | Java |
| Código fuente | El texto del programa | El fichero NotaMedia.java |
| Programa ejecutable | La forma que el ordenador puede ejecutar | NotaMedia.class + la JVM |
4. Niveles de los lenguajes de programación
La CPU solo entiende código máquina: secuencias de bits. Escribir programas directamente así sería un infierno, por eso a lo largo de la historia se han creado lenguajes cada vez más cercanos a las personas.
Figura 2. La misma operación (total = precio * cantidad) en los tres niveles de lenguaje. El código máquina es ilustrativo.
4.1. Código máquina (primera generación)
Instrucciones en binario que la CPU ejecuta directamente. Cada familia de procesadores tiene su propio juego de instrucciones: el código máquina de un procesador Intel no funciona en el ARM de un iPhone.
- Ventaja: máxima velocidad y control total del hardware.
- Inconvenientes: ilegible, propenso a errores y nada portable.
4.2. Lenguaje ensamblador (segunda generación)
Sustituye los números por mnemónicos (abreviaturas en inglés): MOV (mover), ADD (sumar), JMP (saltar). Un programa llamado ensamblador traduce cada mnemónico a su instrucción máquina, casi uno a uno.
mov eax, [precio] ; copia el valor de precio en el registro EAX
imul eax, [cantidad] ; multiplica EAX por cantidad
mov [total], eax ; guarda el resultado en total
Sigue siendo dependiente del procesador y muy laborioso. Hoy se usa en partes muy concretas: arranque de sistemas operativos, drivers, sistemas embebidos con muy pocos recursos u optimizaciones extremas.
4.3. Lenguajes de alto nivel (tercera generación y siguientes)
Se parecen al lenguaje humano y a la notación matemática, y son independientes del procesador: Fortran (1957), COBOL (1959), C (1972), C++ (1985), Python (1991), Java (1995), JavaScript (1995), PHP (1995), C# (2000), Kotlin (2011), Go (2009), Rust (2015)…
int total = precio * cantidad;
Una sola línea legible sustituye a varias instrucciones de ensamblador. Pero la CPU sigue sin entenderla: hace falta un programa traductor. Cómo se hace esa traducción es lo que distingue a los lenguajes compilados de los interpretados.
💡 Consejo: A veces oirás “lenguaje de bajo nivel” para referirse a C. Es una exageración: C es de alto nivel, pero está cerca del hardware (te deja manejar direcciones de memoria directamente). Java, en cambio, te protege de esos detalles.
5. Compilación, interpretación y JIT
Figura 3. Tres formas de ejecutar un programa escrito en un lenguaje de alto nivel.
5.1. Compilación
Un compilador es un programa que traduce todo el código fuente a código máquina antes de ejecutarlo, y genera un fichero ejecutable (en Windows, un .exe).
- Analogía: traducir un libro entero al español y después leerlo tantas veces como quieras.
- Ventajas: el ejecutable es muy rápido; el compilador detecta muchos errores antes de ejecutar; no necesitas el código fuente para ejecutar.
- Inconvenientes: el ejecutable solo funciona en el sistema operativo y procesador para el que se compiló; hay que recompilar para cada plataforma.
- Ejemplos: C, C++, Go, Rust.
5.2. Interpretación
Un intérprete lee el código fuente y lo traduce y ejecuta instrucción a instrucción, cada vez que se ejecuta el programa.
- Analogía: un intérprete simultáneo que traduce una conferencia frase a frase mientras se habla.
- Ventajas: no hay paso previo; el mismo código funciona allí donde haya un intérprete; es cómodo para probar cosas rápidamente.
- Inconvenientes: más lento (se traduce una y otra vez); muchos errores (por ejemplo, una variable mal escrita) solo aparecen cuando se llega a esa línea.
- Ejemplos: Python, PHP, Ruby, JavaScript en sus orígenes.
5.3. El modelo de Java: compilación a bytecode + JVM con JIT
Java combina lo mejor de ambos mundos en dos fases:
- Compilación a bytecode. El compilador
javactraduce tuHola.javaaHola.class. Ese fichero no contiene código máquina de ningún procesador real, sino bytecode: instrucciones para una máquina imaginaria, la Máquina Virtual de Java (JVM). En esta fase se detectan los errores de sintaxis y de tipos. - Ejecución en la JVM. La JVM carga el
.class, lo verifica y empieza a interpretar el bytecode. Mientras tanto, observa qué partes se ejecutan muchas veces (un bucle que se repite un millón de veces, un método muy usado) y las compila a código máquina nativo sobre la marcha. Esto es la compilación JIT (Just-In-Time, “justo a tiempo”).
📘 Concepto: El compilador JIT traduce a código máquina, durante la ejecución, el código “caliente” (el que más se usa) y además lo optimiza con información real de cómo se está comportando el programa. Por eso un programa Java largo va acelerándose después de arrancar, y su rendimiento final se acerca mucho al de un lenguaje compilado.
| Modelo | Traducción | Velocidad | Portabilidad | Errores detectados antes de ejecutar |
|---|---|---|---|---|
| Compilado | Toda, antes de ejecutar | Muy alta | Baja (un ejecutable por plataforma) | Muchos |
| Interpretado | Instrucción a instrucción, al ejecutar | Menor | Alta (donde haya intérprete) | Pocos |
| Java (bytecode + JIT) | A bytecode antes; a código máquina durante | Alta (tras calentar) | Muy alta (donde haya JVM) | Muchos |
💡 Consejo: La frontera hoy es difusa: JavaScript se ejecuta en navegadores con compiladores JIT muy avanzados, Python tiene compiladores a bytecode y existen herramientas como GraalVM Native Image que compilan Java directamente a un ejecutable nativo. Lo importante es entender las ideas.
6. Paradigmas de programación
Un paradigma es un estilo o forma de pensar a la hora de organizar un programa. Un mismo lenguaje puede admitir varios. Java es principalmente orientado a objetos, pero también es imperativo y estructurado y, desde Java 8, permite un estilo funcional.
| Paradigma | Idea principal | Lo verás en |
|---|---|---|
| Imperativo | El programa es una secuencia de órdenes que van cambiando el estado (las variables) | Todo el curso |
| Estructurado | Solo tres estructuras de control: secuencia, selección (if) e iteración (bucles); sin saltos arbitrarios (goto). Se divide en subprogramas | Módulos 02-09 |
| Orientado a objetos (POO) | El programa se organiza en objetos que combinan datos y comportamiento (un Alumno con su nombre y su método calcularMedia()) | Módulos 10-16 |
| Funcional | Se describen transformaciones de datos con funciones, sin modificar variables | Curso de Java Avanzado |
| Declarativo / lógico | Se describe qué se quiere, no cómo obtenerlo (SQL, Prolog) | Curso de Bases de Datos |
6.1. El teorema de la programación estructurada
En 1966, Böhm y Jacopini demostraron que cualquier algoritmo puede escribirse usando solo tres estructuras: secuencia, selección e iteración. En los años 70, Edsger Dijkstra popularizó la idea de abandonar las instrucciones goto (saltar a cualquier línea), que generaban programas imposibles de seguir (el famoso “código espagueti”). Toda la primera parte de este curso sigue esta forma de programar.
6.2. Imperativo frente a funcional en Java
💻 Ejemplo: El mismo cálculo (sumar los números del 1 al 10) en dos estilos. No hace falta que entiendas todavía la sintaxis; fíjate en la diferencia de enfoque.
import java.util.stream.IntStream;
public class Paradigmas {
public static void main(String[] args) {
// Estilo imperativo/estructurado: decimos CÓMO hacerlo, paso a paso
int suma = 0;
for (int i = 1; i <= 10; i++) {
suma = suma + i;
}
System.out.println("Imperativo: " + suma);
// Estilo funcional: decimos QUÉ queremos (la suma del rango 1..10)
int sumaFuncional = IntStream.rangeClosed(1, 10).sum();
System.out.println("Funcional: " + sumaFuncional);
}
}
Salida:
Imperativo: 55
Funcional: 55
En este curso empezarás por el estilo imperativo y estructurado, porque es el que te enseña a pensar los algoritmos paso a paso. Después pasarás a la orientación a objetos, que es la forma de organizar programas grandes.
7. Historia de Java
7.1. Del Green Project a Java
- 1991. En Sun Microsystems, un pequeño equipo dirigido por James Gosling (junto a Mike Sheridan y Patrick Naughton) inicia el Green Project. El objetivo: crear software para electrodomésticos y dispositivos de consumo (descodificadores de televisión, mandos…). Necesitaban un lenguaje que funcionara en chips muy distintos sin reescribir el código.
- Gosling crea un lenguaje inspirado en C y C++, pero más sencillo y seguro, al que llama Oak (roble), por el árbol que veía desde la ventana de su oficina.
- 1992. El equipo presenta el *7 (Star Seven), un mando a distancia con pantalla táctil programado en Oak. Técnicamente era impresionante, pero el mercado de la televisión interactiva no estaba preparado.
- 1994-1995. Llega la explosión de la World Wide Web. El equipo se da cuenta de que su lenguaje, pensado para funcionar en cualquier dispositivo, es perfecto para una red donde se conectan ordenadores de todo tipo. Como “Oak” era ya una marca registrada, se renombra como Java (en honor al café de la isla de Java, de ahí el logotipo de la taza humeante).
- 23 de mayo de 1995. Sun presenta oficialmente Java en la conferencia SunWorld, junto con el navegador HotJava, capaz de ejecutar pequeños programas Java dentro de las páginas web (los applets). Poco después, Netscape anuncia que su navegador también los soportará.
- Enero de 1996. Se publica JDK 1.0.
7.2. Evolución: de Sun a Oracle
- 2006-2007. Sun publica el código de Java como software libre (licencia GPL) en el proyecto OpenJDK, que hoy es la base de todas las distribuciones de Java.
- 2010. Oracle completa la compra de Sun Microsystems y pasa a dirigir la evolución de Java, junto con la comunidad de OpenJDK y el JCP (Java Community Process), el organismo donde empresas y particulares acuerdan las especificaciones.
- 2017-2018. Con Java 9 y 10 cambia el modelo de publicación: una versión nueva cada seis meses.
💡 Consejo: Java y JavaScript no tienen nada que ver, salvo el nombre y algo de sintaxis heredada de C. El nombre “JavaScript” fue una decisión de marketing de Netscape en 1995 para aprovechar la popularidad de Java.
7.3. Tabla de versiones
| Versión | Fecha | Novedades destacadas |
|---|---|---|
| JDK 1.0 | enero 1996 | Primera versión: lenguaje, applets, AWT |
| JDK 1.1 | febrero 1997 | Clases internas, JDBC (bases de datos), reflexión |
| J2SE 1.2 | diciembre 1998 | Colecciones, Swing (interfaces gráficas), compilador JIT incluido |
| J2SE 1.3 | mayo 2000 | Máquina virtual HotSpot por defecto |
| J2SE 1.4 | febrero 2002 | assert, expresiones regulares, NIO |
| J2SE 5.0 | septiembre 2004 | Genéricos, enum, autoboxing, bucle for-each, anotaciones |
| Java SE 6 | diciembre 2006 | Mejoras de rendimiento y de la API |
| Java SE 7 | julio 2011 | try-with-resources, operador diamante <>, switch con String |
| Java SE 8 (LTS) | marzo 2014 | Expresiones lambda, streams, API de fechas java.time |
| Java SE 9 | septiembre 2017 | Sistema de módulos, JShell |
| Java SE 10 | marzo 2018 | var (inferencia de tipos). Empieza la cadencia semestral |
| Java SE 11 (LTS) | septiembre 2018 | Cliente HTTP, ejecutar java Programa.java sin compilar antes |
| Java SE 14 | marzo 2020 | Expresiones switch |
| Java SE 15 | septiembre 2020 | Text blocks (cadenas multilínea) |
| Java SE 16 | marzo 2021 | Records |
| Java SE 17 (LTS) | septiembre 2021 | Clases selladas (sealed) |
| Java SE 21 (LTS) | septiembre 2023 | Hilos virtuales, pattern matching en switch, record patterns, colecciones secuenciadas |
| Java SE 22 | marzo 2024 | Variables sin nombre _, programas de varios ficheros sin compilar |
| Java SE 23 | septiembre 2024 | Comentarios de documentación en Markdown |
| Java SE 24 | marzo 2025 | Stream gatherers |
| Java SE 25 (LTS) | septiembre 2025 | Ficheros fuente compactos con void main(), clase IO, import module, cuerpos de constructor flexibles, scoped values |
| Java SE 26 | marzo 2026 | Cliente HTTP/3, eliminación definitiva de la API de applets |
| Java SE 27 | septiembre 2026 | G1 como recolector por defecto en todos los entornos, cabeceras de objeto compactas por defecto |
📘 Concepto: Hasta la versión 1.4 se usaba la numeración “1.x”. A partir de la 5.0 se abandonó el “1.” en el nombre comercial (aunque internamente Java 8 seguía siendo “1.8”). Desde Java 9, la versión es simplemente un número: 9, 10, 11… 25.
7.4. Cadencia semestral y versiones LTS
Desde 2018 se publica una versión de Java cada seis meses, en marzo y septiembre. Cada versión trae pocas novedades, pero llegan antes y de forma predecible.
No todas las versiones son iguales:
- Versiones LTS (Long-Term Support, soporte a largo plazo): reciben actualizaciones de seguridad y correcciones durante muchos años (Oracle y otros proveedores las mantienen al menos 8 años). Son las que usan las empresas en producción. Desde Java 17 hay una LTS cada dos años: 17 (2021), 21 (2023), 25 (2025), y la siguiente prevista es la 29 (2027).
- Versiones no LTS (22, 23, 24, 26, 27…): solo reciben actualizaciones durante seis meses, hasta que sale la siguiente. Sirven para probar novedades.
⚠️ Importante: Este curso usa Java 25, la LTS actual. En septiembre de 2026 salió Java 27, que es más reciente pero no es LTS. Todo lo que aprendas con Java 25 funciona igual en Java 27. Si en una empresa te encuentras con Java 17 o 21, también podrás trabajar sin problema: los fundamentos no cambian.
7.5. Características preview e incubadoras
Algunas novedades aparecen primero como preview (vista previa): están completas pero pueden cambiar, y para usarlas hay que activar la opción --enable-preview. Así la comunidad las prueba antes de que sean definitivas. Por ejemplo, los ficheros fuente compactos con void main() estuvieron en preview desde Java 21 hasta que fueron definitivos en Java 25. Otras, como la concurrencia estructurada, siguen en preview en Java 25, 26 y 27. En este curso solo usaremos características definitivas.
8. Características de Java
Cuando Sun presentó Java, lo describió con una lista de cualidades que siguen siendo válidas:
| Característica | Qué significa |
|---|---|
| Sencillo | Sintaxis parecida a C/C++ pero sin sus partes más peligrosas (punteros, gestión manual de memoria, herencia múltiple de clases) |
| Orientado a objetos | Todo el código se organiza en clases y objetos |
| Portable / independiente de la plataforma | El mismo .class funciona en cualquier sistema con una JVM: “Write once, run anywhere” |
| Robusto | Tipado estricto, comprobaciones del compilador, excepciones para gestionar errores, sin acceso directo a la memoria |
| Seguro | La JVM verifica el bytecode antes de ejecutarlo y controla lo que puede hacer el programa |
| Gestión automática de memoria | El recolector de basura (garbage collector) libera la memoria de los objetos que ya no se usan |
| Multihilo | Permite ejecutar varias tareas a la vez (hilos), integrado en el lenguaje desde el principio |
| Alto rendimiento | Gracias al compilador JIT |
| Gran biblioteca estándar | Miles de clases listas para usar: textos, fechas, colecciones, ficheros, red, bases de datos… |
| Compatibilidad hacia atrás | Un programa escrito para Java 8 suele funcionar sin cambios en Java 25 |
8.1. “Write once, run anywhere”
Este es el lema más famoso de Java: escribe una vez, ejecuta en cualquier parte. Tú compilas tu programa una sola vez y el .class resultante funciona en Windows, macOS, Linux o en un servidor, siempre que haya una JVM instalada. Es la JVM de cada sistema la que se encarga de traducir el bytecode al código máquina de ese procesador.
Figura 4. El fichero Hola.class es el mismo para todos los sistemas; lo que cambia es la JVM.
💻 Ejemplo: Este programa muestra información del sistema en el que se está ejecutando:
public class DondeEstoy {
public static void main(String[] args) {
// System.getProperty consulta datos del entorno en el que se ejecuta la JVM
System.out.println("Versión de Java: " + System.getProperty("java.version"));
System.out.println("Fabricante: " + System.getProperty("java.vendor"));
System.out.println("Sistema: " + System.getProperty("os.name"));
System.out.println("Arquitectura: " + System.getProperty("os.arch"));
System.out.println("Procesadores: " + Runtime.getRuntime().availableProcessors());
}
}
Ejecutado en un contenedor Linux con el JDK 25 de Eclipse Temurin:
Versión de Java: 25.0.4.1
Fabricante: Eclipse Adoptium
Sistema: Linux
Arquitectura: amd64
Procesadores: 8
Y el mismo fichero, sin cambiar ni una letra, en un portátil con Windows 11 y otro JDK:
Versión de Java: 21.0.4
Fabricante: Oracle Corporation
Sistema: Windows 11
Arquitectura: amd64
Procesadores: 12
9. La plataforma Java: JVM, bytecode, JRE y JDK
Estos cuatro términos aparecen constantemente y es normal confundirlos al principio. Vamos uno por uno.
Figura 5. Relación entre JDK, JRE y JVM.
9.1. Bytecode
📘 Concepto: El bytecode es el código intermedio que genera
javac. Son instrucciones sencillas para la JVM, guardadas en ficheros.class. Se llama así porque cada código de operación ocupa un byte.
Puedes ver el bytecode de cualquier clase con la herramienta javap -c, incluida en el JDK. Para este programa:
public class Suma {
public static void main(String[] args) {
int precio = 12;
int cantidad = 3;
int total = precio * cantidad;
System.out.println(total);
}
}
Al compilarlo con javac Suma.java y ejecutar javap -c Suma, el JDK 25 muestra (fragmento del método main):
public static void main(java.lang.String[]);
Code:
0: bipush 12
2: istore_1
3: iconst_3
4: istore_2
5: iload_1
6: iload_2
7: imul
8: istore_3
9: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_3
13: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
16: return
Aunque parezca críptico, se puede leer: bipush 12 mete el número 12 en la pila de operandos; istore_1 lo guarda en la variable 1 (precio); iconst_3 e istore_2 hacen lo mismo con el 3 (cantidad); iload_1 e iload_2 cargan ambos valores, imul los multiplica (integer multiply), istore_3 guarda el resultado en total, y las últimas instrucciones llaman a println.
💡 Consejo: Nunca tendrás que escribir bytecode a mano. Pero saber que existe te ayuda a entender por qué Java es portable y por qué a veces verás errores como
UnsupportedClassVersionError(lo vemos en la sección 9.6).
Todo fichero .class empieza con los mismos cuatro bytes, el “número mágico” CA FE BA BE (en hexadecimal; “cafe babe”), un guiño de sus creadores al café. Los siguientes bytes indican la versión del formato: en Java 25 es la 69 (00 45 en hexadecimal).
9.2. JVM (Java Virtual Machine)
📘 Concepto: La JVM es un programa que simula un ordenador capaz de ejecutar bytecode. Hay una JVM distinta para cada sistema operativo y procesador, pero todas ejecutan el mismo bytecode de la misma forma.
Sus partes principales:
- Cargador de clases (class loader): busca y carga en memoria los
.classque necesita el programa, cuando los necesita. - Verificador de bytecode: comprueba que el código es válido y seguro (que no accede a memoria que no le corresponde, por ejemplo).
- Motor de ejecución: el intérprete y el compilador JIT. La JVM más usada, HotSpot, se llama así precisamente porque detecta los “puntos calientes” del código para compilarlos.
- Recolector de basura (garbage collector, GC): libera automáticamente la memoria de los objetos que ya no se usan. En C tendrías que hacerlo tú a mano, y olvidarlo es una fuente de errores graves.
La especificación de la JVM es pública, y por eso existen otros lenguajes que se compilan a bytecode y se ejecutan en ella: Kotlin (el lenguaje recomendado para Android), Scala, Groovy o Clojure.
9.3. JRE (Java Runtime Environment)
El JRE es el entorno de ejecución: la JVM más la biblioteca estándar de Java (las miles de clases ya hechas como String, Scanner, ArrayList, Math…). Es lo mínimo que necesita un ordenador para ejecutar programas Java, pero no para crearlos.
⚠️ Importante: Desde Java 11, Oracle ya no distribuye un JRE por separado: se instala el JDK completo o se genera un entorno de ejecución a medida con la herramienta
jlink. Algunas distribuciones (como Eclipse Temurin) siguen ofreciendo paquetes JRE, pero tú, como programador, siempre instalarás el JDK.
9.4. JDK (Java Development Kit)
El JDK es el kit de desarrollo: el JRE más las herramientas para programar. Las que usarás en el curso:
| Herramienta | Para qué sirve | Módulo |
|---|---|---|
javac | Compilar: .java → .class | 01 |
java | Lanzar la JVM y ejecutar un programa (o un .java directamente) | 01 |
jshell | Consola interactiva para probar código línea a línea | 01 |
javadoc | Generar documentación HTML a partir de los comentarios | 20 |
jar | Empaquetar muchas clases en un único fichero .jar | 20 |
javap | Ver el contenido de un .class (como el bytecode de antes) | 00 |
jdb | Depurador en modo texto (en la práctica usarás el del IDE) | 19 |
9.5. Resumen: ¿qué necesito?
| Si quieres… | Necesitas | Ejemplo |
|---|---|---|
| Ejecutar una aplicación Java ya hecha | Un entorno de ejecución (JRE o un runtime de jlink) | Un usuario que juega a Minecraft Java Edition |
| Escribir, compilar y ejecutar programas Java | El JDK | Tú en este curso |
| Entender cómo se ejecuta el bytecode | Conocer la JVM | Para depurar problemas de rendimiento o de memoria |
9.6. Versiones de bytecode e incompatibilidades
Cada versión de Java genera bytecode con un número de versión (Java 21 → 65, Java 25 → 69, Java 27 → 71). Una JVM puede ejecutar bytecode de su versión o anteriores, pero no de versiones posteriores. Si compilas con el JDK 25 y ejecutas en una JVM 21, obtendrás este error real:
Error: LinkageError occurred while loading main class Hola
java.lang.UnsupportedClassVersionError: Hola has been compiled by a more recent version of the Java Runtime (class file version 69.0), this version of the Java Runtime only recognizes class file versions up to 65.0
El mensaje lo dice todo: la clase se compiló con la versión 69.0 (Java 25) y esa JVM solo reconoce hasta la 65.0 (Java 21). La solución es ejecutar con una JVM igual o más moderna que el compilador.
💡 Consejo: Si te pasa en clase, casi siempre es porque tienes dos JDK instalados y
javacyjavaapuntan a versiones distintas. En el módulo 01 verás cómo comprobarlo conjava -versionyjavac -versiony cómo configurarJAVA_HOMEyPATH.
10. Distribuciones del JDK
Como Java es software libre (OpenJDK), varias empresas y fundaciones compilan y publican su propia distribución del JDK. Todas se construyen a partir del mismo código de OpenJDK y pasan las mismas pruebas de compatibilidad, así que un programa funciona igual con cualquiera de ellas. Lo que cambia es quién las mantiene, la licencia y durante cuánto tiempo publican actualizaciones.
| Distribución | Mantenida por | Comentario |
|---|---|---|
| Eclipse Temurin | Fundación Eclipse (proyecto Adoptium) | Gratuita y de código abierto, con soporte LTS. La recomendada en este curso |
| Oracle JDK | Oracle | La “oficial” de Oracle. Gratuita según sus términos de licencia (NFTC); consulta las condiciones si la vas a usar en una empresa |
| Oracle OpenJDK builds | Oracle (jdk.java.net) | Gratuitas (GPL), pero solo se actualizan durante 6 meses por versión |
| Amazon Corretto | Amazon | Gratuita, muy usada en AWS |
| Microsoft Build of OpenJDK | Microsoft | Gratuita, usada en Azure |
| Azul Zulu | Azul Systems | Gratuita, con soporte comercial opcional |
| BellSoft Liberica | BellSoft | Gratuita; incluye variantes con JavaFX |
| Red Hat build of OpenJDK | Red Hat | Integrada en Red Hat Enterprise Linux |
| GraalVM | Oracle | JDK con compilador avanzado y generación de ejecutables nativos |
💡 Consejo: Para aprender, cualquiera vale. Elige una distribución LTS (versión 25) de Temurin o de Oracle y no te preocupes más. IntelliJ IDEA, además, puede descargar cualquiera de ellas por ti con un par de clics (lo verás en el módulo 01).
11. ¿Dónde se usa Java hoy?
Java lleva tres décadas entre los lenguajes más usados del mundo. Algunos ejemplos de dónde lo encontrarás:
| Ámbito | Ejemplos |
|---|---|
| Aplicaciones empresariales (backend) | Bancos, aseguradoras, administraciones públicas, comercio electrónico. Frameworks como Spring Boot (lo verás en el Curso de Java Avanzado) |
| Android | El sistema y muchas aplicaciones se programan en Java y Kotlin, ambos sobre la plataforma Java |
| Big data y sistemas distribuidos | Apache Hadoop, Apache Kafka, Elasticsearch, Apache Cassandra, Apache Spark (en Scala, sobre la JVM) |
| Herramientas de desarrollo | IntelliJ IDEA, Eclipse, NetBeans, Maven, Gradle o Jenkins están escritos en Java |
| Videojuegos | Minecraft: Java Edition |
| Servicios en la nube | Microservicios en AWS, Azure o Google Cloud |
| Sistemas embebidos y tarjetas | Java Card en tarjetas SIM y bancarias, dispositivos industriales |
| Ciencia y educación | Simulaciones, procesamiento de datos y, por supuesto, la enseñanza de la programación |
📘 Concepto: Aprender Java no solo te sirve para Java. Los conceptos (variables, condicionales, bucles, métodos, clases, objetos, excepciones, colecciones) son los mismos en C#, Kotlin, TypeScript, Python o C++. Cambia la sintaxis, pero la forma de pensar es la misma.
12. Ciclo de vida del desarrollo de un programa
Un programa profesional no se escribe “de golpe”. Pasa por varias fases, que forman el ciclo de vida del desarrollo del software.
Figura 6. Fases del ciclo de vida del desarrollo de un programa.
| Fase | Pregunta que responde | Resultado | En este curso |
|---|---|---|---|
| 1. Análisis | ¿Qué tiene que hacer el programa? | Lista de requisitos: entradas, salidas, reglas | Leer bien el enunciado de cada ejercicio |
| 2. Diseño | ¿Cómo lo va a hacer? | Algoritmos (pseudocódigo, diagramas de flujo), diagramas UML | Módulos 02 y 18 |
| 3. Codificación | Escribir el programa | Código fuente en Java | Todo el curso |
| 4. Pruebas | ¿Funciona en todos los casos? | Errores encontrados y corregidos | Trazas (módulo 02), JUnit y depuración (módulo 19) |
| 5. Despliegue / explotación | Ponerlo en manos de los usuarios | Programa instalado y en uso | Proyecto final (módulo 21) |
| 6. Mantenimiento | Corregir, adaptar y mejorar | Nuevas versiones | Refactorización (módulo 20) |
12.1. Un ejemplo completo
Enunciado: “Necesitamos un programa que calcule el precio final de un producto aplicando el IVA del 21 %”.
- Análisis. Entrada: el precio sin IVA (un número con decimales). Salida: el precio con IVA. Regla: precio final = precio × 1,21. Casos especiales: ¿y si el precio es negativo? Hay que preguntarlo al cliente: decidimos que se mostrará un aviso.
- Diseño. Algoritmo: leer precio; si es negativo, mostrar aviso; si no, calcular
precio * 1.21y mostrarlo. - Codificación. Escribir el programa en Java (sabrás hacerlo al terminar el módulo 05).
- Pruebas. Probar con 100 (debe dar 121), con 0 (debe dar 0), con 19,99 (debe dar 24,19 redondeado) y con −5 (debe mostrar el aviso).
- Despliegue. Entregar el programa al cliente.
- Mantenimiento. Meses después, el cliente pide que también calcule el IVA reducido del 10 %: se vuelve a la fase de análisis.
⚠️ Importante: El error más común de quien empieza es saltar directamente a la codificación. Si no has entendido bien el problema (análisis) ni sabes cómo resolverlo (diseño), teclear no te va a ayudar. Dedica tiempo a pensar con papel y lápiz.
12.2. Modelos de ciclo de vida
Las fases se pueden organizar de distintas formas:
- En cascada: cada fase empieza cuando termina la anterior. Sencillo, pero poco flexible ante cambios.
- Iterativo e incremental: se repite el ciclo completo muchas veces, cada vez añadiendo funcionalidad.
- Metodologías ágiles (Scrum, Kanban): ciclos cortos de una a cuatro semanas con entregas frecuentes y contacto continuo con el cliente. Son las más usadas hoy en las empresas.
12.3. Tipos de errores
Durante el desarrollo te encontrarás con tres tipos de errores:
| Tipo | Cuándo aparece | Ejemplo | Quién lo detecta |
|---|---|---|---|
| De compilación (sintácticos) | Al compilar con javac | Olvidar un ; o escribir Sytem en vez de System | El compilador, que te dice la línea |
| De ejecución | Mientras se ejecuta | Dividir un entero entre cero, leer una letra donde se esperaba un número | La JVM, que lanza una excepción |
| Lógicos | El programa funciona pero da un resultado incorrecto | Calcular la media como a + b / 2 en lugar de (a + b) / 2 | Tú, con pruebas |
Los errores lógicos son los más peligrosos, porque nadie te avisa. Por eso las pruebas son una fase tan importante.
13. Ejercicios
Estos ejercicios son principalmente conceptuales: el objetivo es que fijes las ideas de este módulo. En el módulo 01 empezarás a programar.
Ejercicio 1: Clasifica los componentes
Indica si cada elemento es un dispositivo de entrada (E), de salida (S), de entrada/salida (E/S), almacenamiento (A) o parte de la CPU/memoria (C): teclado, monitor, pantalla táctil, memoria RAM, SSD, ALU, impresora, micrófono, tarjeta de red, pendrive USB, registros, altavoces.
Ver solución
| Elemento | Tipo | Explicación |
|---|---|---|
| Teclado | E | Introduce datos |
| Monitor | S | Muestra resultados |
| Pantalla táctil | E/S | Muestra imágenes y recoge pulsaciones |
| Memoria RAM | C | Memoria principal: programa y datos en ejecución |
| SSD | A | Almacenamiento permanente |
| ALU | C | Parte de la CPU que hace los cálculos |
| Impresora | S | Saca resultados en papel (las multifunción con escáner serían E/S) |
| Micrófono | E | Introduce sonido |
| Tarjeta de red | E/S | Envía y recibe datos |
| Pendrive USB | A | Almacenamiento permanente extraíble |
| Registros | C | Memoria ultrarrápida dentro de la CPU |
| Altavoces | S | Emiten sonido |
La clave para distinguir RAM de almacenamiento: la RAM es volátil y la usa la CPU directamente; el almacenamiento es permanente y guarda ficheros.
Ejercicio 2: Un algoritmo cotidiano
Escribe un algoritmo, en pasos numerados, para sacar dinero de un cajero automático. Después revísalo: ¿qué pasa si el PIN es incorrecto? ¿Y si no hay saldo suficiente? Reescríbelo para que tenga en cuenta esos casos.
Ver solución
Primera versión (la que escribe casi todo el mundo):
1. Introducir la tarjeta.
2. Teclear el PIN.
3. Elegir "Retirar efectivo".
4. Teclear la cantidad.
5. Recoger el dinero.
6. Recoger la tarjeta.
Versión mejorada, teniendo en cuenta los casos especiales:
1. Introducir la tarjeta.
2. Teclear el PIN.
3. Si el PIN es incorrecto:
3.1. Si es el tercer intento fallido, el cajero retiene la tarjeta y termina.
3.2. Si no, volver al paso 2.
4. Elegir "Retirar efectivo".
5. Teclear la cantidad.
6. Si la cantidad es mayor que el saldo disponible:
6.1. Mostrar "Saldo insuficiente" y volver al paso 5.
7. Recoger la tarjeta.
8. Recoger el dinero.
9. Fin.
Observa tres ideas que desarrollaremos en el módulo 02: aparecen decisiones (“si…”), repeticiones (“volver al paso 2”) y el algoritmo debe ser finito (por eso se limita el número de intentos del PIN). Fíjate también en que los cajeros reales devuelven la tarjeta antes que el dinero, para que nadie se la olvide: ¡el orden de los pasos importa!
Ejercicio 3: ¿Compilado, interpretado o híbrido?
Para cada situación, indica si describe un lenguaje compilado, interpretado o el modelo híbrido de Java:
- El programa se distribuye como un
.exeque solo funciona en Windows. - Para ejecutar el programa hace falta tener instalado el código fuente y un programa que lo lea línea a línea.
- El código se traduce a un formato intermedio que se puede ejecutar en cualquier sistema con la máquina virtual adecuada.
- Un error de escritura en una línea que solo se ejecuta los domingos no se descubre hasta un domingo.
- Mientras el programa se ejecuta, las partes más usadas se traducen a código máquina para ir más rápido.
Ver solución
- Compilado. El compilador genera código máquina para un sistema y procesador concretos.
- Interpretado. El intérprete necesita el código fuente en cada ejecución.
- Híbrido (Java). El formato intermedio es el bytecode y la máquina virtual es la JVM.
- Interpretado. En un lenguaje compilado (o en Java), el compilador detectaría el error de sintaxis antes de ejecutar nada, sin importar el día.
- Híbrido con JIT. Es lo que hace la JVM HotSpot con el código “caliente”.
Ejercicio 4: JDK, JRE o JVM
Responde a cada pregunta con JDK, JRE o JVM:
- ¿Qué contiene el compilador
javac? - ¿Qué pieza traduce el bytecode al código máquina del procesador?
- ¿Qué necesita como mínimo un usuario que solo quiere ejecutar una aplicación Java ya hecha?
- ¿Qué debes instalar para seguir este curso?
- ¿Dónde está el recolector de basura?
- ¿Dónde está la clase
Stringde la biblioteca estándar?
Ver solución
- JDK. Las herramientas de desarrollo (
javac,jshell,javadoc…) solo están en el JDK. - JVM, mediante su intérprete y su compilador JIT.
- Un JRE (o un entorno de ejecución generado con
jlink). Hoy muchas aplicaciones incluyen su propio entorno de ejecución dentro del instalador. - El JDK (versión 25).
- En la JVM.
- En la biblioteca estándar, que forma parte del JRE (y, por tanto, también del JDK, que lo contiene).
Ejercicio 5: Calendario de versiones
Sabiendo que Java publica una versión cada seis meses (marzo y septiembre) y una LTS cada dos años desde Java 17 (septiembre de 2021):
- ¿En qué mes y año se espera Java 28?
- ¿Cuál será la próxima LTS después de Java 25 y cuándo se espera?
- Una empresa usa Java 21 en producción. ¿Por qué no ha actualizado a Java 22, 23 o 24?
Ver solución
- Java 27 salió en septiembre de 2026, así que Java 28 se espera en marzo de 2027.
- Las LTS van de cuatro en cuatro versiones (17, 21, 25…), así que la siguiente será Java 29, prevista para septiembre de 2027.
- Porque 22, 23 y 24 no son LTS: solo recibieron actualizaciones de seguridad durante seis meses. Una empresa prefiere saltar de LTS en LTS (de 21 a 25), porque así tiene años de actualizaciones garantizadas y no necesita migrar cada seis meses.
Ejercicio 6: Leer bytecode
Este programa calcula el área de un triángulo:
public class Triangulo {
public static void main(String[] args) {
int base = 10;
int altura = 4;
int area = base * altura / 2;
System.out.println(area);
}
}
Este es el bytecode real de su método main (obtenido con javap -c Triangulo):
0: bipush 10
2: istore_1
3: iconst_4
4: istore_2
5: iload_1
6: iload_2
7: imul
8: iconst_2
9: idiv
10: istore_3
11: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
14: iload_3
15: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
18: return
- ¿Qué instrucciones corresponden a la línea
int area = base * altura / 2;? - ¿Qué crees que significa
idiv? - ¿Qué mostrará el programa?
Ver solución
- Las instrucciones de la 5 a la 10:
iload_1(cargabase),iload_2(cargaaltura),imul(multiplica: 40),iconst_2(carga la constante 2),idiv(divide: 20) eistore_3(guarda el resultado en la variable 3, que esarea). - Integer divide: división entera. La
iinicial de muchas instrucciones significa que trabajan con enteros (int). - Muestra
20. Compilado y ejecutado con el JDK 25:
20
Fíjate en que las operaciones se hacen en el mismo orden en que las lees en Java (primero la multiplicación y luego la división, de izquierda a derecha). En el módulo 03 estudiarás la precedencia de operadores, que decide ese orden.
Ejercicio 7: Clasifica los errores
Indica si cada uno es un error de compilación, de ejecución o lógico:
- Escribir
int edad = 18sin el punto y coma final. - Un programa que calcula el precio con IVA multiplica por
0.21en lugar de por1.21. - El programa pide un número y el usuario escribe “hola”.
- Escribir
Sytem.out.println("Hola");. - Un programa que debía mostrar los números del 1 al 10 muestra del 1 al 9.
Ver solución
- De compilación.
javacresponde conerror: ';' expectedindicando la línea. - Lógico. El programa funciona, pero muestra solo el importe del IVA en lugar del precio final.
- De ejecución. El programa compila, pero al intentar convertir “hola” en número la JVM lanza una excepción (
InputMismatchException, la verás en el módulo 04). - De compilación. El compilador no conoce nada llamado
Sytem; como va seguido de un punto, supone que es un paquete y respondepackage Sytem does not exist(lo verás en el módulo 01). - Lógico. Típico error “por uno” (off-by-one), probablemente por usar
<en lugar de<=en un bucle (módulo 06).
Ejercicio 8 (propuesto): Tu ordenador
Averigua las características de tu ordenador (en Windows: Configuración → Sistema → Información; en macOS: menú Apple → Acerca de este Mac; en Linux: lscpu y free -h): modelo de procesador, número de núcleos, cantidad de RAM y capacidad del almacenamiento. Relaciona cada dato con una caja de la figura 1.
Ejercicio 9 (propuesto): Receta precisa
Escribe el algoritmo para preparar un vaso de cacao con leche con el nivel de precisión que necesitaría un robot que no sabe nada de cocina. Después, pide a otra persona que lo siga literalmente y apunta los pasos que resultaron ambiguos.
Ejercicio 10 (propuesto): Línea del tiempo
Dibuja una línea del tiempo desde 1991 hasta hoy con los hitos de Java: Green Project, Oak, presentación de Java, JDK 1.0, OpenJDK, compra por Oracle, inicio de la cadencia semestral y todas las versiones LTS. Marca la versión que usa el curso.
Ejercicio 11 (propuesto): Busca Java a tu alrededor
Busca tres aplicaciones o servicios que uses habitualmente y averigua (en su web, en ofertas de empleo de la empresa o en artículos técnicos) si utilizan Java o algún lenguaje de la JVM (Kotlin, Scala). Indica la fuente donde lo has encontrado.
Ejercicio 12 (propuesto): Ciclo de vida de una aplicación
Para el enunciado “Aplicación que gestiona el préstamo de libros de la biblioteca del instituto”, escribe qué se haría en cada una de las seis fases del ciclo de vida. En la fase de análisis, enumera al menos cinco requisitos y dos casos especiales (por ejemplo, ¿qué pasa si alguien intenta llevarse un libro que ya está prestado?).
Ejercicio 13 (propuesto): Paradigmas
Explica con tus palabras la diferencia entre el paradigma imperativo y el declarativo usando un ejemplo de la vida real (por ejemplo, pedir un taxi indicando cada giro frente a decir solo la dirección de destino). ¿A qué paradigma pertenece SQL? ¿Y Java?
Resumen
| Concepto | Idea clave |
|---|---|
| Arquitectura de von Neumann | CPU + memoria (programa y datos juntos) + E/S + almacenamiento, unidos por el bus |
| CPU | Unidad de control + ALU + registros; ciclo búsqueda-decodificación-ejecución |
| RAM frente a almacenamiento | RAM: rápida y volátil (programa en ejecución). Almacenamiento: permanente (ficheros) |
| Algoritmo | Secuencia finita, precisa y definida de pasos que resuelve un problema |
| Programa | Algoritmo escrito en un lenguaje de programación (código fuente) |
| Niveles de lenguaje | Código máquina → ensamblador → alto nivel (Java) |
| Compilador | Traduce todo el programa a código máquina antes de ejecutar |
| Intérprete | Traduce y ejecuta instrucción a instrucción |
| Bytecode | Código intermedio de Java (.class), igual para todos los sistemas |
| JIT | La JVM compila a código máquina, durante la ejecución, el código más usado |
| JVM | Máquina virtual que ejecuta bytecode; una por cada sistema |
| JRE | JVM + biblioteca estándar: lo necesario para ejecutar |
| JDK | JRE + herramientas (javac, java, jshell, javadoc…): lo necesario para programar |
| Write once, run anywhere | Se compila una vez; el .class funciona en cualquier JVM |
| Versiones | Una cada seis meses; LTS cada dos años: 17, 21, 25 (la del curso), 29… |
| Distribuciones | Temurin, Oracle JDK, Corretto, Microsoft, Zulu, Liberica…: todas basadas en OpenJDK |
| Paradigmas | Imperativo, estructurado, orientado a objetos, funcional, declarativo |
| Ciclo de vida | Análisis → diseño → codificación → pruebas → despliegue → mantenimiento |
| Tipos de errores | De compilación, de ejecución y lógicos |