Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema2:Programacinorientadaa objetosenJava
1.Clasesdeobjetos 2.Proteccindemiembros 3.Proteccindeclases 4.Inicializacinyfinalizacin 5.Creacindeobjetos 6.Trabajandoconobjetos 7.Relacionesentreobjetos 8.Clasesanidadaseinteriores 9.Autoreferencias 10.Aplicacionesorientadasaobjetos 11.Herencia 12.Adicin,redefinicinyanulacin 13.Proteccinyherencia 14.Herenciamltiple 15.Polimorfismo 16.Ligaduradinmica 17.Informacindeclasesentiempo deejecucin 18.OtrostemasdeintersenJava
Programacinorientadaa objetosenJava
Clasesdeobjetos
Lasclasesdeobjetosrepresentanconceptoso entidadessignificativosenunproblemadeterminado. Unaclasedescribelascaractersticascomunesdeun conjuntodeobjetos,mediantedoselementos:
Atributos
Operaciones
Clasesdeobjetos
Programacinorientadaa objetosenJava
c:Cuenta Cuenta nmero:String titular:String saldo:Float interesAnual:Float ingreso(cantidad:Floatl) reintegro(cantidad:Floatl) ingresoInteresMes() enRojos():Boolean leerSaldo():Real Clasedeobjetos numero=123890023 titular=MiguelPrez saldo=1800.4 intersAnual=0.25 e:Cuenta numero=151590020 titular=Javier Snchez saldo=1200.2 intersAnual=1.25
Clasesdeobjetos
Programacinorientadaa objetosenJava
LaimplementacindeestaclaseenJavaserealizaraenunficheroconnombre Cuenta.java,ysucontenidoseraelsiguiente:
classCuenta{ longnumero; Stringtitular; floatsaldo; floatinteresAnual; voidingreso(floatcantidad){} voidreintegro(floatcantidad){} voidingresoInteresMes(){} booleanenRojos(){} floatleerSaldo(){} }
Atributos
Operaciones
Clasesdeobjetos
Programacinorientadaa objetosenJava
classCuenta{ longnumero; Stringtitular; floatsaldo; floatinteresAnual; voidingreso(floatcantidad){ saldo+=cantidad; } voidreintegro(floatcantidad){ saldo=cantidad; } voidingresoInteresMes(){ saldo+=interesAnual*saldo/1200; } booleanenRojos(){returnsaldo<0;} floatleerSaldo(){returnsaldo;} }
Clasesdeobjetos
Programacinorientadaa objetosenJava
Elaccesoalosatributosdelaclasedesdela implementacindelasoperacionesserealizade formadirecta Losatributosuoperacionesestticas(static)noson afectadosporelprocesodeinstanciacindeobjetos apartirdelaclase Deunatributoestticonosegeneraunacopiapor cadaobjetoquesecrea.Existeunanicacopia compartidayaccesibledesdetodoslosobjetosdela clase Unaoperacinestticanicamentepuedeaccedera miembrosestticos
Clasesdeobjetos
Programacinorientadaa objetosenJava
Clasesdeobjetos
Programacinorientadaa objetosenJava
Proteccindemiembrosdelaclase
Elprincipiodeocultacindeinformacinseplasma enloslenguajesOOendiversosmecanismosde proteccindelosmiembrosdelaclase UMLpermiteasociartresnivelesdeproteccin diferentesacadamiembrodelaclase:
*Lasveremosmsadelante,alestudiarelmecanismodelaherencia
Proteccinde miembros
Programacinorientadaa objetosenJava
classCuenta{ privatelongnumero; privateStringtitular; privatefloatsaldo; privatefloatinteresAnual; publicvoidingreso(floatcantidad){ saldo+=cantidad; } publicvoidreintegro(floatcantidad){ saldo=cantidad; } publicvoidingresoInteresMes(){ saldo+=interesAnual*saldo/1200; } publicbooleanenRojos(){returnsaldo<0;} publicfloatleerSaldo(){returnsaldo;} } Proteccinde miembros
Cuenta numero:Long titular:String saldo:Float intersAnual:Real +ingreso(cantidad:Integer) +reintegro(cantidad:Integer) +ingresoInteresMes() +enRojos():Boolean +leerSaldo():Integer
Programacinorientadaa objetosenJava
Proteccinde miembros
Programacinorientadaa objetosenJava
Proteccinde miembros
Programacinorientadaa objetosenJava
Proteccinde miembros
Programacinorientadaa objetosenJava
Lasclasesmiapp.prueba.A,miapp.prueba.Bymiapp.Cdebenestarenlasiguiente estructuradedirectorios:
miapp
prueba C
A B
Proteccinde miembros
Programacinorientadaa objetosenJava
Proteccindeclases
Porproteccindeclasesentendemosunnivelsuperior delaocultacindeinformacin,aniveldeclases.Es decir,setratadeespecificarqueclasespuedenser utilizadasycualesno,yporquin Dentrodeunpaquete,lasclasessonamigasypor tantonoexistenrestriccionesrespectoalautilizacin deunaclaseporlasotras Sinembargo,desdeelpuntodevistadelexterior, nicamentepodrnserutilizadaslasclasespblicas delpaquete,esdecir,aquellasconelidentificador publicsituadodelantedesudeclaracin
Proteccindeclases
Programacinorientadaa objetosenJava
Ennuestroejemplo,siqueremosquelaclaseCuentapuedaserutilizadadesdeel exteriordelficheroCuenta.javadeberemosdeclararlacomopblica
publicclassCuenta{ privatelongnumero; privateStringtitular; privatefloatsaldo; privatefloatinteresAnual; publicvoidingreso(floatcantidad){ saldo+=cantidad; } publicvoidreintegro(floatcantidad){ saldo=cantidad; } publicvoidingresoInteresMes(){ saldo+=interesAnual*saldo/1200; } publicbooleanenRojos(){returnsaldo<0;} publicfloatleerSaldo(){returnsaldo;} }
Proteccindeclases
Programacinorientadaa objetosenJava
Inicializacinyfinalizacin
Lainiciacindelosatributosdelaclaseserealizaen Java,aligualqueenC++,medianteelusode constructorescuyonombrecoincideconeldelaclase
publicclassCuenta{ privatelongnumero; privateStringtitular; privatefloatsaldo; privatefloatinteresAnual; Cuenta(longaNumero,StringaTitular,floataInteresAnual){ numero=aNumero; titular=aTitular; saldo=0; interesAnual=aInteresAnual; } publicvoidingreso(floatcantidad){ saldo+=cantidad; } //RestodeoperacionesdelaclaseCuentaapartirdeaqu
Inicializaciny finalizacin
Programacinorientadaa objetosenJava
//Importartodaslasclasesdelpaquetejava.io importjava.io.*; publicclassCuenta{ privatelongnumero; privateStringtitular; privatefloatsaldo; privatefloatinteresAnual; //Constructorgeneral Cuenta(longaNumero,StringaTitular,floataInteresAnual){ numero=aNumero; titular=aTitular; saldo=0; interesAnual=aInteresAnual; }
Inicializaciny finalizacin
Programacinorientadaa objetosenJava
//Constructorparaobtenerlosdatosdelacuentadeunfichero Cuenta(longaNumero)throwsFileNotFoundException,IOException, ClassNotFoundException{ FileInputStreamfis=newFileInputStream(aNumero+.cnt); ObjectInputStreamois=newObjectInputStream(fis); numero=aNumero; titular=(String)ois.readObject(); saldo=ois.readFloat(); interesAnual=ois.readFloat(); ois.close(); } publicvoidingreso(floatcantidad){ saldo+=cantidad; } publicvoidreintegro(floatcantidad){ saldo=cantidad; } publicvoidingresoInteresMes(){ saldo+=interesAnual*saldo/1200; } publicbooleanenRojos(){returnsaldo<0;} publicfloatleerSaldo(){returnsaldo;} }
Nota:vaseelapartadoI/O:ReadingandWritingdeltutorialJavadeSuncomoapoyoparaentender elcdigodelnuevoconstructor
Inicializaciny finalizacin
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
//Constructorgeneral publicCuenta(longaNumero,StringaTitular,floataInteresAnual){ numero=aNumero; titular=aTitular; saldo=0; interesAnual=aInteresAnual; } //Constructorparaobtenerlosdatosdelacuentadeunfichero publicCuenta(longaNumero)throwsFileNotFoundException, IOException,ClassNotFoundException{ FileInputStreamfis=newFileInputStream(aNumero+.cnt); ObjectInputStreamois=newObjectInputStream(fis); numero=aNumero; titular=(String)ois.readObject(); saldo=ois.readFloat(); interesAnual=ois.readFloat(); ois.close(); }
Inicializaciny finalizacin
Programacinorientadaa objetosenJava
Cuandofinalizaelusodeunobjeto,esfrecuentela realizacindeciertastareasantesdesudestruccin, principalmentelaliberacindelamemoriasolicitada durantesuejecucin.EstoserealizaenC++yotros lenguajesOOenlosdenominadosdestructores Estosdestructoressonoperacionesinvocadas automticamentejustoantesdeladestruccindel objeto Sinembargo,enJavalaliberacindememoriase realizademaneraautomticaporpartedelrecolector debasura,portantolanecesidaddeestetipode operacionesnoexisteenlamayorpartedeloscasos
Inicializaciny finalizacin
Programacinorientadaa objetosenJava
Sinembargospuedesernecesariorealizaralguna tareanorelacionadaconlaliberacindememoria antesdeladestruccindelobjeto,comoporejemplo salvarelestadodelaclaseenunficheroobasede datos Javapermiteintroducircdigoparaestefin implementandounaoperacinpblicaespecial denominadafinalize.Estaoperacinesinvocada automticamenteantesdeladestruccindelobjetopor partedelrecolectordebasura
Inicializaciny finalizacin
Programacinorientadaa objetosenJava
finalizacin
Programacinorientadaa objetosenJava
Inicializaciny finalizacin
Programacinorientadaa objetosenJava
Creacindeobjetos
EnJavalosobjetossecreannicamentedeforma dinmica.Paraelloseutilizaeloperadornew,de manerasimilaraC++ LosobjetosenJavaseutilizansiempreatravsde referencias.Lasreferenciassonsimilaresalos punterosdeC/C++,aunquesuusoesmuchoms sencillo Portantolospasosaseguirenlacreacindeun objetoson:
Programacinorientadaa objetosenJava
LacreacindeunobjetodelaclaseCuentaserealizaradelasiguienteforma:
Cuentac;//UnareferenciaaunobjetodelaclaseCuenta c=newCuenta(18400200,PedroJimnez,0.1f);
Programacinorientadaa objetosenJava
Losarraystambindebensercreadosdinmicamente connewcomosifueranobjetos
*VaseelapartadoCharactersandStringsdeltutorialdeJavadeSunparamsinformacin
Programacinorientadaa objetosenJava
Creacindeobjetos
Programacinorientadaa objetosenJava
Trabajandoconobjetos
TrabajarconunobjetoJavaessimilaraC++,aunque lasreferenciaspermitenunusomuchomssencillo
Cuentac1=newCuenta(18400200,PedroJimnez,0.1f); Cuentac2=newCuenta(18400201); c2.reintegro(1000); c1.ingreso(500); if(c2.enRojos()) System.out.println(Atencin:cuenta18400201ennmerosrojos); System.out.println(Saldoactualdelacuenta18400201:+c1.leerSaldo()); c1=newCuenta(18400202); //ElobjetoasociadoalaCuenta18400200quedadesconectado c1.ingreso(500); System.out.println(Saldoactualdelacuenta18400202:+c1.leerSaldo());
Trabajandocon objetos
Programacinorientadaa objetosenJava
Enesteejemplosepideunnmerodecuentaalusuarioyunacantidadaretirar.A continuacinsecargalacuentasolicitadayserealizaelreintegro
BufferedReaderbr=newBufferedReader(InputStreamReader(System.in)); longnc; floatmi; try{ System.out.println(Introduzcanm.dedecuenta:); nc=Long.parseLong(br.readLine()); System.out.println(Introduzcaimportearetirar:); mi=Float.parseFloat(br.readLine()); } catch(Exceptione){ System.out.println(Erroralleerdatos); return; } Cuentac; try{ c=newCuenta(nc); } catch(Exceptione){ System.out.println(Imposiblerecuperarcuenta); return; } if(c.leerSaldo()<mi) System.out.println(Saldoinsuficiente); else c.reintegro(mi); c.salvar(); Trabajandocon objetos
Programacinorientadaa objetosenJava
Naturalmenteelcompiladorproducirunerrorante cualquieraccesoilegalaunmiembrodelaclase
Cuentac=newCuenta(18400200,PedroJimnez,0.1f); c.saldo=1000;
Cuenta.java:XX:saldohasprivateaccess c.saldo=1000; ^ 1error
Elaccesoaunmiembroestticoserealizautilizando elnombredelaclaseenlugardeunobjeto
Programacinorientadaa objetosenJava
Relacionesentreobjetos
Unconjuntodeobjetosaisladostieneescasa capacidadpararesolverunproblema.Enuna aplicacinreallosobjetoscolaboraneintercambian informacin,existiendodistintostiposderelaciones entreellos Aniveldediseo,podemosdistinguirentre5tiposde relacionesbsicasentreclasesdeobjetos: dependencia,asociacin,agregacin,composiciny herencia*
*Laveremosmsadelante,enunapartadoespecfico
Relacionesentre objetos
Programacinorientadaa objetosenJava
java.io.FileOutputStream java.io.ObjectOutputStream
Relacionesentre objetos
Programacinorientadaa objetosenJava
VamosasustituirelatributotitularporunaasociacinconunanuevaclaseCliente completa
Cuenta numero:Long saldo:Float intersAnual:Float +ingreso(cantidad:Integer) +reintegro(cantidad:Integer) +ingresoInteresMes() +enRojos():Boolean +leerSaldo():Integer +leerTitular():Cliente +salvar() Cliente titular
* 1
Relacionesentre objetos
Programacinorientadaa objetosenJava
UnaasociacinseimplementaenJavaintroduciendo referenciasaobjetosunaclasecomoatributosenla otra Silarelacintieneunacardinalidadsuperiorauno entoncessernecesarioutilizarunarrayde referencias.Tambinesposibleutilizarunaestructura dedatosdinmicadelpaquetejava.utilcomoVectoro LinkedListparaalmacenarlasreferencias Normalmentelaconexinentrelosobjetosserealiza recibiendolareferenciadeunodeellosenel constructorounaoperacinordinariadelotro
Relacionesentre objetos
publicclassCliente{ privateStringnombre,apellidos; privateStringdireccion,localidad; privateDatefNacimiento; Cliente(StringaNombre,StringaApellidos,StringaDireccion, StringaLocalidad,DateaFNacimiento){ nombre=aNombre; apellidos=aApellidos; direccion=aDireccion; localidad=aLocalidad; fNacimiento=aFNacimiento; } StringnombreCompleto(){returnnombre++apellidos;} StringdireccionCompleta(){returndireccion+,+localidad;} }
Programacinorientadaa objetosenJava
publicclassCuenta{ privatelongnumero; privateClientetitular; privatefloatsaldo; privatefloatinteresAnual; //Constructorgeneral publicCuenta(longaNumero,ClienteaTitular,floataInteresAnual){ numero=aNumero; titular=aTitular; saldo=0; interesAnual=aInteresAnual; } ClienteleerTitular(){returntitular;} //RestodeoperacionesdelaclaseCuentaapartirdeaqu Relacionesentre objetos
Programacinorientadaa objetosenJava
Polgono formadopor
2 *
Segmento
Departamento
disponede
1 *
Despacho
Relacionesentre objetos
Programacinorientadaa objetosenJava
SupongamosqueaadimosunregistrodemovimientosalaclaseCuenta,deforma quequedeconstanciatrascadaingresooreintegro
Cuenta numero:Long saldo:Float intersAnual:Float +ingreso(cantidad:Integer) +reintegro(cantidad:Integer) +ingresoInteresMes() +enRojos():Boolean +leerSaldo():Integer +leerTitular():Cliente +salvar() Cliente titular
* 1
registra
Relacionesentre objetos
Programacinorientadaa objetosenJava
importjava.util.Date classMovimiento{ Datefecha; chartipo; floatimporte; floatsaldo; publicMovimiento(DateaFecha,charaTipo,floataImporte,floataSaldo){ fecha=aFecha; tipo=aTipo; importe=aImporte; saldo=aSaldo; } }
Relacionesentre objetos
Programacinorientadaa objetosenJava
publicclassCuenta{ privatelongnumero; privateClientetitular; privatefloatsaldo; privatefloatinteresAnual; privateLinkedListmovimientos;//Listademovimientos //Constructorgeneral publicCuenta(longaNumero,ClienteaTitular,floataInteresAnual){ numero=aNumero;titular=aTitular;saldo=0;interesAnual=aInteresAnual; movimientos=newLinkedList(); } //Nuevaimplementacindeingresoyreintegro publicvoidingreso(floatcantidad){ movimientos.add(newMovimiento(newDate(),'I',cantidad,saldo+=cantidad)); } publicvoidreintegro(floatcantidad){ movimientos.add(newMovimiento(newDate(),'R',cantidad,saldo=cantidad)); } publicvoidingresoInteresMes(){ingreso(interesAnual*saldo/1200);} //RestodeoperacionesdelaclaseCuentaapartirdeaqu
Nota:tambinseranecesariomodificarelotroconstructorylaoperacinsalvarparatenerencuentalalistademovimientos alahoradeleer/escribirlainformacindelaCuentaendisco
Relacionesentre objetos
Programacinorientadaa objetosenJava
Clasesanidadaseinteriores
JavayalgunosotroslenguajesOOPpermitenla definicindeunaclasedeobjetosdentrodeotra,con unadobleutilidad:
Clasesanidadase interiores
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
Cuandolaclaseanidadanoesesttica,sedenomina claseinteriorytienecaractersticasespeciales:
Clasesanidadase interiores
Programacinorientadaa objetosenJava
ImplementandolaclaseMovimientocomounaclaseinterioresposiblecopiarel valordelsaldoactualdelacuentaquerealizaelmovimientodemaneradirecta
importjava.util.Date publicclassCuenta{ privatelongnumero; privateClientetitular; privatefloatsaldo,interesAnual; privateLinkedListmovimientos;//Listademovimientos privateclassMovimiento{ Datefecha; chartipo; floatimporte,saldoMov; publicMovimiento(DateaFecha,charaTipo,floataImporte){ fecha=aFecha; tipo=aTipo; importe=aImporte; saldoMov=saldo;//Copamoselsaldoactual } } //SiguelaimplementacindelaclaseCuenta
Clasesanidadase interiores
Programacinorientadaa objetosenJava
//Constructorgeneral publicCuenta(longaNumero,ClienteaTitular,floataInteresAnual){ numero=aNumero;titular=aTitular;saldo=0; interesAnual=aInteresAnual; movimientos=newLinkedList(); } //Nuevaimplementacindeingresoyreintegro publicvoidingreso(floatcantidad){ saldo+=cantidad; movimientos.add(newMovimiento(newDate(),'I',cantidad)); } publicvoidreintegro(floatcantidad){ saldo=cantidad; movimientos.add(newMovimiento(newDate(),'R',cantidad)); } publicvoidingresoInteresMes(){ingreso(interesAnual*saldo/1200);} publicbooleanenRojos(){returnsaldo<0;} publicfloatleerSaldo(){returnsaldo;} }
Clasesanidadase interiores
Programacinorientadaa objetosenJava
Autoreferencias
Enocasionesesnecesarioobtenerunareferenciaen laimplementacindeunaoperacinalpropioobjeto sobreelquehasidoinvocadalaoperacin EstareferenciaseobtieneenC++yJavamedianteel operadorthis Cuandoencontremosthisenunaexpresin,podremos sustituirlomentalmenteporesteobjeto Aunquenoesnecesario,podemosutilizarthispara llamardesdelaimplementacindeunaoperacina otraoperacindelmismoobjeto
Autoreferencias
Programacinorientadaa objetosenJava
LallamadaalaoperaciningresodesdeingresoInteresMes()puederealizarse utilizandothiscomoreferenciadelobjetosobreelqueseinvocalaoperacin
publicclassCuenta{ privatelongnumero; privateClientetitular; privatefloatsaldo,interesAnual; publicvoidingresoInteresMes(){this.ingreso(interesAnual*saldo/1200);} //RestodelasoperacionesdelaclaseCuenta
Autoreferencias
Programacinorientadaa objetosenJava
OtrautilidaddethisenJavaesrealizarunallamadaa unconstructordesdeotroconstructor
publicclassCuenta{ privatelongnumero; privateClientetitular; privatefloatsaldo,interesAnual; //Constructorgeneral publicCuenta(longaNumero,ClienteaTitular,floataInteresAnual){ numero=aNumero;titular=aTitular;saldo=0;interesAnual=aInteresAnual; movimientos=newLinkedList(); } //Constructorespecficoparacuentasdeahorro(interesAnual=0.1%) publicCuenta(longaNumero,ClienteaTitular){ this(aNumero,aTitular,0.1); } //RestodelaclaseCuenta
Autoreferencias
Programacinorientadaa objetosenJava
Aplicacionesorientadasaobjetos
Enunaaplicacinorientadaaobjetosdebeexistiruna clasequerepresentelapropiaaplicacin.Esteserael puntodondecomenzaralaejecucindelamisma EnlenguajesnototalmenteorientadoscomoC++enla funcinmainsecreaunainstanciadeestaclaseyse llamaaalgunaoperacincomoejecutarparaarrancar laaplicacin.Sinembargoestonoesobligatorio,yun malprogramadorpuederealizarunaaplicacinhbrida, concdigonoorientadoaobjetos
Aplicaciones orientadasaobjetos
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
Alahoradeejecutarlaaplicacin,deberindicarse estaclasealamquinavirtualJava
Nota:LasclasesqueconstituyenunaaplicacinJavatambinpuedendistribuirsedemaneramuchomscompacta enunnicoficheroJAR.Conslteselabibliografaparavercomocreanyutilizanestosficheros
Aplicaciones orientadasaobjetos
Programacinorientadaa objetosenJava
Herencia
LaherenciaesunmecanismodelaOOPquepermite construirunaclaseincorporandodemaneraimplcita todaslascaractersticasdeunaclasepreviamente existente.Lasrazonesquejustificansunecesidadson variadas:
Modeladodelarealidad.Sonfrecuenteslasrelacionesde especializacin/generalizacinentrelasentidadesdelmundoreal,portantoes lgicoquedispongamosdeunmecanismosimilarentrelasclasesdeobjetos Evitarredundancias.Todalafuncionalidadqueaportaunaclasedeobjetoses adoptadademanerainmediataporlaclasequehereda,portantoevitamosla repeticindecdigoentreclasessemejantes Facilitarlareutilizacin.Unaclasenotieneporqulimitarsearecibirunaseriede caractersticasdeotraclaseporherenciadeformapasiva.Tambindisponende ciertomargendeadaptacindeestascaractersticas Soportealpolimorfismo
Herencia
Programacinorientadaa objetosenJava
SeaunaclaseA.SiunasegundaclaseBheredadeA entoncesdecimos:
Herencia
Programacinorientadaa objetosenJava
Existendiferentessituacionesenlasquepuede aplicarseherencia:
Coche
Contable
Cuadrado
Extensin.Unaclasepuedeservirparaextenderlafuncionalidaddeuna superclasesinquerepresentenecesariamenteunconceptomsespecfico
Lista Cuenta Movimiento ListaSalvable CuentaConHistorico recuperar() salvar() registra * fecha:Date tipo:Char importe:Real saldo:Real
Herencia
Programacinorientadaa objetosenJava
Texto
Lnea
Cuadrado
Pila
Herencia
Programacinorientadaa objetosenJava
Ejemplosdeherencia:
Distintostiposdecuentasbancarias
CuentaCorriente
CuentaAhorroPFijo vencimiento:Date
reintegro() ingresoMes()
Herencia
Programacinorientadaa objetosenJava
Elementosdeunainterfazdeusuario
Editor
Boton
pintar()
accion()
Herencia
Programacinorientadaa objetosenJava
Estructurasdedatos
Secuencia
ContenedorAsociativo
Herencia
Programacinorientadaa objetosenJava
TPReloj
TPAviso msg:String
+leerHora():String +leerMsg():String
Herencia
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
LaoperacinejecutarTarearealmentenotieneunaimplementacinconcretaaeste nivel
publicbooleannecesitaEjecucion(){ if(!activa) returnfalse; //Calcularlahoradelaprximaejecucin CalendarcalProximaEj=newGregorianCalendar(); calProximaEj.setTime(ultimaEj); calProximaEj.add(Calendar.SECOND,periodoSegs); CalendarcalAhora=newGregorianCalendar(); //Comprobarsihapasadoalahoraactual return(calProximaEj.before(calAhora)); } publicvoidejecutarTarea(){ System.out.println("Ejecuciondetarea"); } publicvoidactivar(){activa=true;} publicvoiddesactivar(){activa=false;} }
Herencia
Programacinorientadaa objetosenJava
Paraqueunaclaseherededeotra,utilizaremosel indicadorextendsenladeclaracindelaclase
importjava.util.Calendar; importjava.util.GregorianCalendar; publicclassTPRelojextendsTareaPeriodica{ publicTPReloj(){ periodoSegs=60;//Comprobarcadaminuto actualizarReloj(); activa=true; } publicStringleerHora(){ Calendarcal=newGregorianCalendar(); returncal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE); } }
Atencin!:Aunqueelcdigodeestasclasescompilaperfectamente,laimplementacindelos constructoresesformalmenteincorrecta.Msadelanteveremosporqu.
Herencia
Programacinorientadaa objetosenJava
importjava.lang.Runtime; importjava.io.IOException; publicclassTPEjecucionextendsTareaPeriodica{ Stringcmd; publicTPEjecucion(StringaCmd,intaPeriodoSegs){ periodoSegs=aPeriodoSegs; actualizarReloj(); activa=true; cmd=aCmd; } StringleerCmd(){returncmd;} }
Atencin!:Aunqueelcdigodeestasclasescompilaperfectamente,laimplementacindelos constructoresesformalmenteincorrecta.Msadelanteveremosporqu.
Herencia
Programacinorientadaa objetosenJava
Object #clone():Object +equals(Objectobj):Boolean #finalize() +getClass():Class +hasCode():int +notify() +notifyAll() +toString():String +wait() +wait(timeout:Long) +wait(timeout:Long,nanos:Integer)
Estohacequelasclasesformenunajerarquacon Objectcomoraz
Object
...
...
...
...
...
Herencia
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
LaimplementacincorrectadelconstructordelaclaseTPAvisoseraportantola siguiente:
publicclassTPAvisoextendsTareaPeriodica{ Stringmsg; publicTPAviso(StringaMsg,intaPeriodoSegs){ super(aPeriodoSegs); msg=aMsg; } publicStringleerMsg(){returnmsg;} }
Herencia
Programacinorientadaa objetosenJava
Ydelasotrasdossubclases:
importjava.util.Calendar; importjava.util.GregorianCalendar; publicclassTPRelojextendsTareaPeriodica{ publicTPReloj(){ super(60); } publicStringleerHora(){ Calendarcal=newGregorianCalendar(); returncal.get(Calendar.HOUR_OF_DAY)+":" +cal.get(Calendar.MINUTE); } } importjava.lang.Runtime; importjava.io.IOException; publicclassTPEjecucionextendsTareaPeriodica{ Stringcmd; publicTPEjecucion(StringaCmd,intaPeriodoSegs){ super(aPeriodoSegs); cmd=aCmd; } StringleerCmd(){returncmd;} }
Herencia
Programacinorientadaa objetosenJava
Herencia
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
Adicin,redefinicinyanulacin
Laherenciaensnoserataninteresantesinofuera porlaposibilidaddeadaptareneldescendientelos miembrosheredados
Notodosloslenguajesorientadosaobjetossoportan estascaractersticas,enespeciallaanulacin
Adicin,redefinicin yanulacin
Programacinorientadaa objetosenJava
TPReloj
TPAviso msg:String
+leerHora():String +ejecutarTarea()
+leerMsg():String +ejecutarTarea()
Adicin,redefinicin yanulacin
Programacinorientadaa objetosenJava
importjava.util.Calendar; importjava.util.GregorianCalendar; publicclassTPRelojextendsTareaPeriodica{ publicTPReloj(){ super(60); } publicStringleerHora(){ Calendarcal=newGregorianCalendar(); returncal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE); } publicvoidejecutarTarea(){ Calendarcal=newGregorianCalendar(); intmin=cal.get(Calendar.MINUTE); if(min==0||min==30) System.out.println("Hora:"+cal.get(Calendar.HOUR_OF_DAY) +""+min); } }
Adicin,redefinicin yanulacin
importjava.lang.Runtime; importjava.io.IOException; publicclassTPEjecucionextendsTareaPeriodica{ Stringcmd; publicTPEjecucion(StringaCmd,intaPeriodoSegs){ super(aPeriodoSegs); cmd=aCmd; } StringleerCmd(){returncmd;} publicvoidejecutarTarea(){ try{ Runtime.getRuntime().exec(cmd); } catch(IOExceptione){ System.out.println("Imposibleejecutarcomando:" +cmd); } } } publicclassTPAvisoextendsTareaPeriodica{ Stringmsg; publicTPAviso(StringaMsg,intaPeriodoSegs){ super(aPeriodoSegs); msg=aMsg; } publicStringleerMsg(){returnmsg;} publicvoidejecutarTarea(){ System.out.println("ATENCINAVISO:"+msg); desactivar(); } }
Programacinorientadaa objetosenJava
Adicin,redefinicin yanulacin
Programacinorientadaa objetosenJava
Cadatareaejecutaahorasufuncin,aunquelallamadaesaparentementelamisma
publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ TareaPeriodicatp=newTareaPeriodica(5); TPAvisotpa=newTPAviso(EstudiarProgramacinAvanzada!,60); TPEjecuciontpe=newTPEjecucion(rm~/tmp/*,3600); while(!tp.necesitaEjecucion()) System.println(Esperandoejecucindetareaperidica...); tp.ejecutarTarea(); while(!tpa.necesitaEjecucion()) System.println(Esperandoejecucindeaviso...); tpa.ejecutarTarea(); while(!tpr.necesitaEjecucion()) System.println(Esperandoejecucindecomando...); tpe.ejecutarTarea(); } }
Adicin,redefinicin yanulacin
Programacinorientadaa objetosenJava
Otrousoposibledelapalabraclavefinalesimpedirla redefinicindeunaoperacinenlassubclases
importjava.util.*; publicclassTareaPeriodica{ intperiodoSegs; DateultimaEj; booleanactiva; publicTareaPeriodica(intaPeriodoSegs){ periodoSegs=aPeriodoSegs; actualizarReloj(); activa=true; } publicTareaPeriodica(){this(1);} finalpublicvoidactualizarReloj(){ ultimaEj=newDate();//Horaactual } finalpublicbooleannecesitaEjecucion(){ //Implementacindelaoperacin } publicvoidejecutarTarea(){ System.out.println("Ejecuciondetarea"); } finalpublicvoidactivar(){activa=true;} finalpublicvoiddesactivar(){activa=false;} }
Adicin,redefinicin yanulacin
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
publicclassTPAvisoextendsTareaPeriodica{ Stringmsg; publicTPAviso(StringaMsg,intaPeriodoSegs){ super(aPeriodoSegs); msg=aMsg; } publicvoidactivar(){} publicvoiddesactivar(){ System.out.printl(Error:llamadaaoperacinprivada); System.getRuntime().exit(1); } publicStringleerMsg(){returnmsg;} publicvoidejecutarTarea(){ System.out.println("ATENCINAVISO:"+msg); desactivar(); } } Adicin,redefinicin yanulacin
Programacinorientadaa objetosenJava
Proteccinyherencia
Hemosvistoanteriormentecomolosdistintosniveles deproteccinlimitanelaccesoalosmiembrosdela clasedesdeelexterior.Perocomoafectanestos nivelesdeproteccinalosmiembrosheredados?
Proteccinyherencia
Programacinorientadaa objetosenJava
Adems,unmiembroprotegidomantieneenlas subclaseselniveldeaccesoprotegido
Proteccinyherencia
Programacinorientadaa objetosenJava
Clasesabstractas
Existenclasesquerepresentanconceptostan genricosquenotienesentidosuinstanciacinen objetos Ademsenestetipodeclasespuedeserimposibleo intillaimplementacindeciertasoperaciones Lautilidaddeestetipodeclasesestenlaaplicacin deherenciaparaobtenerclasesquerepresentan conceptosconcretosparalosquesquetienesentido suinstanciacin
Programacinorientadaa objetosenJava
Estasclasessedenominanclasesabstractasyeste tipodeoperacionessinimplementacinposible, operacionesabstractas Lasoperacionesabstractasdebenserimplementadas obligatoriamenteenalgunadelassubclasesparaque laclasecorrespondienteseainstanciable Unaclaseabstractapuedenotenerningunaoperacin abstracta,perounaclasequecontengaalmenosuna operacinabstractadebeserdeclaradacomoabstracta EnJava,utilizandoladeclaracinabstractpodremos establecerunaclaseounaoperacincomoabstracta
Clasesabstractas
Programacinorientadaa objetosenJava
VamosadeclararlaclaseTareaPeriodicaysuoperacinejecutarTarea()como abstractas
importjava.util.*; abstractclassTareaPeriodica{ intperiodoSegs; DateultimaEj; booleanactiva; publicTareaPeriodica(intaPeriodoSegs){ periodoSegs=aPeriodoSegs; actualizarReloj(); activa=true; } publicTareaPeriodica(){this(1);} publicvoidactualizarReloj(){ ultimaEj=newDate();//Horaactual } publicbooleannecesitaEjecucion(){ if(!activa) returnfalse; //Restodelaimplementacindeesta //operacinaqu } abstractpublicvoidejecutarTarea(); publicvoidactivar(){activa=true;} publicvoiddesactivar(){activa=false;} } Clasesabstractas
Programacinorientadaa objetosenJava
Javadevuelveahoraunerrorentiempodecompilacinsiseintentacrearunobjeto delaclaseTareaPeriodica
publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ TareaPeriodicatp=newTareaPeriodica(5); while(!tp.necesitaEjecucion()) System.println(Esperandoejecucindetareaperidica...); tp.ejecutarTarea(); } }
AppGestorTareas.java:XX:classTareaPeriodicaisanabstractclass;cannotbeinstantiated TareaPeriodicatp=newTareaPeriodica(); ^ 1error
Clasesabstractas
Programacinorientadaa objetosenJava
Clasesabstractas
Programacinorientadaa objetosenJava
TPReloj
Clasesabstractas
Programacinorientadaa objetosenJava
LainterfazTareaPeriodicaylaclaseTPRelojtendranahoraelsiguienteaspecto. Lasotrasclasestendranimplementacionessimilares
publicinterfaceTareaPeriodica{ booleannecesitaEjecucion(); voidejecutarTarea(); voidactivar(); voiddesactivar(); }
importjava.util.Calendar; importjava.util.GregorianCalendar; publicclassTPRelojimplementsTareaPeriodica{ DateultEjecucion; booleanactiva; publicTPReloj(){activa=true;ultEjecucion=newDate()} publicvoidejecutarTarea(){ Calendarcal=newGregorianCalendar(); intmin=cal.get(Calendar.MINUTE); System.out.println("Hora:"+cal.get(Calendar.HOUR_OF_DAY) +""+min); ultEjecucion=cal.getTime(); }
Clasesabstractas
Programacinorientadaa objetosenJava
publicbooleannecesitaEjecucion(){ if(!activa) returnfalse; CalendarcalProximaEj=newGregorianCalendar(); CalendarcalUltEjecucion=newGregorianCalendar(); calUltEjecucion.setTime(ultEjecucion); CalendarcalAhora=newGregorianCalendar(); if(calAhora.equal(calUltEjecucion)) returnfalse; intmin=calAhora.get(Calendar.MINUTE); if(min==00||min==30) returntrue; returnfalse; } publicvoidactivar(){activa=true;} publicvoiddesactivar(){activar=false;} publicStringleerHora(){ Calendarcal=newGregorianCalendar(); returncal.get(Calendar.HOUR_OF_DAY)+":"+ cal.get(Calendar.MINUTE); } }
Clasesabstractas
Programacinorientadaa objetosenJava
Clasesabstractas
Programacinorientadaa objetosenJava
Herenciamltiple
Consisteenlaposibilidaddequeunaclasetenga variosascendientesdirectos Puedesurgirdemanerarelativamentefrecuentey naturalduranteeldiseo
Poligono
FicheroLectura
FicheroEscritura
FicheroLecturaEscritura
Imagen
EnlaceURL
ImagenSensible
Herenciamltiple
Programacinorientadaa objetosenJava
Tieneclaramenteaspectospositivos
Surgedemaneranaturalaldescribirlaestructuradeunsistema Proporcionamuchaflexibilidadalahoradeconstruirclasesnuevas
Perotambinaspectosnegativos
Herenciamltiple
Programacinorientadaa objetosenJava
Poligono
Lista
Segmento
FiguraGeometrica
Poligono
contiene 1
Lista
almacena *
Segmento
aadir(s:Segmento)
Herenciamltiple
Programacinorientadaa objetosenJava
Poligono
Herenciamltiple
Programacinorientadaa objetosenJava
Polimorfismo
Sondosmecanismosrelacionadosqueotorganala OOPunagranpotenciafrenteaotrosparadigmasde programacin nicamentetienensentidoporlaexistenciadela herencia Elpolimorfismo(oupcasting)consisteenlaposibilidad dequeunareferenciaaobjetosdeunaclasepueda conectarsetambinconobjetosdedescendientesde sta
Ara=newA();//Asignacinordinaria Brb=ra;//Asignacinpolimorfa
rb:B ra:A
objeto:A
Brb=newA();//Asignacionpolimorfa
Polimorfismo
Programacinorientadaa objetosenJava
publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ TPRelojtpr=newTPReloj(); TPAvisotpa=newTPAviso(Hapasadounminuto,60); TPEjecuciontpe=newTPEjecucion(/bin/sync,120); TareaPeriodicatp; tp=tpr; tp.desactivar(); tp=tpa; tp.desactivar(); tp=tpe; tp.desactivar(); } }
Polimorfismo
Programacinorientadaa objetosenJava
publicclassAppGestorTareas{ privatestaticvoidesperarEjecutar(TareaPeriodicatp) { while(!tp.necesitaEjecucion()); tp.ejecutarTarea(); } publicstaticvoidmain(String[]args){ TPRelojtpr=newTPReloj(); TPAvisotpa=newTPAviso(Hapasadounminuto,60); TPEjecuciontpe=newTPEjecucion(/bin/sync,120); esperarEjecutar(tpr); esperarEjecutar(tpa); esperarEjecutar(tpe); } }
Polimorfismo
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava //ContinuacindelaclaseGestorTareas publicvoidnuevaTarea(TareaPeriodicatp) throwsDemasiadasTareas{ if(nTareas==maxTareas) thrownewDemasiadasTareas(); tareas[nTareas++]=tp; } publicvoidchequearEjecutar() { for(intt=0;t<nTareas;t++) if(tareas[t].necesitaEjecucion()) tareas[t].ejecutarTarea(); } } importjava.lang.System; publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ GestorTareasgt=newGestorTareas(10); try{ gt.nuevaTarea(newTPReloj()); gt.nuevaTarea(newTPAviso(Hapasadounminuto,60)); gt.nuevaTarea(newTPEjecucion(/bin/sync,120)); }catch(DemasiadasTarease){ System.out.println(Mmmm....estonodeberiahaberpasado); } gt.chequearEjecutar(); } } Polimorfismo
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
Polimorfismo
Programacinorientadaa objetosenJava
Ligaduradinmica
Entendemosporresolucindeunallamadaelproceso porelcualsesustituyeunallamadaaunafuncinpor unsaltoaladireccinquecontieneelcdigodeesta funcin Normalmente,laresolucindellamadasserealizaen entiempodecompilacin,porqueresultamssencilloy sobretodomseficiente.Cuandolaaplicacinseest ejecutando,lasllamadasyaestnpreparadas.Este enfoquesedenominaligaduraesttica
f()
CALL_f
Ligaduradinmica
Programacinorientadaa objetosenJava
A f()
Ar=?? r.f()
f()
f()
Ligaduradinmica
Programacinorientadaa objetosenJava
Ligaduradinmica
Programacinorientadaa objetosenJava
PortantoenJavalasllamadasalafuncinejecutarTarea()seresuelven correctamente,apesarderealizarseatravsdeunareferenciaaTareaPeriodica
publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ TPRelojtpr=newTPReloj(); TPAvisotpa=newTPAviso(Hapasadounminuto,60); TPEjecuciontpe=newTPEjecucion(/bin/sync,120); TareaPeriodicatp; tp=tpr; tp.ejecutarTarea();//VersindeTPReloj tp=tpa; tp.ejecutarTarea();//VersindeTPAviso tp=tpe; tp.ejecutarTarea();//VersindeTPEjecucion } }
Ligaduradinmica
Programacinorientadaa objetosenJava
Informacindeclasesentiempodeejecucin
Trasrealizarunaconexinpolimorfaesfrecuentela necesidaddevolverarecuperarelobjetooriginal,para accederasusoperacionespropias Setratadelaoperacininversaalpolimorfismo (upcasting),denominadadowncasting Sielpolimorfismoimplicaunageneralizacin,el downcastingimplicaunaespecializacin Alcontrarioqueelupcasting,eldowncastingnopuede realizarsedirectamentemedianteunaconexinconuna referenciadelaclasedelobjeto
Programacinorientadaa objetosenJava
Unsimplecastingpermiteforzarlaconexinala referencia
Programacinorientadaa objetosenJava
Unintentodecastingimposiblegeneraruna excepcinClassCastExceptionentiempodeejecucin
Programacinorientadaa objetosenJava
importjava.lang.*; publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ TareaPeriodicatp; TPRelojtr; //Posiblementeenalgnpuntolareferenciatphasidoconectada //conunobjetodelaclaseTPReloj ... try{ tr=(TPReloj)tp; System.out.println(Lahoraactuales:+tr.leerHora()); } catch(ClassCastExceptione){ System.out.println(Lareferenciatpnoapuntaaunobjeto +delaclaseTPReloj); } } }
Informacinde clasesentiempode ejecucin
Programacinorientadaa objetosenJava importjava.lang.*; publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ TareaPeriodicatp;TPRelojtr;TPAvisota;TPEjecucionte; //tpesconectadaaalgnobjeto ... try{ tr=(TPReloj)tp; //Operarcontr return; } catch(ClassCastExceptione){ //SinoesdetipoTPReloj,continuamosporaqu } try{ ta=(TPAviso)tp; //Operarconta return; } catch(ClassCastExceptione){ //SinoesdetipoTPAviso,continuamosporaqu } try{ te=(TPEjecucion)tp; //Operarconte return; } catch(ClassCastExceptione){ //SitampocoesdetipoTPEjecucinEntoncesdequetipoes? System.out.println(Error:objetodeclasedesconocida); } } } Informacinde clasesentiempode ejecucin
Programacinorientadaa objetosenJava
importjava.lang.System; publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ TareaPeriodicatp;TPRelojtr;TPAvisota;TPEjecucionte; //tpesconectadaaalgnobjeto ... if(tpinstanceofTPReloj){ tr=(TPReloj)tp; //Operarcontr } else if(tpinstanceofTPAviso){ ta=(TPAviso)tp; //Operarconta } else if(tpinstanceofTPEjecucion){ te=(TPEjecucion)tp; //Operarconte } else System.out.println(Error:objetodeclasedesconocida); } }
Programacinorientadaa objetosenJava
importjava.lang.System; publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ TareaPeriodicatp; //tpesconectadaaalgnobjeto ... Classc=tp.getClass(); System.out.println(Lareferenciatpapuntaaunobjetodelaclase: +c.getName()); Classc=TareaPeriodica.class; if(c.isInterface()) System.out.println(TareaPeriodicaesunaInterfaz); } }
Programacinorientadaa objetosenJava
importjava.util.*; publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ LinkedListl=newLinkedList; //Aadirelementos l.add(newString(Jan)); l.add(Granada); //Recuperarelprimerelemento Strings=(String)l.get(0); System.out.println(s); } }
Programacinorientadaa objetosenJava
importjava.util.*; publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ LinkedList<String>l=newLinkedList<String>; //Aadirelementos l.add(newString(Jan)); l.add(Granada); //Yanoesnecesarioeldowncasting Strings=l.get(0); System.out.println(s); } }
Programacinorientadaa objetosenJava
importjava.util.*; publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ LinkedListl=newLinkedList; //Aadirelementos l.add(newInteger(5)); l.add(newInteger(3)); //Recuperarelprimerelemento inti=((Integer)l.get(0)).intValue(); System.out.println(i); } }
Programacinorientadaa objetosenJava
importjava.util.*; publicclassAppGestorTareas{ publicstaticvoidmain(String[]args){ LinkedList<Integer>l=newLinkedList<Integer>; //Aadirelementos.LaconversinaIntegeres //automtica l.add(5); l.add(3); //Recuperarelprimerelemento.Laconversina //intesautomtica inti=l.get(0); System.out.println(i); } }
Programacinorientadaa objetosenJava
OtrostemasdeintersenJava
Entrada/Salida.LalibreradeclasesdeJavadispone degrancantidaddeclasesparalagestintransparente deE/S.Estasclasespuedencombinarseparacrear flujosdedatosespecializados E/SBinaria(streams):
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
Ejemplo.Lecturayescriturabsicasenunfichero:
importjava.io.*; publicclassESBinaria{ publicstaticvoidmain(String[]args){ DataOutputStreamds= newDataOutputStream( newBufferedOutputStream( newFileOutputStream(datos))); ds.writeInt(2); ds.writeFloat(4.5); ds.writeChars(Hola); ds.close(); ds=newDataInputStream( newBufferedInputStream( newFileInputStream(datos))); intk=ds.readInt(); System.out.println(k); ds.close(); } }
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
E/Sdecaracteres(readers)
LasclasesFileReaderyFileWriterpermiteabrirreaders/writersdeacceso secuencialaficherosendisco LasclasesBufferedReaderyBufferedWriterpermiteleeryescribirinformacin utilizandounbufferintermedioparaacelerarlasoperaciones.Posibilitanel leer/escribirlineascompletas LasclasesInputStreamReaderyOutputStreamWriterpermitenconvertirunstream enunreader/writer LaclaseespecializadaPrintWriterpermiteescribirdirectamentecualquiertipode datoenunwriter.SuusoesmscmodoqueeldeunBufferedWriter LaclaseespecializadaScannerpermiteleerdemanerasencillacualquiertipo simpledeunficherodetexto.Suusoesmscomodoquemediante BufferedReader
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
Ejemplo.EscrituradeunficheromedianteBufferedWriteryPrintWriter:
importjava.io.*; publicclassESTexto{ publicstaticvoidmain(String[]args){ try{ BufferedWriterbw=newBufferedWriter(newFileWriter(datos.txt)); bw.write(Hola); bw.writeLine(); bw.write(newInteger(3).toString()); bw.writeLine(); bw.write(newFloat(10.3).toString()); bw.close(); PrintWriterpw=newPrintWriter(datos.txt); pw.println(Hola); pw.println(3); pw.println(10.3); pw.close(); } catch(IOExceptione){ System.out.println(ErrordeE/S); } } }
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
Haydosmtodosdelectura:
Elprimerousalaoperacinparse()delasclaseswrapperdelostiposbsicos Elsegundo,msflexibleysencillo,utilizalaclaseScanner
importjava.io.*; importjava.util.Scanner; publicclassESTexto{ publicstaticvoidmain(String[]args){ try{ BufferedReaderbr=newBufferedReader( newFileReader(datos.txt)); Strings=br.readLine(); intk=Integer.parseInt(br.readLine()); floatp=Float.parseFloat(br.readLine()); br.close(); Scannersc=newScanner(newFile(datos.txt)); s=sc.nextLine(); k=sc.nextInt(); p=sc.nextFloat(); sc.close(); } catch(IOExceptione){ System.out.println(ErrordeE/S); } } }
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
VerelapartadoObjectSerializationdeltutorialJava paramsinformacin
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
Programacinorientadaa objetosenJava
publicCuenta(longaNumero,ClienteaTitular,floataInteresAnual){ numero=aNumero; titular=aTitular; saldo=0; interesAnual=aInteresAnual; movimientos=newLinkedList(); } Cuenta(longaNumero)throwsFileNotFoundException, IOException,ClassNotFoundException{ ObjectInputStreamois=newObjectInputStream(newFileInputStream(aNumero+".cnt")); numero=ois.readLong(); titular=(Cliente)ois.readObject(); saldo=ois.readFloat(); interesAnual=ois.readFloat(); movimientos=(LinkedList)ois.readObject(); ois.close(); } voidsalvar()throwsFileNotFoundException,IOException{ ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream(numero+".cnt")); oos.writeLong(numero); oos.writeObject(titular); oos.writeFloat(saldo); oos.writeFloat(interesAnual); oos.writeObject(movimientos); oos.close(); } //RestodeoperacionesdelaclaseCuentaapartirdeaqu
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
VerelapartadoThreads:doingtwoormoretasksat oncedelTutorialJavaparamsinformacin
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
Ejemplo:ungestordetareasquefuncionaenparaleloconelrestodelaaplicacin, realizandolacomprobacinperidicadelastareasquerequierenejecucin
importjava.lang.Exception; classDemasiadasTareasextendsException{} publicclassGestorTareasextendsThread{ TareaPeriodica[]tareas; intnTareas,maxTareas; booleanterminar; publicGestorTareas(intaMaxTareas){ super("GestorTareas"); terminar=false; nTareas=0; maxTareas=aMaxTareas; tareas=newTareaPeriodica[maxTareas]; } publicvoidnuevaTarea(TareaPeriodicatp)throwsDemasiadasTareas{ if(nTareas==maxTareas) thrownewDemasiadasTareas(); tareas[nTareas++]=tp; } //Sigue...
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
Laoperacinterminar()vaapermitirforzarlafinalizacindelgestordetareas
//ContinualaclaseGestorTareas publicvoidrun() { System.out.println("Gestordetareasenfuncionamiento"); while(!terminar){ for(intt=0;t<nTareas;t++) if(tareas[t].necesitaEjecucion()) tareas[t].ejecutarTarea(); //Esperarunsegundoantesdevolveracomprobar try{ sleep(1); } catch(InterruptedExceptione){}; } System.out.println("Finalizandogestordetareas"); } voidterminar(){terminar=true;} }
Otrostemasde intersenJava
Programacinorientadaa objetosenJava
Estaaplicacincontaracondoshilosdeejecucinenparalelo,unoprincipalyotro asociadoalgestordetareas
publicclassAppGestorTareas{ publicAppGestorTareas(){} publicstaticvoidmain(String[]args){ GestorTareasgt=newGestorTareas(10); try{ gt.nuevaTarea(newTPReloj()); gt.nuevaTarea(newTPAviso("Hapasado5segundos",5)); }catch(DemasiadasTareasdt){ System.out.println("Mmmm....estonodeberahaberpasado"); } gt.start(); System.out.println("Hilodeejecucinprincipal"); System.out.println("Pulsaunateclaparaterminar"); try{ System.in.read(); } catch(IOExceptione){} System.out.println("Finaldeaplicacin"); gt.terminar(); } } Otrostemasde
intersenJava