Anda di halaman 1dari 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

5.

Escuela Tcnica Superior de Ingeniera Informtica


Uni ersidad Politcnica de Valencia
Universidad

Objetivos y Bibliografa
Objetivos:

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

Objetos y Clases en Java (I)


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.

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.
bj t Adisson-Wesley,
Adi
W l 2001.
2001 Captulo
C t l 14

Ejemplo: sea TestCirculo una aplicacin que maneja Crculos,


i e Objetos de la clase Circulo
i.e.

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.

Creacin de Objetos de una Clase:

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

102

c1
Circulo c1 = new Circulo();

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

c1 es una variable Referencia al nuevo Objeto


j
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; ?

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:

Detalles internos de cmo se satisface la Especificacin o cmo se


consigue hacer lo que se hace sobre un Objeto.

Componentes de una Clase:

Implementacin de una Clase: Definicin de


Atributos

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.

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.

Ej
Ejemplo:
l definicin
d fi i i de
d los
l Atributos
A ib
de
d la
l Clase
Cl
Circulo
Ci l
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

Modelo de la relacin TIENE UN(A)


Modificadores de atributos

private
private
private
private

Elementos qque aparecen


p
en la implementacin
p
de una clase:

Los Atributos de una Clase almacenan los datos de la Clase

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 ppara 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 p
para 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; }
ppublic Stringg toString()
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

14

Estado Actual de la Clase Circulo

Ejercicios Propuestos

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
RADIO_POR_DEFECTO);
POR DEFECTO)
}

}
15

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

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

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();
...
}

http://java sun com/javase/6/docs/api/


http://java.sun.com/javase/6/docs/api/

17

18

Paquetes Java: Reglas de Creacin


Para indicar que una Clase C pertenece al Paquete p:

la primera lnea del fichero C


C.java
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

Paquetes Java: Reglas de Visibilidad

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:

Simplificacin: uso de la directiva import (antes de la


declaracin de la clase).

Reglas de visibilidad dentro y fuera de un paquete.


Es posible investigar los paquetes que incluye el API de Java
mirando la documentacin:

La Clase C del Paquete


q
p se especifica
p
como p
p.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.

Manipulacin:

Paquetes Java: Reglas de Utilizacin

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.

19

Los IDEs (Entorno de Desarrollo Integrado) evitan tener que manipular


de manera directa dicha variable.
Ejemplo: HerramientasPreferenciasLibreras (BlueJ)
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;

public static void main(String args[]){

int otroAtributo;
}
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

Acceso Correcto

Paquete

Subclase

Mundo

private

No

No

No

ninguno

No

No

protected

No

public

package org.grycap.paquete;
public class Clase3{
public static void main(String args[]){
Clase1 c1 = new Clase1();
}}
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:

P
Paquete
t

Existe alguna relacin entre las clases,


Ejemplos: Clases de java.util,
aunque no realicen la misma funcionalidad.
javax.swing, etc.

Caractersticas y sintaxis de la Herencia en JJava


La clase Object y el modelo de jerarqua de Clases Java
Caractersticas de una clase derivada

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

}}

21

Relacin entre Clases

Visibilidad
Modificador

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

public in org.grycap.paquete; cannot be


accessed from outside package.

Y la de Clase 3?

Modificadores de Visibilidad: Tabla


Resumen

Ejercicio de Persona

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

Ejemplos: Diseo de la clase Figura y reformulacin de


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

La relacin ES UN(A)

Si X ES UN(A)
( ) Y,

Ejemplo de relacin ES UN(A)

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)

25

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.

X es de tipo compatible con Y.

27

Objeto
Figura

La Herencia permite modelar una


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

Rectngulo
Cuadrado

26

El Mecanismo de la Herencia

Un crculo ES UNA figura


Un rectngulo ES UNA figura
Un cuadrado ES UN Rectngulo

Crculo

Ejemplo: Qu relacin guardan


entre s un cuadrado, un tringulo, un
crculo y un rectngulo?
g

X (Derivada)

Jerarqua de clases de figuras:

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


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

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:

28

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

Ejemplo Bsico de Herencia


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

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());
}
}

Herencia: Mtodos Constructores de una


Clase Derivada

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

Constructor por defecto:

Qu saca por pantalla


este cdigo?

En caso contrario, Java proporciona el constructor por defecto:


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

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.

Implicaciones:

29

