Sobreescribir Métodos

Una subclase puede sobreescribir completamente la implementación de un método heredado o puede mejorar el método añadiendole funcionalidad.

Reemplazar la Implementación de un Método de una Superclase

Algunas veces, una subclase querría reemplazar completamente la implementación de un método de su superclase. De hecho, muchas superclases proporcionan implementaciones de métodos vacías con la esperanza de que la mayoría, si no todas, sus subclases reemplacen completamente la implementación de ese método.

Un ejemplo de esto es el método run() de la clase Thread. La clase Thread proporciona una implementación vacía (el método no hace nada) para el método run(), porque por definición, este método depende de la subclase. La clase Thread posiblemente no puede proporcionar una implementación medianamente razonable del método run().

Para reemplazar completamente la implementación de un método de la superclase, simplememte se llama a un método con el mismo nombre que el del método de la superclase y se sobreescribe el método con la misma firma que la del método sobreescrito:

class ThreadSegundoPlano extends Thread {
    void run() {
        . . .
    }
}
La clase ThreadSegundoPlano sobreescribe completamente el método run() de su superclase y reemplaza completamente su implementación.

Añadir Implementación a un Método de la Superclase

Otras veces una subclase querrá mantener la implememtación del método de su superclase y posteriormente ampliar algún comportamiento específico de la subclase. Por ejemplo, los métodos constructores de una subclase lo hacen normalmente--la subclase quiere preservar la inicialización realizada por la superclase, pero proporciona inicialización adicional específica de la subclase.

Supongamos que queremos crear una subclase de la clase Windows del paquete java.awt. La clase Windows tiene un constructor que requiere un argumento del tipo Frame que es el padre de la ventana:

public Window(Frame parent)
Este constructor realiza alguna inicialización en la ventana para que trabaje dentro del sistema de ventanas. Para asegurarnos de que una subclase de Window también trabaja dentro del sistema de ventanas, deberemos proporcionar un constructor que realice la misma inicialización. Mucho mejor que intentar recrear el proceso de inicialización que ocurre dentro del constructor de Windows, podriamos utilizar lo que la clase Windows ya hace. Se puede utilizar el código del constructor de Windows llamámdolo desde dentro del constructor de la subclase Window:
class Ventana extends Window {
    public Ventana(Frame parent) {
        super(parent);
        . . .
            // Ventana especifica su inicialización aquí
        . . .
    }
}
El constructor de Ventana llama primero al constructor de su superclase, y no hace nada más. Típicamente, este es el comportamiento deseado de los constructores--las superclases deben tener la oportunidad de realizar sus tareas de inicialización antes que las de su subclase. Otros tipos de métodos podrían llamar al constructor de la supeclase al final del método o en el medio.

Métodos que una Subclase no Puede Sobreescibir

  • Una subclase no puede sobreescribir métodos que hayan sido declarados como final en la superclase (por definición, los métodos finales no pueden ser sobreescritos). Si intentamos sobreescribir un método final, el compilador mostrará un mensaje similar a este y no compilará el programa:
    FinalTest.java:7: Final methods can't be overriden. Method void iamfinal() 
    is final in class ClassWithFinalMethod.
        void iamfinal() {
             ^
    1 error
    Para una explicación sobre los métodos finales, puedes ver: Escribir Métodos y Clases Finales.

  • Una subclase tampoco pude sobreescribir métodos que se hayan declarado como static en la superclase. En otras palabras, una subclase no puede sobreescribir un método de clase. Puedes ver Miembros del Ejemplar y de la Clase para obtener una explicación sobre los métodos de clase.

Métodos que una Subclase debe Sobreescribir

Las subclases deben sobreescribir aquellos métodos que hayan sido declarados como abstract en la superclase, o la propia subclase debe ser abstracta. Escribir Clases y Métodos Abstractos explica con más detalle los métodos y clases abstractos.


Ozito