Presentacion Java 1

download Presentacion Java 1

of 127

Transcript of Presentacion Java 1

  • 8/6/2019 Presentacion Java 1

    1/127

    Tema 2: Programaci n orientada aobjetos en Java

    Programaci n orientada aobjetos en Java

    1.Clases de objetos2.Protecci n de miembros3.Protecci n de clases4. Inicializaci n y finalizaci n5.Creaci n de objetos6.Trabajando con objetos7.Relaciones entre objetos8.Clases anidadas e interiores

    9.Autoreferencias10. Aplicaciones orientadas a objetos11. Herencia12. Adicin, redefinici n y anulaci n13. Protecci n y herencia

    14. Herencia m ltiple15. Polimorfismo16. Ligadura din mica17. Informaci n de clases en tiempode ejecuci n18. Otros temas de inter s en Java

  • 8/6/2019 Presentacion Java 1

    2/127

    Clases de objetos

    Clases de objetos Las clases de objetos representan conceptos oentidades significativos en un problema determinado. Una clase describe las caracter sticas comunes de unconjunto de objetos, mediante dos elementos:

    Atributos (o variables miembro, variables de clase) . Describen el estado internode cada objeto

    Operaciones (o m todos, funciones miembro) . Describen lo que se puede hacercon el objeto, los servicios que proporciona

    Programaci n orientada aobjetos en Java

    Atributos

    Operaciones

    Nombre de la claseCuenta

    nmero: Stringtitular: Stringsaldo: FloatinteresAnual: Float

    ingreso(cantidad: Floatl)reintegro(cantidad: Floatl)ingresoInteresMes()enRojos(): BooleanleerSaldo(): Real

  • 8/6/2019 Presentacion Java 1

    3/127

    Durante la ejecuci n de la aplicaci n se producir la

    instanciaci n de la clase, es decir, la creaci n de losobjetos que representan cada uno de los individuoscon sus caracter sticas propias, es decir, valoresespec ficos para sus atributos

    Cuenta

    nmero: Stringtitular: Stringsaldo: FloatinteresAnual: Float

    ingreso(cantidad: Floatl)reintegro(cantidad: Floatl)ingresoInteresMes()enRojos(): BooleanleerSaldo(): Real

    c : Cuenta

    numero=123890023titular=Miguel P rezsaldo=1800.4inter sAnual=0.25

    d : Cuenta

    numero=23900839titular=AntonioGmezsaldo=200inter sAnual=0.25

    e : Cuenta

    numero=151590020titular=JavierS nchezsaldo=1200.2inter sAnual=1.25

    Clase de objetos

    Objetos

    Clases de objetos

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    4/127

    La implementaci n de esta clase en Java se realizar a en un fichero con nombreCuenta.java , y su contenido ser a el siguiente:

    class Cuenta {long numero;String titular;float saldo;float interesAnual;

    void ingreso(float cantidad) { }void reintegro(float cantidad) { }void ingresoInteresMes() { }boolean enRojos() { }float leerSaldo() { }

    }

    Atributos

    Operaciones

    Los atributos pueden ser de cualquiera de los tiposb sicos de Java: boolean , char , byte , short , int, long ,float y double , referencias a otros objetos o arraysde elementos de alguno de los tipos citados

    Clases de objetos

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    5/127

    Al contrario que C++, Java realiza la definici n e

    implementaci n de la clase en el mismo lugar, en unnico fichero .java

    Clases de objetos

    Programaci n orientada aobjetos en Java

    class Cuenta {long numero;String titular;float saldo;float interesAnual;

    void ingreso(float cantidad) {

    saldo += cantidad;}

    void reintegro(float cantidad) {saldo = cantidad;

    }

    void ingresoInteresMes() {saldo += interesAnual * saldo / 1200;

    }

    boolean enRojos() { return saldo < 0; }float leerSaldo() { return saldo; }

    }

  • 8/6/2019 Presentacion Java 1

    6/127

    El acceso a los atributos de la clase desde laimplementaci n de las operaciones se realiza deforma directa Los atributos u operaciones est ticas ( static ) no sonafectados por el proceso de instanciaci n de objetosa partir de la clase De un atributo est tico no se genera una copia porcada objeto que se crea. Existe una nica copiacompartida y accesible desde todos los objetos de laclase Una operaci n est tica nicamente puede acceder amiembros est ticos

    Clases de objetos

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    7/127

    Clases de objetos

    Programaci n orientada aobjetos en Java

    El atributo nOp mantiene una cuenta global del n mero de operacionesrealizadas en las cuentas del banco, para la realizaci n de estad sticas. La

    operaci n leerNOperaciones() permite leer este contadorLa operaci n eurosAPesetas() es una operaci n auxiliar de la clase Cuenta para

    ser usada cuando sea necesaria una conversi n de moneda

    class Cuenta {long numero;String titular;

    float saldo;float interesAnual;

    // Contador de operacionesstatic int nOp = 0;

    static int leerNOperaciones() { return nOp; }

    // Operaci n est tica auxiliar de conversi nstatic long eurosAPesetas(float euros) { return euros * 166.386f; }

    void ingreso(float cantidad) { saldo += cantidad; ++nOp; }

    void reintegro(float cantidad) { saldo = cantidad; ++nOp; }}

  • 8/6/2019 Presentacion Java 1

    8/127

    Protecci n de miembros de la clase El principio de ocultaci n de informaci n se plasmaen los lenguajes OO en diversos mecanismos deprotecci n de los miembros de la clase

    UML permite asociar tres niveles de protecci

    ndiferentes a cada miembro de la clase: Miembros p blicos (+). Sin ning n tipo de protecci n especial Miembros privados ( ). Inaccesibles desde el exterior de la clase Miembros protegidos (#). Similares a los privados aunque se permite su accesodesde las clases descendientes*

    * Las veremos m s adelante, al estudiar el mecanismo de la herencia

    Clase

    atributoPrivado: Tipo+atributoPublico: Tipo#atributoProtegido: Tipo

    operacionPrivada()+operacionPublica()#operacionProtegida()

    Programaci n orientada aobjetos en Java

    Protecci

    n demiembros

  • 8/6/2019 Presentacion Java 1

    9/127

    class Cuenta {private long numero;

    private String titular;private float saldo;private float interesAnual;

    public void ingreso(float cantidad) {

    saldo += cantidad;}

    public void reintegro(float cantidad) {saldo = cantidad;

    }

    public void ingresoInteresMes() {saldo += interesAnual * saldo / 1200;

    }

    public boolean enRojos() { return saldo < 0; }public float leerSaldo() { return saldo; }

    }

    Programaci n orientada aobjetos en Java

    Protecci

    n demiembros

    En Java un miembro se etiqueta como p blico colo

    cando el identificador public delante de su declaraci n Para los miembros privados utilizaremos elidentificador private

    Cuenta

    numero: Longtitular: Stringsaldo: Floatinter sAnual: Real

    +ingreso(cantidad: Integer)

    +reintegro(cantidad: Integer)+ingresoInteresMes()+enRojos(): Boolean+leerSaldo(): Integer

  • 8/6/2019 Presentacion Java 1

    10/127

    Programaci n orientada aobjetos en Java

    Protecci

    n demiembros

    Los miembros no etiquetados son accesibles por parte

    de clases amigas . En C++ y otros lenguajes OO lasclases amigas a una dada pueden indicarseexpl citamente En Java se consideran amigas todas aquellas que

    forman parte del mismo paquete Un fichero fuente java forma en s un paquete y por tanto todas las clases incluidasen l son amigas

    Las clases incluidas en varios ficheros fuente pueden agruparse en un nicopaquete indicando el nombre de paquete al principio de cada fichero mediante elindicador package

    package prueba;

    class A {...

    }

    class B {...

    }

    package prueba;

    class C {...

    }

    class D {...

    }

    class E {...

    }

    Las clases A, B y C son amigas al perteneceral mismo paquete prueba

    Las clases D y E son amigas al pertenecer almismo fichero fuente

  • 8/6/2019 Presentacion Java 1

    11/127

    Programaci n orientada aobjetos en Java

    Protecci n demiembros

    En este ejemplo, las clases Cuenta y Banco son amigas al pertenecer al mismofichero fuente. El acceso a los atributos de los objetos de la clase Cuenta almacenados

    en el vector interno de Banco queda as garantizado. El atributo saldo puedemantenerse como privado puesto que existe una operaci n que permite obtener suvalor:

    class Cuenta {long numero;String titular;private float saldo;float interesAnual;

    public void ingreso(float cantidad) {

    saldo += cantidad;}

    public void reintegro(float cantidad) {saldo = cantidad;

    }

    public void ingresoInteresMes() {saldo += interesAnual * saldo / 1200;

    }

    public boolean enRojos() { return saldo < 0; }public float leerSaldo() { return saldo; }

    }

    class Banco {Cuenta[] c; // vector de cuentas

    ...}

  • 8/6/2019 Presentacion Java 1

    12/127

    Atenci n: todas las clases que no se declaren como

    pertenecientes a ning n paquete de forma expl cita,pertenecen a un paquete por defecto y por tanto sonamigas Un paquete crea un espacio de nombres propios. Esto

    significa que la clase pasa a tener como prefijo elpropio nombre del paquete. A la hora de utilizarlatenemos tres opciones:

    Utilizar su nombre completo: prueba.A Importar esa clase, para poder utilizarla sin el prefijo. Esto se indica al principio del

    cdigo fuente mediante import prueba.A Importar directamente todas las clases del paquete, que se usar an sin prefijo:

    import prueba.*

    Programaci n orientada aobjetos en Java

    Protecci n demiembros

  • 8/6/2019 Presentacion Java 1

    13/127

    Un paquete puede estar situado dentro de otro

    paquete formando estructuras jer rquicas. Ejemplo:miapp.prueba.A Java obliga a que exista una correspondencia entre laestructura de paquetes de una clase y la estructura de

    directorios donde est situada La raiz de la estructura de directorios debe estarincluida en el classpath de Java (par metro cp )

    Las clases miapp.prueba.A , miapp.prueba.B y miapp.C deben estar en la siguienteestructura de directorios:

    Programaci n orientada aobjetos en Java

    Protecci n demiembros

    A

    B C

    pruebamiapp

  • 8/6/2019 Presentacion Java 1

    14/127

    Por protecci n de clases entendemos un nivel superiorde la ocultaci n de informaci n, a nivel de clases. Esdecir, se trata de especificar que clases pueden ser

    utilizadas y cuales no, y por qui

    n Dentro de un paquete, las clases son amigas y portanto no existen restricciones respecto a la utilizaci nde una clase por las otras

    Sin embargo, desde el punto de vista del exterior,nicamente podr n ser utilizadas las clases p blicas del paquete, es decir, aquellas con el identificadorpublic situado delante de su declaraci n

    Programaci n orientada aobjetos en Java

    Protecci n de clases

    Protecci n de clases

  • 8/6/2019 Presentacion Java 1

    15/127

    Atenci n: Java s lo permite una clase p blica por

    fichero fuente, y el nombre de la clase y el ficherodeben coincidir obligatoriamente

    Programaci n orientada aobjetos en Java

    Protecci n de clases

    En nuestro ejemplo, si queremos que la clase Cuenta pueda ser utilizada desde elexterior del fichero Cuenta.java deberemos declararla como p blica

    public class Cuenta {private long numero;private String titular;private float saldo;private float interesAnual;

    public void ingreso(float cantidad) {

    saldo += cantidad;}

    public void reintegro(float cantidad) {saldo = cantidad;

    }

    public void ingresoInteresMes() {saldo += interesAnual * saldo / 1200;

    }

    public boolean enRojos() { return saldo < 0; }public float leerSaldo() { return saldo; }

    }

  • 8/6/2019 Presentacion Java 1

    16/127

    La iniciaci n de los atributos de la clase se realiza enJava, al igual que en C++, mediante el uso de constructores cuyo nombre coincide con el de la clase

    Programaci n orientada aobjetos en Java

    Inicializaci n yfinalizaci n

    Inicializaci n y finalizaci n

    public class Cuenta {private long numero;private String titular;private float saldo;private float interesAnual;

    Cuenta(long aNumero, String aTitular, float aInteresAnual) {numero = aNumero;titular = aTitular;

    saldo = 0;interesAnual = aInteresAnual;

    }

    public void ingreso(float cantidad) {saldo += cantidad;

    }

    // Resto de operaciones de la clase Cuenta a partir de aqu

  • 8/6/2019 Presentacion Java 1

    17/127

    Java permite la sobrecarga de operaciones , por tanto

    se pueden definir varios constructores posible para unaclase siempre que se diferencien en la lista deargumentos

    Programaci n orientada aobjetos en Java

    Inicializaci n yfinalizaci n

    // Importar todas las clases del paquete java.ioimport java.io.*;

    public class Cuenta {private long numero;private String titular;private float saldo;private float interesAnual;

    // Constructor generalCuenta(long aNumero, String aTitular, float aInteresAnual) {

    numero = aNumero;titular = aTitular;saldo = 0;interesAnual = aInteresAnual;

    }

    P i i d

  • 8/6/2019 Presentacion Java 1

    18/127

    Programaci n orientada aobjetos en Java

    Inicializaci n yfinalizaci n

    // Constructor para obtener los datos de la cuenta de un ficheroCuenta(long aNumero) throws FileNotFoundException, IOException,

    ClassNotFoundException {

    FileInputStream fis = new FileInputStream(aNumero + .cnt);ObjectInputStream ois = new ObjectInputStream(fis);numero = aNumero;titular = (String) ois.readObject();saldo = ois.readFloat();interesAnual = ois.readFloat();ois.close();

    }

    public void ingreso(float cantidad) {saldo += cantidad;

    }

    public void reintegro(float cantidad) {saldo = cantidad;

    }

    public void ingresoInteresMes() {saldo += interesAnual * saldo / 1200;

    }

    public boolean enRojos() { return saldo < 0; }public float leerSaldo() { return saldo; }

    }

    Nota: v ase el apartado I/O: Reading and Writing del tutorial Java de Sun como apoyo para entenderel c digo del nuevo constructor

    P i i t d

  • 8/6/2019 Presentacion Java 1

    19/127

    Programaci n orientada aobjetos en Java

    Inicializaci n yfinalizaci n

    Si no se proporciona ning n constructor, Java

    proporciona autom

    ticamente un constructor pordefecto , que no recibe argumentos y realiza unainicializaci n por defecto de los atributos Una vez implementado un constructor propio por parte

    del programador, Java elimina dicho constructor,aunque puede ser definido nuevamente de maneraexpl cita

    Cuenta() {numero = 00000000;titular = ninguno;saldo = 0;interesAnual = 0;

    }

    Programaci n orientada a

  • 8/6/2019 Presentacion Java 1

    20/127

    Programaci n orientada aobjetos en Java

    Inicializaci n yfinalizaci n

    Naturalmente los constructores pueden ser marcados

    como p

    blicos, privados, protegidos o con acceso anivel de paquete, lo que especificar quien puede crearobjetos de esta clase y de que manera

    // Constructor general

    public Cuenta(long aNumero, String aTitular, float aInteresAnual) {numero = aNumero;titular = aTitular;saldo = 0;interesAnual = aInteresAnual;

    }

    // Constructor para obtener los datos de la cuenta de un ficheropublic Cuenta(long aNumero) throws FileNotFoundException,

    IOException, ClassNotFoundException {FileInputStream fis = new FileInputStream(aNumero + .cnt);

    ObjectInputStream ois = new ObjectInputStream(fis);numero = aNumero;titular = (String)ois.readObject();saldo = ois.readFloat();interesAnual = ois.readFloat();ois.close();

    }

    Programaci n orientada a

  • 8/6/2019 Presentacion Java 1

    21/127

    Programaci n orientada aobjetos en Java

    Inicializaci n yfinalizaci n

    Cuando finaliza el uso de un objeto, es frecuente la

    realizaci

    n de ciertas tareas antes de su destrucci

    n,principalmente la liberaci n de la memoria solicitadadurante su ejecuci n. Esto se realiza en C++ y otroslenguajes OO en los denominados destructores

    Estos destructores son operaciones invocadasautom ticamente justo antes de la destrucci n delobjeto Sin embargo, en Java la liberaci n de memoria se

    realiza de manera autom

    tica por parte del recolectorde basura, por tanto la necesidad de este tipo deoperaciones no existe en la mayor parte de los casos

    Programaci n orientada a

  • 8/6/2019 Presentacion Java 1

    22/127

    Programaci n orientada aobjetos en Java

    Inicializaci n yfinalizaci n

    Sin embargo s puede ser necesario realizar alguna

    tarea no relacionada con la liberaci

    n de memoriaantes de la destrucci n del objeto, como por ejemplosalvar el estado de la clase en un fichero o base dedatos

    Java permite introducir c

    digo para este finimplementando una operaci n pblica especialdenominada finalize . Esta operaci n es invocadaautom ticamente antes de la destrucci n del objeto por

    parte del recolector de basura

    Programaci n orientada a

  • 8/6/2019 Presentacion Java 1

    23/127

    Programaci n orientada aobjetos en Java

    Inicializaci n yfinalizaci n

    Siguiendo nuestro ejemplo, vamos asegurarnos de que el estado de una cuentaqueda salvado en disco antes de su destrucci n, para poder ser recuperadaposteriormente. Para ello introducimos el c digo de escritura en fichero en laoperaci n finalize de la clase Cuenta

    public void finalize() : throws FileNotFoundException, IOException {

    FileOutputStream fos = new FileOutputStream(numero + .cnt);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(titular);oos.writeFloat(saldo);oos.writeFloat(interesAnual);oos.close();

    }

    Problema: no es posible saber con seguridad en quemomento ser invocada finalize , puesto que elrecolector de basura puede decidir su eliminaci n en unmomento indeterminado, e incluso no ser eliminadohasta el final de la ejecuci n de la aplicaci n

    Programaci n orientada a

  • 8/6/2019 Presentacion Java 1

    24/127

    Una posible soluci n es ordenar al recolector de

    basura que realice una limpieza de memoria inmediata,para asegurar la finalizaci n de los objetos. Esto serealiza mediante Runtime.getRuntime().gc() Por motivos de eficiencia, lo anterior es poco

    recomendable, sobre todo si se hace con frecuencia Una mejor opci n es definir una operaci n ordinariacon este mismo prop sito, a llamar de manera expl citacuando haya finalizado el uso del objeto

    Introduciremos en la clase Cuenta una operaci n pblica salvar en lugar de finalize ,con la misma implementaci n. Tras finalizar las operaciones sobre la cuenta,invocaremos a salvar para guardar los cambios realizados

    gobjetos en Java

    Inicializaci n yfinalizaci n

    Programaci n orientada a

  • 8/6/2019 Presentacion Java 1

    25/127

    objetos en Java

    Creaci n de objetos

    Creaci n de objetos

    En Java los objetos se crean nicamente de formadin mica. Para ello se utiliza el operador new , demanera similar a C++

    Los objetos en Java se utilizan siempre a trav

    s dereferencias . Las referencias son similares a lospunteros de C/C++, aunque su uso es mucho m ssencillo

    Por tanto los pasos a seguir en la creaci

    n de unobjeto son: Declarar una referencia a la clase Crear un objeto mediante el operador new invocando al constructor adecuado Conectar el objeto con la referencia

    Programaci n orientada a

  • 8/6/2019 Presentacion Java 1

    26/127

    objetos en Java

    Creaci

    n de objetos

    La creaci n de un objeto de la clase Cuenta se realizar a de la siguiente forma:

    Cuenta c; // Una referencia a un objeto de la clase Cuentac = new Cuenta(18400200, Pedro Jim nez, 0.1f);

    En cambio, los tipos b sicos (int, long, float, etc.) s pueden ser creados directamente en la pila. Esto esposible porque Java no los implementa realmente comoclases de objetos, por motivos de eficiencia ycomodidad, ya que su uso es muy frecuente

    Cuenta c;float in;long num;

    in = 0.1f;num = 18400200;

    c = new Cuenta(num, Pedro Jim nez, in);

    Programaci n orientada a

  • 8/6/2019 Presentacion Java 1

    27/127

    objetos en Java

    Creaci

    n de objetos

    Las cadenas de caracteres se implementan con unaclase ( String ). Sin embargo no suele ser necesaria sucreaci n de manera expl cita, ya que Java lo hace demanera autom tica al asignar una cadena constante*

    String s; // Una referencia a un objeto de la clase String

    // Conexi n de la referencia s con un objeto String// creado din micamente e inicializado con la constante Pedros = Pedro;

    // Ser a equivalente a:// char[] cc = {'P', 'e', 'd', 'r', 'o'}// s = new String(cc);

    * V ase el apartado Characters and Strings del tutorial de Java de Sun para m s informaci n

    Los arrays tambi n deben ser creados din micamentecon new como si fueran objetos

    int[] v; // Una referencia a un vector de enterosv = new int[10] // Creaci n de un vector de 10 enteros

    Programaci n orientada ab

  • 8/6/2019 Presentacion Java 1

    28/127

    objetos en Java

    Creaci

    n de objetos

    Si el array es de referencias a objetos, habr que crearadem s cada uno de los objetos referenciados porseparado

    La destrucci n de los objetos se realiza de maneraautom tica cuando el recolector de basura detecta queel objeto no est siendo usado, es decir, no est conectado a ninguna referencia

    Cuenta[] v; // Un vector de referencias a objetos de la clase Cuentaint c;

    v = new Cuenta[10] // Crear espacio para 10 referencias a cuentasfor (c = 0; c < 10; c++)

    v[c] = new Cuenta(18400200 + c, Cliente n. + c, 0.1f);

    Cuenta c1 = new Cuenta(18400200, Cliente 1, 0.1f);Cuenta c2 = new Cuenta(18400201, Cliente 2, 0.1f);

    c1 = c2// El objeto asociado a la cuenta 18400200 ha// quedado desconectado y ser eliminado por el// recolector de basura

    Programaci n orientada abj t J

  • 8/6/2019 Presentacion Java 1

    29/127

    objetos en Java

    Trabajando conobjetos

    Trabajar con un objeto Java es similar a C++, aunquelas referencias permiten un uso mucho m s sencillo

    Trabajando con objetos

    Cuenta c1 = new Cuenta(18400200, Pedro Jim nez, 0.1f);Cuenta c2 = new Cuenta(18400201);

    c2.reintegro(1000);c1.ingreso(500);

    if (c2.enRojos())System.out.println(Atenci n: cuenta 18400201 en n meros rojos);

    System.out.println(Saldo actual de la cuenta 18400201: + c1.leerSaldo());

    c1 = new Cuenta(18400202);// El objeto asociado a la Cuenta 18400200 queda desconectadoc1.ingreso(500);

    System.out.println(Saldo actual de la cuenta 18400202: + c1.leerSaldo());

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    30/127

    objetos en Java

    Trabajando conobjetos

    En este ejemplo se pide un n mero de cuenta al usuario y una cantidad a retirar. Acontinuaci n se carga la cuenta solicitada y se realiza el reintegro

    BufferedReader br = new BufferedReader(InputStreamReader(System.in));

    long nc;float mi;try {

    System.out.println(Introduzca n m. de de cuenta: );nc = Long.parseLong(br.readLine());

    System.out.println(Introduzca importe a retirar: );mi = Float.parseFloat(br.readLine());

    }catch(Exception e) {System.out.println(Error al leer datos);return;

    }

    Cuenta c;try {

    c = new Cuenta(nc);}catch(Exception e) {

    System.out.println(Imposible recuperar cuenta);return;

    }

    if (c.leerSaldo() < mi)System.out.println(Saldo insuficiente);

    elsec.reintegro(mi);

    c.salvar();

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    31/127

    objetos en Java

    Trabajando con

    objetos

    Naturalmente el compilador producir un error ante

    cualquier acceso ilegal a un miembro de la claseCuenta c = new Cuenta(18400200, Pedro Jim nez, 0.1f);

    c.saldo = 1000;

    Cuenta.java:XX: saldo has private access

    c.saldo = 1000;^

    1 error

    El acceso a un miembro est tico se realiza utilizandoel nombre de la clase en lugar de un objeto

    Cuenta c = new Cuenta(18400200, Cliente 1, 0.1f);

    c.ingreso(1000);int pts = Cuenta.eurosAPesetas(c.leerSaldo());

    System.out.println(Saldo: + c.leerSaldo() + ( + pts + pesetas);

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    32/127

    Relaciones entre objetos

    objetos en Java

    Relaciones entre

    objetos

    Un conjunto de objetos aislados tiene escasacapacidad para resolver un problema. En unaaplicaci n real los objetos colaboran e intercambianinformaci n, existiendo distintos tipos de relacionesentre ellos A nivel de dise o, podemos distinguir entre 5 tipos derelaciones b sicas entre clases de objetos:dependencia , asociaci n, agregaci n, composici n yherencia*

    * La veremos m s adelante, en un apartado espec fico

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    33/127

    objetos en Java

    Relaciones entre

    objetos

    La dependencia es la relaci n menos importante.Simplemente refleja que la implementaci n de unaclase depende de otra Una dependencia puede indicar la utilizaci n de unobjeto de una clase como argumento de una operaci nde otra o en su implementaci n

    Como vimos anteriormente, la clase Cuenta requiere las clases FileOutputStream yObjectOutputStream de la librer a de clases de Java para la implementaci n de laoperaci n salvar

    java.io.FileOutputStream

    java.io.ObjectOutputStream

    Cuenta

    numero: Longtitular: Stringsaldo: Floatinter sAnual: Float

    +ingreso(cantidad: Integer)+reintegro(cantidad: Integer)+ingresoInteresMes()+enRojos(): Boolean+leerSaldo(): Integer+salvar()

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    34/127

    j

    Relaciones entre

    objetos

    En cambio, la asociaci n es la relaci n m s importantey com n. Refleja una relaci n entre dos clasesindependientes que se mantiene durante la vida de losobjetos de dichas clases o al menos durante un tiempoprolongado En UML suele indicarse el nombre de la relaci n, elsentido de dicha relaci n y las cardinalidades en losdos extremos

    Vamos a sustituir el atributo titular por una asociaci n con una nueva clase Clientecompleta

    titular1

    Cuenta

    numero: Longsaldo: Floatinter sAnual: Float

    +ingreso(cantidad: Integer)+reintegro(cantidad: Integer)+ingresoInteresMes()+enRojos(): Boolean+leerSaldo(): Integer+leerTitular(): Cliente+salvar()

    Cliente

    nombre: Stringapellidos: Stringdirecci n: Stringlocalidad: StringfNacimiento: Date

    +nombreCompleto(): String+direccionCompleta(): String

    *

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    35/127

    Relaciones entre

    objetos

    Una asociaci n se implementa en Java introduciendoreferencias a objetos una clase como atributos en laotra Si la relaci n tiene una cardinalidad superior a unoentonces ser necesario utilizar un array dereferencias. Tambi n es posible utilizar una estructurade datos din mica del paquete java.util como Vector oLinkedList para almacenar las referencias Normalmente la conexi n entre los objetos se realizarecibiendo la referencia de uno de ellos en elconstructor o una operaci n ordinaria del otro

    Programaci n orientada aobjetos en Java

    public class Cliente {

  • 8/6/2019 Presentacion Java 1

    36/127

    Relaciones entre

    objetos

    public class Cuenta {private long numero;private Cliente titular;private float saldo;private float interesAnual;

    // Constructor generalpublic Cuenta(long aNumero, Cliente aTitular, float aInteresAnual) {

    numero = aNumero;titular = aTitular;saldo = 0;interesAnual = aInteresAnual;

    }

    Cliente leerTitular() { return titular; }

    // Resto de operaciones de la clase Cuenta a partir de aqu

    public class Cliente {private String nombre, apellidos;private String direccion, localidad;private Date fNacimiento;

    Cliente(String aNombre, String aApellidos, String aDireccion,String aLocalidad, Date aFNacimiento) {nombre = aNombre;apellidos = aApellidos;direccion = aDireccion;localidad = aLocalidad;fNacimiento = aFNacimiento;

    }

    String nombreCompleto() { return nombre + + apellidos; }String direccionCompleta() { return direccion + , + localidad; }

    }

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    37/127

    Relaciones entre

    objetos

    La agregaci n es un tipo especial de asociaci n donde

    se a ade el matiz sem ntico de que la clase de dondeparte la relaci n representa el todo y las clasesrelacionadas las partes Realmente Java y la mayor a de lenguajes orientados

    a objetos no disponen de una implementaci n especialpara este tipo de relaciones. B sicamente se tratancomo las asociaciones ordinarias

    Pol gonoformado por

    2 *Segmento

    Departamentodispone de

    1 *Despacho

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    38/127

    La composici n es un tipo de agregaci n que a ade el

    matiz de que la clase todo controla la existencia de lasclases parte. Es decir, normalmente la clase todocrear al principio las clases parte y al final seencargar de su destrucci n

    Supongamos que a adimos un registro de movimientos a la clase Cuenta, de formaque quede constancia tras cada ingreso o reintegro

    titular1

    Cuenta

    numero: Longsaldo: Floatinter sAnual: Float

    +ingreso(cantidad: Integer)

    +reintegro(cantidad: Integer)+ingresoInteresMes()+enRojos(): Boolean+leerSaldo(): Integer+leerTitular(): Cliente+salvar()

    Cliente

    nombre: Stringapellidos: Stringdirecci n: Stringlocalidad: String

    fNacimiento: Date

    +nombreCompleto(): String+direccionCompleta(): String

    *

    registra

    *

    Movimiento

    fecha: Datetipo: Charimporte: Realsaldo: Real Relaciones entre

    objetos

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    39/127

    Las composiciones tienen una implementaci n similar

    a las asociaciones, con la diferencia de que el objetoprincipal realizar en alg n momento la construcci n delos objetos compuestosimport java.util.Date

    class Movimiento {Date fecha;char tipo;float importe;float saldo;

    public Movimiento(Date aFecha, char aTipo, float aImporte, float aSaldo) {fecha = aFecha;tipo = aTipo;

    importe = aImporte;saldo = aSaldo;}

    }

    Relaciones entre

    objetos

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    40/127

    Relaciones entre

    objetos

    public class Cuenta {private long numero;private Cliente titular;private float saldo;private float interesAnual;private LinkedList movimientos; // Lista de movimientos

    // Constructor generalpublic Cuenta(long aNumero, Cliente aTitular, float aInteresAnual) {

    numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;movimientos = new LinkedList();

    }

    // Nueva implementaci n de ingreso y reintegropublic void ingreso(float cantidad) {movimientos.add(new Movimiento(new Date(), 'I', cantidad, saldo += cantidad));

    }

    public void reintegro(float cantidad) {movimientos.add(new Movimiento(new Date(), 'R', cantidad, saldo = cantidad));

    }

    public void ingresoInteresMes() { ingreso(interesAnual * saldo / 1200); }

    // Resto de operaciones de la clase Cuenta a partir de aqu

    Nota: tambi n ser a necesario modificar el otro constructor y la operaci n salvar para tener en cuenta la lista de movimientosa la hora de leer/escribir la informaci n de la Cuenta en disco

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    41/127

    Clases anidadas e interiores Java y algunos otros lenguajes OOP permiten ladefinici n de una clase de objetos dentro de otra, conuna doble utilidad: Organizar mejor el c digo . Empaquetar en una clase principal otras que no tienenutilidad o sentido fuera del contexto de sta Evitar colisiones de nombres . La clase principal define un espacio de nombres al quepertenecen las anidadas Al igual que cualquier otro miembro de una clase, unaclase anidada puede ser est tica o no est tica y utilizar

    los niveles de protecci

    n public, private y protected El tipo de clase anidamiento m s sencillo es aquel enque la clase contenida se declara como est tica

    Clases anidadas e

    interiores

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    42/127

    Clases anidadas e

    interiores

    Desde el punto de vista de la organizaci n del c digo, tendr a mucho m s sentidointroducir la clase Movimiento en el interior de Cuenta . Al ser declarada como privada,se impedir a su utilizaci n desde el exterior

    import java.util.Date

    public class Cuenta {private long numero;private Cliente titular;private float saldo;private float interesAnual;private LinkedList movimientos; // Lista de movimientos

    static private class Movimiento {Date fecha;char tipo;float importe;float saldo;

    public Movimiento(Date aFecha, char aTipo, float aImporte, float aSaldo) {fecha = aFecha; tipo = aTipo; importe = aImporte; saldo = aSaldo;

    }}

    // Constructor generalpublic Cuenta(long aNumero, Cliente aTitular, float aInteresAnual) {

    numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;movimientos = new LinkedList();

    }

    // Resto de operaciones de la clase Cuenta a partir de aqu

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    43/127

    Clases anidadas e

    interiores

    Cuando la clase anidada no es est tica, se denomina

    clase interior y tiene caracter sticas especiales: Pueden ser creadas nicamente dentro de la clase continente Tiene acceso completo y directo a todos los atributos y operaciones del objeto que

    realiza su creaci n Los objetos de la clase interior quedan ligados

    permanentemente al objeto concreto de la clasecontinente que realiz su creaci n No debe confundirse este elemento con la relaci n decomposici n, aunque en muchos casos es posible

    utilizar clases interiores para la implementaci n de estetipo de relaciones

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    44/127

    Clases anidadas e

    interiores

    Implementando la clase Movimiento como una clase interior es posible copiar elvalor del saldo actual de la cuenta que realiza el movimiento de manera directa

    import java.util.Date

    public class Cuenta {private long numero;private Cliente titular;private float saldo, interesAnual;private LinkedList movimientos; // Lista de movimientos

    private class Movimiento {

    Date fecha;char tipo;float importe, saldoMov;

    public Movimiento(Date aFecha, char aTipo, float aImporte) {fecha = aFecha;tipo = aTipo;importe = aImporte;saldoMov = saldo; // Cop amos el saldo actual

    }}

    // Sigue la implementaci n de la clase Cuenta

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    45/127

    Clases anidadas e

    interiores

    // Constructor generalpublic Cuenta(long aNumero, Cliente aTitular, float aInteresAnual) {

    numero = aNumero; titular = aTitular; saldo = 0;interesAnual = aInteresAnual;movimientos = new LinkedList();

    }

    // Nueva implementaci n de ingreso y reintegropublic void ingreso(float cantidad) {

    saldo += cantidad;movimientos.add(new Movimiento(new Date(), 'I', cantidad));

    }

    public void reintegro(float cantidad) {saldo = cantidad;movimientos.add(new Movimiento(new Date(), 'R', cantidad));

    }

    public void ingresoInteresMes() { ingreso(interesAnual * saldo / 1200); }public boolean enRojos() { return saldo < 0; }

    public float leerSaldo() { return saldo; }}

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    46/127

    Autoreferencias

    Autoreferencias En ocasiones es necesario obtener una referencia enla implementaci n de una operaci n al propio objetosobre el que ha sido invocada la operaci n Esta referencia se obtiene en C++ y Java mediante eloperador this Cuando encontremos this en una expresi n, podremossustituirlo mentalmente por este objeto Aunque no es necesario, podemos utilizar this parallamar desde la implementaci n de una operaci n aotra operaci n del mismo objeto

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    47/127

    Autoreferencias

    La llamada a la operaci n ingreso desde ingresoInteresMes() puede realizarseutilizando this como referencia del objeto sobre el que se invoca la operaci n

    En este ejemplo, el uso de this es realmente til. Nos permite implementar laoperaci n transferirDesde() llamando a una operaci n transferirHasta() , previamenteimplementada

    public class Cuenta {

    private long numero;private Cliente titular;private float saldo, interesAnual;

    public void ingresoInteresMes() { this.ingreso(interesAnual * saldo / 1200); }

    // Resto de las operaciones de la clase Cuenta

    public class Cuenta {private long numero;private Cliente titular;private float saldo, interesAnual;

    public void transferirHasta(Cuenta c, float cant) {

    reintegro(cant); c.ingreso(cant);}public void transferirDesde(Cuenta c, float cant) {

    c.transferirHasta(this, cant);}// Resto de las operaciones de la clase Cuenta

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    48/127

    Autoreferencias

    Otra utilidad de this en Java es realizar una llamada aun constructor desde otro constructor

    Pero atenci n: un constructor no es una operaci nordinaria. nicamente puede llamarse a un constructordesde otro constructor y debe ser la primera instrucci ndentro de la implementaci n

    public class Cuenta {private long numero;private Cliente titular;private float saldo, interesAnual;

    // Constructor generalpublic Cuenta(long aNumero, Cliente aTitular, float aInteresAnual) {

    numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;movimientos = new LinkedList();

    }

    // Constructor espec fico para cuentas de ahorro (interesAnual = 0.1%)public Cuenta(long aNumero, Cliente aTitular) {

    this(aNumero, aTitular, 0.1);}

    // Resto de la clase Cuenta

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    49/127

    Aplicaciones

    orientadas a objetos

    Aplicaciones orientadas a objetos

    En una aplicaci n orientada a objetos debe existir unaclase que represente la propia aplicaci n. Este ser a elpunto donde comenzar a la ejecuci n de la misma En lenguajes no totalmente orientados como C++ en lafuncin main se crea una instancia de esta clase y sellama a alguna operaci n como ejecutar para arrancarla aplicaci n. Sin embargo esto no es obligatorio, y unmal programador puede realizar una aplicaci n h brida,con c digo no orientado a objetos

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    50/127

    Aplicaciones

    orientadas a objetos

    En un lenguaje orientado a objetos puro como Javaesta clase de aplicaci n es obligatoria. La m quina virtual Java se encarga de instanciar estaclase y llamar a una operaci n especial con nombremain . La existencia de esta operaci n especial es loque caracteriza a la clase de aplicaci n

    La clase de aplicaci n debe ser p blica y no tener ning n constructor o unconstructor por defecto Al menos debe implementar la operaci n main , con la siguiente declaraci n: public

    static main(String[] args)

    public class BancoApp {public static void main(String[] args) {

    Cuenta c1 = new Cuenta(18400200, Pedro Jim nez, 0.1f);

    c1.ingreso(1000);

    System.out.println(Ingreso realizado);}

    }

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    51/127

    A la hora de ejecutar la aplicaci n, deber indicarseesta clase a la m quina virtual Java

    Tras compilar los ficheros de la ltima versi n de nuestro ejemplo: Cliente.java ,Cuenta.java y BancoApp.java obtendremos los ficheros en byte code:Cliente.class , Cuenta.class , Movimiento.class y BancoApp.class

    Finalmente, pasando la clase BancoApp.class a la m quina virtual java pondremosen funcionamiento la aplicaci n

    $lsBancoApp.java Cliente.java Cuenta.java$javac *.java$lsBancoApp.class Cliente.class Cuenta.class Movimiento.classBancoApp.java Cliente.java Cuenta.java$java CuentaException in thread main java.lang.NoSuchMethodError: main$java BancoAppTransferencia realizada$

    La m quina virtual javaproducir un error si sele pasa una clase sinla operaci n main

    Nota: Las clases que constituyen una aplicaci n Java tambi n pueden distribuirse de manera mucho m s compactaen un nico fichero JAR. Cons ltese la bibliograf a para ver como crean y utilizan estos ficheros

    Aplicaciones

    orientadas a objetos

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    52/127

    La herencia es un mecanismo de la OOP que permiteconstruir una clase incorporando de manera impl citatodas las caracter sticas de una clase previamenteexistente. Las razones que justifican su necesidad son

    variadas: Modelado de la realidad . Son frecuentes las relaciones de

    especializaci n/generalizaci n entre las entidades del mundo real, por tanto eslgico que dispongamos de un mecanismo similar entre las clases de objetos

    Evitar redundancias . Toda la funcionalidad que aporta una clase de objetos esadoptada de manera inmediata por la clase que hereda, por tanto evitamos larepetici n de c digo entre clases semejantes

    Facilitar la reutilizaci n. Una clase no tiene por qu limitarse a recibir una serie decaracter sticas de otra clase por herencia de forma pasiva. Tambi n disponen decierto margen de adaptaci n de estas caracter sticas

    Soporte al polimorfismo

    Herencia

    Herencia

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    53/127

    Sea una clase A. Si una segunda clase B hereda de A entonces decimos:

    A es un ascendiente o superclase de B . Si la herencia entre A y B es directadecimos adem s que A es la clase padre de B

    B es un descendiente o subclase de A. Si la herencia entre A y B es directadecimos adem s que B es una clase hija de A

    Herencia

    En Java, Eiffel, Smalltalk y otros lenguajes orientadosa objetos puros, todas las clases heredanautom ticamente de una superclase universal. En Javaesta superclase se denomina Object

    A

    B

    C D

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    54/127

    Existen diferentes situaciones en las que puedeaplicarse herencia:

    Especializaci n. Dado un concepto B y otro concepto A que representa unaespecializaci n de A, entonces puede establecerse una relaci n de herencia entrelas clases de objetos que representan a A y B. En estas situaciones, el enunciadoA es un B suele ser aplicable

    Herencia

    Extensi n. Una clase puede servir para extender la funcionalidad de unasuperclase sin que represente necesariamente un concepto m s espec fico

    Veh culo

    Coche

    Empleado

    Contable

    Figura

    Cuadrado

    ListaSalvable

    recuperar()salvar()

    registra

    *

    Movimiento

    fecha: Datetipo: Charimporte: Realsaldo: Real

    ListaCuenta

    CuentaConHistorico

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    55/127

    Especificaci n. Una superclase puede servir para especificar la funcionalidadmnima com n de un conjunto de descendientes. Existen mecanismos para obligar

    a la implementaci n de una serie de operaciones en estos descendientes

    Construcci n. Una clase puede construirse a partir de otra, simplemente porque lahija puede aprovechar internamente parte o toda la funcionalidad del padre,aunque representen entidades sin conexi n alguna

    Lista

    Pila

    LneaTexto Cuadrado

    ObjetoGr fico

    seleccionar()mover()escalar()cambiarColor()pintar()

    Herencia

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    56/127

    Cuenta

    numero: Longtitular: Stringsaldo: Floatinteres: Float

    ingreso()ingresoInteresMes()leerSaldo()transferirHasta()

    CuentaCorriente

    reintegro()

    PlanPensiones

    vencimiento:Date

    cotizacion: FloatnumCuentaOrigen: String

    CuentaAhorroPFijo

    vencimiento: Date

    ingresoMes()

    Ejemplos de herencia: Distintos tipos de cuentas bancarias

    Herencia

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    57/127

    Elementos de una interfaz de usuario

    Herencia

    Figura

    x, y: Integer

    mover(nx: Integer, ny: Integer)

    Rect ngulo

    ancho, alto: Integer

    escalar(nx: Integer, ny: Integer

    Ventana

    titulo: String

    pintar()

    Editor

    pintar()

    Boton

    accion()

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    58/127

    Estructuras de datos

    Contenedor

    nelem: Integer

    vaciar()copiar(c: Contenedor)tama a(): Integervacio(): Boolean

    Secuencia

    escribir(e: Elemento, pos: Integer)leer(pos: Integer): Elementoborrar(pos: Integer)

    ContenedorAsociativo

    escribir(e: Elemento, c: Clave)leer(c: Clave): Elementoborrar(c: Clave)

    Vector

    buffer[nelem]: Elemento

    redimensionar(t: Integer)

    Lista

    cabecera: Nodo

    insertar(e: Elemento, pos: Integer)insertaPrin(e: Elemento)insertarFinal(e: Elemento)

    TablaHash

    tabla[nelem]: Elemento

    funcionHash(c: Clave): Integer

    Herencia

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    59/127

    Herencia

    Vamos a estudiar la implementaci n de la herencia en Java mediante el ejemplo deun conjunto de tareas programables: TPReloj (actualizar un reloj digital cadasegundo), TPAviso (mostrar un aviso peri dicamente) y TPEjecucion (ejecuci n de uncomando cada cierto tiempo)

    TareaPeriodica

    periodoSegs: Integerultimaej: Dateactiva: Boolean

    +necesitaEjecucion(): Boolean+actualizarReloj()+ejecutarTarea()+activar()+desactivar()

    TPReloj

    +leerHora(): String

    TPAviso

    msg: String

    +leerMsg(): String

    TPEjecucion

    cmd: String

    +leerCmd(): String

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    60/127

    Herencia

    La clase TareaPeriodica tiene las caracter sticas comunes a los tres tipos de tarea:periodo de ejecuci n en segundos, hora de la ltima ejecuci n y bandera de estadoactivo/inactivo

    import java.util.*;

    public class TareaPeriodica {int periodoSegs; // Periodo de ejecuci nDate ultimaEj; // Hora de ltima ejecuci nboolean activa;

    public TareaPeriodica(int aPeriodoSegs) {

    periodoSegs = aPeriodoSegs;actualizarReloj();activa = true;

    }

    // Constructor para ejecuciones cada segundopublic TareaPeriodica() {

    this(1);}

    // Establecer la ltima ejecuci n a la hora actualpublic void actualizarReloj() {

    ultimaEj = new Date(); // Hora actual}

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    61/127

    Herencia

    La operaci n ejecutarTarea realmente no tiene una implementaci n concreta a estenivel

    public boolean necesitaEjecucion() {

    if (!activa)return false;

    // Calcular la hora de la pr xima ejecuci n

    Calendar calProximaEj = new GregorianCalendar();calProximaEj.setTime(ultimaEj);calProximaEj.add(Calendar.SECOND, periodoSegs);

    Calendar calAhora = new GregorianCalendar();

    // Comprobar si ha pasado a la hora actual

    return (calProximaEj.before(calAhora));}

    public void ejecutarTarea() {

    System.out.println("Ejecucion de tarea");}

    public void activar() { activa = true; }public void desactivar() { activa = false; }

    }

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    62/127

    Herencia

    Para que una clase herede de otra, utilizaremos elindicador extends en la declaraci n de la clase

    import java.util.Calendar;import java.util.GregorianCalendar;

    public class TPReloj extends TareaPeriodica {

    public TPReloj() {periodoSegs = 60; // Comprobar cada minutoactualizarReloj();activa = true;

    }

    public String leerHora() {Calendar cal = new GregorianCalendar();return cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE);

    }}

    Atenci n!: Aunque el c digo de estas clases compila perfectamente, la implementaci n de losconstructores es formalmente incorrecta. M s adelante veremos por qu .

    Programaci n orientada aobjetos en Java

    public class TPAviso extends TareaPeriodica {String msg;

  • 8/6/2019 Presentacion Java 1

    63/127

    Herencia

    public TPAviso(String aMsg, int aPeriodoSegs) {periodoSegs = aPeriodoSegs;actualizarReloj();activa = true;

    msg = aMsg;}

    public String leerMsg() { return msg; }}

    import java.lang.Runtime;import java.io.IOException;

    public class TPEjecucion extends TareaPeriodica {String cmd;

    public TPEjecucion(String aCmd, int aPeriodoSegs) {periodoSegs = aPeriodoSegs;actualizarReloj();activa = true;cmd = aCmd;

    }

    String leerCmd() { return cmd; }}

    Atenci n!: Aunque el c digo de estas clases compila perfectamente, la implementaci n de losconstructores es formalmente incorrecta. M s adelante veremos por qu .

    Programaci n orientada aobjetos en Java

    T d l l J h d lti i t i

  • 8/6/2019 Presentacion Java 1

    64/127

    Herencia

    Todos las clases en Java heredan en ltima instanciade Object . Incluso si creamos una clase independiente,Java la hace heredar impl citamente de Object

    Object

    #clone(): Object+equals(Object obj): Boolean#finalize()+getClass(): Class+hasCode(): int+notify()+notifyAll()+toString(): String+wait()+wait(timeout: Long)+wait(timeout: Long, nanos: Integer)

    Esto hace que las clases formen una jerarqu a conObject como ra z Object

    ... ... ... ......

    Programaci n orientada aobjetos en Java

    En la implementaci n de una operaci n de la subclase

  • 8/6/2019 Presentacion Java 1

    65/127

    Herencia

    En la implementaci n de una operaci n de la subclaseno existe diferencia aparente entre un atributo u

    operaci n propia de la clase y un atributo u operaci nheredadosAhora podemos crear y usar objetos de cualquiera de las clases anteriores. Desde el

    exterior tampoco existen diferencias aparentes entre la llamada a una operaci nheredada o propia de la clase:

    public class AppGestorTareas {public static void main(String[] args) {

    TareaPeriodica tp = new TareaPeriodica(5);TPAviso tpa = new TPAviso(Estudiar Programaci n Avanzada !, 60);

    while (!tp.necesitaEjecucion())System.println(Esperando ejecuci n de tarea peri dica...);

    tp.ejecutarTarea();

    while (!tpa.necesitaEjecucion())System.println(Esperando ejecuci n de aviso...);

    System.println(Aviso: + tpa.leerMsg());}

    }

    Programaci n orientada aobjetos en Java

    La inicializaci n de los atributos de una superclase en

  • 8/6/2019 Presentacion Java 1

    66/127

    Herencia

    La inicializaci n de los atributos de una superclase enel constructor de una subclase presenta varios

    inconvenientes serios: Resulta redundante. La superclase tiene ya un constructor que hace ese trabajo.Por qu repetir c digo entonces?

    Si la clase tiene una larga lista de ascendientes, entonces el constructor ser a muylargo

    La superclase puede tener una inicializaci n compleja, y la inclusi n del c digo de

    inicializaci n en la subclase puede requerir un conocimiento excesivo de lasuperclase por parte del implementador

    public class TPAviso extends TareaPeriodica {String msg;

    public TPAviso(String aMsg, int aPeriodoSegs) {

    periodoSegs = aPeriodoSegs;

    actualizarReloj();activa = true;msg = aMsg;

    }

    public String leerMsg() { return msg; }}

    Programaci n orientada aobjetos en Java

    El procedimiento correcto consiste en realizar una

  • 8/6/2019 Presentacion Java 1

    67/127

    Herencia

    pllamada al constructor de la superclase para que realice

    la inicializaci n de los atributos heredados En Java esta llamada al constructor de la superclasese realiza con la operacion super() seguida de lospar metros de inicializaci n de alguno de los

    constructores del padre de la clase

    public class TPAviso extends TareaPeriodica {String msg;

    public TPAviso(String aMsg, int aPeriodoSegs) {

    super(aPeriodoSegs);msg = aMsg;

    }

    public String leerMsg() { return msg; }}

    La implementaci n correcta del constructor de la clase TPAviso ser a por tanto lasiguiente:

    Programaci n orientada aobjetos en Java

    Y de las otras dos subclases:

  • 8/6/2019 Presentacion Java 1

    68/127

    Herencia

    import java.lang.Runtime;import java.io.IOException;

    public class TPEjecucion extends TareaPeriodica {String cmd;

    public TPEjecucion(String aCmd, int aPeriodoSegs) {super(aPeriodoSegs);cmd = aCmd;

    }

    String leerCmd() { return cmd; }}

    import java.util.Calendar;import java.util.GregorianCalendar;

    public class TPReloj extends TareaPeriodica {

    public TPReloj() {super(60);

    }

    public String leerHora() {Calendar cal = new GregorianCalendar();

    return cal.get(Calendar.HOUR_OF_DAY) + ":"+ cal.get(Calendar.MINUTE);

    }}

    Programaci n orientada aobjetos en Java

    i t d b ll l it t

  • 8/6/2019 Presentacion Java 1

    69/127

    Herencia

    nicamente debe llamarse expl citamente a unconstructor del ascendiente inmediato El constructor de este ltimo realizar a su vez unallamada a un constructor de su ascendiente inmediato yas sucesivamente hasta inicializar todos los atributosheredados

    A

    super(...)

    super(...)

    super(...)

    super(...)

    B

    DC

    Programaci n orientada aobjetos en Java

    Para terminar es posible impedir la herencia a partir

  • 8/6/2019 Presentacion Java 1

    70/127

    Herencia

    Para terminar, es posible impedir la herencia a partirde una clase declar ndola como final Sin embargo, esta es una caracter stica que debe serutilizada con prudencia, ya que puede restringir enexceso la extensi n y reutilizaci n de las clases delsistema en el futuro

    import java.lang.Runtime;import java.io.IOException;

    final public class TPEjecucion extends TareaPeriodica {String cmd;

    public TPEjecucion(String aCmd, int aPeriodoSegs) {

    super(aPeriodoSegs);cmd = aCmd;

    }

    String leerCmd() { return cmd; }}

    Adici n redefinici n y anulaci n

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    71/127

    Adici n, redefinici n y anulaci n

    Adici n, redefinici ny anulaci n

    La herencia en s no ser a tan interesante si no fuerapor la posibilidad de adaptar en el descendiente losmiembros heredados

    Adicin. Trivialmente el descendiente puede a adir nuevos atributos y operacionesque se suman a los recibidos a trav s de la herencia

    Redefinici n. Es posible redefinir la implementaci n de una operaci n heredadapara adaptarla a las caracter sticas de la clase descendiente. Tambi n es posiblecambiar el tipo de un atributo heredado

    Anulaci n. Cuando un atributo u operaci n heredados no tienen utilidad en eldescendientes, pueden ser anulados para impedir su utilizaci n

    No todos los lenguajes orientados a objetos soportanestas caracter sticas, en especial la anulaci n

    Programaci n orientada aobjetos en Java

    La redefinici n se realiza en Java y la mayor a de los

  • 8/6/2019 Presentacion Java 1

    72/127

    Adici n, redefinici ny anulaci n

    y ylenguajes OO definiendo nuevamente la operaci n (con

    los mismos argumentos) en el descendienteLas clases descendientes TPReloj , TPEjecucion y TPAviso no est n operativas

    todav a porque la implementaci n de ejecutarTarea() que contienen es la heredada deTareaPeriodica , que no hace nada en particular

    Es preciso redefinir esta operaci n en cada una de las subclases para que realicenlas tareas correspondientes

    TareaPeriodica

    periodoSegs: Integerultimaej: Dateactiva: Boolean

    +necesitaEjecucion(): Boolean+actualizarReloj()+ejecutarTarea()+activar()

    +desactivar()

    TPReloj

    +leerHora(): String+ejecutarTarea()

    TPAviso

    msg: String

    +leerMsg(): String+ejecutarTarea()

    TPEjecucion

    cmd: String

    +leerCmd(): String+ejecutarTarea()

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    73/127

    Adici n, redefinici ny anulaci n

    import java.util.Calendar;import java.util.GregorianCalendar;

    public class TPReloj extends TareaPeriodica {

    public TPReloj() {super(60);

    }

    public String leerHora() {Calendar cal = new GregorianCalendar();

    return cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE);}

    public void ejecutarTarea() {

    Calendar cal = new GregorianCalendar();int min = cal.get(Calendar.MINUTE);

    if (min == 0 || min == 30)

    System.out.println("Hora: " + cal.get(Calendar.HOUR_OF_DAY)+ " " + min);

    }}

    Programaci n orientada aobjetos en Java

    import java.lang.Runtime;import java.io.IOException;

    public class TPEjecucion extends TareaPeriodica {String cmd;

  • 8/6/2019 Presentacion Java 1

    74/127

    Adici n, redefinici ny anulaci n

    public class TPAviso extends TareaPeriodica {String msg;

    public TPAviso(String aMsg, int aPeriodoSegs) {

    super(aPeriodoSegs);msg = aMsg;

    }

    public String leerMsg() { return msg; }

    public void ejecutarTarea() {System.out.println("ATENCI N AVISO: " + msg);desactivar();

    }}

    public TPEjecucion(String aCmd, int aPeriodoSegs) {super(aPeriodoSegs);cmd = aCmd;

    }

    String leerCmd() { return cmd; }

    public void ejecutarTarea() {try {

    Runtime.getRuntime().exec(cmd);}catch(IOException e) {

    System.out.println("Imposible ejecutar comando: "+ cmd);

    }}}

    Programaci n orientada aobjetos en Java

    Cada tarea ejecuta ahora su funci n, aunque la llamada es aparentemente la misma

  • 8/6/2019 Presentacion Java 1

    75/127

    Adici n, redefinici ny anulaci n

    public class AppGestorTareas {public static void main(String[] args) {

    TareaPeriodica tp = new TareaPeriodica(5);TPAviso tpa = new TPAviso(Estudiar Programaci n Avanzada !, 60);TPEjecucion tpe = new TPEjecucion(rm ~/tmp/*, 3600);

    while (!tp.necesitaEjecucion())System.println(Esperando ejecuci n de tarea peri dica...);

    tp.ejecutarTarea();

    while (!tpa.necesitaEjecucion())System.println(Esperando ejecuci n de aviso...);

    tpa.ejecutarTarea();

    while (!tpr.necesitaEjecucion())System.println(Esperando ejecuci n de comando...);

    tpe.ejecutarTarea();}

    }

    Despu s de la redefinici n, en el descendiente esposible llamar a la versi n original de la operaci n en elascendiente mediante: super.operacionRedefinida()

    Programaci n orientada aobjetos en Java

    Otro uso posible de la palabra clave final es impedir la

  • 8/6/2019 Presentacion Java 1

    76/127

    Adici n, redefinici ny anulaci n

    redefinici n de una operaci n en las subclasesimport java.util.*;

    public class TareaPeriodica {int periodoSegs;Date ultimaEj;boolean activa;

    public TareaPeriodica(int aPeriodoSegs) {

    periodoSegs = aPeriodoSegs;actualizarReloj();

    activa = true;}

    public TareaPeriodica() { this(1); }

    final public void actualizarReloj() {ultimaEj = new Date(); // Hora actual

    }

    final public boolean necesitaEjecucion() {// Implementaci n de la operaci n

    }

    public void ejecutarTarea() {System.out.println("Ejecucion de tarea");

    }

    final public void activar() { activa = true; }final public void desactivar() { activa = false; }

    }

    Programaci n orientada aobjetos en Java

    La anulaci n es un mecanismo menos til, y con

  • 8/6/2019 Presentacion Java 1

    77/127

    Adici n, redefinici ny anulaci n

    menor soporte por parte de los lenguajes de

    programaci n En Java es posible impedir el acceso a un atributoredeclar ndolo en una subclase como privado oprotegido, seg n sea el nivel de protecci n que se

    deseepublic class TPAviso extends TareaPeriodica {

    String msg;

    // Impedir el acceso desde el exterior y las subclases// al atributo activaprivate boolean activa;

    public TPAviso(String aMsg, int aPeriodoSegs) {super(aPeriodoSegs);msg = aMsg;

    }

    // Resto de la implementaci n de la clase a partir de aqu

    Programaci n orientada aobjetos en Java

    Sin embargo, Java no permite redefinir una operaci n

  • 8/6/2019 Presentacion Java 1

    78/127

    Adici n, redefinici ny anulaci n

    haciendo su nivel de acceso m s restrictivo

    Una soluci n parcial consistir a en redefinirla comovac a o incluyendo un c digo que impida su utilizaci n

    public class TPAviso extends TareaPeriodica {String msg;

    public TPAviso(String aMsg, int aPeriodoSegs) {

    super(aPeriodoSegs);msg = aMsg;}

    public void activar() {}

    public void desactivar() {System.out.printl(Error: llamada a operaci n privada);System.getRuntime().exit(1);

    }

    public String leerMsg() { return msg; }

    public void ejecutarTarea() {System.out.println("ATENCI N AVISO: " + msg);desactivar();

    }}

    Protecci n y herencia

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    79/127

    y

    Hemos visto anteriormente como los distintos nivelesde protecci n limitan el acceso a los miembros de laclase desde el exterior. Pero como afectan estosniveles de protecci n a los miembros heredados?

    Miembros p blicos. Son accesibles desde los descendientes, y se heredan comopblicos

    Miembros privados. No son accesibles desde los descendientes Miembros con acceso a nivel de paquete. Son accesibles desde los descendientes

    siempre y cuando pertenezcan al mismo paquete que el ascendiente. Se heredancon el mismo nivel de protecci n

    Un nuevo nivel de protecci

    n es el de miembrosprotegidos (protected) . Un miembro protegido esaccesible nicamente desde los descendientes

    Protecci n y herencia

    Adem s, un miembro protegido mantiene en las

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    80/127

    subclases el nivel de acceso protegidoEn nuestro ejemplo, los atributos de la clase TareaPeriodica son accesibles desde

    TPReloj , TPEjecucion y TPAviso porque al pertenecer al mismo paquete son amigasPara permitir el acceso a los atributos de la clase TareaPeriodica nicamente

    desde los descendientes es conveniente marcarlos como protegidos

    import java.util.*;

    public class TareaPeriodica {protected int periodoSegs;protected Date ultimaEj;boolean activa;

    public TareaPeriodica(int aPeriodoSegs) {

    periodoSegs = aPeriodoSegs;actualizarReloj();activa = true;

    }

    // Resto de operaciones de la clase a partir de aqu

    Protecci n y herencia

    Programaci n orientada aobjetos en Java

    Clases abstractas

  • 8/6/2019 Presentacion Java 1

    81/127

    Clases abstractas

    Existen clases que representan conceptos tangen ricos que no tiene sentido su instanciaci n enobjetos Adem s en este tipo de clases puede ser imposible o

    intil la implementaci n de ciertas operaciones La utilidad de este tipo de clases est en la aplicaci nde herencia para obtener clases que representanconceptos concretos para los que s que tiene sentido

    su instanciaci nLa clase TareaPeriodica es un claro ejemplo: por s sola no tiene utilidad, pero

    simplifica mucho la construcci n de las otras tres clases. De hecho, la operaci nejecutarTarea() en TareaPeriodica no tiene una implementaci n til

    Programaci n orientada aobjetos en Java

    Estas clases se denominan clases abstractas y este

  • 8/6/2019 Presentacion Java 1

    82/127

    Clases abstractas

    tipo de operaciones sin implementaci n posible,

    operaciones abstractas Las operaciones abstractas deben ser implementadasobligatoriamente en alguna de las subclases para quela clase correspondiente sea instanciable Una clase abstracta puede no tener ninguna operaci nabstracta, pero una clase que contenga al menos unaoperaci n abstracta debe ser declarada como abstracta En Java, utilizando la declaraci n abstract podremos

    establecer una clase o una operaci n como abstracta

    Programaci n orientada aobjetos en Java

    Vamos a declarar la clase TareaPeriodica y su operaci n ejecutarTarea() comoabstractas

  • 8/6/2019 Presentacion Java 1

    83/127

    Clases abstractas

    import java.util.*;

    abstract class TareaPeriodica {

    int periodoSegs;Date ultimaEj;boolean activa;

    public TareaPeriodica(int aPeriodoSegs) {

    periodoSegs = aPeriodoSegs;actualizarReloj();activa = true;

    }

    public TareaPeriodica() { this(1); }

    public void actualizarReloj() {ultimaEj = new Date(); // Hora actual

    }

    public boolean necesitaEjecucion() {if (!activa)

    return false;

    // Resto de la implementaci n de esta

    // operaci n aqu }

    abstract public void ejecutarTarea();

    public void activar() { activa = true; }public void desactivar() { activa = false; }

    }

    Programaci n orientada aobjetos en Java

    Java devuelve ahora un error en tiempo de compilaci n si se intenta crear un objetode la clase TareaPeriodica

  • 8/6/2019 Presentacion Java 1

    84/127

    Clases abstractas

    public class AppGestorTareas {public static void main(String[] args) {

    TareaPeriodica tp = new TareaPeriodica(5);

    while (!tp.necesitaEjecucion())System.println(Esperando ejecuci n de tarea peri dica...);tp.ejecutarTarea();

    }}

    AppGestorTareas.java:XX: class TareaPeriodica is an abstract class; cannot be instantiated

    TareaPeriodica tp = new TareaPeriodica();^

    1 error

    La abstracci n de una clase se propaga por la jerarqu a de herencia hasta que todas las operacionesquedan implementadas

    Programaci n orientada aobjetos en Java

    La idea de clase abstracta, llevada al extremo, nosll l i f i f i il

  • 8/6/2019 Presentacion Java 1

    85/127

    Clases abstractas

    lleva en Java a las interfaces . Una interfaz es similar a

    una clase totalmente abstracta: Todas las operaciones de la interfaz son impl citamente abstractas, es decir,

    carecen de implementaci n Una interfaz no puede contener atributos

    Las interfaces sirven para especificar las operaciones

    que obligatoriamente deben implementar una serie declases La implementaci n de una interfaz no se realizamediante herencia (extends) sino mediante implements .

    No obstante, el comportamiento es similar al de laherencia, aunque m s sencillo

    Programaci n orientada aobjetos en Java

    La idea de clase implementa una interfaz, estaimplementaci n debe ser completa es decir de todas

  • 8/6/2019 Presentacion Java 1

    86/127

    Clases abstractas

    implementaci n debe ser completa, es decir, de todas

    las operaciones de la interfazPodemos transformar TareaPeriodica en una interfaz, de forma que especifique lo

    que tiene que implementar cualquier clase que represente una tarea peri dica. Esteenfoque proporciona mayor libertad a la hora de dise ar las otras clases

    TareaPeriodica

    +necesitaEjecucion(): Boolean +actualizarReloj()+ejecutarTarea()+activar()+desactivar()

    TPReloj

    +leerHora(): String+necesitaEjecucion(): Boolean+actualizarReloj()+ejecutarTarea()+activar()+desactivar()

    TPAviso

    msg: String

    +leerMsg(): String+necesitaEjecucion(): Boolean+actualizarReloj()+ejecutarTarea()+activar()+desactivar()

    TPEjecucion

    cmd: String

    +leerCmd(): String+necesitaEjecucion(): Boolean+actualizarReloj()+ejecutarTarea()+activar()+desactivar()

    Programaci n orientada aobjetos en Java

    La interfaz TareaPeriodica y la clase TPReloj tendr an ahora el siguiente aspecto.Las otras clases tendr an implementaciones similares

  • 8/6/2019 Presentacion Java 1

    87/127

    Clases abstractas

    import java.util.Calendar;import java.util.GregorianCalendar;

    public class TPReloj implements TareaPeriodica {Date ultEjecucion;boolean activa;

    public TPReloj() { activa = true; ultEjecucion = new Date() }

    public void ejecutarTarea() {

    Calendar cal = new GregorianCalendar();int min = cal.get(Calendar.MINUTE);System.out.println("Hora: " + cal.get(Calendar.HOUR_OF_DAY)

    + " " + min);ultEjecucion = cal.getTime();

    }

    public interface TareaPeriodica {

    boolean necesitaEjecucion();void ejecutarTarea();

    void activar();void desactivar();

    }

    Programaci n orientada aobjetos en Java

    public boolean necesitaEjecucion() {if (!activa)

    return false;

  • 8/6/2019 Presentacion Java 1

    88/127

    Clases abstractas

    Calendar calProximaEj = new GregorianCalendar();

    Calendar calUltEjecucion = new GregorianCalendar();calUltEjecucion.setTime(ultEjecucion);

    Calendar calAhora = new GregorianCalendar();if (calAhora.equal(calUltEjecucion))

    return false;

    int min = calAhora.get(Calendar.MINUTE);

    if (min == 00 || min == 30)return true;return false;

    }

    public void activar() { activa = true; }public void desactivar() { activar = false; }

    public String leerHora() {

    Calendar cal = new GregorianCalendar();return cal.get(Calendar.HOUR_OF_DAY) + ":" +cal.get(Calendar.MINUTE);

    }

    }

    Programaci n orientada aobjetos en Java

    Una clase puede implementar m s de una interfaz Una interfaz puede heredar de otra interfaz

  • 8/6/2019 Presentacion Java 1

    89/127

    Clases abstractas

    Una interfaz puede heredar de otra interfaz

    Cuando utilizar una interfaz en lugar de una claseabstracta? Por su sencillez se recomienda utilizar interfaces siempre que sea posible Si la clase debe incorporar atributos, o resulta interesante la implementaci n de

    alguna de sus operaciones, entonces declararla como abstracta

    En la biblioteca de clases de Java se hace un usointensivo de las interfaces para caracterizar las clases.Algunos ejemplos:

    Para que un objeto pueda ser guardado en un fichero la clase debe implementar lainterfaz Serializable

    Para que un objeto sea duplicable, su clase debe implementar Cloneable Para que un objeto sea ordenable, su clase debe implementar Comparable

    Herencia m ltiple

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    90/127

    Herencia m ltiple

    Consiste en la posibilidad de que una clase tengavarios ascendientes directos Puede surgir de manera relativamente frecuente ynatural durante el dise o

    FiguraGeometricaalmacena

    *Lista

    Poligono

    Punto

    FicheroLectura FicheroEscritura

    FicheroLecturaEscritura

    Imagen EnlaceURL

    ImagenSensible

    Programaci

    n orientada aobjetos en Java

    Tiene claramente aspectos positivos Surge de manera natural al describir la estructura de un sistema

  • 8/6/2019 Presentacion Java 1

    91/127

    Herencia m ltiple

    Proporciona mucha flexibilidad a la hora de construir clases nuevas Pero tambi n aspectos negativos

    Complica el dise o. La jerarqu a de clases deja de ser tal jerarqu a parapasar a ser una red

    Provoca problemas de eficiencia. La llamada a una operaci n heredadaimplica la b squeda por m ltiples caminos

    Ambig edad: dos atributos u operaciones con el mismo nombre puedenllegar a una clase por dos caminos distintos Herencia repetida: en una estructura con forma de rombo, un atributo u

    operaci n puede llegar a una clase por dos caminos distintos

    A

    atributoX

    B

    atributoX

    C

    A B

    C

    D

    atributoX

    Programaci

    n orientada aobjetos en Java

    La apuesta de los creadores de Java es clara: nopermitir la herencia m ltiple por las razones expuestas

  • 8/6/2019 Presentacion Java 1

    92/127

    Herencia m ltiple

    permitir la herencia m ltiple, por las razones expuestas

    anteriormente A veces es posible sustituir la herencia m ltiple poruna combinaci n herencia/composici n, aunque elresultado no puede considerarse equivalente

    FiguraGeometrica

    Poligono

    listaPuntos(): Lista

    almacena

    *

    contiene

    1

    Lista

    aadir(s: Segmento)borrarPrim()borrarUlt()

    almacena

    *

    contiene

    1

    FiguraGeometrica

    Poligono

    aadir(s: Segmento)

    Segmento

    Segmento

    Lista

    Programaci

    n orientada aobjetos en Java

    Adem s, Java s que permite la implementaci n deuna o varias interfaces adem s de la herencia lo que

  • 8/6/2019 Presentacion Java 1

    93/127

    Herencia m ltiple

    una o varias interfaces adem s de la herencia, lo que

    puede considerarse una forma restringida de herenciamltiple Una clase puede heredar de otra e implementar una ovarias interfaces sin que aparezcan los problemas

    asociados con la herencia m ltiple

    FiguraGeometrica

    Poligono

    almacenaSegmentoLista

    *

    Programaci

    n orientada aobjetos en Java

    Polimorfismo

  • 8/6/2019 Presentacion Java 1

    94/127

    Polimorfismo

    Son dos mecanismos relacionados que otorgan a laOOP una gran potencia frente a otros paradigmas deprogramaci n nicamente tienen sentido por la existencia de la

    herencia El polimorfismo (o upcasting) consiste en la posibilidadde que una referencia a objetos de una clase puedaconectarse tambi n con objetos de descendientes de

    sta A ra = new A(); // Asignaci n ordinariaB rb = ra; // Asignaci n polimorfa

    B rb = new A(); // Asignacion polimorfa

    ra: A

    B

    A

    rb: Bobjeto: A

    public class AppGestorTareas {public static void main(String[] args) {

    TPReloj tpr = new TPReloj();TPA i t TPA i (H d i t 60)

    Programaci

    n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    95/127

    TPAviso tpa = new TPAviso(Ha pasado un minuto, 60);TPEjecucion tpe = new TPEjecucion(/bin/sync, 120);

    TareaPeriodica tp;

    tp = tpr;tp.desactivar();

    tp = tpa;tp.desactivar();

    tp = tpe;

    tp.desactivar();}

    }

    El sentido del polimorfismo es realizar una generaliza

    cin, olvidar los detalles concretos de uno o variosobjetos de distintas clases y buscar un punto com n atodos ellos en un ancestro

    Polimorfismo

    La mayor a de las veces, las conexiones polimorfas serealizan de manera impl cita en el paso de argumentos

    Programaci

    n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    96/127

    realizan de manera impl cita en el paso de argumentos

    a una operaci n. De esta manera es posible escribiroperaciones polimorfas que reciban objetos demltiples clases

    Polimorfismo

    public class AppGestorTareas {

    private static void esperarEjecutar(TareaPeriodica tp){

    while (!tp.necesitaEjecucion());tp.ejecutarTarea();

    }

    public static void main(String[] args) {TPReloj tpr = new TPReloj();TPAviso tpa = new TPAviso(Ha pasado un minuto, 60);

    TPEjecucion tpe = new TPEjecucion(/bin/sync, 120);

    esperarEjecutar(tpr);esperarEjecutar(tpa);esperarEjecutar(tpe);

    }}

    Otra aplicaci n muy til es la construcci n deestructuras de datos que puedan mantener objetos de

    Programaci

    n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    97/127

    est uctu as de datos que pueda a te e objetos de

    distintas clases

    Polimorfismo

    Vamos a implementar una nueva clase GestorTareas que va a contener una lista detareas a realizar. La llamada a chequearEjecutar() realizar la comprobaci n yejecuci n de las tareas que lo requieran

    import java.lang.Exception;

    class DemasiadasTareas extends Exception {}

    public class GestorTareas {TareaPeriodica[] tareas;int nTareas, maxTareas;

    public GestorTareas(int aMaxTareas) {

    nTareas = 0;maxTareas = aMaxTareas;tareas = new TareaPeriodica[maxTareas];

    }

    // Sigue...

    Programaci n orientada aobjetos en Java

    // Continuaci n de la clase GestorTareas

    public void nuevaTarea(TareaPeriodica tp)throws DemasiadasTareas {

    if (nTareas == maxTareas)throw new DemasiadasTareas();

  • 8/6/2019 Presentacion Java 1

    98/127

    Polimorfismo

    import java.lang.System;

    public class AppGestorTareas {

    public static void main(String[] args) {GestorTareas gt = new GestorTareas(10);

    try {gt.nuevaTarea(new TPReloj());gt.nuevaTarea(new TPAviso(Ha pasado un minuto, 60));gt.nuevaTarea(new TPEjecucion(/bin/sync, 120));

    } catch(DemasiadasTareas e) {System.out.println(Mmmm.... esto no deberia haber pasado);

    }

    gt.chequearEjecutar();}

    }

    tareas[nTareas++] = tp;}

    public void chequearEjecutar(){

    for (int t = 0; t < nTareas; t++)if (tareas[t].necesitaEjecucion())

    tareas[t].ejecutarTarea();}

    }

  • 8/6/2019 Presentacion Java 1

    99/127

    Programaci n orientada aobjetos en Java

    En Java, una referencia a Object puede ser conectadaa cualquier objeto, puesto que como sabemos es un

  • 8/6/2019 Presentacion Java 1

    100/127

    Polimorfismo

    q j , p q

    ancestro de todas las clases

    Adem s, las interfaces implementadas por una clase

    tambi n pueden ser utilizadas para realizar conexionespolimorfas

    public class AppGestorTareas {public static void main(String[] args) {

    TPReloj tpr = new TPReloj();Object o;

    o = tpr;System.out.println(o.getClass().getName());

    }}

    Programaci n orientada aobjetos en Java

    Ligadura din mica

  • 8/6/2019 Presentacion Java 1

    101/127

    Ligadura din mica

    Entendemos por resoluci

    n de una llamada el procesopor el cual se sustituye una llamada a una funci n porun salto a la direcci n que contiene el c digo de estafuncin

    Normalmente, la resoluci

    n de llamadas se realiza enen tiempo de compilaci n, porque resulta m s sencillo ysobre todo m s eficiente. Cuando la aplicaci n se est ejecutando, las llamadas ya est n preparadas. Este

    enfoque se denomina ligadura est

    ticaf() CALL _f

    Programaci n orientada aobjetos en Java

    El problema aparece en OOP cuando realizamos unaconexi n polimorfa y llamamos a una operaci n

  • 8/6/2019 Presentacion Java 1

    102/127

    Ligadura din mica

    redefinida

    El compilador no tiene informaci n para resolver lallamada. Por defecto utilizar a el tipo de la referencia, y

    por tanto generar a una llamada a A.f() Pero la referencia r puede apuntar a objetos de lasclases A, B o C , con distintas versiones de f()

    A r = ??r.f()

    CALL _A_f ?CALL _B_f ?

    CALL _C_f ?

    A

    f()

    B

    f()

    C

    f()

    Programaci n orientada aobjetos en Java

    La soluci n consiste en esperar a resolver la llamadaal tiempo de ejecuci n, cuando se conoce realmente

  • 8/6/2019 Presentacion Java 1

    103/127

    Ligadura din mica

    al tiempo de ejecuci n, cuando se conoce realmente

    los objetos conectados a r , y cu l es la versi n de f() apropiada. Este enfoque de resoluci n de llamadas sedenomina ligadura din mica y es mucho m s lenta ycompleja que la est tica Hay tres enfoques posibles a la hora de escoger entreligadura est tica o din mica:

    Establecer la ligadura est tica por defecto. El programador puede activar laligadura din mica para una funci n concreta cuando lo ve necesario (C++)

    Utilizar un compilador inteligente que decide la ligadura est tica o din mica en

    funcin del empleo que se hace de cada funci n (Eiffel) Establecer la ligadura din mica para todas las funciones y evitar problemas a costa

    de eficiencia en la ejecuci n (Smalltalk, Java)

    Programaci n orientada aobjetos en Java

    Por tanto, la ligadura din mica, por defecto en Java,garantiza siempre la llamada a la versi n correcta de

    d f i i d d i d l d i

  • 8/6/2019 Presentacion Java 1

    104/127

    Ligadura din mica

    cada funci n, con independencia del uso de conexionespolimorfas o no

    Por tanto en Java las llamadas a la funci n ejecutarTarea() se resuelvencorrectamente, a pesar de realizarse a trav s de una referencia a TareaPeriodica

    public class AppGestorTareas {public static void main(String[] args) {

    TPReloj tpr = new TPReloj();TPAviso tpa = new TPAviso(Ha pasado un minuto, 60);TPEjecucion tpe = new TPEjecucion(/bin/sync, 120);TareaPeriodica tp;

    tp = tpr;tp.ejecutarTarea(); // Versi n de TPReloj

    tp = tpa;tp.ejecutarTarea(); // Versi n de TPAviso

    tp = tpe;tp.ejecutarTarea(); // Versi n de TPEjecucion

    }}

  • 8/6/2019 Presentacion Java 1

    105/127

    Tras crear un objeto de tipo TPReloj y conectarlo mediante una referencia a TareaPeriodica , intentamos recuperar nuevamente una referencia de tipo TPReloj alobjeto. No es posible de manera directa

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    106/127

    public class AppGestorTareas {public static void main(String[] args) {

    TareaPeriodica tp = new TPReloj(); // upcasting

    TPReloj tr = tp; // downcasting ?}

    }

    AppGestorTareas.java:XX: incompatible typesfound : TareaPeriodicarequired: TPReloj

    TPReloj tr = tp;^

    1 error

    Un simple casting permite forzar la conexi n a lareferencia

    public class AppGestorTareas {public static void main(String[] args) {

    TareaPeriodica tp = new TPReloj(); // upcasting

    TPReloj tr = (TPReloj) tp; // downcasting}

    }Informaci n de

    clases en tiempo deejecuci n

    Un intento de casting imposible generar unaexcepci n ClassCastException en tiempo de ejecuci n

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    107/127

    Informaci n declases en tiempo de

    ejecuci n

    Exception in Thread main java.lang.ClassCastExceptionat AppGestorTareas.main(AppGestorTareas.java:XX)

    public class AppGestorTareas {public static void main(String[] args) {

    TareaPeriodica tp = new TPReloj(); // upcasting

    TPReloj tr = (TPReloj) tp; // downcasting ok

    // Downcasting imposible: lanza excepci n ClassCastExceptionTPAviso ta = (TPAviso) tp;

    }}

    Podemos capturar esta excepci n para determinar si elobjeto apuntado por la referencia es del tipo esperado ono reali ando acciones diferentes en cada caso

    Programaci n orientada aobjetos en Java

  • 8/6/2019 Presentacion Java 1

    108/127

    no, realizando acciones diferentes en cada caso

    Informaci n declases en tiempo de

    ejecuci n

    import java.lang.*;

    public class AppGestorTareas {public static void main(String[] args) {

    TareaPeriodica tp;TPReloj tr;

    // Posiblemente en alg

    n punto la referencia tp ha sido conectada// con un objeto de la clase TPReloj...

    try {tr = (TPReloj) tp;System.out.println(La hora actual es: + tr.leerHora());

    }catch(ClassCastException e) {

    System.out.println(La referencia tp no apunta a un objeto+ de la clase TPReloj);}

    }}

    Programaci n orientada aobjetos en Java

    import java.lang.*;

    public class AppGestorTareas {public static void main(String[] args) {

    TareaPeriodica tp; TPReloj tr; TPAviso ta; TPEjecucion te;

    // tp es conectada a alg n objeto

  • 8/6/2019 Presentacion Java 1

    109/127

    Informaci n declases en tiempo de

    ejecuci n

    p g j...try {

    tr = (TPReloj) tp;// Operar con trreturn;

    }catch(ClassCastException e) {

    // Si no es de tipo TPReloj, continuamos por aqu }try {

    ta = (TPAviso) tp;

    // Operar con tareturn;

    }catch(ClassCastException e) {

    // Si no es de tipo TPAviso, continuamos por aqu }try {

    te = (TPEjecucion) tp;// Operar con tereturn;

    }catch(ClassCastException e) {

    // Si tampoco es de tipo TPEjecuci n Entonces de que tipo es?System.out.println(Error: objeto de clase desconocida);

    }}

    }

    Programaci n orientada aobjetos en Java

    Mucho m s c modo es utilizar instanceof paradetermina si el objeto es de la clase esperada antes derealizar el casting

  • 8/6/2019 Presentacion Java 1

    110/127

    Informaci n declases en tiempo de

    ejecuci n

    realizar el castingimport java.lang.System;

    public class AppGestorTareas {public static void main(String[] args) {

    TareaPeriodica tp; TPReloj tr; TPAviso ta; TPEjecucion te;

    // tp es conectada a alg n objeto...if (tp instanceof TPReloj) {

    tr = (TPReloj) tp;// Operar con tr

    }else

    if (tp instanceof TPAviso) {ta = (TPAviso) tp;// Operar con ta

    }else

    if (tp instanceof TPEjecucion) {

    te = (TPEjecucion) tp;// Operar con te}else

    System.out.println(Error: objeto de clase desconocida);}

    }

    Programaci n orientada aobjetos en Java

    La operaci n getClass() de Object devuelve un objetode la clase Class que permite obtener en tiempo deejecuci n gran cantidad de informaci n de la clase a la

  • 8/6/2019 Presentacion Java 1

    111/127

    Informaci n declases en tiempo de

    ejecuci n

    ejecuci n gran cantidad de informaci n de la clase a laque pertenece el objeto. El atributo est tico class de laclase tambi n devuelve una referencia a este objeto

    import java.lang.System;

    public class AppGestorTareas {

    public static void main(String[] args) {TareaPeriodica tp;

    // tp es conectada a alg n objeto...

    Class c = tp.getClass();System.out.println(La referencia tp apunta a un objeto de la clase:

    + c.getName());

    Class c = TareaPeriodica.class;if (c.isInterface())

    System.out.println(TareaPeriodica es una Interfaz);}

    }

    Programaci n orientada aobjetos en Java

    Las librer as de contenedores de Java (java.util)utilizan el polimorfismo para conseguir genericidad,trabajando siempre con Object

  • 8/6/2019 Presentacion Java 1

    112/127

    Informaci n declases en tiempo de

    ejecuci n

    trabajando siempre con Object A la hora de recuperar los objetos almacenados, esnecesario utilizar downcasting para conectar con unareferencia de la clase apropiada

    import java.util.*;

    public class AppGestorTareas {public static void main(String[] args) {

    LinkedList l = new LinkedList;

    // A adir elementosl.add(new String(Ja n));l.add(Granada);

    // Recuperar el primer elementoString s = (String)l.get(0);System.out.println(s);

    }}

    Programaci n orientada aobjetos en Java

    A partir