La clase Derivada debe definir explcitamente sus propios


constructores.
constructores

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.

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)

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 Figura)
Fi
)

35

public String toString(){


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

34

Ejemplo de sobrescritura del mtodo


toString de Figura en la clase Circulo (II)

public String toString();


[Object.java]

33

Especificacin:
Imlementacin:

Mtodo toString de la clase Figura (sobrescritura del


mtodo definido en Object):

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

Cualquier clase hereda implcitamente de la clase Object

Mtodo toString():

Sobreescritura parcial:

La clase Object es la raz de la jerarqua de herencia en


Java

public String toString(){


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

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
de
d 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
bli boolean
b l
equals(Object
l (Obj t x){
){
Figura f = (Figura) x;
return (color.equals(f.color) && tipo.equals(f.tipo));
}

36

Polimorfismo en Java

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:

Ante situaciones de sobreescritura de mtodos, el mtodo a


ejecutar
j
es ell d
definido
fi id por ell tipo
i di
dinmico
i d
de lla variable
i bl
polimrfica.
Se aplica
p
en tiempo
p de ejecucin,
j
, pprevia 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:

Tipo esttico:

Enlace 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.

ClaseBase cb = new ClaseDerivada();


cb.miMetodo();

Ejemplo:

Figura f = new Rectangulo();


La variable f es polimrfica:

ClaseDerivada

Tipo esttico: Figura


Tipo dinmico: Rectngulo

+miMetodo()
()

37

Se ejecutar el cdigo de miMetodo


definido en ClaseDerivada.

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
+radio()

Cuadrado
39

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.
Aunque
A
ell tipo
ti dinmico
di i de
d f sea Circulo.
Ci l
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();
y
p
(
del Circulo: + ( (Circulo)
(
) f ).radio());
)
())
System.out.println(Radio
}
}

public class TestPolimorfismo {


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

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:

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.

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

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 asume
asu e que hay
ay un
u vecto
vector
de Figuras ya inicializado correctamente):

ppublic 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

SerVivo
+vive()
()

Vegetal
g

2.
3.

Humano

GiraSol

+razona()
+vive()

4.
5.
6.

Vi
seresVivos

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

Cmo obligar a que todas las clases derivadas deban


f
forzosamente
implementar
i l
un d
determinado
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.

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)

Empleando la palabra clave final


Los atributos, mtodos y las clases pueden ser declaradas
como finales.

1.

Animal

Dada la jerarqua de herencia,


Qu instrucciones son
correctas y cuales no?

Restringiendo la Especializacin: Final

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)

Una clase abstracta

Implementar todos los mtodos abstractas Puede ser instanciada


No implementar los mtodos abstractos Sigue siendo abstracta

Utilizacin de estas clases:

Tiene al menos un mtodo abstracto, etiquetado como tal.


Debe ser etiquetada por el programador como abstracta.
N puede
No
d ser instanciada
i t i d (va
( ell operador
d new).
)
Su(s) constructor(es) pueden ser utilizados (va super)
Puede ser utilizada p
para definir referencias ppolimrficas de la clase.

Una subclase de una clase abstracta puede:

Clase Abstracta: La clase Figura (I)

C d se quiere
Cuando
i
obligar
bli
a que llas subclases
b l
ttengan 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

51

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?

52

Interfaces en Java

Interfaces en Java: Caractersticas

En ocasiones es necesario que una clase herede de ms de una


superclase:

Herencia Mltiple

Java slo permite que una clase herede explcitamente, va


extends, de una nica superclase (distinta de 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

Consta slo de perfiles de mtodos que indican qu hace la clase


(especificacin) pero sin implementacin.
Permite especificar un comportamiento genrico.

Para poder imponer el comportamiento que describe:

En ocasiones es necesario imponer a una clase una


funcionalidad genrica que no posee Object.

Una Interfaz

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 qque NO tiene
constructores ni puede ser instanciada, PERO s se pueden definir
variables Referencia (polimrficas) del interfaz.

Una subclase puede implementar todas las interfaces que


quiera.
54

Interfaces en Java: Sintaxis y Utilizacin

Ejemplo de Interfaces (I)

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

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 {
...
ppublic Stringg g
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
}
}
q tener referencias de tipo
p interfaz que
q sean polimrficas,
p
, i.e.:
Es pposible que
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
NOMBRE_DIAS
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 p
puede 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

Anda mungkin juga menyukai