Palabras reservadas en Java: lista completa con ejemplos y descripción

📅 Actualizado en febrero 2026 ✍️ Ángel López ⏱️ 18 min de lectura ✓ Nivel principiante ★ ★ ★ ★ ★ (5/5)

Las palabras reservadas en Java —también denominadas palabras clave (keywords)— son términos que el lenguaje ha asignado a un propósito específico y que, por tanto, no pueden utilizarse como identificadores (nombres de variables, métodos, clases ni paquetes). Conocerlas es el primer paso para escribir código Java correcto y evitar errores de compilación inesperados.

Java cuenta con unas 67 palabras reservadas en total, entre las cuales se incluyen palabras clave de uso activo, literales reservados (true, false, null) y palabras que el lenguaje reserva pero no utiliza (goto, const). En este artículo se presenta la lista completa organizada por categorías funcionales, con explicaciones detalladas, ejemplos de código ejecutable y ejercicios prácticos para consolidar el aprendizaje.

📋 Tabla completa de palabras reservadas

La siguiente tabla recoge todas las palabras reservadas de Java agrupadas por su función principal. Es una referencia rápida que conviene consultar siempre que surja la duda de si un identificador está prohibido.

Categoría Palabras reservadas Total
Tipos de datos primitivos byte, short, int, long, float, double, char, boolean 8
Control de flujo if, else, switch, case, default, for, while, do, break, continue, return 11
Modificadores de acceso public, private, protected 3
Modificadores de clase/método static, final, abstract, synchronized, volatile, transient, native, strictfp 8
POO y estructura class, interface, extends, implements, new, this, super, instanceof, enum 9
Excepciones try, catch, finally, throw, throws 5
Paquetes e importación package, import 2
Retorno y vacío return, void 2
Otros assert 1
Literales reservados true, false, null 3
No usadas (reservadas) goto, const 2
Contextuales (Java 9+) var, yield, record, sealed, permits, non-sealed, module, requires, exports, opens, provides, uses, with, to, transitive, open 16
💡 Nota: Las palabras contextuales (Java 9 en adelante) solo están reservadas en ciertos contextos sintácticos. Fuera de esos contextos, pueden usarse como identificadores, aunque no es recomendable.

🔍 ¿Qué son las palabras reservadas en Java?

Una palabra reservada (reserved word) es un identificador predefinido por el lenguaje Java que tiene un significado sintáctico especial. El compilador las reconoce como instrucciones o modificadores del lenguaje, por lo que usar una de ellas como nombre de variable, método o clase provoca un error de compilación.

Todas las palabras reservadas en Java se escriben en minúsculas. Java es un lenguaje case-sensitive, de modo que Class (con mayúscula) es un identificador válido —de hecho, es una clase del paquete java.lang—, mientras que class (en minúsculas) es una palabra reservada. Sin embargo, se desaconseja utilizar variaciones de mayúsculas de palabras reservadas como nombres propios, porque dificultan la lectura del código.

Ejemplo: error al usar una palabra reservada como identificador

Java
public class EjemploError {
    public static void main(String[] args) {
        // ❌ ERROR DE COMPILACIÓN: 'class' es palabra reservada
        // int class = 10;

        // ✅ CORRECTO: usar un nombre descriptivo
        int clase = 10;
        System.out.println("Valor: " + clase); // Salida: Valor: 10
    }
}

🧮 Palabras reservadas de tipos de datos

Java define ocho tipos de datos primitivos, cada uno con su propia palabra reservada. Estos tipos determinan el tamaño en memoria y el rango de valores que puede almacenar una variable.

Palabra Tipo Tamaño Rango / Descripción Ejemplo
byteEntero8 bits-128 a 127byte edad = 25;
shortEntero16 bits-32.768 a 32.767short temperatura = -10;
intEntero32 bits-2.147.483.648 a 2.147.483.647int poblacion = 47000000;
longEntero64 bits±9,2 × 1018long distancia = 384400000L;
floatDecimal32 bitsPrecisión simple IEEE 754float precio = 19.99f;
doubleDecimal64 bitsPrecisión doble IEEE 754double pi = 3.141592653;
charCarácter16 bitsUnicode 0 a 65.535char letra = 'A';
booleanLógico1 bit*true o falseboolean activo = true;
✅ Consejo: Además de los tipos primitivos, la palabra void indica que un método no devuelve ningún valor. Aunque técnicamente no es un tipo de dato, se clasifica junto a ellos porque define el tipo de retorno.

