Sunteți pe pagina 1din 12

3.

7 HERENCIA
3.7.1 Concepto de Herencia
3.7.2 La clase Object
3.7.3 Redefinicion de metodos heredados
3.7.4 Clases y metodos abstractos
3.7.5 Constructores en clases derivadas
3.8 CLASES Y METODOS FINALES
3.9 INTERFACES
3.9.1 Concepto de interface
3.9.2 Definicin de interface
3.9.3 Herencia en interfaces
3.9.4 Utilizacin de interfaces
3.11 PERMISOS DE ACCESO EN JAVA
3.11.1 Accesibilidad de los packages
3.11.2 Accesibilidad de clases e interfaces
3.11.3 Accesibilidad de las variables y mtodos miembros de una clase
3.12 TRANSFORMACIONES DE TIPO: CASTING
3.12.1 Conversin de tipos primitivos
3.13 POLIMORFISMO
3.13.1 Conversin de objetos

http://thales.cica.es/rd/Recursos/rd99/ed99-0040-02/ed99-0040-02.html

HERENCIA
Se trata de un mecanismo que funciona como una estructura jerrquica, donde cada clase
puede tener una nica superclase (que se encuentra por encima de ella en la jerarqua) y una
o varias subclases (que se encuentran por debajo en la jerarqua). Las clases que se
encuentran por debajo se dice que heredan de las clases que se encuentran por encima.
Aqu tenis un diagrama que muestra un ejemplo de jerarqua:

En este diagrama:

La clase Empleado es la superclase de Director, Comercial e Informtico.


Las clases Director, Comercial e Informtico son subclases de la clase Empleado.
La clase Director es la superclase de Ejecutivo.
La clase Ejecutivo es la subclase de Director.

Las subclases heredan todos los mtodos y atributos de sus superclases. Por tanto, al definir
una subclase, esta tiene automticamente el mismo comportamiento que la superclase que
hereda. Y tened en cuenta que esta herencia sube en la jerarqua hasta llegar a la cumbre.
Existe una raz en esta jerarqua, que es la clase Object. Todas las clases creadas heredan las
caractersticas y el comportamiento de Object.

Si necesitamos aadir caractersticas y/o funcionalidades de una clase en otra clase,


debemos crear una subclase. Como ya hemos comentado, esta subclase heredar todo el
comportamiento de su superclase y nosotros simplemente deberemos aadir aquellos
atributos y mtodos especficos en la subclase que la diferencian de su superclase.
Cmo se define la herencia en Java?
Para indicar que una clase herada de otra, se utiliza la palabra reservada extends. Siguiendo
el ejemplo de ms arriba, deberamos definir las clases de la siguiente manera:
class Empleado {}
class Director extends Empleado {}
class Comercial extends Empleado {}
class Informatico extends Empleado {}
class Ejecutivo extends Director {}
Como podis observar, se define de manera totalmente natural a como se expresa en
nuestro propio lenguaje.
Mtodo constructor
Cuando se crea un objeto de una clase heredada, primero se llamar al constructor de su
superclase y a continuacin al constructor propio.
Continuando con el ejemplo de los empleados, si creamos un objeto Comercial:
Comercial unObjetoComercial = new Comercial();

En primer lugar se llamar al constructor de la clase Empleado y a continuacin al


constructor de la clase Comercial.
Podis hacer una sencilla prueba de este comportamiento, creando un nuevo proyecto,
llamado por ejemplo Herencia y dentro de este proyecto:
- Creis una clase Empleado con el siguiente cdigo:
public class Empleado {
public Empleado () {
System.out.println(Empleado);
}
}
- Creis una clase Comercial con el siguiente cdigo:
public class Comercial extends Empleado{
public Comercial () {
System.out.println(Comercial);
}
}
- Creis una clase TestHerencia con el siguiente cdigo:
public class TestHerencia {
public static void main(String[] args) {
Comercial unObjetoComercial = new Comercial();
}
}
Al ejecutar el cdigo se puede comprobar cmo aparece primero el mensaje Empleado (se
ha llamado al constructor Empleado()) y, a continuacin, el mensaje Comercial (se ha
llamado al constructor Comercial()).
Redefinicin de funciones

