viernes, 25 de julio de 2008

@Override

Si una clase base de Java tiene un nombre de método varias veces sobrecargado, redefinir dicho nombre en la clase derivada no ocultará la implementación en ninguna de las versiones de la clase base (a diferencia de lo que sucede en C++). Por lo tanto, el mecanismo de sobrecarga funciona independientemente de si el método ha sido definido en este nivel o en una clase base.

Lo más común es sobrecargar los métodos del mismo nombre, utilizando exactamente la misma signatura y el mismo tipo de retorno. En caso contrario, el código podría resultar confuso (lo cual es la razón por la que C++ oculta todos los métodos de la clase base, para que no cometamos lo que muy probablemente se trata de un error).

JavaSE 5 ha añadido al lenguaje la anotación @Override, que no es una palabra clave pero puede usarse como si lo fuera. Cuando queremos sustituir un método, podemos añadir esta anotación y el compilador generará un mensaje de error si sobrecargamos accidentalmente el método en lugar de sustituirlo.

class Madre {
  public void printHolaMundo() {
   System.out.println("Hola mundo");
 }
}

class Hija extends Madre {
  @Override
  public void printHolaMundo(String nombreDelMundo) {
   System.out.println("Hola mundo " + nombreDelMundo);
 }
}

Si quisiéramos compilar este código, el compilador lanzaría el siguiente error:

"the method printHolaMundo(String) of type Hija must override or implement a supertype method"

La anotación @Override evitará, así, que sobrecarguemos accidentalmente un método cuando no es eso lo que queremos hacer.

(El texto fue extraído del "Piensa en Java" de Bruce Eckel, 4ta Edición. El ejemplo no.)