Haciendo override sobre los métodos es necesario ser cuidadoso con los niveles de acceso, el nombre de los métodos y sus firmas.

Este es el ejemplo que vimos en la primera parte (click aquí para verlo).

public String toString() {
    return "x = " + xPos + ", y = " + yPos;
}

¿Qué sucede si cambiamos public por protected en la definición del método? ¿Funcionara?

protected String toString() {
    return "x = " + xPos + ", y = " + yPos;
}

La respuesta es no va a funcionar, el compilador lanzará un error como el siguiente:

Point.java:12: error: toString() in Point cannot override toString() in Object
protected String toString() {
^
attempting to assign weaker access privileges; was public
1 error

¿Por que obtuvimos este error?. Es posible cambiar el nivel de acceso de un método siempre que este sea menos restrictivo.

Veamos ahora qué sucede si cambiamos el tipo de dato que retorna. Si en lugar de devolver un String retorna un Object como en el siguiente ejemplo.

public Object toString() {
    return "x = " + xPos + ", y = " + yPos;
}

Obtendras el siguiente error:

Point.java:12: error: toString() in Point cannot override toString() in Object
public Object toString() {
^
return type Object is not compatible with String
1 error

En este caso el compilador lanza un error debido que el tipo de dato retornado debe ser exactamente igual que el del método original.

Por último ¿que sucede con el siguiente ejemplo?

public String ToString() {
    return "x = " + xPos + ", y = " + yPos;
}

Este es uno de los más complejos errores, debido a que el compilador no lanzará error alguno como en los casos anteriores, esto en realidad es una definición de un nuevo método no un override del método toString, sencillamente por que el nombre no es igual que el del método original.

Mantén en mente los siguientes puntos para un correcto override de los métodos.

  • Deben tener el mismo tipo y número de argumentos (o tipos compatibles).
  • Deben retornar el mismo tipo de dato.
    • Es posible retornar un covariante de la subclase. (Si no sabes que es un tipo de retorno covariante, escribe en los comentarios para explicarlo en otro post)
  • No debe tener un modificador de acceso más restrictivo que el del metodo original.
  • No debe lanzar excepciones controladas (checked exceptions) o excepciones más amplias.
  • Ah, y si, deben tener exactamente el mismo nombre.

Recuerda que no puedes hacer override de métodos que no has heredado. Los métodos privados no pueden ser anulados ya que no se heredan del todo.