Sie sind auf Seite 1von 19

3.

1 Definicin: Clase base y clase derivada



Introduccin
La herencia es una propiedad esencial de la Programacin Orientada a Objetos que consiste en la
creacin de nuevas clases a partir de otras ya existentes. Este trmino ha sido prestado de la
Biologa donde afirmamos que un nio tiene la cara de su padre, que ha heredado ciertas facetas
fsicas o del comportamiento de sus progenitores.
La herencia es la caracterstica fundamental que distingue un lenguaje orientado a objetos, como
el C++ o Java, de otro convencional como C, BASIC, etc. Java permite heredar a las clases
caractersticas y conductas de una o varias clases denominadas base. Las clases que heredan de
clases base se denominan derivadas, estas a su vez pueden ser clases bases para otras clases
derivadas. Se establece as una clasificacin jerrquica, similar a la existente en Biologa con los
animales y las plantas.
La herencia ofrece una ventaja importante, permite la reutilizacin del cdigo. Una vez que una
clase ha sido depurada y probada, el cdigo fuente de dicha clase no necesita modificarse. Su
funcionalidad se puede cambiar derivando una nueva clase que herede la funcionalidad de la clase
base y le aada otros comportamientos. Reutilizando el cdigo existente, el programador ahorra
tiempo y dinero, ya que solamente tiene que verificar la nueva conducta que proporciona la clase
derivada.
La programacin en los entornos grficos, en particular Windows, con el lenguaje C++, es un
ejemplo ilustrativo. Los compiladores como los de Borland y Microsoft proporcionan libreras
cuyas clases describen el aspecto y la conducta de las ventanas, controles, mens, etc. Una de
estas clases denominada TWindow describe el aspecto y la conducta de una ventana, tiene una
funcin miembro denominadaPaint, que no dibuja nada en el rea de trabajo de la misma.
Definiendo una clase derivada de TWindow, podemos redefinir en ella la funcin Paint para que
dibuje una figura. Aprovechamos de este modo la ingente cantidad y complejidad del cdigo
necesario para crear una ventana en un entorno grfico. Solamente, tendremos que aadir en la
clase derivada el cdigo necesario para dibujar un rectngulo, una elipse, etc.
En el lenguaje Java, todas las clases derivan implcitamente de la clase base Object, por lo que
heredan las funciones miembro definidas en dicha clase. Las clases derivadas pueden redefinir
algunas de estas funciones miembro como toString y definir otras nuevas.
Los programadores crean clases base:
1. Cuando se dan cuenta que diversos tipos tienen algo en comn, por ejemplo en el
juego del ajedrez peones, alfiles, rey, reina, caballos y torres, son piezas del juego.
Creamos, por tanto, una clase base y derivamos cada pieza individual a partir de dicha
clase base.
2. Cuando se precisa ampliar la funcionalidad de un programa sin tener que
modificar el cdigo existente.
Vamos a poner un ejemplo del segundo tipo, que simule la utilizacin de libreras de
clases para crear un interfaz grfico de usuario como Windows 3.1 o Windows 95.
Supongamos que tenemos una clase que describe la conducta de una ventana muy
simple, aquella que no dispone de ttulo en la parte superior, por tanto no puede
desplazarse, pero si cambiar de tamao actuando con el ratn en los bordes derecho e
inferior.
La clase Ventana tendr los siguientes miembros dato: la posicin x e y de la ventana,
de su esquina superior izquierda y las dimensiones de la ventana:ancho y alto.
public class Ventana {
protected int x;
protected int y;
protected int ancho;
protected int alto;
public Ventana(int x, int y, int ancho, int alto) {
this.x=x;
this.y=y;
this.ancho=ancho;
this.alto=alto;
}
}
Las funciones miembros, adems del constructor sern las siguientes: la
funcin mostrar que simula una ventana en un entorno grfico, aqu solamente nos
muestra la posicin y las dimensiones de la ventana.
public void mostrar(){
System.out.println("posicin : x="+x+", y="+y);
System.out.println("dimensiones : w="+ancho+", h="+alto);
}
La funcin cambiarDimensiones que simula el cambio en la anchura y altura de la
ventana.
public void cambiarDimensiones(int dw, int dh){
ancho+=dw;
alto+=dh;
}
El cdigo completo de la clase base Ventana, es el siguiente
package ventana;

