eda_tema_1_gmolto.pdf
TRANSCRIPT
-
Tema 1- Conceptos de Java para Estructuras de Datos
Germn MoltEscuela Tcnica Superior de Ingeniera Informtica
Uni ersidad Politcnica de ValenciaUniversidad Politcnica de Valencia
1
Tema 1- Conceptos de Java para Estructuras de DatosTema 1 Conceptos de Java para Estructuras de Datos
ndice general:1. Clases y Objetos en Java2. El Principio de la Programacin Orientada a Objetos de la Herencia y
su Soporte en Java3 El Polimorfismo en Java3. El Polimorfismo en Java4. Ms Herencia en Java: Mtodos y Clases Finales y Abstractos.5. Herencia Mltiple: Interfaces Java5. Herencia Mltiple: Interfaces Java
2
Objetivos y BibliografaObjetivos 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 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 Estudiar el concepto de paquete como mecanismo para la agrupacin de clases.
Comprender el concepto de Polimorfismo, Interfaz y Clase Ab ilid dAbstracta, as como su utilidad.
Bibliografa: Weiss M A Estructuras de datos en Java Adisson-Wesley 2000 Weiss, M.A. Estructuras de datos en Java. Adisson-Wesley, 2000.
Captulos 2 (Apartado 2.5) 3 y 4 Arnow, D., Weiss G. Introduccin a la Programacin con Java. Un
f i t d bj t Adi W l 2001 C t l 14
3
enfoque orientado a objetos. Adisson-Wesley, 2001. Captulo 14
Objetos y Clases en Java (I)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 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 Un Objeto de una Clase se usa/manipula desde cualquier mtodo de otra Clase, como por ejemplo TestClase.
public class TestClase {public class TestClase {public static void main( String args[] ){ ... }
}
Ejemplo: sea TestCirculo una aplicacin que maneja Crculos, i e Objetos de la clase Circulo
4
i.e. Objetos de la clase Circulo
-
Objetos y Clases en Java (II)Objetos y Clases en Java (II)
public class TestClase {p {public static void main( String args[] ){
?}
}
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 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
Objetos y Clases en Java (III)Objetos y Clases en Java (III)
public class TestClase {p {public static void main( String args[] ){
Circulo c1 = new Circulo();Circulo c2;c2 = c1;}}
}
Creacin de Objetos de una Clase: c1 es una variable Referencia al nuevo Objeto creado. j c2 es una variable Referencia a ningn Objeto, i.e. tras la
declaracin Circulo c2 ; c2 == null
6
Qu ocurre si se ejecuta c2 = c1; ?
Referencias en JavaReferencias en Java Una variable Referencia almacena la direccin de memoria en
la que se encuentra el Objeto al que referencia.
0
102 102c1
408Circulo c1 = new Circulo();
Memoria
Circulo c1 new Circulo();
Al hacer: Circulo c2 = c1; La variable referencia c2 pasa a tener el mismo valor que
7
c1, es decir, ambas apuntan al mismo objeto.
Ejemplo de Utilizacin de Objetos CirculoEjemplo de Utilizacin de Objetos Circulo
Podemos crear un objeto de la clase Circulo de la manera jespecificada 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 color);Circulo c2 = new Circulo(radio, color);System.out.println(c2);System.out.println(c2.toString());y p ( g());
}}
Qu diferencia hay en las dos ltimas invocaciones?
8
dos ltimas invocaciones?
-
Implementacin de una ClaseImplementacin 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: Componentes de una Clase: Atributos, que almacenan los datos de la Clase Mtodos que definen la funcionalidad de la Clase mediante por lo Mtodos, que definen la funcionalidad de la Clase mediante, por lo
general, la manipulacin de los atributos.
Elementos que aparecen en la implementacin de una clase:q p p 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
9
componentes.
Implementacin de una Clase: Definicin de AtributosAtributos
Los Atributos de una Clase almacenan los datos de la Clase Modelo de la relacin TIENE UN(A) Modificadores de atributosEj l d fi i i d l A ib d l Cl Ci l Ejemplo: definicin de los Atributos de la Clase Circuloprivate double radio;private String color;private String color;private static final double RADIO_POR_DEFECTO = 3.0;private 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 datosencapsulacin u ocultacin de datos.
Modificador static: Permite definir variables a nivel de clase (compartidas por todos los objetos).
10
Modificador final: Impide asignar un nuevo valor al atributo.
Implementacin de una Clase: Definicin de ConstructoresConstructores
Los Constructores de una clase permiten dar un valor pinicial a los atributos del objeto. Ejemplo: definicin de los mtodos Constructores de Circulo
public Circulo() {radio = RADIO_POR_DEFECTO;color = COLOR_POR_DEFECTO;
}public Circulo(double radio Color color) {
this hace referencia al objeto sobre el que se invoca el mtodo y sirve para evitar el aliasing de public Circulo(double radio, Color color) {
this.radio = radio;this.color = color;
}
y p gnombres.
}public Circulo(){
this(RADIO_POR_DEFECTO, COLOR_POR_DEFECTO);
11
( )}
Implementacin de una Clase: Definicin de Mtodos (I)Mtodos (I) Los Mtodos de una clase definen su funcionalidad. Ejem l : Definicin de Mtodos Consultores en la clase Ejemplo: Definicin de Mtodos Consultores en la clase
Circulo. Al definir como privados todos los atributos de Circulo, se deben
i d d lproporcionar mtodos para acceder a su valor.
public double getRadio() { Se podra utilizar this para referenciar a public double getRadio() {return radio;
}
p plos atributos (i.e., this.radio) pero no es necesario puesto que no hay aliasing de nombres.
public Color getColor() {t lreturn color;
}
12
-
Implementacin de una Clase: Definicin de Mtodos (II)Mtodos (II)
Al definir como privados todos los atributos de Circulo, pse 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 ya no es necesario utilizar this
13
ya no es necesario utilizar this.
Implementacin de una Clase: Definicin de Mtodos (III)Mtodos (III)
Ejemplo: definicin de otros Mtodos de Circuloj ppublic double area() { return Math.PI * radio * radio; }public String toString() {return Circulo de radio + radio}p g g() { }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?
14
referenciar al atributo radio?
Estado Actual de la Clase CirculoEstado Actual de la Clase Circulopublic class Circulo {
private double radio;private double radio;private Color color;private static final double RADIO_POR_DEFECTO = 3.0;private static final Color COLOR POR DEFECTO = Colorblack;private static final Color COLOR_POR_DEFECTO Color.black;
/** crea un Circulo con radio r y color c */public Circulo(Color c double r) {public Circulo(Color 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() {
hi (COLOR POR DEFECTO RADIO POR DEFECTO)this(COLOR_POR_DEFECTO, RADIO_POR_DEFECTO);}
}
15
}
Ejercicios PropuestosEjercicios Propuestos Ejercicio 1: Escribe la clase Manzana que tiene un sabor, de tipo
entero que representa una escala [0 10] entero que representa una escala [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 de la aplicacin misCirculos, cmo se afrontara el p p diseo e implementacin de la nueva aplicacin?
Ejercicio 3: Se desea realizar una aplicacin que maneje un grupo de Crculos En particular se desea:de Crculos. En 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).
16
( p )
-
Paquetes Java: Reutilizacin de CdigoPaquetes Java: Reutilizacin de Cdigo El mecanismo Java ms general para organizar un grupo de
Cl d l l i l P tClases que guardan alguna relacin entre s es el Paquete Paquetes Java estndar
java.lang : Contiene, entre otras, las clases Integer, Math, String y java.lang : Contiene, entre otras, las clases Integer, Math, String y System
java.util : Contiene, entre otras, las clases Date, Random y StringTokenizerg
java.io, java.awt (incluye la clase Color), etc. Manipulacin:
l di ti i t l i bl d t CLASSPATH l la directiva import; la variable de entorno CLASSPATH; la instruccin package.
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/
17
http://java.sun.com/javase/6/docs/api/
Paquetes Java: Reglas de UtilizacinPaquetes Java: Reglas de Utilizacin
La Clase C del Paquete p se especifica como p.Cq p p ppublic class MiClase(){
...j il D t f h j il D t ()java.util.Date fecha = new java.util.Date();...
}
Simplificacin: uso de la directiva import (antes de la declaracin de la clase).declaracin de la clase).
import java.util.*;public class MiClase(){
...Date fecha = new Date();...
18
}
Paquetes Java: Reglas de CreacinPaquetes Java: Reglas de Creacin Para indicar que una Clase C pertenece al Paquete p:
la primera lnea del fichero C java es package p; la primera lnea del fichero 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 CLASSPATHentorno CLASSPATH
Por ejemplo: La clase MiClase del paquete org.grycap.paquetedeber estar en la ruta: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: HerramientasPreferenciasLibreras (BlueJ)
19
Paquetes Java: Reglas de VisibilidadPaquetes 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 private o protected) slo modificador de visibilidad alguno (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 pueden alcanzar a travs de la variable CLASSPATH se consideran pparte del mismo paquete y el acceso amistoso se aplica entre ellas
20
-
Ejercicio de Modificadores de VisibilidadEjercicio de Modificadores de Visibilidad
package org.grycap.paquete;
class Clase1{
package org.grycap.otropaquete;
import org.grycap.paquete.*;
private int aPrivado;
int otroAtributo;
}
public class Clase2{
public static void main(String args[]){
C C ()} Clase1 c1 = new Clase1();
}} La creacin en Clase 2 es correcta?
Clase 1 NO tiene modificador de package org.grycap.paquete;
public class Clase3{visibilidad Acceso friendly (solo accesible desde clases del mismo paquete). Clase 2 pertenece a otro
public static void main(String args[]){
Clase1 c1 = new Clase1();
p q ) ppaquete: org.grycap.paquete.Clase1 is not public in org.grycap.paquete; cannot be accessed from outside package.
21
}} Y la de Clase 3? Acceso Correcto
Modificadores de Visibilidad: Tabla Resumen
Modificadores de visibilidad aplicados tanto a una clase como pa cualquiera de sus miembros (atributos y mtodos).
VisibilidadModificador
Clase Paquete Subclase Mundo
private S No No No
ninguno S S No Noninguno S S No No
protected S S S No
public S S S S
22
Reutilizacin de Cdigo: Tipo de Relacin y Mecanismo Java
Mecanismo Java para representar una Relacin entre Clases Mecanismo Java para representar una relacin
P tExiste alguna relacin entre las clases, aunque no realicen la misma funcionalidad.
Paquete
Ejemplos: Clases de java.util, javax.swing, etc.javax.swing, etc.
Existe una relacin TIENE UN(A) o Definicin de Atributos
relacin de composicin entre las Clases Ejemplos: Circulo y grupoCirculos
Herencia JavaExiste una relacin relacin ES UN(A) o relacin jerrquica entre las Clases
Herencia JavaEjemplos: clase base Figura y sus derivadas Circulo, Rectangulo, ...
23 Ejercicio de Persona
Herencia en Lenguajes de POO y su Soporte en Javaen Java
Introduccin al concepto de Herencia y su soporte en p y pJava. En particular, se incidir en los siguientes aspectos: Caractersticas y sintaxis de la Herencia en Javay J La clase Object y el modelo de jerarqua de Clases Java Caractersticas de una clase derivada
Modificadores de visibilidad. Constructores de la derivada.
S Sobrescritura de mtodos.
Ejemplos: Diseo de la clase Figura y reformulacin de Ci l d d i d Di d l Circulo para que sea una de sus derivadas. Diseo de la clase GrupoDeFiguras.
24
-
La relacin ES UN(A)La relacin ES UN(A)
Si X ES UN(A) Y,( ) 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) ZX ES UN(A) Z
Ejemplo: Qu relacin guardan Y (Base) Ejemplo: Qu relacin guardan entre s un cuadrado, un tringulo, un
crculo y un rectngulo?
Y (Base)
y g
X (Derivada)
25
Ejemplo de relacin ES UN(A)Ejemplo de relacin ES UN(A) Jerarqua de clases de figuras:
Objeto Un crculo ES UNA figura Un rectngulo ES UNA figura
Objeto
Un cuadrado ES UN Rectngulo Figura
Crculo Rectngulo
Cuadrado La Herencia permite modelar una relacin de tipo ES UNrelacin de tipo ES UN.
Permite definir una jerarqua de clases.
26
El Mecanismo de la HerenciaEl Mecanismo de la Herencia La Herencia permite la formacin de Y (Base)
Jerarquas de Clases para reutilizar cdigo. X hereda (puede referenciar) todos los
Y (Base)
atributos y mtodos que no sean privados en Y.
X (Derivada)
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. Una referencia de tipo Y es polimrfica. Sin embargo, no son
compatibles ni Y con X, ni X con sus clases hermanas.
27
Herencia: Sintxis bsica de JavaHerencia: Sintxis bsica de Javapublic 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: Referenciar a cualquier componente de Base (atributos,
d ) mtodos 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
28
en casos de sobreescritura parcial de mtodos.
-
Ejemplo Bsico de HerenciaEjemplo Bsico de Herenciapublic class Animal{ public class Leon extends Animal {
protected String queHablo;public Animal(){
queHablo = Groar!;
public Leon(){queHablo = Grawl!;
}queHablo = Groar! ; }public String rugir(){
}}
return queHablo; }}
public class TestLeon {public static void main (String args[]){
Qu saca por pantalla este cdigo?
Leon l = new Leon();System.out.println(l.rugir());
}
este cdigo?
29
}}
Herencia: Mtodos Constructores de una Clase DerivadaClase Derivada La clase Derivada debe definir explcitamente sus propios
constructoresconstructores. 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.
Implicaciones: Si la clase Base NO define un constructor por defecto (sin 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
correspondientes.
Ejemplo: Definicin de ConstructoresEjemplo: Definicin de Constructores Constructores de la clase Figura:
public Figura(Color c, String t) {this.color = c; this.tipo = t; }public Figura(){ this(COLOR POR DEFECTO, TIPO POR DEFECTO); }p g (){ ( _ _ , _ _ ); }
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
}
Ejercicio: Modificadores de Visibilidad Ejercicio: Modificadores de Visibilidad public class Base{
bli i t bP bli t t d i t bP t id i t i t bPrivadopublic int bPublico; protected int bProtegido; private int bPrivado;} public class Derivada extends Base{
bli i dP bli i i dP i dpublic int dPublico; private int dPrivado;} public class Test {
public static void main(String args[]){Base b = new Base();Derivada d = new Derivada();System out println(b bPublico + " " + b bProtegido + " " + b bPrivado);System.out.println(b.bPublico + + b.bProtegido + + b.bPrivado);System.out.println(d.dPublico + " " + d.dPrivado);
}} // NOTA: Se asume que todas las clases pertenecen al mismo paquete.} // NOTA: Se asume que todas las clases pertenecen al mismo paquete.
1. En el main de Test, Qu accesos son incorrectos?2. Si main fuera un mtodo de Base, Qu accesos seran incorrectos?
32
2. Si main fuera un mtodo de Base, Qu accesos seran incorrectos?3. Si main fuera un mtodo de Derivada, Qu accesos seran incorrectos?
-
Herencia en Java: Sobrescritura de un mtodo de la Clase Basemtodo 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
BaseBase.
Sobreescritura parcial: C d d bi l t t l Cuando no se desea cambiar completamente el
comportamiento del mtodo de la clase Base. Se utiliza super para invocar el mtodo de la clase Base.
33
p
Ejemplo de sobrescritura del mtodo toString de Figura en la clase Circulo (I)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: public String toString(); Imlementacin: [Object.java]
Mtodo toString de la clase Figura (sobrescritura del mtodo definido en Object): 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)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 t d d fi id Fi )del mtodo definido en Figura) public String toString(){
ret rn s er t Strin () + radi + radi ;return super.toString() + y radio + radio;}
35 Ejercicio de Yogures
Ejemplo de Sobreescritura: EqualsEjemplo 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 i i d difi d bj d El criterio puede ser modificado para objetos de una clase sobreescribiendo el mtodo equals (Ej. Figura):
R l fil ( b ) d l d l Respetar el perfil (cabecera) del mtodo equals Modificar criterio atendiendo a los atributos de la clase.
bli b l l (Obj t ){public boolean equals(Object x){Figura f = (Figura) x;return (color.equals(f.color) && tipo.equals(f.tipo));
}
36
}
-
Polimorfismo en JavaPolimorfismo en Java El polimorfismo es una consecuencia directa de la Herencia:
Una variable referencia de una clase Base puede referenciar a 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: Toda variable referencia tiene siempre dos tipos: Tipo esttico:
El tipo con el que ha sido declarada la variable (nunca vara) Tipo dinmico:
El tipo del objeto al que referencia en tiempo de ejecucin (puede variar) Si ambos tipos no coinciden, entonces la variable es polimrfica.p p
Ejemplo: Figura f = new Rectangulo(); La variable f es polimrfica: La variable f es polimrfica:
Tipo esttico: Figura Tipo dinmico: Rectngulo
37
Enlace DinmicoEnlace Dinmico Ante situaciones de sobreescritura de mtodos, el mtodo a
j l d fi id l i di i d l i bl ejecutar es el definido por el tipo dinmico de la variable polimrfica.
Se aplica en tiempo de ejecucin, previa comprobacin del p p j , p pacceso en la clase del tipo esttico.
CClaseBase
+miMetodo()
ClaseBase cb = new ClaseDerivada();cb.miMetodo();
ClaseDerivada
+miMetodo()
Se ejecutar el cdigo de miMetododefinido en ClaseDerivada.
38
()
Jerarqua de Clases: FigurasJerarqua de Clases: Figuras
Object
Figura
Circulo
+radio()
Rectngulo
Cuadrado+radio()
39
Ejemplo de Polimorfismo: Enlace DinmicoEjemplo de Polimorfismo: Enlace Dinmico
public class TestPolimorfismo {public class TestPolimorfismo {public static void main (String args[]) {Figura f = new Circulo();System.out.println(Radio del Circulo: + f.radio());
}
cannot resolve symbol - method radio
El compilador nicamente considera el tipo esttico de la variable para comprobar el acceso:p p El mtodo radio no est definido en la clase Figura. Error en
tiempo de compilacin. A l ti di i d f Ci l
40
Aunque el tipo dinmico de f sea Circulo.
-
Ejemplo de Polimorfismo: Conversin de Restriccin (I)Restriccin (I)
public class TestPolimorfismo {public static void main (String args[]) {Figura f = new Circulo();System.out.println(Radio del Circulo: + ( (Circulo) f ).radio());y p ( ( ( ) ) ())
}}
Ya que f es de tipo dinmico Circulo, podemos realizar un casting a tipo Circulo y, posteriormente, invocar el g p y, p ,mtodo radio. El operador casting () permite transformar una referencia de
i i lun tipo a otro equivalente. Si el tipo destino NO es equivalente (i.e. ((Cuadrado) f) ),
entonces se produce la excepcin ClassCastException.
41
entonces se produce la excepcin ClassCastException.
Ejemplo de Polimorfismo: Conversin de AmpliacinAmpliacin
public class TestPolimorfismo {public static void main (String args[]) {Figura f = new Circulo();System.out.print(f);y p ( )
}
System.out.println invocar al mtodo toString de f, que originalmente est definido en la clase Object aunque ha g j qsido 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.
42
Ejemplo de Polimorfismo: Conversin de Restriccin (II)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 ltimaasignacin, el compilador indica que incompatible types -f C found Figura but expected Circulo. El compilador nicamente tiene en cuenta los tipos estticos para
b l i i tcomprobar que las asignaciones son correctas.
La asignacin se debera realizar de la siguiente manera:Ci l (Ci l ) f
43
Circulo c = (Circulo) f;
Comprobacin de Tipo Dinmico: Operador instanceofinstanceof Mostrar por pantalla slo aquellos elementos que son de tipo
Circulo, adems de cuntos hay (se asume que hay un vector C cu o, a e s e cu tos ay (se asu e que ay u vecto de Figuras ya inicializado correctamente):
public class TestPolimorfismo {pFigura coleccion[];
public static void main (String args[]) {System.out.println("Cuntos Crculos hay en la coleccin?");int numCirculos = 0;for(int i=0; i
-
Ejercicio de Herencia y PolimorfismoEjercicio de Herencia y Polimorfismo Dada la jerarqua de herencia,
Qu instrucciones son correctas y cuales no?SerVivo
+vive()
1. SerVivo sv = new Humano();2. Humano hu = new Humano();
()
Animal Vegetal3. Vegetal vg = new GiraSol();4. sv.razona();
g
GiraSolHumano5. sv.vive(); 6. hu.razona(); 7 hu = vg;
GiraSol
Vi
Humano+razona()
+vive()7. hu = vg; 8. sv = vg;
seresVivos
45
Restringiendo la Especializacin: FinalRestringiendo la Especializacin: Final Empleando la palabra clave final Los atributos, mtodos y las clases pueden ser declaradas
como finales. Atributo final: Representa una constante cuyo valor no puede ser 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 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)Clases Abstractas (I) Cmo obligar a que todas las clases derivadas deban
f i l d i d d ? forzosamente implementar un determinado mtodo? Empleando la palabra clave abstract
bli b t t l Fi { public abstract class 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
}
Clases Abstractas (II)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
}
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)Clases Abstractas (III) Una clase abstracta
Tiene al menos un mtodo abstracto, etiquetado como tal. Debe ser etiquetada por el programador como abstracta. N d i t i d ( l d ) No puede ser instanciada (va el operador new). Su(s) constructor(es) pueden ser utilizados (va super) Puede ser utilizada para definir referencias polimrficas de la clase.p p
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 i bli l b l t i t Cuando se quiere obligar a que las subclases tengan un cierto
comportamiento Ejemplo estndar de Clase abstracta: Number
49
j p
Clase Abstracta: La clase Figura (I)Clase Abstracta: La clase Figura (I)package lasFiguras;import java.awt.*; //Para poder referenciar la clase Colorpublic abstract class Figura { // extends Object
protected String tipo; 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 String t){ public Figura(Color 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)Clase Abstracta: La clase Figura (II)public boolean equals(Object x){
Figura f = (Figura) x;return (colorequals(f color) && tipo equals(f tipo));return (color.equals(f.color) && tipo.equals(f.tipo));
}
public abstract double area();
} //Fin de la clase Figura
Para qu sirven los constructores de una clase abstracta si no se
puede instanciar?} //Fin de la clase Figura puede instanciar?
51
La Clase RectanguloLa Clase Rectangulopublic class Rectangulo extends Figura {
protected double base;protected double altura;
public Rectangulo(Color c, double b, double a){( R t l ) thi b = b thi lt = super(c, Rectngulo); this.base = b; this.altura = a;
}public Rectangulo (){public Rectangulo (){this(Color.black, 10.0, 10);}}public double area(){ return base * altura;}...
52}
-
Interfaces en JavaInterfaces en Java En ocasiones es necesario que una clase herede de ms de una
superclase: superclase: Herencia Mltiple
Java slo permite que una clase herede explcitamente, va Java slo permite que una clase herede explcitamente, va extends, de una nica superclase (distinta de Object).
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 por lo que forzosamente todas sus mtodos abstractos, por lo que forzosamente todas sus subclases los deben implementar si quieren dejar de ser abstractas.
53
Interfaces en Java: CaractersticasInterfaces en Java: Caractersticas Una Interfaz
Consta slo de perfiles de mtodos que indican qu hace la clase 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: Sus mtodos son pblicos y abstractos, por lo que han de ser 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 pblicos y finales, por lo que NO tiene p y , p qconstructores 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 UtilizacinInterfaces 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 {public interface MiInterfaz {int metodoQueImplementar(Object o);
} En las subClases del interfaz, se aade a su cabecera implements
bli l MiCl i l t MiI t f {public class MiClase implements MiInterfaz {...public int metodoQueImplementar(Object o){public int metodoQueImplementar(Object o){
/* Implementacion del mtodo */ }
Qu ocurrira si MiClase implementa el interfaz pero no
55
} proporciona cdigo al mtodo?
Ejemplo de Interfaces (I)Ejemplo de Interfaces (I)
Ejemplo de uso de interfaces:j p Forzar a que las clases proporcionen una descripcin de ellas.
public interface Describible { p {String getDescripcion();
}
public class Libro implements Describible { ...
public String getDescripcion(){p g g p (){return Este objeto es un libro;
} ...
}
Si se aaden nuevos mtodos al interfaz, debern ser implementados en , plas correspondientes clases.56
-
Ejemplo de Interfaces (II)Ejemplo de Interfaces (II)
Una clase Java puede implementar varias interfaces.J p ppublic 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 posible que tener referencias de tipo interfaz que sean polimrficas, i.e.: p q p q p ,Estudioso e = new EstudianteTrabajador();
57
Extensin de InterfacesExtensin de Interfaces
Una Interfaz A puede extender de otra interfaz B.p 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{ d d ()void encender();
}
bli l PDA i l O d d P t bl {public class PDA implements OrdenadorPortable{float capacidadBateria() { }void encender(){ }
}58
Uso Alternativo de InterfacesUso Alternativo de Interfaces Una interfaz tambin suele ser utilizada para agrupar
constantes.public interface DiasSemana{
int LUNES = 1 , MARTES = 2;String [] NOMBRE DIAS = { "Lunes" , "Martes"};String [] NOMBRE_DIAS { Lunes , Martes };
}
bli l Mi Di i l Di Spublic class MisDias implements DiasSemana{public int metodo(){p (){
System.out.println(NOMBRE_DIAS[LUNES]);}
}
59
}