Programación · n.º 7 entre los lenguajes más usados

Aprende Java desde cero

Robusto y multiplataforma: aplicaciones de empresa, servidores y Android.

  • 10 lecciones
  • 10 ejercicios interactivos
  • 19 conceptos clave
  • 27,6 % lo usa*

Qué es Java y para qué sirve

Java compila tu código a bytecode, que ejecuta la máquina virtual de Java (JVM) en cualquier sistema. Es uno de los lenguajes más usados en empresas y bancos, en servidores y en el ecosistema de Android. Es más estricto que Python o JavaScript, y eso ayuda a detectar errores pronto.

  • Aplicaciones de empresa y servidores
  • Aplicaciones Android
  • Procesamiento de datos a gran escala

Para empezar: Instala un JDK (por ejemplo, desde dev.java). Los fragmentos de las lecciones puedes probarlos en jshell, la consola interactiva que viene con el JDK, o dentro del main del primer ejemplo.

Nivel 1 Básico

Lección 1 · Básico

Tu primer programa

En Java todo el código vive dentro de una clase, y el programa empieza en el método main. System.out.println() escribe una línea en la consola.

El compilador javac traduce el código a bytecode y la JVM lo ejecuta. Desde Java 11 puedes hacer las dos cosas de una vez con java Main.java.

Ejemplo práctico
// Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println("¡Hola, mundo!");
        System.out.println(2 + 3); // 5
    }
}

// En la terminal: java Main.java

Ejercicio

Completa la instrucción que escribe una línea.

System.out.("Hola");
Ver la solución

Respuesta: println. System.out.println() escribe el texto y salta de línea.

Lección 2 · Básico

Variables y tipos

Java es de tipado estático: cada variable tiene un tipo fijo. Los más comunes son int (enteros), double (decimales), boolean y String (texto, con comillas dobles).

Con var el compilador deduce el tipo a partir del valor, pero sigue siendo fijo: no puedes guardar después un texto en una variable que empezó siendo un número.

Ejemplo práctico
int unidades = 3;
double precio = 19.99;
boolean enStock = true;
String producto = "Auriculares";
var total = unidades * precio;   // double

System.out.println(producto + ": " + total);

Ejercicio

¿Qué tipo usarías para guardar 19,99?

Ver la solución

Respuesta: double. int solo guarda enteros; para decimales se usa double.

Lección 3 · Básico

Condiciones y switch

if y else funcionan como en otros lenguajes, con la condición entre paréntesis y el bloque entre llaves. Los textos se comparan con .equals(), no con ==.

La expresión switch con flechas (Java 14 o posterior) elige un valor según varios casos de forma compacta.

Ejemplo práctico
String dia = "sábado";

if (dia.equals("sábado") || dia.equals("domingo")) {
    System.out.println("Fin de semana");
}

int horas = switch (dia) {
    case "sábado", "domingo" -> 0;
    case "viernes" -> 6;
    default -> 8;
};

Ejercicio

¿Cómo se comprueba si dos textos son iguales en Java?

Ver la solución

Respuesta: a.equals(b). == compara si son el mismo objeto en memoria; .equals() compara su contenido.

Lección 4 · Básico

Arrays y bucles

Un array tiene un tamaño fijo y un único tipo: int[] notas = {7, 8, 9};. Las posiciones empiezan en 0 y .length dice cuántas hay.

El for clásico usa un contador; el for mejorado (for (int n : notas)) recorre cada elemento directamente.

Ejemplo práctico
int[] notas = {7, 8, 9};
int suma = 0;

for (int nota : notas) {
    suma += nota;
}
System.out.println("Media: " + (double) suma / notas.length); // 8.0

for (int i = 3; i > 0; i--) {
    System.out.println(i);
}

Ejercicio

En int[] notas = {7, 8, 9}, ¿qué vale notas[1]?

Ver la solución

Respuesta: 8. La posición 0 es la primera (7), así que la 1 es la segunda: 8.

Nivel 2 Intermedio

Lección 5 · Intermedio

Métodos

Un método es una función dentro de una clase. Se declara con el tipo que devuelve (void si no devuelve nada), su nombre y sus parámetros con tipo.

Los métodos static pertenecen a la clase y se llaman sin crear un objeto, como main.

Ejemplo práctico
public class Calculadora {
    static double conIva(double precio, double iva) {
        return precio * (1 + iva / 100);
    }

    public static void main(String[] args) {
        System.out.println(conIva(100, 21)); // 121.0
    }
}

Ejercicio

Completa el tipo de un método que no devuelve nada.

static  saludar(String nombre) {
    System.out.println("Hola " + nombre);
}
Ver la solución

Respuesta: void. void indica que el método no devuelve ningún valor.

Conceptos clave

Lección 6 · Intermedio

Clases, objetos y records

Una clase define los datos (atributos) y el comportamiento (métodos) de un tipo de objeto. El constructor, con el mismo nombre que la clase, prepara cada objeto creado con new.

Para clases que solo guardan datos, un record (Java 16 o posterior) genera solo el constructor, los métodos de acceso, equals y toString.

Ejemplo práctico
class Cuenta {
    private double saldo;