public class Ventana {
protected int x;
protected int y;
protected int ancho;
protected int alto;
public Ventana(int x, int y, int ancho, int alto) {
this.x=x;
this.y=y;
this.ancho=ancho;
this.alto=alto;
}
public void mostrar(){
System.out.println("posicin : x="+x+", y="+y);
System.out.println("dimensiones : w="+ancho+", h="+alto);
}
public void cambiarDimensiones(int dw, int dh){
ancho+=dw;
alto+=dh;
}
}

Objetos de la clase base
Como vemos en el cdigo, el constructor de la clase base inicializa los cuatro miembros
dato. Llamamos al constructor creando un objeto de la claseVentana
Ventana ventana=new Ventana(0, 0, 20, 30);
Desde el objeto ventana podemos llamar a las funciones miembro pblicas
ventana.mostrar();
ventana.cambiarDimensiones(10, 10);
ventana.mostrar();

La clase derivada
Incrementamos la funcionalidad de la clase Ventana definiendo una clase derivada
denominada VentanaTitulo. Los objetos de dicha clase tendrn todas las caractersticas de los
objetos de la clase base, pero adems tendrn un ttulo, y se podran desplazar (se simula el
desplazamiento de una ventana con el ratn).
La clase derivada heredar los miembros dato de la clase base y las funciones
miembro, y tendr un miembro dato ms, el ttulo de la ventana.
public class VentanaTitulo extends Ventana{
protected String titulo;
public VentanaTitulo(int x, int y, int w, int h, String nombre) {
super(x, y, w, h);
titulo=nombre;
}
extends es la palabra reservada que indica que la clase VentanaTitulo deriva, o es una
subclase, de la clase Ventana.
La primera sentencia del constructor de la clase derivada es una llamada al constructor
de la clase base mediante la palabra reservada super. La llamada
super(x, y, w, h);
inicializa los cuatro miembros dato de la clase base Ventana: x, y, ancho, alto. A
continuacin, se inicializa los miembros dato de la clase derivada, y se realizan las
tareas de inicializacin que sean necesarias. Si no se llama explcitamente al
constructor de la clase base Java lo realiza por nosotros, llamando al constructor por
defecto si existe.
La funcin miembro denominada desplazar cambia la posicin de la ventana,
aadindoles el desplazamiento.
public void desplazar(int dx, int dy){
x+=dx;
y+=dy;
}
Redefine la funcin miembro mostrar para mostrar una ventana con un ttulo.
public void mostrar(){
super.mostrar();
System.out.println("ttulo : "+titulo);
}
En la clase derivada se define una funcin que tiene el mismo nombre y los mismos
parmetros que la de la clase base. Se dice que redefinimos la funcinmostrar en la
clase derivada. La funcin miembro mostrar de la clase derivada VentanaTitulo hace
una llamada a la funcin mostrar de la clase base Ventana, mediante
super.mostrar();
De este modo aprovechamos el cdigo ya escrito, y le aadimos el cdigo que describe
la nueva funcionalidad de la ventana por ejemplo, que muestre el ttulo.
Si nos olvidamos de poner la palabra reservada super llamando a la funcinmostrar,
tendramos una funcin recursiva. La funcin mostrar llamara
amostrar indefinidamente.
public void mostrar(){ //ojo!, funcin recursiva
System.out.println("ttulo : "+titulo);
mostrar();
}
La definicin de la clase derivada VentanaTitulo, ser la siguiente.

package ventana;

public class VentanaTitulo extends Ventana{
protected String ttulo;
public VentanaTitulo(int x, int y, int w, int h, String nombre) {
super(x, y, w, h);
titulo=nombre;
}
public void mostrar(){
super.mostrar();
System.out.println("titulo : "+titulo);
}
public void desplazar(int dx, int dy){
x+=dx;
y+=dy;
}
}

Objetos de la clase derivada
Creamos un objeto ventana de la clase derivada VentanaTitulo
VentanaTitulo ventana=new VentanaTitulo(0, 0, 20, 30,
"Principal");
Mostramos la ventana con su ttulo, llamando a la funcin mostrar, redefinida en la
clase derivada
ventana.mostrar();
Desde el objeto ventana de la clase derivada llamamos a las funciones miembro
definidas en dicha clase
ventana.desplazar(4, 3);
Desde el objeto ventana de la clase derivada podemos llamar a las funciones miembro
definidas en la clase base.
ventana.cambiarDimensiones(10, -5);
Para mostrar la nueva ventana desplazada y cambiada de tamao escribimos
ventana.mostrar();

Modificadores de acceso
Ya hemos visto el significado de los modificadores de acceso public yprivate, as
como el control de acceso por defecto a nivel de paquete, cuando no se especifica nada.
En la herencia, surge un nuevo control de acceso denominado protected.
Hemos puesto protected delante de los miebros dato x e y de la clase baseVentana
public class Ventana {
protected int x;
protected int y;
//...
}
En la clase derivada la funcin miembro desplazar accede a dichos miembros dato
public class VentanaTitulo extends Ventana{
//...
public void desplazar(int dx, int dy){
x+=dx;
y+=dy;
}
}
Si cambiamos el modificador de acceso de los miembros x e y de la clase
baseVentana de protected a private, veremos que el compilador se queja diciendo
que los miembro x e y no son accesibles.
Los miembros ancho y alto se pueden poner con acceso private sin embargo, es mejor
dejarlos como protected ya que podran ser utilizados por alguna funcin miembro
de otra clase derivada de VentanaTitulo. Dentro de una jerarqua pondremos un
miembro con acceso private, si estamos seguros de que dicho miembro solamente va
a ser usado por dicha clase.
Como vemos hay cuatro modificadores de acceso a los miembros dato y a los
mtodos: private, protected, public y default (por defecto, o en ausencia de
cualquier modificador). La herencia complica an ms el problema de acceso, ya que
las clases dentro del mismo paquete tienen diferentes accesos que las clases de distinto
paquete
Los siguientes cuadros tratan de aclarar este problema
Clases dentro del mismo paquete

Modificador de acceso Heredado Accesible

Por defecto (sin modificador) Si Si

private No No

protected Si Si

public Si Si

Clases en distintos paquetes
Modificador de acceso Heredado Accesible
Por defecto (sin modificador) No No
private No No
protected Si No
public Si Si
Desde el punto de vista prctico, cabe resear que no se heredan los miembros
privados, ni aquellos miembros (dato o funcin) cuyo nombre sea el mismo en la clase
base y en la clase derivada.
La clase base Object
La clase Object es la clase raz de la cual derivan todas las clases. Esta derivacin es
implcita.
La clase Object define una serie de funciones miembro que heredan todas las
clases. Las ms importantes son las siguientes
public class Object {
public boolean equals(Object obj) {
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {
return getClass().getName()+ "@" + Integer.toHexString(hashCode());
}
protected void finalize() throws Throwable { }
//otras funciones miembro...
}
Igualdad de dos objetos:
Hemos visto que el mtodo equals de la clase String cuando compara un string y
cualquier otro objeto. El mtodo equals de la clase Object compara dos objetos uno que
llama a la funcin y otro es el argumento de dicha funcin.
Representacin en forma de texto de un objeto
El mtodo toString imprime por defecto el nombre de la clase a la que pertenece el
objeto y su cdigo (hash). Esta funcin miembro se redefine en la clase derivada para
mostrar la informacin que nos interese acerca del objeto.
La clase Fraccion redefine toString para mostrar el numerador y el denominador
separados por la barra de dividir. En la misma pgina, hemosmejorado la
clase Lista para mostrar los datos que se guardan en los objetos de dicha clase,
redefiniendo toString.
La funcin toString se llama automticamente siempre que pongamos un objeto como
argumento de la funcin System.out.println o concatenado con otro string.
Duplicacin de objetos
El mtodo clone crea un objeto duplicado (clnico) de otro objeto. Ms adelante
estudiremos en detalle la redefinicin de esta funcin miembro y pondremos ejemplos
que nos muestren su utilidad.
Finalizacin
El mtodo finalize se llama cuando va a ser liberada la memoria que ocupa el
objeto por el recolector de basura (garbage collector). Normalmente, no es necesario
redefinir este mtodo en las clases, solamente en contados casos especiales. La forma
en la que se redefine este mtodo es el siguiente.
class CualquierClase{
//..
protected void finalize() trows Throwable{
super.finalize();
//cdigo que libera recursos externos
}
}
La primera sentencia que contenga la redefinicin de finalize ha de ser una llamada a
la funcin del mismo nombre de la clase base, y a continuacin le aadimos cierta
funcionalidad, habitualmente, la liberacin de recursos, cerrar un archivo, etc.
3.2 Clasificacin: Herencia simple y Herencia mltiple
Para descargar el documento del tema haz clic aqu

Herencia
La herencia es un mecanismo que permite la definicin de una clase a partir de la definicin de
otra ya existente. La herencia permite compartir automticamente mtodos y datos entre clases,
subclases y objetos.
La herencia est fuertemente ligada a la reutilizacin del cdigo en la POO. Esto es, el cdigo de
cualquiera de las clases puede ser utilizado sin ms que crear una clase derivada de ella, o bien
una subclase.

Hay dos tipos de herencia: Herencia Simple y Herencia Mltiple. La primera indica que se pueden
definir nuevas clases solamente a partir de una clase inicial mientras que la segunda indica que se
pueden definir nuevas clases a partir de dos o ms clases iniciales. Java slo permite herencia
simple.

Existe la herencia mltiple en Java? Por qu?
Objetivo: Fortalecer los conceptos de clases, mtodos, propiedades o atributos, herencia,
constructores
y acerca de los mtodos Get y Set. Todo esto con ayuda del programa realizado en la gua
anterior con
nuestro Silabario para programadores. El trabajo estructurado de la semana pasada ahora
lo
traslademos a una aplicacin, siempre en el ambiente consola, en la cual definamos con un
alto grado
de encapsulamiento, las clases que harn posible la realizacin de la aplicacin y llevarn
definida
todo el funcionamiento, o lo que es mismo, la capa de negocios del programa.

El ejemplo es sencillo. El Silabario lo que realiza es una serie de operaciones bsicas que
resuelven
4 tipos de problemas distintos: El factorial de nmero, la tabla de multiplicar de un nmero,
la
clasificacin de la edad del usuario y la eleccin de la estacin del ao favorita del usuario.
El silabario
adems, tiene la caracterstica que el programador escoger la sentencia o instruccin
bsica que brinde
la solucin ms sencilla y ptima para cada uno de los problemas.

Para efectos de esta tema, y porque es la mejor manera de poder apreciar las clases y
objetos de este ejercicio, definiremos cada clase como una clase Operacin, que es la que
facilitar y
tendr las herramientas necesarias para efectuar la resolucin de cada uno de los problemas.

Un objeto operacin necesita de propiedades o atributos. Una operacin necesita de
operadores, uno,
dos ms. Es por eso que definiremos dos atributos para realizar dichas operaciones. Con
dos bastarn
para este ejercicio.
Los mtodos de esta clase son muy variados. Cada una de las operaciones realizar uno
diferente, por
lo tanto no cabe dentro de la percepcin de un objeto Operacin bsico, la definicin de
cada uno de
los mtodos.
Los mtodos que s se necesitaran son los populares mtodos GET y SET, que nos sirven
para leer y
cambiar los valores de una propiedad especfica. Como hemos definido propiedades, stas
necesitan de
sus getters y setters.


La clase de una Operacin Bsica para el silabario quedar as:

public class operacionBase {
protected int operador;
public operacionBase(){
this.operador=0;
}

public void setOperador(int o){
this.operador=o;
}

public int getOperador(){
return this.operador;
}
}


Declaramos la propiedad con visibilidad protected por motivos de seguridad, para que
solamente los
miembros de esa clase y los que heredan de ella, es decir las subclases, puedan accesar a
estos atributos.
Como hemos definido ya una clase base, ahora podremos definir el resto de clases que
podrn heredar
de la clase base. Cabe destacar que no siempre se podr hacer una clase base y con respecto
a esta
empezar a heredarles a otras. Esto depende de la naturaleza de cada aplicacin, y de la
manera de cmo
el programador disee su capa de negocios.
Para realizar la clase que nos devuelva el factorial de un nmero, el programador puede
escoger la
instruccin While. Por lo tanto el programador debe desarrollar el mtodo que reciba como
parmetro
el nmero del que se desee el factorial y que devuelva el resultado esperado. Heredando de
la clase
base, tenemos ya garantizados los atributos y mtodos propios de la misma, por lo tanto, la
clase para
realizar el factorial del nmero podra quedar as:


public class operacionFactorial extends operacionBase{
public operacionFactorial(){
super();
}

public int devolverFactorial(){
int factorial=1;
int cont=1;
while (cont <= this.operador) { factorial *= cont; cont++; } return factorial;
}
}
El diagrama UML nos ayudar a comprender mejor la herencia y estructura de estas clases:



Como puede observar el programador, se utiliza la propiedad operador cuya definicin
pertenece a la
clase base. Sin embargo, como la clase operacionFactorial hereda todos los atributos y
mtodos de la
clase bsica, podemos hacer un llamado a dicha propiedad con la ayuda de la sentencia
this.

3.3 Reutilizacin de miembros heredados
Para descargar el documento de este tema, haz clic aqu
La reutilizacin de cdigo se refiere al comportamiento y a las tcnicas que garantizan que una
parte o la totalidad de un programa informtico existente se pueda emplear en la construccin de
otro programa. De esta forma se aprovecha el trabajo anterior, se economiza tiempo, y se reduce
la redundancia.
La manera ms fcil de reutilizar cdigo es copiarlo total o parcialmente desde el programa
antiguo al programa en desarrollo. Pero es trabajoso mantener mltiples copias del mismo cdigo,
por lo que en general se elimina la redundancia dejando el cdigo reusable en un nico lugar, y
llamndolo desde los diferentes programas. Este proceso se conoce como abstraccin. La
abstraccin puede verse claramente en lasbibliotecas de software, en las que se agrupan varias
operaciones comunes a cierto dominio para facilitar el desarrollo de programas nuevos. Hay
bibliotecas para convertir informacin entre diferentes formatos conocidos, acceder a dispositivos
de almacenamiento externos, proporcionar una interfaz con otros programas, manipular
informacin de manera conocida (como nmeros, fechas, o cadenas de texto).
Para que el cdigo existente se pueda reutilizar, debe definir alguna forma de comunicacin o
interfaz. Esto se puede dar por llamadas a una subrutina, a un objeto, o a una clase.

Como se ha comentado anteriormente la clase descendiente puede aadir sus propios atributos y
mtodos pero tambin puede sustituir u ocultar los heredados. En concreto:
1. Se puede declarar un nuevo atributo con el mismo identificador que uno heredado, quedando
este atributo oculto. Esta tcnica no es recomendable.
2. Se puede declarar un nuevo mtodo de instancia con la misma cabecera que el de la clase
ascendiente, lo que supone su sobreescritura. Por lo tanto, la sobreescritura o redefinicin
consiste en que mtodos adicionales declarados en la clase descendiente con el mismo nombre,
tipo de dato devuelto y nmero y tipo de parmetros sustituyen a los heredados.
3. Se puede declarar un nuevo mtodo de clase con la misma cabecera que el de la clase
ascendiente, lo que hace que ste quede oculto. Por lo tanto, los mtodos de clase o estticos
(declarados como static) no pueden ser redefinidos.
4. Un mtodo declarado con el modificador final tampoco puede ser redefinido por una clase
derivada.
5. Se puede declarar un constructor de la subclase que llame al de la superclase de forma implcita
o de mediante la palabra reservada super.
6. En general puede accederse a los mtodos de la clase ascendiente que han sido redefinidos
empleando la palabra reservada super delante del identificador del mtodo. Este mecanismo slo
permite acceder al metodo perteneciente a la clase en el nivel inmediatamente superior de la
jerarqua de clases.

Construyamos la clase Taxista.java con el siguiente cdigo:
public class Taxista extends Persona {
private int nLicencia;
public void setNLicencia(int num){
nLicencia = num;
}
public int getLicencia(){
return nLicencia;
}
}
Y construyamos ArranqueTaxista.java:

public class ArranqueTaxista {
public static void main (String arg[]){
Taxista tax1 = new Taxista();
tax1.setNombre("Luis");
tax1.setEdad(50);
System.out.println( tax1.getNombre());
System.out.println(tax1.getEdad());
}
}
Ahora intentemos usar el constructor que exista en la clase Persona que recibia el nombre de la
persona y vamos a usarlo para la clase Taxista. Para ello construyamos la clase
ArranqueTaxista2.java:

public class ArranqueTaxista2 {
public static void main (String arg[]){
Taxista tax1 = new Taxista("Jose");
tax1.setEdad(50);
System.out.println( tax1.getNombre());
System.out.println(tax1.getEdad());
System.out.println(tax1.getNLicencia());
}
}
Se genera un error de compilacin, debido a que los constructores no se heredan, sino que hay
que definir nuestros propios constructores. Agreguemos en la clase Taxista los siguientes
constructores:

public Taxista(int licencia){
super();
nLicencia = licencia;
}
public Taxista(String nombre,int licencia){
super(nombre);
nLicencia = licencia;
}
Ahora si podremos compilar y ejecutar la clase ArranqueTaxista2. La llamada al mtodo super
indica que estamos llamando a un constructor de la clase base (pensemos que un Taxista antes
que Taxista es Persona y por tanto tiene sentido llamar al constructor de Persona antes que al de
Taxista). Adems gracias al nmero de parmetros de la llamada a super podemos especificar cul
de los constructores de la clase base queremos llamar.
En java se pueden emplear dos palabras clave: this y super. Como vimos en la unidad 1, this hace
alusin a todo el objeto y super hace alusin a la parte heredada, por ello empleamos super para
referenciar al constructor de la clase base.
Ahora vamos a agregar la funcin getNombre dentro de la clase Taxista, es decir, tenemos la
misma funcin en Persona y en Taxista:

public String getNombre() {
return "Soy un taxista y me llamo: " + super.getNombre();
}

Compilamos Taxista y ejecutamos ArranqueTaxista2. Veremos que el mensaje que aparece en
pantalla demuestra que la funcin getNombre llamada es la de del tipo real del objeto construido,
en este caso la de la clase derivada que es Taxista.

Tambien apreciamos que para acceder al atributo nombre es necesario acceder al mtodo
getNombre de la clase base (y por ello emplear super).

En java los atributos y mtodos de la clase base pueden cambiar su modificador de visibilidad
dentro de la clase derivada, la siguiente tabla recoge dichos cambios:
Modificadores en la clase base:
public
private
protected
paquete

En la clase derivada se transforman en:
public
inaccesible
protected
paquete

Inaccesible significa que, a pesar de haber sido heredado, no hay permisos en la clase derivada
para poder acceder a dicho elemento inaccesible, pero an as, se pueden llamar a mtodos de la
clase base que si pueden acceder y modificar al elemento.
Recordemos que protected significa que es private, pero que al heredar no se hace inaccesible, es
decir que desde la clase derivada se puede acceder.
3.4 Referencia al objeto de la clase base
Para descargar el documento de este tema, haz clic aqu
La jerarqua de clases que describen las figuras planas

Consideremos las figuras planas cerradas como el rectngulo, y el crculo. Tales figuras
comparten caractersticas comunes como es la posicin de la figura, de su centro, y el rea de
la figura, aunque el procedimiento para calcular dicha rea sea completamente distinto.
Podemos por tanto, disear una jerarqua de clases, tal que la clase base denominada Figura,
tenga las caractersticas comunes y cada clase derivada las especficas. La relacin jerrquica
se muestra en la figura

La clase Figura es la que contiene las caractersticas comunes a dichas figuras concretas por
tanto, no tiene forma ni tiene rea. Esto lo expresamos declarando Figura como una clase
abstracta, declarando la funcin miembroarea abstract.
Las clases abstractas solamente se pueden usar como clases base para otras clases. No se
pueden crear objetos pertenecientes a una clase abstracta. Sin embargo, se pueden declarar
variables de dichas clases.
En el juego del ajedrez podemos definir una clase base denominada Pieza, con las
caractersticas comunes a todas las piezas, como es su posicin en el tablero, y derivar de ella
las caractersticas especficas de cada pieza particular. As pues, la clase Pieza ser una clase
abstracta con una funcin abstractdenominada mover, y cada tipo de pieza definir dicha
funcin de acuerdo a las reglas de su movimiento sobre el tablero.
La clase Figura
La definicin de la clase abstracta Figura, contiene la posicin x e y de la figura particular, de
su centro, y la funcin area, que se va a definir en las clases derivadas para calcular el rea de
cada figura en particular.
public abstract class Figura {
protected int x;
protected int y;
public Figura(int x, int y) {
this.x=x;
this.y=y;
}
public abstract double area();
}
La clase Rectangulo
Las clases derivadas heredan los miembros dato x e y de la clase base, y definen la
funcin area, declarada abstract en la clase base Figura, ya que cada figura particular tiene
una frmula distinta para calcular su rea. Por ejemplo, la clase derivada Rectangulo, tiene
como datos, aparte de su posicin(x, y) en el plano, sus dimensiones, es decir, su
anchura ancho y altura alto.
class Rectangulo extends Figura{
protected double ancho, alto;
public Rectangulo(int x, int y, double ancho, double alto){
super(x,y);
this.ancho=ancho;
this.alto=alto;
}
public double area(){
return ancho*alto;
}
}
La primera sentencia en el constructor de la clase derivada es una llamada al constructor de la
clase base, para ello se emplea la palabra reservada super. El constructor de la clase derivada
llama al constructor de la clase base y le pasa las coordenadas del punto x e y. Despus
inicializa sus miembros datoancho y alto.
En la definicin de la funcin area, se calcula el rea del rectngulo como producto de la
anchura por la altura, y se devuelve el resultado
La clase Circulo
class Circulo extends Figura{
protected double radio;
public Circulo(int x, int y, double radio){
super(x,y);
this.radio=radio;
}
public double area(){
return Math.PI*radio*radio;
}
}
Como vemos, la primera sentencia en el constructor de la clase derivada es una llamada al
constructor de la clase base empleando la palabara reservadasuper. Posteriormente, se
inicializa el miembro dato radio, de la clase derivada Circulo.
En la definicin de la funcin area, se calcula el rea del crculo mediante la conocida frmula
r
2
, o bien *r*r. La constante Math.PI es una aproximacin decimal del nmero irracional .
Uso de la jerarqua de clases
Creamos un objeto c de la clase Circulo situado en el punto (0, 0) y de 5.5 unidades de radio.
Calculamos y mostramos el valor de su rea.
Circulo c=new Circulo(0, 0, 5.5);
System.out.println("Area del crculo "+c.area());
Creamos un objeto r de la clase Rectangulo situado en el punto (0, 0) y de dimensiones 5.5 de
anchura y 2 unidades de largo. Calculamos y mostramos el valor de su rea.
Rectangulo r=new Rectangulo(0, 0, 5.5, 2.0);
System.out.println("Area del rectngulo "+r.area());
Veamos ahora, una forma alternativa, guardamos el valor devuelto por newal crear objetos de
las clases derivadas en una variable f del tipo Figura (clase base).
Figura f=new Circulo(0, 0, 5.5);
System.out.println("Area del crculo "+f.area());
f=new Rectangulo(0, 0, 5.5, 2.0);
System.out.println("Area del rectngulo "+f.area());

3.5 Constructores y destructores en clases derivadas
Para descargar el documento de este tema, haz clic aqu
Constructores en clases derivadas

Al instanciar objetos de clases derivadas se inicia una cadena de invocaciones a
constructores en las cuales el constructor de la clase derivada, antes de realizar sus propias
tareas, invoca (ya sea implcita o explcitamente) al constructor de su clase base.
Similarmente, si la clase base fue derivada de otra clase, el constructor de la clase base debe
invocar al constructor de la clase ubicada en el siguiente nivel superior de la jerarqua, y as
sucesivamente. El ltimo constructor invocado en la cadena es el constructor de la clase
Object, cuyo cuerpo se ejecuta primero. El cuerpo del constructor de la clase derivada se
ejecuta al final. El constructor de cada clase base inicializa las variables de instancia que el
objeto de la clase derivada hereda.
Destructores en clases derivadas
Cuando remueve de la memoria un objeto de una clase derivada, el recolector de basura
invoca al destructor del objeto. Esto inicia una cadena de invocaciones a destructores, en
donde el destructor de la clase derivada y los destructores de las clases bases directas e
indirectas se ejecutan en orden inverso al que se ejecutaron los constructores, esto es,
primero se ejecuta el destructor de la clase derivada y al final se ejecuta el destructor de la
clase base ubicada en el nivel superior de la jerarqua. La ejecucin de los destructores debe
liberar todos los recursos que el objeto adquiri, antes de que el recolector de basura reclame
la memoria de ese objeto. Cuando el recolector de basura invoca al destructor de un objeto
de una clase derivada, ese destructor realiza su tarea y despus invoca al destructor de la
clase base. El proceso se repite hasta que se invoca al destructor de la clase Object.
Ejemplo:
// Destruct Derivadas?.cs : Destructores en clases derivadas. using
C = System.Console;
class Animal {
Animal( ) {
C.Write Line?(Muere mi parte Animal );
} }
class Mamfero : Animal {
Mamfero( ){
C.Write Line(Muere mi parte Mamfero );
} }
class Perro : Mamfero {
Perro( ) {
C.Write Line(Muere mi parte Perro );
} }
public class Principal {
static void Main( ) {
Perro Fido = new Perro ( );
} }
3.6 Redefinicion de Metodos en clases derivadas
Para descargar el archivo de este tema, haz clic aqu
Redefinicion de las clases derivadas
El lenguaje java permite redefinir miembros de la clase base en las clases derivadas, pero el
compilador emite una advertencia cuando detecta una redefinicin. Una advertencia (warning) es
un mensaje del compilador acerca de un posible problema. Sin embargo, en este caso s se genera
cdigo ejecutable (a diferencia del mensaje de error). Redefinicin de campos. El siguiente
ejemplo muestra cmo reutilizar los identificadores de los campos de la clase base en una clase
derivada.
Ejemplo de redefinicin de las clases derivadas
// Redef.cs : Ejemplifica la redefinicin de campos en clases derivadas.
class Punto{
public int x;
public int y;
}
class Punto3D : Punto{
public int x ;
public int y ;
public int z ;
}
class Principal{
public static void Main( ) {
Punto a = new Punto( ); Punto3D b = new Punto3D( );
a.x = 100 ;
a.y = 200 ;
b.x = 300 ;
b.y = 400 ;
b.z = 500 ;
}
}

Das könnte Ihnen auch gefallen