En ocasiones, conviene tener mtodos en las clases heredadas con la misma signatura
(nombre de mtodo y parmetros que admite). Por ejemplo, podra ser interesante tener un
mtodo llamado sueldo en cada una de las clases que tuviese cdigo especfico para
controlar las bonificaciones especficas segn el cargo del empleado en la empresa. As,
tendramos algo parecido a esto:
_________________________________________________________
//Cdigo de Empleado.java
public class Empleado {
public Empleado () {
System.out.println(Empleado);
}
public void sueldo() {
System.out.println(Sueldo base de un empleado);
}
}
// Cdigo de Comercial.java
public class Comercial extends Empleado{
public Comercial () {
System.out.println(Comercial);
}
public void sueldo() {
System.out.println(Sueldo base de un empleado+sueldo especfico del cargo de
comercial);
}
}

// Cdigo de TestHerencia.java

public class TestHerencia {


public static void main(String[] args) {
Comercial unObjetoComercial = new Comercial();
unObjetoComercial.sueldo();
}
}
__________________________________________________________
Como es de esperar, al ejecutar el mtodo sueldo() aparece el cdigo de la clase Comercial.
Lo que debemos tener en cuenta en este caso es que estamos ocultando el mtodo de la
superclase en la clase heredada.
Polimorfismo
Esta es la ltima herramienta que nos proporciona la herencia. Se trata de la capacidad que
tiene un objeto de una superclase de convertirse en un objeto de cualquiera de sus
subclases. Es decir, Java permite realizar intrucciones de este tipo:
Empleado unObjetoComercial = new Comercial();
unObjetoComercial est definida como un objeto de la clase Empleado, pero se le reserva
espacio de memoria como un objeto de tipo Comercial. Esto es correcto (y ni en la
compilacin ni en la ejecucin habr errores) ya que la clase Comercial hereda de la clase
Empleado.

Clases abastractas: A menudo existen clases que sirven para definir un tipo genrico
pero que no tiene sentido instanciar (crear objetos de ella). Queremos definir un
grupo genrico de clases y adems tengamos algunos mtodos implementados que
reutilizar.

Mtodos abstractos: Un mtodo abstracto significa que tiene que ser sobrescrito. No
est implementado.

Una clase con uno o varios mtodos abstractos tiene que ser declarada abstracta.

No obstante una clase abstracta no tiene porque tener mtodos abstractos.

SOBREESCRITURA: La subclase reimplementa el mtodo heredado (cambian el


comportamiento).

SOBRECARGA: Varias implementaciones del mismo mtodo con distintos


parmetros (cambio de interfaz). Muy habitual en constructores.
Es aqu donde realmente se aprecia los beneficios del polimorfismo.
Sobrecargando el constructor conseguimos dotar a la clase de flexibilidad.
Pero siempre debe quedar claro que tras la conexin polimorfa nicamente
podemos acceder a las operaciones pertenecientes a la clase asociada a la
referencia. El resto de operaciones del objeto no son accesibles a travs de
esta referencia

Subclase: Necesitemos hacer una especializacin de la superclase mediante


sobreescritura o aadiendo nuevos mtodos.

Interface: Queremos definir un grupo genrico de clases y no tengamos mtodos


implementados que reutilizar. O cuando nos
veamos forzados por la falta de herencia mltiple en Java.

Haremos un interface cuando queramos definir un grupo genrico de clases


y no tengamos mtodos implementados que reutilizar. O cuando nos
veamos forzados por la falta de herencia mltiple en Java.

Los interfaces en Java nos solucionan en parte la no existencia de la herencia


mltiple.

