124
Programación Orientada a Objetos Tema 3: Propiedades Básicas de la Orientación a Objetos Programación Orientada a Objetos Tema 3: Propiedades Básicas de la Orientación a Objetos LIDIA Laboratorio de Investigación y desarrollo en Inteligencia Artificial LIDIA Laboratorio de Investigación y desarrollo en Inteligencia Artificial Departamento de Computación Universidade da Coruña, España Departamento de Computación Universidade da Coruña, España Eduardo Mosqueira Rey Eduardo Mosqueira Rey

Programación Orientada a Objetos Tema 3: Propiedades ...quegrande.org/apuntes/EI/OPT/POO/teoria/08-09/tema... · Programación Orientada a Objetos Tema 3: Propiedades Básicas de

Embed Size (px)

Citation preview

  • Programacin Orientada a Objetos

    Tema 3: Propiedades Bsicas de la Orientacin a Objetos

    Programacin Orientada a Objetos

    Tema 3: Propiedades Bsicas de la Orientacin a Objetos

    LIDIALaboratorio de Investigacin y desarrollo en Inteligencia Artificial

    LIDIALaboratorio de Investigacin y desarrollo en Inteligencia Artificial

    Departamento de ComputacinUniversidade da Corua, EspaaDepartamento de ComputacinUniversidade da Corua, Espaa

    Eduardo Mosqueira ReyEduardo Mosqueira Rey

  • ObjetivosObjetivos

    Conocer y analizar las principales propiedades de la orientacin a objetos

    Estas propiedades incluirn aquellas que son compartidas por los tipos abstractos de datos (como abstraccin, encapsulacin,

    Conocer y analizar las principales propiedades de la orientacin a objetos

    Estas propiedades incluirn aquellas que son compartidas por los tipos abstractos de datos (como abstraccin, encapsulacin,

    2 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    compartidas por los tipos abstractos de datos (como abstraccin, encapsulacin, modularidad), como aquellas propias de la orientacin a objetos (herencia, polimorfismo, ligadura dinmica, etc.).

    Estudiar cmo un lenguaje como Java implementa, en mayor o menor medida, dichas propiedades bsicas.

    compartidas por los tipos abstractos de datos (como abstraccin, encapsulacin, modularidad), como aquellas propias de la orientacin a objetos (herencia, polimorfismo, ligadura dinmica, etc.).

    Estudiar cmo un lenguaje como Java implementa, en mayor o menor medida, dichas propiedades bsicas.

  • ndicendice

    1. Abstraccin2. Encapsulamiento3. Modularidad

    1. Abstraccin2. Encapsulamiento3. Modularidad

    3 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    4. Jerarqua5. Polimorfismo6. Tipificacin7. Ligadura dinmica

    4. Jerarqua5. Polimorfismo6. Tipificacin7. Ligadura dinmica

  • ndicendice

    1. Abstraccin Definicin y caractersticas

    1. Abstraccin Definicin y caractersticas

    4 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

  • AbstraccinDefinicin y caractersticas

    AbstraccinDefinicin y caractersticas

    Definicin Representacin de las caractersticas fundamentales de algo

    sin incluir antecedentes o detalles irrelevantes

    Caractersticas Es uno de los mtodos fundamentales para enfrentarse a la

    complejidad inherente al software (ya visto en los TADs).

    Definicin Representacin de las caractersticas fundamentales de algo

    sin incluir antecedentes o detalles irrelevantes

    Caractersticas Es uno de los mtodos fundamentales para enfrentarse a la

    complejidad inherente al software (ya visto en los TADs).

    5 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    complejidad inherente al software (ya visto en los TADs). La OO fomenta que el uso de abstracciones en los datos y

    procedimientos para simplificar la descripcin del problema El elemento clave de la abstraccin es la clase

    Clase Descripcin abstracta de un grupo de objetos, cada uno de los cuales se diferencia por su estado especfico y por la posibilidad de realizar una serie de operaciones.

    Ejemplo, Esfera Estado: coordenadas del centro y radio Operaciones: mover el centro, cambiar el radio.

    complejidad inherente al software (ya visto en los TADs). La OO fomenta que el uso de abstracciones en los datos y

    procedimientos para simplificar la descripcin del problema El elemento clave de la abstraccin es la clase

    Clase Descripcin abstracta de un grupo de objetos, cada uno de los cuales se diferencia por su estado especfico y por la posibilidad de realizar una serie de operaciones.

    Ejemplo, Esfera Estado: coordenadas del centro y radio Operaciones: mover el centro, cambiar el radio.

  • ndicendice

    2. Encapsulamiento Definicin y caractersticas Ventajas

    2. Encapsulamiento Definicin y caractersticas Ventajas

    6 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

  • EncapsulamientoDefinicin y caractersticas

    EncapsulamientoDefinicin y caractersticas

    Definicin Proceso de almacenar en un mismo compartimiento los elementos de

    una abstraccin que constituyen su estructura y su comportamiento

    Caractersticas Abstraccin y el encapsulamiento son conceptos complementarios:

    La abstraccin se centra en el comportamiento observable de un objeto

    Definicin Proceso de almacenar en un mismo compartimiento los elementos de

    una abstraccin que constituyen su estructura y su comportamiento

    Caractersticas Abstraccin y el encapsulamiento son conceptos complementarios:

    La abstraccin se centra en el comportamiento observable de un objeto

    7 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    La abstraccin se centra en el comportamiento observable de un objeto El encapsulamiento se centra en la implementacin que da lugar a ese

    comportamiento.

    El encapsulamiento tambin implica ocultacin de informacin Cada objeto revela lo menos posible de su estructura interna parte pblica interfaz, parte privada implementacin.

    Ejemplos Una operacin es vista por sus usuarios como si fuera una simple entidad,

    aunque est formada por una secuencia de operaciones a bajo nivel. Un objeto es visto como un simple objeto en vez de como una composicin

    de sus partes individuales.

    La abstraccin se centra en el comportamiento observable de un objeto El encapsulamiento se centra en la implementacin que da lugar a ese

    comportamiento.

    El encapsulamiento tambin implica ocultacin de informacin Cada objeto revela lo menos posible de su estructura interna parte pblica interfaz, parte privada implementacin.

    Ejemplos Una operacin es vista por sus usuarios como si fuera una simple entidad,

    aunque est formada por una secuencia de operaciones a bajo nivel. Un objeto es visto como un simple objeto en vez de como una composicin

    de sus partes individuales.

  • EncapsulamientoVentajas

    EncapsulamientoVentajas

    Ventajas La supresin de los detalles de bajo nivel nos

    permite razonar acerca de la operacin u objeto de forma ms eficiente.

    Un cambio en la representacin de una abstraccin puede no obligar a un cambio en los clientes que la

    Ventajas La supresin de los detalles de bajo nivel nos

    permite razonar acerca de la operacin u objeto de forma ms eficiente.

    Un cambio en la representacin de una abstraccin puede no obligar a un cambio en los clientes que la

    8 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    puede no obligar a un cambio en los clientes que la utilicen

    Cambios en el diseo que no afecten al interfaz no se propagan

    Podemos cambiar una funcin por otra ms eficiente sin afectar a los usuarios de dicha funcin

    Muy importante ya que facilita el mantenimiento del software Java

    La encapsulacin se consigue a travs del concepto de clase combinado con los especificadores de acceso que limitan la visibilidad de los atributos y mtodos.

    puede no obligar a un cambio en los clientes que la utilicen

    Cambios en el diseo que no afecten al interfaz no se propagan

    Podemos cambiar una funcin por otra ms eficiente sin afectar a los usuarios de dicha funcin

    Muy importante ya que facilita el mantenimiento del software Java

    La encapsulacin se consigue a travs del concepto de clase combinado con los especificadores de acceso que limitan la visibilidad de los atributos y mtodos.

  • ndicendice

    3. Modularidad Definicin y caractersticas Modularidad en Java

    3. Modularidad Definicin y caractersticas Modularidad en Java

    9 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

  • ModularidadDefinicin y caractersticas

    ModularidadDefinicin y caractersticas

    Definicin Propiedad que tiene un sistema que ha sido descompuesto en

    un conjunto de partes o mdulos que sean cohesivos y dbilmente acoplados

    Cohesivos agrupan abstracciones que guardan relacin lgica Dbilmente acoplados minimizan las dependencias entre mdulos

    Definicin Propiedad que tiene un sistema que ha sido descompuesto en

    un conjunto de partes o mdulos que sean cohesivos y dbilmente acoplados

    Cohesivos agrupan abstracciones que guardan relacin lgica Dbilmente acoplados minimizan las dependencias entre mdulos

    10 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Ventajas El hecho de fragmentar un programa en componentes

    individuales suele contribuir a reducir su complejidad Permite crear una serie de fronteras bien definidas y dentro del

    programa aumenta la comprensin del mismo.

    Sinergia entre abstraccin, encapsulamiento y modularidad Un objeto proporciona una frontera bien definida alrededor de

    una sola abstraccin, el encapsulamiento y la modularidad proporcionan barreras que rodean a esa abstraccin.

    Ventajas El hecho de fragmentar un programa en componentes

    individuales suele contribuir a reducir su complejidad Permite crear una serie de fronteras bien definidas y dentro del

    programa aumenta la comprensin del mismo.

    Sinergia entre abstraccin, encapsulamiento y modularidad Un objeto proporciona una frontera bien definida alrededor de

    una sola abstraccin, el encapsulamiento y la modularidad proporcionan barreras que rodean a esa abstraccin.

  • ModularidadDefinicin y caractersticas

    ModularidadDefinicin y caractersticas

    Abstraccin, Encapsulamiento y Modularidad Abstraccin, Encapsulamiento y Modularidad

    MduloParte pblica

    Objeto 2Objeto 1

    mensaje

    11

    Parte privada

    Objeto 2

    Estado

    Interfaz

    Estado

    Interfaz

    Objeto 3

    Estado

    Interfaz

    Objeto 5

    Estado

    Interfaz

    Objeto 4

    Estado

    Interfaz

  • ModularidadModularidad en Java

    ModularidadModularidad en Java

    Clases Encapsulan los atributos y mtodos de un tipo de

    objetos en un solo compartimiento Ocultan, mediante los especificadores de acceso, los

    elementos internos que no se pretende publicar al

    Clases Encapsulan los atributos y mtodos de un tipo de

    objetos en un solo compartimiento Ocultan, mediante los especificadores de acceso, los

    elementos internos que no se pretende publicar al

    12 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    elementos internos que no se pretende publicar al exterior.

    Esta proteccin es altamente configurable al existir varios niveles de acceso:

    public protected por defecto (package) private

    elementos internos que no se pretende publicar al exterior.

    Esta proteccin es altamente configurable al existir varios niveles de acceso:

    public protected por defecto (package) private

  • ModularidadModularidad en Java

    ModularidadModularidad en Java

    Ficheros Unidades fsicas de compilacin Dentro de un fichero .java pueden residir varias

    clases con las siguientes restricciones Slo puede haber una clase pblica por fichero El nombre del fichero debe ser el mismo que el de la clase

    Ficheros Unidades fsicas de compilacin Dentro de un fichero .java pueden residir varias

    clases con las siguientes restricciones Slo puede haber una clase pblica por fichero El nombre del fichero debe ser el mismo que el de la clase

    13 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    El nombre del fichero debe ser el mismo que el de la clase pblica

    Si no existe ninguna clase pblica tampoco existe ninguna restriccin con respecto al nombre del fichero

    Compilacin La compilacin de un fichero .java genera tantos ficheros

    .class (bytecodes) como clases existen en dicho fichero Para facilitar la compilacin Java recompila los ficheros

    .java si tienen el mismo nombre que un fichero .class pero con una fecha posterior.

    El nombre del fichero debe ser el mismo que el de la clase pblica

    Si no existe ninguna clase pblica tampoco existe ninguna restriccin con respecto al nombre del fichero

    Compilacin La compilacin de un fichero .java genera tantos ficheros

    .class (bytecodes) como clases existen en dicho fichero Para facilitar la compilacin Java recompila los ficheros

    .java si tienen el mismo nombre que un fichero .class pero con una fecha posterior.

  • ModularidadModularidad en Java

    ModularidadModularidad en Java

    Paquetes Unidades lgicas de agrupacin de clases Las clases pueden ser

    Pblicas: forman parte del interfaz de su paquete No pblicas: slo son visibles a clases de su mismo paquete

    Definicin Se utiliza la directiva package al principio de cada fichero.

    Paquetes Unidades lgicas de agrupacin de clases Las clases pueden ser

    Pblicas: forman parte del interfaz de su paquete No pblicas: slo son visibles a clases de su mismo paquete

    Definicin Se utiliza la directiva package al principio de cada fichero.

    14 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Se utiliza la directiva package al principio de cada fichero. En caso de que no se especifique paquete se considera que todas las

    clases que se encuentran en el paquete por defecto

    Jerarquas de paquetes El nombre del paquete puede tener varios niveles, lo que facilita su

    organizacin (java.util, java.util.jar, java.awt, java.awt.color, etc.). De todas formas no existe el concepto de subpaquete ni relaciones

    jerrquicas entre paquetes (la relacin entre java.util y java.util.jar es la misma que entre java.util y javax.swing son dos paquetes distintos).

    Simplemente se permite una organizacin jerrquica de los nombres de los paquetes por motivos de organizacin y claridad

    Se utiliza la directiva package al principio de cada fichero. En caso de que no se especifique paquete se considera que todas las

    clases que se encuentran en el paquete por defecto

    Jerarquas de paquetes El nombre del paquete puede tener varios niveles, lo que facilita su

    organizacin (java.util, java.util.jar, java.awt, java.awt.color, etc.). De todas formas no existe el concepto de subpaquete ni relaciones

    jerrquicas entre paquetes (la relacin entre java.util y java.util.jar es la misma que entre java.util y javax.swing son dos paquetes distintos).

    Simplemente se permite una organizacin jerrquica de los nombres de los paquetes por motivos de organizacin y claridad

  • ModularidadModularidad en Java

    ModularidadModularidad en Java

    Objetivos de los paquetes: Disear un dispositivo de modularidad de nivel superior a las

    clases. Cada paquete puede tener sus propias clases privadas

    desconocidas para aquella persona que quiera utilizar el paquete. Agrupar clases con funcionalidades similares.

    Objetivos de los paquetes: Disear un dispositivo de modularidad de nivel superior a las

    clases. Cada paquete puede tener sus propias clases privadas

    desconocidas para aquella persona que quiera utilizar el paquete. Agrupar clases con funcionalidades similares.

    15 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Agrupar clases con funcionalidades similares. De forma que sean ms fciles de localizar y pueda verse

    claramente que las clases estn relacionadas. Organizar fsicamente los ficheros fuente.

    Para poder utilizar las clases compiladas, los ficheros .class deben estar disponibles en el directorio indicado por la variable de entorno CLASSPATH.

    Para organizar el directorio del CLASSPATH Java equipara los nombres de paquetes con los directorios en disco (Java buscar las clases del paquete com.miempresa.utils en el directorio CLASSPATH/com/miempresa/utils).

    Agrupar clases con funcionalidades similares. De forma que sean ms fciles de localizar y pueda verse

    claramente que las clases estn relacionadas. Organizar fsicamente los ficheros fuente.

    Para poder utilizar las clases compiladas, los ficheros .class deben estar disponibles en el directorio indicado por la variable de entorno CLASSPATH.

    Para organizar el directorio del CLASSPATH Java equipara los nombres de paquetes con los directorios en disco (Java buscar las clases del paquete com.miempresa.utils en el directorio CLASSPATH/com/miempresa/utils).

  • ModularidadModularidad en Java

    ModularidadModularidad en Java

    Objetivos de los paquetes (cont.): Prevenir conflictos de nombre y favorecer la

    reutilizacin. Los nombre de las clases pueden entrar en conflicto, para

    evitarlo la clase se compone de el nombre del paquete al que pertenece, un punto y el nombre de la clase

    Objetivos de los paquetes (cont.): Prevenir conflictos de nombre y favorecer la

    reutilizacin. Los nombre de las clases pueden entrar en conflicto, para

    evitarlo la clase se compone de el nombre del paquete al que pertenece, un punto y el nombre de la clase

    16 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    pertenece, un punto y el nombre de la clase Pueden existir conflictos con los nombres de los paquetes Para evitar esto existe el convenio de utilizar como prefijo a

    los nombres de los paquetes los nombres invertidos del dominio de Internet de la empresa que los ha desarrollado

    Ejemplo, los paquetes de Borland tendran el prefijo com.borland, los paquetes del OMG tendra el prefijo org.omg, etc.

    Los nombres de dominio no pueden repetirse, evitando as los posibles conflictos

    pertenece, un punto y el nombre de la clase Pueden existir conflictos con los nombres de los paquetes Para evitar esto existe el convenio de utilizar como prefijo a

    los nombres de los paquetes los nombres invertidos del dominio de Internet de la empresa que los ha desarrollado

    Ejemplo, los paquetes de Borland tendran el prefijo com.borland, los paquetes del OMG tendra el prefijo org.omg, etc.

    Los nombres de dominio no pueden repetirse, evitando as los posibles conflictos

  • ModularidadModularidad en Java

    ModularidadModularidad en Java

    La sentencia import Para simplificar la sintaxis y no tener que introducir un nombre

    largo de paquete cada vez que se utiliza una clase puede utilizarse la sentencia import al principio de cada fichero

    De esta forma puede utilizarse el nombre de la clase sin indicar el paquete al que pertenece

    La sentencia import Para simplificar la sintaxis y no tener que introducir un nombre

    largo de paquete cada vez que se utiliza una clase puede utilizarse la sentencia import al principio de cada fichero

    De esta forma puede utilizarse el nombre de la clase sin indicar el paquete al que pertenece

    17 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    el paquete al que pertenece La sentencia import puede utilizarse de dos formas distintas:

    import nombrepaquete.* importa todas las clases del paquete import nombrepaquete.Clase importa slo la clase especificada

    La sentencia import simplemente especifica que los contenidos pblicos del paquete destino entran en el espacio de nombres del origen. No es necesario incluir la sentencia import para dar privilegios de acceso de un paquete a otro

    Si dos clase de distintos paquetes comparten nombre se deber usar su path completo.

    el paquete al que pertenece La sentencia import puede utilizarse de dos formas distintas:

    import nombrepaquete.* importa todas las clases del paquete import nombrepaquete.Clase importa slo la clase especificada

    La sentencia import simplemente especifica que los contenidos pblicos del paquete destino entran en el espacio de nombres del origen. No es necesario incluir la sentencia import para dar privilegios de acceso de un paquete a otro

    Si dos clase de distintos paquetes comparten nombre se deber usar su path completo.

  • ModularidadModularidad en Java

    ModularidadModularidad en Java

    Ejemplo Por conveccin los nombres de los paquetes de java se escriben

    siempre en minsculas (incluidas las primeras letras de cada palabra)

    Ejemplo Por conveccin los nombres de los paquetes de java se escriben

    siempre en minsculas (incluidas las primeras letras de cada palabra)

    ...

    Utilizacin

    18 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    fichero MiClase.java

    paqueteuno.MiClase x = new

    paqueteuno.MiClase();

    ...

    package paqueteuno;

    public class MiClase

    {

    ...

    }

    import paqueteuno.*;

    ...

    MiClase x = new MiClase();

    ...

    Definicin

  • ndicendice

    4. Jerarqua Herencia Herencia simple vs. mltiple Clases abstractas

    4. Jerarqua Herencia Herencia simple vs. mltiple Clases abstractas

    19 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Clases abstractas Interfaces Composicin

    Clases abstractas Interfaces Composicin

  • JerarquaJerarqua

    Definicin de jerarqua Una jerarqua es una clasificacin de las

    abstracciones

    Jerarqua de generalizacin/especializacin:

    Definicin de jerarqua Una jerarqua es una clasificacin de las

    abstracciones

    Jerarqua de generalizacin/especializacin:

    20 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Jerarqua de generalizacin/especializacin: Define relaciones ES_UN Tambin se conoce como herencia

    Jerarqua de agregacin: Define relaciones ES_PARTE_DE Tambin se conoce como composicin

    Jerarqua de generalizacin/especializacin: Define relaciones ES_UN Tambin se conoce como herencia

    Jerarqua de agregacin: Define relaciones ES_PARTE_DE Tambin se conoce como composicin

  • JerarquaHerencia

    JerarquaHerencia

    Herencia Define una relacin entre clases, en las que una

    clase comparte la estructura de comportamiento definida en una o ms clases

    La herencia permite declarar las abstracciones con economa de expresin

    Herencia Define una relacin entre clases, en las que una

    clase comparte la estructura de comportamiento definida en una o ms clases

    La herencia permite declarar las abstracciones con economa de expresin

    21 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    economa de expresin

    Subclases y superclases Una subclases hereda de una o ms superclases y

    aumenta o redefine la estructura y el comportamiento de dichas superclases

    Las subclases representan conceptos especializados Las superclases representan generalizaciones de los

    aspectos comunes de las subclases

    economa de expresin

    Subclases y superclases Una subclases hereda de una o ms superclases y

    aumenta o redefine la estructura y el comportamiento de dichas superclases

    Las subclases representan conceptos especializados Las superclases representan generalizaciones de los

    aspectos comunes de las subclases

  • JerarquaHerencia

    JerarquaHerencia

    Representacin interna de los objetos Representacin interna de los objetos

    Informacin de la clase

    Por ejemplo, un puntero a la

    superclase

    22 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Puntero del objeto

    Puntero a la clase

    Variables de instancia

    ...

    ...

    ...

    Variables de clase

    ...

    ...

    superclase

    Tabla de punteros a mtodos

    constructores

    Tabla de punteros a mtodos de

    clase

    Tabla de punteros a mtodos de

    instancia

  • JerarquaHerencia

    JerarquaHerencia

    Representacin interna de los objetos Representacin interna de los objetos class Persona

    {

    protected String nombre;

    protected String apellidos;

    protected int edad;

    protected int genero;

    protected static

    int mayoriaEdad = 18;

    public static final int HOMBRE = 1;

    public static final int MUJER = 2;

    public static int getMayoriaEdad() { return mayoriaEdad;}

    public static void setMayoriaEdad

    (int me)

    { if (me > 0) mayoriaEdad = me; }

    public String getNombre()

    { return nombre;}

    23 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    public static final int MUJER = 2;

    public static final

    int DESCONOCIDO = 99;

    public Persona()

    {

    nombre = "";

    apellidos = "";

    edad = 0;

    genero = DESCONOCIDO;

    }

    public Persona(String n, String a,

    int e, int g)

    {

    nombre = n;

    apellidos = a;

    edad = e;

    genero = g ; }

    public void setNombre(String n)

    { nombre = n; }

    public String getApellidos()

    { return apellidos;}

    public void setApellidos(String a)

    { apellidos = a; }

    public int getEdad()

    { return edad;}

    public void setEdad(int e)

    { if (e > 0) edad = e; }

    public int getGenero()

    { return genero;}

    public void setGenero(int g)

    { if (g==1 || g==2 || g==99)

    genero = g;} }

  • JerarquaHerencia

    JerarquaHerencia

    Representacin interna de los objetos Representacin interna de los objetos

    Puntero del objeto

    Puntero a la clase

    nombre = Juan

    apellidos = Garca Informacin de la clase Persona

    Persona(String, String, int, int)

    Persona()

    24 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    edad = 15Persona

    mayoriaEdad = 18

    HOMBRE = 1

    genero = HOMBRE

    Puntero a la clase

    nombre = Ana

    apellidos = Prez

    edad = 21

    genero = MUJER

    Puntero del objeto

    MUJER = 2

    DESCONOCIDO = 99

    getMayoriaEdad()

    setMayoriaEdad(int)

    getApellidos()

    setApellidos(String)

    getNombre()

    setNombre(String)

    getEdad()

    setEdad(int)

    getGenero()

    setGenero(int)

  • JerarquaHerencia

    JerarquaHerencia

    Representacin interna de los objetos con herencia Representacin interna de los objetos con herencia

    class Estudiante extends Persona

    {

    public final static int II = 1;

    public final static int ITIG = 2;

    public final static int ITIS = 3;

    private int titulacion;

    public String [] asignaturas;

    public int getTitulacion()

    25 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    public int getTitulacion()

    { return titulacion;}

    public void setTitulacion(int t)

    { if (t == 1 || t==2 || t==3)

    titulacion = t; }

    public float calcularMatricula()

    { ... }

    }

    class Profesor extends Persona

    {

    public String departamento;

    public String categoria;

    public String dedicacion;

    public java.util.Date antiguedad;

    public float calcularSueldo()

    { ... }

    }

  • JerarquaHerencia

    JerarquaHerencia

    Representacin interna de los objetos con herencia Representacin interna de los objetos con herencia

    Puntero a mayoriaEdad = 18 getNombre()

    Informacin de la clase Estudiante

    elementos heredados

    elementos propios

    Estudiante()

    getMayoriaEdad()

    setMayoriaEdad(int)

    26 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Puntero a la clase

    nombre

    apellidos

    edad

    genero

    mayoriaEdad = 18

    HOMBRE = 1

    MUJER = 2

    DESCONOCIDO = 99Puntero del objeto

    getApellidos()

    setApellidos(String)

    getNombre()

    setNombre(String)

    getEdad()

    setEdad(int)

    getGenero()

    setGenero(int)

    titulacion

    asignaturas

    II = 1

    ITIG = 2

    ITIS = 3

    getTitulacion()

    setTitulacion(int)

    calcularMatricula()

  • JerarquaHerencia

    JerarquaHerencia

    Representacin interna de los objetos con herencia Representacin interna de los objetos con herencia

    Informacin de la clase

    Profesor()

    getMayoriaEdad()

    setMayoriaEdad(int)

    Puntero a la clase

    elementos heredados

    elementos propios

    27 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Informacin de la clase Profesor

    mayoriaEdad = 18

    HOMBRE = 1

    MUJER = 2

    DESCONOCIDO = 99

    Puntero del objeto

    setMayoriaEdad(int)

    getApellidos()

    setApellidos(String)

    getNombre()

    setNombre(String)

    getEdad()

    setEdad(int)

    getGenero()

    setGenero(int)

    calcularSueldo()

    nombre

    apellidos

    edad

    genero

    departamento

    categoria

    dedicacin

    antiguedad

  • Aspectos importantes a recordar Un objeto de una subclase siempre incluye en su interior un

    objeto de la superclase

    Aspectos importantes a recordar Un objeto de una subclase siempre incluye en su interior un

    objeto de la superclase

    Estudiante

    JerarquaHerencia

    JerarquaHerencia

    28 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Los elementos definidos en una superclase aparecen siempre en la misma posicin en las subsecuentes subclases

    Los elementos definidos en una superclase aparecen siempre en la misma posicin en las subsecuentes subclases

    Persona

    Object

  • JerarquaHerencia

    JerarquaHerencia

    Qu constructor habr que poner en SubClase? Todo objeto de una subclase es un objeto de una superclase La palabra clave para llamar a un constructor de la superclase

    es super (la palabra clave this se utilizaba para llamar a un constructor de la propia clase)

    Qu constructor habr que poner en SubClase? Todo objeto de una subclase es un objeto de una superclase La palabra clave para llamar a un constructor de la superclase

    es super (la palabra clave this se utilizaba para llamar a un constructor de la propia clase)

    29 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    class SuperClase

    {

    int valor;

    public SuperClase(int valor)

    { this.valor = valor; }

    }

    class SubClase extends SuperClase

    {

    }

  • JerarquaHerencia

    JerarquaHerencia

    Herencia y constructores Los constructores no se heredan, son exclusivos de la clase en

    la que se definen Por ello la primera instruccin de un constructor de una

    subclase es llamar al constructor de la superclase, y este a su vez al de su superclase hasta llegar a la clase Object

    Herencia y constructores Los constructores no se heredan, son exclusivos de la clase en

    la que se definen Por ello la primera instruccin de un constructor de una

    subclase es llamar al constructor de la superclase, y este a su vez al de su superclase hasta llegar a la clase Object

    30 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    vez al de su superclase hasta llegar a la clase Object Esta llamada generalmente est implcita y consiste en una

    llamada al constructor sin parmetros. Si queremos hacerla explcita deberemos poner super() como primera instruccin

    Si el constructor sin parmetros no existe la llamada implcita fallar y ser necesario hacer una llamada explcita: super(param1, param2)

    vez al de su superclase hasta llegar a la clase Object Esta llamada generalmente est implcita y consiste en una

    llamada al constructor sin parmetros. Si queremos hacerla explcita deberemos poner super() como primera instruccin

    Si el constructor sin parmetros no existe la llamada implcita fallar y ser necesario hacer una llamada explcita: super(param1, param2)

  • JerarquaHerencia

    JerarquaHerencia

    Estructura de las jerarquas de herencia Estructura de las jerarquas de herencia

    Clase raz

    31 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Clases interiores

    Clases hoja

  • JerarquaHerencia simple vs. mltiple

    JerarquaHerencia simple vs. mltiple

    Herencia simple Cada clase tiene, como mximo, un ancestro Ejemplos: Java, Object Pascal y C#

    Herencia mltiple Una clase puede heredar de varias clases simultneamente Ejemplos: C++ y Eiffel

    Herencia simple Cada clase tiene, como mximo, un ancestro Ejemplos: Java, Object Pascal y C#

    Herencia mltiple Una clase puede heredar de varias clases simultneamente Ejemplos: C++ y Eiffel

    32

    Ejemplos: C++ y Eiffel

    Tendencia actual: Eliminacin de la herencia mltiple a favor de la herencia simple. Motivo: los conflictos que genera y su resolucin

    Que pasa cuando heredamos el mismo elemento de dos clases distintas? Los mecanismos para resolver estos conflictos son especficos de cada

    lenguaje y aumentan la complejidad de la programacin y reducen la comprensibilidad

    Existen mecanismos como los interfaces que permiten simular una cierta herencia mltiple que evita los conflictos y permiten diseos elegantes de clases.

    Es posible desarrollar jerarquas de herencia complejas y flexibles evitando la herencia mltiple

    Ejemplos: C++ y Eiffel

    Tendencia actual: Eliminacin de la herencia mltiple a favor de la herencia simple. Motivo: los conflictos que genera y su resolucin

    Que pasa cuando heredamos el mismo elemento de dos clases distintas? Los mecanismos para resolver estos conflictos son especficos de cada

    lenguaje y aumentan la complejidad de la programacin y reducen la comprensibilidad

    Existen mecanismos como los interfaces que permiten simular una cierta herencia mltiple que evita los conflictos y permiten diseos elegantes de clases.

    Es posible desarrollar jerarquas de herencia complejas y flexibles evitando la herencia mltiple

  • JerarquaClases abstractas

    JerarquaClases abstractas

    Caractersticas Representan conceptos generales que agrupan

    mtodos comunes y dejan para la implementacin de las subclases mtodos especficos.

    No pueden ser instanciadas

    Caractersticas Representan conceptos generales que agrupan

    mtodos comunes y dejan para la implementacin de las subclases mtodos especficos.

    No pueden ser instanciadas

    33

    No pueden ser instanciadas Un mtodo abstracto slo puede pertenecer a una

    clase abstracta, pero una clase abstracta puede tener mtodos no abstractos

    Las subclases de una clase abstracta deben implementar los mtodos abstractos o declararse como abstractas.

    No pueden ser instanciadas Un mtodo abstracto slo puede pertenecer a una

    clase abstracta, pero una clase abstracta puede tener mtodos no abstractos

    Las subclases de una clase abstracta deben implementar los mtodos abstractos o declararse como abstractas.

  • JerarquaClases abstractas

    JerarquaClases abstractas

    34 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Circulo

    radio: int

    Rectangulo

    largo: intancho: int

    X: intY: int

    X: intY: int

    calcularPerimetro(): floatcalcularArea(): floatmoverA(x:int, y:int)

    Estado

    float calculaArea(){ return largo * ancho; }

    float calculaArea(){ return Math.PI * radio * radio; }

    calcularPerimetro(): floatcalcularArea(): floatmoverA(x:int, y:int)void moverA()

    {this.X=X;this.Y=Y;

    }

    void moverA(){this.X=X;this.Y=Y;

    }

    Comportamiento

  • JerarquaClases abstractas

    JerarquaClases abstractas

    X: intY: int

    calcularPerimetro(): floatcalcularArea(): float

    Figura

    calcularPerimetro(): floatcalcularArea(): float

    Figura

    35 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Circulo

    radio: int

    Rectangulo

    largo: intancho: int

    X: intY: int

    X: intY: int

    calcularPerimetro(): floatcalcularArea(): float

    calcularPerimetro(): floatcalcularArea(): float

    float calculaArea(){ return largo * ancho; }

    float calculaArea(){ return Math.PI * radio * radio; }

    void moverA(){this.X=X;this.Y=Y;

    }

    moverA(x:int, y:int) moverA(x:int, y:int)

    void moverA(){this.X=X;this.Y=Y;

    }

    calcularPerimetro(): floatcalcularArea(): float

    calcularPerimetro(): floatcalcularArea(): float

  • JerarquaClases abstractas

    JerarquaClases abstractas

    // Nota: Se omiten constructores y m// Nota: Se omiten constructores y m// Nota: Se omiten constructores y m// Nota: Se omiten constructores y mtodos detodos detodos detodos de// lectura y escritura de atributos// lectura y escritura de atributos// lectura y escritura de atributos// lectura y escritura de atributosabstract class Figura{

    private int X;

    class Circulo extends Figura{

    private int radio;

    public float calcularPerimetro(){ return 2*(float)Math.PI*radio; }

    public float calcularArea()return float

    36 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    private int X;private int Y;

    public abstract float calcularPerimetro();public abstract float calcularArea();

    public void moverA (int X, int Y){

    this.X=X;this.Y=Y;

    }

    }

    { return (float)Math.PI*radio*radio; }}

    class Rectangulo extends Figura{

    private int largo;private int ancho;

    public float calcularPerimetro(){ return (largo*2)+(ancho*2); }

    public float calcularArea(){ return largo*ancho; }

    }

  • JerarquaInterfaces

    JerarquaInterfaces

    Definicin Son clases abstractas puras ya que slo definen un protocolo

    de conducta y no como debe implementarse dicha conducta.

    Caractersticas

    Definicin Son clases abstractas puras ya que slo definen un protocolo

    de conducta y no como debe implementarse dicha conducta.

    Caractersticas

    [public] interface NombreInterfaz [extends SuperInterfaz, ...]

    { /* cuerpo del interfaz */ }

    37 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Caractersticas Se definen con la palabra clase interface y no class Contienen las cabeceras de mtodos que son, implcitamente,

    pblicos y abstractos, pero no incluyen los cuerpos de los mtodos

    Pueden contener atributos pero sern implcitamente static y final, es decir, constantes de clase

    Ejemplo:

    Caractersticas Se definen con la palabra clase interface y no class Contienen las cabeceras de mtodos que son, implcitamente,

    pblicos y abstractos, pero no incluyen los cuerpos de los mtodos

    Pueden contener atributos pero sern implcitamente static y final, es decir, constantes de clase

    Ejemplo:interface FiguraInterfaz{

    float calcularPerimetro();float calcularArea();

    }

  • JerarquaInterfaces

    JerarquaInterfaces

    Herencia EN los interfaces Siguen una jerarqua de herencias paralela a la jerarqua de

    herencias de las clases. Permite la herencia mltiple entre interfaces

    Herencia DE interfaces (implementacin)

    Herencia EN los interfaces Siguen una jerarqua de herencias paralela a la jerarqua de

    herencias de las clases. Permite la herencia mltiple entre interfaces

    Herencia DE interfaces (implementacin)

    38 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Herencia DE interfaces (implementacin) Cualquier clase puede heredar (definido a travs de la palabra

    clave implements) de varios interfaces No se dan los problemas que veamos con la herencia mltiple

    y las clases ya que no se hereda la implementacin de los mtodos sino las cabeceras, por lo que los posibles conflictos son ms sencillos de solucionar.

    Si una clase implementa un interfaz debe dar implementacin a todos los mtodos incluidos en su interfaz (incluidos los superinterfaces que extiende) o bien declararse abstracta y diferir la implementacin del interfaz a sus subclases

    Herencia DE interfaces (implementacin) Cualquier clase puede heredar (definido a travs de la palabra

    clave implements) de varios interfaces No se dan los problemas que veamos con la herencia mltiple

    y las clases ya que no se hereda la implementacin de los mtodos sino las cabeceras, por lo que los posibles conflictos son ms sencillos de solucionar.

    Si una clase implementa un interfaz debe dar implementacin a todos los mtodos incluidos en su interfaz (incluidos los superinterfaces que extiende) o bien declararse abstracta y diferir la implementacin del interfaz a sus subclases

  • JerarquaInterfaces

    JerarquaInterfaces

    Representacin de las jerarquas de clases e interfaces Representacin de las jerarquas de clases e interfaces

    class X interface A interface B

    39 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    class W

    class Y

    class Z

    interface C interface D

    interface E

    Hereda los mtodos de las clases X e Y.

    Debe implementar los mtodos de los

    interfaces A, B, C y D

  • JerarquaInterfaces

    JerarquaInterfaces

    Ejemplo: clase que encapsula el funcionamiento de un vector de datos

    Ejemplo: clase que encapsula el funcionamiento de un vector de datos

    public class Vector

    {

    private int[] datos;

    public Vector(int valores)

    40 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    public Vector(int valores)

    {

    datos = new int[valores];

    for (int i = 0; i < datos.length; i++)

    { datos[i] = 0; }

    }

    public int getValor(int pos)

    { return datos[pos]; }

    public void setValor(int pos, int valor)

    { datos[pos] = valor; }

    public int dimension()

    { return datos.length; }

    public Iterator iterador()

    {

    return new IteradorVector(datos);

    }

    }

    La clase Vector tiene un mtodo que devuelve un iterador sobre la misma.

    En principio hemos implementado ese iterador como una clase aparte a la cual se le

    pasan los datos internos del vector

  • JerarquaInterfaces

    JerarquaInterfaces

    Definicin del interfaz Iterator

    Definicin de un iterador para el vector

    Definicin del interfaz Iterator

    Definicin de un iterador para el vector

    public interface Iterator

    {

    boolean hasNext();

    Object next();

    void remove();

    }

    remove es una operacin opcional. Eso en la semntica de

    las bibliotecas de colecciones de Java significa que la clase implementadora

    no est obligada a darle una implementacin.

    class IteradorVector implements Iterator

    { Implementamos el interfaz Iterator de java.util

    41 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    {

    int[] datos;

    int cursor = 0;

    public IteradorVector(int[] array)

    { datos = array; }

    public boolean hasNext()

    {

    if (cursor < datos.length) return true;

    else return false;

    }

    public Object next()

    {

    int valor = datos[cursor];

    cursor++;

    return valor;

    }

    public void remove()

    { throw new UnsupportedOperationException("Not supported"); }

    }

    Implementamos el interfaz Iterator de java.util

    A la clase IteradorVector le pasamos el estado interno del vector para que lo recorra. Aqu el riesgo est en que el vector cambie durante la iteracin. Los iteradores del API de Java son fail-fast, es decir, lanzan una excepcin si se modifican los datos durante

    la iteracin

    Como el lenguaje Java obliga a darle una implementacin a todos los elementos de un interfaz al implementarlo hay que darle una implementacin a remove, pero ser para

    lanzar una excepcin indicando que la operacin no est soportada

  • Ejemplo de utilizacin del iterador Ejemplo de utilizacin del iterador

    JerarquaInterfaces

    JerarquaInterfaces

    Definimos i como una variable de tipo Iterator. Aunque no podemos instanciar interfaces o clases abstractas s podemos

    declarar variables de esos tipos

    El mtodo iterador de la clase Vector devuelve public static void main(String[] args)

    {

    Vector v = new Vector(4);

    v.setValor(0, 10);

    v.setValor(1, 11);

    v.setValor(2, 12);

    v.setValor(3, 13);

    for(Iterator i = v.iterador(); i.hasNext(); )

    System.out.println(i.next());

    }

    42 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    El mtodo iterador de la clase Vector devuelve un iterador sobre el mismo. Como vemos es

    posible hacer una construccin del tipo

    Interface f = new ClaseImplementadora();

    El bucle itera hasta que hasNext es falso. La parte de incrementacin del for se deja vaca

    porque de eso se encarga el propio mtodo next

    next devuelve el objeto actual y mueve el cursor hasta el siguiente objeto

  • Ejemplo de ocultacin de la implementacin Ejemplo de ocultacin de la implementacin

    JerarquaInterfaces

    JerarquaInterfaces

    ...

    Vector.imprimeIteracion(v.iterador());

    ...

    public static void imprimeIteracion(Iterator i)

    {

    for( ; i.hasNext(); )

    System.out.println(i.next());

    }

    43 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    ImprimeIteracin acepta como parmetro una clase que implementa Iterator pero

    DESCONOCE CUL ES, y se encarga de recorrerla tal y como establece el iterador

    Este cdigo funcionar con cualquier clase que implemente Iterator, incluso con clases que

    sean creadas DESPUS de esta (el nuevo cdigo no obliga a modificar el preexistente y se

    integra con l)

  • JerarquaInterfaces

    JerarquaInterfaces

    Usos tpicos de los interfaces:1. Capturar las similitudes entre clases no

    relacionadas2. Revelar el interfaz de programacin de un

    Usos tpicos de los interfaces:1. Capturar las similitudes entre clases no

    relacionadas2. Revelar el interfaz de programacin de un

    44 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    2. Revelar el interfaz de programacin de un objeto sin revelar su clase

    3. Definir nuevos tipos de datos

    Usos poco recomendados:4. Marcadores de clase5. Contenedores de elementos globales6. Simular un tipo de herencia mltiple

    2. Revelar el interfaz de programacin de un objeto sin revelar su clase

    3. Definir nuevos tipos de datos

    Usos poco recomendados:4. Marcadores de clase5. Contenedores de elementos globales6. Simular un tipo de herencia mltiple

  • JerarquaInterfaces

    JerarquaInterfaces

    1. Capturar las similitudes entre clases no relacionadas sin forzar una relacin de clases artificiosa.

    Una clase puede implementar los interfaces que quiera (La clase IteradorVector puede actuar como verse como

    1. Capturar las similitudes entre clases no relacionadas sin forzar una relacin de clases artificiosa.

    Una clase puede implementar los interfaces que quiera (La clase IteradorVector puede actuar como verse como

    45 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    (La clase IteradorVector puede actuar como verse como un iterador, pero tambin puede implementar otros interfaces como Serializable, Cloneable, etc.)

    Si utilizamos instanceof descubriremos que una instancia de IteratorVector es tambin una instancia de Iterator (o de Serializable o Cloneable si fuera el caso)

    Sin embargo, si una clase hereda de una clase abstracta no puede heredar de ninguna otra clase

    (La clase IteradorVector puede actuar como verse como un iterador, pero tambin puede implementar otros interfaces como Serializable, Cloneable, etc.)

    Si utilizamos instanceof descubriremos que una instancia de IteratorVector es tambin una instancia de Iterator (o de Serializable o Cloneable si fuera el caso)

    Sin embargo, si una clase hereda de una clase abstracta no puede heredar de ninguna otra clase

  • JerarquaInterfaces

    JerarquaInterfaces

    2. Revelar el interfaz de programacin de un objeto sin revelar su clase.

    Los interfaces se utilizan a menudo como intermediarios para desacoplar las clases usuarias de funciones de las clases que implementan dichas funciones.

    Por ejemplo: una clase Cliente utiliza la clase Servicio a

    2. Revelar el interfaz de programacin de un objeto sin revelar su clase.

    Los interfaces se utilizan a menudo como intermediarios para desacoplar las clases usuarias de funciones de las clases que implementan dichas funciones.

    Por ejemplo: una clase Cliente utiliza la clase Servicio a

    46 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Por ejemplo: una clase Cliente utiliza la clase Servicio a travs del interfaz Indireccion. La clase Cliente no conoce realmente que clase implementa Indireccion por lo que se pueden realizar cambios en la clase Servicio sin que el cliente se vea alterado.

    En nuestro ejemplo el mtodo imprimeIteracin sera el cliente, el interfaz sera Iterator y la clase que ofrece el servicio sera IteradorVector

    Por ejemplo: una clase Cliente utiliza la clase Servicio a travs del interfaz Indireccion. La clase Cliente no conoce realmente que clase implementa Indireccion por lo que se pueden realizar cambios en la clase Servicio sin que el cliente se vea alterado.

    En nuestro ejemplo el mtodo imprimeIteracin sera el cliente, el interfaz sera Iterator y la clase que ofrece el servicio sera IteradorVector

    Cliente1 1

    Utiliza >

    IndireccionServicio

  • JerarquaInterfaces

    JerarquaInterfaces

    3. Definir nuevos tipos de datos Mltiples objetos de clases diferentes pueden ser tratados

    como si fueran de un mismo tipo comn, donde este tipo viene indicado por el interfaz

    No se pueden instanciar objetos en s del tipo interfaz ya que la definicin de un interfaz no tiene constructor, por lo que no

    3. Definir nuevos tipos de datos Mltiples objetos de clases diferentes pueden ser tratados

    como si fueran de un mismo tipo comn, donde este tipo viene indicado por el interfaz

    No se pueden instanciar objetos en s del tipo interfaz ya que la definicin de un interfaz no tiene constructor, por lo que no

    47 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    la definicin de un interfaz no tiene constructor, por lo que no es posible invocar el operador new sobre un tipo interfaz

    Sin embargo si pueden declararse atributos del tipo del interfaz y asignarle a estos atributos objetos de una clase que implemente dicho interfaz

    En el ejemplo al crear el interfaz Iterator estamos creando un nuevo tipo de datos cuya implementacin viene dada por cualquier objeto de una clase que implemente dicho interfaz

    Interface f = new ClaseImplementadoraInterfaz();

    la definicin de un interfaz no tiene constructor, por lo que no es posible invocar el operador new sobre un tipo interfaz

    Sin embargo si pueden declararse atributos del tipo del interfaz y asignarle a estos atributos objetos de una clase que implemente dicho interfaz

    En el ejemplo al crear el interfaz Iterator estamos creando un nuevo tipo de datos cuya implementacin viene dada por cualquier objeto de una clase que implemente dicho interfaz

    Interface f = new ClaseImplementadoraInterfaz();

  • JerarquaInterfaces

    JerarquaInterfaces

    4. Marcadores de clase Pueden utilizarse interfaces vacios como un flag,

    un marcador para sealar a una clase con una propiedad determinada.

    Por ejemplo Java incluye en su API el interfaz

    4. Marcadores de clase Pueden utilizarse interfaces vacios como un flag,

    un marcador para sealar a una clase con una propiedad determinada.

    Por ejemplo Java incluye en su API el interfaz

    48 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Por ejemplo Java incluye en su API el interfaz Cloneable que sirve para indicar que dicho objeto se puede clonar, o Serializable para marcar un objeto como almacenable en disco.

    Actualmente suele ser ms recomendable usar las annotations del Java SE 5

    Por ejemplo Java incluye en su API el interfaz Cloneable que sirve para indicar que dicho objeto se puede clonar, o Serializable para marcar un objeto como almacenable en disco.

    Actualmente suele ser ms recomendable usar las annotations del Java SE 5

    class MiClase implements Cloneable

    { ... }

    MiClase x = new MiClase();

    if (x instanceof Cloneable)

    {...}

  • JerarquaInterfaces

    JerarquaInterfaces

    Anotaciones (Anexo) Las anotaciones son metadatos, es decir, informacin sobre los

    elementos del programa Vienen a ser algo similar a las etiquetas del javadoc (@author)

    pero aplicadas al cdigo, no a los comentarios Por defecto Java incluye tres anotaciones

    Anotaciones (Anexo) Las anotaciones son metadatos, es decir, informacin sobre los

    elementos del programa Vienen a ser algo similar a las etiquetas del javadoc (@author)

    pero aplicadas al cdigo, no a los comentarios Por defecto Java incluye tres anotaciones

    49 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Por defecto Java incluye tres anotaciones Override: anota a un mtodo e indica que sobreescribe a otro de la

    superclase Deprecated: indica que un mtodo o clase est anticuado y no debe

    usarse (depreciado en la jerga de Java) SupressWarnings: el compilador no avisa de warnings ocurridos

    sobre el elemento anotado Las anotaciones no son mas que interfaces por lo que pueden

    declarar mtodos o constantes La potencia de las anotaciones viene de la posibilidad de crear

    anotaciones personalizadas

    Por defecto Java incluye tres anotaciones Override: anota a un mtodo e indica que sobreescribe a otro de la

    superclase Deprecated: indica que un mtodo o clase est anticuado y no debe

    usarse (depreciado en la jerga de Java) SupressWarnings: el compilador no avisa de warnings ocurridos

    sobre el elemento anotado Las anotaciones no son mas que interfaces por lo que pueden

    declarar mtodos o constantes La potencia de las anotaciones viene de la posibilidad de crear

    anotaciones personalizadas

  • JerarquaInterfaces

    JerarquaInterfaces

    Ejemplos de anotaciones Cul es el resultado de la compilacin y ejecucin del

    siguiente cdigo?

    Ejemplos de anotaciones Cul es el resultado de la compilacin y ejecucin del

    siguiente cdigo? class MiClase{

    @Override

    public boolean equals(MiClase o) { return false; }

    50 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    { return false; } }

  • JerarquaInterfaces

    JerarquaInterfaces

    Ejemplos de anotaciones Ejemplos de anotaciones

    @SuppressWarnings(value={"unchecked"})

    class MiClaseIndica que el compilador obvie los warnings

    generados en esta clase. Por ejemplo, usar un

    51 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    class MiClase{

    List l = new ArrayList();

    public void hola() { l.add("Hola"); }

    @Deprecated public void hazAlgo() {}

    }

    Declaramos el mtodo como depreciado para que lo sepa el compilador.

    No confundir con la etiqueta del javadoc, aunque el compilador tambin la reconoce (pero por

    motivos de compatibilidad hacia atrs )

    Debe usarse las dos etiquetas al mismo tiempo

    ArrayList sin usar genericidad

  • JerarquaInterfaces

    JerarquaInterfaces

    Anotaciones personalizadas Anotaciones personalizadasImport java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@interface EnDesarrollo{ int porcentaje(); }@EnDesarrollo (porcentaje=50)

    Anotamos la anotacin indicando que queremos que su informacin se

    mantenga en tiempo de ejecucin ( para utilizarla con la reflexin)

    Mas ejemplos en Java 1.5 Tiger: A developers notebook

    52 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    @EnDesarrollo (porcentaje=50)class MiClase { }public class AnotacionSimple{ public static void main(String[] args) {

    MiClase x = new MiClase();Class c = x.getClass();if (c.isAnnotationPresent(EnDesarrollo.class)) {

    System.out.println("Esta clase est en desarrollo"); EnDesarrollo ed = (EnDesarrollo)c.getAnnotation(EnDesarrollo.class);System.out.println("Porcentaje = " + ed.porcentaje());

    } }

    }

    La palabra clave para definir anotaciones es @interface, el resto de

    la declaracin es como si fuera un interface tpico. En este caso

    indicamos que existe un mtodo que devuelve un porcentaje

    Anotamos una clase con la anotacin EnDesarrollo, le damos un valor a

    porcentaje (el compilador nos evita tener que escribir la sobreescritura del

    mtodo porcentaje por MiClase)

    Usamos la reflexin para obtener informacin en tiempo de ejecucin del

    objeto de tipo MiClase

  • JerarquaInterfaces

    JerarquaInterfaces

    5. Como contenedores de elementos globales al programa

    En Java no existen variables globales como en otros lenguajes. Los interfaces pueden utilizarse para incluir aspectos comunes que deban

    5. Como contenedores de elementos globales al programa

    En Java no existen variables globales como en otros lenguajes. Los interfaces pueden utilizarse para incluir aspectos comunes que deban

    53 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    para incluir aspectos comunes que deban compartir clases heterogneas, como por ejemplo: constantes

    para incluir aspectos comunes que deban compartir clases heterogneas, como por ejemplo: constantes

    public interface Constantes

    {

    public double PI = 3.1416;

    public int MAXFILAS = 15;

    }

    public class Circulo implements Constantes

    { int radio ;

    public double perimetro()

    { return (2 * PI * radio); }

    }

  • JerarquaInterfaces

    JerarquaInterfaces

    Como contenedores de elementos globales al programa Mala solucin: polucin del API exportado

    Confusin entre los clientes Compromiso a largo plazo

    Soluciones

    Como contenedores de elementos globales al programa Mala solucin: polucin del API exportado

    Confusin entre los clientes Compromiso a largo plazo

    Soluciones

    54 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Soluciones Definir las constantes en una clase o interfaz relacionado: Como

    MIN_VALUE y MAX_VALUE en Integer Crear clases que sean tipos enumerados Definir las constantes en clases de utilidad (utility classes) como

    por ejemplo Math

    Soluciones Definir las constantes en una clase o interfaz relacionado: Como

    MIN_VALUE y MAX_VALUE en Integer Crear clases que sean tipos enumerados Definir las constantes en clases de utilidad (utility classes) como

    por ejemplo Math

    public class Constantes

    {

    private Constantes () {} // Para prevenir instanciacin

    public static final double PI = 3.1416;

    public static final int MAXFILAS = 15;

    }

  • JerarquaInterfaces

    JerarquaInterfaces

    Como contenedores de elementos globales al programa Nuevo problema:

    Hay que anteceder el nombre de la clase al nombre de la constante

    Soluciones al nuevo problema

    Como contenedores de elementos globales al programa Nuevo problema:

    Hay que anteceder el nombre de la clase al nombre de la constante

    Soluciones al nuevo problema

    perimetro = 2 * Constantes.PI * radio;

    55

    Utilizar constantes locales: mala y confusa solucin

    Utilizar la facilidad de importacin esttica (versin 1.5)

    Utilizar constantes locales: mala y confusa solucin

    Utilizar la facilidad de importacin esttica (versin 1.5)

    import static es.udc.Constantes.*;

    public class Circulo

    {

    ...

    int radio ;

    public double perimetro()

    { return (2 * PI * radio); }

    ...

    }

    private static final double PI = Constantes.PI;

    Los import static importan un elemento de una clase o todos los elementos de una clase. Los import tradicionales

    importaban una clase o todas las clases de un paquete

    No es necesario indicar a qu clase pertenece PI

    Qu problema plantean?

  • JerarquaInterfaces

    JerarquaInterfaces

    6. Para simular un tipo de herencia mltiple Hay autores que destacan que los interfaces son la forma que

    tiene Java de implementar la herencia mltiple. Sin embargo esto no es del todo cierto ya que la herencia

    mltiple como se conoce por ejemplo en C++ y los interfaces presentan una serie de importantes diferencias:

    6. Para simular un tipo de herencia mltiple Hay autores que destacan que los interfaces son la forma que

    tiene Java de implementar la herencia mltiple. Sin embargo esto no es del todo cierto ya que la herencia

    mltiple como se conoce por ejemplo en C++ y los interfaces presentan una serie de importantes diferencias:

    56 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    presentan una serie de importantes diferencias: No se pueden heredar variables desde un interface. No se pueden heredar implementaciones de mtodos desde un

    interface. La herencia de un interface es independiente de la herencia de la

    clase, las clases que implementan el mismo interface pueden o no estar relacionadas a travs del rbol de clases.

    Lo que s es cierto es que los interfaces parecen una alternativa para resolver algunos problemas que en otros lenguajes se resuelven utilizando herencia mltiple.

    presentan una serie de importantes diferencias: No se pueden heredar variables desde un interface. No se pueden heredar implementaciones de mtodos desde un

    interface. La herencia de un interface es independiente de la herencia de la

    clase, las clases que implementan el mismo interface pueden o no estar relacionadas a travs del rbol de clases.

    Lo que s es cierto es que los interfaces parecen una alternativa para resolver algunos problemas que en otros lenguajes se resuelven utilizando herencia mltiple.

  • JerarquaInterfaces

    JerarquaInterfaces

    Interfaces o clases abstractas? API de colecciones Interfaces en un primer

    nivel

    Interfaces o clases abstractas? API de colecciones Interfaces en un primer

    nivel

    List AbstractCollection

    Collection

    Set

    SortedSet AbstractSet AbstractList

    57 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    nivel Clases abstractas en un

    segundo nivel Tienes la opcin de

    implementar el interfaz directamente o heredar de una clase abstracta

    nivel Clases abstractas en un

    segundo nivel Tienes la opcin de

    implementar el interfaz directamente o heredar de una clase abstracta

    SortedSet AbstractSet AbstractList

    TreeSet HashSet ArrayList AbstractSequentialList

    LinkedList

    Map

    SortedMap AbstractMap

    TreeMap HashMap WeakHashMap

  • JerarquaInterfaces

    JerarquaInterfaces

    Qu problemas plantea el tener que pasar el estado completo de un Vector a su iterador?

    Qu problemas plantea el tener que pasar el estado completo de un Vector a su iterador?public class Vector

    {

    int[] datos:

    ...

    58 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    ...

    public Iterator iterador()

    {

    return new IteradorVector(datos);

    }

    ...

    }

    class IteradorVector implements Iterator

    {

    ...

    public IteradorVector(int[] array)

    { datos = array; }

    ...

    }

  • JerarquaInterfaces

    JerarquaInterfaces

    Clases internas Una solucin para que una clase use datos privados

    de otra es usar clases internas Una clase interna es una clase definida dentro de

    otra clase La clase interna, al estar dentro de una clase

    Clases internas Una solucin para que una clase use datos privados

    de otra es usar clases internas Una clase interna es una clase definida dentro de

    otra clase La clase interna, al estar dentro de una clase La clase interna, al estar dentro de una clase

    contenedora, tiene acceso a los elementos privados de dicha clase contenedora

    La utilidad de las clases internas se ve en ejemplos como la definicin de clases iteradoras o las clases de gestin de eventos de una JFrame Swing

    El inconveniente que tienen es que a veces su sintaxis llega a ser realmente confusa, la propuesta de aadir Clousures al lenguaje se hace para facilitar la sintaxis de las clases internas annimas

    La clase interna, al estar dentro de una clase contenedora, tiene acceso a los elementos privados de dicha clase contenedora

    La utilidad de las clases internas se ve en ejemplos como la definicin de clases iteradoras o las clases de gestin de eventos de una JFrame Swing

    El inconveniente que tienen es que a veces su sintaxis llega a ser realmente confusa, la propuesta de aadir Clousures al lenguaje se hace para facilitar la sintaxis de las clases internas annimas

    59 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

  • JerarquaInterfaces

    JerarquaInterfaces

    Iterador definido con clases internas Iterador definido con clases internaspublic class Vector

    {

    private int[] datos;

    public Vector(int valores)

    { datos = new int[valores];

    for (int i = 0; i < datos.length; i++)

    { datos[i] = 0; }

    }

    60

    public int getValor(int pos) { return datos[pos]; }

    public void setValor(int pos, int valor) { datos[pos] = valor; }

    public int dimension() { return datos.length; }

    public Iterator iterador() { return new Iterador(); }

    class Iterador implements Iterator

    {

    int cursor = 0;

    public boolean hasNext()

    { if (cursor < datos.length) return true;

    else return false;

    }

    public Object next()

    { int valor = datos[cursor];

    cursor++;

    return valor;

    }

    public void remove()

    { throw new UnsupportedOperationException("Not supported yet."); }

    }

    }

    Ahora ya no es necesario pasarle la informacin privada del Vector al iterador

    La clase Iterador est definida por completo dentro del mbito de la clase Vector

    Al pertenecer a la clase Vector puede ver sus elementos privados sin ningn tipo de

    problema

    La clase Iterador implementa el interfaz Iterator, pero la clase Vector no. Esa

    posibilidad da mucho juego al uso de clases internas

  • JerarquaInterfaces

    JerarquaInterfaces

    Aunque el trmino clase interna se ha generalizado, segn Java una clase dentro de otra clase se considera una clase anidada nested classes

    Existen dos tipos de clases anidadas estaticas y no estticas Clases internas no estticas (inner classes).

    Como las vistas hasta ahora Las instancias de las clases internas estn asociadas a una instancia

    Aunque el trmino clase interna se ha generalizado, segn Java una clase dentro de otra clase se considera una clase anidada nested classes

    Existen dos tipos de clases anidadas estaticas y no estticas Clases internas no estticas (inner classes).

    Como las vistas hasta ahora Las instancias de las clases internas estn asociadas a una instancia Las instancias de las clases internas estn asociadas a una instancia

    de la clase exterior, de la cual pueden ver sus elementos privados Clases anidadas estticas (static nested classes).

    Se definen anteponiendo static al nombre de la clase Los objetos de la clase interna no tienen acceso a un objeto de la clase

    externa Para crear objetos de la clase interna hay que anteponer el nombre de

    la clase externa (igual que se hace para otros elementos estticos). Ambos tipos pueden ser definidos como clases privadas, eso

    significa que son clases destinadas para ser usadas slo dentro de la clase circundante.

    Las instancias de las clases internas estn asociadas a una instancia de la clase exterior, de la cual pueden ver sus elementos privados

    Clases anidadas estticas (static nested classes). Se definen anteponiendo static al nombre de la clase Los objetos de la clase interna no tienen acceso a un objeto de la clase

    externa Para crear objetos de la clase interna hay que anteponer el nombre de

    la clase externa (igual que se hace para otros elementos estticos). Ambos tipos pueden ser definidos como clases privadas, eso

    significa que son clases destinadas para ser usadas slo dentro de la clase circundante.

    61 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

  • JerarquaComposicinJerarqua

    Composicin Caractersticas

    La composicin define relaciones ES_PARTE_DE y ocurre cuando los atributos de un objeto son a su vez objetos.

    Caractersticas La composicin define relaciones ES_PARTE_DE y ocurre

    cuando los atributos de un objeto son a su vez objetos. class Baraja {

    private Carta [] cartas;

    public Baraja()

    {

    class Carta

    {

    private int numero;

    private String palo;

    public Carta (String p, int n)

    62 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    {

    int i=0, j;

    cartas = new Carta[40];

    for (j=1; i

  • JerarquaComposicinJerarqua

    Composicin Composicin como mecanismo de

    reutilizacin Estudiante podra contener una

    persona en vez de heredar de persona Se usa la delegacin, los mtodos de

    Estudiante que debe resolver persona

    Composicin como mecanismo de reutilizacin Estudiante podra contener una

    persona en vez de heredar de persona Se usa la delegacin, los mtodos de

    Estudiante que debe resolver persona

    class Estudiante

    {

    public String titulacion;

    public String [] asignaturas;

    private Persona p;

    public float calcularMatricula()

    { ... }

    public String getNombre()

    { return p.getNombre();}

    public void setNombre(String n)

    63 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Estudiante que debe resolver persona (getNombre) se delegan a la instancia interna de Persona

    Qu os parece ms cmodo, la herencia o la delegacin?

    . . . . .

    Estudiante que debe resolver persona (getNombre) se delegan a la instancia interna de Persona

    Qu os parece ms cmodo, la herencia o la delegacin?

    . . . . .

    public void setNombre(String n)

    { p.setNombre(n); }

    public String getApellidos()

    { return p.getApellidos();}

    public void setApellidos(String d)

    { p.setApellidos(d); }

    public int getEdad()

    { return p.getEdad();}

    public void setEdad(int e)

    { p.setEdad(e); }

    public int getGenero()

    { return p.getGenero();}

    public void setGenero(int e)

    { p.setGenero(e); } }

  • ndicendice

    5. Polimorfismo Tipos de polimorfismo Polimorfismo de inclusin Polimorfismo paramtrico

    5. Polimorfismo Tipos de polimorfismo Polimorfismo de inclusin Polimorfismo paramtrico

    64 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Polimorfismo paramtrico Sobrecarga Coercin

    Polimorfismo paramtrico Sobrecarga Coercin

  • PolimorfismoPolimorfismo

    Definicin El trmino viene del griego y significa muchas formas En lenguajes OO se podra definir como: la capacidad de una

    variable de tener ms de un tipo y de una funcin de ser aplicada sobre parmetros de distintos tipos.

    Lenguajes monomrficos

    Definicin El trmino viene del griego y significa muchas formas En lenguajes OO se podra definir como: la capacidad de una

    variable de tener ms de un tipo y de una funcin de ser aplicada sobre parmetros de distintos tipos.

    Lenguajes monomrficos

    65 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Lenguajes monomrficos Las variables slo pueden tener un tipo y las funciones slo

    admitan parmetros con un nico tipo (ej. Pascal estndar)

    Tipos de polimorfismo El polimorfismo involucra distintos aspectos, de

    funcionamiento similar, pero que se basan en conceptos completamente distintos

    Para intentar poner un poco de orden entre todas las definiciones que implicaban polimorfismo Cardelli y Wegner (1985) realizaron una clasificacin de las mismas

    Lenguajes monomrficos Las variables slo pueden tener un tipo y las funciones slo

    admitan parmetros con un nico tipo (ej. Pascal estndar)

    Tipos de polimorfismo El polimorfismo involucra distintos aspectos, de

    funcionamiento similar, pero que se basan en conceptos completamente distintos

    Para intentar poner un poco de orden entre todas las definiciones que implicaban polimorfismo Cardelli y Wegner (1985) realizaron una clasificacin de las mismas

  • PolimorfismoTipos de polimorfismo

    PolimorfismoTipos de polimorfismo

    Universal o verdadero

    Paramtrico

    De Inclusin

    66

    Polimorfismo

    Ad hoc o aparente

    De Inclusin

    Sobrecarga

    Coaccin

  • PolimorfismoTipos de polimorfismo

    PolimorfismoTipos de polimorfismo

    Polimorfismo universal o verdadero Consiste en que pueden existir valores que pueden

    pertenecer a varios tipos, y se utiliza el mismo cdigo para tratar los diferentes tipos

    Tenemos dos variantes del polimorfismo universal, el polimorfismo paramtrico y el de inclusin

    Polimorfismo universal o verdadero Consiste en que pueden existir valores que pueden

    pertenecer a varios tipos, y se utiliza el mismo cdigo para tratar los diferentes tipos

    Tenemos dos variantes del polimorfismo universal, el polimorfismo paramtrico y el de inclusin

    67 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    polimorfismo paramtrico y el de inclusin

    Polimorfismo ad hoc o aparente Se utiliza distinto cdigo para tratar diferentes tipos De esta forma una funcin polimrfica sera

    implementada a travs de un conjunto de funciones monomrficas

    Dentro del polimorfismo ad hoc podemos distinguir la sobrecarga y la coerccin

    polimorfismo paramtrico y el de inclusin

    Polimorfismo ad hoc o aparente Se utiliza distinto cdigo para tratar diferentes tipos De esta forma una funcin polimrfica sera

    implementada a travs de un conjunto de funciones monomrficas

    Dentro del polimorfismo ad hoc podemos distinguir la sobrecarga y la coerccin

  • PolimorfismoPolimorfismo de inclusin

    PolimorfismoPolimorfismo de inclusin

    Caractersticas Es propio de los lenguajes orientados a objetos. Es aquel que se consigue a travs de la herencia. Por eso se

    llama tambin polimorfismo de subclases, o de herencia, o simplemente polimorfismo

    Indica que un objeto de una subclase puede utilizarse en

    Caractersticas Es propio de los lenguajes orientados a objetos. Es aquel que se consigue a travs de la herencia. Por eso se

    llama tambin polimorfismo de subclases, o de herencia, o simplemente polimorfismo

    Indica que un objeto de una subclase puede utilizarse en

    68 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Indica que un objeto de una subclase puede utilizarse en aquellos lugares en los que se requiere un objeto de sus superclases

    Recordemos que un objeto de la subclase incluye internamente un objeto de la superclase

    Indica que un objeto de una subclase puede utilizarse en aquellos lugares en los que se requiere un objeto de sus superclases

    Recordemos que un objeto de la subclase incluye internamente un objeto de la superclase

    Animal listaAnimales[] = new Animal[10];

    listaAnimales [0] = new Perro();

    listaAnimales [1] = new Gato();

    listaAnimales [2] = new Animal();

  • PolimorfismoPolimorfismo de inclusin

    PolimorfismoPolimorfismo de inclusin

    Mtodos genricos

    En lenguajes, como Java u Object Pascal (Delphi), en los que existe una superclase comn para todas las clases (Object), es sencillo crear mtodos genricos que acepten parmetros de cualquier tipo o que

    Mtodos genricos

    En lenguajes, como Java u Object Pascal (Delphi), en los que existe una superclase comn para todas las clases (Object), es sencillo crear mtodos genricos que acepten parmetros de cualquier tipo o que

    69 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    que acepten parmetros de cualquier tipo o que devuelvan valores de cualquier tipo

    Simplemente los parmetros o el tipo de retorno se especifican de tipo Object ya que todas las clases son subclases de Object y pueden suplantarlo si es necesario

    que acepten parmetros de cualquier tipo o que devuelvan valores de cualquier tipo

    Simplemente los parmetros o el tipo de retorno se especifican de tipo Object ya que todas las clases son subclases de Object y pueden suplantarlo si es necesario

    public Object metodoGenerico(Object o) { }

  • PolimorfismoPolimorfismo de inclusin

    PolimorfismoPolimorfismo de inclusin

    Colecciones y polimorfismo de inclusin Java utilizaba hasta la versin 1.4 profusamente el

    polimorfismo de inclusin en las clases destinadas a almacenar colecciones de datos (como Vector, List, HashTable, etc.).

    Colecciones y polimorfismo de inclusin Java utilizaba hasta la versin 1.4 profusamente el

    polimorfismo de inclusin en las clases destinadas a almacenar colecciones de datos (como Vector, List, HashTable, etc.).

    70 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    HashTable, etc.).

    As un vector se define cono un contenedor de objetos de tipo Object, por lo que en un vector podra ir cualquier tipo de clase

    HashTable, etc.).

    As un vector se define cono un contenedor de objetos de tipo Object, por lo que en un vector podra ir cualquier tipo de clase

  • PolimorfismoPolimorfismo de inclusin

    PolimorfismoPolimorfismo de inclusin

    Colecciones y polimorfismo de inclusin Colecciones y polimorfismo de inclusin

    :Gato

    nombre="Mich"

    Al entrar en la coleccin el gato se almacena en una variable de

    tipo object

    :Coche

    marca = "Ford"

    Est esto permitido?

    71 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    nombre = "Mich"

    marca = "Ford"

    :Gato

    nombre = "Mich"

    Al salir de la coleccin es necesario hacer un typecast

    explcito para convertir el Object en un Gato y acceder as a los

    elementos especficos del Gato

    Gato g = (Gato) vector.get(1);System.out(g.nombre);

    Qu ocurre con este cdigo?Coche c = (Gato) vector.get(3);

    :Object :Object:Object :Object :ObjectUn vector se

    define internamente

    como un Array de Object

  • PolimorfismoPolimorfismo de inclusin

    PolimorfismoPolimorfismo de inclusin

    Colecciones y polimorfismo de inclusin Colecciones y polimorfismo de inclusin

    import java.util.*;

    public class ListaSinGenericidad{

    72 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    {

    public static void main(String [] args){

    List listaGatos = new ArrayList();listaGatos.add(new Gato());listaGatos.add(new Coche());Gato gato1 = (Gato)listaGatos.get(0); Gato gato2 = (Gato)listaGatos.get(1);

    }

    }

    El type-cast es necesario para evitar un error en tiempo de compilacin

    Error ClassCastException, estamos intentando convertir un Coche en

    un Gato

    No existe seguridad de tipos en las colecciones que utilizan el polimorfismo de inclusin

  • PolimorfismoPolimorfismo paramtrico

    PolimorfismoPolimorfismo paramtrico

    Caractersticas Se conoce habitualmente como genericidad Consiste en que una misma funcin es aplicada

    sobre una variedad de tipos distintos Se denomina paramtrico porque las funciones

    Caractersticas Se conoce habitualmente como genericidad Consiste en que una misma funcin es aplicada

    sobre una variedad de tipos distintos Se denomina paramtrico porque las funciones

    73 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Se denomina paramtrico porque las funciones necesitan un parmetro para saber qu tipo debe de ser utilizado

    En Java pueden definirse mtodos y clases parametrizadas (slo a partir de la versin 1.5)

    La principal ventaja de la genericidad consiste en la posibilidad de definir colecciones de objetos con comprobacin de tipos en tiempo de compilacin

    Se denomina paramtrico porque las funciones necesitan un parmetro para saber qu tipo debe de ser utilizado

    En Java pueden definirse mtodos y clases parametrizadas (slo a partir de la versin 1.5)

    La principal ventaja de la genericidad consiste en la posibilidad de definir colecciones de objetos con comprobacin de tipos en tiempo de compilacin

  • PolimorfismoPolimorfismo paramtrico

    PolimorfismoPolimorfismo paramtrico

    Colecciones y polimorfismo paramtrico Colecciones y polimorfismo paramtrico

    import java.util.*;

    public class ListaConGenericidad

    Se aade un parmetro entre los smbolos que indica el

    tipo de la coleccin.

    74 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    public class ListaConGenericidad{

    public static void main(String [] args){

    List listaGatos = new ArrayList();listaGatos.add(new Gato());//listaGatos.add(new Coche());

    Gato gato1 = listaGatos.get(0); }

    }

    El mismo parmetro debe aadirse en la llamada al constructor.

    Ahora el compilador hace comprobaciones en tiempo de

    ejecucin. Esta lnea est comentada porque sino dara error

    Los type-cast ya no son necesarios para extraer elementos de una

    coleccin. Existe seguridad de tipos

  • PolimorfismoPolimorfismo paramtrico

    PolimorfismoPolimorfismo paramtrico

    Colecciones y polimorfismo paramtrico Seguridad:

    Realizan comprobaciones de tipo en tiempo de compilacin (en una lista de gatos slo puede haber gatos)

    Se evitan los fallos en tiempo de ejecucin

    Colecciones y polimorfismo paramtrico Seguridad:

    Realizan comprobaciones de tipo en tiempo de compilacin (en una lista de gatos slo puede haber gatos)

    Se evitan los fallos en tiempo de ejecucin

    75 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Se evitan los fallos en tiempo de ejecucin

    Claridad: No necesitamos typecasts para sacar objetos de la

    coleccin

    Comprensibilidad Las colecciones se declaran con un tipo, por lo que hace

    ms claro su uso

    Se evitan los fallos en tiempo de ejecucin

    Claridad: No necesitamos typecasts para sacar objetos de la

    coleccin

    Comprensibilidad Las colecciones se declaran con un tipo, por lo que hace

    ms claro su uso

  • PolimorfismoPolimorfismo paramtrico

    PolimorfismoPolimorfismo paramtrico

    Creacin de clases con polimorfismo paramtrico Los tipos genricos deben ser objetos (no tipos bsicos)

    Creacin de clases con polimorfismo paramtrico Los tipos genricos deben ser objetos (no tipos bsicos)

    class CajaGenerica {

    private T valor;

    public T getValor()

    76 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    public T getValor(){ return valor; }

    public void setValor(T valor){ this.valor = valor; }

    public static void main(String [] args){

    CajaGenerica cajaGato= new CajaGenerica();CajaGenerica cajaInteger= new CajaGenerica();cajaGato.setValor(new Gato());System.out.println("everything is ok");//cajaInteger.setValor(new Gato()); // Error de compilacin

    }

    }

  • PolimorfismoPolimorfismo paramtrico

    PolimorfismoPolimorfismo paramtrico

    Mtodos con genericidad Eliminar de una coleccin de Strings aquellos que sean de

    longitud = 4 Mtodo con polimorfismo de inclusin

    Mtodos con genericidad Eliminar de una coleccin de Strings aquellos que sean de

    longitud = 4 Mtodo con polimorfismo de inclusin

    static void eliminar(Collection c)

    77

    Mtodo con genericidad Mtodo con genericidad

    static void eliminar(Collection c)

    {

    for (Iterator I = c.iterator(); i.hasNext(); )

    if (((String) i.next()).length() == 4)

    i.remove }

    static void eliminar(Collection c)

    {

    for (Iterator I = c.iterator(); i.hasNext(); )

    if (i.next().length() == 4)

    i.remove(); }

  • PolimorfismoPolimorfismo paramtrico

    PolimorfismoPolimorfismo paramtrico

    Otras ventajas de la versin 1.5 Autoboxing / autounboxing

    Los tipos bsicos se convierten automticamente a sus clases asociadas y viceversa

    Foreach Las colecciones pueden recorrerse sin usar iteradores

    Otras ventajas de la versin 1.5 Autoboxing / autounboxing

    Los tipos bsicos se convierten automticamente a sus clases asociadas y viceversa

    Foreach Las colecciones pueden recorrerse sin usar iteradores

    78 Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua

    Las colecciones pueden recorrerse sin usar iteradores No hay una palabra clave foreach por compatibilidad

    Ejemplo: Sumamos de una coleccin de enteros cuntos son iguales a 5

    Las colecciones pueden recorrerse sin usar iteradores No hay una palabra clave foreach por compatibilidad

    Ejemplo: Sumamos de una coleccin de enteros cuntos son iguales a 5

    public int antes(Collection c)

    {

    int num=0;

    for (Iterator i = c.iterator(); i.hasNext();)

    {

    if (i.next().equals(new Integer(5)))

    num++;

    }

    return num;

    }

    public int ahora(Collection c)

    {

    int num=0;

    for (Integer i : c)

    if (i.equals(5))

    num++;

    return num;

    }

  • Polimorfismo ParamtricoGenericidad y subclases

    Polimorfismo ParamtricoGenericidad y subclases