Sobrescritura de Métodos de Superclase
Una subclase puede sobrescribir un método de la superclase. Sobrescribir un método es reemplazar un método heredado por otro específico de la subclase.
Java en tiempo de ejecución, en función del tipo del objeto que llama al método elegirá la ejecución de uno u otro. Esta capacidad de elegir entre métodos en tiempo de ejecución, basándose en el tipo, se llama polimorfismo.
Polimorfismo
El polimorfismo se basa en la forma en la que las personas construyen y usan los objetos en el mundo real. Es decir, ciertos hechos o métodos, se aplican a todos los objetos de un cierto tipo.
Por ejemplo, cuando quiero ver la televisión la primera cosa que hago es encenderla, esta propiedad de apagado/encendido es compartida por el televisor con otros aparatos eléctricos. Yo como usuario enciendo todos estos aparatos casi de la misma forma, aunque cada aparato internamente lo implementa de distinta.
En términos de POO y del concepto de herencia diremos que hay una clase genérica ‘Aparatos’ que tiene un método Encendido y que de esta clase heredan todo un conjunto de subclases (Televisor, Ordenador, Horno, etc…) que lo sobreescriben.
El polimorfismo aumenta el nivel de abstracción de un programa, facilitando la tarea al programador (claridad en el código y en la lógica) y mejora el mantenimiento de la aplicación, así como la capacidad de reutilización de las clases, ya que me va a permitir heredar información de ellas y crearme nuevas clases.
Invocación a Métodos de una superclase
¿Qué tenemos que hacer si queremos llamar a un método de la superclase?
Al igual que con la llamada al constructor de la superclase, podremos utilizar el calificador super.NombreMétodoSuperclase para referirnos a un método de la superclase desde la sublcase.
Clases Abstractas
En nuestro afán de generalizar, buscaremos una clase genérica que aunque no tenga ningún objeto físico, me permita definir como concepto abstracto todos los objetos de las subclases.
Esto es lo que se conoce como clase abstracta, y no puede tener ningún objeto como instancia de ella.
Para la definición de una clase abstracta utilizaremos la palabra reservada abstract delante del tipo de acceso y de la palabra class.
Al igual que con clases abstractas podemos definir un método como abstracto, lo que significa que no puede ser definido en la superclase, sino que será redefinido en las subclases.
Utilización de final con herencia
Dentro de la herencia, la utilización de final tiene fundamentalmente dos usos:
– Definición de métodos sin sobrescritura
-Definición de clases finales final para evitar la sobreescritura
Final para evitar sobre escritura
A veces es conveniente evitar la sobrescritura de métodos. Cuando deseemos que un método no pueda ser sobrescrito, utilizaremos la palabra clave finalal principio de su declaración.
public class Vehiculo {
final void meth () {
System.out.println (“Este es un método final”);
}
}
public class Automovil extends Vehiculo {
void meth () { //ERROR no se puede sobrescribir
System.out.println (“Esto es un ERROR”);
}
}
A diferencia de los métodos normales cuyo ‘linkado’ se produce en tiempo de Ejecución, al no poderse sobreescribir los métodos finales se linkan en tiempo de Compilación, mejorando sensiblemente el rendimiento
Definición de Clases Finales
Cuando queremos evitar que una clase pueda ser heredada, utilizaremos también la palabra clave final en la declaración de la clase.
Cuando definimos una clase como final, estamos declarando también implícitamente todos sus métodos como final.
public final class Vehiculo {
void meth () {
System.out.println (“Es una clase y un método final”);
}
}
public class Automovil extends Vehiculo { //ERROR no se puede
// heredar de una clase
// final
}
El puntero THIS
Algunas veces un método necesita hacer referencias al objeto que lo invocó. Para permitir esto Java define la palabra clave this que puede ser utilizada dentro de cualquier método para referirse al objeto actual.
This es siempre una referencia al objeto sobre el que ha sido llamado el método se puede utilizar this siempre que se requiera una referencia a un objeto del tipo de la clase actual.
void Box (double w, double h, double d) {
this.width = w;
this.height = h;
this.depth = d;
}
- Índice Introducción a Java
- Origen del lenguaje de programación Java, un recorrido por los Orígenes de este lenguaje de programación.
- Características fundamentales del lenguaje de programación Java. En este capítulo se abordan las características principales que nos ofrece Java respecto a cualquier otro lenguaje de programación.
- Sintaxis del Lenguaje de programación Java.
- Arrays en Java
- Operadores en Java
- Estructuras de Control de Flujo en Java: Estructura If/If-Else, Switch, Break, For
- Clases: Definición, Constructor y Finalizadores en Java
- Interfaces en Java
- Paquetes en Java
- Applets en Java
- Abstract Windowing Toolkit (AWT) en Java
- Manejo de Ratón en Java
- Manejo de Imágenes en Java
- Manejo de audio en Java