Sobrescritura de Métodos en Java: Personalizando el Comportamiento de la Superclase
Cuando una subclase hereda un método de su superclase, puede sobrescribirlo (override) para proporcionar una implementación específica, siempre que el método no sea final.
El beneficio: definir un comportamiento específico al tipo de la subclase, manteniendo la misma firma.
Ejemplo Básico: Polimorfismo en Tiempo de Ejecución
class Animal {
public void move() {
System.out.println("Los animales se mueven");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Los perros caminan y corren");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // referencia Animal, objeto Animal
Animal b = new Dog(); // referencia Animal, objeto Dog
a.move(); // ejecuta Animal.move()
b.move(); // ejecuta Dog.move() — polimorfismo
}
}
Salida:
Los animales se mueven Los perros caminan y corren
En tiempo de compilación se verifica el tipo de referencia (Animal tiene move()). En tiempo de ejecución, la JVM invoca el método del objeto real (Dog).
Error Común: Métodos Exclusivos de la Subclase
class Dog extends Animal {
public void move() { ... }
public void bark() { System.out.println("Los perros ladran"); }
}
public class TestDog {
public static void main(String args[]) {
Animal b = new Dog();
b.move(); // OK
b.bark(); // ERROR DE COMPILACIÓN: Animal no tiene bark()
}
}
La referencia Animal no conoce bark(). Para usarlo, haz ((Dog) b).bark() o usa referencia Dog.
Reglas para la Sobrescritura Correcta
- Lista de argumentos idéntica a la del método sobrescrito.
- Tipo de retorno igual o subtipo (covarianza de retorno, Java 5+).
- Nivel de acceso no más restrictivo (ej. si superclase es
public, subclase no puede serprivateniprotected). - Solo métodos de instancia heredados pueden sobrescribirse.
- Métodos
finalno pueden sobrescribirse. - Métodos
staticno se sobrescriben (se ocultan / re-declaran). - Si no se hereda, no se puede sobrescribir.
- En mismo paquete: puede sobrescribir cualquier método no
privatenifinal. - En paquete distinto: solo métodos
publicoprotectednofinal. - Excepciones: Puede lanzar excepciones no verificadas (unchecked) libremente. Para verificadas (checked): no puede lanzar nuevas ni más amplias que las del método original; puede lanzar menos o más específicas.
- Los constructores no se sobrescriben.
Uso de super para Invocar la Versión de la Superclase
Dentro del método sobrescrito, super.metodo() llama a la implementación padre.
Ejemplo
class Animal {
public void move() {
System.out.println("Los animales se mueven");
}
}
class Dog extends Animal {
public void move() {
super.move(); // llama a Animal.move()
System.out.println("Los perros caminan y corren");
}
}
public class TestDog {
public static void main(String args[]) {
Animal b = new Dog();
b.move();
}
}
Salida:
Los animales se mueven Los perros caminan y corren
Resumen: Sobrescritura vs Sobrecarga
| Característica | Sobrescritura (Override) | Sobrecarga (Overload) |
|---|---|---|
| Relación | Superclase ↔ Subclase | Misma clase |
| Nombre del método | Igual | Igual |
| Parámetros | Iguales | Diferentes |
| Retorno | Igual o covarianza | Puede variar |
| Acceso | No más restrictivo | Cualquiera |
| Polimorfismo | En tiempo de ejecución | En tiempo de compilación |
Java
- Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
- Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
- Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
- Método Java String length(): Cómo obtener el tamaño de un String (Ejemplo)
- Dominando Java String.indexOf(): Localizar subcadenas y ejemplos prácticos
- Entendiendo Java String.charAt(): Sintaxis, tipo de retorno, excepciones y ejemplo práctico
- Dominando el método compareTo() de Java String: Sintaxis, casos de uso y ejemplos prácticos
- Método Java String.contains(): Cómo comprobar subcadenas – Ejemplos prácticos
- Dominando Java String.endsWith(): Cómo comprobar sufijos de cadena con ejemplos
- Dominando el reemplazo de Strings en Java: replace(), replaceAll() y replaceFirst() explicados
- Java Static explicado: Variables, métodos y bloques – Ejemplos prácticos