Herencia En Java Parte 1

download Herencia En Java Parte 1

of 99

Transcript of Herencia En Java Parte 1

Tema 3 Herencia en Java, parte 1Programacin Orientada a Objetos Curso 2010/2011

Contenido Introduccin. Definicin y tipos. Constructores. Redefinicin. Restringir la herencia. Visibilidad protegida. Polimorfismo. Herencia y sistema de tipos. Ligadura dinmica. Clase Object. Autoboxing. Copia de objetos. Igualdad de objetos. Casting Operador instanceof Clases abstractas. Interfaces.

Curso 2010/2011

Programacin Orientada a Objetos

2

IntroduccinLas clases no son suficientes para conseguir los objetivos de: Reutilizacin:Necesidad de mecanismos para definir cdigo genrico

Extensibilidad:Principios de diseo modular: eleccin nica y abierto-cerrado.

Curso 2010/2011

Programacin Orientada a Objetos

3

Cdigo genricoFactoriza un funcionalidad comn a un conjunto de tipos. Se trata de un cdigo independiente de la representacin escogida para los tipos de datos. El cdigo genrico soporta variacin de algoritmos y estructuras de datos.Cada tipo puede escoger una estructura de datos diferente. Los algoritmos implementados por cada tipo para una misma funcin pueden ser diferentes.

Cdigo con diferentes interpretaciones en tiempo de ejecucin.Curso 2010/2011 Programacin Orientada a Objetos 4

Cdigo genricoEjemplo: funcin de bsqueda en una coleccin secuencialSe pueden elegir diferentes representaciones para una coleccin secuencial: array, lista enlazada, etc. La funcin de bsqueda es igual para todas las representaciones. Se debe implementar una nica vez para todas las colecciones secuenciales (factorizar comportamiento comn). Para cada estructura de datos las operaciones de la coleccin (avanzar, obtener el elemento actual, etc.) se implementan de manera diferente.

Curso 2010/2011

Programacin Orientada a Objetos

5

