You are on page 1of 15

Tema 1

1- Conceptos de Java para Estructuras de Datos


ndice general:

Tema 1- Conceptos de Java para


Estructuras de Datos

Clases y Objetos en Java


El Principio de la Programacin Orientada a Objetos de la Herencia y
su Soporte en Java
El Polimorfismo en Java
Ms Herencia en Java: Mtodos y Clases Finales y Abstractos.
Herencia Mltiple: Interfaces Java

1.
2.

3
3.
4.

Germn Molt
Escuela Tcnica Superior de Ingeniera Informtica

5.

Universidad Politcnica de Valencia

Objetivos y Bibliografa

Objetos y Clases en Java (I)

Objetivos:

En Java todo son objetos (i.e. instancias de una Clase dada),


exceptuando los 8 tipos primitivos (i.e. byte, short, int, long,
float, double, char y boolean).
Una Clase consta de un conjunto de atributos (almacenan
datos) y un conjunto de mtodos (trabajan con esos datos).
Un Objeto de una Clase se usa/manipula desde cualquier
mtodo de otra Clase, como por ejemplo TestClase.

Conocer los conceptos bsicos de la POO y su soporte en el


lenguaje Java
Aprender el concepto de Herencia en Java para afrontar el
desarrollo de estructuras de datos y algoritmos que se realiza en
temas posteriores.
Estudiar el concepto de paquete como mecanismo para la
agrupacin de clases.
Comprender el concepto de Polimorfismo, Interfaz y Clase
Ab
Abstracta,
as como su utilidad.
ilid d

public class TestClase {


public static void main( String args[] ){ ... }
}

Bibliografa:
Weiss, M.A.
Weiss
M A Estructuras de datos en Java
Java.Adisson-Wesley,
Adisson-Wesley 2000.
2000
Captulos 2 (Apartado 2.5) 3 y 4
Arnow, D., Weiss G. Introduccin a la Programacin con Java. Un
enfoque
f
orientado
i t d a objetos.Adisson-Wesley,
bj t Adi
W l 2001.
2001 Captulo
C t l 14
3

Ejemplo: sea TestCirculo una aplicacin que maneja Crculos,


i e Objetos de la clase Circulo
i.e.
4

Objetos y Clases en Java (II)

Objetos y Clases en Java (III)

public class TestClase {


p
public static void main( String args[] ){
?
}
}

public class TestClase {


p
public static void main( String args[] ){
Circulo c1 = new Circulo();
Circulo c2;
c2 = c1;
}
}

Qu podemos hacer con un objeto?


Especificacin de una Clase: descripcin de QU se puede
hacer con un Objeto, es decir, qu mtodos expone
(especificacin de Circulo).
Implementacin de una Clase: detalles internos de CMO
se satisface la Especificacin o cmo se consigue hacer lo que
se hace con un Objeto.
5

Creacin de Objetos de una Clase:


c1 es una variable Referencia al nuevo Objeto creado.
c2 es una variable Referencia a ningn Objeto, i.e. tras la
declaracin Circulo c2 ; c2 == null
Qu ocurre si se ejecuta c2 = c1; ?
6

Referencias en Java

Ejemplo de Utilizacin de Objetos Circulo

Una variable Referencia almacena la direccin de memoria en


la que se encuentra el Objeto al que referencia.
0
102
Circulo c1 = new Circulo();

102
408

Al hacer:
Memoria
Circulo c2 = c1;
La variable referencia c2 pasa a tener el mismo valor que
c1, es decir, ambas apuntan al mismo objeto.
7

Podemos crear un objeto


