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 |
🔍 ¿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
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 |
|---|---|---|---|---|
byte | Entero | 8 bits | -128 a 127 | byte edad = 25; |
short | Entero | 16 bits | -32.768 a 32.767 | short temperatura = -10; |
int | Entero | 32 bits | -2.147.483.648 a 2.147.483.647 | int poblacion = 47000000; |
long | Entero | 64 bits | ±9,2 × 1018 | long distancia = 384400000L; |
float | Decimal | 32 bits | Precisión simple IEEE 754 | float precio = 19.99f; |
double | Decimal | 64 bits | Precisión doble IEEE 754 | double pi = 3.141592653; |
char | Carácter | 16 bits | Unicode 0 a 65.535 | char letra = 'A'; |
boolean | Lógico | 1 bit* | true o false | boolean activo = true; |
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
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 |
|---|---|---|
if | Condicional | Evalúa una expresión booleana; si es true, ejecuta el bloque asociado. |
else | Condicional | Bloque alternativo que se ejecuta cuando la condición del if es false. |
switch | Condicional | Evalúa una expresión y salta al case correspondiente. |
case | Condicional | Define una etiqueta dentro de un switch. |
default | Condicional | Bloque que se ejecuta si ningún case coincide. También se usa en interfaces (Java 8+). |
for | Bucle | Bucle con inicialización, condición e incremento. También bucle for-each (J2SE 5.0+). |
while | Bucle | Repite un bloque mientras la condición sea true. |
do | Bucle | Ejecuta el bloque al menos una vez y luego repite según la condición del while. |
break | Salto | Interrumpe la ejecución de un bucle o switch. |
continue | Salto | Salta a la siguiente iteración del bucle. |
return | Salto | Devuelve un valor (o void) al método que realizó la llamada. |
Ejemplo: uso combinado de condicionales y bucles
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 |
|---|---|---|
static | Campos, métodos, bloques, clases internas | Pertenece a la clase, no a las instancias. Se accede sin crear objetos. |
final | Variables, métodos, clases | Variable: constante. Método: no se puede sobreescribir. Clase: no se puede heredar. |
abstract | Clases, métodos | Clase: no puede instanciarse. Método: sin cuerpo, debe implementarse en subclase. |
synchronized | Métodos, bloques | Solo un hilo puede ejecutar el bloque al mismo tiempo (concurrencia). |
volatile | Variables | La variable se lee siempre de la memoria principal, no de la caché del hilo. |
transient | Variables | Excluye el campo del proceso de serialización. |
Ejemplo: static y final en acción
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 |
|---|---|---|
class | Define una nueva clase. | public class Vehiculo { } |
interface | Define un contrato que las clases deben implementar. | interface Arrancable { void arrancar(); } |
extends | Indica que una clase hereda de otra. | class Coche extends Vehiculo { } |
implements | Indica que una clase implementa una interfaz. | class Coche implements Arrancable { } |
new | Crea una nueva instancia de una clase. | Coche miCoche = new Coche(); |
this | Referencia al objeto actual. | this.nombre = nombre; |
super | Referencia a la superclase del objeto actual. | super.arrancar(); |
instanceof | Comprueba si un objeto es instancia de una clase o interfaz. | if (obj instanceof Coche) |
enum | Define un tipo enumerado (Java 5+). | enum Color { ROJO, VERDE, AZUL } |
Ejemplo: class, extends, implements, this, super
// 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 |
|---|---|---|
try | Define el bloque de código que puede generar una excepción. | try { ... } |
catch | Captura y maneja un tipo específico de excepción. | catch (IOException e) { ... } |
finally | Bloque que se ejecuta siempre, haya o no excepción. | finally { cerrarRecurso(); } |
throw | Lanza una excepción explícitamente. | throw new IllegalArgumentException("..."); |
throws | Declara que un método puede lanzar excepciones. | void leer() throws IOException { } |
Ejemplo: try, catch, finally, throw, throws
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 |
|---|---|---|
goto | Reservada, sin uso | break/continue con etiquetas, return, excepciones |
const | Reservada, sin uso | final 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).
// 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.
// === 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 €
❌ 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
int new = 5; // ❌ Error: 'new' es palabra reservada
String class = ""; // ❌ Error: 'class' es palabra reservada
double void = 3.0; // ❌ Error: 'void' es palabra reservada
int nuevoValor = 5;
String nombreClase = "";
double resultado = 3.0;
Error 2: Confundir final con const
const double PI = 3.14159; // ❌ Error: 'const' no se usa en Java
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
Public Static Void main(String[] args) { } // ❌ Error de compilación
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
goto inicio; // ❌ Error: 'goto' está reservada pero no implementada
// 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:
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.
💬 Foro de discusión
¿Tienes dudas sobre Palabras reservadas en Java: lista completa con ejemplos y descripción? Comparte tu pregunta con la comunidad.
Todavía no hay mensajes. ¡Sé el primero en participar!