Sunteți pe pagina 1din 5

Tema 2.

Elementos del lenguaje Java


Autor: Miguel Toro Bonilla
Revisin: Jos C. Riquelme, Antonia M. Reina
ltima actualizacin: Marzo 2013

6. Herencia

6.1 Introduccin al concepto de Herencia
Una de las caractersticas principales que distinguen la POO es la facilidad que da para reutilizar cdigo. La
reutilizacin en la programacin imperativa en lenguajes como el C era mucho ms difcil de conseguir. La
separacin entre los tipos de datos y las funciones que trataban esos datos dificultaba e incluso impeda que
un cdigo escrito en C para una aplicacin pudiera ser reutilizable por otra.

La POO presenta dos mecanismos bsicos de reutilizacin denominados composicin y herencia. El
mecanismo de composicin ya lo hemos estudiado en el primer tema y consiste en declarar las propiedades
de un tipo (los atributos de su clase) como pertenecientes a otro tipo ya implementado. El primer ejemplo
que hemos estudiado es el tipo Circulo, cuya propiedad centro es del tipo Punto. En realidad, ya el tipo
Punto est reutilizando por composicin pues sus atributos son de tipo Double que es un tipo que Java
proporciona
1
.

La segunda posibilidad de reutilizacin es un mecanismo ms potente y complejo: la herencia. La herencia
permite definir nuevos tipos como refinamientos de tipos ya creados a los que normalmente se les aade
alguna propiedad o restriccin.

Ejemplo: Supongamos queremos disear una aplicacin software para gestionar un Centro de Salud. La
aplicacin manejar el tipo Persona pero estn involucrados varios tipos de Personas en la gestin del
Centro: mdicos de plantilla, mdicos externos, otro personal sanitario, administrativos, pacientes de pago,
pacientes de compaa, etc. Cada uno de esos tipos tiene propiedades comunes (por ejemplo Nombre y
Apellidos) y propiedades que los diferencian. Por ejemplo, los mdicos tendrn la propiedad comn
Especialidad pero si son Externos tendrn una propiedad Dedicacin que los de Plantilla no tienen.
Igualmente los pacientes de compaa tendrn una propiedad Aseguradora que los de pago no tendrn. Por
tanto, la herencia es un mecanismo que define una jerarqua de tipos de forma que los tipos que se sitan
arriba de esta jerarqua son los que tienen propiedades comunes y estos tipos se van refinando con ms
propiedades:

1
Esta posibilidad tambin la tiene el C, por ejemplo cuando se define un array de struct.

2 Programacin Orientada a Objetos
Figura 1. Jerarqua de Figuras Planas

Otro ejemplo de relacin jerrquica de herencia muy usado en los libros de texto es el de las figuras en el
plano:
Figura 13. Jerarqua de Figuras Planas
La principal forma de distinguir si el tipo A es reutilizado por el tipo B mediante composicin o herencia es
mediante dos preguntas:
1. Herencia: B es A?
2. Composicin: A es parte de B? o tambin B tiene a A?

De esta manera la relacin entre el tipo Mdico y Persona es herencia, pues un Mdico es una Persona, y no
un Mdico tiene una Persona. Igualmente un Rectngulo es un Polgono que a su vez es una Figura. Sin
embargo, entre Crculo y Punto la relacin es de composicin porque un Crculo tiene un Punto (como su
centro) y adems un Crculo no es un Punto.

La herencia permite reutilizar los atributos y mtodos de una clase en la definicin de otras nuevas. Las
subclases de una clase heredan las operaciones de sta y pueden aadir nuevos atributos y operaciones. La
herencia es una relacin entre tipos, no entre objetos, y caracterizan la programacin orientada a objetos.
Persona
Empleado
ATS Medico
MedicoPlantilla MdicoExterno
Administrativo
Proveedor Paciente
Asegurado Privado
Figura
Polgono
Tringulo Cuadrilatero
Rectngulo Rombo
Cuadrado
Pentgono ....
Elipse
Crculo

3 2. Elementos del lenguaje Java

La relacin de herencia es una relacin de especializacin entre tipos, de forma que los objetos del tipo que
heredera (subtipo o tipo hijo) se pueden considerar tambin instancias del tipo heredado (supertipo o tipo
padre). En efecto, en el ejemplo que se describe ms adelante todo pixel es tambin un punto, y hereda su
comportamiento; es decir, un pixel posee coordenadas y es posible calcular la distancia entre dos pxeles. La
diferencia radica en que, adems, poseen un Color y es posible realizar cambios de color. Un subtipo puede
usar los mtodos del supertipo o redefinirlos. En este caso, tendrn la misma signatura aunque distinto
cdigo.

6.1. Declaracin
La herencia es una propiedad por la que se establecen relaciones que podemos denominar padre-hijo entre
interfaces o entre clases. La herencia se representa mediante la clusula extends. En Java la herencia entre
interfaces puede ser mltiple: un hijo puede tener uno o varios padres. La interfaz hija tiene todas las
signaturas (mtodos) declaradas en los padres. No se puede ocultar ninguna. La sintaxis para la interfaz con
herencia responde al siguiente patrn:

[Modificadores] interface NombreInterfazHija extends NombreInterfacesPadres [,] {
[]
[signatura de mtodos]
}

Mediante extends se indica que la interfaz que estamos definiendo combina otras interfaces padres y,
posiblemente, aade algunos mtodos ms. Cuando una interfaz extiende a otra decimos que el tipo
definido por la interface hija es un subtipo del tipo definido por la interfaz padre.