j
de la clase Circulo de la manera
especificada en los constructores que define la clase.
public class TestCirculo {
p
public static void main( String args[] ){
Circulo c1 = new Circulo();
double radio = 4.0;
Color color = Color.red;
Circulo c2 = new Circulo(radio,
Circulo(radio color);
System.out.println(c2);
System.out.println(c2.toString());
y
p
(
g());
}
Qu diferencia hay en las
}

dos ltimas invocaciones?

Implementacin de una Clase

Implementacin de una Clase: Definicin de


Atributos

Implementacin de una Clase:

Los Atributos de una Clase almacenan los datos de la Clase

Detalles internos de cmo se satisface la Especificacin o cmo se


consigue hacer lo que se hace sobre un Objeto.

Modelo de la relacin TIENE UN(A)


Modificadores de atributos

Componentes de una Clase:

Ej
Ejemplo:
l d
definicin
fi i i d
de los
l Atributos
A ib
d
de lla Clase
Cl
Circulo
Ci l

Atributos, que almacenan los datos de la Clase


Mtodos que definen la funcionalidad de la Clase mediante,
Mtodos,
mediante por lo
general, la manipulacin de los atributos.

private
private
private
private

Elementos q
que aparecen
p
en la implementacin
p
de una clase:
El operador this.
Modificadores estticos, dinmicos y finales de una Clase y sus
componentes.
Modificadores de visibilidad public y private de una Clase y sus
componentes
componentes.

double radio;
String color;
static final double RADIO_POR_DEFECTO = 3.0;
static final Color COLOR_POR_DEFECTO = Color.black;

Por lo general, los atributos se suelen definir privados y se definen


mtodos consultores y modificadores. De esta manera se garantiza la
encapsulacin u ocultacin de datos.
datos
Modificador static: Permite definir variables a nivel de clase (compartidas
por todos los objetos).
Modificador final: Impide asignar un nuevo valor al atributo.
10

Implementacin de una Clase: Definicin de


Constructores
Los Constructores de una clase p
permiten dar un valor
inicial a los atributos del objeto. Ejemplo: definicin de los
mtodos Constructores de Circulo
public Circulo() {
radio = RADIO_POR_DEFECTO;
color = COLOR_POR_DEFECTO;
this hace referencia al objeto
sobre el que se invoca el mtodo
}
y sirve para
p
evitar el aliasingg de
public Circulo(double radio,
radio Color color) {
nombres.
this.radio = radio;
this.color = color;
}
public Circulo(){
this(RADIO_POR_DEFECTO,
(
COLOR_POR_DEFECTO);
)
}
11

Implementacin de una Clase: Definicin de


Mtodos (I)
Los Mtodos de una clase definen su funcionalidad.
Ejem l : Definicin de Mtodos Consultores en la clase
Ejemplo:
Circulo.
Al definir como privados todos los atributos de Circulo, se deben
proporcionar
i
mtodos
d para acceder
d a su valor.
l

public double getRadio() {


return radio;
}
public Color getColor() {
return
t
color;
l
}
12

Se p
podra utilizar this ppara referenciar a
los atributos (i.e., this.radio) pero no es
necesario puesto que no hay aliasing de
nombres.

Implementacin de una Clase: Definicin de


Mtodos (II)
Al definir como p
privados todos los atributos de Circulo,
se deben proporcionar mtodos para modificar su valor.
Ejemplo: definicin de los Mtodos Modificadores de
Circulo
public void setRadio(double nuevoRadio) {
radio = nuevoRadio;
}
public void setColor(Color nuevoColor) {
color = nuevoColor;
Utilizar diferentes nombres para el
argumento y el atributo evita el aliasing y
}

Implementacin de una Clase: Definicin de


Mtodos (III)
Ejemplo:
j p definicin de otros Mtodos de Circulo
public double area() { return Math.PI * radio * radio; }
public Stringg toString()
p
g() {return
{
Circulo de radio + radio}}
public static Circulo leerCirculo(Scanner teclado) { ... }
El uso de un mtodo esttico permite definirlo a nivel de
clase, no a nivel de instancia (objeto individual).
Se deber invocar como Circulo.leerCirculo(...).
Se podra utilizar this en la
implementacin del mtodo area para
referenciar al atributo radio?

ya no es necesario utilizar this.


this
13

Estado Actual de la Clase Circulo


public class Circulo {
private double radio;
private Color color;
private static final double RADIO_POR_DEFECTO = 3.0;
private static final Color COLOR_POR_DEFECTO
COLOR POR DEFECTO = Color.black;
Color black;
/** crea un Circulo con radio r y color c */
public Circulo(Color c,
c double r) {
this.color = c;
this.radio = r;
}
/** crea un Circulo estndar.: radio 3.0, color negro y centro en el origen*/
public Circulo() {
this(COLOR_POR_DEFECTO,
hi (COLOR POR DEFECTO RADIO_POR_DEFECTO);
RADIO POR DEFECTO)
}

}
15

14

Ejercicios Propuestos
Ejercicio 1: Escribe la clase Manzana que tiene un sabor, de tipo
entero que representa una escala [0,10].
[0 10]
Por defecto, la manzana tiene un sabor de 5, aunque se puede especificar
su sabor al crearla.

Ejercicio 2: En lugar de trabajar con Crculos, se desea trabajar con


otro tipo de Figuras (Cuadrados o Rectngulos o Tringulos). Si ya
se dispone
p
de la aplicacin
p
misCirculos, cmo se afrontara el
diseo e implementacin de la nueva aplicacin?
Ejercicio 3: Se desea realizar una aplicacin que maneje un grupo
de Crculos.
Crculos En particular
particular, se desea:
Construir el grupo con varios Circulos, mostrar el grupo por pantalla y
obtener el rea del grupo.

Siguiendo los pasos dados para la presentacin de la aplicacin


misCirculos, desarrolla la aplicacin que maneje un grupo de
Crculos ((GrupoDeCirculos).
p
)
16

Paquetes Java: Reutilizacin de Cdigo

Paquetes Java: Reglas de Utilizacin

El mecanismo Java ms general para organizar un grupo de


Cl
Clases
que guardan
d alguna
l
relacin
l i entre s es ell Paquete
P
t
Paquetes Java estndar

La Clase C del Paquete


q
p se especifica
p
como pp.C
public class MiClase(){
...
j
java.util.Date
il D t fecha
f h = new java.util.Date();
j
il D t ()
...
}

java.lang : Contiene, entre otras, las clases Integer, Math, String y


System
java.util : Contiene, entre otras, las clases Date, Random y
StringTokenizer
g
java.io, java.awt (incluye la clase Color), etc.

Simplificacin: uso de la directiva import (antes de la


declaracin de la clase).

Manipulacin:
lla di
directiva
ti import;
i
t la
l variable
i bl d
de entorno
t
CLASSPATH la
CLASSPATH;
l
instruccin package.

import java.util.*;
public class MiClase(){
...
Date fecha = new Date();
...
}

Reglas de visibilidad dentro y fuera de un paquete.


Es posible investigar los paquetes que incluye el API de Java
mirando la documentacin:
http://java sun com/javase/6/docs/api/
http://java.sun.com/javase/6/docs/api/
17

18

Paquetes Java: Reglas de Creacin

Paquetes Java: Reglas de Visibilidad

Para indicar que una Clase C pertenece al Paquete p:


la primera lnea del fichero C.java
C java es package p;
el fichero C.java debe estar en el subdirectorio p
El subdirectorio p debe de encontrarse en la lista de la variable de
entorno CLASSPATH

Los Paquetes tienen varias reglas de visibilidad importantes:


1.

Si una Clase o cualquiera de sus componentes no posee


modificador de visibilidad alguno (public,
(public private o protected) slo
es visible (puede ser referenciada) para las dems clases dentro del
mismo Paquete. Esto se conoce como ACCESO FRIENDLY.

2.

Slo las clases pblicas de un paquete se pueden usar fuera de l

3.

Todas las clases que no forman parte de un paquete, pero se


ppueden alcanzar a travs de la variable CLASSPATH se consideran
parte del mismo paquete y el acceso amistoso se aplica entre ellas

Por ejemplo: La clase MiClase del paquete org.grycap.paquete


deber estar en la ruta:
org/grycap/paquete/MiClase.java

Para que el compilador/enlazador encuentre esa clase durante el


proceso de compilacin el directorio debe estar incluido dentro de
la lista de directorios de la variable de entorno CLASSPATH.
Los IDEs (Entorno de Desarrollo Integrado) evitan tener que manipular
de manera directa dicha variable.
Ejemplo: Herramientas Preferencias Libreras (BlueJ)
19

20

Ejercicio de Modificadores de Visibilidad


package org.grycap.paquete;

package org.grycap.otropaquete;

class Clase1{

import org.grycap.paquete.*;

Modificadores de visibilidad aplicados


p
tanto a una clase como
a cualquiera de sus miembros (atributos y mtodos).

public class Clase2{

private int aPrivado;


int otroAtributo;

public static void main(String args[]){

}
La creacin en Clase 2 es correcta?
Clase 1 NO tiene modificador de
visibilidad Acceso friendly (solo
accesible desde clases del mismo
ppaquete).
q
) Clase 2 ppertenece a otro
paquete: org.grycap.paquete.Clase1 is not

C
Clase1
c1 = new Clase1();
C
()

Acceso Correcto

package org.grycap.paquete;
public class Clase3{

Paquete

Subclase

Mundo

private

No

No

No

ninguno

No

No

protected

No

Clase1 c1 = new Clase1();

public

}}
22

Reutilizacin de Cdigo: Tipo de Relacin y


Mecanismo Java
Mecanismo Java para representar una
relacin

Herencia en Lenguajes de POO y su Soporte


en Java
Introduccin al concepto
p de Herencia y su soporte
p
en
Java. En particular, se incidir en los siguientes aspectos:
Caractersticas y sintaxis de la Herencia en Java
J
La clase Object y el modelo de jerarqua de Clases Java
Caractersticas de una clase derivada

P
Paquete
t
Existe alguna relacin entre las clases,
Ejemplos: Clases de java.util,
aunque no realicen la misma funcionalidad.
javax.swing, etc.

Modificadores de visibilidad.
Constructores de la derivada.
S
Sobrescritura
de mtodos.

Definicin de Atributos
Existe una relacin TIENE UN(A) o
relacin de composicin entre las Clases

Ejemplos: Circulo y grupoCirculos

Existe una relacin relacin ES UN(A) o


relacin jerrquica entre las Clases

Herencia Java
Ejemplos: clase base Figura y sus
derivadas Circulo, Rectangulo, ...

23

Clase

public static void main(String args[]){

21

Relacin entre Clases

Visibilidad
Modificador

}}

public in org.grycap.paquete; cannot be


accessed from outside package.

Y la de Clase 3?

Modificadores de Visibilidad: Tabla


Resumen

Ejercicio de Persona

Ejemplos: Diseo de la clase Figura y reformulacin de


Ci l para que sea una de
Circulo
d sus derivadas.
d i d Diseo
Di de
d la
l
clase GrupoDeFiguras.
24

La relacin ES UN(A)

Ejemplo de relacin ES UN(A)


Jerarqua de clases de figuras:

Si X ES UN(A)
( ) Y,

Un crculo ES UNA figura


Un rectngulo ES UNA figura
Un cuadrado ES UN Rectngulo

se dice que la Clase derivada X es una variacin de la Clase base Y


se dice que X e Y forman una Jerarqua: X Y, donde la Clase X es
una subClase de Y e Y es una superClase de X
la relacin es transitiva: si X ES UN(A) Y e Y ES UN(A) Z, entonces
X ES UN(A) Z

Y (Base)

Figura

Crculo
Ejemplo: Qu relacin guardan
entre s un cuadrado, un tringulo, un
crculo y un rectngulo?
g

La Herencia permite modelar una


relacin de tipo ES UN.
UN
Permite definir una jerarqua de clases.

X (Derivada)

25

Rectngulo
Cuadrado

26

El Mecanismo de la Herencia
La Herencia permite la formacin de
Y (Base)
Jerarquas de Clases para reutilizar cdigo.
X hereda (puede referenciar) todos los
atributos y mtodos que no sean privados X (Derivada)
en Y.
X es una clase completamente nueva e independiente.
Los cambios que sufra X NO afectan a Y, lo que simplifica el
mantenimiento del cdigo.

Herencia: Sintxis bsica de Java


public class Derivada extends Base{

Los atributos y mtodos no privados de Base se heredan


en Derivada (salvo los constructores).
Esto significa que dichos atributos pueden ser referenciados y
dichos mtodos pueden ser invocados.

Usos del operador super:

X es de tipo compatible con Y.

Referenciar a cualquier componente de Base (atributos,


mtodos
d o constructores),
) aunque no es muy comn.

Se suele utilizar para invocar constructores de la clase padre y


en casos de sobreescritura parcial de mtodos.
mtodos

Una referencia de tipo Y es polimrfica. Sin embargo, no son


compatibles ni Y con X, ni X con sus clases hermanas.
27

Objeto

28

Ejemplo Bsico de Herencia


public class Animal{
protected String queHablo;
public Animal(){
queHablo = Groar!;
Groar! ;
}
public String rugir(){
return queHablo;
}}

Herencia: Mtodos Constructores de una


Clase Derivada
La clase Derivada debe definir explcitamente sus propios
constructores.
constructores

public class Leon extends Animal {


public Leon(){
queHablo = Grawl!;
}
}

public class TestLeon {


public static void main (String args[]){
Leon l = new Leon();
System.out.println(l.rugir());
}
}

En caso contrario, Java proporciona el constructor por defecto:


public Derivada(){
super();
()
}

Constructor por defecto:


Invoca al constructor sin parmetros de base (inicializando los
atributos heredados de Base) y luego inicializando al valor por
defecto a los atributos heredados de Derivada.

Qu saca por pantalla


este cdigo?

Implicaciones:
Si la clase Base NO define un constructor por defecto (sin
argumentos), la clase Derivada obligatoriamente deber definir un
constructor que invoque al de la clase Base con los argumentos
correspondientes.

29

Ejemplo: Definicin de Constructores


Constructores de la clase Figura:
public Figura(Color c, String t) {this.color = c; this.tipo = t; }
ppublic Figura(){
g
(){ this(COLOR
(
_POR_DEFECTO,, TIPO_POR_DEFECTO);
); }

Constructores de la clase Circulo, en base a los de la clase Figura:


public Circulo(Color c, double r){
super(c, "Circulo");
this.radio = r;;
}
public Circulo() {
super(); //
No es necesaria ya que se realiza automticamente.
this.radio = RADIO_POR_DEFECTO;
}
31

30

Ejercicio: Modificadores de Visibilidad


public class Base{
public
bli int
i t bPublico;
bP bli protected
t t d int
i t bProtegido;
bP t id private
i t int
i t bPrivado;
bPrivado
}
public class Derivada extends Base{
public
bli int
i dPublico;
dP bli private
i
i dPrivado;
int
dP i d
}
public class Test {
public static void main(String args[]){
Base b = new Base();
Derivada d = new Derivada();
System out println(b bPublico + " " + b.bProtegido
System.out.println(b.bPublico
b bProtegido + " " + b.bPrivado);
b bPrivado);
System.out.println(d.dPublico + " " + d.dPrivado);
}
} // NOTA: Se asume que todas las clases pertenecen al mismo paquete.

1.
2.
3.

En el main de Test, Qu accesos son incorrectos?


Si main fuera un mtodo de Base, Qu accesos seran incorrectos?
Si main fuera un mtodo de Derivada, Qu accesos seran incorrectos?
32

Herencia en Java: Sobrescritura de un


mtodo de la Clase Base
Cualquier mtodo no privado de Base que se defina de
nuevo en derivada se sobrescribe.
Para ello, definimos en Derivada un mtodo:
Con la misma signatura que en Base (nombre del mtodo y
lista de parmetros).
Con el mismo tipo de resultado que en Base.
Sin aadir excepciones a lista de throws del mtodo definido en
Base.
Base

Ejemplo de sobrescritura del mtodo


toString de Figura en la clase Circulo (I)
La clase Object es la raz de la jerarqua de herencia en
Java
Cualquier clase hereda implcitamente de la clase Object

Mtodo toString():
Especificacin:
Imlementacin:

Mtodo toString de la clase Figura (sobrescritura del


mtodo definido en Object):

Sobreescritura parcial:

public String toString(){


return Figura de tipo + tipo + color + color + centro
+ centro;

Cuando
C
d no se desea
d
cambiar
bi completamente
l t
t ell
comportamiento del mtodo de la clase Base. Se utiliza super
ppara invocar el mtodo de la clase Base.
33

}
34

Ejemplo de sobrescritura del mtodo


toString de Figura en la clase Circulo (II)
Mtodo toString en la clase Circulo (sobrescritura del
mtodo definido en Figura)
public String toString(){
return Circulo de radio + radio + color + color +
centro + centro;
}

Mtodo toString en la clase Circulo (sobrescritura parcial


d l mtodo
del
t d definido
d fi id en Fi
Figura))

Ejemplo de Sobreescritura: Equals


El mtodo equals est definido e implementado en la
clase Object
Permite decidir si dos referencias (objetos) son iguales.
Criterio por defecto: Dos referencias son iguales si apuntan
exactamente al mismo objeto.

El criterio
i i puede
d ser modificado
difi d para objetos
bj
d
de una
clase sobreescribiendo el mtodo equals (Ej. Figura):
Respetar ell perfil
R
fil ((cabecera)
b
)d
dell mtodo
d equals
l
Modificar criterio atendiendo a los atributos de la clase.

public String toString(){


ret rn super.toString()
return
s er t Strin () + y radio
radi + radio;
radi ;
}
35

public String toString();


[Object.java]

Ejercicio de Yogures

36

Polimorfismo en Java

Enlace Dinmico

El polimorfismo es una consecuencia directa de la Herencia:


Una variable referencia de una clase Base puede referenciar a
objetos tanto de la clase Base como de cualquier clase Derivada de
esta.

Toda variable referencia tiene siempre dos tipos:


Tipo esttico:

Ante situaciones de sobreescritura de mtodos, el mtodo a


ejecutar
j
es ell definido
d fi id por ell tipo
i di
dinmico
i d
de la
l variable
i bl
polimrfica.
Se aplica
p
en tiempo
p de ejecucin,
j
, previa
p
comprobacin
p
del
acceso en la clase del tipo esttico.

El tipo con el que ha sido declarada la variable (nunca vara)

ClaseBase

Tipo dinmico:
El tipo del objeto al que referencia en tiempo de ejecucin (puede variar)

+miMetodo()

Si ambos tipos
p no coinciden, entonces la variable es ppolimrfica.

Ejemplo:
Figura f = new Rectangulo();
La variable f es polimrfica:

ClaseDerivada

Tipo esttico: Figura


Tipo dinmico: Rectngulo

+miMetodo()
()

37

38

Jerarqua de Clases: Figuras

Ejemplo de Polimorfismo: Enlace Dinmico


public class TestPolimorfismo {
public static void main (String args[]) {
Figura f = new Circulo();
System.out.println(Radio del Circulo: + f.radio());
}

Object

Figura

cannot resolve symbol - method radio

Rectngulo

Circulo

El compilador nicamente considera el tipo esttico de la variable


ppara comprobar
p
el acceso:
El mtodo radio no est definido en la clase Figura. Error en
tiempo de compilacin.
A
Aunque
ell tipo
ti dinmico
di i de
d f sea Circulo.
Ci l

+radio()

Cuadrado
39

40

Ejemplo de Polimorfismo: Conversin de


Restriccin (I)

Ejemplo de Polimorfismo: Conversin de


Ampliacin

public class TestPolimorfismo {


public static void main (String args[]) {
Figura f = new Circulo();
System.out.println(Radio
y
p
(
del Circulo: + ( (Circulo)
(
) f ).radio());
)
())
}
}

public class TestPolimorfismo {


public static void main (String args[]) {
Figura f = new Circulo();
System.out.print(f);
y
p ()
}

Ya que f es de tipo dinmico Circulo, podemos realizar un


casting
g a tipo
p Circulo y, p
posteriormente,, invocar el
mtodo radio.
El operador casting () permite transformar una referencia de
un tipo
i a otro equivalente.
i l
Si el tipo destino NO es equivalente (i.e. ((Cuadrado) f) ),
entonces se produce la excepcin ClassCastException.
41

42

Ejemplo de Polimorfismo: Conversin de


Restriccin (II)
public class TestPolimorfismo {
public static void main (String args[]) {
Figura f = new Circulo();
Circulo c = f;
}
}

Aunque el tipo dinmico de f sea Circulo, al realizar la ltima


asignacin, el compilador indica que incompatible types f
found
Figura but expected Circulo.
C

El compilador nicamente tiene en cuenta los tipos estticos para


comprobar
b que las
l asignaciones
i
i
son correctas.
t

La asignacin se debera realizar de la siguiente manera:


Ci l c = (Circulo)
Circulo
(Ci l ) ff;
43

System.out.println invocar al mtodo toString de f, que


originalmente
g
est definido en la clase Object
j
aunque
q ha
sido sobrescrito en la clase Figura (y luego en Circulo).
Se produce una conversin de ampliacin.
El enlace dinmico garantiza que se ejecutar el
correspondiente mtodo de la clase Circulo.

Comprobacin de Tipo Dinmico: Operador


instanceof
Mostrar por pantalla slo aquellos elementos que son de tipo
Circulo,
C
cu o, adems
a e s dee cuntos
cu tos hay
ay (se asu
asumee que hay
ay un
u vecto
vector
de Figuras ya inicializado correctamente):
public class TestPolimorfismo {
Figura coleccion[];
public static void main (String args[]) {
System.out.println("Cuntos Crculos hay en la coleccin?");
int numCirculos = 0;
for(int i=0; i<coleccion.length; i++) {
Figura f = coleccion[i];
if (f instanceof
i t
f Circulo)
Ci l ) {
System.out.print( f.toString());
numCirculos++;
}
}
System.out.println(Hay + numCirculos + circulos.);
}
44

Ejercicio de Herencia y Polimorfismo


Dada la jerarqua de herencia,
Qu instrucciones son
correctas y cuales no?

SerVivo

Restringiendo la Especializacin: Final


Empleando la palabra clave final
Los atributos, mtodos y las clases pueden ser declaradas
como finales.

+vive()
()
1.

Animal

Vegetal
g

2.
3.

Humano

GiraSol

+razona()
+vive()

4.
5.
6.

seresVivos
Vi

7
7.
8.

SerVivo sv = new Humano();


Humano hu = new Humano();
Vegetal vg = new GiraSol();
sv.razona();
sv.vive();
hu.razona();
hu = vg;
sv = vg;

45

El uso de final genera cdigo ms eficiente ya que no se


utiliza enlace dinmico y la llamada se resuelve en tiempo de
compilacin.

46

Clases Abstractas (I)


Cmo obligar a que todas las clases derivadas deban
f
forzosamente
iimplementar
l
un determinado
d
i d mtodo?
d ?
Empleando la palabra clave abstract
public
bli abstract
b t
t class
l
Fi
Figura
{
protected String tipo;
protected Color color;
public Figura(String nombre){....}
public abstract double area();
...
}
public class Circulo extends Figura {
...
public double area(){ return Math.PI * radio * radio;}
...
}
47

Atributo final: Representa una constante cuyo valor no puede ser


modificado.
Mtodo final: Impide que el mtodo sea sobreescrito en alguna clase
descendiente.
Clase final: No pueden tener subclases, representa una hoja dentro
del rbol de jerarqua de herencia.

Clases Abstractas (II)


public class Rectangulo extends Figura {
...
public double area(){ return base * altura;}
...
}
public class Cuadrado extends Rectangulo {
...
//No hace falta redefinir el mtodo area
...
}

La clase Cuadrado hereda la implementacin del mtodo area de la


clase Rectngulo. No es necesario cambiar la implementacin y, por
lo tanto, no hace falta redefinir el mtodo.
48

Clases Abstractas (III)

Clase Abstracta: La clase Figura (I)

Una clase abstracta


Tiene al menos un mtodo abstracto, etiquetado como tal.
Debe ser etiquetada por el programador como abstracta.
N puede
No
d ser iinstanciada
t i d (va
( ell operador
d new).
)
Su(s) constructor(es) pueden ser utilizados (va super)
Puede ser utilizada ppara definir referencias polimrficas
p
de la clase.

Una subclase de una clase abstracta puede:


Implementar todos los mtodos abstractas
Puede ser instanciada
No implementar los mtodos abstractos
Sigue siendo abstracta

Utilizacin de estas clases:


C d se quiere
Cuando
i
obligar
bli
a que las
l subclases
b l
tengan
t
un cierto
i t
comportamiento

Ejemplo
j p estndar de Clase abstracta: Number
49

package lasFiguras;
import java.awt.*; //Para poder referenciar la clase Color
public abstract class Figura { // extends Object
protected String tipo;
protected String color;
protected static final String TIPO_POR_DEFECTO = "Circulo";
protected static final Color COLOR_POR_DEFECTO = Color.black;
public Figura(Color c,
c String t){
this.tipo = t; this.color = c;
}
public Figura(){
this(TIPO_POR_DEFECTO, COLOR_POR_DEFECTO);
}

50

Clase Abstracta: La clase Figura (II)

La Clase Rectangulo

public boolean equals(Object x){


Figura f = (Figura) x;
return (color.equals(f.color)
(color equals(f color) && tipo.equals(f.tipo));
tipo equals(f tipo));
}

public class Rectangulo extends Figura {


protected double base;
protected double altura;

public abstract double area();


} //Fin de la clase Figura

public Rectangulo(Color c, double b, double a){


super(c,
( R
Rectngulo);
t l ) this.base
thi b
= b;
b this.altura
thi lt
= a;
}
public Rectangulo (){
this(Color.black, 10.0, 10);
}
public double area(){ return base * altura;}
...

Para qu sirven los constructores


de una clase abstracta si no se
puede instanciar?

}
51

52

Interfaces en Java
En ocasiones es necesario que una clase herede de ms de una
superclase:

Interfaces en Java: Caractersticas


Una Interfaz
Consta slo de perfiles de mtodos que indican qu hace la clase
(especificacin) pero sin implementacin.
Permite especificar un comportamiento genrico.

Herencia Mltiple

Java slo permite que una clase herede explcitamente, va


extends, de una nica superclase (distinta de Object).

Para poder imponer el comportamiento que describe:


Sus mtodos son pblicos y abstractos, por lo que han de ser
forzosamente implementados por sus subclases. Se dice que una
clase implementa un interfaz.
Sus atributos son p
pblicos y finales,, ppor lo que
q NO tiene
constructores ni puede ser instanciada, PERO s se pueden definir
variables Referencia (polimrficas) del interfaz.

En ocasiones es necesario imponer a una clase una


funcionalidad genrica que no posee Object.
Para ello, se debe definir una superclase especial, slo con
mtodos abstractos,
abstractos por lo que forzosamente todas sus
subclases los deben implementar si quieren dejar de ser
abstractas.
53

Interfaces en Java: Sintaxis y Utilizacin


Sintaxis de Interfaces:
Uso de la palabra clave interface en lugar de class.
Se asume que los mtodos son public y abstract.

public interface MiInterfaz {


int metodoQueImplementar(Object o);
}
En las subClases del interfaz, se aade a su cabecera implements
public
bli class
l MiClase
MiCl
i
implements
l
t MiInterfaz
MiI t f {
...
public int metodoQueImplementar(Object o){
/* Implementacion del mtodo */ Qu ocurrira si MiClase
implementa el interfaz pero no
}
proporciona cdigo al mtodo?
}
55

Una subclase puede implementar todas las interfaces que


quiera.
54

Ejemplo de Interfaces (I)


Ejemplo
j p de uso de interfaces:
Forzar a que las clases proporcionen una descripcin de ellas.
public interface Describible {
p
String getDescripcion();
}
public class Libro implements Describible {
...
public Stringg g
p
getDescripcion(){
p
(){
return Este objeto es un libro;
}
...
}
Si se aaden nuevos mtodos al interfaz,, debern ser implementados
p
en
las correspondientes clases.
56

Ejemplo de Interfaces (II)


Una clase JJava puede
p
implementar
p
varias interfaces.
public interface Estudioso {
Conocimiento estudia(Conceptos c);
}

public interface Trabajador {


Dinero trabaja(Tareas t);
}

public class EstudianteTrabajador implements Estudioso,Trabajador{


public Conocimiento estudia(Conceptos c){
//Implementacin
}
public Dinero trabaja(Tareas t){
//Implementacin
}
}
Es pposible qque tener referencias de tipo
p interfaz qque sean ppolimrficas,, i.e.:
Estudioso e = new EstudianteTrabajador();
57

Uso Alternativo de Interfaces


Una interfaz tambin suele ser utilizada para agrupar
constantes.
public interface DiasSemana
{
int LUNES = 1 , MARTES = 2;
String [] NOMBRE_DIAS
NOMBRE DIAS = { "Lunes"
Lunes , "Martes"};
Martes };
}
public
bli class
l MisDias
Mi Di implements
i l
Di S
DiasSemana
{
public int metodo(){
p
(){
System.out.println(NOMBRE_DIAS[LUNES]);
}
}
59

Extensin de Interfaces
Una Interfaz A ppuede extender de otra interfaz B.
Implementar la interfaz A requiere dar cdigo a todos los
mtodos de A (los de A y los heredados de B).
public interface OrdenadorPortable extends Ordenador{
float capacidadBateria();
}
public interface Ordenador{
void
d encender();
d ()
}
public
bli class
l PDA implements
i l
O d
OrdenadorPortable{
d P t bl {
float capacidadBateria() { }
void encender(){ }
}
58

You might also like