Anda di halaman 1dari 24

Herencia y Sobreescritura de Mtodos

Curso: Topicos I. Docente: Ing. Mendoza Corpus Carlos.


CLASE 03

Herencia
Podemos definir la herencia como la capacidad de crear clases que adquieran de manera automtica los atributos y mtodos de otras clases que ya existen, pudiendo al mismo tiempo aadir atributos y mtodos propios.

Ventajas de la Herencia
Entre las principales ventajas que ofrece la herencia en el desarrollo de aplicaciones estn:

Reutilizacin de cdigo. En aquellos casos donde se necesite crear una clase que, adems de mtodos propios, debe incluir los mtodos definidos en otra, la herencia evita tener que reescribir todos esos mtodos en la nueva clase.

Ventajas de la Herencia

Mantenimiento de Aplicaciones existentes. Utilizando la herencia, si tenemos una clase con una determinada funcionalidad y tenemos la necesidad de ampliar dicha funcionalidad, no necesitamos modificar la clase existente (la cual se puede seguir utilizando para el tipo de programa que fue diseada) sino que podemos crear una clase que herede a la primera, adquiriendo toda su funcionalidad y aadiendo la suya propia.

Nomenclatura y Reglas

En POO, a la clase que va a ser heredada se le llama clase padre, superclase o clase base, mientras que a la que hereda se le conoce como clase hija, subclase o clase derivada.

Nomenclatura y Reglas

Utilizando la notacin UML, la herencia entre dos clases se representa como una flecha saliendo de la subclase hacia la superclase.
Clase Padre

Generalizacin/Especializacin

Clase Hija

La Relacion es un

La herencia entre dos clases establece una relacin entre las mismas de tipo es un, lo que significa que un objeto de una subclase tambin es un objeto de la superclase.

Por ejemplo, Vehculo es una superclase de Automvil, por lo que un automvil es un Vehculo. De la misma forma Animal es la superclase de Mamfero y esta a su vez superclase de Len, esto nos lleva a que Len es un Mamfero y es un animal.

Reglas Bsicas
Hay unas reglas bsicas sobre la herencia en Java que hay que tener presentes

En Java se implementa la herencia simple. En Java no se puede implementar la herencia Mltiple, aunque puede simularse.

Reglas Bsicas

Si es posible la herencia multinivel, es decir, A puede ser Heredada por B y B puede ser heredada por C. Una clase puede ser heredada por varias clases: una clase padre puede tener varias clases hijas.

Creacin de Herencia en Java


A la hora de definir una clase que va a heredar de otra clase se utiliza la palabra extends, seguida del nombre de la superclase en la cabecera de la declaracin:

public class SubClase extends SuperClase { // cdigo de la subclase }


La nueva clase podr incluir atributos y mtodos propios para completar su funcin.

10

La Clase Object
Todas las clases de Java heredan alguna clase. En caso de que no se especifique mediante extends la clase que se va a heredar, implcitamente hereda de Object.
Esta clase se encuentra en el paquete java.lang y proporciona el soporte bsico para cualquier clase Java.

11

La Clase Object
As pues, la definicin de una clase que no herede explcitamente a otra equivale a: public class NombreClase extends Object { // cdigo de la clase }

La clase Object es, por tanto, la superclase de todas las clases de Java.

12

Ejecucin de constructores con la herencia

Hay que hacer especial mencin al comportamiento de los constructores de la superclase y subclase cuando se va a crear un objeto de esta ltima.

Como norma universal, cada vez que en Java se crea un objeto de una clase, antes de ejecutarse el constructor de dicha clase se ejecutar primero el de su superclase.

Esto se puede verificar al observar la ejecucin del mtodo main() del siguiente programa:

13

Ejemplo de herencia
public class Primera { public Primera() { System.out.println(Constructor de la superclase); } }
public class Segunda extends Primera { public Segunda() { System.out.println(Constructor de la subclase); } }
14

Ejemplo de herencia
public class Principal { public static void main(String args[]) { Segunda s = new Segunda(); } } Aparecer en la pantalla: Constructor de la superclase Constructor de la subclase
15

Ejemplo de herencia
La explicacin a esta situacin la tenemos en el hecho de que el compilador java, aade, como primera lnea de cdigo en todos los constructores de una clase la siguiente instruccin: super();
Instruccin que provoca una llamada al constructor sin parmetros de la superclase.

Los constructores por defecto tambin incluyen esta instruccin, as pues, el aspecto real de estos constructores es: public NombreClase() { super(); }
16

Ejemplo de herencia
Si en vez de llamar al constructor sin parmetros quisiramos invocar a cualquier otro constructor de la superclase, deberamos hacerlo explcitamente, aadiendo como primera lnea del constructor de la subclase la instruccin: super(argumentos)
Los argumentos son los parmetros que necesita el constructor de la superclase que se desea invocar. Esto permite entre otras cosas, que el constructor de la subclase pueda pasarle al constructor de la superclase los datos necesarios para la inicializacin de los atributos privados y que no son accesibles desde la subclase.

17

Mtodos y atributos Protegidos

Existe un modificador de acceso aplicable a atributos y mtodos de una clase, pensando para ser utilizado con la herencia. Se trata del modificador protected.

Un miembro de una clase (atributo o mtodo) definido como protected ser accesible desde cualquier subclase de sta, independientemente de los paquetes en que estas clases se encuentren.

18

Sobreescritura de Mtodos
Cuando una clase hereda de otra, el comportamiento de los mtodos que hereda no siempre se ajusta a las necesidades de la nueva clase. En estos casos, la subclase puede optar por volver a reescribir el mtodo heredado, es lo que se conoce como sobreescritura de un mtodo.

A la hora de sobrescribir un mtodo hay que tener en cuenta las siguientes reglas:

19

Reglas para la Sobreescritura de Mtodos

Cuando se sobrescribe un mtodo en una subclase, ste debe tener exactamente el mismo formato que el mtodo de la superclase que sobrescribe. Esto significa que deben llamarse igual, tener los mismos parmetros y mismo tipo de devolucin.
public class Primera { public String toString() { System.out.println(Esta es la superclase); } } public class Segunda extends Primera { public String toString() { System.out.println(Esta es la subclase); } }
20

Reglas para la Sobreescritura de Mtodos

Hay que tener presente si al intentar sobrescribir un mtodo en una subclase se mantiene el mismo nombre y se modifican los parmetros, el nuevo mtodo no sobrescribe al de la superclase pero tampoco ocurre un error de compilacin, ya que estaramos en un caso de sobrecarga de mtodos: dos mtodos con el mismo nombre y distintos parmetros.
public class Primera { public int suma(int x, int y) { return x + y; } public class Segunda extends Primera { } public int suma(int x, int y, int z() { return x + y + z; } }
21

Reglas para la Sobreescritura de Mtodos

El mtodo sobrescrito puede tener un modificador de acceso menos restrictivo que el de la superclase. Por ejemplo, el mtodo de la superclase puede ser protected y la versin sobrescrita en la subclase puede ser public, pero nunca uno ms restrictivo.
public class Primera { protected int suma(int x, int y) { return x + y; } public class Segunda extends Primera { } public int suma(int x, int y, int z() { return x + y + z; } }
22

Reglas para la Sobreescritura de Mtodos

Para llamar desde el interior de la subclase a la versin original del mtodo de la superclase, debe utilizarse la expresin: super.nombreMetodo(argumentos);

Si no se utiliza super delante del nombre del mtodo, se llamar a la versin sobrescrita de la clase.

23

Clases Finales
Si queremos evitar que una clase sea heredada por otra, deber ser declarada con el modificador final delante de class: public final class ClaseA { . }

Si otra clase intenta heredar una clase final se producir un error de compilacin. Por ejemplo esta clase no compilar: public class ClaseB extends ClaseA { // cdigo de la ClaseB }
24