Ejemplo: declaración de todos los tipos primitivos

Java
public class TiposPrimitivos {
    public static void main(String[] args) {
        byte   edadMascota   = 12;
        short  alturaEdificio = 452;
        int    habitantes    = 3280000;
        long   distanciaLuna = 384400000L;
        float  notaMedia     = 7.85f;
        double tasaInteres   = 3.141592653589793;
        char   inicial       = 'J';
        boolean esMayorEdad  = true;

        System.out.println("Edad mascota: " + edadMascota);
        System.out.println("Altura edificio: " + alturaEdificio + " m");
        System.out.println("Habitantes: " + habitantes);
        System.out.println("Distancia Luna: " + distanciaLuna + " km");
        System.out.println("Nota media: " + notaMedia);
        System.out.println("Tasa interés: " + tasaInteres);
        System.out.println("Inicial: " + inicial);
        System.out.println("Mayor de edad: " + esMayorEdad);
    }
}
// Salida:
// Edad mascota: 12
// Altura edificio: 452 m
// Habitantes: 3280000
// Distancia Luna: 384400000 km
// Nota media: 7.85
// Tasa interés: 3.141592653589793
// Inicial: J
// Mayor de edad: true

🔄 Palabras reservadas de control de flujo

Las palabras de control de flujo determinan el orden en que se ejecutan las instrucciones del programa. Se dividen en tres grandes grupos: condicionales (if, else, switch, case, default), bucles (for, while, do) y saltos (break, continue, return).

Palabra Grupo Descripción
ifCondicionalEvalúa una expresión booleana; si es true, ejecuta el bloque asociado.
elseCondicionalBloque alternativo que se ejecuta cuando la condición del if es false.
switchCondicionalEvalúa una expresión y salta al case correspondiente.
caseCondicionalDefine una etiqueta dentro de un switch.
defaultCondicionalBloque que se ejecuta si ningún case coincide. También se usa en interfaces (Java 8+).
forBucleBucle con inicialización, condición e incremento. También bucle for-each (J2SE 5.0+).
whileBucleRepite un bloque mientras la condición sea true.
doBucleEjecuta el bloque al menos una vez y luego repite según la condición del while.
breakSaltoInterrumpe la ejecución de un bucle o switch.
continueSaltoSalta a la siguiente iteración del bucle.
returnSaltoDevuelve un valor (o void) al método que realizó la llamada.

Ejemplo: uso combinado de condicionales y bucles

Java
public class ControlFlujo {
    public static void main(String[] args) {
        // for + if + else + continue + break
        for (int i = 1; i <= 20; i++) {
            if (i % 15 == 0) {
                System.out.println(i + " → FizzBuzz");
                break;      // sale del bucle al encontrar el primer FizzBuzz
            } else if (i % 3 == 0) {
                continue;   // salta los múltiplos de 3 puros
            } else {
                System.out.println(i);
            }
        }

        // switch + case + default
        String dia = "LUNES";
        switch (dia) {
            case "LUNES":
            case "MARTES":
            case "MIERCOLES":
            case "JUEVES":
            case "VIERNES":
                System.out.println(dia + " es día laborable");
                break;
            default:
                System.out.println(dia + " es fin de semana");
        }
    }
}
// Salida:
// 1
// 2
// 4
// 5
// 7
// 8
// 10
// 11
// 13
// 14
// 15 → FizzBuzz
// LUNES es día laborable

🔐 Modificadores de acceso y alcance

Los modificadores determinan la visibilidad y el comportamiento de clases, métodos y variables. Se clasifican en modificadores de acceso (public, protected, private) y modificadores de no acceso (static, final, abstract, synchronized, volatile, transient, native, strictfp).

