ProgramaciónDesarrollador Java

¿Cómo funciona el mecanismo de sobreescritura de métodos (method overriding) en Java, cómo usarlo correctamente y qué matices hay que tener en cuenta?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Los métodos deben ser public o protected (no más restrictivos en el nivel de acceso).
  • No se pueden sobreescribir métodos private y static.
  • Usar la anotación @Override ayuda a detectar errores en tiempo de compilación.
  • En Java, se admite el tipo de retorno covariante (el método sobreescrito puede retornar un subtipo del tipo de retorno original).
  • Excepciones: el método en la subclase no puede declarar nuevas excepciones checked que no están en la firma del método base.

Ejemplo:

class Animal { public void sound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Woof"); } }

Pregunta con trampa.

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"

Ejemplos de errores reales por falta de conocimiento de los matices del tema.


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.