Download - 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