Modificadores de acceso

Modificador Clase Paquete Subclase Todos
public
protected
(sin modificador)
private

Modificadores de no acceso más importantes

Palabra Se aplica a Descripción
staticCampos, métodos, bloques, clases internasPertenece a la clase, no a las instancias. Se accede sin crear objetos.
finalVariables, métodos, clasesVariable: constante. Método: no se puede sobreescribir. Clase: no se puede heredar.
abstractClases, métodosClase: no puede instanciarse. Método: sin cuerpo, debe implementarse en subclase.
synchronizedMétodos, bloquesSolo un hilo puede ejecutar el bloque al mismo tiempo (concurrencia).
volatileVariablesLa variable se lee siempre de la memoria principal, no de la caché del hilo.
transientVariablesExcluye el campo del proceso de serialización.

Ejemplo: static y final en acción

Java
public class Configuracion {
    // static + final = constante de clase
    public static final double IVA = 0.21;
    public static final String MONEDA = "EUR";

    // static: pertenece a la clase, no a cada objeto
    private static int contadorInstancias = 0;

    private String nombre;

    public Configuracion(String nombre) {
        this.nombre = nombre;
        contadorInstancias++;  // se incrementa con cada objeto creado
    }

    public static int getContadorInstancias() {
        return contadorInstancias;
    }

    public static void main(String[] args) {
        Configuracion c1 = new Configuracion("Servidor A");
        Configuracion c2 = new Configuracion("Servidor B");

        System.out.println("IVA: " + IVA);                        // 0.21
        System.out.println("Moneda: " + MONEDA);                  // EUR
        System.out.println("Instancias: " + getContadorInstancias()); // 2

        // ❌ ERROR: no se puede reasignar una variable final
        // IVA = 0.10;
    }
}
// Salida:
// IVA: 0.21
// Moneda: EUR
// Instancias: 2

🏗️ Palabras reservadas de POO

La programación orientada a objetos (Object-Oriented Programming, OOP) es el paradigma central de Java. Las palabras reservadas de este grupo permiten definir clases, crear objetos, establecer relaciones de herencia e implementar interfaces.

Palabra Descripción Ejemplo básico
classDefine una nueva clase.public class Vehiculo { }
interfaceDefine un contrato que las clases deben implementar.interface Arrancable { void arrancar(); }
extendsIndica que una clase hereda de otra.class Coche extends Vehiculo { }
implementsIndica que una clase implementa una interfaz.class Coche implements Arrancable { }
newCrea una nueva instancia de una clase.Coche miCoche = new Coche();
thisReferencia al objeto actual.this.nombre = nombre;
superReferencia a la superclase del objeto actual.super.arrancar();
instanceofComprueba si un objeto es instancia de una clase o interfaz.if (obj instanceof Coche)
enumDefine un tipo enumerado (Java 5+).enum Color { ROJO, VERDE, AZUL }

Ejemplo: class, extends, implements, this, super

Java
// Interfaz con palabra clave 'interface'
interface Describible {
    String describir();
}

// Clase padre con 'class'
class Animal {
    protected String nombre;

    public Animal(String nombre) {
        this.nombre = nombre;   // 'this' referencia al objeto actual
    }

    public String getNombre() {
        return nombre;
    }
}

// Clase hija con 'extends' e 'implements'
class Perro extends Animal implements Describible {
    private String raza;

    public Perro(String nombre, String raza) {
        super(nombre);          // 'super' llama al constructor padre
        this.raza = raza;
    }

    @Override
    public String describir() {
        return nombre + " es un " + raza;
    }
}

// Uso con 'new' e 'instanceof'
public class EjemploPOO {
    public static void main(String[] args) {
        Perro miPerro = new Perro("Rex", "Pastor Alemán");
        System.out.println(miPerro.describir());

        if (miPerro instanceof Animal) {
            System.out.println(miPerro.getNombre() + " es un Animal");
        }
        if (miPerro instanceof Describible) {
            System.out.println(miPerro.getNombre() + " es Describible");
        }
    }
}
// Salida:
// Rex es un Pastor Alemán
// Rex es un Animal
// Rex es un Describible

