You are on page 1of 446
Java a fondo 202. edicion ESTUDIO DEL LENGUAJE Y DESARROLLO DE APLICACIONES ACTUALIZADO A JAVA 7 / INCLUYE INTRODUGCION A HIBERNATE Y SPRING ING. PABLO AUGUSTO SZNAJDLEDER Java a fondo Estudio del lenguaje y desarrollo de aplicaciones Ing. Pablo Augusto Sznajdleder a Alfaomega Sznajdleder, Pablo Augusto ‘Java a fondo : estudio del lenguaje y desarrollo de aplicaciones . Buenos Aires: Afaomega Grupo Editor Argentino, 2073, 456 p. ; 24x21 om, ISBN 978-987-1609-26-9 1. Informatica, | Titulo. CoD 005.3 2aed, {Queda prohibca la reproduce’ total 0 parcial de esta obra, eu tratamiento informatce y/o a tranemisién por cualquier otra forma © medio sin autorizacin escrita de Allsomega Grupo Ecitor Argentino S.A Edicion: Damidn Fernéndez Rovisién de estilo: Vanesa Garcia Disefio de interiores y portada: Diego Ay Revision de armado: Vanesa Garcia Internat: nttou/wwattaomega.com mx ‘Todos los derechos reservados © 2018, pr Afaomega Grupo Editor Argentino SA. Paraguay 1307, PB, ofcina 11 ISBN 976-987-1609-36.9 Queda hecho ol depésito que prové a ley 11.723, NOTA IMPORTANTE: La informacion contenida en eeta obra tee un fn excluaivamente disactice y, por lo tanto, no est presto eu aprovechamiento a nivel profesional o industrial. Las indicaciones técricasy programas inclidos han sido elaboracos con gran culdado por al autor y epreducidos bajo etrctas normas de control. Ataomega Grupo Esltor Arertno S.A. no sera jurialcamente responsable or: erores u omisiones: datos y peiicios que se pucieran abut al uso de la informacion comprencida en este libro, ni por la utiizackon Indebida que pudira darsole. Los nombres comerciales que aparecen en ese libro son marcas regstradas de sus propitaros y se mencionan unicamente con ines ‘idacticos. por lo que Afaomega Grupo Etor Argentina S.A. no asurma ninguna responsabilidad por al uso que 2a de a esta informacion, ya que no infringe ringin derecho de registro de marca. Loe datos de los ejemplos y patallas san fcticos, a no ser que se especifigue lo contra, Los hipervinculos alos que se hace referencia no necesariamente son administrades por la editorial, por lo que no somes responsables de sus contenides o de su dispenibildad en linea Empresas de grupo: Argentina: Afeomega Grupo Editor Axgantin, SA Paraguay 1907 PB. “11°, Buenos Aires, Argentina, .P 1057 ‘Tol: (4-11) 4817-7183 / 0887 - E-male ventast@ellaamegaedstorcom.at México: Afaomega Grupo Eater, S.A. do C¥. Phagoras 1139, Col. Dl Vale, México, DF, México, ©, 08100 Tal: 62-55) 5575-5022 » Fax: (5255) 8575-2420 / 2490. Sn costo: 01-800-020-4396 mai: atencioalelentetatfagmega com.mx Colombia: Afsomega Colombiana S.A. Carrere 15 No. 64 A29, Bogota, Colombia POX (57-1) 2100122 - Fax: (57-1) 6068648 - E-mail clentedaifaomegacom.co CGhie: Atacmaya Grupo Eaton S.A, Genera dei Canto 370, Providenca, Santiago, Chie Tel: (8-2) 047-9951 Fax: 68-2) 235.5788 -F mall: agechlle@alfeomoga.c ‘Superman", por Octaviano Sznajdleder Dedico este trabajo, con todo mi amor, a mi esposa Analia y a mi hijo Octaviano. Sin ellos, nada tendria sentido. Dedicado también a la memoria de mi tio Beno que, aunque nunca se lo dije, siempre ocupé un lugar importante en mi corazén. Agradecimientos Quiero agradecer muy especialmente a mi madre Nelly, quien me permitio trabajar en su casa cada vez que Octaviano no me permitié hacerlo en la mia. Mi agradecimiento también a Damian Fernandez quien confié en mi y me brind6 esta gran oportunidad, y a Carlos Alvarez, que, cuando le propuse hacer la revision técnica, sin dudarlo me respondio ‘me interesa revisar tu libro” Agradezco también a Analia Mora con quién cuento incondicionalmente para investigar y resolver cuestiones relacionadas con la tecnologia y el desarrollo de aplicaciones, Finalmente, quiero agradecer a Pablo Bergonzi, gurt indiscutido de Java en Argentina, quien siempre esta dispuesto a darme una mano cada vez que las cosas no funcionan como deberian hacerlo. Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega vil Mensaje del Editor Los conocimientos son esenciales en el desemperio profesional. Sin ellos es imposible lograr las hablidades para competir laboralmente. La universidad o las instituciones de ‘ormacion para el trabajo ofrecen la oportunidad de adquin conacimientos que seran aprovechados mas adelante en beneficio propio y de la sociedad. El avance de la clencia ¥ de la técnica hace necesario actualizar continuamente esos conocimientos. Cuando se toma la decision de embarcarse en una vida profesional, se adquiere un compramiso de por vida: mantenerse al aia en los conocimientos del area u ofcio que ee ha decidido desemperar, ‘Afaomega tiene por misién ofrecerles a estudiantes y profesionales conocimientos ac- tualizados dentro de lineamientos pedagogicos que facilten su utlizacion y permitan de~ sarrolar las competencias requeridas por una profesién determinada, Alfaomega espera ser su compariera profesional en este viaje de por vida por el mundo del conocimiento. Allaomega hace uso de los medias impresos tradicionales en combinacién con las tec nologias de Ia informacion y las comunicaciones (71) para faclitar el aprendizae Libros ‘como este tienen su complemento en una pagina Web, en donde el alumno y su profesor encontrardn materiales adicionales, informacién actualizada, pruebas (test) de autoeva- luacién, diapositivas y vinculos con otros sitios Web relacionados. Esta obra contiene numerosos griticos, cuadros y otros recursos para despertar el inte- rs del estudiante, y faciitale la comprensién y apropiacion del conocimiento, Cada capitulo se desarrolla con argumentos presentados en forma sencilla y estructu- rada claramente hacia los objetivos y metas propuestas. Cada capitulo concluye con diversas actividades pedagégicas para asegurar la asimilacién del conocimiento y su extension y actualizacion futuras. Los libros de Alfaomega estan diseviados para ser utlizados dentro de los provesos de ensefianza-aprendizaje, y pueden ser usados como textos guia en diversos cursos © ‘como apoyo para reforzar el desarrollo profesional ‘Alfaomega espera contribuir asia la formacién y el desarrollo de profesionales exitosos para beneficio de la sociedad. Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega vi Pablo Augusto Sznajdieder Es Ingeniero en Sistemas de Informacién, egresado de la Universidad Tecnolégica Na- cional (UTN-FRBA), ‘Actusimente, es profesor en la cétedra de "Algoritmos y Estructuras de Datos” en la UTN- FRBA pasando tambien por la Universidad Nacional de San Martin (UNSAM) y el Insttu- to de Tecnologia ORT Argentina. Trabaj6 como instructor Java para Sun Mycrosystems, Oracle e Informi/IBM entre otras empresas lideres, Desde 1995 trabaja en sistemas, principalmente, an al desarallo de aplicaciones empre- sariles distribuidas: primero en C/C++ y luego, en Java/JEE. En 1996 comenzé a trabajar como Instructor Java para Sun Microsystems y, desde el 2000, s2 desempefia en la bisqueda y seleccién de RRHH capacitados en tecnologia ‘Java poniendo especial atencion en laidentificacion de jovenes estudiantes sin experien- Cia laboral previa, pero con gran potencial profesional. Tiene las cerificaciones internacionales Sun Certified Java Programmer (SCJP, 1997) y ‘Sun Certified Java Developer (SCID, 1998) y, ademds, esté certificado como Instructor Oficial Java por Sun Microsystems (1997) ‘Acaba de publicar su libro sobre algoritmos y estructuras de datos: Algoritmas a fond, ‘con impiementaciones en C y Java. En el 2010 publicé la primera edicion de Java a fon do, En el 2009 particip6 como revisor técnico en el libro: Andis y alseo de algoritmos (Lopez, Jeder, Vega) y, en el 2008, publicé HolaMundo pascal, Algoritmos y estructuras {de datos, cuyo contenido cubre por completo los temas que abarca la asignatura de igual nombre én la UTN-FRBA. Oy vsstoszc800 Revisor técnico: Carlos Alvarez Es Licenciado en Andlsis de Sistemas, egresado de la Facultad de Ingenieria (UBA). Trabajé “durante 10 arias came consultor en desarrollo y performance de aplicaciones y, desde e! 2010, ‘8 Gerente de calidad tecnica de software de daspegar.cem. Alfaomega Java a fondo - Ing. Pablo A. Sznajdleder Contenido - IK Contenido 1 Introducetén al lenguaje de programacién Java 4.4 Introduccion 112 Gomencemas a programar 121 Brice hegrade de Desert (DE) 41.9. Estructuras de contr 131 Esttaday salda de dics por consala 1:32 Detnictn de vanabiea 1133 Comentarios enol codigo 134 Eaueturaa de secson, 135 Eatuctuas teratvas 4.4 Otros elementos de! lenguale 14a Tipos de datos 142 Agunas smitudesy ateencas con Cy C++ 1.43 Deinictn de constants 144 aay 143 Matioes 1:48 Ltraes cadonae de caractoros 147 Caracteresaxpocies 1.43 Argumerios en ina de comancos 1.8. Tratamiento de cacenas do caracteres 151 Receoo ales caracteree de un Stig 1152 Mayacuse y minuscule 153 Deumenoias de caaceres 154 Subcadenas 1.58. Protos youtios 1156 Posicon do un substing dere dala cadena. 1157 Concatenarcadenas 158 Lacks Strngauter 1159 Converson enire numaresy cadena 115.10 Represertacion numeica en clerertes bases 1511 Lacase StingTokencer 15:12 Usar eqrosionasrogdaros para paiconar 1.5.13 Comparacion de cadonas 1.8 Operadoros i Tet Opexadores atmicos 1182 Opsraderes glcas 183 Operadoresrlaciontes 1.64 Operadores logicas dat... 1165 Operadore de decplazariento de Bt 1.7 Lamaquina vitualy JDK on 171 B DK Uava Development Kt 1.72. _Varsiones y evolucien dol enguse Java 1.8 ResUMEN " 418. Contenido dela pgina Web de apoyo 19.1 Mapa conceptual 1192 Auteorakacon 1183 Videotuterales 1194 Presentacones™ = 2 Programacién ortentada a objetos 2.4 Introduccion : 22 Clases objetos| 22.1 Loe miogos 222 Herenca y sobresctiura de meélodos Java a fondo - Ing. Pablo A. Sznajdleder 58888 888888 Bae 8eeeRe oe BENBEBRERBRRNBESE ERS Sabb bb bbe 23 24 25 26 ar aa 22.9 Elmoc tasting 224 Eimétodo equa 22:5 Delniry “crear obtos 226 Eloonctvetor 2.27 Un pequeto epaso deo vito hasia saul 22.8 Corwndones de nomena 229 Sotrecarga 22.10 Encapeuamiento 2211 Visbildad de métodos y abuts 22:12 Packages (paqustze) 2213 La estructura dens paqusiesy a arable GLASSPATH 2.2.14 Las APle "Appleton Programming irtrace") 22.18 Representa graica UNL 22:16 tmportar cases de otes paaustos Herenciay polimoriamo 231" Poknortma 232 Consiuctoes de subclass 2.83 Lareterenca super 234° Lareeenca tis 235 Clases aewaciae 236 Consinuctoes de caves absractas 237 retanoas 23.8 Varables dainstanca 2.39 Venables cola case . 23:10 E\Gwbage Colectortecolector de red) 23:11 méiods natze 2312 Constantes 2.8.13 Método gels clase 2314 Chaves ultras 23.18 Reterancia eataioae 28.16 Clecciones primera pais BIT Closes genes. 23.18 Inplomentacion do una pla focbuctura de datos) 2.3.19 Implementacon de una ola estructura de dats) Interfaces 24.1” Desaconiamisnte de clases 242 Blpatrin de cise factory mathed 2.4.2 Abracien a waves de intrfacee 244 Lalnterfeos comparable 245 —_Desscoplar ain mas Colecciones 251 Cambio de implementacon Excepciones 281 Brcepclones declraivas yn declaratias 262 Elbloque ty-catontoaty Resumen ‘Contenido dele pagina Web de apovo 281 Mapa concept 282 Aoevatuacien 283 Viseottersies 284 Presentacones” ‘Acceso a bases de datos (JDBC) Introdeciin X= Contenido 32 33. 34 as a6 4a 42 43 44 45 46 5 54 52 Conceptos basicos sobre bases de datos relacionales 321 Relaciones foraraas y consist do datos 822 Diagn Entidad-Palacén DER) 328 SOL Smuctured Query Language 324 Becsar Sonlene8 QUE enn 325. Unetabis join) 3.2.6 Becuaroentencas UPDATE CCongetar programas Java con bases de datos 83.1" Invocarun query eon un jain 332 Updates 323 Secutar unINSERT 884 Geodtar un DELETE 325 Geouarun UPDATE 336 B pattonde dso “Sngeter” (Sngiaion Pater) 8.3.1 Sholeton Pattern pra obtener a cone. 338 Blshutaown hook 329 Inner classes cases interas) 33:10 Mango de tansaccones Uso avanzado de JOBC 241 Aone alamatadta dl aut (FesutSeIMotaData 342. Dotaral “Guy Fetch Sao" para coninios do resutenos cranes. 343 Recutar batch updates (procesamiato por iotes) Resumen Contenido dela pagina Web de apoyo 381 Mapaconceptual 282 Auloovauacen 263 Voeotuteral 384 —Preseniaciones™ Diseho de aplicaciones Java Parte). Introduccion ‘Aibutes 6¢ una apieacion 42.1 Cases de uso Desarrollo de aplicaciones en capas: 48:1 Aplcacion de estudio 4.22 Andis de os objetos de accaso a datos (DAD yDTO} 433 Ande del agade 4.34 Diagram do socuencias do UML. Pottabliad ene diferentes bases de datos. 44:1 DAQs acracies a mplementaciones sspectcas araias erentes bases de astos| 44.2 mplemertadon de un factary metal cn 4:43 Combnar a actory method con e singleton pater 444 Meera ol dbofo de os DACs abstactos Diseto por contratos 45.1 Coordnacon de aap on equa Fesume on . Contenido dela pagina Web de apoyo 47.1 Mapa concept 472. Atoerskacion 47.9 Preseoadionet” 2 Interfaz grafiea (GUN) Invoduecion Componentes y contenecores Alfaomega m4 16 115 116 m8 17 nT 118 123 123 123 125 m2 125 126 128 128 131 81 141 145 Mar 188 160 183 is4 156 158 188 160 160 1€0 160 60 vei 182 12 5a 54 55 57, 58 61 62 82.1. Dlstibucion de componentes (ayes) 522 _AWTySring ‘Comenzande a dasarrollar GUI 527 Cistrbusones relates 532 Rowlaye 839 BorderLayout 534 GroLayout 535. Combinacin de layouts ‘Capture eventos 521 Tos ce evaios 5442 Eventos de accion 5.43 Eventos de teclndo Swing 551” Cambar el Lackandes! 5.6 Model View Controller (VO) s..-0 56.1 Ejemplo deuso: Lista 5.6.2 Efumplo de uso: Tabb Resumen 7 ‘Contenido dela pagina Web de apoyo 58:1 Mapa conceptual 582 Artoevalmoen 583 Videotral 584 Freeentacones’ Multithreading (los) Introduccion Inplementar threads on Java. 21 Lahterace Runnable 62.2 Espetar = quefnaios in thea 62.3 Threads yi iteriaz arc 624 Sstamas opeaivos mutica 6.2.5. Cleo de vida de un trea. 62.8 Prdad ce eecucn 6a 64 7 72 1a T4 ‘Sineroizacién de threads G31 Monitors y seccion rica 68.2 Efomplo del Productor;Coreumicor ‘Resumen Contenido dela pina Web de apoyo 65:1" Mapa conceptual 85.2 Autoevalucion 653 Prosertacones™ Networking Introdueckin ‘Conceptos basicos de networking 721 TOP="aramisscn Corte Prot" 7.22 UDP "User Datagram Protoco” 723° Pleros 72.4 DieceeniP 7.25 _Apleaciones cletelsenidor TCP en Java, 71. Eleccket 7.8.2 Un simple conte/servidor on dv. 738 Setilzacin de objetos 7.3.4 irplamentason da un earier mulitvosd 735 Envaryreciirbytes 7.36 svar y rect valores de toos de datos pros UDP en Java vs 183 164 104 184 “07 168 170 176 320 8 108 196 300 102 108 197 198, 108 198 308 308 199 20 201 202 208 208 206 207 209 209 210 210 2 216 215 218 215, 27 De 28 28 ae 219 219 219 219 29 219 222 208 225, 228 208 Java a fondo - Ing. Pablo A. Sznajdleder Contenido - XI 7.8 Remote Method Invocation IM 715.1 Componentes de una aplioacen AM! 7.52 Geemple de ura aploasén que utza BMI 7.53. Complary ejecutar a aplcacion PM 754 RMly soralzacén de objeto 7.8 Resumen 7.7 Contenido de la pagina Wieb de apoyo 77.1. Mapa coneeptusl 772 Aoerakacen 773 Wdactuterl 774 Presentacones” 4, Dhol tienloatinnniion for 8.1 Introduccion 8.2. Repaso dela apicacon de esucio 83 Capaslogieas vs. capas tscas BG. Desventas de un modelo bacado on dos capas seas 832 Modele de tes canae fea 8.4 Desaroto de ia aoicacion on es caose fslas aa Desarolo da serdace 8.4.2 Desarolo de un chante de prusba 8.438 genioe locator wieador de senicios| B44 _Iniageacén con a capa depresertacion 8.5 _Implementacion del servidor con tecnologia RM @5) Baers AM 85.2 8 Served ocatory os ooltos dltrbuitos 85.3 Desarollo do un ele de ba 5-4 Iniagracen con a eapa de preseracion 55 Blbveshess daegate 88 Concuroncia y acceso ala base de datos 88.1 B pod de conexones 862 —_Implementacn da un poo de consxonse 83 _Intagacen conios seridores TCP y Pl 87 Resumen 8.8 Contenido ce la pagina Web de apoyo BEI Mapa conceptual 282 Agoorakacon 883 Presentacionar™ 9 Estructuras de datos dinamicas, 9.1 Introduceién 912 Estructuras dinamicas 92.1 Brod 922 Lista onazada (Linkodtian 923 Pia 924 Cola - 825. mplarertacien de una cla Sob una sta cour 2.6 Cleans Unkedl et, Stacey Quaue 82,7 Tabas de dspesion Mashable) 92.8 Exuctuas de cates combradas 929 Arboles. 9.2.10 Arbo bnafo de basquoda 92.11 Lackse Tees 93 Resumen ‘8.4 Contenido de la pine Web de apoyo 94.1. Mapa conceptual 842 Autoevahictin Java a fondo - Ing. Pablo A. Sznajdleder 230 zat 21 za 234 24 24 208 236 238 240 278 9.43 Presertaconest 10 Paramotrizacién mediante archivos XML. 10.1 Inraduecisn 10.2 XML- "Extensible Markup Languags 10.8 Estructura y dene parametros en un archivo XML SO Deinciin dal estructura de paramattos 103.2 Lee poreare conerco de un arco HM. 4033 Acosde al iniermacien contenida Srelarine XM 10.4 Resumen 105 contend de pana Web de apoyo 108.1" Mapa concept 4052 Asowalvacén 10533 Presonacines 11 Introspeccin de cases yobjetos 1141 dntreduesion 11.2 Comenzande a invospectar 12" eitear metedos Gonsinvcires 11.2.2 Acceso al prototipa de un méiogo 11.3 Annotations 11.4 Rsumen 1118 Contenido dele pagina Web a apoyo TIS. Mapa concept 1152. Atocvauacen 1183. Presentacionee 12 Generalizaciones y desarrollo de frameworks. 12.1 Inroduecién 122 yauées un framework? $2.21" Framewexks propos 0 tarnonorks de trees? 322.2 Rerwomar ia veda 12.8 Un framework pata accede a archivos KML 123.1" Dero dela API ool Famework 1282 Antics del obmento a gneraizar 1233 Pow ol reno xMLycagar iota se dates 12.4 Un ramework para acceder a bases de datos 124.1 lortiteacion cota aea epetiva 3242 Diseta dela API ca araiare 1243 Java Bees 3244 Tansecconee 12485 _Mappeo de tables usando annotations 128 E1bean factory 126 Intogracion 12 Los cbjtos de acceso a datos 3262 fecads 3262. Blachwo de confguracén 1284 Alclene 12.8 Reeumen 12.9 Contenido dota papina Web de apoyo BOI Mapa concept a 3282. Avtowrauacen 3292 Preconiacionee” 13 Entrada/Salida 13.1 Inreduecion 132 VO steams fujos de entrada y sala) ‘310 310 ‘310 310 a 312 312 313 a8 sid 315, 3i7 318 225 226 er 342 368, sr 37 39 361 351 231 251 352 358 ‘54 Alfaomega XII Contenido 182.1 Erivaday sates eatendar 1822 _Resdreocona la entrada y sala eaindor 19.29 Corr cotectamanto oe areas 182.4 Steams de bytes (routSteam y Outputs 192.5 Swoume de caractors reader y wnat) 1826. Steams bufeizades 1827 Stears de datos DstainputSrea yDataoutpuisveam) 1828 Steams de cbjens (ObjecthputSvean y ObjeciOuputstea) 19. Resumen 194 Contenido do la pagina Vieb de 20... 134.1 Mapa conceptual 1342 Auoovanactn 1849 Presents” 14 Consideraciones finales 14.1 Intecuccion 14.2. Coneideraciones sobre multthreacing y eoncurrencia 142.1 Cases can o ain metodos srerenzasos 142.2 6 sialon patio on contextos mutttrcaded 14.3 Consideraciones sobre clases “legacy” 1431 Lacs StingToxeize®y el metodo soll 144 Resumen 14.5 Contenido de la pagina Web de apoyo 145.1 Mapa conceptual 1452. Autoorshacien 1458 Prosentacones" 18 Object Relational Mapping (ORM) y persistencia de datos 18.1 Inteduccion 152 Hibernate framework 1521 B model de daiceweacenal 1522 ORM (beet Relational Mapohng) 152.3 Confguacion de Hema .. 41524 Mappoo de tables 1525 Lascalin de Hnerate 158 Asociaciones y relaciones 153.1 Asocis0on mary-to-one 1532 Asociscén one-tosrany 1833 PESpy 153.8 Lazy oang vs eager ooding 154 Recuperarcolecciones de objetos 154.1 Crteios de boxquada vs. HOL. 1542 Nemed queries 1543 Flecuar SOL ato 1544 Quotes paametrzados 185 Insertar, modifica’ y eliminar fas 1551 Transaccones 1552 ioertar wa ta 1853 Estatogia de generac do davos paring 15544 Mocca Ura TH nn 1555 Mutples updates y deletes 18.6 Cacos avanzados 1561 Anis yprosntacén del meds do datos 1862 Asoctoanes many-to-many 1863 Caves primar compussas (Compost Alfaomega qenee Geues 18,7 Diseto de apteaciones - 392 57-1 Factonas do cbpios ane 15.8 Resumen a ey 18.9 Contenido dels pagina Web de apoyo 400 15.8.1. Mapa concent. 400 189.2 Aoevaliackn 400 3593 Presenacones" 00 16. Inversion del control por inyeccion dedependencias ao 41644 ntroducelin 402 162 Spring framework 492 3B21 Desacoda i procesarien ri 46.22 Coreusonyrpaso ne 463 Spring y JDBC 409 1644 Integracion Spring + Hibemate 412 108 Resumen . 48 16.6 Contenio dela pagina Web de apoyo 416 $881” Mapa concept! ae 3662 Aoovauacion 16 366.3 Presetaciones" a6 17 _Actualizacion a Java? a7 12.1 Introduccion ee a8 472 Novedades on java 7 48 Sra Lies bharos ate 17.22 Ureraes numercos sesaredos por” "(quer bao) 418 37.23 Uso do cadens eniasortonda sich “19 17.24 ferencis de 8003 GaN. 8 47.25. Seniend ty con recurso ince 20 1726 Aramis eoxpores eo don mera Bonsai 0 47.2.7 Nuevos métodes ena dase Fic 120 17.8 Contenido dela pagina Web de apoyo 421 473.41 Mapa conceptal 21 3732 Ago e1@uUECeN vans Seaccnal 473.3. Presentacones* 21 ‘Apéndice A Nociones basicas de programacién 423 ‘At Introduccion 04 ‘A2 Conceptos incialce 26 zi Ellenquae da rogamacén oa 422 Boampledor aoa ‘23° Losimerpretes 24 24 Lasméqiras vitals 125 25 davayaumaquraved 425 ‘A3 Recursos de programacin 425 Agi Lasvarabies 28 482 Tiposdedsios 28 33 Operedores atnsios 26 ‘Aaa Esruntas oe decsin ar ASS Estuctuas dorepotclen “ar Apendice B Applets 7 329 Ba Introduccin 40 2 Comenzando con Applets 430 B21 Eretio de via de un appat rc 822 Eloontowto dl app sn 39 123 Pasarlepardmettos aun appt a Bibliogratia 435 Java a fondo - Ing. Pablo A. Sznajdleder ‘Contenido - Xi Informacion del contenido de la pagina Web El material marcado con asterisco¢) soo est disporile para docentes. ‘capi Introduccién al lenguaje de programacién Java ‘+ Mapa conceptual * Autopvatuacten * Videotutorales: lesa Java Ese rear ejcuter resto rime programa en Eclpse Pasar argumantos en ines de comanrs en Esipoe ‘Compa ejcuterun programs Java desde aes de comands (sinuiizar sine + Prosentaciones" ‘capt 2 Programacion ortentada a objetos ‘+ Mapa conceptual + Autoevaluacién + Videotutonaee \ilzar aera ‘ave’ para dosrensr nuestro cdo fer Enpaquotar cases utizznde lanai “a «+ Presentaciones" ‘capto3 ‘Acceso a bases de datos DBC) + Mapa conceptuat + Autoovaluacien + Vissotutora Usar Ecpse coma clente SL. + Prosentaciones" ‘capo 4 Diserio de aplicaciones Java (Parte I ‘Mapa conceptual + Autoevaluacien 1 Presentaciones captuo s Interfaz grfica (GUD) ‘+ Mapa conceptual + Autoovatuacien + Videotutorat Uilzarharariortas vis para dato ydesanlo dente grea + Presentaciones" capito6 Multithreading (los) 4+ Mapa conceptual + Autoovaluacton + Prosentaciones" ‘captuo 7 Networking ‘+ Mapa conceptual + Autoovaluacten + Vigeotutora ‘Complaryejecutar una aplicacion Rt + Presentaciones" capt 8 Disenio de apticaciones Java (Parte I) + Mapa conceptuat + Autoovaluacien * Presentaciones” Java a fondo - Ing. Pablo A. Sznajdleder Capito 8 Ectructuras de datos dindmicas + Mapa conceptual * Autoevaluacion + Prosentaciones* apie 10 Parametrizacion mediante archivos XML ‘+ Mapa conceptual ‘utoevaluncion + Prosentaciones Capito 14 Introspeccion de ciases y objetos ‘+ Mapa conceptual + Autoevaluacion + Presentaciones* Capitulo 12 Generalizaciones y desarrollo de frameworks + Mapa conceptual * Autoevaluacion + Presentaciones" Capito 13. Entrada/Salida ‘+ Mapa conceptual + Autoevaluacion + Prosentaciones™ capo 14 CConsideraciones adiclonales ‘+ Mapa conceptual + Autoevaluacion + Presentaclones* api 15 ‘Object Relational Mapping (ORM) y persistencia de datos + Mape conceptual + Autoevaluacion + Procentaciones capo 18 Inversién del control por inyeccién de dependencias ‘+ Mapa concoptual Autoevaluacion + Prosentaciones™ capo 17 ‘Actuallzacion a Java 7 ‘+ Mapa conceptual + Autoevaluacion + Presentaciones* Codigo tuente de cada capitulo Hipervineulos de interes Fo de orratas Gula para ol docente de las competencias especificas que se dosarrolian con este libro Alfaomega xv Registro en la Web de apoyo. Para tener acceso al material dela pagina Web de epoya de! bro: 4, Iralla pagina htp:/virtual.alfaomega,com.mx 2. Registrarse como usuavio del sitio y propietario del loro 43, Ingresar al apartado de inseripeién de libros y registrar la siguiente clave de acceso: 4, Para navegar en la plataforma virtual de recursos del libro, usarlos nombres de Usuario y Contrasefia definidos en el punto nimero dos. Elacceso a estos recursos es limitado. Si quiere un némero extra de accesos, escriba a webmaster@alfaomega.com.mx Estimado profesor: Si desea acceder a los contenidos exclusivos para docentes, por favor contacte al represantante de la editorial que lo suela vsitar @ escribanos a: ‘webmaster@alfaomega.com.mx ‘Videotutoiales que complementan la obra, ‘Nuevo en Java 7: bajo este Ioona se encuentran nusvas formas {de resolver algunas cuestiones en Java. ‘Conceptos para recorder: belo este icono se encuentran b ? "a es May “aes Menor" ‘Comenzaremos analizando la sentencia if cuya estructura es la siguiente: if( condicion } 4 accionl: jes mayor de 21 afos? En el siguiente ejemplo, utizamos un if para determinar si el valor (edad) ingresado por el usuario es mayor o igual que 21. package libro. cere]; eee fablic class Esteyorguedl . peels static void main(String[] args) Scanner scannersnew Scanner (System. in); System. outprint ("Ingrese su edad: "}; int edadescanner.nextInt () i€( edad >= 21) ‘ Systen.ovt.println("Ud. es mayor de edad 1"); else ‘ Systen. ovt.printIn("Ud. es es menor de edad”); Bi siguiente programa pide al usuario que ingrese un valor entero e indica si el valor in- {gresado os par 0 impar. Recordemos que un nimero es par si es divisible por 2. Es decir que el resto en dicha divisién debe ser coro. Para esto, utlizeremes el operador % (operador médulo, retorna alresto de la dvisién). Java a fondo - Ing. Pablo A. Sznajdleder 1.3 Estructuras de control package Libro.cap0l; import java.util. Scanner public clase Pardtmpar { public static void nain(String[] aras) t Scanner scanner=new Scanner (System. in); systen.out.print ("Engreze un valor: "); int v - scanner.nextint |} // obtenemos el resto de dividir v por 2 int reste =v $2) // para preguntar por igual utilizamos iE| resto = 0) c System, out.println|vt" es Par” System. out.println|vt" es Tmpar"); , . Para resolver este problema, primero obtenemos el resto que se origina al dividir v por 2, Luego preguntamos si este resto es igual a cero. Notemos que el operador para com parar es == (gual igual). Java (come C) utiliza == como operador de comparacisn ya que el operador = (igual) se utiiza para la asignacién. El if n-ne tiene la siguiente estructura: condicion 7 retorno?ortrue : retornoForFalse; Lo anterior debe leerse de la siguiente manera: si se verifica la condicion entonces se retorna la expresién ubicada entre el? (signo de interrogacién) y los: (dos pun tos}. Sila cond:cion resulta falea entonces ee retorna la expresion ubicada después delos : (dos puntos). Ejemplo: jes par o impar? (utlizando it in-ine) package Libro. ca import java.util. scanner; public class Parotmpar? { Java a fondo - Ing. Pablo A. Sznajdleder p ava (como 6) uttea = como opera (or de comparacén ya que el operador = (qua) se utiza para la asionacién, Alfaomega 1 Introduceién al lenguaje de programacién Java £7 En Java 7 la sentencia cwittch adm te evaluareadenas de caraceres. r Es muy importante recordar poner siempre el break al finalzar cada Alfaomega public static void main(String{} args) Scanner scanner=new Scanner (System. in); System. ovt.print ("Ingrese un valor: int vescanner-nextint() + // obtenemes 01 resto de dividir v por 2 int resto= v 2; U/ wtitizando un if in-line String masg - (resto — 0 ) ? "es Par": "ea Impar” // muostro resultado System. ovt.printin|v+" "mseg) ; } La decisién maitiple switch tiene la siguiente estructura: switch( variablemnt t aaarveeen masAcciones; ) Dependiendo del valor de variablezntera, el programa ingresaré por el case, cuyo valor coincide con el de la variable. Se ejecutaran todas las acciones desde ese punto hasta el final, salvo que se encuentre una sentencia break que llevara al control del programa hasta la lave que ciera el siiitch, Por este motivo (al igual que en C), es muy importante recordar poner siempre el break al finalizar cada. case. En el siguiente programa, pedimos al usuario que ingrese un dia de la semana (entre 1 y 7) mostramos et nombre del dia. SI ingresa cualquier otro valor informamos que el dato ingresado es incorrecto, Java a fondo - Ing. Pablo A. Sznajdleder 1.3 Estructuras de control package Libro.cap0l; import java.util. scanner; public class Denoswitch public static void uain(string!] args) c Scanner scanner = new Scanner (System. in); Systen.out.print ("Ingrese un dia de 1a senana (numero): int v = sosnner.nextInt |) String diay switeh( vy ) c break: : dia = "Yartes"; breal case ® dia ~ "Uiercoles” break: case 4 dia = "Dia incorrecto... Bl valor debe ser entre 1 y 7."7 Systen. out.printin(dia) + } i . Como vemos, e! switch permite decidir entre diferentes opciones (siempre deben ser numérica Dependienda de cual sea el valor ingresado por el usuario el programa optara por el '5e correspondiente, En caso de que el usuare haya ingresado un valor para el cual no hemos definido ningun case entonces el programa ingresaré por default, Notemos también que utiizamos la sentencia break para finalizar cada muy importante ya que si no la uilizamos el programa, luego de entrar al cas: ondiente, seguira secuencialmente ejacutando todas las sentencias posterires. Si el lector conoce algo de lengua C, esto no |e llamara la atencién ya que funciona exacta- mente igual Estoes Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega 10 Alfaomega 1 Introduceién al lenguaje de programacién Java 1.3.5 Estructuras iterativas Disponemos de tres estructuras iterativas: el while, el do-While yel for Nuevamente, para aquellos que conocen lenguaje G estas instrucciones son idénticas. ‘Gomencemos por analizar el uso del wile cuya estructura es la siguiente: while( condicion | { accionl; ) Elciclo itera mientras condicion resulte verdadera, Eemplo: muestra nimeros naturales. El siguiente programa utiliza un while para mostrar los primeros n niimeros naturales. usuario ingresa el valor n por teciado. package Libro.cap0; Amport java.util. Scanner; public class Prinerosilumeros) 4 public static void main(string{] arys) Scanner scanner = new Scanner |System. in}; // Jeo 21 valor den int n int. while( icon | // muestro el valor Systen. ovt-printin(i) Uf ineremento e1 valor de i } u . \Vemos que el ciclo wile itera mientras que el velor de i sea menor o igual que et valor den (que fue ingresado por teclad). Por cada lteracién mostramos el valor de ia variable iy luego la incrementamos. Analicemos el cielo do-vihile euya estructura es la siguiente: aa { accionl; ondicion |; Java a fondo - Ing. Pablo A. Sznajdleder 1.3 Estructuras de control Este ciclo también itera mientras se verfique la candicion, pero a diferencia del ciclo anterior en este caso la entrada al ciclo no est condicionada; por lo tanto, las acciones. encerradas entre el do yel wile se ejecutardn al menos una vez. Ejemplo: muestra numeros naturales (utlizando do~vihi le). package Libro.cap0l; import java.util. scanner; public class Frimerostfumeros? t public static void main(string!] args) ( Scanner scanner-new Scanner (System. in); dnt n = scanner.nextint |); dnt i = do C ‘System. out.printin|i): oe while| i <=n ); , i . Por ultimo, veremos el ciclo 2 cuya estructura es la siguiente: lizacion; condicion; increnento } accionl; : Este ciclo tiene tres secciones separadas por ; (punto y coma). Ena primera seccién, se define einicializa una variable entera que lamaremos Variable de control, En la segur da seccién, se especifica una condicién l6gica que (recuentemente) estaré en funcién de esta variable. En la tercera seccién, se define elincremento dela variable de control. El for devavaes exactamente el mismo for de C++. Ejemplo: muestra numeros naturales (utlizando. fr). package Libro.cap0l; import java.util. scanner; public class Primerosttumeros3 { public static void nain(String[] args) Scanner scanner-new Scanner (System. in): int n = scanner.nextint (}; Java a fondo - Ing. Pablo A. Sznajdleder 1 Alfaomega 2 1 Introduceién al lenguaje de programacién Java p En Java no este el modticador tmsigned coma en ¢. Por esta razi, ‘os tipcs de dats entre admiten ono ‘aloes negatas segin se muesta en sta tbl. Alfaomega for( int inl; igen; i++ ) t Systen. ovt.println(i); 1 } } 1.4 Otros elementos del lenguaje_ En esta seccién estudiaremos otros elementos del lenguale Java tales como tipos de dates, definicon de constantes, arays, etestera 1.4.1 Tipos de datos Java provee los siguientes tipos de datos: Tipo Descripeién Longitud byte ‘entero con signo T byte " ‘entero sin signo 2 bytes short ‘entero con signa 2bytes int entero con signo Abytes long entero con signo Bbytes float unto flotante 4 bytes double punto flotante Boytes boolean | 6gico fadmite true 0 false) 1 byte string | objeto, representa una cadena de caracteres ‘Siel lector conoce algo de lenguaje C, podra observar que en ambos lenguejes los tipas de datos son précticamente los mismos. En otros lenguajes las longitudes de los tipos de datos pueden variar dependiendo de la arquitectura y del compilador que se esté utlizando. Es decit: en C (por ejemplo) no siempre se reservard la misma cantidad de memoria para una variable de tipo int. En Java (dado que los programas Java corren dentro de una maquina virtual) as longitu- des siempre seran las expresadas en la tabla anterior. Este tema sera tratado en detalle més adelante. 1.4.2 Algunas similitudes y diferencias con y C++ Para aquellos lectores que tienen conocimientos de estos lenguales, voy a marcaralgu- nos Puntos que les resuitardn ules. A quien no conozca nada de C0 G++, considero ‘que tambign podré resuarle de tlidad leer esta seccién, pero si elector nota que esta lectura le esuita algo confusa entonces le recomiendo ditectamente pasaria por alto. EI modificador «unsigned no existe en Java. Los tipos enteros tienen o no tienen bit de signo (seg fa tabla anterior) y esto no puede alterarse. Bi tipo de datos hoo1 ean: en Java existe este tipo de datos que admite los valores true y false. EnGy C+, se utiliza el tio int como booleano aceptando que el valor cero {es fase y cualquier otro valor distinto de cero es. true. Esto en vava no es acepiado. Los int no tienen valor de verdad. Java a fondo - Ing. Pablo A. Sznajdleder 1.4 Otros elementos del lenguale 13 Operadores unaris y binarios son los mismos que en C, por Io tanto, las siguientes sen tencias son validas tanto en C como en Java: int // inceenenta en 1 el valor de i increnenta en 1 el valor de i it=l0r // suma 10 al valor ae ib; // resta 5 al valor i=3)7/ dnezementa 2 veces &. 2 vaui dea Recaleccién automatica de memoria: esta es una diferencia clave entre Java y C/C++. En Java el programador no tiene la responsabilidad de liberar la memaria que va quedando desreferenciada. Esta tarea es automatic y la leva a cabo un proceso llamado Garbage Collector (el recolactor de basura) 1.4.3 Definicion de constantes Las constantes se definen fuera de los métodos utiizando el modificador dinal. Habitualmente, se las define como piblicas y estaticas (aublic, static). Mas adelan- te, explicaremos el significado de public, static y"método! Ejemplo: mucstra dia de la semana (utlizando constantes) package Libro.cap0l; import java.util. scanner; public class DenoConstantes { J/ dennimos 1as constantes Public static final int LUNES = 1; Public static final int MARTES ~ 2, Public static final int MIRCOLES Public static final int JUEVES public static final int VIERNES public static final int SARs00 Public static final int D0WING0 4 public static void asin|steing|) seq) ‘ Scannor scanner = new Scanner (system. in); systen,cut.print ("Ingrese mn dia de 1a senana numero): ” ine v= scanner. nextint (); String dia; switch( v ) c case LINES) dia ~ "Lumes’ break: Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega 4 1 Introduceién al lenguaje de programacién Java E En Java los arays comienzan siempre desde oer, Alfaomega break; case JuEVES: dia ~ "Jueves"? break; case VIERES: dia = "Viernes break; ease SABADO: dia = "Sabad break; ease Dace: dia break; default: dia - "Dia incorrecto... Ingrese un valor entre 1 y 7."7 } System. ovt.printIn{dia); ) } 1.4.4 Arrays Un array es un conjunto de variables de mismo tio cuyas drecciones de memoria son Contiguas. Esto permite defn un nombre para el aray (Conjunto de variables) y acceder 8 cada elemento del conjunto (a cada variable) a través del nombre comin (nombre del {nay} ms un subinice que especifia la posicion relativa del elemento al que queremos aceeder. En Java os arrays comienzan siempre desde cero se definen de a siguiente manera // detine un array de 10 elementos enteros numezados de 0 a 9 Sane are[} = new int (10); ‘También podemos construir un array de n elementos, slendo.n una variable, int n= 10; int arr[] = new int in Dobe quedar claro que el aray es estatico. Una vez definide su tamafo este seré fo. No ‘se pueden agregar ni eliminar elementos en un aay. Para acceder a un elemento del aray, io hacemos a través de un subindice. / asigno el numero 123 en 1a posicion § del azray arr are[5] = 123 Ejemplo: almacena valores en un array. En el siguiente ejemplo, definimos un anay de 10 enteros. Luego pedimes al usuario {que ingrese valores numéricas (no mas de diez) y los guardamos en el anay. Por iltimo, recorremes el array para mostrar su contenido. Java a fondo - Ing. Pablo A. Sznajdleder 1.4 Otros elementos del lenguale 5 public class Dononrray { public static void nain(String[] args) ‘ // defino un array de 10 enteros Ant azr[] = new nt[L0]; // e2 scanner para leer por teclado. Scanner scanner = new Scanner (Syston. in)? // 100 e primer valor Systen-out.print ("Ingrese un valor (O->fin): int v = scanner.nextint (}; Ant i // mientras vy sea distinto a2 cezo AND i sea menor que 10 while| vi=0 G1 ifin|: "); y = canner nextInt()7 } // vecorso et array mostzando su contenido for| int j-0; J java EchoJava Hola que tal? Java a fondo - Ing. Pablo A. Sznajdleder ia T A diferencia de C, Java no rece el nombre del programma coma primer ar {gument en linea de comandos. Alfaomega 2 1 Introduceién al lenguaje de programacién Java Pasar argumentos en nea de comandos en Exlpse T En deva, ligual queen G, no existe tipo de datos Sticing. Sin embargo ava prove la ase St ring, De este ‘modo, como St rinses una dase r= sla que ls cadenas de caraceres son objeto. ‘Un objeto es una variable que, dems de tener informacion, tene ls métodos Co funciones necesarins para manpular ‘cha informacin, Alfaomega Lasalida sera: Hola que tal? ‘Total: 3 argunentos lector podrt acceder al videotutorial donde se muestra cémo pasar argumentos en linea de comandos a un programa que se ejacuta desde Eclipse. 1.5 Tratamiento de cadenas de caracteres ‘Como vimos anteriormente, las cadenas de caracteres son tratadas como objetos por- que String no es un tipo de datas simple. esuna clase, ‘Ain no hemos explicado nada sobre clases y objetos y tampoco explicaremos nada ‘ahora ya que este tema se tratara en detalle en el siguiente capitulo, ‘Sin embargo, el lector ya habra legado a la conclusion de que un objeto es una variable {que ademas de contoner informacion contiene los métodos (0 funciones) necasarios para manipular esta informacion. Agreguemos también que las clases definen los tipos. de datos de los abjetos. Gon esta breve e informal definicién, podremos estudiar algunos casos de manejo de ccadenas de caracteres sin necesidad de tratar en detalle el tera de objetos que es ajeno este capitulo. 1.5.1 Acceso a los caracteres de un String Una cadena representa una secuencia finta de cara o mas caracteres numerados a partir de cero. Es decir que la cadena ""fcL2” tiene 4 caracteres numerados entre O y 3 Ejemplo: acceso directo a los caracteres de una cadena, package Libro. cap01. cadenasy public class Cadenas { public static void main(String{] args) ‘ vB string = es mi cadena"; System. ovt.printIn{ s.charat (0) | System. ovt.print in| s.charAt(5) System. out-printIn{ s.charAt(3,length()-1) }7 char c: for(int ( ics. lengthi)+ i++) } } El método charAt retorna al cardcter (tipo chat) ubicado en una posicion determina- da. Elmétodo Length retorna la cantidad de caracteres que tiene la cadena, Java a fondo - Ing. Pablo A. Sznajdleder 115 Tratamiento de cadenas de caractores 23 No debemos confundir el atribute length de los arrays con el método length de los strings. En el caso de los arays, por tratarse de un aributo se lo utliza sin paréntess, En cambio, en el caso de los strings esté implementado como un método, por lo tanto, siempre debe invocarse con paréntesis. Veamos el siguiente ejemplo: char cl] = { ‘ty to', "1's tat dy System. out-printin( c!length ); string 3 - : System, out-printin( s.tength() 1; 1.5.2 Mayisculas y mindsculas jem: pasar una cadena a maylsculas y mindeculas package Libro.cap0l.cadenas; public class Cadenael ‘ public static void nain(String[] args) t String s - "Esto Bs Una Cadena de caracteres"; String smayus = s.toUppercasa(); String allinus - s\toLowerdase(); Systen.out.printIn("Original: "+2) 7 System out print ]n("ayueculas: "+2"ayus) Systen. out.printIn("finusculas: "4s!inus) ) : Recordemos que = es un objeto. Contione informacién (la cadena en sf misma) y los metodos necesarios para manipularia, Entre otros, los metodos tolppercase y TolowexCase que utilzamos en este ejemplo para pasar la cadena original a mayiscu- las y a minisculas respectivamente. 1.5.3 Ocurrencias de caracteres Ejemplo: ubicar Ia posicién de un cardcter dentro de una cadena, package Libro.cap0l, cadenas; public clase Cadenas? { public static void asin(steing!) arg) String s = "Esto 2 Una Cadena de caracteres"; int posl = s.indexOf(*C*}; int pos? = =, lastIndexof('c'); int pos3 ~ s.indexOE ("x"); Systen. out-printin(posl) + Systen. out. print In(pos2); Systen.out.print1n(pos3); Java a fondo - Ing. Pablo A. Sznajdleder p No debemas confundir el método Length () de las cadenas con el atibuto Length de fs ays. Alfaomega 24 Alfaomega 1 Introduceién al lenguaje de programacién Java El método_indexof retorna la posicién de la primera ocurrencia de un carécter dentro del string. Sila cadena no contiene ese cardcter entonces retoma un valor negative, Analogamente, el método Last Index0£ retoma la posicién dela titima ocurrencia del ‘cardoter dentro del string o un valor negative en caso de que el cardcter no esté conte nido dentro de la cadena, 1.5.4 Subcadenas Ejemplo: uso del método sulsstring para obtener diferentes porciones de la cadena original package libro. cap01.cadenas public ls ‘ public static void main(string[] args) { radena3 String s ~ "Esto Es Una Cadena de caracteres"; String el ~ e.substring(0, 7}: String 22 ~ e.oubstring(, 11); // toma desde el caracter # haste et final String #3 = e.cubstring(8); System. ovt.printin(sl); System. out.printIn(s2); System. ovt.printIn(s3) La salida de este programa es a siguiente: Esto Es Una luna cadena de caracteres Elmétodo subst ring puede invocarse con dos argumentos 0 con un Unico argumento. Silo invocamos con dos argumentos, estaremos indicando las posiciones desde (inclusi- ve) y hasta (no inclusive) que delimitarén la subcadena que queremos extraer. En cambio, silo invocamos con un solo argumenta estaremos indicando que la subcadena a extract ‘comienza en la posiciSn especficada (inclusive) y se extendera hasta ol fina del string. Decimos que un método esta “sobrecargado” cuando podemos invocarlo con diferentes. ‘cantidades y/o diferentes tipos de argumentos. Este es el caso del métado substring. *Sobrecarga de métodos” es uno de los temas que estudiaremos en el capitulo de pro: ‘gramacién orientada a objetos. 1.5.5 Prefijos y sufijos Gon los métodas startiiith y endeWith, podemos verificar muy faciimente si una ‘cadena comienza con un determinado pref o termina con algin sufi. Java a fondo - Ing. Pablo A. Sznajdleder 115 Tratamiento de cadenas de caractores 25 package Libro.cap0l.cadenas; public class Cadlenas4 { public static void main(String[] args) t String s - "Un buen Libro de dara’ boolean 11 boolean bo boolean 3 boolean bd -startsfith("Un buen"); // true -startoWith("A"}; Y/ false vendatli th ("Java") YW true cendatdith|"chau") ¢ H false systen. out. printin(bl}; Systen. out. printIn(b2); Systen. out. printin(b3); Systen. out. print In(b4); 1.5.6 Posicion de un substring dentro de la cadena Los métodes indexOf y LastTndexOf estén sobrecargados de forma tal que permi- ten detectar la primera y ia ltima ocurrencia (respectivamente) de un substring dentro de la cadena en cuestion. package Libro. cap0l. cadenasy public class Cadenass ‘ public static void ssin|steing|) args) c String 2 - "Un buen Libro de Java, un buen material"; int post = s.indexot ("buen"); | // retorna 3 int pos? = o:lastIndexOt ("buen"|; // returna 26 Systen,ou.printin(posl) Syaten.out.printin(pos2) + 1.5.7 Concatenar cadenas Para concatenar cadenas podemos utilizar el operador + como se muestra @continuaci: string x = x= xt "Ho: xox 4+ "Que tal?" system. out-printIn(x); // imprime "Hola gue tal? Sibien lo anterior funciona bien no es la opcién més eficiente ya que cada concatenacién implica instanciar una nueva cadena y descarta la anterior. Mucho mas efciente seré utlizarla clase StringBuffer, Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega 26 Alfaomega 1 Introduceién al lenguaje de programacién Java 1.5.8 La clase StringBuffer Esta clase representa aun string cuyo contenido puede varar (mutable). Provee métados a través de los cuales podemos insertar nuevos caracteres, eliminar algunos o todos y ‘cambiar los caracteres contenidos en las diferentes posiciones del string. i compilador utiiza un string buffer para resolver la implementacién del operador de ‘concatenacion +. Es decir que, en el ejemplo anterior, se utiizara una instancia de StringBuffer de a siguiente manera String x = new Stringsuffer().append("Hola ") append ("Que Tal stoString() La iferencia de rendimiento entre utilizar el operador + yla clase Stringu ‘concatenar cadlenas es abismal y a continuacién lo demostraremos. E siguiente programa utiiza un StringBuffer para concatenar n caracteres sobre un string nicialmente vacio. Alfinalizar muestra la cadena resultantey el tiempo que insumié todo el proceso, para package Libro. cap01. cadenas; public cli i public static void nain(String{] args) { cadenasta // obtengo el milisegundo actual Jong hi = Syston, currentTineMillis(); J/ instancio un StringSuffer iniciainente vacio Stringsuffer sb-new StringSuffer(); // voy a concatenar n caracteres int n-100000; char c for(int ( 7 att) // obtengo caracteres entre ‘i © = (char) {'A" + i¥('2"—"A'41)) y // coneateno el cavacter en el stringzurter sb. append (c} // obtengo e1 milisegundo actual Jong hf = System, currentTineMilIis(); Z/ muostro 12 cadena resuttante System. out.printIn(sb. tostring()}; J/ muestra 1a cantidad de milisegundos insumidos System. out.printIn{ (hf-hi)+ milisegundos"); Java a fondo - Ing. Pablo A. Sznajdleder 115 Tratamiento de cadenas de caractores ar Este programa ejecutado en mi computadora (procesador Intel Core 2 Duo T6870 con 2 GB de memoria RAM y sistema operative Windows XP), con n = 100000 insume 15 milisegundos y con n = 1000000 insume 78 milisegundos. ‘Veamos el misma programa, pero ahora utlizanda el operador + para concatenar los caractores, package Libro. cap0l. cadenasy public class Cadenaesb { public static void main(string[] args) c long hi = systen. currentTimeni72is(); int n=100000; String =! char cz for|int 10; icn; i++) c = (ohar) (1A1 + 8(2'IAN1))7 // concateno el caracter © utilizando el operador + } long hf = systen. currentimeni11is()7 Systen.out.printin(=); Systen. out. print In{ (hf-hi}+" milisegundos") + } En a misma computadora, con n = 100000, este programa insume 48171 milsegundos ¥-con 7 = 1000000 el programa supers los 40 minutos de proceso y adn no arojé ningun resultado. a Gon stringtutfer Rendimiento 100000 |15 milsegundos {48171 milisogundos [8211 veces mas lento 1000000 |78 milsegundos Las operaciones sobre after son sincronizadas (ver Capitulo 6). La clase StringBuilder provee la misma funcionalidad y los mismos métodes, pero sin sin- cronizacion 1.5.9 Conversion entre numeros y cadenas Java proves clases para brindar la funcionalidad que los tipos de datos primitivos (int, floubie, char, ete) no pusden proveer (ustamente) por ser solo tipos de datos print vos. A estas clases se las suele denominar wrappers (envoltorios)y permiten, entre otras: cosas, realizar conversiones entre cadenas y nimeros, obtener expresiones numéricas en diferentes bases, etcétera Enel siguiente ejemplo, vemos cémo podemos realizar conversiones entre valores nu- mericos y cadenas y viceversa, ava provee clases para bendar la un ‘ionaldad que os tips de dates prim twos no pueden proveer. A ests clases spas ale denominar wrappers. Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega 28 £7 En Java 7 se puede utlzar el carécter “quon blo” para agrupar its en fos, valores eralesenteros, Por ejemplo: 1/25 de novienbre de 2012 int fecha = 2012 11 25; Alfaomega 1 Introduceién al lenguaje de programacién Java ‘Aigunos ejemplos son: ones con el tipo int -—~ // convierto de int @ string String sInt = Integer. tostring|i) // convierto de string a int int i2 = Integer.parsetnt [eTnt); “u double el tipo double // convierto de double a string String sDouble = Double. tostring(d); // conviexto de string @ double double d? = Double. parseDouble Double); En a siguiente tabla, vemos e! wrapper de cada tipo de datos primitvo, Tipo. Wrapper byte Byte short, short . character int Integer Tong Leng float Float double Double boolean, Boolean, ‘Todos estas clases tienen los métodos parseXer (slendo Xxx el tipo de datos al que ‘50 quiere parsear ol string) y el método toString para conver un valor del tipo que representan a cadena de caracteres. 1.5.10 Representacion numérica en diferentes bases ‘Java, igual que C, permite expresar valores enteros en base 8 y en base 18, Para repre ‘sentar en entero en base 16, debemos anteponere el prefijo 0 ((6ase "cero equis”) int 1 = Ox4ac; Uf en decimat es 150: System. out.printin(i}; // imprime 1502: Para expresar enteros en base 8, debemos anteponeries el prefjo 0 (éase cero). int 3 ~ 08377 // en decimal es 351 System out.printin(j}; // imprime 3551 Utiizando la clase Integer podemos obtener la representacién binaria, octal, hexade- ccimal y en cualquier base numérica de un entero dado. Esto lo veremos en el siguiente programa, Java a fondo - Ing. Pablo A. Sznajdleder 115 Tratamiento de cadenas de caractores 29 Ejemplo: muestra un valor entero en diferentes bases numéricas. package Libro.cap0l, cadenas; import java.util. Scanner; public class Cadenaso { public static void main(string[] args) 4 Scanner scanner=new Scanner (System. in); Systen.out.print ["Ingrese un valor entero: int v - scanner.nextint (} Systen.out.printIn("Valor Ingresado: "#v): Systen.out.println("binario = "Integer. topinarystring(v))? System out println ("octal = "+Integer. to0ctalstrang|) |; Syaten. our print ]n("hexadecimal = "+Integer. conexString|v))? Systen. out.print ("Ingrese una base numerica: int b = scanner.nextInt |}; String sBaseN-Integer. rostréng(v,b); Systen.ovt.printIn(y + "en base("#bi") = "+ Basel); E . ‘Aqui el usuario ingresa un valor numérico por teclado y el programa muestra sus re presentaciones binaria, octal y hexadecimal. Luego se le pide al usuario que ingrese Cualquier otra base numérica para mostrar, a continuacién, la representacion del nUmero expresado en la base numérica ingresada, Sie! usuario ingresa el valor 632 y luego ingresa la base 12, entonces la sada del pro- grama serdla siguiente: Ingrese un valor entero: 632 valor Ingresado: 632 binaria = 1001111000, 8 Ingrese una base nunerica: 12 632 en base(12) = 448 1.5.11 La clase StringTokenizer La funcionalidad de esta clase la explicaremos sobre al siguiente ejemplo, Sea la cadena © definida en la siguiente linea de cédigo: String s = "Juan|Marcos|Carlos|Matias"; Si consideramos como separador al cardcter | (ease “cardcter pipe") entonces lamare~ mos token a las subcadenas encerradas entre las ocurrencias de dicho caracter y a las subeadenas encerradas entre este y el inicio o el fin de la cadena, Para hacerlo més simple, el conjunto de tokens que surgen dela cadena s consideran- do como separador al caracter | 0s l siguiente: tokens = { Juan, ™ 103, Carlos, Matias } Java a fondo - Ing. Pablo A. Sznajdleder £7 En Java 7 se pueden representa ni meres bnaros aneponiendo el pref ab o02. Por elemplo: Ant x = 080110001100111100; ‘bien, separindolo con "guion bao" intx=0B01100011_00111100; Alfaomega 20 Alfaomega 1 Introduceién al lenguaje de programacién Java Pero sien lugar de tomar como separador al cardcter | consideramos como separador alcaracter 2 sobre|a misma cadena s el conjunto de tokens seré: tokens = ( du, nl, rcos|c, rlos|M, ti, = }7 Utiizando la clase StrinyTokenizer podemos separar una cadena en tokens delimi= tados por un separador. En el siguiente ejemplo, veremos cémo hacero, package Iibro. cap0l. cadenas+ import java.util stringTokenizer public cla: ‘ pose t String = = "Juan|Marcos|Carlos |Matias! StringTokenizer st ~ new StringTokenizer (3,""|" cadenaa? atic void main(string{] args) String toki while( st.hastoreTokens|) ) ‘ tok = st-nextToken(); System. ovt.printIn( tok) + } z . Primero, instanciamos el objeto st pasindole como argumentos la cadena sy una ‘cadena "|" que serd considerada como separador. Luego, el objeto st (objeto de la clase StringTokenizer) provee los métados hasVoreTokens y nextToken que permiten (respectivamente) controlar si existen mas tokens en la cadena y avanzar all siguiente foken, Notemos que el recorrdo a través de los fokens de la cadena es forward only. Es decir, ‘solo se pueden recorrer desde el primero hasta el Ultima (de izquierda a derecha). No se puede tener acceso directo aun token en particular, nitampoco se puede retroceder para recuperar el foken anterior. Nuevamente, debo oftecer las disculpas del caso ya que estoy utiizando términos que no he explicado ain (instancia, clase, objeto) Si la comprensién de este tema resulta, ‘complicada por la falta de explicacién de estos conceptes le propongo al lector que siga avanzando hasta leer el capitulo de programacién orientada a objetos. Luego podta retomar para volver a leer aquellos conceptes que pucieran no haber quedado lo sufi- cientemente claros. 1.5.12 Usar expresiones regulares para particionar una cadena Laclase string proveeel método split que permite particionar una cadena a partir. dde una expresién regula. Si el lector tiene conocimientos sabre expresiones requlares, lentonces este metodo le resuitaré més iil que la clase StringTokenizer E siguiente ejemplo es equivalente al ejemplo anterior, pero utliza el iétodo split que provee la clase String, Java a fondo - Ing. Pablo A. Sznajdleder 1.5 Tratamiento de cadenas de caracteres 3 package Likro.cap0l. cadena; public class Cadenas7a c public static void uain(stving|) arg2) String = = "Juan|Marcos Carlos Mati String[] tokens = 5-splse("(1" for|int i-0; ictokens. lengthy it+) £ System. out.printIn|tokens{il]? : } La salida sera suan Mareas 1.5.13 Comparacion de cadenas En el lenguaje Java al igual que en C), no existe un tipo de dates primitivo para representar cadenas de caracteres. Las cadenas se representan como objetos de la clase String ‘Ahora bien, la clase String tiene tanta funcionalidad y (yo dria) tantos “privilegios” que muchas veces se la puede tratar casi como si fuera un tipo de datos primitive. Informalmente, diremos que “un objeto es una variable cuyo tipo de datos es una clase”, Asi, en el siguiente cédigo: 2 > "Hola a t ' resulta ser un objeto (una vatiable) cuyo tipo de datos es String, Es decir: un objeto delaclase Stzing o (también podriamos decir) una instancia de esta clase. Los objetos son, en realidad, referencias (punteros) que indican la direccion fisica de memoria en donde reside la informacion que contienen. Por este motivo, no podemos utlizar el operador de comparacién == (igual igual) para comparar objetos, porque lo que estaremos comparando seran direcciones de memoria, no contenidos. Como las ca- ddenas son objetos, comparar cadenas con este operador de comparacién seria un error. Esto podemos verificaro con el siguiente programa en el que se le pide al usuario que ingrese una cadena y luego otra. El programa compara ambas cadenas con el operador € informa al resultado obtenido. Recomiendo al lector probario ingresando dos veces la misma cadena y observar el resultado, package Libro.cap0l. cadenas; import java.util. Scanne public class Cadlonas0 t public static void msin(Steing!) args) c Scanner scanner = new Scanner (System. in); Java a fondo - Ing. Pablo A. Sznajdleder e T Como ls cadenas son objets y los ob- jetos son punters resufta que si com- paramos cadenas con == estamos ‘comparando drecciones de memoria. Para compara cadenas carectamente {y cualguer oto tipo de objtas) dade mos ulizar el méiodo equals. Alfaomega 2 1 Introduceién al lenguaje de programacién Java Alfaomega System. out.print ("Ingrese una cadena: " String sl = scanner.next |}; | ovt.print ("Ingrese otra cadena: "); 122 scanner.next [)7 // muesteo les cadenas para verificar 1o que contiznen ove.printia|"=sL alt "1"; ove println("22 = [" + 22+ "]"); Z/ esto esta mal 111 A€( sl == 22) ‘ Systen.out.println("Son iguales! 7 else ¢ Systen. ovt.printin("gon distintas"); } } La salida de este programa siompre sera: Son distintas. Lo correcto sera comparar las cadenas utiizando el métado equals. Este métedo com- para los conteridos y retorna true 0 false segin estos sean iguales o no, ejemplo anterior debe mocificarse de la siguiente manera Uf spore si ttt 4€( sl.equals(e2| ) Systen. out.println("Son iguales"); } Recomiendo también probar el siguiante caso: package libro. cap01.cadenas; public class Cadenaso ‘ public static void main(stringt} arve) J/ des cadenas iguaies String sl - "Hola"; String 23 = "Hola"; System. ovt.printin("s1 System ovesprint1n("=2 if( sl == 52) ‘ rs elt ty: eg del Systen.out.println("Son iguales"); Java a fondo - Ing. Pablo A. Sznajdleder 1.6 Operadores 3 ' else c System. out.printin|"gon distintas") + : ? En este caso el operador == retomna true, es decir: compara “bien” y el programa indicara que ambas cadenas son idénticas. {Por qué? Porque Java asigna la cadena literal "Hola" en una porcién de memoria y ante la aparicién de la misma cadena no vuelve a alocar memoria para almacenar la misma informacion, simplemente ob- tiene una nueva referencia a dicha porcién de memoria. En consecuencia, los dos objets 81 y 32 apuntan al mismo espacio de memoria, son punteros idénticos y or este motivo el operador == retoma true. El método ‘equals también hubiera Fetornado true. 1.6 Operadores \Veremos aqui ls diferentes tipos de operadores soportados en Java. No nos preocupe: remos por buscar ejemplos para mostrar su uso ya que los mismos se irén aplicando y explicando a medida que avancemos en los capitulos de este libro, 1.6.1 Operadores aritméticos La siguiente tabla resume los principales operadores aritméticos del lenguaje. Operador Descripeién + ‘uma = esta ‘multiplicacién division 5 médulo acumulador restador ‘multipticador divisor 1.6.2 Operadores légicos La siguiente tabla resume los operadores légicos disponibles en Java. Operador Deseripcion rn and 1 or ot Java a fondo - Ing. Pablo A. Sznajdleder p En Java los operadores aritmétcs, l= cos, relacionales, unaios y bnarios son los mismos queen C. Alfaomega 1 Introduceién al lenguaje de programacién Java Alfaomega 1.6.3 Operadores relacionales La siguiente tabla resume los operadores relacionales provistos en Java. Operador Descripcion igual i distinto (rot equals) > mayor que < menor que > mayor o igual que « menor 0 igual que 1.6.4 Operadores logicos de bit Operador Descripcion = ‘and binario| 1 or binario 1.6.5 Operadores de desplazamiento de bit Operador Descripcion dospiazamiento a derecha >>> En cambio, podremos invocar cualquier método detinido como public, como: todos los constructores y los métodos tostring, equals, addDias, et. Sila clase tuviese tributes definidos como public, entonces pocriamos manipularlos directamente des- de cualquier método dentro de cualquier clase. En general, se estila que los atributos sean private y los métodos public. Si para desarrollar un método complejo tenemos que dividirio estructurario) en varios métodos, mas simples, estos probablemente deberian ser private para prevenir que @ usuario los pueda invocar. Con esto, le evitaremas al usuario confusiones y perdidas de tiempo Existen dos niveles més de visibildad: protected y friendly, Elprimero hace que un métode o variable sea visible dentro de la cadena de herencia (es decir, en todas las subciases) pero que no lo sea por fuera de esta. El segundo (rienly) no existe como tal. Es un modificador tcito que surge cuando omi- ‘imos definir explcitamente algun de los modiicadores anteriores. En otras palabras, sia un miembro de la clase no lo definimos como private, protected © public tentonces (por omisién) sera finaly. Un método o variable siondly serd accesible por todas las clases que comparten ol mis- ‘mo paquete, pero no lo serd para las clases que estén ubicadas en otros paquetes. Java a fondo - Ing. Pablo A. Sznajdleder Si para desartolar un método complejo. tenemos que dvd (estructura) en Varios métodas mas simples, sts pro= bablemente deberan ser private ara preven que el usuaro ls pueda Alfaomega Alfaomega 2 Programacién orientada a objetos 2.2.12 Packages (paquetes) Los paquetes proporcionan un mecanismo a través del cual podemos orgenizar nuestras clases por algin erterio determinado. Ademds, constituyen un namespace (espacio de nombres) en el cual pueden convivir clases que tengan el mismo nombre, siempre y ‘cuando estén empaquetadas en diferentes paquetes. Para que una clase esté ubicada en un determinaco paquets la primera linea de codigo del archivo que la contiene debe ser package seguido del nombre del paquete que la contend Qué hubiera pasado sia nuestra clase en lugar de llamatla “Fecha” la hubiéramos a- mado “Date? No huiiera pasado absolutamente nada. Java trae, por lo menos, dos clases llamadas “Date. La nuestra podria ser la tercora ‘Siendlo asi, ome pueden convivir tres clases con el mismo nombre? Es simple, estén ubicadas en paquetes diferentes Por ejemplo, Java provee las clases: java.util.Date y java.sal Date, Lanuestra {sila hubiéramos llamado “Date’) seria: Libro. cap02. fechas. Date. Fisicamente, los paquetes son directorio (o carpetas). Asi, para que una clase esté den- ‘ro de un determinado paquete (supongamos el paquete pit est) tendré que comenzar conlatinea p: [pigtestsy estar ubicada en el disco en una carpeta con el mismo nombre. 2.2.13 La estructura de los paquetes y la variable CLASSPATH Los proyectos Java deben estar ubicados dentro de una carpeta que ser la base de las Carpetas que constituyen los paquetes. A esta carpeta i amaremos package root (aiz de los paquetes). Por ejemplo, la clase Fecha esté en el paquete Libro. cap02. fechas, si considera- mos como package root ala carpeta c:nisproyectosidemolibo entonces Ia estructura del proyecto seréla siguiente: | misproyectos |_denolibro |_sre! 17 |r) i |_eapo2 1 |_tecnas i ["Becha. java i [Cnesteecha.java i Io: i pin aire) |eapo2 |_fechas |-Fecha. class [CnestFecha.class a ‘Cuando trabsjamos con Eclipse esto es totalmente “transparente" ya que esta herra- mienta lo hace automaticamente. Sin embargo, si queremos ejecutar algun programa Java desde afuera de la herramienta entonces tendremos que tener en cuenta la estruc- {ura anterior y los pasos a seguir serdn los siguientes: Java a fondo - Ing. Pablo A. Sznajdleder 2.2 Clases y objetos 55 + Definirla variable de ambiente CLASSPATH-c: \mi spr + Aseguramos de que la carpeta que contiene java.exe esté dentro de! ectos\demoLibro\bin TH Con esto, podremos ejecutar desde linea de comandos nuestro programa Java haciendo: Java Libro.cap02. fechas Test Ena variable CLASSPATH, podemos definir mas do una ruta, por lo quo si tenemos va- fios package roat de diferentes proyectos podemos agregarlos al CLASSPATH y asi, en las clases de un proyecto, podremos utiizar clases que fueron desarrlladas en otros proyectos. Las diferentes rutas deben separarse con ; (punto y comal: CLASSPATE: pkgroot L? igeoot2s 2.2.14 Las APIs (Application Programming Interface) Dado que usualmente los paquetes agrupan clases funcionalmente homogéneas, os co- man decir que determinados paquetes constituyen una API (Application Programming Interface) Llamamos AP! al conjunto de paquetes (con sus clases y métodos) que tenemos dispo- nibles para desarrolar nuestres programas. Todos los paquetes que provee Java constituyen la API de Java. Pero podemos ser mas especifcos y, por ejemplo, decir que el paquete 32va.net constituye la API de networking y deci que el paquete Java.sqi conttuye la API de acceso a bases de datos (0 la API JDBC) En resumen, una API es un paquete o un conjunto de paquetes cuyas clases son funcio- nalmente homogéneas y estén a nuestra disposicion. Las APIs suelen documentarse en paginas HTML con una herramienta que se provee como parte del UDK: el javadoc. Recomiendo al lector mirar el videotutorial que explica mo utilizar esia herramienta Es comtn utlizar APs provistas por terceras partes o bien, desarrolar nosotros nuestras propias APIs y ponerlas a cisposicién de terceros. Dado'que una API puede contener Gientos o miles de clases se utiiza una herramienta para unticar todos los archivos (to ds los clas) en un Unico archivo con extension jar. Esta herramienta es provista como parte del JDK y su uso esta documentado en el videotutoral comespondiente. 2.2.15 Representacion gréfica UML Como dice el refrén, “una imagen vale mas que mil palabras". Un gréfico puede ayudar- ros a ordenar los conceptos e ideas a medida que los vamos incorporando. Sibien no es tema de este libro, utlizaré algunos de los diagramas propuestos por UML. (Unifed Modeling Language, Lenguaje Unificado de Modelado) cuando considere que estos puedan aportar clara sobre alguno de los conceptos analizados. UML es, en la actuaidad, el Ienquaje grafico de modelado de objetos mas difundido y utlizado, Su gran variedad de diagramas facta las tareas de andlss, disefio y docu mentacién de sistemas. Esté respaldado por el OMG (Object Management Group). En este caso, utilizaremos un diagrama de clases y paquetes para representar lo que estugiamos més arriba, Los paquetes se representan como “carpetas”, las clases se representan en “cajas" y las flechas indican una relacién de herencia entre clases. Side una clase sale una fecha ue apunia hacia otra clase, seré porque la primera es una subclase de la segunda, Side Un paquete sale una flecha que apunta hacia otro paquete, estara representando que el primer paquete es dependierte del segundo, ‘Java a fondo - Ing. Pablo A. Sznajdleder v [Lamamos AP al conjunto de paquetes (con sus clases y métodos) que tene= ‘mos dsponibies para desarrlarnues- tos programas, ‘iar i nerramienta Javadoc" para ocumentar nuestra cécigo tent. Empaquelar clases wlzando la herramieta Alfaomega 2 Programacién orientada a objetos Alfaomega [Geeta] Fig. 2:1 Diagrama de clases y paquetes de UML, Este diagrama muestra algunas de las clases que hemos utlizado ubicdndolas dentro del paguete al cual pertenecen. También representa la relacién de herencia entre estas clases y la clase base Object, en la que ademas se destacan los métodos equals y ‘toString. Es decir, todas las clases heredan estos métodos, Podemos observar que existen dos clases Dat-e, pera esto no ocasiona ningin proble- ma porque cada una est ubicada en un paquete diferente, Obviamente, [a clase Obj=ct tiene mas métodos, los paquetes java. lang, java.util y Java.sql. tlenen mas clases y, ademas, Java provee muchos otros pa ‘uetes. En el diagrama solo representamos aquellos elementos que necesitamos refiejar 2.2.16 Importar clases de otros paquetes En nuestas clases podemos utlizar otras clases independientemente del paquete en ‘que estas estén conteridas. Simplemente, "as importames” y las usarios. Para esto, se tifa la sentonela npc Si abservamnes bien, en todos los programas que desarolamos hasta ahora incuimos lasentencia anport. ava, util, Scanner. Gracias a esta sentencia pucimos utlizar Igclase Scanier que, evidentemente, nosotros no desarrollamos, pero la ulizamos. ‘Sin embargo, también utlizamos muchas otras clases que no necesitamos importa, ta- les como: String, System Integer, Object. Todas estas clases (y muchisimas més) con parte de Ia API (biblioteca) que provee Java y estén ubicadas en el paquete ava. Lang. Este paquete se importa solo, no es necesatio importarlo expliitamente. SSiel lactortiane conocimiantos de lenguaje C, probablemente relacionara la sentencia import con la instruccién de preprocesader “include. Pues bien, no funcionan de la misma manera. La primera (el import de Java) solo define referencias, ritas en las cua- les el compilador debe buscar las clases que utlizamos en nuestros programas. La se~ {gunda (el include de C) incluyefisicamente el contenido de un archivo dentro de otro. Java a fondo - Ing. Pablo A. Sznajdleder 2.3 Herencia y polimorfiemo 7 2.3 Herencia y polimorfismo Como mencionamos anteriormente, la herencia permite definir nuevas clases en fun- cidn de otras clases ya existentes. Diremos que la “clase derivada” o la “subclase” hereda los métodas y atrioutos de la “clase base”. Esto posibilita, partiendo de una base, redefiir el comportamiento de los métodos heredados y/o extender su funcio- nalidad. Ena seceién anterior, trabajamos con la clase Fecha. Supengamos que ne tenemos: acceso al cédigo de esta clase. Es decir, podemos utlzarla, pero no la podemos mo- dificar porque, por ejemplo, fue provista por terveras partes. Hagamos de cuenta que no [a desarroliamos nosotros. Laclase Fecha nos es itl, funciona bien y es muy prictica. Sin embargo, queremos ‘modificar la forma en la que una fecha se representa @ si misma cuando le invocamos. el método toString (recordemos que no la podemos modificar porque estamos: suponiende que nosotras no la hemos desarrollado) La solucion sera crear una nueva clase que herede de f=cha y que moditique la ‘manera en la que esta se representa como cadena, Esto lo podremos hacer sobres- cribiendo el método toString. Llamaremos a la nueva clase PechaDetallada y haremos que se represente asi: “25 de octuore de 2009". package Libro. cap0?.misclases; import libro.cap02. fechas. Fecha; public class FochaDetallada extends Fecha ‘ private static ing meses[]=("Enero” iEebrero" Were ‘anbedi" SenayoH sgunio" ridulio" agosto! i Septiembre"” Octubre" /iNovienbre"™ i "Dicienbre! public String toString(] c return getDia|)+" de "tneses[gettles(|-1]+" de "tgetAnio() + , u . Laclace FechaDetallada hereda dela clase base Fecha y sobreseribe el mé= todo toString para retornar una tepresentacion mas detallada que la que provee su padre, Para indicar que una clase hereda de otra, se utiliza la palabra extends. Decimos entonces que Fechabetallada “extiende” a F Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega 58 Alfaomega 2 Programacién orientada a objetos tras expresiones validas son: FechaDetallada *hereda" de Fecha FecheDetallada “es una” Fecha Fechabetallada “es hija" de Fecha FechaDetallada “ee una subclass” de Fecha FechaDetallada “subslasea’ a Fecha Lalgica de programacién que utlizamos para resolver el método toString enlaclase FechaDetal lada es simple: definimos un String/] ((éase “string array") conteniendo los nombres de los meses. Luego retornamos una cadena de earacteres concatenando cl dia seguido del nombre del mes y el af. Notemos que (por ejemplo) sila fecha contiene el mes 10, el nombre “Octubre” se en- ‘ouentra en la posicion § del array porque en Java los array siempre comienzan desde cero, Blarray meses fue definido como static. Esto significa que es una “variable de clase”, pero este tema lo estudiaremos mas adelante, Notemos también que para acceder alos atributos ia, mes y anio que la clase FechaDetal lada hereda de Fecha fue necesario utiizar los getters. Esto se debe a {que los atributos on privades y si bien existen en la clase derivada, no son accesibles ‘Sno a través de sus métodos de acceso. Probemos la clase FechaDetallada con el siguiente programa: package libro. cap?.misclases; public class Test¥echaDetallada { public static void main(string[] args) { FechaDetallada fnew Fechapetallada(}; £-setDia (25); fesetifes (10): f.setAnio (2009) ; system, out.printin{f); , u . En este programa creamos un objeto de tipo FechaDetal ada, asignamos valor a sus tributes y i imprimimes. Lamentablemerte, os constructores no se heredan; por lo tanto, por el momento la cla- se FechaDetallada solo tiene el constructor por defecto. Sin embargo, para agregar el constructor que recibe un String bastaré con las siguientes lineas de codigo. public FechaDetallada(String £) { super (f): ? Java a fondo - Ing. Pablo A. Sznajdleder 2.3 Herencia y polimorfiemo Enel siguiente diagrama, vemos representado el ejemplo anterior. Javatang libro.capoz.fechae object eosering ¥ —1 Fecha fosering —— libro. capo? nisclases ‘estFecka petal lag petallada cosering Fig, 22 Raposentacon do ls dlasea Fecha y Hechabetallada. El diagrama representa la relacién de herencia entre las clase TechaDetallada, Fecha y Object, cada una en su propio paguete. También representa que el método toString se sobrescnbe en Fecha yen FechaDetallada ya que viene heredado de Object. Por timo, muestra que la clase TestFechaDetallada “usa” ala clase Fechafetallada, Obviamente, lactase TestFechabetal Lada también hereda de Object. Sin embargo, ‘esta relacién no ee relevante en nuestro ejemplo por lo que decidimos no relejarla en al diagrama. 2.3.1 Polimorfismo Los objetos nunca dejan de reconocerse como miembros de una determinada clase. Por ‘al motivo, independlientemente del tipo de datos de la variable que los esté conteniendo, estos ante la invocacién de cualquiera de sus métodes siempre reaccionarén como su propia clase lo dafina Serd mas simple analzarlo directamente sobre un ejemplo concreto. Enel siguiente programa, asignamos un objeto de tipo FechaDetallada auna variable de tipo Fecha y oto objeto también de tipo FechaD=tallad= en una variable de tipo Object. Luego imprimimos los dos objetos invocando al método toString. Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega 2 Programacién orientada a objetos p Los objetos nunca plerden su ident! ded, aun cuando estén slendo rete- renciados por una variable de agin tipo de datos mas basic. Por esto, cuando invocamos a cual- ‘quiera de sus métodos siempre la re solver como lo indique la clase a a (que pertenecen Alfaomega package Libro.cap02; import libro. cap02, fechas. Fecha? Amport libro. cap02-misclases.FechaDetallada; public cls t public static void main(String[] args) { TestPolimorfisas U/ & Tec (de tipo Fecha) 1e asigno un objeto Fechapetaliada Fecha fee = new FechaDetallada("25/02/2009"); // 2 obj (de tipo object) 1¢ asigno un objeto Fechapetal: Object obj = new Fechanetallada ("3/12/2008"); Z/ Tmprimo los dos objetos System. out.printIn("fec = "tfec); // invoca a toString de fec System. out.printIn|"abj = "tob}); // invoca a tostring de obj } La variable fec puede contener un objeto de tipo FechaDetallada porque esta tia clase hereda de Fecha (el tipa de datos de fec). A su ver, Zecha hereda de Object. Por lo tanto, un objeto FechaDetallada también puede asignarce en una variable de tipo ob}ect. Luego de imprimir ambos objetos a salida del programa sera la siguiente: brero de 2009 iembre de 2008 Aunque tec esdetipo Fecha y ch} ese tipe Ob;ect, ambos se imprimieron con cl formato definido en la clase Fechadetal lata porque las dos variables contienen objetos de esta clase y, como comentamos mas ariba, un objeto nunca se olvida de su clase. Asi, por polimerfismo, se invoca al método toStting definide en la clase ala cual pertenece el objeto (recordemos que System.out.printin() imprime la cade- na que retorna el método toString del objeto Para terminar de comprender la idea, pensemos en una clase con un método para m= primir un conjunto de objetos. Este método recibira un Object {] (lease “object array") para recorrerio e imprimir cada uno de sus elementos en pantal. package Libro. cap02; public class Mucetraconjunte { public static void nostrar(object[] arr) t for( int i-0; icarr.lengthr i++ | f ? System. ove-printin("arr["+it"] - "+ arr[il): ) Java a fondo - Ing. Pablo A. Sznajdleder 2.3 Herencia y polimorfiemo & Como podemos ver, dentro del método mostrar no conocemas el tipo de cada uno de los objetos que contiene ar. Solo sabemos que son de tipo Ob}ect, pero como todas: las clases heredan de Ob ject, potencialmente arr puede tener objetos de cualquier tipo. Sin embargo, esto no nos impide imprimirlos ya que cada objeto "sabra” como mostrarse al momento de invocérsele su método toString. \Veamos ahora el programa principal donde invocames al método mostrar de la clase MuestraConjunto. package Libro. cap02; import Libro.cap2. fechas. Fecha; import Libro.cap0?.misclases.FechaDetallada; public class TexttluestraConjunto t fublic static votd sain|Steing() args) Object {] arr = ( new Fecha(2, 10,1270) 1 new FechaDetal lada("23/12/1948") | new String("Esto e= una cadena") | new Integer (34) 3 // como el metodo es estatico 10 invoco a traves de Ia clase MuestraConjunto.mostrar |arr) + , } Efectivamente, ef array att contiene objetos de tipos muy diferentes: Fecha, Fechaletallada, String e Integer. Todos elles tienen el método toString pore que cus clases lo heredan de Ob7}ect_y por mas que estén contenidos en variables de tipo Object (arr il), cuando se les invoca el método toString se ejecutaré el que dfina su propia clase. Por lo tanto, la salida de este programa sera la siguiente: arr [ol = 2/10/1970 acr[l] ‘de Diciembre de 1948 arr[3] = Esto es una cadena arr[4] = 34 El polimorfiemo os (para mi entender) la caracterstica fundamental de la programacién orientada a objetos. Este tema serd profundizado a lo largo de este capitulo. Por el mo- mento, aleanza con esta breve explicacin Antes de terminar debemos mencionar que el método mostrar de la clase MuestraCon)unto es un metodo estatico. Esto lo convierte en un “metodo de la clase". Si bien este tema lo analizaremios més adelante, podemos ver que en el método main lo invacamos directamente sobre la clase haciendo: "usstraConjunts.mostear. Es el mismo caso que el de Tnteger.parseInt que utllizamos para convertir cadenas a nlimeros enteros, 2.3.2 Constructores de subclases Lo primero que hace el constructor de una clase derivada es invocar al constructor de su clase base. Si esto no se define explicitamente (programandolo) entonces se invocard al Constructor nulo de a clase base y si este no existe tendremas un error de compilacién. En la clase Fechadetal ladia, no hemos definido ningun constructor, por lo tanto, el Uinico constructor disponible sera el constructor nulo, Este constructor lo Unico que hard Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega 2 Alfaomega 2 Programacién orientada a objetos ‘era invocar al constructor nulo de la clase base (Fecha). Recordemos que habiamos sobrecargado el constructor de Fectia y justamente uno de los constructores que deja mos definido era el constructor nul (el que no recibe pardmetros) Recomiendo al lector comentar el cédigo del constructor nulo delaclase Fecha y volver acompilar la clase FechaDetal lads, Obtendré el siguiente error de compilacién: Implicit super constructor Fecha\) is undefined for default constructor. HechaDetallada.java (Line 6) Este mensaje indica que no esta definide el constructor nulo (o sin argumentos) en la clase Fecha. En el mensaje de error, verios que aparece la palabra super. El significado y el uso de ‘sta palabra reservada los estudlaremos a continuacién, 2.3.3 La referencia super ‘Sen una clase base tenemos defiido un constructor que recite una determinada com- binacién de paramotos, en las clases derivadas tendremos que defnro explctamente ‘bien, resigharmos a no tenerlo disponible porque, como comentamos mas aba, os Constrctores no se heredan Como enla clase Fecha teniames definidos tes constructores lo razonableserd deiir estos mismos constvuctores también en la clase FechaDeval ada. package libro.cap?-misclases; public class FechaDetallads extends Fecha ‘ we // detinicion det array meses... We public FechaDetallada|int dia, int mes, int anio) // invocanos al constructor del padre super (cdia,mes,anio) ; ? public FechaDetallada (String s) { // imvocamos al constructor del padre super (2) : public Fachatetallada\) { /é inwocanos al constructor dei padre super); Me // metodo tostring. Ute Java a fondo - Ing. Pablo A. Sznajdleder 2.3 Herencia y polimorfiemo Con esto, tendremos en la clase FechaDetallada los mismos constructores que te- nfamnos definidos en la clase Fecha, En cada uno de estos constructores, invocamos al constructor del padre a través de la palabra super. Esta palabra representa al constructor del padre (que en este caso es el constructor dela clase Fecha), Qué ocurird sen alguno de estos constructores no invocamos explicitamente al cons- ‘ructor del padre? Sucederd lo siguiente: 1. Poromisién se invocara al constructor nulo de laclase Fecha, pero como este existe no tendremos ningun error de compilacion 2. Como el constructor nulo de Fecha no hace nada, quedardn sin asignar los atribu- tos dia, mes y anic, 3. Cuando imprimamos una fecha con System.cut.printin se invocaré al método toString de FechaDetallada, el que accedera al aray meses mes-1]. Pero ‘como el attibuto mes no tiene valor esto generara un error en tiempo de ejecucién: un AreayIndexoutOfBoundExcept ion. Sugiero al lector probar la modificaci6n del constructor que recibe tres enteros anulando la llamada al constructor del padre de la siguiente manera: public FechaDetallada(int dia, int mes, int anio} { J/ super (di.a,mes,anio) ; } |Luego si hacemos: public static void main(string argsf]] t FechaDetallada syteten. out. pri # FechaDetallada (25, 10,2008) ; in(£) 3 } tendremos el siguiente error en tlempo de ejecucién: Exception in thread "main" java.lang.ArrayindexoutofzoundsBaception: -L at libro.cap2....Fechabetal lada.tostring|FechaDetallada. java: 42) at Java.dang. Sering.value0s (String. javaz257) at java.io.Printstrean.print (Printstrean. java:616) at Java.io.Printstrean.printIn (Printstrean.java:759) at lib. |. .festFechatetal lada.main Testfechadetallads.java:15) Como vemos, super se utliza para hacer referencia al constructor del padre, En Java no existe la *herencia maitiple”, por lo tanto, para cualquier clase siempre se tendra un Uinico padre, Ciaro que este podria tener varios constructores entonces dependiendo de los argumentos que le pasemos a super se invocaré al constructor que concuerde exactamente con esa combinacion de argumentos. La palabra super también puede ultlizarse come un objeto y en este caso funciona como una “referencia al padre” Para ejemplificar su uso extenderemos ain més la funcionalidad de nuestras clases de- sarrollando la clase Fechaiiora que extenderé.a FechaDetallada proveyendo la ccapacidad para almacenar también la hora (hora, minutos y segundos). Java a fondo - Ing. Pablo A. Sznajdleder p En Java no enst fa “herencla mil le", po o tanto, para cualquier clase Siempre se tendré un nico pace. Alfaomega Alfaomega 2 Programacién orientada a objetos package libro.cap?.misclases; public cls 4 private int hora; private int minuto; Private int seqund) public FochaHiora|string sFecha, int hora, int min, int ses) { Fechaliora extends FechaDetallade super (secha) this.hora = hora; thigsminuto = min; // inwocanos al metodo tostring de nuestro padre return super.tostring()+" ("shora+":"+minuto*™ +sequndot™ } ee 7/ otros constructores. 7/ setters y getters. UW 3 . Esta clase extionde la funcionalidad de FechaDetallada proveyendo ademas la pos bilidad de trabajar con Ia hora, Enel método toString (que sobrescritimos),utlizamos la palabra super parainvo- aralmétodo toString de FechaDetal lada. Ala cadena que obtenemos le conca: ‘tenamos otra cadena representando la hora y e50 es lo que retornamos. ‘Ahora veremos un programa donde utllzamos un objeto de tipo Fechakora y lo imprimimos, Package libro. cap2.misclases; public class TestFechatora { public static void main(string[] args) { Fechatlora th = new Fechatfora("25/2/2006", 14, 30,10) System. out.printin(th) ? } La salida de este programa serd: 25 de Febrero de 2006 (14:30210) 2.3.4 La referencia this Asicomo super hace referencia al constructor del padre, la palabra this hace refe- rencia alos otros constructores de la misma clase. Java a fondo - Ing. Pablo A. Sznajdleder

You might also like