Los interfaces son un tipo de clase especial que no implementa ninguno de sus
mtodos. Todos son abstractos. Por tanto no se pueden instanciar.

De los interfaces tambin se hereda, aunque se Suele decir implementa. Y se realiza


mediante la keyword: implements.

Si una clase que hereda de un interface, no implementa todos los mtodos de este,
deber ser definida como abstracta.

HERENCIA MULTIPLE
Todos sabemos que la herencia es un mecanismo propio de la programacin orientada a
objetos POO. Nos permite crear clases a partir de otra, las cuales las unen vnculos
sumamente estrechos, casi de familia. Es por ello que se llama herencia.
Si buscamos modelar nuestras clases u objetos como propios de la realidad, todos los
conceptos de la orientacin a objetos nos sern muy fcil de implementar mientras
programamos.
Implementando herencia tenemos las siguientes ventajas:
Modelado de la realidad
Evitar redundancias en el cdigo
Facilita la reutilizacin del cdigo, as como reduce el nmero de lneas a escribir
Sirve como el soporte o la base para el polimorfismo

Es muy sencilo implementar la herencia de clases en Java. Basndonos en el diagrama de


arriba, si queremos crear la clase gallina solo debemos de interponer la palabra reservada
extends. Por lo tanto la declaracin de la clase quedara constituida de la siguiente manera:
public class Gallina extends Ave{
}
Ahora podemos tener dentro de gallina, todos los atributos y mtodos propios de una Ave.
Esta forma de herencia es llamada herencia simple, ya que solamente hay una clase padre o
superclase. Existe una forma de herencia definida dentro de los conceptos de la
programacin orientada a objetos en la cual una clase puede heredar de dos o ms clases
padres o superclases. Se llama Herencia Mltiple.
La herencia mltiple en java no es soportada nativamente. Sin embargo muchos autores y
desarrolladores la simulan utilizando la palabra reservada implements e interfaces, que
sirve para implementar o cubrir una clase con respecto a otra.

Supongamos el siguiente escenario:

Un alumno de la ctedra de Programacin II adems que es una persona consagrada,


tambin es un hijo de familia que debe responder con buenas notas en su travesa por la
universidad. Es decir que una clase alumno debera de heredar de ambos objetos. Hacer este
pequeo diagrama UML en cdigo Java no se puede nativamente hablando, solamente con
una simulacin. La manera de realizarla es la siguiente:
public class Persona {
}
public class Hijo{
}
interface iHijo{
//La interface pertenece a la clase Hijo
}
public class Alumno extends Persona implements iHijo{
}
Con la ayuda de las interfaces simulamos la herencia mltiple. Una interface no es ms que
la implementacin de los mtodos de una clase. Con la ayuda de stos podemos accesar a
los mtodos de la clase Hijo y heredar directamente todo lo que pertenece a Persona. Fcil,
pero a la vez confuso, No?
Conclusin: Se debe utilizar la herencia mltiple? A mi forma de pensar, si no est
implementada nativamente, se debera de evitar el uso de una simulacin que va en contra
de la naturaleza del lenguaje. Adems pienso que todo problema que o esquema de clases se
pueden llegar a plantear de forma que solamente utilicemos la herencia simple, ya que es
ms sencilla y es ms natural que se herede de un solo padre.
Como ejercicio al lector, le pido que plantee el esquema de clases para el ejemplo utilizado
en la simulacin de la herencia mltiple. Cmo lo planteara con herencia simple?

Herencia y polimorfismo
Con la herencia podemos definir una clase a partir de otra que ya exista, de forma que la
nueva clase tendr todas las variables y mtodos de la clase a partir de la que se crea, ms
las variables y mtodos nuevos que necesite. A la clase base a partir de la cual se crea la
nueva clase se le llama superclase.

Figura 1. Ejemplo de herencia


