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 SZNAJDLEDERJava a fondo
Estudio del lenguaje
y desarrollo de aplicaciones
Ing. Pablo Augusto Sznajdleder
a AlfaomegaSznajdleder, 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
[email protected]
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:
[email protected]‘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 Alfaomegavil
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
Alfaomegavi
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. SznajdlederContenido - 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)
IntrodeciinX= 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. SznajdlederContenido - 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
AlfaomegaXII 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
Alfaomegaxv
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
[email protected]
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:
‘
[email protected]
‘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. Sznajdleder1.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,
Alfaomega1 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. Sznajdleder1.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
Alfaomega10
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. Sznajdleder1.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
Alfaomega2
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. Sznajdleder1.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
Alfaomega4
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. Sznajdleder1.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.
Alfaomega2
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. Sznajdleder115 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.
Alfaomega24
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. Sznajdleder115 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
Alfaomega26
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. Sznajdleder115 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 Alfaomega28
£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. Sznajdleder115 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;
Alfaomega20
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. Sznajdleder1.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.
Alfaomega2
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. Sznajdleder1.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.
Alfaomega1 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
AlfaomegaAlfaomega
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. Sznajdleder2.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
Alfaomega2 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. Sznajdleder2.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
Alfaomega58
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. Sznajdleder2.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
Alfaomega2 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. Sznajdleder2.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
Alfaomega2
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. Sznajdleder2.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.
AlfaomegaAlfaomega
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