Una clase puede heredar de otra clase. Esto se expresa tambin mediante la clusula extends. En Java una
clase solo puede heredar de una clase padre. Una clase puede implementar varios interfaces. Esto se
especifica mediante la clusula implements.
La sintaxis para la clase hija responde al siguiente patrn:
[Modificadores] class NombreClaseHija extends NombreClasePadre
[implements NombreInterfaz, ] {
[atributos ]
[mtodos ]
}
Mediante extends se indica que la clase que estamos definiendo hereda de otra clase padre. La relacin de
herencia entre clases indica que todos los mtodos pblicos (junto con su cdigo) estn disponibles para la
clase hija. Entre los mtodos pblicos se incluyen los constructores pblicos. Ms adelante veremos que
tambin estn disponibles los mtodos y atributos con otras visibilidades.
6.2. Uso del concepto super
En la clase hija se puede acceder a los mtodos de la clase padre mediante la palabra reservada super. Con
esta palabra reservada se pueden formar nuevas expresiones en el cuerpo de una clase que hereda de otra.
Las expresiones que se pueden formar se componen de la palabra super y el operador punto (.) seguido de
algunos de los mtodos de la clase padre visibles en la clase hija. Por ahora, los nicos mtodos visibles son

4 Programacin Orientada a Objetos
los pblicos (public). La palabra reservada super tambin sirve para acceder a los constructores de la clase
padre visibles desde la hija. En este caso super ir seguido de parntesis y una secuencia de parmetros, y
representar la invocacin del correspondiente constructor de la clase padre. Es decir, el constructor de la
clase padre, visible desde la hija y que tenga los parmetros que se han proporcionado la tras la palabra
super. Algunos ejemplos de expresiones de este tipo son:

Ejemplo 1 (usos de la palabra reservada super):
super.m(2.0);
..
super(2,3);

En la primera se invoca al mtodo m de la clase padre con parmetro 2.0. Y en la segunda, se invoca al
constructor de la clase padre que tendr dos parmetros de tipo int.
Una clase slo puede heredar de otra clase, pero puede implementar varias interfaces. La relacin que se
establece entre una clase y cada una de las interfaces que implementa la llamaremos relacin de
implementacin. La relacin de implementacin obliga a la clase a implementar (proporcionar cdigo) a
cada uno de los mtodos de la interfaz implementada.
6.3. El tipo Pixel
Ejemplo 2 (herencia de interfaces: Pixel):
public enum Color {
ROJO, NARANJA, AMARILLO, VERDE, AZUL, VIOLETA
}
public interface Pixel extends Punto {
Color getColor();
void setColor(Color c);
}

La interfaz Pixel hereda de Punto, y aade una nueva propiedad, consultable y modificable, denominada
Color. Una vez que hemos diseado los tipos anteriores, debemos implementarlos. La implementacin del
tipo Pixel la hacemos en la clase PixelImpl. Para implementar esta clase reutilizamos la clase PuntoImpl,
heredando de ella.
Ejemplo 3 (implementacin de PixelImpl reutilizando mediante herencia PuntoImpl)
public class PixelImpl extends PuntoImpl implements Pixel {
private Color color;
public PixelImpl () {
super();
this.color = Color.VERDE;
}
public PixelImpl (Double x, Double y, Color color) {
super(x,y);
this.color = color;
}
public Color getColor (){
return this.color;
}
public void setColor (Color color){
this.color=color;
}
public String toString(){

5 2. Elementos del lenguaje Java
String s = super.toString();
s = s+"."+color;
return s;
}
}
Como podemos ver, dentro del cuerpo de la clase PixelImpl se usan las palabras reservadas super y this. La
clase PixelImpl debe implementar Pixel, es decir, todos sus mtodos, pero para ello reutiliza el cdigo ya
disponible en PuntoImpl. Dentro del cdigo de PixelImpl, que hereda de PuntoImpl, super.m(..) se refiere al
mtodo m de la clase PuntoImpl. Igualmente, super(x,y) se refiere al constructor con dos parmetros Double
de la clase PuntoImpl. Sin embargo, this.color se refiere al atributo color de la clase PixelImpl.
6.4. Polimorfismo
Polimorfismo es la capacidad de que un objeto declarado de un tipo pueda hacer referencia a objetos de
otro tipo. En Java esa capacidad est limitada a los subtipos del declarado inicialmente. De esta forma, un
objeto de un tipo puede apuntar a objetos de cualquiera de sus subtipos. En el ejemplo anterior
Punto p;

p = new PuntoImpl(2.0,3.0);

// y ms adelante

p = new PixelImpl(2.0,3.0,Color.AMARILLO);
Tambin puede hacerse a nivel de asignacin entre objetos:
Punto p = new PuntoImpl(-1.0,1.0);
Pixel q = new PixelImpl(-2.0,2.0,Color.VERDE);

p=q; // es vlido
q=p; // da un error de compilacin
q= (Pixel) p; // da un error (excepcin) en tiempo de ejecucin
Tambin es posible invocar a mtodos de un tipo invocados por un subtipo o pasando como argumentos
objetos de algn subtipo. Por ejemplo las dos invocaciones siguientes son vlidas y daran el mismo
resultado:
Double d1=p.getDistanciaAOtroPunto(q);

Double d2=q.getDistanciaAOtroPunto(p);
Si un subtipo redefine un mtodo, en tiempo de ejecucin Java selecciona el mtodo a invocar dependiendo
del tipo del objeto que invoca. Esto es, si Pixel hubiera redefinido el concepto de distancia entre dos puntos
por ejemplo a la distancia Manhattan, las dos invocaciones anteriores hubieran dado resultados distintos.

S-ar putea să vă placă și