⚠️ Palabras reservadas de excepciones

Java proporciona un sistema robusto de manejo de excepciones (exception handling) basado en cinco palabras reservadas que trabajan juntas para detectar, propagar y recuperarse de errores en tiempo de ejecución.

Palabra Función Uso típico
tryDefine el bloque de código que puede generar una excepción.try { ... }
catchCaptura y maneja un tipo específico de excepción.catch (IOException e) { ... }
finallyBloque que se ejecuta siempre, haya o no excepción.finally { cerrarRecurso(); }
throwLanza una excepción explícitamente.throw new IllegalArgumentException("...");
throwsDeclara que un método puede lanzar excepciones.void leer() throws IOException { }

Ejemplo: try, catch, finally, throw, throws

Java
public class EjemploExcepciones {

    // 'throws' declara que el método puede lanzar una excepción
    public static int dividir(int dividendo, int divisor) throws ArithmeticException {
        if (divisor == 0) {
            // 'throw' lanza la excepción explícitamente
            throw new ArithmeticException("No se puede dividir entre cero");
        }
        return dividendo / divisor;
    }

    public static void main(String[] args) {
        // 'try' envuelve el código que puede fallar
        try {
            int resultado = dividir(10, 0);
            System.out.println("Resultado: " + resultado);
        }
        // 'catch' captura la excepción
        catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());
        }
        // 'finally' se ejecuta SIEMPRE
        finally {
            System.out.println("Bloque finally ejecutado");
        }
    }
}
// Salida:
// Error: No se puede dividir entre cero
// Bloque finally ejecutado

🔮 Literales reservados y palabras no usadas

Además de las palabras clave funcionales, Java reserva tres literales y dos palabras sin uso. Ninguna de ellas puede utilizarse como identificador.

Literales reservados: true, false, null

Estos tres términos representan valores constantes del lenguaje. true y false son los dos únicos valores posibles del tipo boolean. null representa la ausencia de referencia a un objeto; cualquier variable de tipo referencia puede contener null.

Palabras reservadas sin uso: goto y const

Java reservó goto y const desde su primera versión, pero nunca les asignó funcionalidad. La razón principal fue impedir que los programadores procedentes de C/C++ las usaran como identificadores, dado que una futura implementación —aunque improbable— rompería su código. Las alternativas en Java son:

En C/C++ En Java Alternativa
gotoReservada, sin usobreak/continue con etiquetas, return, excepciones
constReservada, sin usofinal para constantes

Palabras contextuales (Java 10+): var

Desde Java 10, var permite la inferencia de tipos en variables locales (local variable type inference). No es una palabra reservada en sentido estricto, sino un nombre de tipo restringido: solo está prohibido como nombre de clase o interfaz, pero puede usarse como nombre de variable o método (aunque no es recomendable).

Java
// Desde Java 10: var infiere el tipo automáticamente
var mensaje = "Hola, Java";         // String inferido
var numeros = List.of(1, 2, 3, 4);  // List<Integer> inferido
var mapa = new HashMap<String, Integer>(); // HashMap inferido

// NOTA: var solo funciona en variables locales, no en campos de clase
// ni en parámetros de métodos

🧩 Ejemplo completo integrador

El siguiente programa combina la mayoría de categorías de palabras reservadas en un escenario realista: un pequeño sistema de gestión de productos de una tienda online.

Java
// === Palabras usadas: package, import, enum, interface, class, extends,
//     implements, public, private, protected, static, final, abstract,
//     new, this, super, if, else, for, switch, case, default, break,
//     return, try, catch, throw, throws, instanceof, void, boolean,
//     int, double, char ===

// Enum: categorías de producto
enum Categoria {
    ELECTRONICA, ROPA, ALIMENTACION, HOGAR
}

// Interfaz: contrato para objetos con descuento
interface Descontable {
    double aplicarDescuento(double porcentaje);
}

