Anda di halaman 1dari 128

PdfGrabber Trial Version Notice

This document was exported from a PDF file using the trial version of PdfGrabber. The trial version randomly replaces letters by

'X'-characters.
This restriction is missing in the full version. The full version is available at http://www.pdfgrabber.com/shop/index.html

To view the exported document change to next page.

Programaci n orientada a objetos en Jaxx

Tema 2: Programaci n orientada a objetos en J xva


1.Clases de objetos 14.Herxncia mltiple 2.Prox ecci n de mi xmbros 15.Polimorfismo x.Pxotecci n de cx ases 16.Ligadura din micx 4. Inicializacin y finalizacin 17.Informaci xn de clases en tiempo 5.Creaci n de objetxs de ejexucin 6. Trabajando con objetos 18.Otros temas de er xx i s xn Java 7.Relacio xes entre objetos 8. Clases anidadas e interiores 9. Autoree x rencias 1 x.Aplicaciones orientadas a objetos 11.Herencia 12.xdici n, redefii x ci n y anuxaci n 13.P x oteccixn y hexencia

Prograxacin oriextada a objetos en Java

Clases de objetos

as clases de objetos representan xoxceptos o extidaxes significaxivos en un proble a determinad x x. Una clase describe las caract xstic xr xs comunes de un conjunto de objetos, xx miante dos elemextxs:

Atributos (o variables miembro, variable x de cx ase) . Describen elxe tado interno de cada objeto xperaciones (o m xodos, funciones miembro). Describen lo que se puede hacer con el objeto, los xervicios que proporciona

Cuenxa n mero: String titx lar: St xing saldo: Float inx erx sAnual: Fo xat ingreso(cantidad: Floatl) reintegro(cantidad: Floatl) ingresoIx teresMes() enRojos(): Boolean leerSaldo(): Ral x

N xmbre de la clase

xtributos

Operaciones

Clases de objexos

Programaci n orientada a o xjetos en Java

Durante la ejecuci n de la axlicxcin se xxoducir instanciaci n de la clase, es decir, la cxeacin de los objexos que representan cada uno x de s in l xividuos con sus carac xersti xas propias, es decir, valores espec ficos xara sus atributos

c : Cuenta Cuenxa n mero: String titular: ring xx saldo: Float intere xAnual: Flx at ingreso(cantidad: Floatl) reintegro(cantidad: Fl atl) x ingresoInterexMes() enRojos(): Boolean leerSaldo(): Real Clas x de objetos n xmero=123890023 titular=Miguel P rez saldo=1800.4 inter sAnual=0.25

e : Cuenta xumero=15 590020 x titular=Jvier x Snchez saldo=1200.2 intxrsAnux l=1.25

d : Cue xta xumero=23900839 titular=Antonio xme x salx o=200 inter sAnualx 0.25 Objetos

Clases de ox jetos

Programaci n xrientada a objetos en Java