    Cuenta(double saldoInicial) {
        saldo = saldoInicial;
    }
    void ingresar(double cantidad) { saldo += cantidad; }
    double getSaldo() { return saldo; }
}

record Producto(String nombre, double precio) {}

Cuenta c = new Cuenta(100);
c.ingresar(50);
System.out.println(c.getSaldo());                    // 150.0
System.out.println(new Producto("Ratón", 12.5));     // Producto[nombre=Ratón, precio=12.5]

Ejercicio

¿Qué palabra crea un objeto nuevo a partir de una clase?

Ver la solución

Respuesta: new. new Clase(...) reserva el objeto y ejecuta su constructor.

Lección 7 · Intermedio

Colecciones: List y Map

Las colecciones crecen según lo necesites. ArrayList es una lista ordenada y HashMap guarda pares clave–valor. Se indica el tipo de los elementos entre < y >.

List.of() y Map.of() crean colecciones que no se pueden modificar, útiles para datos fijos.

Ejemplo práctico
import java.util.*;

List<String> tareas = new ArrayList<>();
tareas.add("Comprar pan");
tareas.add("Llamar al médico");

Map<String, Integer> stock = new HashMap<>();
stock.put("teclado", 10);
stock.put("raton", 0);

System.out.println(tareas.size());                 // 2
System.out.println(stock.getOrDefault("webcam", 0)); // 0

Ejercicio

Necesitas buscar el precio de un producto por su nombre. ¿Qué colección usas?

Ver la solución

Respuesta: HashMap. Un Map asocia cada clave (el nombre) con su valor (el precio).

Nivel 3 Avanzado

Lección 8 · Avanzado

Herencia e interfaces

Una clase puede heredar de otra con extends y reutilizar su código, pero solo de una. Una interfaz define métodos que las clases se comprometen a tener con implements, y una clase puede implementar varias.

Así puedes tratar objetos distintos de la misma forma: una lista de Figura puede contener círculos y rectángulos.

Ejemplo práctico
interface Figura {
    double area();
}

record Circulo(double radio) implements Figura {
    public double area() { return Math.PI * radio * radio; }
}

record Rectangulo(double ancho, double alto) implements Figura {
    public double area() { return ancho * alto; }
}

List<Figura> figuras = List.of(new Circulo(1), new Rectangulo(2, 3));
for (Figura f : figuras) System.out.println(f.area());

Ejercicio

Completa para que la clase cumpla la interfaz Figura.

class Cuadrado  Figura { … }
Ver la solución

Respuesta: implements. Una clase implementa una interfaz con implements; hereda de otra clase con extends.

Lección 9 · Avanzado

Excepciones

Cuando algo falla, Java lanza una excepción. Con try y catch la capturas; finally se ejecuta siempre. Algunas excepciones (las comprobadas, como IOException) el compilador te obliga a tratarlas o declararlas.

try-with-resources cierra automáticamente archivos y conexiones al terminar.

Ejemplo práctico
import java.nio.file.*;
import java.io.IOException;

try (var lineas = Files.lines(Path.of("datos.txt"))) {
    System.out.println(lineas.count() + " líneas");
} catch (IOException e) {
    System.out.println("No se pudo leer: " + e.getMessage());
}

try {
    int n = Integer.parseInt("doce");
} catch (NumberFormatException e) {
    System.out.println("No es un número");
}

Ejercicio

¿Qué bloque se ejecuta siempre, haya error o no?

Ver la solución

Respuesta: finally. finally se ejecuta al salir del try, tanto si hubo excepción como si no.

Lección 10 · Avanzado

Lambdas y streams

Una lambda es una función corta que se pasa como dato: p -> p.precio() > 10. Los streams encadenan operaciones sobre colecciones: filtrar, transformar, ordenar y reunir el resultado.

El código queda más declarativo: dices qué quieres obtener, no cómo recorrer la lista paso a paso.

Ejemplo práctico
record Producto(String nombre, double precio) {}

var productos = List.of(
    new Producto("Teclado", 25.9),
    new Producto("Ratón", 12.5),
    new Producto("Cable", 4.99));

List<String> caros = productos.stream()
    .filter(p -> p.precio() > 10)
    .map(Producto::nombre)
    .sorted()
    .toList();                       // Java 16+

System.out.println(caros);           // [Ratón, Teclado]

Ejercicio

¿Qué operación de un stream se queda solo con algunos elementos?

Ver la solución

Respuesta: filter. filter conserva los elementos para los que la lambda devuelve true.

¿Has terminado? Sigue practicando

Repasa los conceptos en el diccionario, practica con estas herramientas o prueba otro lenguaje: las ideas que has aprendido (variables, condiciones, funciones, objetos…) te servirán en cualquiera.

  • Texto y programación

    Base64, URL y JSON

    Codifica y decodifica Base64 y URL, y valida o formatea JSON con la línea del error.

  • Texto y programación

    Comparar dos textos

    Encuentra las diferencias entre dos versiones de un texto, línea a línea y palabra a palabra.

Fuentes consultadas

* Porcentaje de personas que dijeron haber usado Java en la Stack Overflow Developer Survey 2026: Technology (pregunta sobre lenguajes de programación, de scripts y de marcado; todas las respuestas). El progreso de las lecciones se guarda solo en este navegador.