La sobreescritura de métodos (overriding) es un mecanismo de POO en el que una subclase proporciona su propia implementación de un método ya definido en su superclase. El método en la subclase debe tener el mismo nombre, parámetros y tipo de valor de retorno (o ser un subtipo de este).
Reglas clave:
@Override ayuda a detectar errores en tiempo de compilación.Ejemplo:
class Animal { public void sound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Woof"); } }
Pregunta: "¿Se puede sobreescribir un método static en Java?"
Respuesta: No, los métodos estáticos no se pueden sobreescribir. Se ocultan (method hiding). Si se declara un método estático con la misma firma en la subclase, ocurrirá la ocultación, no la sobreescritura.
Ejemplo:
class A { static void print() { System.out.println("A"); } } class B extends A { static void print() { System.out.println("B"); } } A obj = new B(); obj.print(); // imprimirá "A"
Historia
En un proyecto, uno de los desarrolladores intentó "sobreescribir" un método static en la clase heredada, esperando que se llamara a la versión de la subclase a través de la referencia de la superclase. Esto llevó a resultados inesperados: se llamaba al método de la superclase, lo que hacía que el programa no funcionara correctamente.
Historia
Es importante usar la anotación
@Override. En un proyecto, un desarrollador cometió un error en el nombre del método al sobreescribirlo, y sin la anotación el compilador no lanzó un error. Como resultado, se llamaba al método de la clase base (por defecto) en la jerarquía de herencia, lo que provocó una lógica incorrecta en los procesos de negocio.
Historia
Sobrescribir excepciones checked: el desarrollador agregó en el método sobreescrito el lanzamiento de una nueva excepción checked, no especificada en la firma original. El código se compiló con error y fue necesario cambiar la arquitectura, ya que esto infringe la regla de sobreescritura de excepciones.