Cdigo genrico - Ejemplopublic boolean buscar (T x){ boolean encontrado = false; comenzar(); while (!fin() && !encontrado){ if (x.equals(item()) { encontrado = true; } avanzar(); } return encontrado; }

Se puede implementar una funcin parecida en un lenguaje imperativo?Curso 2010/2011 Programacin Orientada a Objetos 6

ExtensibilidadPrincipio de Eleccin nica:Evitar, cuando sea posible, manejar listas de variantes.if (cuenta.getTipo() == TipoCuenta.CORRIENTE) { cuenta.setComision(COMISION_DEFECTO); } else if (cuenta.getTipo() == TipoCuenta.REMUNERADA) { cuenta.setComision(0); } else if (cuenta.getTipo() == TipoCuenta.AHORRO) { cuenta.setComision(COMISION_DEFECTO / 2); }

Qu ocurre si aadimos un nuevo tipo de cuenta?

Curso 2010/2011

Programacin Orientada a Objetos

7

ExtensibilidadPrincipio Abierto-Cerrado:Un mdulo est abierto si est disponible para ser adaptado: aadir o modificar funcionalidad. Un mdulo est cerrado si est disponible para ser utilizado. La extensibilidad del cdigo se ve favorecida por mdulos que estn abiertos y cerrados al mismo tiempo. Objetivo: extender un mdulo sin afectar al cdigo que ya haca uso de ese mdulo. Ejemplo: modificacin de la operacin de reintegro de las cuentas para que permita descubiertos que generan intereses, sin modificar la clase Cuenta.Curso 2010/2011 Programacin Orientada a Objetos 8

IntroduccinEntre las clases pueden existir relaciones conceptuales: Extensin, Especializacin, Combinacin. Ejemplos:Una pila puede definirse a partir de una cola o viceversa Un rectngulo es una especializacin de polgono Libros y Revistas tienen propiedades comunes

Herencia:Mecanismo para definir y utilizar estas relaciones. Permite la definicin de una clase a partir de otra.Curso 2010/2011 Programacin Orientada a Objetos 9

IntroduccinLa herencia organiza las clases en una estructura jerrquica Jerarqua de clases No es slo un mecanismo de reutilizacin de cdigo. Es consistente con el sistema de tipos. Ejemplos:PUBLICACION LIBRO LIBRO_TEXTOCurso 2010/2011

FIGURA POLIGONO RECTANGULO CIRCULO

REVISTA INVESTIGACION MAGAZINE

Programacin Orientada a Objetos

10

HerenciaSi la clase B hereda de A, entonces B incorpora la estructura (atributos) y comportamiento (mtodos) de la clase A, pero puede incluir adaptaciones:B puede aadir nuevos atributos. B puede aadir nuevos mtodos. B puede redefinir mtodos heredados (refinar o reemplazar).

En general, las adaptaciones dependen del lenguaje OO.

Curso 2010/2011

Programacin Orientada a Objetos

11

Herencia TerminologaB hereda de A (A es la superclase y B la subclase)

A

A es la clase padre o clase base de B C hereda de B y A

B

B y C son subclases de A B es un descendiente directo de A

C

C es un descendiente indirecto de A A y B son ascendientes de C

Curso 2010/2011

Programacin Orientada a Objetos

12

Tipos de herenciaA B D B A E C C

Herencia simple:Una clase puede heredar de una nica clase. Java, C#

Herencia mltiple:Una clase puede heredar de varias clases. C++

Curso 2010/2011

Programacin Orientada a Objetos

13

Reconocer la herenciaEspecializacin:Se detecta que una clase es un caso especial de otra. Ejemplo: Rectngulo es un tipo de Polgono.

Generalizacin (factorizacin):Se detectan dos clases con caractersticas en comn y se crea una clase padre con esas caractersticas. Ejemplo: Libro, Revista Publicacin

No hay receta mgica para crear buenas jerarquas de herencia.Curso 2010/2011 Programacin Orientada a Objetos 14

Caso de estudioContinuacin de la aplicacin de gestin bancaria. Se introduce el concepto Depsito que permite a un cliente obtener intereses por su dinero. Un Depsito, simplificado, se define:Propiedades: titular, capital, plazo en das y tipo de inters. Comportamiento:Permite liquidar el depsito devolviendo el capital depositado ms los intereses. Permite consultar los intereses generados al vencimiento.Curso 2010/2011 Programacin Orientada a Objetos 15

Clase Deposito 1/2public class Deposito { private Persona titular; private double capital; private int plazoDias; private double tipoInteres; public Deposito(Persona titular, double capital, int plazoDias, double tipoInteres) { this.titular = titular; this.capital = capital; this.plazoDias = plazoDias; this.tipoInteres = tipoInteres; }Curso 2010/2011 Programacin Orientada a Objetos 16

Clase Deposito 2/2public class Deposito { public double getCapital() { } public int getPlazoDias() { } public double getTipoInteres() { } public Persona getTitular() { } public double liquidar() { return getCapital() + getIntereses(); } public double getIntereses() { return (plazoDias * tipoInteres * capital)/365; } }Curso 2010/2011 Programacin Orientada a Objetos 17

Caso de EstudioIdentificamos el concepto Depsito Estructurado que se caracteriza por tener una parte del capital a tipo fijo y otra parte a tipo variable. Depsito Estructurado es un Depsito? Comparte todas las caractersticas de Depsito. Aade nuevas caractersticas. La clase DepositoEstructurado hereda de Deposito: Nuevas caractersticas: capital a tipo variable y el tipo de inters variable.Curso 2010/2011 Programacin Orientada a Objetos 18

Clase DepositoEstructuradopublic class DepositoEstructurado extends Deposito { private double tipoInteresVariable; private double capitalVariable; public DepositoEstructurado() {} public double getInteresesVariable() { return (getPlazoDias() * tipoInteresVariable * capitalVariable)/365; } public void setTipoInteresVariable( public double getTipoInteresVariable() { } public double getCapitalVariable() { } }Curso 2010/2011 Programacin Orientada a Objetos 19

Clase DepositoEstructuradoLa subclase incluye las caractersticas especficas:Atributos: tipo de inters variable y capital a tipo variable. Mtodo de consulta (get) del capital variable. Mtodos de consulta/establecimiento (get/set) del tipo de inters variable. Mtodo para el clculo de los intereses del capital a tipo variable.

La clase hija hereda todos los atributos de la clase padre, aunque no los vea debido a la ocultacin de la informacin. La clase dispone de los mtodos heredados como si fueran propios (ejemplo, getPlazoDias()).Curso 2010/2011 Programacin Orientada a Objetos 20

Jerarqua de herencia

Curso 2010/2011

Programacin Orientada a Objetos

21

Herencia y constructoresEn Java los constructores no se heredan. El constructor de un DepositoEstructurado se declara con los mismos parmetros que un Deposito y aade la cantidad de capital a tipo variable. La clase DepositoEstructurado no tiene visibilidad sobre los atributos privados de Deposito. Java permite invocar a los constructores de la clase padre dentro de un constructor utilizando la llamada super()Curso 2010/2011 Programacin Orientada a Objetos 22

Clase DepositoEstructuradopublic class DepositoEstructurado extends Deposito { public DepositoEstructurado(Persona titular, double capitalFijo, double capitalVariable, int plazoDias, double tipoInteresFijo) { super(titular, capitalFijo, plazoDias, tipoInteresFijo); this.capitalVariable = capitalVariable; } }Curso 2010/2011 Programacin Orientada a Objetos 23

Herencia y constructoresCuando se aplica herencia, la llamada a un constructor de la clase padre es obligatoria. Debe ser la primera sentencia del cdigo del constructor. Si se omite la llamada, el compilador asume que la primera llamada es super() Llama al constructor sin argumentos de la clase padre. Si no existe ese constructor, la clase no compila.

Curso 2010/2011

Programacin Orientada a Objetos

24

Adaptacin del cdigo heredadoLa clase DepositoEstructurado aade nuevas propiedades: capital a tipo variable y tipo de inters variable. Sin embargo, hay que adaptar dos mtodos heredados:getCapital(): el capital de un depsito estructurado es el capital a tipo fijo ms el capital a tipo variable. getIntereses(): intereses a tipo fijo ms intereses a tipo variable.

La herencia permite la redefinicin de mtodos para adaptarlos a la semntica de la clase.Curso 2010/2011 Programacin Orientada a Objetos 25

Redefinicin de mtodosLa redefinicin de un mtodo heredado puede ser de dos tipos:Refinamiento: se aade nueva funcionalidad al comportamiento heredado. Reemplazo: se sustituye completamente la implementacin del mtodo heredado.

En el refinamiento de un mtodo resulta til invocar a la versin heredada del mtodo.

Curso 2010/2011

Programacin Orientada a Objetos

26

Redefinicin de mtodos y superEl lenguaje proporciona la palabra reservada super que permite llamar a la versin del padre de un mtodo que se redefine en la clase. En general, el uso de super se recomienda slo para el refinamiento de mtodos. No hay que utilizar super para llamar a mtodos que se heredan. Sin embargo, hay excepcionesgetCapital(): retorna el capital total del depsito. La versin del padre (super.getCapital()) devuelve la parte del capital a tipo fijo. Puede resultar til en la implementacin de la clase.Curso 2010/2011 Programacin Orientada a Objetos 27

Clase DepositoEstructuradopublic class DepositoEstructurado extends Deposito { ... @Override public double getIntereses() { return super.getIntereses() + getInteresesVariable(); } @Override public double getCapital() { return super.getCapital() + getCapitalVariable(); } }

Curso 2010/2011

Programacin Orientada a Objetos

28

Caso de estudioIdentificamos un nuevo tipo de depsito formado por una parte del capital a tipo fijo y otra a tipo variable con un inters mnimo garantizado (Depsito Garantizado). Este depsito posee todas las caractersticas de un Depsito Estructurado y aade una garanta al inters variable (regla es un). La clase DepositoGarantizado hereda de DepositoEstructurado.

Curso 2010/2011

Programacin Orientada a Objetos

29

Clase DepositoGarantizadopublic class DepositoGarantizado extends DepositoEstructurado { private double tipoInteresGarantizado; public DepositoGarantizado(, { super(titular, capitalFijo, capitalVariable, plazoDias, tipoInteresFijo); this.tipoInteresGarantizado = tipoIntersesGarantizado; setTipoInteresVariable(tipoIntersesGarantizado); } }Curso 2010/2011 Programacin Orientada a Objetos 30

Redefinicin de mtodosEsta clase debe controlar que al establecer el tipo de inters variable no quede por debajo del inters garantizado. Para ello, redefine (refina) el mtodo setTipoInteresVariable().@Override public void setTipoInteresVariable( double tipoInteresVariable) { if (tipoInteresVariable >= tipoInteresGarantizado) super.setTipoInteresVariable(tipoInteresVariable); } }Curso 2010/2011 Programacin Orientada a Objetos 31

Caso de estudioUn Depsito Penalizable es un depsito bsico en el que los intereses pueden ser penalizados. El nuevo depsito tiene todas las caractersticas de un depsito bsico (regla es un). Clase DepositoPenalizable hereda de Deposito La penalizacin consiste en reducir el inters del depsito a la mitad. Adapta el clculo de los intereses segn la penalizacin.

Curso 2010/2011

Programacin Orientada a Objetos

32

Clase DepositoPenalizablepublic class DepositoPenalizable extends Deposito { private boolean penalizado; public DepositoPenalizable() { super(titular, capital, plazoDias, tipoInteres); penalizado = false; } @Override public double getIntereses() { if (penalizado) return super.getIntereses() / 2; else return super.getIntereses(); } public boolean isPenalizado() {} public void setPenalizado(boolean penalizado) {} }Curso 2010/2011 Programacin Orientada a Objetos 33

Jerarqua de herencia

Curso 2010/2011

Programacin Orientada a Objetos

34

RedefinicinEn los ejemplos se comprueba que la redefinicin reconcilia la reutilizacin con la extensibilidad:Es habitual hacer cambios cuando se reutiliza un cdigo.

Los atributos no se pueden redefinir, slo se ocultan:Si la clase hija define un atributo con el mismo nombre que un atributo de la clase padre, ste no es accesible. El atributo del padre existe, pero no se puede ver.

Un mtodo es una redefinicin si tiene la misma signatura (nombre y parmetros) que un mtodo de la clase padre:Si se cambia el tipo de los parmetros se est sobrecargando el mtodo heredado.Curso 2010/2011 Programacin Orientada a Objetos 35

Restringir la herenciaEs seguro permitir que los subtipos redefinan cualquier mtodo? La redefinicin incorrecta del algoritmo del mtodo liquidar() podra comprometer la consistencia y seguridad de la aplicacin. En Java se puede aplicar el modificador final a un mtodo para indicar que no puede ser redefinido. Asimismo, el modificador final es aplicable a una clase indicando que no se puede heredar de ella. El modificador final va contra el principio abiertocerrado?Curso 2010/2011 Programacin Orientada a Objetos 36

Restringir la herenciapublic class Deposito { public final double liquidar() { return getCapital() + getIntereses(); } }

El algoritmo del mtodo liquidar es el mismo para todos los depsitos, no se puede redefinir.

Curso 2010/2011

Programacin Orientada a Objetos

37

Visibilidad para la herenciaPuede tener sentido que algunos atributos y mtodos de una clase, sin ser pblicos, puedan ser accesibles a las subclases. Ejemplo: el atributo capital de Deposito. Nivel de visibilidad protegido (protected): visibilidad para las subclases y las clases del mismo paquete. Es discutible el uso de visibilidad protegida para los atributos En contra de la ocultacin de la informacin. Para los mtodos, la visibilidad protegida es til.Curso 2010/2011 Programacin Orientada a Objetos

38

Niveles de visibilidadEn Java, los niveles de visibilidad son incrementales

public protected () paquete private

public

todo el cdigo clase + paquete + subclases clase + paquete clase

protected (nada) private

Curso 2010/2011

Programacin Orientada a Objetos

39

Revisin redefinicin de mtodosAl redefinir un mtodo podemos cambiar su implementacin (refinamiento, reemplazo). Tambin se puede cambiar el nivel de visibilidad de la declaracin para incrementarlo. Es posible cambiar el tipo de retorno a otro ms especfico (subclase) Regla covariante.Ejemplo: en DepositoGarantizado podemos obligar a que los titulares sean de tipo PersonaPreferente, subclase de Persona. En este caso, el mtodo de consulta se redefine como PersonaPreferente getTitular().Curso 2010/2011 Programacin Orientada a Objetos

40

PolimorfismoCapacidad de una entidad (atributo, variable, parmetro) de referenciar en tiempo de ejecucin a objetos de diferentes clases. Es restringido por herencia. Fundamental para escribir cdigo genrico reutilizable. El polimorfismo implica que una entidad tiene un tipo esttico (declarado) y otro dinmico (al que referencia la entidad).Curso 2010/2011 Programacin Orientada a Objetos 41

Tipos esttico y dinmicoTipo esttico (te):Tipo asociado a la declaracin de una entidad.

Tipo dinmico:Tipo correspondiente a la clase del objeto conectado a la entidad en tiempo de ejecucin.

Conjunto de tipos dinmicos (ctd):Conjunto de posibles tipos dinmicos de una entidad.

Ejemplo:

A B D E C F

A oa; B ob; C oc; te(oa) = A te(ob) = B te(oc) = C ctd(oa) = {A,B,C,D,E,F} ctd(ob) = {B, D, E} ctd(oc) = {C,F}42

Curso 2010/2011

Programacin Orientada a Objetos

PolimorfismoAsignacin polimrfica:1. Deposito deposito = new Deposito(); 2. DepositoPenalizable penalizable = new DepositoPenalizable(); // Asignacin polimrfica 3. deposito = penalizable;

La variable deposito tiene como tipo esttico Deposito. El tipo dinmico de la variable cambia:Lnea 1: clase Deposito. Lnea 3: clase DepositoPenalizable.

Curso 2010/2011

Programacin Orientada a Objetos

43

Herencia y sistema de tiposSeran posibles las siguientes asignaciones?Objeto DepositoEstructurado a variable Deposito. Objeto DepositoEstructurado a variable DepositoPenalizable. Objeto DepositoGarantizado a variable Deposito.

Comprobacin esttica de tipos:Reglas de consistencia comprobadas por el compilador que garantizan que durante la ejecucin no habr violacin de tipos.

Beneficios: fiabilidad, legibilidad y eficiencia. Inconveniente: se aplica una poltica pesimista que a veces rechaza cdigo que tiene sentido.Curso 2010/2011 Programacin Orientada a Objetos 44

Compatibilidad de tiposUna clase (tipo) B es compatible con otra clase A si B es descendiente de A:DepositoEstructurado es compatible con Deposito. DepositoGarantizado es compatible con Deposito y DepositoEstructrado. DepositoEstructurado NO es compatible con DepositoPenalizable.

Curso 2010/2011

Programacin Orientada a Objetos

45

Compatibilidad de tiposUna asignacin polimrfica es vlida si el tipo esttico de la parte derecha es compatible con el tipo esttico de la parte izquierda:Deposito deposito = new DepositoEstructurado(); DepositoPenalizable penalizable = new DepositoPenalizable(); // Asignacin polimrfica vlida deposito = penalizable; // Asignacin polimrfica no vlida DepositoGarantizado garantizado = penalizable;Curso 2010/2011 Programacin Orientada a Objetos

46

Compatibilidad de tiposMtodo polimrfico: un paso de parmetros es vlido si el tipo esttico del parmetro real es compatible con el tipo esttico del parmetro formal.public double indiceRentabilidad(Deposito deposito) { return deposito.getIntereses()/deposito.getCapital(); }

DepositoPenalizable penalizable = new DepositoPenalizable( ); banco.indiceRentabilidad(penalizable);Curso 2010/2011 Programacin Orientada a Objetos 47

Validez de mensajesLa herencia es consistente con el sistema de tipos. Sobre una variable cuyo tipo esttico es DepositoEstructurado podemos aplicar:Mtodos heredados y redefinidos: getIntereses(), getPlazoDias(), etc. Mtodos propios: getCapitalVariable(), etc.

Si el tipo esttico es Deposito no podemos aplicar mtodos de los subtipos:deposito.getTipoInteresVariable(); //Error deposito.isPenalizado(); // Error

Curso 2010/2011

Programacin Orientada a Objetos

48

Validez de mensajesDeposito deposito = new Deposito(); DepositoEstructurado estructurado = new DepositoEstructurado(); estructurado.liquidar(); //OK HEREDADO DE DEPOSITO estructurado.getCapital(); //OK METODO REDEFINIDO estructurado.getCapitalVariable(); //OK MTODO PROPIO deposito = estructurado; deposito.getIntereses(); deposito.getCapitalVariable(); //OK METODO DE DEPOSITO //ERROR COMPILACION!

Curso 2010/2011

Programacin Orientada a Objetos

49

Poltica pesimista de tiposEl compilador rechazara los siguientes casos:Deposito deposito; DepositoPenalizable penalizable = new ; deposito = penalizable; penalizable = deposito; // Error de compilacin

Deposito deposito; DepositoPenalizable penalizable = new ; deposito = penalizable; deposito.isPenalizado(); // Error de compilacinCurso 2010/2011 Programacin Orientada a Objetos

50

Ligadura dinmicaQu versin del mtodo getCapital() se ejecutara?

Deposito deposito; if (clientePreferente) deposito = new DepositoGarantizado(...); else deposito = new DepositoPenalizable(...); deposito.getCapital();

Curso 2010/2011

Programacin Orientada a Objetos

51

Ligadura dinmicaLa versin de un mtodo en una clase es la introducida por la clase (redefinida) o la heredada. Versiones del mtodo getCapital():Versin Deposito: el mtodo es definido en Depsito La clase DepositoPenalizable lo hereda. Versin DepositoEstructurado: la clase

DepositoEstructurado redefine el mtodo.La clase DepositoGarantizado hereda la versin de DepositoEstructurado.

Se ejecuta la versin asociada al tipo dinmico del objeto.Curso 2010/2011 Programacin Orientada a Objetos 52

Ligadura dinmicapublic double posicionGlobal(Deposito[] depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; }

Qu sucedera si apareciera un nuevo tipo de depsito?

Curso 2010/2011

Programacin Orientada a Objetos

53

Ligadura dinmicaEl mtodo getCapital() aplicado sobre una referencia de tipo esttico Deposito puede adoptar dos versiones.

La misma llamada a un mtodo puede tener distintas interpretaciones. Para que funcione la ligadura dinmica es necesario que la variable sobre la que se aplica el mtodo sea polimrfica (en Java siempre es as).

Curso 2010/2011

Programacin Orientada a Objetos

54

Ligadura dinmicaA redefine f {f} B C redefine f D {f} {f} Qu versin se ejecuta? A oa; B ob = new B(); D od = new D(); oa = ob; oa.f(); oa = od; oa.f();

Sea el mensaje x.f (), la comprobacin esttica de tipos garantiza que al menos existir una versin aplicable para f, y la ligadura dinmica garantiza que se ejecutar la versin ms apropiada.Curso 2010/2011 Programacin Orientada a Objetos 55

Mtodo polimrficoMtodo que puede recibir distintos tipos de argumentos manteniendo el mismo comportamiento. La ejecucin correcta se determina en tiempo de ejecucin aplicando ligadura dinmica.public double indiceRentabilidad(Deposito deposito) { return deposito.getIntereses()/deposito.getCapital(); }

Curso 2010/2011

Programacin Orientada a Objetos

56

Cdigo genrico reutilizableUn nico cdigo con diferentes interpretaciones en tiempo de ejecucin. Ejercicio:Qu mtodos y versiones se ejecutan cuando se aplica el mtodo liquidar() a un depsito penalizable? Y para un depsito estructurado?Deposito deposito = new DepositoPenalizable(...); deposito.liquidar();

Curso 2010/2011

Programacin Orientada a Objetos

57

Cdigo genrico reutilizableEl mtodo liquidar() es un ejemplo de cdigo genrico reutilizable:El mismo cdigo es reutilizado por los subtipos. En tiempo de ejecucin, el cdigo ejecutado vara segn el tipo de depsito al que sea aplicado. El polimorfismo, la redefinicin de mtodos y la ligadura dinmica permiten reutilizar el cdigo y al mismo tiempo adaptarlo a las caractersticas de cada depsito.

Curso 2010/2011

Programacin Orientada a Objetos

58

Clase ObjectEl lenguaje Java define la clase Object como raz de la jerarqua de todas las clases del lenguaje. Todas las clases heredan directa o indirectamente de la clase Object:Si una clase no hereda de ninguna otra, el compilador aade extends Object a su declaracin.

Una variable de tipo Object puede apuntar a cualquier tipo del lenguaje:Objetos creados a partir de clases. Tipos primitivos gracias al autoboxing.

Curso 2010/2011

Programacin Orientada a Objetos

59

Clase Object y AutoboxingEl autoboxing es un mecanismo automtico encargado de convertir objetos en tipos primitivos y viceversa. De este modo, una referencia de tipo Object puede apuntar a cualquier tipo de datos. Conversin de tipos primitivos a objetos:Java construye objetos envoltorio donde almacenar los valores primitivos. Para cada tipo primitivo hay una clase envoltorio: Integer para int, Double para double, etc.

La conversin de un objeto en un tipo primitivo requiere hacer el casting al tipo envoltorio.Object obj = 3; int entero = (Integer)obj;Curso 2010/2011 Programacin Orientada a Objetos 60

Mtodos clase ObjectEn Java, la clase Object incluye las caractersticas comunes a todos los objetos:public boolean equals(Object obj) Igualdad de objetos protected Object clone() Clonacin de objetos public String toString() Representacin textual de un objeto public final Class getClass() Clase a partir de la que ha sido instanciado un objeto. public int hashCode() Cdigo hash utilizado en las colecciones.

Curso 2010/2011

Programacin Orientada a Objetos

61

Copia de objetosLa asignacin de referencias (=) copia el oid del objeto y no la estructura de datos. Para obtener una copia de un objeto hay que aplicar el mtodo clone. El mtodo clone est implementado en la clase Object (es heredado) pero no es aplicable por otras clases (visibilidad protected). La clase debe redefinir el mtodo clone para aumentar la visibilidad y crear una copia que se adapte a sus necesidades. La versin de la clase Object (super.clone()) construye una copia superficial de la instancia actual.

Curso 2010/2011

Programacin Orientada a Objetos

62

Tipos de copiaTipos de copia:Copia superficial: los campos de la copia son exactamente iguales a los del objeto receptor. Copia profunda: los campos primitivos de la copia son iguales y las referencias a objetos son copias profundas. Adaptada: adaptada a la necesidad de la aplicacin.

Curso 2010/2011

Programacin Orientada a Objetos

63

Copia superficial de CuentaCopia superficial:Aliasing incorrecto al compartir las ltimas operaciones. No deberan tener el mismo cdigosaldo ultOper -5000 10000 J. Gomez nombre 87654321 dniObjeto Persona cuenta copia

titular codigo 123456 100000

123456 100000

titular codigo saldo ultOper

Curso 2010/2011

Programacin Orientada a Objetos

64

Copia profunda de CuentaCopia profunda:No tiene sentido duplicar el objeto persona y que tengan el mismo cdigo.cuenta copia

titular codigo 123456 saldo ultOper -5000 10000 100000

123456 100000

titular codigo saldo ultOper

-5000 10000 J. Gomez J. Gomez 87654321 87654321

Curso 2010/2011

Programacin Orientada a Objetos

65

Copia correcta de CuentaCopia adaptada: cumple los requisitos de la aplicacincuenta copia

titular codigo 123456 saldo ultOper -5000 10000 J. Gomez 87654321Curso 2010/2011

326457 100000

titular codigo saldo ultOper

100000

-5000 10000

Programacin Orientada a Objetos

66

Mtodo clone en Cuentapublic class Cuenta implements Cloneable{ public Cuenta clone(){ Cuenta copia = null; try{ copia = (Cuenta)super.clone(); copia.codigo = ++ultimoCodigo; copia.ultimasOperaciones = (double[])ultimasOperaciones.clone(); }catch (CloneNotSupportedException e){ // No sucede si la clase es Cloneable } return copia; } }Curso 2010/2011 Programacin Orientada a Objetos 67

Igualdad de objetosEl operador == se utiliza para consultar la identidad de referencias dos referencias son idnticas si contienen el mismo oid.

b a cuno 23 uno 23

ddos 23

Identidad entre referencias:a == c; // True a == b; // False

El mtodo equals permite implementar la igualdad de objetos.Curso 2010/2011 Programacin Orientada a Objetos 68

Mtodo equalsLa implementacin en la clase Object consiste en comprobar la identidad del objeto receptor y el parmetro.public boolean equals(Object obj) { return this == obj; }

Por tanto: a.equals(b); // False Es necesario redefinir el mtodo equals en las clases donde necesitemos la operacin de igualdad. Sin embargo, hay que elegir la semntica de igualdad ms adecuada para la clase.Curso 2010/2011 Programacin Orientada a Objetos 69

Tipos de igualdadTipos de igualdad:Superficial: los campos primitivos de los dos objetos son iguales y las referencias a objetos idnticas (comparten los mismos objetos). Profunda: los campos primitivos son iguales y las referencias son iguales (equals) en profundidad. Adaptada: adaptada a las necesidades de la aplicacin.

Cundo dos cuentas son iguales?

Curso 2010/2011

Programacin Orientada a Objetos

70

Mtodo equals en Cuenta@Override public boolean equals(Object obj) { if (obj == null) return false; if (obj == this) return true; if (obj.getClass() != this.getClass()) return false; Cuenta otraCta = (Cuenta)obj; return (this.codigo == otraCta.codigo); }

Curso 2010/2011

Programacin Orientada a Objetos

71

Mtodo toString en CuentaPatrn de redefinicin del mtodo toString

@Override public String toString() { return getClass().getName() + "[codigo = " + codigo + ", titular = "+ titular + ", saldo = "+saldo+ ",ultimasOperaciones = " + ultimasOperaciones + "]"; }

Curso 2010/2011

Programacin Orientada a Objetos

72

Mtodos clase Object en jerarquaEn la redefinicin de los mtodos de la clase Object hay que tener en cuenta si la clase es la raz de una jerarqua o un subtipo.

En el seminario 2 se desarrolla un ejemplo de jerarqua de herencia en el que se implementan los mtodos de la clase Object.

Curso 2010/2011

Programacin Orientada a Objetos

73

Raz de una jerarquaResulta muy til disponer de una clase (tipo) que represente la raz de una jerarqua de clases. Permite utilizar estructuras de datos polimrficas:Deposito[] depositos = new Deposito[3]; depositos[0] = new DepositoPenalizable (); depositos[1] = new DepositoEstructurado (); depositos[2] = new DepositoGarantizado ();

La clase raz tambin permite incluir las caractersticas comunes a toda la jerarqua.Curso 2010/2011 Programacin Orientada a Objetos 74

Caso de estudioMotivacin: Cmo podemos establecer el tipo de inters variable sobre todos los depsitos estructurados? En la aplicacin almacenamos todos los depsitos en un array:Deposito[] depositos;

Una posicin del array puede apuntar a cualquier tipo de depsito (estructura de datos polimrfica). Sobre una referencia de tipo esttico Deposito slo puedo aplicar mtodos de esa clase. Solucin: casting (narrowing).

Curso 2010/2011

Programacin Orientada a Objetos

75

CastingEl compilador permite hacer un casting de una variable polimrfica a uno de los posibles tipos dinmicos de la variable. Sera posible hacer un casting al tipo DepositoEstructurado que tiene el mtodo para establecer el tipo de inters variable:public void setTipoInteresVariable(double tipo, Deposito[] depositos) { for (Deposito d : depositos) { DepositoEstructurado de = (DepositoEstructurado) d; de.setTipoInteresVariable(tipo); } }Curso 2010/2011 Programacin Orientada a Objetos 76

Operador instanceofProblema:Todos los depsitos no son estructurados. El casting se resuelve en tiempo de ejecucin y si es incorrecto aborta el programa.

Solucin: operador instanceofPermite consultar en tiempo de ejecucin si el tipo dinmico de una variable es compatible con un tipo. Se entiende por tipo compatible el tipo de la consulta o cualquiera de los subtipos.

No es lo mismo preguntar por compatibilidad de tipos que por la clase del objeto: getClass().Curso 2010/2011 Programacin Orientada a Objetos 77

Operador instanceofpublic void setTipoInteresVariable(double tipo, Deposito[] depositos) { for (Deposito d : depositos) { if (d instanceof DepositoEstructurado) { DepositoEstructurado de = (DepositoEstructurado) d; de.setTipoInteresVariable(tipo); } } }

Curso 2010/2011

Programacin Orientada a Objetos

78

Operador instanceof vs getClass()Al utilizar getClass()se pregunta por el tipo exacto del depsito. Sera incorrecto, ya que los Depsitos Garantizados (subtipo) quedaran fuera.

public void setTipoInteresVariable(double tipo, Deposito[] depositos) { for (Deposito d : depositos) { if (d.getClass() == DepositoEstructurado.class) { }

Curso 2010/2011

Programacin Orientada a Objetos

79

Clases abstractasMotivacin:En la aplicacin bancaria observamos que tanto las cuentas como los depsitos tienen dos caractersticas en comn: tienen un titular y pagan impuestos.

Identificamos el concepto Producto Financiero y definimos una clase que sea padre de Deposito y Cuenta (Generalizacin). Se realiza la refactorizacin del cdigo de las clases Deposito y Cuenta para subir la funcionalidad relativa al titular a la nueva clase. Adems se introduce el mtodo getImpuestos() que calcula los impuestos como el 18% del beneficio del producto.Curso 2010/2011 Programacin Orientada a Objetos 80

Jerarqua de herencia

Curso 2010/2011

Programacin Orientada a Objetos

81

Clase ProductoFinancieropublic class ProductoFinanciero { private Persona titular; public ProductoFinanciero(Persona titular) { this.titular = titular; } public Persona getTitular() { return titular; } public double getImpuestos() { return getBeneficio() * 0.18; } }Curso 2010/2011 Programacin Orientada a Objetos 82

Clases abstractasCmo se calcula el beneficio de un producto financiero? Tiene sentido incluir una implementacin por defecto que retorne cero? El mtodo getBeneficio() no puede ser implementado en la clase ProductoFinanciero. El mtodo getBeneficio() es abstracto. Es responsabilidad de las subclases implementarlo adecuadamente. La clase ProductoFinanciero es abstracta, ya que tiene un mtodo abstracto.Curso 2010/2011 Programacin Orientada a Objetos 83

Clase ProductoFinancieropublic abstract class ProductoFinanciero { private Persona titular; public ProductoFinanciero(Persona titular) { this.titular = titular; } public Persona getTitular() { return titular; } public double getImpuestos() { return getBeneficio() * 0.18; } public abstract double getBeneficio(); }

Curso 2010/2011

Programacin Orientada a Objetos

84

Jerarqua de herencia

Curso 2010/2011

Programacin Orientada a Objetos

85

Clases abstractasUna clase abstracta define un tipo, como cualquier otra clase. Sin embargo, no se pueden construir objetos de una clase abstracta. Los constructores slo tienen sentido para ser utilizados en las subclases. Justificacin de una clase abstracta:declara o hereda mtodos abstractos y/o representa un concepto abstracto para el que no tiene sentido crear objetos: un objeto producto financiero o figura geomtrica?Curso 2010/2011 Programacin Orientada a Objetos 86

Clases parcialmente abstractasClases que tienen mtodos abstractos y efectivos (implementados) Ejemplo: Producto Financiero. Mtodo plantilla: mtodo efectivo que hace uso de mtodos abstractos. Ejemplo: getImpuestos(). Importante mecanismo para definir cdigo genrico reutilizable. Definen comportamiento abstracto comn a todos los descendientes.Curso 2010/2011 Programacin Orientada a Objetos 87

Limitaciones de la herenciaLa compatibilidad de tipos que proporciona la herencia resulta til: mtodos genricos, variables y estructuras polimrficas, etc. Los tipos que representa una clase son:El tipo que define la clase. El tipo de cada uno de sus ascendientes.

La herencia simple limita el nmero de tipos que pueden representar los objetos de una clase.Curso 2010/2011 Programacin Orientada a Objetos

88

Limitaciones de la herenciaClase totalmente abstracta: slo declara mtodos abstractos. Por definicin, una clase define:Mdulo: cdigo que implementa un TAD. Tipo: define un nuevo tipo de datos.

Una clase totalmente abstracta no tiene cdigo: se pierde la naturaleza de mdulo. Slo define un tipo de datos

Curso 2010/2011

Programacin Orientada a Objetos

89

Limitaciones de la herenciaUna clase que hereda de otra totalmente abstracta:No reutiliza cdigo, slo la exigencia de implementar mtodos (implementar un tipo)

La herencia simple est motivada por los problemas en la reutilizacin de cdigo: atributos repetidos, colisin de mtodos, etc. Podramos heredar de ms de una clase totalmente abstracta? Solucin: interfacesCurso 2010/2011 Programacin Orientada a Objetos 90

InterfacesConstruccin proporcionada por Java para la definicin de tipos (sin implementacin). Equivale a una clase totalmente abstracta y aporta ventajas. Se dice que una clase implementa una interfaz. El nmero de interfaces que puede implementar una clase no est limitado (implementacin mltiple de interfaces). Los tipos que representan los objetos de una clase pueden ser ampliados con la implementacin de interfaces.Curso 2010/2011 Programacin Orientada a Objetos

91

Interfaz AmortizableEjemplo: un deposito es amortizable si permite rescatar parte del capital antes del vencimiento. Se define este tipo de depsitos como una interfaz.

public interface Amortizable { boolean amortizar(double cantidad); }

Curso 2010/2011

Programacin Orientada a Objetos

92

Interfaz AmortizablePor defecto, en una interfaz la visibilidad de las declaraciones es pblica. Las interfaces pueden incorporar declaraciones (simplificadas) de constantes:public interface Amortizable { double LIMITE = 10000.0; boolean amortizar(double cantidad); }

Curso 2010/2011

Programacin Orientada a Objetos

93

Implementacin de una interfazEjemplo: slo los depsitos garantizados y los penalizables pueden ser amortizables. Las dos clases implementan la interfaz:public class DepositoPenalizable extends Deposito implements Amortizable { @Override public boolean amortizar(double cantidad) { if (cantidad > capital) return false; capital = capital - cantidad; return true; } }Curso 2010/2011 Programacin Orientada a Objetos 94

Interfaces

Curso 2010/2011

Programacin Orientada a Objetos

95

Extensin de interfacesUna interfaz puede extender otras interfaces:public interface Flexible extends Amortizable, Incrementable { void actualizarTipoInteres(double tipo); }

Curso 2010/2011

Programacin Orientada a Objetos

96

Interfaces ResumenLas interfaces definen tipos que deben ser implementados por clases.Amortizable deposito = new DepositoPenalizable();

Si una clase no implementa algn mtodo de una interfaz debe declararse abstracta. Una interfaz define un tipo, pero no se pueden construir objetos de una interfaz:Amortizable deposito = new Amortizable(); // Error

Las interfaces resuelven la limitacin de tipos impuesta por la herencia simple.

Curso 2010/2011

Programacin Orientada a Objetos

97

Consejos uso de la herenciaLos atributos y mtodos comunes deben situarse en clases altas de la jerarqua (generalizacin). No abusar de atributos protegidos. Compromete el principio de ocultacin de la informacin. Aplica herencia si entre dos clases existe la relacin es-un. No debe utilizarse herencia salvo que todos los mtodos heredados tengan sentido. En la redefinicin de un mtodo no hay que cambiar la semntica que tiene definida. Aplica polimorfismo y ligadura dinmica para evitar anlisis de casos (principio de eleccin nica).Curso 2010/2011 Programacin Orientada a Objetos 98

Seminarios 2 y 3Este tema se completa con los seminarios 2 y 3. El seminario 2 trata:Conceptos bsicos de la herencia. Polimorfismo. Herencia y sistema de tipos. Ligadura dinmica. Mtodos de la clase Object: igualdad, copia, etc. Pruebas y herencia

El seminario 3 trata:Clases abstractas. Interfaces.Curso 2010/2011 Programacin Orientada a Objetos

99