// Clase abstracta: base para todos los productos
abstract class Producto {
    private static int contadorId = 0;      // static: compartido
    protected final int id;                 // final: no cambia
    protected String nombre;
    protected double precio;
    protected Categoria categoria;

    public Producto(String nombre, double precio, Categoria categoria) {
        this.id = ++contadorId;             // this: referencia actual
        this.nombre = nombre;
        this.precio = precio;
        this.categoria = categoria;
    }

    // Método abstracto: cada subclase lo implementa
    abstract String getEtiqueta();

    public static int getTotalProductos() {
        return contadorId;
    }

    @Override
    public String toString() {
        return "[" + id + "] " + nombre + " - " + precio + " €";
    }
}

// Clase concreta que hereda e implementa
class ProductoFisico extends Producto implements Descontable {
    private double pesoKg;

    public ProductoFisico(String nombre, double precio, Categoria cat, double pesoKg) {
        super(nombre, precio, cat);         // super: constructor padre
        this.pesoKg = pesoKg;
    }

    @Override
    String getEtiqueta() {
        return nombre + " (" + pesoKg + " kg)";
    }

    @Override
    public double aplicarDescuento(double porcentaje) {
        if (porcentaje < 0 || porcentaje > 100) {
            throw new IllegalArgumentException("Porcentaje inválido: " + porcentaje);
        }
        double descuento = precio * porcentaje / 100;
        return precio - descuento;
    }
}

// Programa principal
public class TiendaOnline {
    public static void main(String[] args) {
        // Crear productos con 'new'
        ProductoFisico[] catalogo = {
            new ProductoFisico("Portátil", 899.99, Categoria.ELECTRONICA, 1.8),
            new ProductoFisico("Camiseta", 29.95, Categoria.ROPA, 0.2),
            new ProductoFisico("Arroz 1kg", 1.50, Categoria.ALIMENTACION, 1.0),
            new ProductoFisico("Lámpara LED", 45.00, Categoria.HOGAR, 0.5)
        };

        System.out.println("=== CATÁLOGO (" + Producto.getTotalProductos() + " productos) ===");

        // for-each + switch + case + default
        for (Producto prod : catalogo) {
            System.out.println(prod);

            // instanceof: verificar tipo
            if (prod instanceof Descontable) {
                Descontable d = (Descontable) prod;
                // switch sobre la categoría
                double descuento;
                switch (prod.categoria) {
                    case ELECTRONICA: descuento = 10; break;
                    case ROPA:        descuento = 25; break;
                    default:          descuento = 5;  break;
                }
                // try-catch: manejar posible error
                try {
                    double precioFinal = d.aplicarDescuento(descuento);
                    System.out.println("   → Con " + descuento + "% dto: "
                                       + String.format("%.2f", precioFinal) + " €");
                } catch (IllegalArgumentException e) {
                    System.out.println("   → Error: " + e.getMessage());
                }
            }
        }
    }
}
// Salida:
// === CATÁLOGO (4 productos) ===
// [1] Portátil - 899.99 €
//    → Con 10.0% dto: 809.99 €
// [2] Camiseta - 29.95 €
//    → Con 25.0% dto: 22.46 €
// [3] Arroz 1kg - 1.5 €
//    → Con 5.0% dto: 1.43 €
// [4] Lámpara LED - 45.0 €
//    → Con 5.0% dto: 42.75 €
💡 Observación: Este ejemplo utiliza más de 30 palabras reservadas de Java en un contexto realista. La lista completa está indicada en el comentario de la primera línea.

❌ Errores frecuentes

A continuación se describen los errores más habituales que cometen los programadores principiantes relacionados con las palabras reservadas de Java.

Error 1: Usar una palabra reservada como nombre de variable

Java — ❌ Incorrecto
int new = 5;       // ❌ Error: 'new' es palabra reservada
String class = ""; // ❌ Error: 'class' es palabra reservada
double void = 3.0; // ❌ Error: 'void' es palabra reservada
Java — ✅ Correcto
int nuevoValor = 5;
String nombreClase = "";
double resultado = 3.0;