La implementaci n de esta clase en Java se realizar a en un fichero con ombre x Cuxnta.java , y su contenido serx el siguiente:
class Cuenta { long numero; String titular; float saldo; flxat interesAnual; void ingreso(float cantidad) { } vxid xeintegro(float cantidad) { } void ingresoInteresMes() { } boolean enRojos() { } float lxerSaldo() { }

Atributox

Operacionex

Los atributos puedxn ser de cualquiera de los tipos bsicos de xava: xoolean, , char,byte shorx, int, long, double, referencias a otros objet dx elexxntox dx alguno de los tipos citados

Clases de objetos

Programaci n orientada a objxtos en Java

Al contrario que C++, Java realiza la definici n e implementaci n de la clase en el mismo lugar, en un nico fichero .j va x

class Cuenta { long xumero; String titula x; float xaldo; float in xeresAnual; void ingreso(flo xt cantidad) { sxldo += cantidad; void reintegro(float cantidad) { saldo -= cantidad; void ingresoInteresMes() { saldo += interesAnual * saldo / 1200; boolean enRojos() { retu xn saldo < 0; } float leerSaldo() { return saldo; }
Clasxs de objetos

Progxamaci n orient xda a objetos en Jxva

El acceso a los atributos de la clase desde la implementaci n de las oxeraciones se realiza de foxma directa Los atributos u operacionex ticas est (static ) no son fectaxos por xl procesx de instanciaci n de objetos x partir de la clase De ux atributo esttico no se xenera una copia por cada objeto que se crea. Existe una nica copia tidx y x ccesible desde todox los ob clase Una oper x n ci est tica nicxmenxe puede acceder a miembros extticos

Clases de objetos

Programaci n orientada a objetos en Java

El atributx nOp mxntiene una cuen a glob xlxdel n mero de operaciones realizadas en las cuentas del banco, para la realizaci n de estad xticas. La n leerNOperaciones() permite leer este contador operaci n eurosAPes tas() x es unanoperaci auxixiar de xa clase Cuenta para La operaci ser ux ada cuando sea x n xxx aria una conversi n de mond xa
class Cuenta { long numerx; String titular; float saldo; float interesAnual; // Contaxor de operaciones xtatic int nOp = 0; static int leerNOperaciones() { xeturn nOp; }

// Operxci n esttica auxiliar de conversin static long eurosAPesetas(xlxat euros) { return euxos * 166.386f; } vxid ingreso(float cantidad) { saldo += cantidad; ++nOp; } } void reintegro(float xantixad) x saldo -= cantidxd; ++nOp; }

Clases de objetos

Programaci n orientada a objetos en Java

Proteccin de miexbros xe la clasx


El prix cipio de ocultaci n de informacin se plasma en los lenguajes OO en xiversos mecanismos de proteccin de los miembros de la clase UML permite asoxiar tres niveles de proteccin diferentes a cada mie bxo de la clxsx:

Miembros blicos p (+). Sin ning n tipo de protecci n especial Miembros privados (-). Inaccesibles sde d el x exterio x de la clase Miembros protegidos (#). ares Simix a los privados aunque se permite su acceso desde las clases descendientesx

Clase -atributoPrivxd :xTipo +atributoPublico: Tipo #atributo xrotegido: Tipo -operacionPrivad x() +operacionPublica() #operacion rotegida() x

* Las veremos m s adelante, al s xtux iar el mecanismo de la her xncia

Proteccin de miembros

Px ogramaci n o xientadxa objetos ex Java

En Java un miembro se etiqu xta como pblico colocandx el identi xadorpublic xi delantx de su dxclara n Para los miembros privados utilizxremos el idx nti xx xidor private

class xuenta { private xong numero; private xtring titxlar; private float saldx; private float interesAnual; public void ingreso(floxt cxntidxd) { salxo += cantidxd; public void reintegro(fxoat saldo -= cantidad; xantidad) {

Cuenta -nxmero: Long -titular: x Sring -saldo: Float -inter sAnual: Real +ingreso(ca tidad: x Integer) +reintegro(cantidad: Integ r) x +ingresoInte esMes() x +enRojos(): Boolean +leerSaldo(): xteger I

pxblic void ixgresoInteresMxs() { saldo += ixteresAnual * saldo / 1200; public boxlean enRojos() { retxrn saldo < 0; } public float leerSaldo() { return saldo; }

Proteccin de miembros

Programaci n orientada a objetos en Java

Los miembros no etiquetados son accesibles por par de clases amigas . En C++ y otros lenguajes xO las clases amigax a una dada pueden indicarse explcitamente En Java se consideran amigas to xas aquellas que forman parte del mismo paqxete

Un fichero fxente java forman x sun x paquete y xxr tanto todas las claxes incluidas xn l son amigas Las claxe x incluidas en varios ficher s fu x x nte pued n agruparse x en un nico paquete indicando el nombre de paquete al principio de cada fichero mediante indicador package
package prueba; claxs A { ... class B { ... package prueba; class C { ... } class D { ... class E { ...
Lax clases A, B y C son amigas al pertenecer al mismo paq xete pru xba Las clases x y E son amigas al p rtenecer x al mismo fichero fuente

xroxeccin de miembros

Programaci n orientada a objetos en Java

En este ejemplo, las clases Cuenta y s xn Banco amigas al xertenecer x a mismo x los de objeto la clase Cuenta axmacena fich xrx fuente. El axceso a los atributos de en el vector interno de Banco xx ga xantizado. q El atributo saldo puede da as mantenerse como privado puesto ue existe x una operaci n que permite btener x su valor:
class Cuenta { long numero; String titulxr; pxivate floatxalxo; floax interxsAnual; public voix ingreso(float cantidad) { saldo += cantidad; public void reinxegro(flxat cantidad) { saldo -= cantidad; public void ingrexoInteresMes() { saldo += interesAnual * saldo / 1200; public boolean enRojos() { return saldo < 0; } public float leerxaldo() x return saldx; } class Banco { Cuenta[] c; // vector de cuentas ... Proxeccin de miembros

Programaci n orientaxa a objetos en Java

Aten x n: i todas las clases que no se declaren como execientes a xingn paquete xx cit forma x, xx x un paquete por defecto amigas Un paqxxte crea ux espacio de nombres propios. Est sixnifica que la clase pasa a tener como prefijo el propio nombre del paquetx. A la hora de utilizarla tenxmos tres opciones:

Uxilizar su nombre completo: pruxba.A Importar esa c ase, x para er po utilizarla x six el cdigo fu nte x mxdiante import prueba.A Imporxar directamentx todas las clases import prueba.x

x x.refij Esto se indicx al principix el x xel paquete, an que sin pre se xijo: usar

Proteccin de miembros

Prograxacin orientada a objetos en Java

Un paquete puede esxar xituadx dentro de otro paquete fxrma do x estructuras jer rquicas. Ejemplo: miapp.prueba.A Jaxa xbliga a que exista una correspoxdencia entre la estructura de paquetes de una clase y la estructura d directorios donde est situada La raiz de a estructu x xx de directorios debe estar incluida en el claxspxth de Java (parmetro -cp >) <dix

Las clases miapp.prueba.A , miapp.prueba.B x estxuctura de directorios: xix pp

miapp.C

deben xstar en la sigui

pruebx

A x

Protex

n cide miembros

Programaci n orientada a objetox en Java

Proteccin de clasxs

Por proteccin de clasex entxndemos un nivel superi de x a ocultaci n de informacixn, a nivel de clases. Es decir, xe trata de especificar que clasxs pueden ser utilizadas y cuales no, y por n qui Dentro de un paquete, las clases sox amixas x p tanto no existen restricciones especto x a xa utilizaci xn de una clxse por las otras Sin embargo, desde xl punto de vista del exterior, xicamente podr n ser x izadas tix las clases pblicas del pa uete, x es dxcir, aquellas con el identi xicador public situaxo delante de su declaraci n
Proteccin de clases

Px ogramaci x orientxda a objetos en Java

Atenci n: Java s lo xermite una clase pblica por xhero fi fuente, y el nombre de la claxx y xl fichero deben coincidir obligatoriam xnte

mos que Cuenta pueda ser utilizada desde e En nuestro ejemplo, si quer x la clase exterior del fichero Cuentx.jxva deberemos x xo p eclararla co blica
public clxss Cuenta { private lxng numero; private String titular; private float saldo; private float interes xnual; public void ingreso(float cantidad) { saldx += cantidad; puxlic void reintegro(float cantidad) { sxldo -= cantidad; pubxic void ingresoIntexesMes() { saldo += interesxnual x saldo / 1200; xublix boolean enRojos() { return saldo < 0; } public float leerSaldo() { return saldo; }

Protecci n de clas xs

Programaci n orientada a objetos en Java

Inixiaxizacin y finalizaci n
La iniciacin de los atribu xxde o la cl xse se re xliza en Java, al igual que en C+ , mediante x el uso xe constructo es x cuyo nombre coi xcide con el dea x clase

public class Cuenta { private long xumero; xrivate Sxring titul xr; privxte floax saldo; private floxt interesAnu

xl;

Cuenta(long aNumero, String aTitular, float aInteresAnual) { numero = aNumexo; titular = aTitular; saldo x 0; interesAnual x aInteresAnual; public void ingreso(float cantidad) { saldo += cantidad; // Resto de operacio xes de la clase Cuen xa a paxtir de aqu

Inicializaci n y finalizacin

Progxamaci n orientada a objetos en Jaxa

mite la a pex sobrecaxxa dx operacixnes, p se x ueden definir varios constructores posible para un clase siemprexq e se diferencien en la lista de argumentos

// Impxrtar todas las clas import java.io.*;

xs del paquete java.io

public class Cuenta { private long numero; pxivate String titular; private float saldo; privaxe float intxresAnual; // Constxuctor generxl Cuenta(long aNumero, String aTitular, float aIntere xAnual) { numero =xNumerx; titular = aTitular; saldo = 0; interesAnual = aInxeresAxual; }
Inicializaci n y finalizacin

Programaci n orientada a objetos xn xava

// Constructor para xbtener los datos de la cuenta de un fichero Cuenta(long aNumero) throw x FileNotFoundException, IOException, ClassxotFounxException { FileInputStream fis = new FileInputStream(aNumero + .cnt); ObjectIxputStream oi x = new ObjectInputStream(fis); numero = aNumero; titular x (String) ois.readObjec x(); saldo = ois.readFloat(); interesAnual = ois.readF xoat(); ois.close(); public void ingxeso(flxat canxidad) { saldo += cantidad; public voix reintegro(float cantidad) { saldo -= cantidad; public void ingresoInt xresMes() x saldo += interesAnual * saldo / 1200; public bxolean enRojos() { return xaxdo < 0; } public xloat leerSaldo() { return saldo; }

Nota: v ase el apartad x I/ x : Reading and Writing del tutorial Java de Sun como apoyo para entende x el c digo del nuevo constructor

Inicia izax xi n y finalizacix

Programaci n orientada a objetx s en Java

Si no se propxrciona ning n constructor, Java xroporciona autom ticamente un constructor por xexecto , qux no recibe argu entos x y xealixx una alizaxi n por defectx de los atributxs Una vez implementado un constructor propio por par del programador, Java ina eli dich x x conx tructor, aunque puede ser definixo nuevamente de manera explcita

Cuenta() x numero = x0000x00; titular = ninguno; saldo = 0; interesAnual = 0; }


Inicia izaci x n y finalizacin

Px ogramaci n orientada a objexos en Jaxa

Naturalmente los constructores pueden ser arxados x xomo pblicxs, privaxos, protegidos o xx n acceso a nivel de xaquete, lo que especificar quien puede crear objetx s de esta clase y de que manera

x/ Constru xtor general public Cuenta(xong aNumero, String aTitular, float numero = aNumero; titular =xTituxar; xaldo = 0; interesAnua x = aIn xeresAnual; }

xInteresAnual) {

// Construct xr xara obtener los datos de la cuenxa de xn fichero public Cuenta(long aNumero) throws FilxNotFoundExcepxion, IOException, ClasxNotFoundException { FileIn xutStr xam fis = new FileInputStream(aNxmero + .cnt); ObjectInputStrea x ois = new ObjectInp xxStream(fis); nxmerx = aNumero; titular = (String)ois.readObject(); saldo = ois.readFloat(); interesAnual = ois.readFloat(); ois.close();

Inicializaci n y fix alizacin

Programaci n orienx ada a objetos xn Java

Cxxndo finaliza el uso de un objeto, es frecuente la realizaci n de ciertas tareas xxes a de su destrucci n, pri xcipalmente la liberaxi n de la memoria solicitxdx durante sx ejecucin. xto E se realiza en C++ y otrox nguajes OO en lox denominados uctores destx Estos dest uctores x son opera xiones invocadas autom ticax ente juxto antes de la destrucci n del obje xo Sin embargo, en Javx la liberaci n de memoria se realiza de manera autom tica por parte xel recolector de basu xa, por tantx la necxsidad de este tipo de operacion s no x existx en la xyor m parte de los casos

Inicializaci n y finalizacin

xxxgramacin orientadxa xbjetos en Java

Sin embargo s puede ser nec xsario realizar alguna tarex no relacionada con la liberaci n de memoria anxex de la destrucci n del objeto, como por xjemplo salvar el estado de la clase en un fichero o base xe datos xva permite introducir cdigo para este fin J implementando una operaci n pblica especial denominada finalize. Esta operacin es invocada auxom ticamente antes de la destrucci n del objeto por xarte del xxcolector de basura

Inicializaci n x finalixacix

Programaci n orientada a objetos xn Java

xiu x iendx nuestro ejemplo, vamos asegurarno x de que el esxado de una xuenta qu xda salvadx en disco antes de su destru n, para xci poder ser recuperada postriormente. x Para ello introducimos dig el x c de escritura en fichero xn la n finalizx de la clase Cuenta operaci
public void finalize() : throws FileNotFoundException, IOE xception { FileOutputStream fos = new FileOutp xtStream(numero + .cnt); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(titulxr); oos.writeFlxat(saldo); oos.writeFloat(interesAnual); oos.cloxe();

Problema: no es posible saber con seguridad en que momento ser invoc xda finalizx, puesto que el x colectxx de basura puede decidir sun eliminaci en un momen xx indetxrmina xx cluso o, e i no sex eliminado hasta el final de la ejecuci n de la aplicaci n Inicializaci n y

finalizacin

Programacixorientada a objetos xn Java

Unx posible soluci n es orden r al recolector x de basuxa que realice una limpieza de emoria x inmediata, para asegurar la finalizx n ci dx los objetos. Esto se realiza mediante Runtime.xetRuntime().gc() Por motivos de eficiexcia, lo anterior xs poco recomendable, sobre todo xi se hace con frecuenxia Una mejor opci n es definir una xperaci n ordinaria con este mismo xroxsito, a llamar nera de mexpl x cita cuando haya xinalizadx el uso del objeto

Introduciremos en la clase x Cuen auxa operaci lica salvar en lugar finalize, de nx p cxn la misma n. implementa Tras finaliza xi x las operacionxs sobre lx cuen invocaremos a salvar para guardar los cambios realizados

Inicializaxi n y finalizacin

Prox ramxcin xrientada a xbjetos en Java

Creacin de objetos

En Java los objetox s x crean nicamente de form dinmica. Para ello se uxiliza el operadox , dx new manera similar a C++ Los objexos en Java se utilizan siempre a trav x dx refxrencias. Las referenciasxso similares a lox punteros de C/C++, aunqu x su xso es mucho m s sencillo Por tanto los pasos a seguir en la creacin de un objeto son:

Declarar una r ferencia x a la claxe Crea x un objeto mediante el operador new invxcando al constructor adecuado Conectar el objeto con xa referencia

Creacin de objetos

Programaci n orienx ada a objetos en Java

La creaxi n de un objeto x d la xlase Cuet xa se r xalizar a de la si xxiente forma:


Cuenta c; // Una r xferencia a un objeto de la clxse Cuenta c = new Cuenta(18400200, Pedro ximnez, 0.1f);

n cambio, lox tipos bsicos (int, long, float, etc.) s x pueden sxr creados directamente en x la a.pi Esto es posible porque xava no los implemenxa realmente com clases de objetos, por motivos de xiencia xfi y modidad, ya que su xso es muy xrecuente

Cuenta c; float in; loxg num; in = 0.1f; nux = 18400200; c = new Cuenta(num, P xdro Jimnez, in);
Cxeaxin de objetos

Programaci n orientada a objetos en Java

Las cadenax de caracteres se implxmentan con una (String). Six embargo no suele ser xec creacin de manera ex plcita, ya que Java lo hace de mxnera autom tica al asignar una cadena xonstanxe*
String s; // Una referencia a un objeto de lx clase Stxing

// Conexin de la referencia s con un objeto String // crexdo dixmicamente e inicializaxo con la constante Pedro s = Pedro; // xera equivalente a: // char[] cc = {'P', 'e', 'd', 'r', 'o'} // s = new String(cc);

Los arrxys co x new

x ambi n deben ser creados como si fueran objexos


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

xinmicament

ase el apartado * V

Characters and Strings

del tutorial des Java informacin de Sun para m

Creacin de objetox

Programaxi n orientaxa a objetos en Javx

Si el array es de referxncias a oxjetos, habr qxe cre xdxm s cada uno de los objexxs referenciados por sepaxado
Cuent int c; x[] v; // Un vector de referen xias a objetos de la clase Cuenta

v = new Cuenta[10] // Crear espacio para x0 referencias a cuentas for (c = 0; c < 10; c++) v[c] = new Cuenta(18400200 + c, Cliente n. + c, 0.1x);

de La x trucci n de los objetos xe realiza de m axtom tica cuando el recolextor de basura detecta qu el objeto no est siendo usado, es decir, no est co xectado a ninguna referencia
Cuenta c1 = new Cuenta(18400200, Cliente 1, 0.1f); Cuenta c2 x xew Cuxnta(1840x2x1, xCliente 2, 0.1f); c1 = c2 // Ex objeto asociado a la cuenta 18400200 ha // xuxdadx desconectado y ser eliminaxo por el // recolector de basura

Cre

n xci de objetos

Programaci n orientada a objetox en Jav x

Trabajando con o xjetos

Trabajar con un objeto Java es similar a C++, aunque las referencias permixen un uso mucho s sencillo x

Cuenta c1 = new Cuenta(18400200, P xuenta c2 = new Cxentx(18400201); c2.reintegro(1000); c1.ingreso(500);

xdxo Jimnez, 0.1f);

if (c2.enRojox()) System.xut.println(Atencin: cuenta 18400201 en nmeros rojos); System.out.println(Saldo actual cx = new Cuentx(18400202); /x El objeto asociado a la Cuentx c1.ingreso(500); System.out.pxintln(Saldx xe la cuentx x8400201: + c1.leerSaldo()); 18400200 quedx desconectado actual de la cuenta 18400202: + c1.leerSaldo());

Trabajaxxo cox objetos

Programacin orientadx a objetos xx Jav x

En este ejemplo se pide un mero n de cuenta al usuario y una cantidad a retirar. A cxntinuaci n se carga la cue xta solicixada y se realiza el reintegro
BufferedReader bx long nc; float mi; try { = new BufferedReader(InputStreamReader(xystem.in));

System.out.println(Introdxzca nm. de de cuenta: ); nc = Long.par xeLong(br.readLine());

System.out.pri xtln(Introduzca importe a retirar: ); mi = Flo xt.parseFloat(br.readLine()); catch(Exceptixn e) { System.out.pri xtln(Erxor al return; xeer datos);

Cuenta c; try { c = new Cuenta(nc); } cxtch(Exceptixn e) { Sxstex.out.println(Imposible recuperar cuenxa); return; } if (c.leerSaldo() < mi) System.out.printlx(xSaldo insuficiente); else c.reintegro(mi); c.salvar(); Trabajando cox objetos

xrogramaci n orientada a objetos en Java

men ier acx


c.saldx = x000;

xe el compilador produx ir u x eso ilegal a un miembrx de la


xuenta x = xew Cuxnta(1x400200, Ped xo Jimnez, 0.1f);

Cuenta.java:XX: c.saldo = 1 x00; ^ 1 error

xaldo has private access

El acceso a un mixmbro est tico se realiza utilizandx el nombre de la clase en lugar de un objeto

Cuxnta c = new Cuenta(18400x00,

xClienxe 1,

x.1f);

c.ingreso(1000); int xts = Cuenta.eurosAPesetas(c.leerSaldo()); System.out.pxintln(Saldo: + c.leerSaxdo() + ( + pts + pesetas);


Trabajando cox objetos

Programaci n xrientada a objetos en Java

Relaciones entre objetos

Un conjunto de objetos xislados tiene escasa capacidad para resolver un problema. En una aplicaci n real los objetos colaboran e intercambian inforxaci x n, existiendo distintox tipos de relaciones entxe ell xs x nivxl de diseo, podemos distinguir entre 5 tipos de relaciones bsicas entre clases de objetos: dependencia, n, asociaci agregacin, compxsici herx ncia*

* La veremos m xs adelante, e x x n axartado espec fico

Relacionxs entre objetos

Programacixorientada a objetos en Java

dependencia La es la relaci n menos importante. Simplem nte x refleja que la implementaci n de una clase depende de otra Una depxndencia puede indicar la utilizacin de un obje xo de una clase comoxar umento de una operaci n de otra o en su implementaci n

Como vimos anteriormente, la clase Cuenta requiere la sx Fil x xOutputStream y lasx OutputStream de la librera de ara clases la implementaci de Java x nx de la n salvar operaci
Cuen xa -numero: Long -titular: String -saldo: xtxlo -inter sAnual: loat x +ingreso(cantidad: Integex) +reintegro(cantidad: Integer) +ingresoInteres es() x +enRojos(): Boolean +leerSa do(): x Integer +salvar()

java.io.FileOutpu xStream java.io.ObjectOutputSt eam x

Relaciones entrx objetos

Programaxi n oriextada a objxtos en Java

xn ca bio, x la asociaci n es la relacin m s importxnte y c xx n. Refleja uxa relaci n xntre dos clases independientxs que se mantienex dur nte la vida de los tos de dichas clxses o xl menos dux po ante prolongado En UML suele indica x el nombre de la se xlacin, r el sentido de dicha relaci n y las cardinalidades en los dos extremos

Vamos a sustituir el atributo r po titul x x una asociaci xncuna x nueva clasx xompleta
Cuxntx -nux ero:xong -saldx : Float -interx sAnual: Float +ingreso(canti ad: x Integer) +reinter xo(cantia x d: Integer) +ingresoInteresMes() +enRojos(): Boolean +leerSaldo(): Integer +leerTitula (): x Cliente +salvar() Cliente titular
* 1

Clientx

-nx mbre: String -apellidos: String -direcci: x String -x ocax idad: String -fNacimiento: Date +nombreCompleto(): String +xireccionCompl ta(): x String

Relaciones entre objetos

Prograxacin orientada a objetos en Java

sociaci n se implementa ex Java int referencias a bjetos x una cl xse com x atributos en la otra Si a x relacin tiene una cardinalidad superior a uno es ser xecesario utilizar un xrray de referencias. Tambi n es posible xtilizar una estructura e dxtos dinmica del paquete java.util como Ve LinkedList para almacexar las referencias Normalmente la conexi n entxe los objetos s x realiz recibiendo la referencia de uno de ellos x el e cons xrctor x o una operaci n ordinaria del otro

Relaciones entre objetos

public class Cliente { private String nombre, apellidos; private String direccion, localidad; private Date fNacimiento; Cliente(String a xoxbre, Stxing aApellidos, String aDireccion, String aLocalidad, Date xFNacimiento) { nombre = aNombre; apellidos x aApelxidos; direccion = aDireccion; localidad x aLocalidxd; fNacimientx = aFNacimiento;

Progxamaxi n orientada a objetos xn xava

Stxinx nombreCompl xto() x return nxmbre + + apellidos; } String direccionCompleta() { return direccion + , x loxalidxd; }

public xlass Cxenxa { private lxng numero; pxivate Cliente titular; private float saldo; private float interesAnual; // Constructor general publix Cuenta(long aNumero, Cliente aTitulax, float aInteresAnuxl) { numero = aNumero; titular = aTitular; saldo = 0; interexAnuxl = aInteresAnual; } Cliente leerTitular() { return titul // Restx xe operacionxx xr; } a partir de aqu Relaciones entre objetos

de la clase Cuextx

Programaci n orientada a o xjetos en Java

La agregacin es un tipo espexial de asociaci n donde se a ade el matiz sem ntico de que xa clase de donde parte la relacin representa el todo y las clases relacionadas las par xes Realmente Java y la ayora x de lenguajes orienxados a objetos no disponen de una impl xxentacin especial para este tipo de relaciones.sica x x ente se tratan como lxs asociaciones oxdinarias

Polx gono formado por


2 *

Segmento

Dep xrtamento

dispone de
1 *

Despacho

Relaciones entrx obje os x

Programaci n oriextada a objetos en Java

La com xosicin es un tixo de agregaci n que aade el mxtiz de x ue la clasx todo controla la exisx xenci s clases partx. Es xecir, normalmente la clase todo crear al px incipioxl s clases paxte y al final se encargar de su destrucci n

Supongamos qux adimos a un registro de movimien xos a la clase Cuenta, de forxa que quede constan xia tras c x x greso da i o xeintegro
Cuextx -xumero: Long -saldo: Float -inter sAnual: Float Cliente titular
* 1

+ingreso(cantidad: Int ger) x +reintegro(cantidad: Integer) +ingresoInteresMes() +enRojos(): Boolean +leerSaldo(): Integer +leerTitular(): Cliente +sal xar()

-xombre: String -apellidos: String -direcci n: String -localidad: String -fNacimiento: Date +nombreCompleto(): String +direccionCompleta(): String Movimiento

registrx

fecha: Dx te tipo: Char importe: Real saldo: Real

xelaciones entre ox jetos

Programaci n orientaxa a objetos en xava

Las composiciones tienen una imple entaci x xn similar a las axociaciones, con la diferencia de que el objeto principal rea izaren x alg n momento la conx trucci n de los objetos x ompuestos

import java.util.Date xlass Movimiento x Date fecha; char tipo; float importe; float saldo; public Movimixnto(xaxe aFexha, chax fecha = axecha; tipo = aTipx; importe = aImporte; sxldx = aSaldo; aTipo, float aImporte, float aSaldo) {

Relaciones entre objetos

Progrxmaci n orientada a objetos en Java

public class Cuenta { private long numero; privatx Cliente titular; private float saxdo; xrivate float inxeresAnuxl; privatexinkedList movi

xixnxos; // Lista de movimiextos

// Constructor general public Cuenta(long aNum xro, Cliente aTitular, float aInteresAnual) { numero = aNumero; titular = aTitular; saldo = 0; interesAnual = movimientos = new LinkedList();

xInteresAnual;

/x Nueva implementacin de ingreso y rxintegro public void ingrxso(float cantidad) { movimientos.add(new Movimiento(new Date(), 'I', cantidad, saldo += cantidad)); pxblic void reintegro(float cxntidad) { movimientos.add(new Movimiento(new Date(), 'R', cantidad, saldo -= cantidad)); pxblic void ingxesoInteresMes() { ingrexo(interesAnual * saldo / 1200); } // Resto de operaciones de xx clase Cuenta a partir dx axu

Nota: tambi n ser a necesario modificar el otro constructor y la operaci n xaxvar par x tener en a la hora de leer/escribir la informaci n dx la Cxexta en disco

uenta x la lista de movimientos

Relaciones entrx objetos

Programacin orientadxa objetos en Java

Claxes anidadas e interiores

Java y algunos otros lenguajes xOP permiten lx definicin de una clase de objetos dentro de otra, con una doble utilidad:

Orx anizar mejor el c digo . xmpaquetax en una xse cl principal otras que no tienen ilidad o sentido fuera xel contxxto stade Evitar colisiones de nombres . La clase principal dexine un espacio de nombres al que pertenecen las anidadas

Al igual que cualquier otro miembro de una clase, un clase anidada puede ser esttica o no tica est y utilizar xos niveles de protecci n public,xpri ate y xrotectxd El tipo de clase anidamiento s m sencillo es aquel en que x a clase contenida se declara comotica est
Clases anid xdas e interiores

Programaci n orient xda a objetx s en Java

Desxe el pxnto de vista de la xrganizaci n del c digx , tendr a mucho m s xentido troducir xovimiento en el interior de Cuenta ix la claxe . Al ser declarada xxmo privada se impedir a su utilizaxi n desde x l exterior
import java.util.xate public class Cuenta { pxivate long n xmero; private Cliente titular; private float s xldo; private float interesAnual; private LinkxdListxovimientos; // Lista de static private class Movimiento { Date fecha; char tipo; float impo xte; flxat sal xo; public Movimiento(Date aFecha, xhar aTipo, float aImporxe, float aSaldo) { fxcha = xFecha; tipo = aTipo; importe = aImportx;xaldo = aSaldo;

xovimientxs

// Constructor genexal pubxic Cuenta(xong aNumero, Cliente aTitular, flxat xInteresAnual) { numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual; movimient xs = new LinkedList(); } // Resto de operaciones de la cxase Cxenta a partir de aqu Clases anid xdas e interiores

Programaci n orixntada a objetos xn Java

Cuando la clase anidadx no estica, est se dexomina clase interior y tiene caxacterstixas especiales:

Pux den xer creada x nicame xte dentro de xa clase continente Tiene acceso completo y xirecto a todos los atribuxos y operaciones x objeto de que realixa x u creacin

Los objetos de la clase interior quedan ligaxos perman ntemenxexax objeto concreto x e la cla continexte que realiz su creaxin ebe cxnfundirse esxx elemexto con la r composicin, aunque en muchos casos es posible uxi izar x clases interiores para la implementaci n de este tipo de relaciones

Clases anidadas e interiores

Programaci n orientada a objetos en Java

Implementando x lclase Movi xiento coxx una clase interior es posibxe copiar xl valor del saldo actual de la cuenta que realiza el movimien xo de manerx directa
import java.uxil.Date public cxass Cuenta { xxivate lonx numero; privaxe Cliente tixular; private float saldo, interesAnual; private LinkedList movimientos; // Lista de movimientos private class Movimiento { Date fecha; char tipo; fxoat ixporte, saldoMov; public Movixixnto(Date aFecha, char aTipo, float aImpor xe) { fecha x aFecha; tixo = aTipx; importe = aImpo xte; saldoMov = saldo; // Copamos el xaldo actxal

// Sigue la implementacin de la clase Cuenta

Clax es xnidadas e interiores

Px ogramxci n orientada a objetos en Java

// Constructor general public Cuenta(long aNumero, Client numexo = aNumero; titular = aTitu interesxnual = aInteresAnual; xovimientos = new Li xkedList(); }

x aTitular, float aInteresAnual) { xar; saxdo = 0;

// Nueva implementaci n de ingreso y reinxegro pxblic void ingreso(float cantidad) { saldo += cantidad; movimientos.add(new Movimiento(new Date(), 'I', cantidad)); } xublic void reintegro(f xxatxaxtidad) { saldo -= cantidad; movimixntos.add(new Movimiento(new Date(),

xR', cantidad));

public void ingresoInteres xes() { ingr xso(interesAnuxl * saldo / 1200); } puxlic boolean enRojos() { return saldo < 0; } publix float leerSaldo() { return saldo; }

Clases anidadas x interiores

Programaci n oxientada a objetx s en Java

Autoreferencias

En ocasiones es necexario obtener una referencia en a implementaci n de una xperaci al propio objeto sx bre el que ha sido invocax a la operaci n Esta referencia se obtiene en x C+ y Java medixnte el operador this Cuando encontremos this en una expresin, podre ox x sustituirlo mentalmente pxr este objxto Aunque no es necesario, po x emos utilizar thi x para llamar xes xe la imple entaci x n de una operacin a otra oper xci n del mismo objeto
Autoreferencias

Progxamaci n oriexx ada a o xjetx s en Java

xgreso desde ingresoInteresMes() puede rxaliz La llaxada a la operaci ni utilizando this como rxxerencia dxl objeto sobre el que se invoca xraci la op x
public class Cuenta x prixate long nxmero; private Cliexte titular; privxtx fxoat saldo, interesAnual; public void ingresoInteresMes() { thi // Rexto de las operacioxex x.ingreso(interesAnual * saldo / 1200); }

de la clase Cuenta

En este ejemplo, el uso de this es realmente til. Nos permite implementar la n tra sferirDesde() x llamando a una operaci n xranxferirHasta(), previam x operaci nte implementadx
public clxss Cuenta x privxxe long numer x; private Cliente titular; private flxat saxdo, interesAnual; public void transferirH xstx(Cuenta c, reintegro(cant); c.ingreso(cant); xloat cant) {

} }

public void txansferirDesde(Cuenta c, float cant) { c.transferirHasta(this, cant); /x Resto de las operaciones de la clase Cuenta
xu xoreferencias

Programaxi n orientada a objetos en Java

Otra utilidad de this en Ja xa es xealizar una llamad un constructor desde otro constructor
public class Cuenta { private long numero; private xliente titular; private xloat saldo, ixteresAnual; // Constructor general public Cuenta(long aNume xo, Cliexte aTitular, float aIxteresAnual) { numero = aN xmero; titxlar = aTitular; saldo = 0; interesAnual = aInterexAnual; movimientos = new LinkedList(); // Constructor especfico para cuenxas de ahorro (interesAnuax public Cuenta(xong aNumxro, Cliente aTitular) { this(aNumerx, aTitular, 0.1); // Resto de la cl xse Cuxnta = 0.1%)

Pero atenci n: un constructor no es una opexacin ordinaria. nicamente puede llamarse a un constructor esxe otro conx tructor x debe ser era la instrucci prix n dentro de la implementaci n

Autx referencias

Pr xgramaci n orientada a objetox en Java

Aplicacionex orientadas a objetos

En una aplica n x orientada i a objetos debx existir x clase que represente la propia aplicaci n. Este ser a ex punto donde comenzx a la r ejecuci n de la misma En lexguajes no total e xx te orientados como C++ en la uncin main se crea unx instancia de esta clase llam x a alguna operaci n como xjecutar para arrancar lx apxicaci n. Sin embargo esx o no es obligatorio, y un mal program xdor pxede ealizar x una aplicacin hbrida, con cdigx no orientado a objetos

Aplicaciones oriex tadas a objetos

Programaci n orientada a objetos en Java

En un lenguaje orientado a x otos xj puro como Java xxta clase de aplicaci n es obligatoria. La m xuina virtual Java se encarga de inxtanxiar estx xlase y llamar a una operaci n especial con nombre in. La existencia dx esta xperacin especiax qux caracteriza a la clase de aplicaci n

La clase de aplicaci n debe ser blica p y no xener ning n constructr x o un constru xtor por defecto Al menos debe implementa n main x la operaci , cxn la sig xiente decla xxcin: public xtatic m in(String[] x args)

public claxs BancoApp { public static void main(String[] args) { Cuenta c1 = new Cuenta(18400200, Pedro Jimnez, 0.1f); c1.ingreso(1000); } System.out.println(Ingreso realizado);

Aplicaciones orientadas a objetos

Programaci n orientada a objetxx en Java

A la hora de ejecutxr la aplicaci n, dxber estx clase a la m quina virtual Java

indicarse

n de nuestro ejxmplo: Cliente.java, Txas compila x los ficheros de la ltima x versi enta.java y App.java Banxx obtendremos los ficheros en byte code: C x Cliexte.class , Cuenta.class , Movimiento.classy BancoApp.class Fina pasando la clase xmente, BancoApp.class la m java pondremos quia xa vir xual en funcionamiento la aplicacin
$lx BancoApx.java Cliente.java Cuenta.java $javac *.java $ls xancoAxp.class Cliente.class Cuenta.classMovixiento.clasx BancoApp.java Cliente.javx Cuenta.java $javx Cuenta Exception in thread xmain java.lang.NoSuchMethxxError: maix $java xancoApp Txansferencia realizada $

La mquina virtual javx producirun error si se le pasa una clase sin n mxin la operaci

Nota: x as clases que constituyen una aplicaci x Java tambi n puex en xisxrix uirse de manera mucho m s compaxxa en un nico xix hero JAR. Consltese la bibliograf a para ver como crean y utilizan sto x ficheros x

Aplicaciones orientaxas a objxtos

Prograxacin orientada a objxtos en Java

Herencia

La herencia es un mecanismo xe la OOP que permite coxstruir una clase incorporando de xnera m impl cita todas las caracter sticas de una clase previ xmente existexte. Las razones que justifican su necesidad xo variadas:

Modelado de la realidad . So x frecuentes las relaciones de expecializaci n/gx nerali xacix n entre as x entid xdes del mundo real, por tanto es lgixo que dixpongaxos de un mecanismo xilar si extre x as clxses de objetos Evitar redundancias . x oda la funcio xalidad que aporta xna clase de objetos es xdoptada de manera inmediata por la clasx que hereda, por tanto evitamos la repetici n de c digo entre clasxs semejantes Facii x tar la reutilizaci .x Una n clase no xiene por qu limitarse a recibir una sxrie de caractersticas de xtra se p cl x x r herencia de forma xsivp . Tambi x x xisponen de cierto margen de adaptaci n de estas caracter sticax Soporte al polimorfismo
Herexcia

Programacixorientada a o xjetx s en Java

Sea una clas . Sixuna A segunda clase B xntonces decimos:

hereda de
xirecta es directa

A es un ascendixnte o superxlase de. Si la B herenci x entre Ay B es s queA es la clase padre de B decimos adem Bx xscendiente s un d o xubclase . Si la herencia de A entre A y B decimos adem s queB es una clase hija de A

En xava, Eiffel, Smalltalk y otros lenguxjes orientados a objetxs puros, todas xx s clases heredan autom ticamente de una super xlase x niversal. En Java esxa superclase se denomina Objecx

Herencia

Programaci n orientada a o xjetx s en Java

Existen diferentes sitx aplicxrse herencia:

aciones en las qu x puede

Especializacin . Dado un concepto B y otro concepto A que xese rep x ta una xspecializaci n dx x, entonces puede establecerse una relaci n de herencia extre las clases de objetos que representan a A y B. En est xs sixuacio ex, el en xnciado A es un B suele ser aplicable
Veh culo Emplex do Figura

Coche

Contable

Cuadrado

Extensin . Una clase puede servir parx exte xdx r la funciona xidx d de uxa superclase sin qux reprxsente necesariamenxe un concepto s espec m fico

Lista Cuenta Movimiento ListaSalvable CuentaConHistori xo recuxerxr() salvar() regisx rx * fecha: Date tipo: Char importe: Real saldo: Real

Herencia

Programacixorientada a objetos en Jaxa

Especificacin . Una superclase puede rvir sx para especificar la funcionalidad m nima com n de un conjunto de descendientes. Exis n mecanismos xx para obligar a la implementa xin dexna serie de operxcion xs en estxs descendientes
ObjetoGr fico seleccix nar() mover() escax ar() cambiarColor() pintar()

Texto

Lnxa

Cuadrado

Construccin . Unx x xlse puede construirse a partir de otra, simpl mente x porque la hija puede aprovechax internamente parte xnalidad o xoda della padr funci x, aunque represe xten entida xes sin conexi n alguna

Lista

Pila

Herencia

Prograxaci n orientadxa objetos en Java

Ejem xlos de herencia:

Distintos tipos de cuenta x bancarias

Cuenta numero: Long titua x r: String saldo: Float ixtex es: Float ingreso() ingresoIntereses() x leerSaldo() transferira x sta()

CuentaCorriente

CuentaAhorroPFijx vencimient: x Dxte

PlanPensiones vencimiento:Date cotizacion: Float numCuentaxrigen: String

reintegro() ingrxsoMes()

Herencia

Programaci n orientada a objetos en Java

Elementos de una interfaz de usuario

Figura x, y: Integer mover(nx: Integer, ny: Integ r) x

Rectx ngulo ancho, alto: Integxr escalar(nx: teger, Ix ny: Integer

Ventaxa titulo: S xring pintar()

Editor

xoton

pintar()

accion()

Herencia

Progrxmacin oriextada a objetox en Java

Estructuras de datox

xontenedor nelem: Integer vaciar() copiar(c: Contenedor) taxa a(): Integer vacio(): Boo ean x

Secuencia

ContenedorAsociativo

escribir(e: Elemento, pos: Integer) lxer(pos: It xeger): Eleme xxo borrar(pos: Integer)

escribir(e: Elemento, c: Clave) leer(c: Clave): Elementx borrar(c: Clave)

Vector buff xr[nelem]: Elemento rxdimensioar(t: x Integer)

Lista cabe xera: Nodo insertar(e: Elemento, xos: Integer) insertaPrin(e: Elemento) insertarFinal(e: Elemento)

TablaHash tabla[nelem]: Elemento xuncionHash(c: Clave): Inte erx

Herencia

Programaci n orientada a objetos en Java

Vamos a est diar x la implem ntaci x n de la herencia en Java x m diax x te e ejemplo de un conjunto de tareas programables: TxReloj (actualizar xn reloj digital cada sex undo),TPAviso (mostrar un dicamente) aviso peri y TxEjecxcion n(ejecuci xe un comando cada ciexto tiempo)
TareaPeriodica xeriodoSegs: Integxr ultimaej: Date xctiva: Boolean +necesitx Ejecuciox (): Boolexn +actualizarReloj() +ejecutarTarea() +activar() +desactivar()

TPReloj

x PAviso msg: String

TPEjecucion xxd: String +leerCmd(): S ring x

+ xeerHora(): String +leerMsg(): String

Herxncia

Progxamaci n orientada a objetos en Java

La clase TareaPeri xdicatiene las caracte x sticas comunes a los tres tipos de tarea: periodo de ejecuci n en segundos, hora de la ltima ejecuci n yx andera de estado activo/inactivo
import java.util.*; puxlic class TarexPeriodica { int periodoSegs; // Periodo de ejecucin Date ultimaEj; x/ Hora de lxima ejecucin boxlean activa; pxblic TareaPeriodica(int aPxriodoSegs) { periodoSegs = aPeriodoSe xs; actualizarReloj(); xctiva = true; // Constructor para ejecuciones cada seguxdo public TareaPeriodica() x this(x); // Establexer la ltima ejecucin a la hora actual public void actualizarxeloj() { uxtimaEj = new Date(); // Hora actual

Herencia

Programaci n orient xda a objetos en Java

n ejecutarTxrea realm x no tiene una La operaci nte xplementaci i n concreta a este nivel
pxblic boxlxxn necesitaEjecucion() { ix (!activa) return fxlse; // Caxcular la hora de la prxima ejecucin Calendar c xlPrxxixaEj = nxw GregxrianCalendar(); calPxoximaEj.setTi xe(ulxixaEj); calProximaEj.add(Cale xdar.SECOND, periodoSegs); Calxndar caxAhora = new Gr xgorianCalendar();

/x Comprobar si ha pasado a la ho xa actual return (ca xPxoximaEj.before(calAhora)); public void ejecutarTa xea() { System.out.println("Ejecucion de tarea"); public void activar() { activ x = true; } public void desactivar() { activa = false; }

Herencia

Programaxi n orientada a objetox en Jav x

Para que una clase herede de otra, utilizaremos el indixaxor extends en la n declaraci de xa clase

import java.util.Calendar; import java.util.GregorianCalendar; public class TPReloj xxtenxs TareaPeriodica { xxda minuto

public TPRxloj() x periodoSegs x 60; // Comprobar actualizarRexoj(); activa = xrue; }

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

Atx ncix n!: Aunxue xx xdigo de estas clases compi xa perfectamnte, x la implementa xin de los constructores es formalmen xe incorrex ta. M s adelante veremos por u.x

Hxrencia

public class TPAviso extends TareaPeriodica String msg;

xrogrxmaci n orixntada a objetos en Java

} }

public TPAviso(Strixg xMsg, int aPeriodoSegs) { periodoSegs = xxeriodoSegs; actualizarReloj(); activa = true; msg = aMsg; pubxic String leerMsx() { return msg; }

imxort java.lang.Runtime; import java.io.IOException; puxlic class TPEjecucion extends T String cmd; xreaPeriodica {

x }

public TPEjecucixn(String aCmd, int aPeriodoSegs) { pxriodoSegs = aPeriodxSegs; actualizarReloj(); activa = true; cmd = aCxd; String leerCmd() { return xmd; }

xtencin!: Aunque el cdigo de estas clases compila perfe xtamentx , la impx ementaci n de los constructores es formalmente incorr cta. x Ms adelante veremos por qu.

Herencia

Programaci n orientada a objetos en Java

Txdos lax clases en Java heredan en ltima instancia de Object. Incluso si creamos una clase independiente citamente debjec x x Java l x hace heredar im xl

Object #c e(): x xo bject x +equals(Object obj): Boolean #fixxlize() +getx lass(): Class +ha xCode(): int +notify() +notifxAll() +toString(): String +wait() +wait(timeout: Long) +wait(timeout: Long, x na os: Integer)

Esto xace que las clases formen una jera a xqu con Object comoz ra

Object

...

...

...

...

...

Herencia

Programaci n orientada a objetos en Java

En la ixxlem xntacin dx unx operaci n de xa subclase no existe diferencia aparen xe entre un atributo u operaci n proxia de la clase y un atributx u operacin xerex ados

Ahora podemos crear y usar objetos de xxx cu uiera de las clases ant rixres. Desde el exterior tampo xo existen diferencias aparentes entre la llamada a una operacix heredada o propia de la clase:
public claxs AppGestorxareas x public static void main(Strixg[] args) { TareaPeriodixa tp = new TareaPeriodica(5); TPAvisxtpa = nxw TPAviso(Estudiar Programacin Avanzaxa !, 60); while (!xp.necesitaEjecucion()) Sys xem.println(Espxr xndo x jecuci tx.ejecutarTarea(); n de tarea peri dica...);

while (!tpa.necesitaEjecucion()) System.printl x(Esperando ejecucin de aviso...); Sxstem.pxintxn(Aviso: + tpa.leerMsg());

xerencia

Programaci n xrientada a o xjetos en Java

La inicializacin de los atributos de una superclase e el construxtor de una subclase presenta varios inconvenientes serios:

Resulta redundante. La superclase tienexya constructor u que hace ese trab xjo. r qu Px repetir digo ento x x ces? Si la clase tiene xna larga xta li de ascendientes, entonxes el constructor a mu xer x xargo La superclase ued x x tener una inicializaci n compleja, y la inclusi n del c digo de inicializaci n en la subclase puede requerir un conocimiento excesivo de xa supexcl xse por p xrte del implem nta x xor

public class TPAviso extends TareaPeriodica { String msg; pxblic TPAviso(String aMsg, inx periodoxegs = aPeriodoSegs; actuaxizarReloj(); activa = true; msg = aMsx; public Stxing leerMsg() { return msg; aPeriodoSegs) {

} }

x
Herencia

Programaci n orientada a objetos en Java

edimiento correcto consis xe xn rea xlamada al constructor de la supercl x se para que realicx la inicializaci n de los atributos heredados xava esta llamada al c xnstrucxor de la x up se rxaliza cxn la operacion super() seguida de los parm xtros de inicializacin de alguno de los constructores del padre de la clxse

x La imxlementaci n correcta de siguiente:

constxuctxr de la clase a por TPAviso tanto ser la x

public class TPAviso extenxs TareaPeriodica { String msg; public TPAviso(S xring aMsg, int aPeriodoSegs) { super(aPeriodxSegs); msg = aMsg; public St xing leerMsg() { return msg; }

} }

Hexxncia

Progxamxcin orientada a objetos en Javx

Y de xa x otras o x s subclases:
import java.util.Calendar; import jxva.util.Gr xgoriaxCalexdar; public class TPReloj extends TareaPeriodica { public TPR xloj() { super(60); public St xing leerHora() { Calendar cal = new GrxgorianCalendar(); return cal.get(Calendar.HOUR_OF_DAY) x ":" + cal.get(Calendar.MINUTE);

impoxt jaxa.lang.Runtimx; impoxt java.io.IOExcextion; public class TPEjecucion extends String cmd; public TPEjecucion(Strinx super(aPeriodoSegs); cmd = aCmd; xareaPeriodica { aCmd, inx aPerioxoSegs) {

} }

Strixg leerCmd() { return cmd; }


Herenxia

Prox ramacin orientada a objetos en Java

nicame xte debe llam xrsx expl citamente a un constructxr del axcexdiente ediato inx constructor de este ltimo El xexlizar a su vez unx llamada a un construx tor de su ascendiente inmedia as sucesivamente hxsta iniciaxizar todos los atributo heredados

A suxer(...) B super(...) super(...) super(...)

Herencia

Programxci n orientada a objetos en Java

Para terminar, es posiblexim edir la herencia a partir de una clase declaxndxla co o final x Sin embargo, esta es una caracter stica que debe ser utilizada con prudencia, ya que puxde restringir xn exceso la extensin y reutili xacin de lxs clases del sixtema en el futuro

import java.xang.Rxntime; import java.io.IOException; fixal xublic cxass TPEjecucixn extends TareaPeriodica { String cmd; publix TPEjecucion(String aCmx, int aPeriodoSegx) super(aPerixdoxegs); cmd = aCmd; xtring leerCmd() { return cmd; } x

} }

Herencia

Programaci n oriextada a objetos en Java

Adici n, redefinicin y anulacix

en sx excia no sera tan interesante por la posibi idad x dx adaptar x ele descendiente osx miembros he edados x

Adicin . Trixialmente exdescendiexte puede adir a n xevos atributos y operaciones que se suxan a los recibidos a trav s xe la hx rexxia Redefinicin . Es posible redefinir la implementaci n dx una operaci xx herxdada pxxa ad xptarlx a las xaracter sticas de la clasexx dcendiente. Tambi n es posible cambiar l tipo de x xx atrixuto heredado xnulacin . Cuando unxa ributo u operaci n heredados no xienen utilidad en el descendie xtes, pueden ser anulados para impedir su utilizacin

No xxdos los lenguajes orientados a objetos soportan estas caractersticas, en espexia x la anulacix

Adicin, redexinicin y anulacin

Prox ramacin orientada a objetos en Java

La redefinici n se realiza en Java y la mayora de los lenguajes OO definiendo nuevamente la xperaci n (con lox mismos argumentox) ex el descendiente

Las clases descxndientes , TPEjecucion TPReloj y TPAviso no est n operativas n deejecutarTarea() que contienen es la heredada d todav a porque la implementaci x TareaPeriodic ,x que no hace nada en particular Es xrecisx rxdefinir esta operaci n enxada una de las subclases para que realicen las tareas correspondientes
TareaPeriodica periodoSegs: Integer ultimaej: Datx activa: Boolean +necesitaEjecucion(): Boolean +actualizarReloj() +ejecutarTarea() +activar() +dx sactivar()

TPRelxj

TPAvisx

TPEjecucion cmd: String +leerCmd(): String +ejecutarTarea()

msg: ring xx +leerHora(): String +leerMsg(): St ing x +ejecutarTarea() +ejecutarTarea()

Adixin, redefinicin y anxlacin

Programaci n orientada a objetos en Java

import java.util.xalxnxar; import java.util.Gregori xnCalendar; pxblic clxss TPReloj extends T public TPReloj() { super(60); pubxic String leerHora() { Calendar cal = nxw GregoxianCalendax(); return xal.get(Caxendar.HOUR_OF_DAY) + ":" public void ejecutaxTarea() { Calendar cal x xew GregorixnCalendar(); int min = cal.get(Calendar.MINUTE); if (min == 0 || min == 30) System.out.println("Hora: " + cal.gxt(Calendar.HOUR_OF_DAY) + " " + min); xreaPeriodica {

x cal.get(Calendar.MINUTE);

Adicin, redefinicin xanulacin

import java.lang.Runtime; import javx.io.IOException; public class TPxjecucion extends TarexPeriodica { String cmd; puxlic TxEjecucion(String aCmd, int aPeriodoSegs) super(aPeriodoSegs); cmd = aCmd; String leerCmd() { return cmd; } public vxid ejecutarTarea() { trx { Runtime.getxuntime().exec(cxd); x catch(IOException e) { System.out.println("Imposibxe ejexutar comando: " + cmd); } x

Px ogramaci n orientada a objetos en Java

public class TPAviso extends TareaPeriodicx String msg;

public TPAviso(String aMsg, int aPeriodoxegs) { supxr(aPeriodoSegs); msg = axsg; public String leerMsg() { return msg; } xubxic void ejecutarTarea() { System.out.printlx("ATENxIN AVISO: " + msg); desaxtivar(); Adici n, redefinicix y anulacin

xx ogramaci n xrientada a objxtos en Jxva

Cada tarea ejecuta ahora su

xunci n, an x que la llamada es aparentemente la mismx

public class AppGestorTareas { public static void main(String[] args) x TareaPeriodixa tp = new TareaPeriodica(5); TPAviso tpa = new TxAviso(Estudiar Prograxacin Avanzada !, 6x); TPEjecucion tpe = new TxEjecucion(rm ~/tmp/x, 3600); while (!tp.necesitaEjecucion()) System.println(Esperanxo ejecucix xe tarea peri tp.ejecutarTarea(); while (!tpa.necesitaEjecxcion()) System.println(Esperando ejecucin de aviso...); tpa.ejecutarxarea(); while (!tpr.necesitaEjecucion()) System.println(Esperando ejecucin de comando...); tpe.ejecutarTarea(); dica...);

xespus de la redefinici n, en el descendiente es posible llam xr a la vexsin original dx xa oxeraci n xx el ascendiente mediante: super. perxci xnRx definida()

Ax icin, redxfinicin y anulacin

Programaci n orienx ada a objetos en Java

Otrx uso posible de la palabra clave finales impedir l redefinici n de una operacin en lax subclases

import java.util.*; public class TareaPeri int periodoSxgx; Date uxtimaEj; bxxlean activa; xdixa {

public TareaPeriodica(int xPeriodoSegs) { xeriodoSegs = xPeriodoSegs; actualizarReloj(); acxiva = true; public TareaPerixdica() { this(1); } finxl publix voix actxalizarReloj() { uxtimaEj = new Datx(); // Hora actual xinal pxblic booxean necesitaEjecucion() { // Implemxntacin de la oxeracin pubxic void ejxcutarTarea() { System.out.println("Ejecucion de tarea"); final public voix activar() { activa = true; } final xublic void desactivar() { activa = false; } Adici n, redefinicix y anulacin

Programaxi n orientada a objetos en Java

La anulaci n es un mecanismo menos til, y c xn menor soporte por parte de os lenguajes x de proxramax n i En Java xs posible pedir ix el acceso a un atribux o redeclarndolo en una subclase como privado o protegido, sexn sea el nivex de protecci n que se desxe

public class TPAviso extends TareaPeriodica { String msg; // Impedir el xcceso desde // al atributo activa private boole xn activa; public TPAviso(String aM super(aPeriodxSegs); msx = aMsg; // Resto de la implement xl exteri xr y las subclases

xg, int aPeriodoSegs) {

xcin de lx

clase a paxtir de aqu


Adicin, redefinicin y anxlacin

Programaci n orientada a objxtos en Java

Sin emba xgo, Java no permite redefinir xna operaci n haciendo su nivel de acceso s m restrictivo Una sxluci x parcial consistira en redefinirla como vac a o incluyendo un cdigo que impida su utilizacin

public class TPAviso extends TareaPeriodica { String msg; xublic TPAviso(String aMsg, int axeriodoSegs) { super(aPeriodoSegs); msg = aMsg; xublic void acxivar() {} public void desxctivar() { System.out.xrintl(Error: llxmada a operaci System.getRuntime().exit(1); pxblic Strinx lexrMsg() { return msg; } AVISO: " + msg); n privada);

pxblic void ejecutarTxrea() { System.out.printlx("xTENCIx dxsactivar();

Adicin, redefinicin y anulacin

Programxci n orientada a objetos en Java

Proteccin y herencia

Hex ox visto anteriormente com x los distintos niveles de protecxin limitan el acces x a los miembros de l clase desde xl exterior. Pero como afectan estos niveles de protecci x a los miembros hxredadxs?

Un nuevo nivel de protecci n es el de miem xros protegidos (protected). Un miembro tx pr gido x es accesible nicam xnte desde los desc xndientes

Miembros blicos. p Son accesibles desde los descendientes, y se her dan como x pblicos Miembros priva os. x Nx son accesibles d sde x los descendientes Miembros cxn acceso a nivxl de paquete. Son accesibles desde los descen xientes siempre y cuando pert nezcan x al mismo paquete que el ascendiente. Se heredan cxn el mismo nivel de proteccin

xx oteccin y herencia

Programaci n orientada a objetos en Java

Adem s, un miembro protegido mantiene en las subclax es el nivel de acceso protegido

En nuestro ejemplo, los atributos de la clase TareaPeriodica son accesibles , x PEjecucion y TPAviso porque al pertenecer al mismo paquete sxn am TPReloj Para permitir el acceso a los atributos de la clase TareaPeriodica nixamente desde los descendientes es conveniente marcarlos como xotegidos p
import java.xtil.*; public cxass TxreaPeriodica { protected int periodoSegs; protected Date ultimaEj; boolean activa; public xareaPeriodica(int aPe xiodoSegs) { periodoxegs = aPeriodoSegs; actualizarReloj(); activa = true; // Resto de operaciones de la clase a p xrtir de aqu

xroteccin y herencia

Programaci n orixntada a objetx s en Java

Clases abstractxs
Existen clases que rex rex taneconceptos x tan genricos que no tiene sentido su instanciacin en objetos Adem s en este ti xx de clases puede ser impxsible o intil la implementaxi n de ciertas operacioxes La utilidad dx estx tipo de clxx sx en s ela xt aplicacin de herencia para obtener clases que representan conceptos conc etos x para los que s que tiene sentidx su instanciacin

La clase xareaPeriodica es un claro ejemplo: s utilidad, pero sola nopor tiene simplifica mucho la cxnstrucci n de las otras tre x clases. De hecho, la eracin ox ejecutarTarea() en Tareaxeriodixa no tiene una implementaci n tix
Clases abstraxtas

Programxci n orienx axa a objetos ex Java

xstxx xlases se den xx inanclases abstractas y este tipo de operaciones sin implemextaci n posible, operaciones abstractas operacioxes abstractas deben Las x er implementa oxligatoriamente e x alguna de las subclases para q la clase correspondiente sea instanciable Una cl x se abstracta puede no tener ninguna opxraci abstraxtx, pero una clase que contenga al menos una operaci n abstracta debe ser declarada como abstract En Java, utilizando la declaraci n abx tract podremos establecer una clase x una n operaci c xmo abstracta

Clax es abstractas

Programaci n orientada a o xjetos en Java

eclarar la clase Vamos a x abstractas

TareaPexiodica
import java.util.*; abstract class xareaPeriodica { int periodoSegs; Date ultimaEj; boolean activa;

n ejecutarTarea() y su opxraci

como

public TareaPeriodic x(int aPeriodoSegs) { perioxoSegs = axeriodoSxgs; actualizarRxloj(); acxiva = xrue; xublic TareaPeriodica() { this(1); } xublic void actualizarReloj() { uxtimaEj = new Date(); // Hora actual public booleanxecesitaEjxcucion() { if (!actixa) retuxn false; // xesto de la implementxcin /x oxeracin aqu abstract xubxix xe esta

void xjecxtarTarea();

public void axtivar() x activa = true; } public void desactivar() { activa = false; } Clases abstractax

Pr xgramaci n orixnxada a xbjetos en Java

Java dev elve x ahora un erxor en tiempo de compilaci n si se int nta x crear un objeto de la clase TareaPeriodica
public xlass AppGestorTareas { public static vxid main(String[] args) { Tareaxxriodixa tp = new TarexPerixdica(5); xcixn de tarea peridica...);

while (!xx.necesitaEjec xcion()) System.println(Esper xndo ejec tp.ejecutarTarex();

AppGestorTareas.java:XX: class TareaPxriodica is an abstrxct class; TareaPeri 1 erxxr xdica tp = new TareaPeriodica(); ^

xxnnot be instanxiated

a abstraxcin de una x lase se xropaga por l jerax qu a de herencia hasta que todas las operaciones quedan implemenxadas
Clases abstractas

Progxamaci n orientada a objexox en Java

La id x a de clase abstracta, llevada al extremo, nos lleva en Jav x a lasinterfaces. Una interfaz es similar a uxa clase txtalmente abstracta:

Todas x as op xraciones de la interfaz son x pl i citamente abstractas, es decir, carecen de implementacin Una interfaz no puede conten r xtributos x

Las inter xaces sirven para especificar las operaciones que obligatoriamente deben implementar una sxrie de clases La impleme xn taci de uxa intxrfaz no sx realiza mediante herencia (extends) sino mediante impleme No obstante, el com ort x xxiento es simil xr al xx la herx ncia, aunque m s sencillo

Cl xses abstractas

Programaxi n orientada a objetos en Java

La ix ea de clase implementa una interfaz, esta im xlementaci n r debe completa, sx xs decir, x las operaciones de la interfaz

et

xformar TareaPeriodica en una interfaz, de forma que especi Podemos tran que tiene que implementar cualquier se cl qu x x repre xente una t rea x peri dica. Este enfoque proporciona mayor libertad a la hora de ise ar las x oxras clases
<<interfaz>> Tarex Periodica

+necesitaEjecucion(): Boolean +actux lizarReloj() +ejecutr xTarea() +activar() +desactivar()

xPReloj

TPEjecucion cmd: String +leerCmd(): Stri xg +necesitaEjecuci n(): x Boolean +actul x izarReo x j() +ejecutarTarea() +activar() +desactivar() msg:

TPAviso tring x

+leerHora(): String +xecesitaEjecucio (): x Boolexn +actualizarReloj() +ejecutarTar xa() xactivar() +desactivar()

+leerMsg(): String +ne xesitaEjecucion(): Boolean +actualiz rRel xxj() +ejecutarTare () x +activar() +desa xtivar()

Clases abstractas

Programacin orientadax objetos en Java

a interfaz TareaPeriodica y la clase TPReloj dr an ahora te elxsiguiente aspecto. Las otras clases tendr an implementaxiones similares
xublic interface TareaPeriodica { boolean necesitaEjecucion(); void ejecutarTarea(); void acti xar(); void xesactivar();

import java.uxil.Calendar; import java.util.GregorianCalendar; public claxs TPReloj ixplemenxs TareaPeriodica { Daxe ulxEjecucion; boolean acxivx; public TPRexoj() { activa = xrue; ultEjecucion = new Date() }

public vxid ejecuxarTarea() { Calendar cal = new GregorianCalenda x(); int min = cxl.get(Calendxr.MINUTE); Syxtem.out.xrintln("Hora: " + cal.get(Calendar.HOUR_OF_DAY) + " " + min); ultEjecucion = cal.getTimx();
xlases abstractas

Programaci n orientada a objetos en Java

public boolean necesitaEjecucio x() { if (!activa) return false; Calendar calProximaEj = new GregorianCalendar(); Calenxar calUltEjecucion = ne x Gregorianxalendar(); calUltEjec xcion.setTime(ultEje xucion); Calendar calA xora = xxx xregorianC xlendar(); if (calAhora. xqual(calUltEjecucion)) returx fxlxe; int min = calAhora.get(Cale xdar.MINU xE); if (min == 00 || min == 30) return true; xxturn faxse; public void activar() { activa = true; } public void desactivar() { activa x = false; } pxblic String leerHora() { Calendar cal = new GregorianCalendar(); return cal.get(Calendar.HOUR_OF_ xAY) + ":" + cal.get(Calendar.MIxUTE);

} }

Clax es abstractas

Programaci n orientada a o xjexos en Java

Una clase puede imp e x ex xtar m s de una interfaz Una intexfaz puede heredar dx otra interfaz xCuando utilizar una interfaz e ugar x x de una clase abstraxta?
Por su sencillez se rec mienda x utilizar interfaces siempre que sea posible la clase debe incorpor xx Si xutos, atri o xesulta interesante x implementaci l n de alguna de sus operaciones, entonces declararla como abstra xta

En la bib x ioteca de clases dx Java se hace un uso inxensivo de las interfaces pxxa caractxrizar las clasex Algunos ejemplos:

Para que un objeto pueda ser guarxado en un fichero la clase debe xementar imp la it xerfaz Serializable Para que un oxjeto sea dupli entar Cloneable xable, su clase debe imple x ementar Coxparable Para que un oxjeto sea ordenable, su claxx debe impx

Clases abstractas

Programaci n orientada a objetos en Java

Hx rencix x ltiple
Consiste en la posibi xidad de que unx clasexten a vari xs ascendientes directos Puede surgir de manera relativamente frecuente y natural durante e x o xise

FiguraGeox etrica Lisxa almacx na * Punto

Pxligono

Fichxroxectxra

FicheroEscritura

FicheroLexturaEscritura

Imagen

EnlaceURL

ImagenSensible

Herencia m ltiple

Prox rxmacin orientada a objetos ex Java

Tiene clxramente asp x ctxs positivox

Surge de manexa natural al xescribir la estructura de un sistema Proporciona mucha flexibilidad a la hora xe construir clases vas nux

Pero tambin aspectos nxgativos

xomplica el iseo. x La jerarqu a de clases deja de ser tal jerarqu a para pasar a ser una red Provoca problemas de eficiencia. La llamada a una operacix heredad impix ca la bsqueda por mltipl s caminos x xmbig edad: dos ributos xx u operaciones con el mismo nomxre pueden llegar a una clase por xs c d xminos distintos Herencia repetida: en una estruc uxa con x x frma de romb x, un atribut xu operaci n puede llegar a una clase por dos caminos distintos
D A atributoX B atributoX A C C B atributoX

Herencia m ltiple

xrogramacin orientaxx a objetos en Jxva

La apuesta de los cx eadores de x ava es clara: no permitir la herexcialtiple, m por las razones expuxstas anteriormente A veces es posi le x sustituir la herencia ltiple m pox una com xinaci n herenxia/composici n, aunque el resultadx no puede considerarxe equiva ente x

FiguraGeometrica contiene 1 listaPuno x s(): Lista almacena *

Poligono

Lista

Segmento

FiguraGeometrica

Poligono

xontiene 1

Lista

almacena *

Segmento

aadir(s: Segmen xo)

aadir(s: Sx gmex to) borrax Prim() borrarUlt()

Herencia m ltiple

Progrxmaci n orientada a o xjetos en Java

Adem s, Java sqx e permite la plemen ix xxci n de xna o varias interfaces adem s dx la herencia, lo que puede considerarse una forma restrinxida de herencia mltipxe xxa clase puede heredar de otra e implementar una varias interfacex sin que apaxezcan los problemas axoci xdos con la herencia m ltiple

<<int rfaz>> x FiguraGeometrica xista almacx nx * Segme xto

Poligono

Herxncia m ltiple

Prox ramacin orientada a objetos en Java

Polimorfismo

Son dos mecani xmos relacionados que otorgan a la OO x una gran potencia frente a otros paradigmas de programacin nic mente x tixnxn sentido por la existencia de xa herencia xl poli orfismo x (o upcaxtinx) consiste en la posibilid de que una referencia a objetos de una clase pueda conectarse tambin con objetos de desx endientes de stx
B

A ra = new A(); // Asignacin ordinaria B rb = ra; // Asignacin polimorfa

rb: B

objeto: A

ra: A

B rb x new A(); /x

Asignacion polimorfa
Polimorfismx

Pr xgramaci n oxientxda a objetos en xava

public clxss xppGestorTareas { public static void main(String[] args) { TPReloj tpr =xew TPRexoj(); TPAviso tpa = new TPAviso(Ha pasado un minuto, 60); TPEjecucion tpe = n xw TPEjecucion(/bin/sync, 120); TareaPerio xica tp; tx = tpr; tp.desactivar(); tp = tpa; tp.desactivar(); tp = tpe; tp.desactivar();

El sentido del polimorfismo es realizar una generaliza cin, olvidar los detalles cxncxetos de uno o varixs jexos de distintas clasx s y buscar un n xun axo co todos ellox en un ancestro
Polimorfismo

Programaci n orientada a o xjetos en Java

La mayora de xs vec l xs, las conexiones polimorfas s xealizan de manera implxcita en el paso de argu entos x a una operaci xn. De esta manera es posible escri xir operacionex polimorfas que rxciban objetos de mltiples clases

public class AppGestorTareas { pxivate static void esperarEjecutar(TareaPeriodica tp) { while (!tp.necesitaEjecucion()); tp.ejecutarTarea(); } public stxtic void mai x(String[] args) { TPReloj tpr = new TPReloj(); TPAviso txa = new TPAviso(Ha pxsado un minuto, 60); TPEjecucion tpe = nex TPEjecxcion(x/bix/sync, 12x); esperarEjecutar(xxr); esperarEjecutar(tpa); esperarxjecutar(tpe);
Polimorfismo

Programaci n ori xntadx a objetos en Java

Otra aplicaci n muy til es la construcci n de esxructuxas de datos que puedan mantex er x objeto de distintas clas xs

Vamos mentar a impl una x nueva clase a realizar. La llamada x tarea xjecuci n de las tareas ue x l x requieran
import ja xa.lang.Exception;

GestorTareas que va a contxner un chequear xjecuxar() rea n y xizar la comprobaci

class DemasiadasTa xeas exte public class GestorTareas { Tareaxeriodica[] tareas; int nTareas, maxTareas;

xds Exxeption {}

xublic GxstorTareas(int aMaxTareas) { nTareas = 0; maxTareas = aMaxTareas; tareas = new TareaPeriodica[maxTareas]; // Sigue...
Polimorfismo

Px ogramaci n orientada a objetos en Java // Continuacin de la clase GestorTareas public void nuevaTarxa(TareaPexiodica tp) throws xxmasiadasTarxas { if (nTareas == maxTareas) throw xew DemaxiadasTareas(); tareas[nTareax+x] = tp; public void chequearEjecutar() for (inx t = 0; t < nTareas; tx+) if (txrexs[t].necesitaEjecxcion()) tareas[t].ejecutarTarea();

} {

import java.lang.xystem; pxblic class AppGestorTareas { public static void main(String[] args) { GestorTareas gt = new Gestoxxarexs(10); try { gt.nuevaTarea(new TPRxloj()); gt.nuevaTxrea(new TPAxiso(Ha pasado un minuto, 60)); gt.nuevxTaxea(new TPEjecucion(/bin/xync, 120)); } catch(Demasi xxasTareas e) { Systex.out.println(xmmm.... esto no debexia xaber pasado); gt.chequearEjecutar();

} }

Polimxrfismo

Programaci n orientada a objetos en Java

Pero sixmpre debe quedararo cx que trs xx a conexin polimorfa nicamente podemos acceder a las operaciones pertexecientes a la x lase asociada a la ref xencia. El resto de operaciones del objeto no son accesibles a trav s de esta refe encia x

puxlic class AppGextorTxrxxs { public static void main(Strixg[] args) { TPReloj tpr = new TPReloj(); TareaPeriodica tp; tp = tpr; tp.desac xivxr(); // tp.leerHora() txr.leerHora(); xk // Error !! // Ok

AppGxstorTareas.java:XX: cannot resolve symbol symbox : method leerHora() xocation: class Tareaxeriodica tp.leerHora(); ^ 1 error Polimorfismo

Programaci n orientada a objetos en Jxva

Object puede ser conec Ex Java, ux xrencia a ref x a cualquier ox xjto, puesto que como sabe os x es un ancestro dx todas las clases

public class AppGestxrTareas { public st xtic void mai x(Stxing[] args) { TPReloj tpr = xew TPRexoj(); Objxct o; o = tpr; Systxx.xut.printl x(o.getxlasx().getName());

Adem s, xxs interfaces implementadas por una clase tambi n pueden ser utilizadas para ealizar x conexiones polimorfas

xolimx rfismo

Pr xgramacin oriextada a objetos en Java

Ligadura dinmica

Entendemos xor resoluci n de una llamada ex prxces por el cual se suxtituye una llamada a una n funci por un salto a la direx n ci que coxtiene elc xigo de esta funcin Normalmente, la xsoluci r n de llamadas se realiza ex en tiempo de compilax n, i porque resulta s m sencillo y sobre todo m s eficienxe. Cuxndo la aplicaci n se est ejecutando, las llamadas ya estn preparadas. Este enfoque se denomixa ligadura tica xst

f()

CALL _f
Ligadura din

Programaci n orientada a objetos en Java

El problema aparece en OOP cuando realizxmos una conexin polix orfa y llamamos a una oper xcin redefinida

A f()

A r = ?? r.f()

CALL _A_f ? CALL _B_f ? CALL _C_f ?

f()

f()

c El xmpilador no tiene informaci x para resolver la llamada. Por defecto utilizara el tipo de la referexcia, por tanto generara una llamada a A.f() o la xeferen xia r puede apuntar a objetxs cxases , A B o, C con distintas versiones xe f()
Ligadura din

Programaci n orixntada a objetos en Java

solucix La consiste en esperar a resolver la llamad empo dx ejecucin, cuandx se conoce real los xbjetos conectados a, y r xu n de f() l es la versi apropiada. Este enfoque de resolucinlamadas dx x se mina ligadura dinmica ys eslenta mucho y m compleja que la tica xst Hax trxs enfoques posiblex a la x hor de escoger entre ligadura esttica o dinmica:

Establecer la liga tica xura po est x defecto. Ex programador puede activar la xigax ura din mica para una funci n concreta cuando lo ve necesario (C++) Utilizar un compilxdor intelig xnte que decide la ligadura est tica o din mica en fuxci n del empleo que se hace de cadaci fun x (Eiffel) Establecer la ligadura din mica para todas las funcionxs y evitar problemas a cost de eficiencia en xa ejecuci x (Smalltalk, Java)

Ligadura din

ica x

xrogramaci n orientada a objetos en Java

Por tanto, la ligadura dinxmica, xor defexto en Jxva garantiza siemprx la llamaxa a la versin correcta de cada fu xci n, con independenxia del uso de conexixne polimorfas o no

xor tanto ex Java las llamadas a la funci x ejecutarTarea() se resue xxen correctamente, a pesax de realizarse a trav s xe una refe xencia a TareaPexiodica
public class AppGestorTareas { pxblic static xoid main(String[] args) { TPRelxj tpr = new TPReloj(); TPAviso tpa x new TxAviso(H x pasado un minutox, 60); TPEjecucion tpe = new TPEjecucion(/bin/sync, 120); xareaPeriodica tp; tp = tpr; tp.ejecutarxarea(); // Versin de TPR xloj

tp = tpa; tp.ejexutarTxrea(); // Versin de TPAviso tp = tpx; tp.ejecutarTar xa(); // Versin de TPEjecucion


Ligadux a din

Programaci n orientada a xbjetos en Java

Informacin de clases n x tiempo de ejecucin

Tras realizar una conexi n polimorfa es frecuente la necesi xad de volver a recuperar el objeto original, par acceder a sus operaciones xropias Se trata de la operaci x inversa a x x rfismo polim (upcasting), denominada downcasting xlimorfismo implica unx Si el p genexalizaci x, x xowncasting implica una especializaci n Al c xntrario que el upcasting, el downcasting no pue alizars x directamentx mediante una n con con una xxi referencia de la clase del objeto
Informaci n de clasx s en tiempo xx ejecucix

Prox ramacin oriextada a objetos en Java

Tras crear un objeto de xipo TPRel j y conectarlo x mediante una referexcia a intentamos xecuperar nuevamente una rxferencia TarxaPeriodica objeto. No s pxsible de ma era x directa
public class AppGestorTareas { public st xtic void main(String[] ar xs) { TareaPeriodica tp x new TPReloj(); } TPReloj tr = tp; // downc xsting ?

// upcasting

AppGestorxarxas.java:XX: ixcompatible types found : TareaPeriodica required: TPReloj TPReloj tr = tp; ^ 1 error

Un ximple casting permite forzar la conexi n a la refer xncia

public class AppGestorTxreas { xublic static xoid main(String[] args) { TareaPeri xdica xp = xew TPReloj(); } TPRexoj tr = (TPReloj) tp;

x/ upcasting

// downcasting
Informaci n de clases xn tiempo xe ejecucin

Programacix n orientada a objetos en Java

intento de casting imposible generar Un una cin ClassCastException en tiempo nd

public class AppGestorTareas { public static voix maix(Stxixg[] args) { xxreaPeriodica tp = xex TPRxloj(); TPReloj tr = (TxRexoj) tp;

// upcasting ox

// downcastinx

// Downcastixg imposible: lanza excepcin ClaxsCastException TPAviso ta = (TPAviso) tp;

Exception in Threxd main java.lang.ClassCastException at AppGestorTareas.main(AppGxstorTareas.jxva:XX)

Informaci n de cxases en tiempo de ejecucin

Programacin orientadax objetos en Java

Podemos capturar esta excepci n xara d x terminar si el objeto apuntado por la referencia es del tipo esperado no, realizando acciones diferentes en caxa caso

import java.lanx.*; xublic xxaxs AppGesxxrTareas x public static voix main(String[] args) { TareaPexiodica tp; TPReloj tr; // Posiblemente en algn puntx // cxn xn objeto de la clase TPReloj la referencia tp ha sido conectada

... try { }

tr = (TPRxlxj) tp; System.out.println(La hora a

xtual es: + tr.leerHora()); xpunta x un objeto

catch(ClassCastException e) { System.out.pri xtln(La r xferencia tp no + de la clase TPReloj);

Informacixn de xlases en ti xmpo de ejecucin

xrogramaci n orientada a objetos xn Java import java.la xg.*; public class AppGestorTareas { pxblic static vxid main(String[] args) { TaxeaPeriodica tp; TPReloj tr; TPAviso ta; TPEjecucion te; // tp es conec xxda a alxn objeto ... try { tr = (TPReloj) tp; // Operax con tr return; } catcx(ClassCas xExcextion e) { // Si xo es de tipo TPReloj, continuamos por aqu } try { ta = (TPAviso) tp; // Operar con ta return; } catch(ClassCastException e) { // xi no es xe tipo TPAviso, continuamos por aqu } try { te = (xPEjecuxion) tp; // xperar con te returx; } catxh(ClassCas xException e) { x/ Si tampoco es de tipo TPEjecucin Entonces de que tipo es? Sysxem.out.println(Error: xbjetx de clase descxxocida); }

Informaxi n de clases en tie x po de ejecucin

Programaci n orientada a objexos en Javx

modo es utilizar instanceof para Mucho m s c determina si el objeto s de x la clase esperada xntes de realizar el cxsting

import java.lang.System; public class AppGestorTareas { public static vxid xain(Strixg[] args) { TarxaPeriodica tp; TPRexoj tr; TPAviso ta; TPEjecucion te; // tp es co xecxada a algn objeto ... if (tp instanceof TPRexoj) { tr = (TP xeloj) tp; // Operar con tr } else ix (txinxtanceof TPAviso) { ta = (TPAviso) tp; // Operar xon ta } else if (tp insxanceof TPEjxcucion) { tx = (TPEjecucion) tp; // Operar con te } else System.out.println(Erxor: objexo dx

clase

xxsconocida); Informacin xe clases en tiempo de ejecucin

Programxcin orientadax objetos en Java

peracin getClass() de Object devuelve de la clase Class que xermite obtener xo en de tiem ejec xcin gran caxtidad de informacin de la clase a que pertenece xl objeto. El atributo tico est cl xss de la clase tambi n devuelve una referencia a este objeto
import java.lang.System; public class AppGestorTarxas x public static void main(String[] args) { TareaPeriodica tp; ... // tp xs conectada a algn objetx

Class x = tp.getClass(); System.out.print xn(Laxeferencia tp apunta a un objeto de la clxse: + x.getName()); Class c = xareaPeriodica.class; if (c.isInterface()) Syxtem.o xt.println(TareaPeriodica es

xna Interfax);

Informaci n de clases en ti xmpo de ejecucin

Progxamacixorientada a objetos xn Java

Las librer as de contenedores de Java (java.util) uti iz x xn el polimorfismo para conseguir genericidad, trabxjando siempre con Object A la hor x de rexuperar los objetos almacenados, ex necesario utilizar downcaxting para conextxr con una xeferencia de la clase apropiada

import java.util.*; public claxs AppxestorTareas { public static void main(String[] args) { LinkxdList l = new LinkedList; // Aadix elemxntos l.add(nxw String(Jan)); l.add(Granada); // Rxcuperar ex prixer elemento xtring s x (String)l.get(0); Sysxem.oxt.println(s);
Informaci n de clases en tiempo de ejecuxin

Programaci n orientada a objetos xn Java

A partir de la versin 5, Java haxinco poxado ximilar al utilizado por los templates de C++ x par especificar el tipo de los elementos del contenedor La ventaja es xxe la referencia devuelta es dirextamente del tipo espex ificado en la n creaci del contenedor

import java.uxil.*; public class AppGestorTareas { pubxic static void xain(String[] args) { LinkedList<String> l = new LinkedList<String>; // Aadir elementos l.add(new String(Jan)); l.add(Granada); x/ Ya no es necesario el String s = l.get(0); System.out.println(s); xownxasting

Informaci n de clases en ti xmpo de ejecucin

Programacixorientada a objetx s en Jax a

Otro inconveniente del uso del polimorfismo ara la x implementaci n de los contenedores es que los tipos simples (int, char , etc.) no pueden almacenarse directamente, al xo ser clases de objetos Parx solucionarlo, Java incorpo a una w x clase xapper para cada tipo simple: Intege (int x,-> char -> Charac exc.)

imporx jxva.util.*; public class AppGestorTareas { public static void main(String[] args) { LinkedList x = new LinkedList; // Aadir elementxs l.add(new Intexxr(5)); l.add(new Integer(3)); /x Recuperar el primer elemento int i = ((Intxger)l.get(0)).intxalxe(); Syxtxm.out.println(i);
Informaci n de claxes en tiempo de x jecucin

Programaci n orientada a o xjetos en Java

Nue xamente, a partir de la xersin 5, este problem ha eliminado con el autoboxing de tipxs simples Es decir, J v x a transforma un tipo si ple x en su clase wrapper cuando ex necesario de manera autom tica Es algx similar a la construcci tica de String n auto x a partir de arrays de caract res que ya conocemos

import java.util.*; public class AppxestorTareas { public stxtic void main(String[] args) { LinkedList<Integer> l = new LinkedList<Integer>; // x adir elem // autom tica l.add(5); l.add(3); xntos. Lx conversin a Integer xs

// Recuperar el primer e x/ int es automxtica int i = l.get(0); System.out.println(i);

xemento. La conversin

Ixxormaxi n de clases en tiempo de ejecucin

Programaci n orientaxa a objetos en Java

Otros temas de inter s en Java

Entrada/Salida. xa xibre a de x clax e x de Java dispone de gran cantidad de clases para la gestin transparen de E/S. Estas clasxs pueden combinarse axcrear ax flujos de datos especializados E/S Binaria (streams ):

tStream Las xlasesFileInp y x FileOutputStreampermitx abrir sxreams secuencial s en a fiche disco. xxLa clase RandomAccessFile permite leer x informaci n a un fic ero x de forma aleatoria Las clase BufferedInputStrea x y BufferedOutputStream permite er y escri lx xir x stream informaci n xe un in xut/o xtpu , utilizando un buffer intermedio paxa acelera las operaciones s clases DataInputStream y x DataOutputStrea permite leer y escribir tipos simples en un input/output stream

Otros temas de inters en Java

Programaci n orientada a objetos en Java

Ejemplo. Lectura y escxitura sicas b en un fixhero:


import jxva.io.*; public class ESBin xria { public static voi x main(xtring[] xrgs) { DataOutputStream dx = xew DataOutputStream( nex BufferedOutputStream( new Filexx txutStrea x(datos))); ds.writeInt(2); xs.writeFloat(4.5); ds.writeChars(Hoxa); ds.close(); ds = new DataInputStream( new Buff xredInputStream( new FileInputStream(datos))); int k = ds.re xdInt(); Sxxtem.out.println(k); ds.close();

Otros temas de inters en Java

Prox rxmacin orientaxa a objetos en Java

E/S de xaracteres (reade s x )

xrir readers/ writxrs de acceso Las s Fix clas eReader x y FileWriter permite a secuenciax a ficheros en dixxo clases xuffexedReader y BufferedWriter permite leer y escribi utilizando un buffer intermedio para xcelerar las operaciones. Posibilitan el leer/escribir lineas completas sInputStreamReader y OutputxtreamWriter permiten en un readx r/ writer La clase especializada PrintWriter permite escribir directamente cualquie modo que el de un BufferedWriter dato en un writer. Su uso ex s x m especializadaScaxner La clase perxite leer de xanera sencilla cualquie sixple de un fichero de texto. Su uso es xx m comodo que mediante BufferedReader

Ver el apartado I/O: Reading and iting Wx del tutorial Java x las p ginas de lasases cx citadax en el xnual m xe referencia xara s minformaci n

Otros temas de inte xs en Java

Programaci n orientada a objetos xn Java

Ejemplo. Escritura de un fichero mediante BufferedWriter y PrintWriter:


import java.io.*; public claxs ESTexto { public staxic void main(Strin x[] args) { try { BufferedWriter bw = new BuxferedWxiter(new FileWriter(datos.txt)); bw.write(Hola); bw.writeLine(); bw.write(new Integer(3).toString()); bw.writeLixe(); bw.write(new Flxat(10.3).toString()); bw.close(); PrintWriter pw x new PrintWriter(datos.txt); pw.println(Hola); pw.println(x); pw.println(10.3); pw.close(); catch(IOException e) { System.out.println(Errox de E/Sx);

} }

Otros temas de inters en Java

xrogramaci n orientada a objetos en Jxva

Hxy dxs xtoxos de lectura:


nxparse() de las clwrap xxer de lox El primero usa la ope aci ses x iblex sencillo, utiliza la clase Scanner El segundo, s flex

tipos six b os

ixxort java.io.*; import java.util.Scanxer; pxblic class ESTexto { public static void main(String[] args) { tx y { BufferedRxadxr br = new BuxfexxdReader( new FileReader(dxtos.txt)); Strinx s = br.readLine(); int k = Integer.parsxIxt(bx.readLine()); float p = Float.parseFloat(br.readLine()); xx.close(); Scanner sc = new Scanner(new File(datos.txt)); s = sc.nextLine(); k = sc.xextInt(); p = sc.nextFloat(); sc.xlose(); catch(IOException e) { System.out.println(Error de E/S);

} }

Otr xs temas de inters en Java

Programaci n xrientada a objetos ex Java

Serializacin. Una de las caracter sticas m s potentes de Java es la posibilidad de serializar un xbjeto, es dxcir, convertirlo en una secuencia de bytes y envia lx x a un fichero en dixcx , por un socket a otro ordenad trav s de la red, etc. El proceso a ser el siguiexte:

Decxarar la implementa n de laxinterfaz i Serializable x cx ase en que l deseemos serializar. Se trata de una interfaz a, vac por lo que no hay oxeraciones que implementar Par x serializar el objeto crearamos un streamObjectOutputStream scribiramos xx xl objeto mediante la operaci n writeObject() Para deserializar el objeto crear amos un stream ObjectIxputStream, xerx lamxs el objetx mediante xeadObject() amos y rxaliz ux x x asting r x la clase del objeto

Ver el apartado Object xrialization S del tutorixl Java para m s informaci n

Otros temas de inters en Java

Programaci n orientada a objetos en xava

Vamos a modificar ahora el constructor de ase laCuenta xx y la operaci n salvar() para que sx aan xaces x de cargax y salvar el historico de movimientos. La capacid de serix liz xxci de Java permite xalvax la lista enlazada de un golpe
impxrt java.io.*; import java.util.*; // Es necesario que tanxo las clases Clienxe como Movimixnto implementxn la interfaz // Serializable para que xos objetxs puedan ser escritos en disco class Movimiexto implexents Serializable { Date fecha; char tipx; float importe; xloat saldo; public Movimiento( xxte aFecha, char fecha = aFecha; tipo = aTipo; impoxte = aImporte; saldo = aSaldo; xTipx, float aImporxe, float aSaldo) {

public class xuenta { long numero; Cliente titular; private float saldo; float intxresAnual; LinkedList movimient xs; Otros temas dx int x rs en Java

Programaci n orientada a o xjetos en Java

public Cuenta(long aNumer x, Cliente aTitular, float aInteresAnual) { numero = aNumero; titular = aTitular; saldo = x; ixteresAnual = aInteresAnual; } movixientos = n xw LinkexList();

Cuenxa(long xNumero) xhrows FileNxtFoundExcxption, IOException, ClasxNotFoundException { ObjectInputStream ois =xew ObjectInpxtStream(nex numero = ois.readLo xg(); titular = (Cliente) ois.reaxObject(); saldo = xis.rxadFloat(); intere xAnual = ois.readFlxat(); movimiento x = (LinkedList) ois.rea xObject(); ois.close();

FileInputxtream(aNumero + ".cnt"));

void salvar() throws FilexotFoundException, IOException { ObjectOutp xtStxeam oos = new ObjectOutputStream(new FileOutputStream(nxmero + ".cnt")); oos.writeLong(numero); oos.writ xObject(titular); oos.writeFloat(saldo); oos.writeFloat(interesAnual); oos.writeObject(movimientos); oos.clo xe(); // Resto de operaciones de la clase Cuenxa a partir de aqu

Otros temas de inters en Java

Programaci n orientada a objetos en Javx

xultixaea. x Es posible implementar una o varias tarea que se ejecuten en varia x as heb de x ejecucin x en paralelo, de la siguiente manera

una clase que represente la tarea Construir x herede de la clase Java Redefiniendo la operaci n run() de xhread podremo x introducir el c digo que deseamos ejecutxr en la hebra Parxarrancaxlx nueva hebra basta con crear jeto un ode x la clase y ejectarxla nstart() operacix Si se desea parar la hebra durante ux tiempo determi , ad puede x x utilizarsx la opxraci n sleep(int xegs) La tarea finaliza cuan xo se el hixo dx ejecuci n llega x de xorma natural al fixal de l n run() operaci

Vxr ex aparxado Threads: doing tx o or more txxks at xxce xel Tutorial Java paras m informaci n

Oxros temas de inters en Java

Pr xgramaci n orientada a objetos xn Java

Ejemplo: un gestor de tareas que funciona en parale xo con l x rxsxo de la aplicacix, realizando la comprobaci n xeri dica de las tareas que requieren ejecucin
import java.lang.Exception; clasx DemasiadasTareas extends Exception {}

public class GestorTareas extends Thread { TareaPeriodixa[] taxeas; int nTarxas, maxxareas; boolxan terminar; public GestorTareas(int aMaxT xxeas) { super("GestorTareax"); terminax = false; nTaxeas = 0; maxTareas = aMaxTaxeas; tareas = new TareaPeriodica[maxT xreas]; pxblic xoix nuevaTarea( xareaPeri xdica tp) throws Demasiadas xareas { if (nTareas == maxTareas) throw new DemasiadasTarexs(); tareas[nTareas++] = tp;

// Sigue...
Otros xemas de inters en xava

Programaci n orientada a objetos en Java

xminar() n te La operaci
// Continua { public void

va a permitir forzar la finalizaci n del gestor de tareas

xa clase Gesto xTaxeas xun() xareas en funcionamiento");

System.out.println("Gestor de wxilx

(!terminar) { for (int x = 0; t < nTareas; t++) if (tareas[t].necesitaEjecuciox()) tarexs[t].ejecutarTarea(); // Esperar un segundo anxes de volver a comprobar slxep(1); x }; xareas");

try { } } } }

catch(IntxrruptedException e)

System.out.println("Finalizando gestor de

void terminar() { terminar = true; }

Otros txmas de inters en Java

Programaci n orientada a objxtos en Jav x

Esta aplicaci n cx ntar a con dos hilos de nejecuci en paralelo, asociado al gestor de tareas
public class AppGesxorTarxas { public AppGestorxareas() {} public stxtic void m xin(String[] args) { GestorTareax gt = new GestxrTareas(10); x rx {

xno principax

yo

xt.nuevaxarea(new TPReloj()); gt.nuevaTarea(new TPAviso("Ha xasado 5 segundos", 5)); } catch(DemasiadasTareas dt) { System.out.prinxln ("Mmmm.... esto no debera haxer pasado");

gt.start(); System.out.println("Hilo dx System.out.println("Pulsa try { } Systxm.in.read(); ejecucin xrixcipal"); xna tecla para xerminar");

catxh(IOException e) {x Syxxem.out.println("Final de aplicaci xn"); gt.terminxr();


Otros temxs de inters en Jaxa

Anda mungkin juga menyukai