Por ejemplo, tenemos una clase genrica Animal, y heredamos de ella para formar clases
ms especficas, como Pato , Elefante, o Len. Si tenemos por ejemplo el mtodo
dibuja(Animal a), podremos pasarle a este mtodo como parmetro tanto un Animal como
un Pato, Elefante, etc. Esto se conoce como polimorfismo .
Clases abstractas e interfaces
Mediante las clases abstractas y los interfaces podemos definir el esqueleto de una familia
de clases, de forma que los subtipos de la clase abstracta o la interfaz implementen ese
esqueleto para dicho subtipo concreto. Por ejemplo, podemos definir en la clase Animal el
mtodo dibuja() y el mtodo imprime(), y que Animal sea una clase abstracta o un interfaz.

Figura 2. Ejemplo de interfaz y clase abstracta


Vemos la diferencia entre clase, clase abstracta e interfaz con este esquema:
En una clase, al definir Animal tendramos que implementar los mtodos dibuja() e
imprime(). Las clases hijas no tendran por qu implementar los mtodos, a no ser
que quieran adaptarlos a sus propias necesidades.

En una clase abstracta podramos implementar los mtodos que nos interese,
dejando sin implementar los dems (dejndolos como mtodos abstractos). Dichos
mtodos tendran que implementarse en las clases hijas.
En un interfaz no podemos implementar ningn mtodo en la clase padre, y cada
clase hija tiene que hacer sus propias implementaciones de los mtodos. Adems,
las clases hija podran implementar otros interfaces.

____________________

Otras posibilidades

Herencia: Se utiliza la palabra extends para decir de qu clase se hereda. Para


hacer que Pato herede de Animal:
class Pato extends Animal

this se usa para hacer referencia a los miembros de la propia clase. Se utiliza cuando
hay otros elementos con el mismo nombre, para distinguir :
public class MiClase {
int i;
public MiClase (int i) {
this.i = i;
// i de la clase = parametro i
}
}

super se usa para llamar al mismo elemento en la clase padre. Si la clase MiClase
tiene un mtodo Suma_a_i(...), lo llamamos con:
public class MiNuevaClase extends MiClase {
public void Suma_a_i (int j) {
i = i + (j / 2);
super.Suma_a_i (j);
}
}

Modificadores: en algunos elementos (campos, mtodos, clases, etc) se utilizan


algunos de estos modificadores al declararlos:
o
o
o
o
o
o
o

public: cualquier objeto puede acceder al elemento


protected: slo pueden acceder las subclases de la clase.
private: slo pueden ser accedidos desde dentro de la clase.
abstract: elemento base para la herencia (los objetos subtipo debern definir
este elemento).
static: elemento compartido por todos los objetos de la misma clase.
final: objeto final, no modificable ni heredable.
synchronized: para elementos a los que no se puede acceder al mismo
tiempo desde distintos hilos de ejecucin.

Clases abstractas e Interfaces: si queremos definir una clase (por ejemplo,


Animal), como clase abstracta o como interfaz, se declara como sigue

(respectivamente). Tambin se indica cmo hacer una clase o interfaz subtipo de la


clase o interfaz padre (en este caso, la subclase es Pato):

public interface Animal


{
void dibujar ();
void imprimir ();
}
public class Pato implements Animal
{
void dibujar() { codigo; }
void imprimir() { codigo; }
}
public abstract class Animal
{
abstract void dibujar ();
void imprimir () { codigo; }
}
public class Pato extends Animal
{
void dibujar() { codigo; }
}

Paquetes: la palabra package permite agrupar clases e interfaces. Los nombres de


los paquetes son palabras separadas por puntos, y se almacenan en directorios que
coinciden con esos nombres. As, si definimos la clase:
package paquete1.subpaquete1;
public class MiClase1_1
...

haremos que la clase MiClase1_1 pertenezca al subpaquete subpaquete1 del paquete


paquete1.
Para utilizar las clases de un paquete utilizamos import.

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