Error 2: Confundir final con const

Java — ❌ Incorrecto
const double PI = 3.14159; // ❌ Error: 'const' no se usa en Java
Java — ✅ Correcto
final double PI = 3.14159; // ✅ 'final' es la forma correcta en Java

Explicación: Java reservó const pero nunca la implementó. Para declarar constantes se utiliza final, o static final si la constante pertenece a la clase.

Error 3: Escribir palabras reservadas con mayúsculas

Java — ❌ Incorrecto
Public Static Void main(String[] args) { } // ❌ Error de compilación
Java — ✅ Correcto
public static void main(String[] args) { } // ✅ Siempre en minúsculas

Explicación: Todas las palabras reservadas de Java se escriben en minúsculas. Java es case-sensitive, por lo que Public no se reconoce como modificador de acceso.

Error 4: Intentar usar goto para saltar entre líneas

Java — ❌ Incorrecto
goto inicio; // ❌ Error: 'goto' está reservada pero no implementada
Java — ✅ Correcto
// Usar break con etiqueta como alternativa
externo:
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        if (i * j > 6) {
            break externo; // Sale de ambos bucles
        }
    }
}

✏️ Ejercicios prácticos

Ejercicio 1: Identificar palabras reservadas (comprensión)

Del siguiente listado, identifica cuáles son palabras reservadas de Java y cuáles son identificadores válidos: String, int, Integer, class, main, static, System, null, goto, args.

Ejercicio 2: Corregir código con palabras reservadas mal usadas (aplicación)

El siguiente código contiene varios errores relacionados con palabras reservadas. Corrígelo para que compile y funcione correctamente:

Java — Código con errores
Public class Calculator {
    const double PI = 3.14159;
    int return = 0;

    public Static void main(string[] args) {
        int new = 10;
        System.out.println(new + return);
    }
}

Ejercicio 3: Clasificar palabras reservadas por categoría (diseño)

Escribe un programa Java que defina un enum con las categorías de palabras reservadas (TIPO_DATO, CONTROL_FLUJO, MODIFICADOR, POO, EXCEPCION) y un método static que reciba una palabra reservada como String y devuelva su categoría. El método debe usar un switch con al menos 3 categorías y lanzar una excepción si la palabra no se reconoce.

❓ Preguntas frecuentes sobre Palabras reservadas en Java: lista completa con ejemplos y descripción

Las dudas más comunes respondidas de forma clara y directa.

Java tiene 67 palabras reservadas, incluyendo 50 palabras clave (keywords) de uso activo, 3 literales reservados (true, false, null), 2 palabras reservadas pero no usadas (goto, const) y varias palabras contextuales añadidas en versiones recientes como var, yield, record y sealed.
No. El compilador de Java genera un error de compilación si se intenta usar una palabra reservada como nombre de variable, método, clase o paquete. Por ejemplo, int class = 5; produce un error porque class es una palabra reservada.
Las palabras clave (keywords) son instrucciones del lenguaje que definen estructuras, tipos o comportamientos (como if, class, static). Los literales reservados (true, false, null) representan valores constantes predefinidos. Ambos están prohibidos como identificadores.
Java reservó goto y const para evitar que los programadores las usaran como identificadores, ya que podrían implementarse en el futuro. Además, evita confusiones con programadores procedentes de C/C++ donde sí se utilizan. En Java, las alternativas son break/continue con etiquetas (en lugar de goto) y final (en lugar de const).
Sí. Java es case-sensitive, por lo que class es una palabra reservada pero Class, CLASS o clAss no lo son. Sin embargo, se desaconseja usar variaciones de mayúsculas de palabras reservadas como identificadores, ya que genera código confuso y difícil de mantener.
Valora este artículo

💬 Foro de discusión

¿Tienes dudas sobre Palabras reservadas en Java: lista completa con ejemplos y descripción? Comparte tu pregunta con la comunidad.

¿Tienes cuenta? o comenta como invitado ↓

Todavía no hay mensajes. ¡Sé el primero en participar!