Está en la página 1de 553

PROGRAMACIN

DesarrollodeAplicacionesWeb
JosLuisComesaa

11

NDICE

1.Introduccin.........................................................................................................................1
2.Programasyprogramacin..................................................................................................2
2.1.Buscandounasolucin................................................................................................................2
2.2.Algoritmosyprogramas...............................................................................................................3
3.Paradigmasdelaprogramacin..........................................................................................5
4.Fasesdelaprogramacin....................................................................................................7
4.1.Resolucindelproblema.............................................................................................................7
a) Anlisis....................................................................................................................................................7
b) Diseo.....................................................................................................................................................8
4.2.Implementacin.......................................................................................................................................8
a) Codificacinoconstruccin....................................................................................................................8
b) Pruebadeejecucinyvalidacin............................................................................................................9
4.3.Explotacin................................................................................................................................10
5.Ciclodevidadelsoftware..................................................................................................11
6.Lenguajesdeprogramacin...............................................................................................13
6.1.Lenguajemquina......................................................................................................................13
6.2.LenguajeEnsamblador...............................................................................................................14
6.3.Lenguajescompilados................................................................................................................16
6.4.Lenguajesinterpretados............................................................................................................17
7.EllenguajedeprogramacinJava......................................................................................19
7.1.QuycmoesJava?................................................................................................................19
7.2.Brevehistoria.............................................................................................................................21
7.3.LaPOOyJava.............................................................................................................................22
7.4.Independenciadelaplataformaytrabajoenred.....................................................................23
7.5.Seguridadysimplicidad.............................................................................................................24
7.6.JavaylosBytecodes...................................................................................................................25
8.ProgramasenJava.............................................................................................................26
8.1.Estructuradeunprograma........................................................................................................26
8.2.ElentornobsicodedesarrolloJava.........................................................................................27
8.3.LaAPIdeJava.............................................................................................................................28
8.4.Afinandolaconfiguracin..........................................................................................................29
8.5.Codificacin,compilacinyejecucindeaplicaciones..............................................................30
8.6.TiposdeaplicacionesenJava....................................................................................................32
9.EntornosIntegradosdeDesarrollo(IDE)...........................................................................34
9.1.Quson?..................................................................................................................................34
9.2.IDE'sactuales.............................................................................................................................35
9.3.ElentornoNetBeans..................................................................................................................37
9.4.Instalacinyconfiguracin........................................................................................................38
9.5.Aspectodelentornoygestindeproyectos.............................................................................39

DesarrollodeAplicacionesWeb

Tema3

Introduccinalaprogramacin.
Caso prctico
La evolucin de Internet y de las nuevas tecnologas, as como las diferentes posibilidades para
establecer nuevas lneas de negocio para la empresa BK Programacin, han hecho que Ada haya
decidido abrir una va de innovacin. Para ello, su empresa deber realizar el desarrollo de sus
aplicaciones a travs de lenguajes y tcnicas de programacin modernos, aunque con una eficiencia
y flexibilidad contrastadas.
Mara y Juan, ayudados y orientados por Ada, recordarn y ampliarn sus conocimientos
relacionados con la programacin, permitindoles crear software que pueda adaptarse a nuevas
situaciones, como el funcionamiento en diferentes plataformas (PDA, Mviles, Web, etc.) o la
interaccin con bases de datos. Todo ello sin perder de vista de donde parten y hacia dnde quieren
redirigir sus esfuerzos.
Estas innovaciones, junto a la predisposicin para adaptarse y evolucionar que BK Programacin est
potenciando en todas sus reas, repercutirn en una mayor capacidad de respuesta ante las
necesidades de sus posibles clientes. En definitiva, conseguir mayor competitividad.

1.- Introduccin.
Cuntasaccionesdelasquehasrealizadohoy,creesqueestnrelacionadasconlaprogramacin?
Hagamos un repaso de los primeros instantes del da: te ha despertado la alarma de tu telfono
mvil o radiodespertador, has preparado el desayuno utilizando el microondas, mientras
desayunabas has visto u odo las ltimas noticias a travs de tu receptor de televisin digital
terrestre,tehasvestidoypuedequehayasutilizadoelascensorparabajaralportalysaliralacalle,
etc. Quiz no es necesario que continuemos ms para darnos cuenta de que casi todo lo que nos
rodea,enalgunamedida,estrelacionadoconlaprogramacin,losprogramasyeltratamientode
algntipodeinformacin.
Elvolumendedatosqueactualmentemanejamosysusinnumerablesposibilidadesdetratamiento
constituyenunvastoterritorioenelquelosprogramadorestienenmuchoquedecir.
En esta primera unidad realizaremos un recorrido por los conceptos fundamentales de la
programacin de aplicaciones. Iniciaremos nuestro camino conociendo con qu vamos a trabajar,
qutcnicaspodemosemplearyquesloquepretendemosconseguir.Continuandoconelanlisis
de las diferentes formas de programacin existentes, identificaremos qu fases conforman el
desarrollodeunprograma,avanzaremosdetallandolascaractersticasrelevantesdecadaunodelos
lenguajesdeprogramacindisponibles,paraposteriormente,realizarunavisingeneraldellenguaje
de programacin Java. Finalmente, tendremos la oportunidad de conocer con qu herramientas
podramosdesarrollarnuestrosprogramas,escogiendoentreunadeellasparaponernosmanosala
obrautilizandoellenguajeJava.

Introduccinalaprogramacin

DAW

2.- Programas y programacin.


Caso prctico
Ada conoce bien lo que significa tener que llevar a cabo el proceso completo de creacin de software
y sabe que, en ocasiones, no se le da la importancia que debera a las fases iniciales de este
proceso. Quiere que Juan, que desarrolla programas casi sin darse cuenta, recuerde las ventajas que
aporta un buen anlisis inicial de los problemas a solucionar y que no aborde el desarrollo de sus
programas sentndose directamente ante el ordenador a teclear cdigo.
Juan le comenta a Ada y a Mara: La verdad es que cuando conoces bien un lenguaje de
programacin crees que puedes hacer cualquier programa directamente sobre el ordenador, pero al
final te das cuenta de que deberas haberte parado a planificar tu trabajo. Muchas veces tienes que
volver atrs, recodificar y en ocasiones, rehacer gran parte del programa porque lo que tienes no est
bien planteado.
Mara, que permanece atenta a lo que dicen Ada y Juan, quiere aprender bien desde el principio y
tendr la ventaja de tener a su lado a dos expertos.

2.1.Buscandounasolucin.
Generalmente,laprimeraraznquemueveaunapersonahaciaelaprendizajedelaprogramacin
esutilizarelordenadorcomoherramientapararesolverproblemasconcretos.Comoenlavidareal,
la bsqueda y obtencin de una solucin a un problema determinado, utilizando medios
informticos,sellevaacabosiguiendounospasosfundamentales.Enlasiguientetablapodemosver
estasanalogas.
Resolucindeproblemas
EnProgramacin...
Anlisisdelproblema:requierequeelproblemaseadefinidoy
Observacindela
comprendidoclaramenteparaquepuedaseranalizadocontodo
situacinoproblema.
detalle.
Pensamosenunaovarias Diseoodesarrollodealgoritmos:procedimientopasoapasopara
posiblessoluciones.
solucionarelproblemadado.
Resolucindelalgoritmoelegidoenlacomputadora:consisteen
Aplicamoslasolucinque
convertirelalgoritmoenprograma,ejecutarloycomprobarque
estimamosmsadecuada.
solucionaverdaderamenteelproblema.
Enlavidareal...

Quvirtudesdeberatenernuestrasolucin?
9 Correccinyeficacia:siresuelveelproblemaadecuadamente.
9 Eficiencia:silohaceenuntiempomnimoyconunusoptimodelosrecursosdelsistema.
Paraconseguirlo,cuandoafrontemoslaconstruccindelasolucintendremosquetenerencuenta
lossiguientesconceptos:
1. Abstraccin:setrataderealizarunanlisisdelproblemaparadescomponerloenproblemas
mspequeosydemenorcomplejidad,describiendocadaunodeellosdemaneraprecisa.
2. Divideyvencers,estasueleserconsideradaunafilosofageneralpararesolverproblemasy
deaququesunombrenosloformepartedelvocabularioinformtico,sinoquetambinse
utilizaenmuchosotrosmbitos.
3. Encapsulacin: consiste en ocultar la informacin para poder implementarla de diferentes
manerassinqueestoinfluyaenelrestodeelementos.
4. Modularidad: estructuraremos cada parte en mdulos independientes, cada uno de ellos
tendrsufuncincorrespondiente.

DesarrollodeAplicacionesWeb

Tema3

Citas para pensar


Roger Pressman: El comienzo de la sabidura para un ingeniero de software es
reconocerladiferenciaentrehacerqueunprogramafuncioneyconseguirquelohaga
correctamente.

2.2.Algoritmosyprogramas.
Despusdeanalizarendetalleelproblemaasolucionar,hemosdedisearydesarrollarelalgoritmo
adecuado.Pero,Quesunalgoritmo?

Algoritmo: secuencia ordenada de pasos, descrita sin ambigedades, que conducen a la


solucin de un problema dado.
Losalgoritmossonindependientesdeloslenguajesdeprogramacinydelascomputadorasdonde
se ejecutan. Un mismo algoritmo puede ser expresado en diferentes lenguajes de programacin y
podra ser ejecutado en diferentes dispositivos. Piensa en una receta de cocina, sta puede ser
expresada en castellano, ingls o francs, podra ser cocinada en fogn o vitrocermica, por un
cocineroo ms,etc.Pero independientementedetodasestascircunstancias,elplatose preparar
siguiendolosmismospasos.
Ladiferenciafundamentalentrealgoritmoyprogramaesque,enelsegundo,lospasosquepermiten
resolver el problema, deben escribirse en un determinado lenguaje de programacin para que
puedanserejecutadosenelordenadoryasobtenerlasolucin.
Los lenguajes de programacin son slo un medio para expresar el algoritmo y el ordenador un
procesador para ejecutarlo. El diseo de los algoritmos ser una tarea que necesitar de la
creatividad y conocimientos de las tcnicas de programacin. Estilos distintos, de distintos
programadoresalahoradeobtenerlasolucindelproblema,darnlugaraalgoritmosdiferentes,
igualmentevlidos.
En esencia, todo problema se puede describir por medio de un algoritmo y las caractersticas
fundamentalesquestosdebencumplirson:
9 Debeserprecisoeindicarelordenderealizacinpasoapaso.
9 Debe estar definido, si se ejecuta dos o ms veces, debe obtener el mismo resultado
cadavez.
9 Debeserfinito,debetenerunnmerofinitodepasos.
Pero cuando los problemas son complejos, es necesario descomponer stos en subproblemas ms
simples y, a su vez, en otros ms pequeos. Estas estrategias reciben el nombre de diseo
descendente(Metodologadediseodeprogramas,consistente enla descomposicindel problema
enproblemasmssencillosderesolver.)odiseomodular(topdowndesign)(Metodologadediseo
de programas, que consiste en dividir la solucin a un problema en mdulos ms pequeos o
subprogramas. Las soluciones de los mdulos se unirn para obtener la solucin general del
problema).Estesistemasebasaenellemadivideyvencers.
Para representar grficamente los algoritmos que vamos a disear, tenemos a nuestra disposicin
diferentes herramientas que ayudarn a describir su comportamiento de una forma precisa y
genrica,paraluegopodercodificarlosconellenguajequenosinterese.Entreotrastenemos:

Introduccinalaprogramacin

DAW

9 Diagramas de flujo: Esta tcnica utiliza smbolos grficos para la representacin del
algoritmo.Sueleutilizarseenlasfasesdeanlisis.
9 Pseudocdigo: Esta tcnica se basa en el uso de palabras clave en lenguaje natural,
constantes(Estructuradedatosqueseutilizaenloslenguajesdeprogramacinqueno
puede cambiar su contenido en el transcurso del programa.), variables (Estructura de
datosque,comosunombreindica,puedecambiardecontenidoalolargodelaejecucin
de un programa.), otros objetos, instrucciones y estructuras de programacin que
expresan de forma escrita la solucin del problema. Es la tcnica ms utilizada
actualmente.
9 Tablas de decisin: En una tabla son representadas las posibles condiciones del
problemaconsusrespectivasacciones.Sueleserunatcnicadeapoyoalpseudocdigo
cuandoexistensituacionescondicionalescomplejas.

Autoevaluacin
Rellena los huecos con los conceptos adecuados:
A los pasos que permiten resolver el problema, escritos en un lenguaje de programacin, para
que puedan ser ejecutados en el ordenador y as obtener la solucin, se les denomina:
Programa

Si estos pasos estuvieran descritos en un lenguaje genrico independiente de la mquina y del lenguaje de programacin, estaramos
hablando de algoritmos.

DesarrollodeApllicacionesW
Web

Tema3

3.-- Paraadigm
mas dee la prrogram
macin.
Caso
o prctico
Ada comenta co
on Juan y Mara
M
los disstintos enfoq
ques para el desarrollo de program
mas que han
n
existiido a lo largo
o de la historria de la programacin, destacando
d
que todos va
an a tener que renovar
su fo
orma de pen
nsar, si quierren comenza
ar a utilizar un lenguaje moderno q
que les perm
mita construirr
progrramas adapta
ados a las nuevas necessidades de sus clientes.

Cuntas formass existen dee hacer las cosas? Supo


ongo que estars
e
penssando: varias o incluso,,
has.Perocuaandoseestableceunpattrnparalaccreacindeaplicacionessnosestamo
osacercando
o
much
alsignificadodelapalabrapaaradigma.

Paraadigma de programaccin: es un modelo b


sico para el
e diseo y la implemeentacin dee
proggramas. Estee modelo deeterminar como ser el proceso de
d diseo y la estructu
ura final dell
proggrama.
Elparradigmarepresentauneenfoquepartticularofilossofaparalaconstruccin
ndesoftwarre.Cadauno
o
tendrr sus ventajas e inconvvenientes, seer ms o menos
m
apropiiado, pero n
no es correctto decir quee
existaaunomejorquelosdem
ms.

PARADIGMASDEPROGRAMACIN

ProgramaccinDeclarativaa
Seconsid
deraopuestaallaprogramacin
imperativva,sebasaene
eldesarrollode
programaasrealizandounaespecificaci
no
"declaraccin"deunconjuntodecondicciones,
proposiciones,afirmacio
ones,restriccionesy
transform
macionesquedescribenelpro
oblemay
detallanssusolucin.Lassentenciasqu
uese
utilizanlo
oquehacenesdescribirelprroblema
quesequ
uieresolucionarperonolas
instruccio
onesnecesariassparallevarloaacabo.
Dentrodeeesteparadigm
mapuedendesttacarse
laprogramacinfuncion
nalylaprogram
macin
lgica.
EllenguajjeSQLestbassadoeneste
paradigm
ma.
Funcional
Consideraaalprogramaccomounafuncin
matemttica, dondeeld
dominiorepreseentara
elconjuntodetodaslasentradasposib
bles
(inputs)yyelrangoseraelconjuntodetodas
lassalidasposibles(outp
puts).Laformaaenque
funcionapueseserente
endidacomoun
nacaja
negra,statieneunaseriedeentradass,un
procesam
mientointernoyyunasalida.
Noexisteeelconceptode
evariable,adem
msel
funcionam
mientodecadaafuncines
independ
dientedelresto
o.
EllenguajjeLISPesunejemplodeeste
paradigm
madeprogramaacin.
Lgica
Enesteparadigma,seespecificaquhacery
nocmohacerlo.Seutilizaeninteligen
ncia
artificial.
EllenguajjePrologesunejemploclaroquese
ajustaaeesteparadigma.

Program
macinImperatiiva
Consistteenunaseriedecomandosq
queunacompu
utadora
ejecutaar.Estoscomaandosdetalland
deformaclarayespecficael
cmoh
hacerlascosasyyllevarnalpro
ogramaatrav
sdedistintos
estadoss.Utilizavariab
bles,tiposdedaatos,expresione
esy
estructurasdecontroldeflujodelprrograma.
Program
macinconvencional
Tambinllamada,noeestructurada,n
noexistanenlo
oslenguajes
deproggramacininicialesherramien
ntasquepermittieran
estructurarelcdigop
parasumodificcacinoreutilizzacin.Los
program
maseranlneassylneasdecd
digoquehacan
ndifcilsu
lecturaomodificacin
n.Todoestababasadoeninstrruccionesde
salto(G
Goto)quemodiificabanelflujo
odelprograma..Unprograma
eraunnicoarchivo,eerandifcilesdeemantenerydifcilesde
represeentar.
Program
macinestructurada
Nacip
parasolventarlosproblemasyylimitacionesd
dela
program
macinconvencional.Permiteeutilizarestructturasque
facilitan
nlamodificaci
n,reutilizacin
nylecturadelccdigo.
Permiteeelusodelcon
nceptodefuncin(programaccinmodular),
queagrrupancdigoparalarealizaci
ndeunadeterminada
tarea.EEstasfuncionesspuedenserutilizadasencuallquierparte
delprograma,elnmeerodevecesqu
uesenecesiten
n
Permiteeunarepresentacinmsclarradelfuncionamientodelos
program
masmedianted
diagramas,enllosqueserepre
esentan
estructurascondicionaales,bucles,etcc.Todoseveco
omomdulos
quepuedencolaborarrentreellos.Esstetipodeproggramacin
tenaunaseriedelimiitacionesquep
provocaronlaaparicinde
otrosparadigmas.
Orientad
daaobjetos
Elmundosevedesdeelpuntodevisstadelosobjetosquehayen
l.Loso
objetostienencaractersticas(propiedades)yconellos
pueden
nrealizarseacciones(mtodos).Enestafilosofasebusca
encontrarlosobjetos,,envezdelasffuncionescomo
oen
program
macinestructurada.
Estbaasadaenvariastcnicas,incluyyendoherenciaa,abstraccin,
polimorfismoyencapsulamiento.
LenguaajescomoJava,C,C++,PHP,...sonclarosejem
mplosquese
basaneenesteparadiggma.
Visual,o
orientadaaaspeectos,orientadaaeventos,...
Sonunconjuntodepaaradigmasquepuedenserrele
evantes,
aunqueegranpartedeellosincluyenlosconceptosd
desarrollados
enelreestodeparadigmaspresentad
dosenestedocu
umento.

Introduccinalaprogramacin

DAW

Como habrs podido apreciar, existen mltiples paradigmas, incluso puede haber lenguajes de
programacinquenoseclasifiquennicamentedentrodeunodeellos.UnlenguajecomoSmalltalk
esunlenguajebasadoenelparadigmaorientadoaobjetos.EllenguajedeprogramacinScheme,en
cambio,soportasloprogramacinfuncional.Python,soportamltiplesparadigmas.

Parasaberms
Te proponemos el siguiente enlace en el que encontrars informacin adicional sobre los
diferentesparadigmasdeprogramacin.
http://javierleal.wordpress.com/2009/08/27/paradigmasdeprogramacion/
Culeselobjetivoquesebuscaconlaaplicacindelosdiferentesenfoques?Fundamentalmente,
reducir la dificultad para el mantenimiento de las aplicaciones, mejorar el rendimiento del
programadory,engeneral,mejorarlaproductividadycalidaddelosprogramas.

Autoevaluacin
En qu paradigma de programacin podramos enmarcar el lenguaje de programacin Java?
Programacin Estructurada.
Programacin Declarativa.
Programacin Orientada a Objetos.
S, Java emplea la filosofa de ver el mundo como objetos que tienen propiedades y mtodos que les permiten interactuar entre ellos.

DesarrollodeAplicacionesWeb

Tema3

4.- Fases de la programacin.


Caso prctico
Juan pregunta a Ada cmo van a realizar todo el proceso de produccin, y duda si el utilizar un
nuevo lenguaje supondr cambiar drsticamente los mtodos aprendidos en el pasado.
Ada tranquiliza a Juan y a Mara: Est claro que las fases principales que hemos estado llevando a
cabo a lo largo de nuestros anteriores proyectos se seguirn aplicando, aunque con algunas
diferencias. Lo ms importante Juan, es que sigamos adecuadamente el mtodo de trabajo para
conseguir buenos resultados.
Me costar mucho trabajo adaptarme? pregunta Mara.
Ada le contesta sentndose a su lado: No te preocupes Mara, se trata de adaptar conocimientos
que ya tienes y aprender algunos otros.

Sea cual sea el estilo que escojamos a la hora de automatizar una determinada tarea, debemos
realizar el proceso aplicando un mtodo a nuestro trabajo. Es decir, sabemos que vamos a dar
solucinaunproblema,aplicandounafilosofadedesarrolloyloharemosdandounaseriedepasos
quedebenestarbiendefinidos.
Elprocesodecreacindesoftwarepuededividirseendiferentesfases:
9 Fasederesolucindelproblema.
9 Fasedeimplementacin.
9 Fasedeexplotacinymantenimiento.
Acontinuacin,analizaremoscadaunadeellas.

4.1.Resolucindelproblema.
Paraelcomienzodeestafase,esnecesarioqueelproblemaseadefinidoycomprendidoclaramente
paraquepuedaseranalizadocontododetalle.Asuvez,lafasederesolucindelproblemapuede
dividirseendosetapas:

a) Anlisis
Por lo general, el anlisis indicar la especificacin de requisitos que se deben cubrir. Los
contactosentreelanalista/programadoryelcliente/usuariosernnumerosos,deestaforma
podrn ser conocidas todas las necesidades que precisa la aplicacin. Se especificarn los
procesosyestructurasdedatosquesevanaemplear.Lacreacindeprototipossermuy
tilparasaberconmayorexactitudlospuntosatratar.
El anlisis inicial ofrecer una idea general de lo que se solicita, realizando posteriormente
sucesivosrefinamientosqueservirnparadarrespuestaalassiguientescuestiones:
9 Culeslainformacinqueofrecerlaresolucindelproblema?
9 Qudatossonnecesariospararesolverelproblema?
Larespuestaalaprimerapreguntaseidentificaconlosresultadosdeseadosolassalidasdel
problema. La respuesta a la segunda pregunta indicar qu datos se proporcionan o las
entradasdelproblema.
En esta fase debemos aprender a analizar la documentacin de la empresa , investigar,
observartodoloquerodeaelproblemayrecopilarcualquierinformacintil.

Introduccinalaprogramacin

DAW

Ejercicio resuelto
Vamos a ilustrar esta fase realizando el anlisis del siguiente problema:
Leer el radio de un crculo y calcular e imprimir su superficie y circunferencia.
Est claro que las entradas de datos en este problema se reducen al radio del crculo, pero
piensa qu salidas de datos ofrecer la solucin?
Las salidas sern...
Variable de salida SUPERFICIE: ser la superficie del crculo. (Te acuerdas? El nmero
Pi por el radio al cuadrado).
Variable de salida CIRCUNFERENCIA: ser la longitud de la circunferencia del crculo.
(Y de sta? Dos por el nmero Pi y por el radio)
Y la entrada...
Variable RADIO: ser el radio del crculo.
Estas variables RADIO, SUPERFICIE y CIRCUNFERENCIA podrn ser de tipo real
(nmeros con parte entera y parte decimal, por ejemplo: 3,57)

b) Diseo
Enestaetapaseconviertelaespecificacinrealizadaenlafasedeanlisisenundiseoms
detallado, indicando el comportamiento o la secuencia lgica de instrucciones capaz de
resolver el problema planteado. Estos pasos sucesivos, que indican las instrucciones a
ejecutarporlamquina,constituyenloqueconocemoscomoalgoritmo.
Consisteenplantearlaaplicacincomounanicaoperacinglobal,eirdescomponindola
en operaciones ms sencillas, detalladas y especficas. En cada nivel de refinamiento, las
operacionesidentificadasseasignanamdulosseparados.
Hayque teneren cuentaqueantesdepasaralaimplementacindelalgoritmo,hemosde
asegurarnos que tenemos una solucin adecuada. Para ello, todo diseo requerir de la
realizacin de la prueba o traza del programa. Este proceso consistir en un seguimiento
paso a paso de las instrucciones del algoritmo utilizando datos concretos. Si la solucin
aportada tiene errores, tendremos que volver a la fase de anlisis para realizar las
modificaciones necesarias o tomar un nuevo camino para la solucin. Slo cuando el
algoritmocumplalosrequisitosyobjetivosespecificadosenlafasedeanlisissepasarala
fasedeimplementacin.

4.2.- Implementacin.
Silafasederesolucindelproblemarequiereunespecialcuidadoenlarealizacindelanlisisyel
posterior diseo de la solucin, la fase de implementacin cobra tambin una especial relevancia.
Llevar a la realidad nuestro algoritmo implicar cubrir algunas etapas ms que se detallan a
continuacin.

a) Codificacin o construccin
Esta etapa consiste en transformar o traducir los resultados obtenidos a un determinado
lenguajedeprogramacin.Paracomprobarlacalidadyestabilidaddelaaplicacinsehande
realizar una serie de pruebas que comprueben las funciones de cada mdulo (pruebas

DesarrollodeAplicacionesWeb

Tema3

unitarias), que los mdulos funcionan bien entre ellos (pruebas de interconexin) y que
todosfuncionanenconjuntocorrectamente(pruebasdeintegracin).
Cuandorealizamoslatraduccindelalgoritmoallenguajedeprogramacindebemostener
en cuenta las reglas gramaticales y la sintaxis de dicho lenguaje. Obtendremos entonces el
cdigofuente,loquenormalmenteconocemosporprograma.
Pero para que nuestro programa comience a funcionar, antes debe ser traducido a un
lenguajequelamquinaentienda.Esteprocesodetraduccinpuedehacersededosformas,
compilandoointerpretandoelcdigodelprograma.

Compilacin: Es el proceso por el cual se traducen las instrucciones escritas en un


determinado lenguaje de programacin a lenguaje que la mquina es capaz de
interpretar.
Compilador: programa informtico que realiza la traduccin. Recibe el cdigo
fuente, realiza un anlisis lexicogrfico, semntico y sintctico, genera un cdigo
intermedio no optimizado, optimiza dicho cdigo y finalmente, genera el cdigo objeto
para una plataforma especfica.
Intrprete: programa informtico capaz de analizar y ejecutar otros programas,
escritos en un lenguaje de alto nivel. Los intrpretes se diferencian de los
compiladores en que mientras estos traducen un programa desde su descripcin en un
lenguaje de programacin al cdigo de mquina del sistema, los intrpretes slo
realizan la traduccin a medida que sea necesaria, tpicamente, instruccin por
instruccin, y normalmente no guardan el resultado de dicha traduccin.
Una vez traducido, sea a travs de un proceso de compilacin o de interpretacin, el
programapodrserejecutado.

b) Prueba de ejecucin y validacin


Paraestaetapaesnecesarioimplantarlaaplicacinenelsistemadondevaafuncionar,debe
ponerse en marcha y comprobar si su funcionamiento es correcto. Utilizando diferentes
datos de prueba se ver si el programa responde a los requerimientos especificados, si se
detectannuevoserrores,sistossonbiengestionadosysilainterfazesamigable.Setratade
ponerapruebanuestroprogramaparaversurespuestaensituacionesdifciles.
Mientras se detecten errores y stos no se subsanen no podremos avanzar a la siguiente
fase.Unavezcorregidoelprogramaytesteadosedocumentarmediante:
9 Documentacin interna: Encabezados, descripciones, declaraciones del problema y
comentariosqueseincluyendentrodelcdigofuente.
9 Documentacinexterna:Sonlosmanualesquesecreanparaunamejorejecuciny
utilizacindelprograma.

Autoevaluacin
Rellena los huecos con los conceptos adecuados:

Introduccinalaprogramacin

En la fase de codificacin, hemos de tener en cuenta la

DAW
sintaxis

el cdigo fuente o programa. Posteriormente, ste deber ser


que pueda ser ejecutado posteriormente.

del lenguaje para obtener


compilado

interpretado

para

La sintaxis y reglas gramaticales del lenguaje de programacin que estemos utilizando deben ser respetadas para obtener un cdigo fuente
correcto. Este cdigo fuente debe ser compilado o interpretado, utilizando un programa compilador o intrprete, para transformarlo a un
formato que sea ejecutable por la mquina.

4.3.Explotacin.
Cuando el programa ya est instalado en el sistema y est siendo de utilidad para los usuarios,
decimosqueseencuentraenfasedeexplotacin.
Peridicamentesernecesariorealizarevaluacionesy,siesnecesario,llevaracabomodificaciones
para que el programa se adapte o actualice a nuevas necesidades, pudiendo tambin corregirse
errores no detectados anteriormente. Este proceso recibe el nombre de mantenimiento del
software.

Mantenimiento del software: es el proceso de mejora y optimizacin del software despus


de su entrega al usuario final. Involucra cambios al software en orden de corregir defectos y
dependencias encontradas durante su uso, as como la adicin de nuevas funcionalidades
para mejorar la usabilidad y aplicabilidad del software.
Ser imprescindible aadir una documentacin adecuada que facilite al programador la
comprensin,usoymodificacindedichosprogramas.

10

DesarrollodeAplicacionesWeb

Tema3

5.- Ciclo de vida del software.


Caso prctico
Mara le pregunta a Juan: Juan, qu ocurre cuando terminas un programa? Se entrega al cliente
y ya est? La verdad es que los programas que he hecho han sido para uso propio y no s cmo
termina el proceso con los clientes.
Contesta Juan: Pues vers, cuando terminas un programa, o crees que lo has terminado, hay que
llevar a cabo toda clase de pruebas para ver dnde puede fallar. Despus mejoras los posibles fallos
y posteriormente se entrega al cliente, ah es donde ves si tu software ha sido bien construido. El
cliente lo utilizar y durante un tiempo puede ser que haya que arreglar alguna cosilla. Y cuando ya
est todo correcto, en ocasiones, se establece un contrato de mantenimiento con el cliente. Como
ves, desarrollar software no consiste slo en programar y ya est.

Sean cuales sean las fases en las que realicemos el proceso de desarrollo de software, y casi
independientementedel,siempresedebeaplicarunmodelodeciclodevida.

Ciclo de vida del software: es una sucesin de estados o fases por las cuales pasa un
software a lo largo de su "vida".
Elprocesodedesarrollopuedeinvolucrarsiemprelassiguientesetapasmnimas:
9 EspecificacinyAnlisisderequisitos.
9 Diseo.
9 Codificacin.
9 Pruebas.
9 InstalacinypasoaProduccin.
9 Mantenimiento.
Existenvariostiposdeciclosdevidadelsoftware,acontinuacintemostramosunresumendelos
msimportantes.
Definicinde
Requerimientos

Modeloencascada

Estambinconocidopormodeloclsico,
modelo tradicional o modelo lineal
secuencial.Paracomenzarunafasehade
finalizarse la anterior. Es rgido y en la
prctica presenta algunos problemas de
aplicacin. Es el ms utilizado por su
escasacomplejidad

AnlisisyDiseo
delsoftware

Definicinde
requerimientos

Implementaciny
Pruebade
unidades

Operaciny
mantenimiento

Modeloporprototipos

Este ciclo de vida se basa en la creacin


de prototipos que irn mejorando el
conocimientodelproblema,tantoparael
usuariocomoparalosdesarrolladores.
La fase de especificacin de
requerimientos est compuesta por las
subfasesquesemencionanaladerecha:

Pequeoanlisisy
especificacin
Diseoyrealizacin
Evaluacin
Modificacin
Finalizacindelos
requerimientos

11

DAW

1.
2.
3.
4.

Desarrollo

Versin

Versiones

Validacin

Especificacin

Los
modelos
iterativo
incremental y espiral son del
tipoevolutivo

Descripcindelsistema

Introduccinalaprogramacin

Se emplea para facilitar la creacin de


aplicaciones flexibles y escalables, que
permitan incorporar modificaciones muy
rpidamente una vez que se finalice su
desarrollo
Este modelo permite adaptarse a
ModeloEvolutivo
requisitosquevareneneltiempo.Esun
modelo iterativo, permiten desarrollar
versiones cada vez ms completas y
complejas, hasta llegar al objeto final
deseado; incluso evolucionar ms all,
durantelafasedeexplotacin
El funcionamiento del modelo iterativo
incremental permite la entrega de
versiones parciales a medida que se va
construyendoelproductofinal
Por ejemplo, un procesador de texto
podra incluir inicialmente funciones
bsicas. En un incremento posterior
Modeloincremental
podra incorporar funciones para
previsualizacin y paginacin. En los
siguientes incrementos podra disponer
de funciones de correccin ortogrfica,
etc. Tras sucesivos incrementos
lograramos obtener el procesador de
textofinal
Este modelo emplea lo mejor de los
modelos convencional y por prototipos.
Estdivididoencuatrofases.Elpasopor
Modeloenespiral
cadaunadeestasfasesserepetirtantas
veces como sea necesario hasta que se
cumplan todos los requerimientos del
usuario

Versin

Planificacin
Anlisisderiesgo
Desarrollo
Evaluacindelcliente

Autoevaluacin
Entre los distintos tipos de ciclo de vida del software, los modelos incremental y en cascada
son modelos del tipo evolutivo.
Verdadero.

Falso.

El modelo incremental s es del tipo evolutivo, as como el modelo en espiral, ya que ambos permiten adaptarse a requisitos variables en el
tiempo. El modelo en cascada es mucho ms restrictivo y necesita de unos requerimientos prefijados y no variables.

12

DesarrollodeAplicacionesWeb

Tema3

6.- Lenguajes de programacin.


Caso prctico
Ada y Juan estn recordando lo complejos que eran algunos lenguajes de programacin, Ada
comenta: Cuando yo empec en esto, haba relativamente pocos lenguajes de programacin y no
permitan hacer programas como los que ahora desarrollamos.
Juan indica que l conoce las caractersticas generales de algunos lenguajes, pero que le gustara
saber algo ms sobre los que hubo, hay y habr.
Mara que asiente con la cabeza, piensa que aprender ms sobre los lenguajes disponibles en la
actualidad puede ayudar a la hora de elegir entre unos u otros.

Como hemos visto, en todo el proceso de resolucin de un problema mediante la creacin de


software, despus del anlisis del problema y del diseo del algoritmo que pueda resolverlo, es
necesariotraducirsteaunlenguajequeexpreseclaramentecadaunodelospasosaseguirparasu
correctaejecucin.Estelenguajerecibeelnombredelenguajedeprogramacin.

Lenguaje de programacin: Conjunto de reglas sintcticas y semnticas, smbolos y


palabras especiales establecidas para la construccin de programas. Es un lenguaje
artificial, una construccin mental del ser humano para expresar programas.
Gramtica del lenguaje: Reglas aplicables al conjunto de smbolos y palabras especiales del
lenguaje de programacin para la construccin de sentencias correctas.
Lxico: Es el conjunto finito de smbolos y palabras especiales, es el vocabulario del
lenguaje.
Sintaxis: Son las posibles combinaciones de los smbolos y palabras especiales. Est
relacionada con la forma de los programas.
Semntica: Es el significado de cada construccin del lenguaje, la accin que se llevar a
cabo.
Hay que tener en cuenta que pueden existir sentencias sintcticamente correctas, pero
semnticamente incorrectas. Por ejemplo, Un avestruz dio un zarpazo a su cuidador est bien
construidasintcticamente,peroesevidentequesemnticamenteno.
Una caracterstica relevante de los lenguajes de programacin es, precisamente, que ms de un
programadorpuedausarunconjuntocomndeinstruccionesqueseancomprendidasentreellos.A
travsdeesteconjuntosepuedelograrlaconstruccindeunprogramadeformacolaborativa.
Loslenguajesdeprogramacinpuedenserclasificadosenfuncindelocercaqueestndellenguaje
humanoodellenguajedeloscomputadores.Ellenguajedeloscomputadoressoncdigosbinarios,
esdecir,secuenciasdeunosyceros.Detallaremosseguidamentelascaractersticasprincipalesdelos
lenguajesdeprogramacin.

6.1.Lenguajemquina.
Esteesellenguajeutilizadodirectamenteporelprocesador,constadeunconjuntodeinstrucciones
codificadas en binario. Es el sistema de cdigos directamente interpretable por un circuito
microprogramable (Dispositivo o conjunto de dispositivos de propsito general, que, segn sea
necesario,seprogramanpararesolverdistintosproblemas).

13

Introduccinalaprogramacin

DAW

Este fue el primer lenguaje utilizado para la programacin de computadores. De hecho, cada
mquinatenasupropioconjuntodeinstruccionescodificadasencerosyunos.Cuandounalgoritmo
estescritoenestetipodelenguaje,decimosqueestencdigomquina.
Programarenestetipodelenguajepresentabalossiguientesinconvenientes:
9 Cadaprogramaeravlidosloparauntipodeprocesadoruordenador.
9 La lectura o interpretacin de los programas era extremadamente difcil y, por tanto, insertar
modificacionesresultabamuycostoso.
9 Los programadores de la poca deban memorizar largas combinaciones de ceros y unos, que
equivalanalasinstruccionesdisponiblesparalosdiferentestiposdeprocesadores.
9 Losprogramadoresseencargabande introducirloscdigosbinariosenelcomputador,loque
provocabalargostiemposdepreparacinyposibleserrores.
Acontinuacin,semuestranalgunoscdigosbinariosequivalentesalasoperacionesdesuma,resta
ymovimientodedatosenlenguajemquina.

Algunas operaciones en lenguaje mquina.


Operacin Lenguaje mquina Decimal
SUMAR
00101101
45
RESTAR
00010011
19
MOVER
00111010
58
Dadalacomplejidadydificultadesqueofrecaestelenguaje,fuesustituidoporotrosmssencillosy
fciles utilizar. No obstante, hay que tener en cuenta que todos los programas para poder ser
ejecutados, han de traducirse siempre al lenguaje mquina que es el nico que entiende la
computadora.

Parasaberms
Como recordatorio, te proponemos el siguiente enlace sobre cmo funciona el sistema
binario.
http://www.juntadeandalucia.es/educacion/adistancia/cursos/file.php/419/PROG01/PROG01_Web/
PROG01_Descripcion_Video_Elsistemabinario.html

Autoevaluacin
Rellena los huecos con los conceptos adecuados:
En el lenguaje mquina de algunos procesadores, la combinacin 00101101 equivale a la
operacin de

suma

La Suma, resta y la operacin de movimiento de datos eran muy utilizadas en los programas escritos en lenguaje mquina. An no se haba
extendido el uso de estructuras de programacin como las sentencias condicionales o los bucles.

6.2.LenguajeEnsamblador.
La evolucin del lenguaje mquina fue el lenguaje ensamblador. Las instrucciones ya no son
secuenciasbinarias,sesustituyenporcdigosdeoperacinquedescribenunaoperacinelemental
del procesador. Es un lenguaje de bajo nivel, al igual que el lenguaje mquina, ya que dependen
directamentedelhardwaredondesonejecutados.

Mnemotcnico: son palabras especiales, que sustituyen largas secuencias de ceros y unos,
utilizadas para referirse a diferentes operaciones disponibles en el juego de instrucciones que
soporta cada mquina en particular.

14

DesarrollodeApllicacionesW
Web
Tema3

Enen
nsamblador, cadainstrucccin(mnem
motcnico)se
ecorrespond
deaunainsttruccindel procesador..
Enlasiguientetablasemuesttranalgunossejemplos.
Algunasopeeracionesysu
A
umnemotccnicoen
len
nguajeEnsamblador.
Operacin
LenguajeEnsamblad
dor
MULLTIPLICAR
MUL
DIVIDIR
DIV
VER
MOV
MOV
oenlenguajeeensamblad
dor.Encolorr
Enelsiguientegrrficopuedeesverparte deunprogrramaescrito
rojosseharesaltaadoelcdigo
omquinaeenhexadecim
mal(Sistema
anumricoenbase16,eestosignifica
a
queccontiene16ssmbolosniccospararep
presentardattos:losnmeerosdel0al9ylasletrassdelaAala
a
F.),enmagentaeelcdigoesccritoen
ensam
mblador y
y en azu
ul, las
direcciones de memoria
m
do
onde se
encueentraelcdiigo.
Pero aunque en
nsamblador fue un
intento por apro
oximar el len
nguaje de lo
os procesado
ores al lengu
uaje humano
o, presentab
ba mltipless
dificu
ultades:
9 LLosprogram
masseguand
dependiendo
odirectamen
ntedelhardw
warequelossoportaba.
9 Losprogram
L
madorestenaanquecono
ocerdetallad
damentelam
mquinasob
brelaqueprrogramaban,,
y
yaquedeba
anhacerunu
usoadecuadodelosrecu
ursosdedich
hossistemass.
9 Lalectura,in
L
nterpretacin
nomodificacindelosp
programasseeguapresen
ntandodificultades.
Todo programa escrito en lenguaje en
nsamblador necesita dee un interm
mediario, que realice laa
tradu
uccin de cada
c
una dee las instru
ucciones que
e componen
n su cdigo
o al lenguaaje mquinaa
correespondiente. Este interm
mediario es el programaa ensamblad
dor. El progrrama originaal escrito en
n
lengu
uaje ensamb
blador constiituye el cdiigo fuente y
y el programa traducido al lenguaje mquina see
conocecomopro
ogramaobjettoqueserd
directamente
eejecutadoporlacompu
utadora.

15

Introduccinalaprogramacin

DAW

6.3.Lenguajescompilados.
Parapaliarlosproblemasderivadosdelusodellenguajeensambladoryconelobjetivodeacercarla
programacinhaciaelusodeunlenguajemscercanoalhumanoquealdelcomputador,nacieron
loslenguajescompilados.Algunosejemplosdeestetipodelenguajesson:Pascal,Fortran,Algol,C,
C++(EsellenguajedeprogramacinCampliadoparapoderutilizarlosmecanismosquepermitanla
manipulacindeobjetos.Esunlenguajemultiparadigma.),etc.
Alserlenguajesmscercanosalhumano,tambinselesdenominalenguajesdealtonivel.Sonms
fciles de utilizar y comprender, las instrucciones que forman parte de estos lenguajes utilizan
palabrasysignosreconociblesporelprogramador.
Culessonsusventajas?
9 Sonmuchomsfcilesdeaprenderydeutilizarquesuspredecesores.
9 Sereduceeltiempoparadesarrollarprogramas,ascomoloscostes.
9 Son independientes del hardware, los programas pueden ejecutarse en diferentes tipos de
mquina.
9 Lalectura,interpretacinymodificacindelosprogramasesmuchomssencilla.
Pero un programa que est escrito en un lenguaje de alto nivel tambin tiene que traducirse a un
cdigoquepuedautilizarlamquina.Losprogramastraductoresquepuedenrealizarestaoperacin
sellamancompiladores.

Compilador: Es un programa cuya funcin consiste en traducir el cdigo fuente de un


programa escrito en un lenguaje de alto nivel a lenguaje mquina. Al proceso de traduccin
se le conoce con el nombre de compilacin.
Para ilustrar el proceso de compilacin de
programastemostramoslasiguienteilustracin:

El compilador realizar la traduccin y adems


informar de los posibles errores. Una vez
subsanados, se generar el programa traducido a
cdigo mquina, conocido como cdigo objeto.
Este programa an no podr ser ejecutado hasta
que no se le aadan los mdulos de enlace o
bibliotecas, durante el proceso de enlazado. Una
vez finalizado el enlazado, se obtiene el cdigo
ejecutable.

16

DesarrollodeAplicacionesWeb

Tema3

Autoevaluacin
Durante la fase de enlazado, se incluyen en el cdigo fuente determinados mdulos
(bibliotecas) que son necesarios para que el programa pueda realizar ciertas tareas,
posteriormente se obtendr el cdigo ejecutable.
Verdadero.

Falso.

El cdigo fuente es traducido por el compilador, pero en la fase de enlazado los mdulos son aadidos al cdigo objeto; estos mdulos
permitirn al programa manejar dispositivos, comunicarse con otros elementos del sistema, etc.

6.4.Lenguajesinterpretados.
Secaracterizanporestardiseadosparaquesuejecucinserealiceatravsdeunintrprete.Cada
instruccin escrita en un lenguaje interpretado se analiza, traduce y ejecuta tras haber sido
verificada.Unavezrealizadoelprocesoporelintrprete,lainstruccinseejecuta,peronoseguarda
enmemoria.

Intrprete: Es un programa traductor de un lenguaje de alto nivel en el que el proceso de


traduccin y de ejecucin se llevan a cabo simultneamente, es decir, la instruccin se pasa a
lenguaje mquina y se ejecuta directamente. No se genera programa objeto, ni programa
ejecutable.
Los lenguajes interpretados generan programas de menor tamao que los generados por un
compilador,alnoguardarelprogramatraducidoacdigomquina.Peropresentanelinconveniente
deseralgomslentos,yaquehandesertraducidosdurantesuejecucin.Porotraparte,necesitan
disponerenlamquinadelprogramaintrpreteejecutndose,algoquenoesnecesarioenelcaso
deunprogramacompilado,paralosquesloesnecesariotenerelprogramaejecutableparapoder
utilizarlo.
Ejemplosdelenguajesinterpretadosson:Perl,PHP,Python,JavaScript,etc.
A medio camino entre los lenguajes compilados y los interpretados, existen los lenguajes que
podemosdenominarpseudocompiladosopseudointerpretados,eselcasodelLenguajeJava.Java
puede verse como compilado e interpretado a la vez, ya que su cdigo fuente se compila para
obtenerelcdigobinarioenformadebytecodes,quesonestructurasparecidasalasinstrucciones
mquina, con la importante propiedad de no ser dependientes de ningn tipo de mquina (se
detallarnmsadelante).LaMquinaVirtualJavaseencargardeinterpretarestecdigoy,parasu
ejecucin, lo traducir a cdigo mquina del procesador en particular sobre el que se est
trabajando.

Debesconocer
Puedes entender por qu Java es un lenguaje compilado e interpretado a travs del
siguienteesquema.
Losdosprocesosserealizanenfasesdistintas:
ProgramaJava

bytecode

javac

java

bytecode

fasededesarrollo

binario

fasedeexplotacin

17

Introduccinalaprogramacin

DAW

El compilador (javac) slo tiene que estar en la plataforma de desarrollo, y el interprete (java)
tienequeestarentodoslosclientesquequieranejecutarelapplet.

Autoevaluacin
En Java el cdigo fuente es compilado, obtenindose el cdigo binario en forma de bytecodes.
Pero, Cul es la extensin del archivo resultante?
Extensin .obj.
Extensin .class.
Extensin .Java.
Este tipo de archivos son los que la Mquina Virtual Java traducir para poder ejecutarlos en la mquina real.

18

DesarrollodeAplicacionesWeb

Tema3

7.- El lenguaje de programacin Java.


Caso prctico
Ada indica a Juan y Mara que el lenguaje elegido para sus desarrollos va a ser Java. La flexibilidad,
facilidad de aprendizaje, similitud con algunos lenguajes que ya conocen y su capacidad para
adaptarse a cualquier plataforma, hacen que sea ideal para producir las nuevas aplicaciones de BK
Programacin.

7.1.QuycmoesJava?
Java es un lenguaje sencillo de aprender, con una sintaxis parecida a la de
C++,peroenlaquesehaneliminadoelementoscomplicadosyquepueden
originar errores. Java es orientado a objetos, con lo que elimina muchas
preocupacionesalprogramadorypermitelautilizacindegrancantidadde
bibliotecas ya definidas, evitando reescribir cdigo que ya existe. Es un
lenguajedeprogramacincreadoparasatisfacernuevasnecesidadesquelos
lenguajesexistenteshastaelmomentonoerancapacesdesolventar.
UnadelasprincipalesvirtudesdeJavaessuindependenciadelhardware,ya
queelcdigoquesegeneraesvlidoparacualquierplataforma.Estecdigo
serejecutadosobreunamquinavirtualdenominadaMaquinaVirtualJava
(MVJoJVMJavaVirtualMachine),queinterpretarelcdigoconvirtindoloacdigoespecficode
laplataformaquelosoporta.Deestemodoelprogramaseescribeunanicavezypuedehacerse
funcionarencualquierlugar.Lemadellenguaje:Writeonce,runeverywhere.
AntesdequeaparecieraJava,ellenguajeCeraunodelosmsextendidosporsuversatilidad.Pero
cuandolosprogramasescritosenCaumentabandevolumen,sumanejocomenzabaacomplicarse.
Mediantelastcnicasdeprogramacinestructuradayprogramacinmodularseconseguanreducir
estascomplicaciones,peronoerasuficiente.
Fue entonces cuando la Programacin Orientada a Objetos (POO) entra en escena, aproximando
notablementelaconstruccindeprogramasalpensamientohumanoyhaciendomssencillotodoel
proceso. Los problemas se dividen en objetos que tienen propiedades e interactan con otros
objetos, de este modo, el programador puede centrarse en cada objeto para programar
internamenteloselementosyfuncionesquelocomponen.
LascaractersticasprincipalesdelenguajeJavaseresumenacontinuacin:
9
9
9
9
9
9
9

ElcdigogeneradoporelcompiladorJavaesindependientedelaarquitectura.
Esttotalmenteorientadoaobjetos.
SusintaxisessimilaraCyC++.
Esdistribuido,preparadoparaaplicacionesTCP/IP.
Disponedeunamplioconjuntodebibliotecas.
Esrobusto,realizandocomprobacionesdelcdigoentiempodecompilacinydeejecucin.
La seguridad est garantizada, ya que las aplicaciones Java no acceden a zonas delicadas de
memoriaodesistema.

19

Introduccinalaprogramacin

DAW

Debesconocer
Obtnunadescripcindetalladadelascaractersticasreseadasanteriormenteatravsdel
siguienteartculo:
Caractersticas
CONCEPTOSCLAVE

9 bytecodes
9 Lenguaje totalmente orientado a Objetos. Todos los conceptos en los que
una especie de cdigo
se apoya esta tcnica, encapsulacin, herencia, polimorfismo, etc., estn
mquina.
presentesenJava.
9 applets
9 Disponibilidaddeunamplioconjuntodebibliotecas.Comoyasemencion
programasembebidosen
anteriormente, Java es algo ms que un lenguaje. La programacin de
pginasWeb.
aplicacionesconJavasebasanosoloenelempleodeljuegodeinstrucciones
9 MquinaVirtual
que componen el lenguaje, sino, fundamentalmente, en la posibilidad de
softwarequeemulaaun
utilizar el amplsimo conjunto de clases que Sun pone a disposicin del
ordenador.
programadoryconlascualesesposiblerealizarprcticamentecualquiertipo
deaplicacin.
9 Lenguaje simple. Java posee una curva de aprendizaje muy rpida. Resulta relativamente sencillo escribir applets
interesantesdesdeelprincipio.TodosaquellosfamiliarizadosconC++encontrarnqueJavaesmssencillo,yaquese
haneliminadociertascaractersticas,comolospunteros.DebidoasusemejanzaconCyC++,ydadoquelamayora
de la gente los conoce aunque sea de forma elemental, resulta muy fcil aprender Java. Los programadores
experimentadosenC++puedenmigrarmuyrpidamenteaJavayserproductivosenpocotiempo.
9 DistribuidoJavaproporcionaunacoleccindeclasesparasuusoenaplicacionesdered,quepermitenabrirsocketsy
establecer y aceptar conexiones con servidores o clientes remotos, facilitando as la creacin de aplicaciones
distribuidas.
9 Interpretado ycompilado a lavez Javaes compilado, en la medida enquesucdigo fuentese transformaen una
especie de cdigo mquina, los bytecodes, semejantes a las instrucciones de ensamblador. Por otra parte, es
interpretado, ya que los bytecodes se pueden ejecutar directamente sobre cualquier mquina a la cual se hayan
portadoelintrpreteyelsistemadeejecucinentiemporeal(runtime).
9 RobustoJavafuediseadoparacrearsoftwarealtamentefiable.Paraelloproporcionanumerosascomprobaciones
encompilacinyentiempodeejecucin.Suscaractersticasdememorialiberanalosprogramadoresdeunafamilia
enteradeerrores(laaritmticadepunteros),yaquesehaprescindidoporcompletodelospunteros,ylarecoleccin
debasuraeliminalanecesidaddeliberacinexplcitadememoria.
9 Seguro (?) Dada la naturaleza distribuida de Java, donde las applets se bajan desde cualquier punto de la Red, la
seguridad se impuso como una necesidad de vital importancia. A nadie le gustara ejecutar en su ordenador
programasconaccesototalasusistema,procedentesdefuentesdesconocidas.Asqueseimplementaronbarreras
deseguridadenellenguajeyenelsistemadeejecucinentiemporeal.
9 IndiferentealaarquitecturaJavaestdiseadoparasoportaraplicacionesquesernejecutadasenlosmsvariados
entornosdered,desdeUnixaWindowsNt,pasandoporMacyestacionesdetrabajo,sobrearquitecturasdistintasy
consistemasoperativosdiversos.Paraacomodarrequisitosdeejecucintandiversosovariopintos,elcompiladorde
Java genera bytecodes: un formato intermedio indiferente a la arquitectura diseado para transportar el cdigo
eficientemente a mltiples plataformas hardware y software. El resto de problemas los soluciona el intrprete de
Java.
9 PortableLaindiferenciaalaarquitecturarepresentaslounapartedesuportabilidad.Adems,Javaespecificalos
tamaos de sus tipos de datos bsicos y el comportamiento de sus operadores aritmticos, de manera que los
programassonigualesentodaslasplataformas.EstasdosltimascaractersticasseconocencomolaMquinaVirtual
Java(JVM).
9 Altorendimiento
9 MultihebraHoyendayasevencomoterriblementelimitadaslasaplicacionesqueslopuedenejecutarunaaccina
lavez.Javasoportasincronizacindemltipleshilosdeejecucin(multithreading)aniveldelenguaje,especialmente
tiles en la creacin de aplicaciones de red distribuidas. As, mientras un hilo se encarga de la comunicacin, otro
puedeinteractuarconelusuariomientrasotropresentaunaanimacinenpantallayotrorealizaclculos.
9 DinmicoEllenguajeJavaysusistemadeejecucinentiemporealsondinmicosenlafasedeenlazado.Lasclases
slo se enlazan a medida que son necesitadas. Se pueden enlazar nuevos mdulos de cdigo bajo demanda,
procedentedefuentesmuyvariadas,inclusodesdelaRed.
9 ProduceappletsJavapuedeserusadoparacreardostiposdeprogramas:aplicacionesindependientesyapplets.Las
aplicaciones independientes se comportan como cualquier otro programa escrito en cualquier lenguaje, como por
ejemplo el navegador de Web HotJava, escrito ntegramente en Java. Por su parte, las applets son pequeos
programasqueaparecenembebidosenlaspginasWeb,comoaparecenlosgrficosoeltexto,peroconlacapacidad
de ejecutar acciones muy complejas, como animar imgenes, establecer conexiones de red, presentar mens y
cuadrosdedilogoparaluegoemprenderacciones,etc.

20

DesarrollodeAplicacionesWeb

Tema3

7.2.Brevehistoria.
Javasurgi en 1991 cuando un grupo de ingenieros de Sun Microsystems trataron de disear un
nuevo lenguaje de programacin destinado a programar pequeos dispositivos electrnicos. La
dificultaddeestosdispositivosesquecambiancontinuamenteyparaqueunprogramafuncioneen
elsiguientedispositivoaparecido,hayquerescribirelcdigo.PoresolaempresaSunqueracrearun
lenguajeindependientedeldispositivo.
Peronofuehasta1995cuandopasallamarseJava,dndoseaconoceralpblicocomolenguajede
programacin para computadores. Java pasa a ser un lenguaje totalmente independiente de la
plataformayalavezpotenteyorientadoaobjetos.Esafilosofaysufacilidadparacrearaplicaciones
pararedesTCP/IPhahechoqueseaunodeloslenguajesmsutilizadosenlaactualidad.
ElfactordeterminanteparasuexpansinfuelaincorporacindeunintrpreteJavaenlaversin2.0
delnavegadorWebNetscapeNavigator,loquesupusounagranrevueloenInternet.Aprincipiosde
1997 apareci Java 1.1que proporcion sustanciales mejoras al lenguaje. Java 1.2, ms tarde
rebautizadocomoJava2,naciafinalesde1998.
ElprincipalobjetivodellenguajeJavaesllegaraserelnexouniversalqueconectealosusuarioscon
lainformacin,eststasituadaenelordenadorlocal,enunservidorWeb,enunabasededatoso
encualquierotrolugar.
Para el desarrollo de programas en lenguaje Java es necesario utilizar un entorno de desarrollo
denominado JDK (Java Development Kit), que provee de un compilador y un entorno de ejecucin
(JREJavaRunEnvironment)paralosbytecodesgeneradosapartirdelcdigofuente.Aligualquelas
diferentes versiones del lenguaje han incorporado mejoras, el entorno de desarrollo y ejecucin
tambinhasidomejoradosucesivamente.
Java2eslaterceraversindellenguaje,peroesalgomsqueunlenguajedeprogramacin,incluye
lossiguienteselementos:
9 Unlenguajedeprogramacin:Java.
9 Unconjuntodebibliotecasestndarquevienenincluidasenlaplataformayquesonnecesarias
entodoentornoJava.EselJavaCore.
9 Un conjunto de herramientas para el desarrollo de programas, como es el compilador de
bytecodes,elgeneradordedocumentacin,undepurador,etc.
9 Un entorno de ejecucin que en definitiva es una mquina virtual que ejecuta los programas
traducidosabytecodes.

El siguiente esquema muestra los elementos


fundamentales de la plataforma de desarrollo
Java2.

21

Introduccinalaprogramacin

ActualmentehaytresedicionesdelaplataformaJava2:

DAW

9 J2SE:EntornodeSunrelacionadoconlacreacindeaplicacionesyappletsenlenguajeJava.
9 J2EE:PensadaparalacreacindeaplicacionesJavaempresarialesydelladodelservidor.
9 J2ME:PensadaparalacreacindeaplicacionesJavaparadispositivosmviles.

Parasaberms
Si deseas conocer ms sobre los orgenes del lenguaje Java, aqu te ofrecemos ms
informacin:
http://www.wikilearning.com/tutorial/tutorial_de_Javaorigen_de_Java/39384
http://es.wikipedia.org/wiki/Java_%28lenguaje_de_programaci%C3%B3n%29#Historia
http://www.oracle.com/technetwork/Java/Javase/overview/javahistorytimeline198369.html

7.3.LaPOOyJava.
EnJava,losdatosyelcdigo(funcionesomtodos)secombinanenentidadesllamadasobjetos.El
objetotendruncomportamiento(sucdigointerno)yunestado(losdatos).Losobjetospermiten
la reutilizacin del cdigo y pueden considerarse, en s mismos, como piezas reutilizables en
mltiplesproyectosdistintos.Estacaractersticapermitereducireltiempodedesarrollodesoftware.
Porsimplificarunpocolascosas,unprogramaenJavasercomounarepresentacin teatralenla
que debemos preparar primero cada personaje, definir sus caractersticas y qu va a saber hacer.
Cuandoestafaseestterminada,laobrasedesarrollarsacandopersonajesaescenayhacindoles
interactuar.
Al emplear los conceptos de la Programacin Orientada a Objetos (POO), Java incorpora las tres
caractersticas propias de este paradigma:encapsulacin (En programacin modular y ms
especficamenteenprogramacinorientadaaobjetos,sedenominaasalocultamientodelosdatosy
elementos internos de un objeto. Slo se puede modificar un objeto a travs de las operaciones
definidas para ste.), herencia(Mecanismo que permite derivar una clase de otra, de manera que
extienda su funcionalidad) y polimorfismo.(Capacidad para que varias clases derivadas de una
antecesorautilicenunmismomtododeformadiferente.Podemoscreardosclasesdistintas:Pezy
Ave que heredan de la superclase Animal. La clase Animal tiene el mtodo abstracto mover que se
implementa de forma distinta en cada una de las subclases (peces y aves se mueven de forma
distinta).) Los patrones o tipos de objetos se denominan clases(Es una construccin que se utiliza
como un modelo (o plantilla) para crear objetos de ese tipo. El modelo describe el estado y el
comportamiento que todos los objetos de la clase comparten) y los objetos que utilizan estos
patronesopertenecenadichostipos,seidentificanconelnombredeinstancias.(Una instancia se

produce con la creacin de un objeto perteneciente a una clase (se dice que se instancia la
clase). El objeto que se crea tiene los
atributos, propiedades y mtodos de la clase
a la que pertenece. Los objetos y sus
caractersticas se usan en la construccin
de programas, ya sea como contenedores de
datos o como partes funcionales del
programa.)Pero,nohayquealarmarse,estos
conceptos se vern ms adelante en sucesivas
unidades.

22

DesarrollodeAplicacionesWeb

Tema3

Otro ejemplo para seguir aclarando ideas, piensa en los bloques de juegos de construccin.
Suponemos que conoces los cubos de plstico en varios colores y tamaos. Por una de sus caras
disponen de pequeos conectores circulares y en otra de sus caras pequeos orificios en los que
puedenconectarseotrosbloques,conelobjetivoprincipaldepermitirconstruirformasmsgrandes.
Siusasdiferentespiezasdellegopuedesconstruiraviones,coches,edificios,etc.Sitefijasbien,cada
piezaesunobjetopequeoquepuedeunirseconotrosobjetosparacrearobjetosmsgrandes.
Pues bien, aproximadamente as es como funciona la programacin dirigida a objetos: unimos
elementos pequeos para construir otros ms grandes. Nuestros programas estarn formados por
muchoscomponentes(objetos)independientesydiferentes;cadaunoconunafuncindeterminada
ennuestrosoftwareyquepodrcomunicarseconlosdemsdeunamanerapredefinida.

7.4.Independenciadelaplataformaytrabajoenred.
ExistendoscaractersticasquedistinguenaJavadeotroslenguajes,comosonlaindependenciadela
plataforma y la posibilidad de trabajar en red o, mejor, la posibilidad de crear aplicaciones que
trabajanenred.
Estascaractersticaslasvamosaexplicaracontinuacin:
a) Independencia:LosprogramasescritosenJavapuedenserejecutadosencualquiertipode
hardware. El cdigo fuente es compilado, generndose el cdigo conocido como Java
Bytecode(instruccionesmquinasimplificadasquesonespecficasdelaplataformaJava),el
bytecode ser interpretado y ejecutado en la Mquina Virtual Java (MVJ o JVM Java
Virtual Machine) que es un programa escrito en cdigo nativo de la plataforma destino
entendibleporelhardware.Conestoseevitatenerquerealizarunprogramadiferentepara
cadaCPUoplataforma.
Portanto,lapartequerealmenteesdependientedelsistemaeslaMquinaVirtualJava,as
comolaslibrerasobibliotecasbsicasquepermitenaccederdirectamentealhardwaredela
mquina.
b) Trabajo en red: Esta capacidad del lenguaje ofrece mltiples posibilidades para la
comunicacin va TCP/IP. Para poder hacerlo existen libreras que permiten el acceso y la
interaccin con protocolos como http, ftp, etc., facilitando al programador las tareas del
tratamientodelainformacinatravsderedes.

Autoevaluacin
Qu elemento es imprescindible para que una aplicacin escrita en Java pueda ejecutarse en
un ordenador?
Que disponga de conexin a Internet y del hardware adecuado.
Que tenga instalado un navegador web y conexin a Internet.
Que tenga la Mquina Virtual Java adecuada instalada.
Sin la Mquina Virtual Java es imposible que el hardware pueda entender los cdigos de bytes necesarios para la ejecucin del programa,
siendo necesaria la mquina virtual adecuada para la plataforma hardware que estemos utilizando.

23

Introduccinalaprogramacin

DAW

7.5.Seguridadysimplicidad.
Junto a las caractersticas diferenciadoras del lenguaje Java relacionadas con la independencia y el
trabajoenred,handedestacarsedosvirtudesquehacenaestelenguajeunodelosmsextendidos
entrelacomunidaddeprogramadores:suseguridadysusimplicidad.
a. Seguridad: En primer lugar, los posibles accesos a zonas de memoria sensibles que en
otros lenguajes como C y C++ podan suponer peligros importantes, se han eliminado en
Java.
Ensegundolugar,elcdigoJavaescomprobadoyverificadoparaevitarquedeterminadas
seccionesdelcdigoproduzcanefectosnodeseados.Lostestqueseaplicangarantizanque
lasoperaciones,operandos,conversiones,usodeclasesydemsaccionessonseguras.
Y en tercer lugar, Java no permite la apertura de ficheros en la mquina local, tampoco
permiteejecutarningunaaplicacinnativadeunaplataformaeimpidequeseutilicenotros
ordenadores como puente, es decir, nadie puede utilizar nuestra mquina para hacer
peticionesorealizaroperacionesconotra.
Endefinitiva,podemosafirmarqueJavaesunlenguajeseguro.
b. Simplicidad:AunqueJavaestanpotentecomoCoC++,esbastantemssencillo.Poseeuna
curvadeaprendizajemuyrpiday,paraalguienquecomienzaaprogramarenestelenguaje,
leresultarelativamentefcilcomenzaraescribiraplicacionesinteresantes.
SihasprogramadoalgunavezenCoC++encontrarsqueJavateponelascosasmsfciles,
yaquesehaneliminado:laaritmticadepunteros(unpunterooapuntadoresunavariable
quereferenciaunaregindememoria;enotraspalabrasesunavariablecuyovaloresuna
direccinde memoria),losregistros,ladefinicindetipos,lagestindememoria,etc.Con
esta simplificacin se reduce bastante la posibilidad de cometer errores comunes en los
programas. Un programador experimentado en C o C++ puede cambiar a este lenguaje
rpidamenteyobtenerresultadosenmuypocoespaciodetiempo.
Muy relacionado con la simplicidad que aporta Java est la incorporacin de un elemento
muy til como es el Recolector de Basura (Garbagecollector). Permite al programador
liberarse de la gestin de la memoria y hace que ciertos bloques de memoria puedan
reaprovecharse, disminuyendo el nmero de huecos libres (fragmentacin de memoria o
memoria que queda desperdiciada al usar los mtodos de gestin de memoria. Puede ser
internaoexterna.).
Cuando realicemos programas, crearemos objetos, haremos que stos interaccionen, etc.
Todasestasoperacionesrequierendeusodememoriadelsistema,perolagestindesta
ser realizada de manera transparente al programador. Todo lo contrario que ocurra en
otros lenguajes. Podremos crear tantos objetos como solicitemos, pero nunca tendremos
que destruirlos. El entorno de Java borrar los objetos cuando determine que no se van a
utilizarms.Esteprocesoesconocidocomorecoleccindebasura.

Autoevaluacin
Rellena los huecos con los conceptos adecuados:

24

DesarrollodeApllicacionesW
Web

Tema3

En Jaava se ha siimplificadoo la gestin de memoria a travs de


d la eliminnacin de la Aritmticaa
de

punteros

, por lo quee la incorpooracin del GarbageCoollector evita que se produzca


p
unn

creciimiento de los huecoos libres enn memoria,, que recibbe el nombbre de


mem
moria.

fra
agmentacin

dee

7.6.Javaylo
osBytecod
des.
Un programa
p
esscrito en Jaava no es directamente
d
e ejecutablee, es
necessario que el
e cdigo fuente sea in
nterpretado por la Maq
quina
VirtualJava.Culessonlosp
pasosqueseesiguendesd
dequesegeenera
el c
digo fuente hasta que se ejecuta?? A continuaacin se dettallan
cadaunodeelloss.
Unavvezescritoeelcdigofuente(archivossconextenssin.Java),ste
esprecompilado generndosseloscdigo
osdebytes,B
Bytecodeso Java
ass)queserninterprettados
Byteccodes(archivvosconexteensin .cla
directtamenteporrlaMaquinaaVirtualJavaaytraducido
osacdigonativo
delaplataformasobrelaqueeseestejeccutandoelprrograma.

Byteccode: Son un
u conjuntoo de instruccciones en lenguaje mquina
m
quee no son esspecficas a
ningn procesaddor o sistem
ma de cmpputo. Un inttrprete de cdigo de bbytes (byteccodes) paraa
una plataforma
p
especfica ser quien los ejecutee. A estos intrpretes
i
tambin se les conocee
comoo Mquinass Virtuales Java
J
o intrp
rpretes Java
a de tiempo de ejecucin.
Enel procesode precompilaccin,existe unverificado
ordecdigo
osdebytesq
queseasegu
urardequee
secumplenlassigguientescon
ndiciones:
9
9
9
9
9

ElcdigosatisfacelassespecificacionesdelaM
MquinaVirttualJava.
Noexisteeamenazaco
ontralainteggridaddelsisstema.
Nosepro
oducendesbordamientossdememoriia.
Losparm
metrosysustipossonad
decuados.
Noexisteenconversion
nesdedatossnopermitid
das.

Para que un byytecode pueeda ser


ejecu
utado en cuaalquier plataaforma,
es imprescindiible que dicha
plataformacuentteconelintrprete
adecu
uado, es decir,
d
la mquina
m
virtuaal especffica para esa
plataforma. En general,
g
la Mquina
M
Virtual Java es un programa de
reduccido tamao
o y gratuito para
todosslossistemaasoperativoss.

25

Introduccinalaprograamacin

DAW

8.- Prrogram
mas en
e Javva.
Caso prcttico
Juan celebrra que BK Programacin
P
n vaya a dessarrollar sus programas en
e un lengua
aje como Jav
va. En
algunas oca
asiones ha asistido
a
a con
ngresos y ferrias de exposiciones de software
s
en las que ha podido
p
intercambia
ar impresione
es con comp
paeros de profesin
p
sob
bre los difere
entes lenguajjes que utiliz
zan en
sus proyecttos. Una gran
n mayora de
estacaba lo fcil
f
y potentte que es pro
ogramar en JJava.
Juan est entusiasmad
do y pregun
nta: Ada
a, cundo em
mpezamos? Tienes c
digo fuente
e para
empezar a ver la sintaxiis? Podrem
mos utilizar allgn entorno
o de desarrolllo profesiona
al?
Ada respon
nde sonriend
do: Manoss a la obra! Mara,
M
prepa
arada? Vam
mos a echarle
e un vistazo a este
fragmento de
d cdigo...

Hasta ahoraa, hemos deescrito el len


nguaje de prrogramacin
n Java, hemo
os hecho un
n recorrido por
p su
historia y nos hemoss instruido sobre su fiilosofa de trabajo, peero te preguntars Cu
undo
empezamossadesarrollarprogramaas?Queleementosform
manpartedeeunprogram
maenJava? Qu
senecesitaparaprogramarenestelenguaje?P
Podemoscre
earprogramaasdediferen
ntetipo?
da vez estam
mos ms ceerca de com
menzar la experiencia co
on el lenguaaje de
No te impaacientes, cad
programacinJava.Inicciaremosnueestrocamino
oconociendocualesson
nloselemen
ntosbsicos deun
maenquedeebemosescrribirelcdiggoylostipossdeaplicaciionesquepu
ueden
programaJava,laform
crearseeneestelenguajee.

8.1.Estrructurade
eunprog
grama.
Enelgrfico
oalquepuedesaccederacontinuacin,seprese
entalaestructurageneraaldeunproggrama
realizadoen
nunlenguajeeorientadoaobjetoscomoesJava.

Vamosaan
nalizarcadau
unodeloselementosqueaparecene
e
endichogrffico:
Publiccla
assClase_P
Principal:
:Todoslosp
programash
handeincluiruna clase ccomoesta.EEsuna

clase generral en la quee se incluyeen todos los dems elem


mentos del programa. EEntre otras cosas,
c
contieneelmtodoofu
uncinmain()querepreesentaalpro
ogramaprinccipal,desdeelquesellevvara
cabolaejeccucindelprrograma.Estaclasepued
deconteneraasuvezotraasclasesdelusuario,peroslo
una puede ser public
c. El nombre del fichero .Java qu
ue contiene el cdigo fu
uente de nu
uestro
programa,ccoincidirco
onelnombreedelaclaseq
queestamossdescribiend
doenestaslneas.

Recomend
dacin
Ten en cu
uenta que Java
J
distin
ngue entre maysculaas y minssculas. Si lee das a la clase
principal el nombrre PrimerP
Programa, el archivo
o .Java tendr como identificcador
PrimerPro
ograma.Jav
va,queesto
otalmented
diferenteaprimerpro
ograma.Javaa.Adems,para

26

DesarrollodeAplicacionesWeb

Tema3

Java los elementos PrimerPrograma y primerprograma seran considerados dos clases


diferentesdentrodelcdigofuente.
9 publicstaticvoidmain (String[] args): Es el mtodo que representa al
programa principal, en l se podrn incluir las instrucciones que estimemos
oportunasparalaejecucindelprograma.Desdelsepodrhacerusodelresto
declasescreadas.TodoslosprogramasJavatienenunmtodomain.
9 Comentarios:Loscomentariossesuelenincluirenelcdigofuentepararealizar
aclaraciones,anotacionesocualquierotraindicacinqueelprogramadorestime
oportuna.Estoscomentariospuedenintroducirsededosformas,con//ycon/*
*/.Conlaprimeraformaestaramosestableciendounanicalneacompletade
comentario y, con la segunda, con /* comenzaramos el comentario y ste no
terminarahastaquenoinsertramos*/.
9 Bloques de cdigo: son conjuntos de instrucciones que se marcan mediante la
aperturaycierredellaves { }.Elcdigoasmarcadoesconsideradointernoal
bloque.
9 Puntoycoma:aunqueenelejemplonohemosincluidoningunalneadecdigo
que termine con punto y coma, hay que hacer hincapi en que cada lnea de
cdigo ha de terminarcon punto y coma (;). En caso de no hacerlo, tendremos
erroressintcticos.
Autoevaluacin
publicstaticvoidmain (String[] args) es la clase general del programa.
Verdadero.

Falso.

La clase general del programa tiene el formato public class <nombre_clase_general> y todos los programas Java tendrn
una. Dentro de ella podr haber ms clases definidas por el usuario y siempre, deber haber un mtodo main desde el que se ir haciendo
uso del resto de clases definidas.

8.2.ElentornobsicodedesarrolloJava.
YaconocescmoeslaestructuradeunprogramaenJava,pero,qunecesitamosparallevarloala
prctica? La herramienta bsica para empezar a desarrollar aplicaciones en Java es el JDK (Java
DevelopmentKitoKitdeDesarrolloJava),queincluyeuncompiladoryunintrpreteparalneade
comandos.Estosdosprogramassonlosempleadosenlaprecompilacineinterpretacindelcdigo.
Como veremos, existen diferentes entornos para la creacin de programas en Java que incluyen
multitud de herramientas, pero por ahora nos centraremos en el entorno ms bsico, extendido y
gratuito,elJavaDevelopmentKit(JDK).SegnseindicaenlapropiapginawebdeOracle,JDKesun
entorno de desarrollo para construir aplicaciones, applets y componentes utilizando el lenguaje de
programacinJava.Incluyeherramientastilesparaeldesarrolloypruebadeprogramasescritosen
JavayejecutadosenlaPlataformaJava.
As mismo, junto a JDK se incluye una implementacin del entorno de ejecucin Java, el JRE (Java
RuntimeEnvironment)paraserutilizado porelJDK.ElJREincluyelaMquinaVirtualdeJava(MVJ
JVM Java Virtual Machine), bibliotecas de clases y otros ficheros que soportan la ejecucin de
programasescritosenellenguajedeprogramacinJava.

Debesconocer
ParapoderutilizarJDKyJREesnecesariorealizarladescargaeinstalacindestos.Puedes
seguirlospasosdelprocesoacontinuacin:
1. LocalizacinydescargadeJavaSE

27

Introduccinalaprogramacin

DAW

a. En primer lugar accederemos a la pgina web de ORACLE para realizar la


descargadeJavaSE:http://www.oracle.com/es/index.html
b. EnelmentituladoProductosyServiciosseleccionaJava
c. NavegaporlapginaquesetemuestraybuscaObtengasoftwareJavapara
suordenadoryseleccionaJavaSE
d. Enlapginaqueaparece,seleccionalapestaadedescargas(Downloads)
e. PulsasobreelprimerodelosiconosconellogotipodeJava
f. A continuacin, escoge la versin que deseas descargar en funcin de la
plataformasobrelaquetrabajar.Enestecasohemosutilizadolaversinpara
Windows764bits
g. Comenzar la descarga del software seleccionado en la carpeta de destino
queseindique
2. InstalacindeJavaSE
a. LocalizaentuequipolacarpetaenlaquehasdescargadoJavaSEyhazdoble
clicsobreelarchivodeinstalacin
b. Debersescogerlaubicacinenlaqueseinstalarelentornodedesarrollo.Si
nodeseascambiar,existeunaubicacinpordefecto
c. Comenzar entonces la instalacin del entorno de desarrollo (JDK) y del
entornodeejecucin(JRE)
d. Enbrevesmomentoslainstalacinsecompleta
3. Comprobandolainstalacin
a. Ahora es el momento de comprobar si se ha realizado bien la instalacin y
haceralgnltimoajuste.
b. Buscaremos a travs de la lnea de comandos el directorio o carpeta donde
hemosinstaladoJavaSE.
c. Dentro de la carpeta bin haremos una llamada al compilador de Java,
medianteelcomandojavac
d. Ennuestrocaso,larutadelacarpetaencuestines:
C:\ProgramFiles\Java\jdk1.6.0_25\bin
ParapoderdesarrollarnuestrosprimerosprogramasenJavaslonecesitaremosuneditordetexto
planoyloselementosqueacabamosdeinstalaratravsdeJavaSE.

Autoevaluacin
Podemos desarrollar programas escritos en Java mediante un editor de textos y a travs del
JRE podremos ejecutarlos.
Verdadero.

Falso.

Efectivamente, JRE incluye un subconjunto de JDK que permitira realizar la compilacin del cdigo fuente y la ejecucin posterior en la
Mquina Virtual Java de nuestro programa

8.3.LaAPIdeJava.
Junto con el kit de desarrollo que hemos descargado e instalado anteriormente, vienen incluidas
gratuitamente todas las bibliotecas de la API (AplicationProgramming Interface Interfaz de
programacin de aplicaciones) de Java, es lo que se conoce como Bibliotecas de Clases Java. Este
conjuntodebibliotecasproporcionaalprogramadorpaquetesdeclasestilesparalarealizacinde
mltiplestareasdentrodeunprograma.Estorganizadaenpaqueteslgicos,dondecadapaquete
contiene un conjunto de clases relacionadas semnticamente (Referencia a los aspectos del
significado,sentidoointerpretacindelsignificadodeundeterminadoelemento,smbolo,palabra,
expresin o representacin formal. En principio cualquier medio de expresin (lenguaje formal o

28

DesarrollodeAplicacionesWeb

Tema3

natural) admite una correspondencia entre expresiones de smbolos o palabras, y situaciones o


conjuntos de cosas que se encuentran en el mundo fsico o abstracto, que puede ser descrito por
dichomediodeexpresin).
Endcadaspasadasunabibliotecaeraunconjuntodeprogramasquecontenancientosderutinas
(una rutina es un procedimiento o funcin bien verificados, en determinado lenguaje de
programacin).Lasrutinasdebibliotecamanejabanlastareasquetodosocasitodoslosprogramas
necesitaban.Elprogramadorpodarecurriraestabibliotecaparadesarrollarprogramasconrapidez.
Unabibliotecadeclasesesunconjuntodeclasesdeprogramacinorientadaaobjetos.Esasclases
contienenmtodosquesontilesparalosprogramadores.EnelcasodeJavacuandodescargamosel
JDKobtenemoslabibliotecadeclasesAPI.UtilizarlasclasesymtodosdelasAPIsdeJavareduceel
tiempodedesarrollodelosprogramas.Tambin,existendiversasbibliotecasdeclasesdesarrolladas
portercerosquecontienencomponentesreutilizablesdesoftware,yestndisponiblesatravsdela
Web.

Parasaberms
SiquieresaccederalainformacinoficialsobrelaAPIdeJava,teproponemoselsiguiente
enlace(estenIngls).
http://www.oracle.com/technetwork/Java/Javase/documentation/apijsp136079.html

Autoevaluacin
Indica qu no es la API de Java:
Un entorno integrado de desarrollo.
Un conjunto de bibliotecas de clases.
Una parte del JDK, incluido en el Java SE.
En efecto, la API de Java es utilizada para la creacin de programas pero no ofrece las herramientas de desarrollo que un IDE posee.

8.4.Afinandolaconfiguracin.
Para que podamos compilar y ejecutar ficheros Java es necesario que realicemos unos pequeos
ajustes en la configuracin del sistema. Vamos a indicarle dnde encontrar los ficheros necesarios
pararealizarlaslaboresdecompilacinyejecucin,enestecasoJavac.exey Java.exe,ascomo
laslibrerascontenidasenlaAPIdeJavaylasclasesdelusuario.
La variable PATH: Como an no disponemos de un IDE (IntegratedDevelopmentEnvironment
Entono Integrado de Desarrollo) la nica forma de ejecutar programas es a travs de lnea de
comandos.Peroslopodremosejecutarprogramasdirectamentesilarutahaciaellosestindicada
en la variable PATH del ordenador. Es necesario que incluyamos la ruta hacia estos programas en
nuestravariablePATH.EstarutaserellugardondeseinstalelJDKhastasudirectoriobin.
Paraello,siguelasindicacionesquetemostramosacontinuacin:

Cmo
configurar
la variable
PATH

1DebemosaccederalacarpetadeinstalacindelJDKparaencontrarenbinlos
archivosjavac.exeyjava.exe
Enestecaso,larutaes:C:\ArchivosdePrograma\Java\jdk1.6.0_25\bin
2Tecleaenunaterminaldecomandoslosiguiente:setPATH
Debesobtenerelconjuntoderutasalojadasenestavariabledelsistema.
3 Pulsa con botn derecho sobre MiPC o Equipo (dependiendo de la versin de
Windows)yseleccionaPropiedades.

29

Introduccinalaprogramacin

DAW

Accede a Opciones Avanzadas o Configuracin Avanzadas del sistema,


Variablesdeentorno
4 BuscalavariablePATHYPULSASOBRE ELBOTNEditar.Enelcampodetexto
Cmo
Valordevariabledebesposicionartealfinaldelcontenido,escribeunpuntoy
configurar
coma;yaadelarutahaciaelcompilador
la variable
Nohayqueaadirningnespacioenblancoparalaseparacin,sloelpuntoy
PATH
coma.HazclicenAceptarparaconfirmarelcambio
Finalmente, si realizamos la llamada al compilador desde la consola de comandos
directamente,deberafuncionarsinproblemas.Tecleaelcomandojavacpara
ello.

Parasaberms
SideseasconocermssobrelaconfiguracindevariablesdeentornoensistemasWindows
yLinux,teproponemoslossiguientesenlaces:
http://www.menoscero.com/content/configurarpathwindows7
http://www.guiaubuntu.org/index.php?title=Java
LavariableCLASSPATH:estavariabledeentornoestablecedndebuscarlasclasesobibliotecasdela
APIdeJava,ascomolasclasescreadasporelusuario.Esdecir,losficheros.classqueseobtienen
una vez compilado el cdigo fuente de un programa escrito en Java. Es posible que en dicha ruta
existan directorios y ficheros comprimidos en los formatos zip o jar que pueden ser utilizados
directamenteporelJDK,conteniendoensuinteriorarchivosconextensinclass.
(Porejemplo:C:\Program Files\Java\jdk1.6.0_25\bin)
Si no existe la variable CLASSPATH debes crearla, para modificar su contenido sigue el mismo
mtodo que hemos empleado para la modificacin del valor de la variable PATH, anteriormente
descrito.TenencuentaquelarutaquedebesincluirserellugardondeseinstalelJDKhastasu
directoriolib.
(Porejemplo:C:\Program Files\Java\jdk1.6.0_25\lib)

Autoevaluacin
Qu variable de sistema o de entorno debemos configurar correctamente para que podamos
compilar directamente desde la lnea de comandos nuestros programas escritos en lenguaje
Java?
CLASSPATH.
PATH.
Javac.exe.
Efectivamente, esta es la variable de entorno que modificaremos aadiendo a su contenido la ruta hasta el directorio bin donde est
instalado el JDK.

8.5.Codificacin,compilacinyejecucindeaplicaciones.
Una vez que la configuracin del entorno Java est completada y tenemos el cdigo fuente de
nuestro programa escrito en un archivo con extensin .Java, la compilacin de aplicaciones se
realizamedianteelprogramaJavacincluidoenelsoftwarededesarrollodeJava.

30

DesarrollodeAplicacionesWeb

Tema3

Para llevar a cabo la compilacin desde la lnea de comandos, escribiremos:


javacarchivo.java

Donde javac es el compilador de Java y archivo.java es nuestro cdigo fuente.


ElresultadodelacompilacinserunarchivoconelmismonombrequeelarchivoJavaperoconla
extensin class.Estoyaeselarchivoconelcdigoenformadebytecode.Esdecirconelcdigo
precompilado. Si en el cdigo fuente de nuestro programa figuraran ms de una clase, veremos
como al realizar la compilacin se generarn tantos archivos con extensin .class como clases
tengamos. Adems, si estas clases tenan mtodo main podremos ejecutar dichos archivos por
separadoparaverelfuncionamientodedichasclases.
Paraqueelprogramapuedaserejecutado,siempreycuandoestincluidoensuinteriorelmtodo
main,podremosutilizarelintrpreteincluidoenelkitdedesarrollo.

La ejecucin de nuestro programa desde la lnea de comandos podremos hacerla escribiendo:


javaarchivo.class

Donde java es el intrprete y archivo.class es el archivo con el cdigo precompilado.

Ejercicio resuelto
Vamosallevaralaprcticatodoloquehemosestadodetallandoatravsdelacreacin,
compilacinyejecucindeunprogramasencilloescritoenJava.
Observa el cdigo que se muestra ms abajo, seguro que podrs entender parte de l.
Cpialo en un editor de texto, respetando las maysculas y las minsculas. Puedes
guardar el archivo con extensin .Java en la ubicacin que prefieras. Recuerda que el
nombredelaclaseprincipal(enelcdigodeejemplo MiModulo)debeserexactamente
igualaldelarchivoconextensin .Java,sitienesestoencuentalaaplicacinpodrser
compiladacorrectamenteyejecutada.
/**
* La clase MiModulo implementa una aplicacin que
* simplemente imprime "Mdulo profesional - Programacin" en pantalla.
*/
classMiModulo {
publicstaticvoidmain(String[] args) {
System.out.println("Mduloprofesional -Programacin");
// Muestra la cadena de caracteres.
}
}

Accedealalneadecomandosyteclea,enlacarpetadondehasguardadoelarchivoJava,
elcomandoparacompilarlo:javacMiModulo.java
El compilador genera entonces un fichero de cdigo de bytes: MiModulo.class. Si
visualizasahoraelcontenidodelacarpetaversqueenellaestelarchivo .Javayuno
o varios (depende de las clases que contenga el archivo con elcdigo fuente)archivos
.class.

31

Introduccinalaprogramacin

DAW

Finalmente, para realizar la ejecucin del programa debes utilizar la siguiente


sentencia:
java MiModulo.java
Sitodohaidobien,versescritoenpantalla: Mdulo profesional Programacin.

8.6.TiposdeaplicacionesenJava.
La versatilidad del lenguaje de programacin Java permite al programador crear distintos tipos de
aplicaciones.Acontinuacin,describiremoslascaractersticasmsrelevantesdecadaunodeellos:
9

32

Aplicacionesdeconsola:
Sonprogramasindependientesaligualqueloscreadosconloslenguajestradicionales.
Secomponencomomnimodeun archivo .classquedebecontarnecesariamentecon
elmtodomain.
NonecesitanunnavegadorwebyseejecutancuandoinvocamoselcomandoJavapara
iniciarlaMquinaVirtualdeJava(JVM).Denoencontrarseelmtodo mainlaaplicacin
nopodrejecutarse.
Lasaplicacionesdeconsolaleenyescribenhaciaydesdelaentradaysalidaestndar,sin
ningunainterfazgrficadeusuario.
Aplicacionesgrficas:
Aquellasqueutilizanlasclasesconcapacidadesgrficas,comoSwingqueeslabiblioteca
paralainterfazgrficadeusuarioavanzadadelaplataformaJavaSE.
Incluyenlasinstrucciones import,queindicanalcompiladordeJavaquelasclasesdel
paquetejavax.swingseincluyanenlacompilacin.
Applets:
Sonprogramasincrustadosenotrasaplicaciones,normalmenteunapginawebquese
muestraenunnavegador.Cuandoelnavegadorcargaunawebquecontieneunapplet,
ste se descarga en el navegador web y comienza a ejecutarse. Esto nos permite crear
programasquecualquierusuariopuedeejecutarcontansolocargarlapginawebensu
navegador.
Se pueden descargar de Internet y se observan en un navegador. Los applets se
descargan junto con una pgina HTML desde un servidor web y se ejecutan en la
mquinacliente.
Notienenaccesoapartessensibles(porejemplo:nopuedenescribirarchivos),amenos
queunomismoledlospermisosnecesariosenelsistema.
Notienenunmtodoprincipal.
SonmultiplataformaypuedenejecutarseencualquiernavegadorquesoporteJava.
Servlets:
SoncomponentesdelapartedelservidordeJavaEE,encargadosdegenerarrespuestas
alaspeticionesrecibidasdelosclientes.
Losservlets,alcontrariodelosapplets,sonprogramasqueestnpensadosparatrabajar
enelladodelservidorydesarrollaraplicacionesWebqueinteractenconlosclientes.
Midlets:
Son aplicaciones creadas en Java para su ejecucin en sistemas de propsito simple o
dispositivosmviles.LosjuegosJavacreadosparatelfonosmvilessonmidlets.
Son programas creados para dispositivos embebidos (se dedican a una sola actividad),
msespecficamenteparalamquinavirtualJavaMicroEdition(JavaME).

DesarrollodeAplicacionesWeb

Tema3

Generalmentesonjuegosyaplicacionesqueseejecutanentelfonosmviles.

Autoevaluacin
Un Applet es totalmente seguro ya que no puede acceder, en ningn caso, a zonas sensibles
del sistema. Es decir, no podra borrar o modificar nuestros archivos.
Verdadero.

Falso.

Los Applets podran acceder a zonas sensibles de nuestro sistema si les diramos permisos para hacerlo. Pero si no est firmado como
confiable, tiene un acceso limitado al sistema del usuario.

33

Introduccinalaprogramacin

DAW

9.- Entornos Integrados de Desarrollo (IDE).


Caso prctico
Ada, Juan y Mara estn navegando por Internet buscando informacin sobre herramientas que les
faciliten trabajar en Java. Ada aconseja utilizar alguno de los entornos de desarrollo integrado
existentes, ya que las posibilidades y rapidez que ofrecen, aumentaran la calidad y reduciran el
tiempo requerido para desarrollar sus proyectos.
Juan, que est chateando con un miembro de un foro de programadores al que pertenece, corrobora
lo que Ada recomienda.

En los comienzos de Java la utilizacin de la lnea de comandos era algo habitual. El programador
escriba el cdigo fuente empleando un editor de texto bsico, seguidamente, pasaba a utilizar un
compilador y con l obtena el cdigo compilado. En un paso posterior, necesitaba emplear una
terceraherramientaparaelensambladodelprograma.Porltimo,podaprobaratravsdelalnea
de comandos el archivo ejecutable. El problema surga cuando se produca algn error, lo que
provocabatenerquevolverainiciarelprocesocompleto.
Estas circunstancias hacan que el desarrollo de software no estuviera optimizado. Con el paso del
tiempo,sefuerondesarrollandoaplicacionesqueincluanlasherramientasnecesariaspararealizar
todo el proceso de programacin de forma ms sencilla, fiable y rpida. Para cada lenguaje de
programacinexistenmltiplesentornosdedesarrollo,cadaunoconsusventajaseinconvenientes.
Dependiendodelasnecesidadesdelapersonaquevaaprogramar,lafacilidaddeusooloagradable
queleresultetrabajarconl,seelegirentreunosuotrosentornos.
ParaellenguajedeprogramacinJavaexistenmltiplesalternativas,siendolosprincipalesentornos
de desarrollo NetBeans (que cuenta con el apoyo de la empresa Sun), Eclipse y JCreator. Los dos
primerossongratuitos,consoportedeidiomasymultiplataforma(Windows,Linux,MacOS).
Yculserconelquevamosatrabajar?Elentornoquehemosseleccionadollevaracabonuestros
desarrollosdesoftwareenestemduloprofesionalserNetBeans,alhabersidoconstruidoporla
mismacompaaquecreJava,serdecdigoabiertoyofrecercapacidadesprofesionales.Aunque,
notepreocupes,tambinharemosunrecorridoporotrosentornosdestacables.

9.1.Quson?
Son aplicaciones que ofrecen la posibilidad de llevar a cabo el proceso completo de desarrollo de
software a travs de un nico programa. Podremos realizar las labores de edicin, compilacin,
depuracin, deteccin de errores, correccin y ejecucin de programas escritos en Java oen otros
lenguajes de programacin, bajo un entorno grfico (no mediante lnea de comandos). Junto a las
capacidadesdescritas,cadaentornoaadeotrasqueayudanarealizarelprocesodeprogramacin,
comoporejemplo:cdigofuentecoloreado,plantillasparadiferentestiposdeaplicaciones,creacin
deproyectos,etc.
Hayquetenerencuentaqueunentornodedesarrollonoesmsqueunafachadaparaelprocesode
compilacinyejecucindeunprograma.Ququieredecireso?Puesquesitenemosinstaladoun
IDEynotenemosinstaladoelcompilador,notenemosnada.

34

DesarrollodeAplicacionesWeb

Tema3

Parasaberms
Si deseas conocer algo ms sobre lo que son los Entornos Integrados de Desarrollo (IDE)
accedealasdefinicionesqueteproponemosacontinuacin:
http://programaciondesarrollo.es/queesunentornodedesarrollointegradoide/
http://es.wikipedia.org/wiki/Entorno_de_desarrollo_integrado

9.2.IDE'sactuales.
Existen en el mercado multitud de entornos de desarrollo para el lenguaje Java, los hay de libre
distribucin,depago,paraprincipiantes,paraprofesionales,queconsumen msrecursos,queson
msligeros,msamigables,mscomplejosqueotros,etc.
Entrelosquesongratuitosodelibredistribucintenemos:
9 NetBeans
9 Eclipse
9 BlueJ
9 Jgrasp
9 JcreatorLE
Entrelosquesonpropietariosodepagotenemos:
9 IntelliJIDEA
9 Jbuilder
9 Jcreator
9 JDeveloper

Debesconocer
Cada uno de los entornos nombrados ms arriba posee caractersticas que los hacen
diferentesunosdeotros,peroparatenerunaideageneraldelaversatilidadypotenciade
cadaunodeellos,miralasiguientetablacomparativa:

Ma
Window Linu c Otherplatform GUI
s
x OS
s
builder
X

IDE

License

JVM

BlueJ

GPL2+GNU
linkingexception

Yes

Yes

Yes Yes

Solaris

No

DrJava

Permissive

Yes

Yes

Yes Yes

Solaris

No

EclipseJDT

EPL

Yes

Yes

Yes Yes

Solaris

Yes

Geany

GPL

No

Yes

Yes Yes

Solaris

No

Greenfoot

GPL

Yes

Yes

Yes Yes

Solaris

No

IntelliJIDEA

ALv2,proprietary

Yes

Yes

Yes Yes

Yes

JBuilder

Proprietary

Yes

Yes

Yes Yes

Solaris

Yes

35

Introduccinalaprogramacin

DAW

IDE

License

JVM

JCreator

Proprietary

No

Ma
Window Linu c Otherplatform GUI
s
x OS
s
builder
X
Yes

No

No

No

JDeveloper

ProprietaryOTNJDevelop
erLicense(freeware)

Yes

Yes

Yes Yes

jGRASP

Proprietary(freeware)

Yes

Yes

Yes Yes

genericJVM

Yes
No

KDevelop

GPL

No

No

Yes No

MyEclipse

Proprietary

Yes

Yes

Yes Yes

Solaris

Unknow
n
Yes

NetBeans

CDDL,GPL2

Yes

Yes

Yes Yes

Solaris

Yes

RationalApplicationDevelop
er

Proprietary

Yes

Yes

Yes No

Solaris,AIX

Yes

Servoy

Proprietary

Unknow
n

Yes

Yes Yes

Solaris

Yes

Xcode

Proprietary

No

No

No Yes

Yes

Pero,culoculessonlosmsutilizadosporlacomunidaddeprogramadoresJava?Elpuestode
honorselodisputanentreEclipse,IntelliJIDEAyNetBeans.Enlossiguientesepgrafesharemosuna
descripcin de NetBeans y Eclipse, para posteriormente desarrollar los puntos claves del entorno
NetBeans.

Parasaberms
Siquieresconocerlasituacinactualdeusoycompararlosdiferentesentornosintegrados
dedesarrolloparaellenguajedeprogramacinJava,puedesampliardatosenelsiguiente
artculo:
http://www.infoworld.com/d/developerworld/infoworldreviewtopJavaprogrammingtools
191?page=0,0
Para acceder a los lugares de Internet donde obtener los diferentes entornos integrados de
desarrollo,puedesutilizarlalistaqueteofrecemosenesteenlace:
http://casidiablo.net/ideJava/

Autoevaluacin
Cul de los siguientes entornos slo est soportado en la plataforma Windows?
Eclipse.
Intellij IDEA.
Jcreator.

36

DesarrollodeAplicacionesWeb

Tema3

Este entorno, adems de ser de pago, slo es soportado en la plataforma Windows. No incorpora un entorno visual de desarrollo.

9.3.ElentornoNetBeans.
Comosehaindicadoanteriormente,elentornodedesarrolloquevamosautilizaralolargodelos
contenidos del mdulo profesional ser NetBeans. Por lo que vamos primero a analizar sus
caractersticasydestacarlasventajasquepuedeaportarsuutilizacin.
SetratadeunentornodedesarrolloorientadoprincipalmenteallenguajeJava,aunquepuedeservir
paraotroslenguajesdeprogramacin.Esunproductolibreygratuitosinrestriccionesdeuso.Esun
proyecto de cdigo abierto de gran xito, con una comunidad de usuarios numerosa, en continuo
crecimientoyapoyadoporvariasempresas.
ElorigendeesteentornohayquebuscarloenunproyectorealizadoporestudiantesdelaRepblica
Checa.FueelprimerIDEcreadoenlenguajeJava.Untiempomstarde,seformunacompaaque
seracompradaen1999porSunMicrosystems(quienhabacreadoellenguajeJava).Pocodespus,
Sun decidi que el producto sera libre y de cdigo abierto y naci Netbeans como IDE de cdigo
abiertoparacrearaplicacionesJava.
NetBeansllevatiempopugnandoconEclipseporconvertirseenlaplataformamsimportantepara
crearaplicacionesenJava.Hoyendaesunproductoenelqueparticipandecenasdeempresascon
Sunalacabeza.Siguesiendosoftwarelibreyofrecelassiguientesposibilidades:
9 EscribircdigoenC,C++,Ruby(Lenguajedeprogramacininterpretado,reflexivoyorientadoaobjetos.Su
implementacin oficial es distribuida bajo una licencia de software libre),Groovy(Lenguaje de programacin
orientado a objetos implementado sobre la plataforma Java. Desde Groovy se puede acceder directamente a
todaslasAPIexistentesenJava.Elbytecodegeneradoenelprocesodecompilacinestotalmentecompatiblecon
el generado por el lenguaje Java para la Java Virtual Machine (JVM), por tanto puede usarse directamente en
cualquier aplicacin Java. Todo lo anterior unido a que la mayor parte de cdigo escrito en Java es totalmente
vlido en Groovy hacen que este lenguaje sea de muy fcil adopcin para programadores Java), Javascript

(Lenguaje de programacin interpretado. Se utiliza principalmente en su forma del lado del cliente (clientside),
implementado como parte de un navegador web permitiendo mejoras en la interfaz de usuario y pginas web
dinmicas. Todos los navegadores modernos interpretan el cdigo JavaScript integrado en las pginas web),

CSS(Hojas de estilo en cascada (en ingls Cascading Style Sheets), CSS es un lenguaje usado para definir la
presentacin de un documento estructurado escrito en HTML o XML.)y PHP(Lenguaje de programacin
interpretado,diseadooriginalmenteparalacreacindepginaswebdinmicas.Esusadoprincipalmenteparala
interpretacindelladodelservidor(serversidescripting),peroactualmentepuedeserutilizadodesdeunainterfaz
delneadecomandos,oenlacreacindeotrostiposdeprogramas,incluyendoaplicacionesconinterfazgrfica
usandolasbibliotecasQtoGTK+)ademsdeJava.
9 Permitir crear aplicaciones J2EE gracias a que incorpora servidores de aplicaciones Java
(actualmente Glassfish(Servidor de aplicaciones de software libre desarrollado por Sun Microsystems, que
implementa las tecnologas definidas en la plataforma Java EE y permite ejecutar aplicaciones que siguen esta
especificacin.)yTomcat(FuncionacomouncontenedordeservletsdesarrolladobajoelproyectoJakartaenla
ApacheSoftwareFundation.TomcatimplementalasespecificacionesdelosservletsydeJavaServerPagesdeSun
Microsystems.Seleconsideraunservidordeaplicaciones,hayquetenerencuentaqueTomcatpuedeutilizarse
comoservidorwebindependiente,obiencomounaextensindelservidorwebyainstalado)

9 Crear aplicaciones Swing(Es una biblioteca grfica para Java. Incluye elementos para interfaz grfica de
usuariotalescomocajasdetexto,botones,desplegablesytablas)deformasencilla,alestilodelVisual
StudiodeMicrosoft.
9 CrearaplicacionesJMEparadispositivosmviles.

37

Introduccinalaprogramacin

Laltimaversinlanzadaen2011eslaNetBeans7.0.

DAW

LaplataformaNetBeanspermitequelasaplicacionesseandesarrolladasapartirdeunconjuntode
componentesdesoftwarellamadosmdulos.UnmduloesunarchivoJavaquecontieneclasesde
Java escritas para interactuar con las APIs de NetBeans y un archivo especial (manifest file) que lo
identificacomomdulo.
Las aplicaciones construidas a partir de mdulos pueden ser extendidas agregndole nuevos
mdulos.Debidoaquelosmdulospuedenserdesarrolladosindependientemente,lasaplicaciones
basadasenestaplataformapuedenserextendidasfcilmenteporcualquieraquedesarrolletambin
software.
Cada mdulo provee una funcin bien definida, tales como el soporte de Java, edicin, o soporte
para el sistema de control de versiones. NetBeans contiene todos los mdulos necesarios para el
desarrollodeaplicacionesJavaenuna soladescarga,permitiendoalapersonaquevaarealizarel
programacomenzaratrabajarinmediatamente.

Parasaberms
Encuentra ms informacin sobre esta plataforma en los enlaces que te proponemos a
continuacin:
http://netbeans.org/index_es.html
http://es.wikipedia.org/wiki/NetBeans#Versiones

9.4.Instalacinyconfiguracin.
PararealizarlainstalacindelentornoNetBeans,seguiremoslossiguientespasosbsicos:
1. Descarga de la versin deseada desde la web oficial o desde los enlaces propuestos ms
abajo.Laversincompletacontienetodaslasposibilidadesaunqueeslamspesada(unos
240 MegaBytes). En nuestro caso, por estar en fase de iniciacin, podra ser suficiente
descargarlaversinmsbsica(unos60MegaBytes).
2. Seleccionar la plataforma o sistema operativo, existen versiones para Windows, Linux y
MacOS.TantoenWindowscomoenLinux,sedescargaunarchivoejecutablequeseencarga
delainstalacin.
3. Seleccionarelidioma.
4. Comenzarladescargadelarchivodeinstalacinejecutableyunavezfinalizada,lanzarste,
comenzandolainstalacinennuestroequipo.
5. Enlasprimeraspantallas,seleccionaremosloscomponentesainstalar.Comomnimo,para
poderprogramarenJavaserimprescindibleinstalarelIDEbsicoyJavaSE.
6. Posteriormente,establecemoseldirectoriodondeseinstalarNetBeans,ascomolacarpeta
quecontieneelJDKqueseutilizarpordefecto.
7. Finalmente, la instalacin se completa y dispondremos de este entorno totalmente
operativo.
Para llevar a cabo las operaciones descritas en el paso 1, te ofrecemos la posibilidad de descargar
cadaunadelaspartesporseparado,obien,enconjunto,atravsdelossiguientesenlaces:

Descarga nicamente NetBeans si tienes ya instalado el JDK. (Esta versin an no incluye


lenguaje Espaol)

38

DesarrollodeAplicacionesWeb

Tema3

Descarga slo NetBeans en Espaol, sin JDK


Descarga NetBeans y JDK desde la pgina oficial de ORACLE
Debesconocer
Para aprender cmo realizar la instalacin completa, JDK y NetBeans, en sus ltimas
versionesesimportantequesigaslasindicacionesquesemuestranenelsiguienteartculo:
http://jtagua.wordpress.com/2011/05/01/descarga-e-instalacion-separada-de-jdk-6-update-25y-netbeans-7-0/

9.5.Aspectodelentornoygestindeproyectos.
La pantalla inicial de nuestro entorno de desarrollo ofrece accesos directos a las operaciones ms
usuales: aprendizaje inicial, tutoriales, ejemplos, demos, los ltimos programas realizados y las
novedadesdelaversin.
Paracomenzaradescribirelaspectodelentorno,esnecesariocrearunnuevoproyectoaccediendo
almenFileNewProject,indicaremoseltipodeaplicacinquevamosacrear.

Debesconocer
Cuando trabajemos con NetBeans, nuestros proyectos harn uso de clases para poder
desarrollarlasoperacionesdenuestrosprogramas.Estasclasesseagruparnenpaquetes.
Creacindenuevospaquetes
Generalmentelasclasesseagrupanenpaquetes.Esrecomendablequecadaproyecto
tenga al menos un paquete, si no fuera as, las clases se crearan en el paquete por
defecto,loquenoesadecuado
Creacindenuevasclases
Podremos crearla pulsando con botn derecho sobre el paquete en el que vamos a
almacenar la clase y seleccionando New > Java Class. Inicialmente nuestros proyectos
contendrnunaclaseprincipal,perosegnvayamosaprendiendomssobreellenguaje
Java iremos necesitando ms y ms clases (agrupadas en paquetes) en cada uno de
nuestrosproyectos.
Una de las ventajas que ofrece este entorno es poder examinar nuestros proyectos a travs de la
vista Archivos. Esta vista nos ensea la realidad de los archivos del proyecto, la carpeta build
contienelosarchivoscompilados(.class),lacarpeta srcelcdigofuenteyelresto,sonarchivos
creadosporNetbeansparacomprobarlaconfiguracindelproyectoolosarchivosnecesariosparala
correctainterpretacindelcdigoenotrossistemas(encualquiercasonohayqueborrarlos).Para
activarestavista,seleccionaenelmenprincipalWindowsFiles.

Autoevaluacin
Rellena los huecos con los conceptos adecuados:
En NetBeans, los archivos .class de un proyecto estn alojados en la carpeta
.java en la carpeta

src

build

y los

39

DesarrollodeAplicacionesWeb

Tema2

INDICE

1Introduccin...................................................................................................................................2
2Lasvariableseidentificadores......................................................................................................4
2.1Identificadores.......................................................................................................................................4
2.2Normasdeestiloparanombrarvariables..................................................................................................5
2.3Palabrasreservadas...............................................................................................................................6
2.4Tiposdevariables.ConstantesI..............................................................................................................7
2.5Tiposdevariables.ConstantesII................................................................................................................8
Creandonuestroprimerprograma.............................................................................................................................9
3.Lostiposdedatos..........................................................................................................................11
3.1TiposdedatosprimitivosI......................................................................................................................12
http://platea.pntic.mec.es/~lgonzale/tic/binarios/aritmetica.html.............................................................13
3.2TiposdedatosprimitivosII......................................................................................................................13
3.3Declaracineinicializacin.....................................................................................................................15
3.4Tiposreferenciados.................................................................................................................................16
3.5Tiposenumerados...................................................................................................................................17
4.Literalesdelostiposprimitivos.....................................................................................................19
5.Operadoresyexpresiones.............................................................................................................21
5.1Operadoresaritmticos..........................................................................................................................21
5.2Operadoresdeasignacin.......................................................................................................................22
5.3Operadorcondicional..............................................................................................................................23
5.4Operadoresderelacin...........................................................................................................................24
5.5Operadoreslgicos.................................................................................................................................25
5.6Operadoresdebits..................................................................................................................................25
5.7Trabajoconcadenas...............................................................................................................................26
5.8Precedenciadeoperadores....................................................................................................................27
6.Conversindetipo........................................................................................................................29
6.1ConversindetiposdedatosenJava...................................................................................................30
6.1.1ReglasdePromocindeTiposdeDatos..........................................................................................................30
6.1.2ConversindenmerosenComaflotante(float,double)aenteros(int)......................................................31
6.1.3Conversionesentrecaracteres(char)yenteros(int)......................................................................................31
6.1.4Conversionesdetipoconcadenasdecaracteres(String)...............................................................................31
7.Comentarios..................................................................................................................................32

Creacindemiprimerprograma

DAW

Creacindemiprimerprograma
Caso Prctico
Todos los lenguajes de programacin estn constituidos por elementos concretos que permiten
realizar las operaciones bsicas del lenguaje, como tipos de datos, operadores e instrucciones. Estos
conceptos deben ser dominados por el programador con objeto de incorporarse con ciertas garantas
a un equipo de programacin. Debemos tener en cuenta que los programas trabajan con datos, los
cuales almacenan en memoria y son posteriormente usados para la toma de decisiones en el
programa.
En esta unidad se introducen los distintos tipos de datos que se pueden emplear en Java. En
concreto, se vern los tipos primitivos en Java, as como las variables y las constantes. En posteriores
captulos veremos otros elementos bsicos del lenguaje, incluyendo estructuras de datos ms
sofisticadas.
Mara y Juan han formado equipo para desarrollar una aplicacin informtica para una clnica
veterinaria. Ada ha convocado una reunin con el cliente para concretar los requerimientos de la
aplicacin, pero lo que est claro es que debe ser multiplataforma. El lenguaje escogido ha sido Java.
Mara tiene conocimientos de redes y de pginas web pero est floja en programacin. Juan ha
aprendido Java en su ciclo de DAI hace 4 aos.
Lo que hace falta es entender bien los conceptos de programacin orientada a objetos le
comenta Juan a Mara. Todo lo concerniente al mundo real puede ser modelado a travs de
objetos. Un objeto contiene datos y sobre l se hacen operaciones y gira toda la aplicacin.
Mara est entusiasmada con el proyecto, cree que es una buena oportunidad para aprender un
lenguaje de la mano de Juan que se le da bastante bien todo el mundo de la programacin.

1 - Introduccin
Cada vez que usamos un ordenador, estamos ejecutando varias aplicaciones que nos permiten
realizarciertastareas.Porejemplo,ennuestrodaada,usamoselcorreoelectrnicoparaenviary
recibircorreos,oelnavegadorparaconsultarpginasenInternet;ambasactividadessonejemplos
deprogramasqueseejecutanenunordenador.
Los programas de ordenador deben resolver un problema, para lo cual debemos utilizar de forma
inteligenteylgicatodosloselementosquenosofreceellenguaje.Poresoesimportanteelegirun
lenguajedeprogramacinconelquenossintamoscmodosporquelodominemossuficientemente
y, por supuesto, porque sepamos que no va a ofrecer limitaciones a la hora de desarrollar
aplicacionesparadiferentesplataformas.
El lenguaje que vamos a utilizar en este mdulo es Java, multiplataforma, robusto y fiable. Un
lenguaje que reduce la complejidad y se considera dentro de los lenguajes modernos orientados a
objetos.Estaunidadnosvamosaadentrarensusintaxis,vamosaconocerlostiposdedatosconlos
quetrabaja,lasoperacionesquetienendefinidascadaunodeellos,utilizandoejemplossencillosque
nosmuestrenlautilidaddetodoloaprendido.
Paraello,vamosatratarsobrecmosealmacenanyrecuperanlosdatosdevariablesycadenasen
Java, y cmo se gestionan estos datos desde el punto de vista de la utilizacin de operadores.
Trabajar con datos es fundamental en cualquier programa. Aunque ya hayas programado en este
lenguaje,chaleunvistazoalcontenidodeestaunidad,porquepodrsrepasarmuchosconceptos.

PARASABERMS

DesarrollodeAplicacionesWeb

Tema2

Ahora que vamos a empezar con la sintaxis de Java, quizs te interese tener a mano la
documentacinqueofrecelapginawebdeOraclesobreJavaSE.LaplataformaJavaSEest
formada principalmente por dos productos: el JDK, que contiene los compiladores y
depuradoresnecesariosparaprogramar,yelJRE,queproporcionalaslibrerasobibliotecas
ylaJVM,entreotraseriedecomponentes.
Puedes consultar informacin de la versin 6 de Java SE, en el siguiente enlace donde
puedesencontrartodaladocumentacinsobreestatecnologa:
EnlacealawebdeOracledondepodrsverinformacinsobrelaplataformaJavaSE.
http://download.oracle.com/javase/6/docs/index.html
Dentro de la documentacin de Oracle sobre Java SE se encuentra el libro The Java
LanguageSpecification.
Este libro est escrito por los inventores del lenguaje, y constituye una referencia tcnica
casi obligada sobre el mismo. Como mucha de la documentacin oficial de Java, se
encuentraeningls.Elenlacedirectoeselsiguiente:
http://java.sun.com/docs/books/jls/index.html

RECOMENDACIN
Acostmbrate a leer y consultar la documentacin sobre la versin de Java que ests
utilizandoentusprogramas.Esoteayudarasabertodaslasposibilidadesquetieneel
lenguaje,ysienunmomentodadoestsutilizandobienunadeterminadacaracterstica.

Creacindemiprimerprograma

DAW

2 Las variables e identificadores


Caso prctico
Mara y Juan han comprobado que una aplicacin informtica es un trabajo de equipo que debe estar
perfectamente coordinado. El primer paso es la definicin de los datos y las variables que se van a
utilizar.
Las decisiones que se tomen pueden afectar a todo el proyecto, en lo referente al rendimiento de la
aplicacin y ahorro de espacio en los sistemas de almacenamiento.
Despus de la ltima reunin del equipo de proyecto ha quedado claro cules son las
especificaciones de la aplicacin a desarrollar. Juan no quiere perder el tiempo y ha comenzado a
preparar los datos que va a usar el programa. Le ha pedido a Mara que vean juntos qu variables y
tipos de datos se van a utilizar, Juan piensa que le vendr bien como primera tarea para
familiarizarse con el entorno de programacin y con el lenguaje en s.

Unprogramamanejadatosparahacerclculos,presentarloseninformesporpantallaoimpresora,
solicitarlos al usuario, guardarlos en disco, etc. Para poder manejar esos datos, el programa los
guardaenvariables.
Una variable es una zona en la memoria del computador con un valor que puede ser almacenado
paraserusadomstardeenelprograma.Lasvariablesvienendeterminadaspor:

unnombre,quepermitealprogramaaccederalvalorquecontieneenmemoria.Debeserun
identificadorvlido.
untipodedato,queespecificaquclasedeinformacinguardalavariableenesazonade
memoria
unrangodevaloresquepuedeadmitirdichavariable.

Alnombrequeledamosalavariableselellamaidentificador.Losidentificadorespermitennombrar
los elementos que se estn manejando en un programa. Vamos a ver con ms detalle ciertos
aspectossobrelosidentificadoresquedebemostenerencuenta.

CITAS PARA PENSAR


Lasgrandesideasrequierenungranlenguaje.Aristfanes.
PARASABERMS
BruceEckeleselautordeloslibrossobreJavayC++,dirigidosaprogramadoresquedesean
aprendersobreestoslenguajesysobrelaprogramacinorientadaaobjetos.Esteescritorha
tenido la buena costumbre de editar sus libros para que puedan descargarse gratis. As,
podemosaccederdeformatotalmentegratuitaalaterceraedicindesulibroThinkingin
Javaenelsiguienteenlace(eningls):
http://www.mindviewinc.com/Books/downloads.html

A partir de ahora es conveniente que utilices algn manual de apoyo para iniciarte a la
programacinenJava.
TeproponemoseldelaseriedeLibrosAprendaInformticacomosiestuvieraenprimero,
delaEscuelaSuperiordeIngenierosIndustrialesdeSanSebastin(UniversidaddeNavarra):
http://mat21.etsii.upm.es/ayudainf/aprendainf/Java/Java2.pdf

2.1Identificadores
UnidentificadorenJavaesunasecuenciailimitadasinespaciosdeletrasydgitosUnicode,deforma
queelprimersmbolodelasecuenciadebeserunaletra,unsmbolodesubrayado(_)oelsmbolo
dlar($).Porejemplo,sonvlidoslossiguientesidentificadores:

DesarrollodeAplicacionesWeb

x5

Tema2

NUM_MAX

numCuenta

En la definicin anterior decimos que un identificador es una secuencia ilimitada de caracteres


Unicode.PeroquesUnicode?Unicodeesuncdigodecaracteresosistemadecodificacin,un
alfabetoquerecogeloscaracteresdeprcticamentetodoslosidiomasimportantesdelmundo.Las
lneasdecdigoenlosprogramasseescribenusandoeseconjuntodecaracteresUnicode.
EstoquieredecirqueenJavasepuedenutilizarvariosalfabetoscomoelGriego,rabeoJapons.De
estaforma,losprogramasestnmsadaptadosaloslenguajeseidiomaslocales,porloquesonms
significativosyfcilesdeentendertantoparalosprogramadoresqueescribenelcdigo,comopara
los que posteriormente lo tienen que interpretar, para introducir alguna nueva funcionalidad o
modificacinenlaaplicacin.
El estndar Unicode originalmente utilizaba 16 bits, pudiendo representar hasta 65.536 caracteres
distintos, que es el resultado de elevar dos a la potencia diecisis. Actualmente Unicode puede
utilizarmsomenosbits,dependiendodelformatoqueseutilice:UTF8,UTF16UTF32.Acada
carcter le corresponde unvocamente un nmero entero perteneciente al intervalo de 0 a 2
elevadoan,siendonelnmerodebitsutilizadospararepresentarloscaracteres.Porejemplo,la
letraeselentero164.Adems,elcdigoUnicodeescompatibleconelcdigoASCII,yaquepara
loscaracteresdelcdigoASCII,Unicodeasignacomocdigolosmismos8bits,alosquelesaadea
laizquierdaotros8bitstodosacero.LaconversindeuncarcterASCIIaUnicodeesinmediata.

RECOMENDACIN
Una buena prctica de programacin es seleccionar nombres adecuados para las
variables, eso ayuda a que el programa se autodocumente, y evita un nmero excesivo de
comentarios para aclarar el cdigo.
PARASABERMS
Enlace para acceder a la documentacin sobre las distintas versiones de Unicode en la
pginaweboficialdelestndar:
http://www.unicode.org/versions/

2.2Normasdeestiloparanombrarvariables
Alahoradenombrarunidentificadorexistenunaseriedenormasdeestilodeusogeneralizadoque,
nosiendoobligatorias,seusanenlamayorpartedelcdigoJava.Estasreglasparalanomenclatura
devariablessonlassiguientes:

Java distingue las maysculas de las minsculas. Por ejemplo, Alumno y alumno son
variablesdiferentes.
Nosesuelenutilizaridentificadoresquecomiencencon$o_,ademselsmbolodel
dlar,porconvenio,noseutilizanunca.
Nosepuedeutilizarelvalorbooleano(trueofalse)nielvalornulo(null).
Los identificadores deben ser lo ms descriptivos posibles. Es mejor usar palabras
completas en vez de abreviaturas crpticas. As nuestro cdigo ser ms fcil de leer y
comprender. En muchos casos tambin har que nuestro cdigo se autodocumente. Por
ejemplo,sitenemosquedarleelnombreaunavariablequealmacenalosdatosdeuncliente

Creacindemiprimerprograma

DAW

sera recomendable que la misma se llamara algo as como FicheroClientes o


ManejadorCliente,ynoalgopocodescriptivocomoCl33.
Ademsde estasrestricciones,enlasiguientetablapuedesverotrasconvenciones,que nosiendo
obligatorias,ssonrecomendablesalahoradecrearidentificadoresenJava.
Identificador

nombredeunaclase

Convencin
Comienzaporletraminscula,
ysitienenmsdeunapalabra
secolocanjuntasyelresto
comenzandopormaysculas
Enletrasmaysculas,
separandolaspalabrasconel
guinbajo,porconvenioel
guinbajonoseutilizaen
ningnotrositio
Comienzaporletramayscula

nombredefuncin

Comienzaconletraminscula

nombredevariable

nombredeconstante

Ejemplo
numAlumnos, suma

TAM_MAX, PI

String, MiTipo
modifica_Valor,
obtiene_Valor

AUTOEVALUACIN:
Un identificador es una secuencia de uno o ms smbolos Unicode que cumple las
siguientes condiciones. Seala la afirmacin correcta.
Todos los identificadores han de comenzar con una letra, el carcter subrayado (_) o el
carcter dlar ($).
No puede incluir el carcter espacio en blanco.
Puede tener cualquier longitud, no hay tamao mximo.
Todas las anteriores son correctas.
Adems, se desaconseja el uso del smbolo dlar, y el guin bajo prcticamente slo se utiliza para separar palabras en
variables de tipo Constante.

2.3Palabrasreservadas
Las palabras reservadas, a veces tambin llamadas palabras clave o keywords, son secuencias de
caracteres formadas con letras ASCII cuyo uso se reserva al lenguaje y, por tanto, no pueden
utilizarseparacrearidentificadores.
LaspalabrasreservadasenJavason:
Abstract
assert
boolean
break
byte
case
catch
char
class
const

continue
default
do
double
else
enum
extends
final
finally
float

for
goto
if
implements
import
instanceof
int
interface
long
native

new
packages
private
protected
public
return
short
static
strictfp
super

switch
ynchronized
this
throw
throws
transient
try
void
volatile
while

DesarrollodeAplicacionesWeb

Tema2

Haypalabrasreservadasquenoseutilizanenlaactualidad,comoeselcasodeconst ygoto,que
apenas se utilizan en la actual implementacin del lenguaje Java. Por otro lado, puede haber otro
tipodepalabrasotextoenellenguajequeaunquenoseanpalabrasreservadastampocosepueden
utilizar para crear identificadores. Es el caso de true y false que, aunque puedan parecer palabras
reservadas, porque no se pueden utilizar para ningn otro uso en un programa, tcnicamente son
literalesbooleanos.Igualmente,nullesconsideradounliteral,nounapalabrareservada.

DESTACADO
Cuando tras haber consultado la documentacin de Java an no tengas seguridad de
cmo funciona alguna de sus caractersticas, prubala en tu ordenador, y analiza cada
mensaje de error que te d el compilador para corregirlo. Busca en foros de Internet
erroressimilaresparaayudartedelaexperienciadeotrosusuariosyusuarias.
Normalmente, los editores y entornos integrados de desarrollo utilizan colores para diferenciar las
palabras reservadas del resto del cdigo, los comentarios, las constantes y literales, etc. De esta
forma se facilita la lectura del programa y la deteccin de errores de sintaxis. Dependiendo de la
configuracindelentornoseutilizarnunoscoloresuotros,esposibleennegro
PuedequeteinteresecambiarloscoloresqueutilizaNetbeansparalasintaxisdetusprogramas,por
ejemplosiquieresqueloscomentariosaparezcanenverdeenlugardeengris,oindicarquetienesla
autoradelosmismos,enlugardequeteaparezcaelnombredeusuariodelsistemaoperativo.

2.4Tiposdevariables.ConstantesI
En un programa nos podemos encontrar distintos tipos de variables. Las diferencias entre una
variableyotradependerndevariosfactores,porejemplo,eltipodedatosquerepresentan,sisu
valorcambiaonoalolargodetodoelprograma,oculeselpapelquellevanacaboenelprograma.
Deestaforma,ellenguajedeprogramacinJavadefinelossiguientestiposdevariables:
a) Variables de tipos primitivos y variables referencia, segn el tipo de informacin que
contengan. En funcin de a qu grupo pertenezca la variable, tipos primitivos o tipos
referenciados,podrtomarunosvaloresuotros,ysepodrndefinirsobreellaunasoperaciones
uotras.
b) Variables y constantes, dependiendo de si su valor cambia o no durante la ejecucin del
programa.Ladefinicindecadatiposera:
Variables.Sirvenparaalmacenarlosdatosdurantelaejecucindelprograma,puedenestar
formadas por cualquier tipo de dato primitivo o referencia. Su valor puede cambiar varias
vecesalolargodetodoelprograma.
Constantesovariablesfinales.Sonaquellasvariablescuyovalornocambiaalolargodetodo
elprograma.
c) Variablesmiembroyvariableslocales,enfuncindellugardondeaparezcanenelprograma.La
definicinconcretasera:
Variables miembro. Son las variables que se crean dentro de una clase (Componente
softwarereutilizableexpresadoentrminosdeatributosycomportamientosomtodos.Los
programadores pueden usar sus propias clases o las incluidas en el lenguaje), fuera de
cualquiermtodo(Elementosdeunaclaseuobjetocompuestosporunaseriedesentencias
quesirvenparadescribirlasaccionesarealizarconesaclaseuobjeto).Puedenserdetipos
primitivos o referencias, variables o constantes. En un lenguaje puramente orientado a
objetoscomoesJava,todosebasaenlautilizacindeobjetos(Losobjetossecreanapartir

Creacindemiprimerprograma

DAW

declases,yrepresentancasosindividualesdeunaclase),loscualessecreanusandoclases.
Enlasiguienteunidadveremoslosdistintostiposdevariablesmiembroquesepuedenusar.
Variableslocales.Sonlasvariablesquesecreanyusandentrodeunmtodoo,engeneral,
dentro de cualquier bloque de cdigo. La variable deja de existir cuando la ejecucin del
bloque de cdigo o el mtodo finaliza. Al igual que las variables miembro, las variables
localestambinpuedenserdetiposprimitivosoreferencias.

AUTOEVALUACIN:
Relaciona los tipos de variables con la caracterstica correspondiente, escribiendo el nmero
asociadoalacaractersticaenelhuecocorrespondiente.
Ejercicioderelacionar
Lasvariables...
Relacin
Tienenlacaractersticadeque
Locales.

Miembro.

Constantes.

1.Unavezinicializadassuvalornuncacambia.

2.Vandentrodeunmtodo.

3.Vandentrodeunaclase.

2.5Tiposdevariables.ConstantesII
El siguiente ejemplo muestra el cdigo para la creacin de varios tipos de variables. Como ya
veremosenapartadosposteriores,lasvariablesnecesitandeclararse,avecesdandounvaloryotras
conunvalorpordefecto.

Esteprogramacreaunaclasequecontienelassiguientesvariables:

Variable constante llamada PI: esta variable por haberla declarado como constante no
podrcambiarsuvaloralolargodetodoelprograma.
Variablemiembrollamadax:Estavariablepertenecealaclaseejemplovariables.La
variablexpuedealmacenarvaloresdeltipoprimitivoint.Elvalordeestavariablepodrser
modificadoenelprograma,normalmentepormediodealgnotromtodoquesecreeenla
clase.
Variable local llamada valorantiguo: Esta variable es local porque est creada dentro
del mtodo obtenerX(). Slo se podr acceder a ella dentro del mtodo donde est
creada,yaquefueradelnoexiste.

DesarrollodeAplicacionesWeb

Tema2

En apartados posteriores veremos cmo darle ms funcionalidad a nuestros programas, mostrar


algnresultadoporpantalla,haceroperaciones,etc.Porelmomento,siejecutaselejemploanterior
simplementemostrarelmensajeGENERACIN CORRECTA,indicandoquetodohaidobienyel
programahafinalizado.

Creando nuestro primer programa

Creacindemiprimerprograma

DAW

10

DesarrollodeAplicacionesWeb

Tema2

3. Los tipos de datos


Caso prctico
Mara ya ha hecho sus pinitos como programadora. Ahora mismo est ayudando a Juan con las
variables y le ha surgido un problema.
El lenguaje se est comportando de una forma extraa, quiero llamar a una variable final y no me
deja Le comenta a Juan.
Claro, eso es porque final es una palabra reservada y ya hemos visto que no la puedes utilizar para
nombrar variables le responde Juan.
Vaya! exclama Mara, es verdad!, y qu otros requisitos debo tener en cuenta a la hora de
declarar las variables?
Pues lo importante es saber qu tipo de informacin hay que guardar, para poder asignarles el tipo
de dato adecuado. Tienes un momento y te lo cuento? le dice Juan

Enloslenguajesfuertementetipados,atododato(constante,variableoexpresin)lecorresponde
untipoqueesconocidoantesdequeseejecuteelprograma.
El tipo limita el valor de la variable o expresin, las operaciones que se pueden hacer sobre esos
valores,yelsignificadodeesasoperaciones.Estoesasporqueuntipodedatonoesmsqueuna
especificacindelosvaloresquesonvlidosparaesavariable,ydelasoperacionesquesepueden
realizarconellos.
Debidoaqueeltipodedatodeunavariableseconocedurantelarevisinquehaceelcompilador
paradetectarerrores,oseaentiempodecompilacin,estalaboresmuchomsfcil,yaquenohay
queesperaraqueseejecuteelprogramaparasaberquvaloresvaaconteneresavariable.Estose
consigue con un control muy exhaustivo de los tipos de datos que se utilizan, lo cual tiene sus
ventajaseinconvenientes,porejemplocuandoseintentaasignarunvalordeuntipo,aunavariable
de otro tipo. Sin embargo, en Java, puede haber conversin entre ciertos tipos de datos, como
veremosposteriormente.
Ahoranoeselmomentodeentrarendetallesobrelaconversindetipos,perosdebemosconocer
conexactituddequtiposdedatosdisponeellenguajeJava.Yahemosvistoquelasvariables,segn
la informacin que contienen, se pueden dividir en variables de tipos primitivos y variables
referencia.Peroquesuntipodedatoprimitivo?Yuntiporeferencia?Estoesloquevamosaver
acontinuacin.LostiposdedatosenJavasedividenprincipalmenteendoscategoras:

Tiposdedatossencillosoprimitivos.Representanvaloressimplesquevienenpredefinidosen
ellenguaje;contienenvaloresnicos,comoporejemplouncarcterounnmero.
Tipos de datos referencia. Se definen con un nombre o referencia (puntero) que contiene la
direccinenmemoriadeunvalorogrupodevalores.Dentrodeestetipotenemosporejemplo
losvectoresoarrays,quesonunaseriedeelementosdelmismotipo,olasclases,quesonlos
modelosoplantillasapartirdeloscualessecreanlosobjetos.

En el siguiente apartado vamos a ver con detalle los diferentes tipos de datos que se engloban
dentrodeestasdoscategoras.

AUTOEVALUACIN:
El tipado fuerte de datos supone que:
A todo dato le corresponde un tipo que es conocido antes de que se ejecute el programa.
El lenguaje hace un control muy exhaustivo de los tipos de datos.

11

Creacindemiprimerprograma

DAW

El compilador puede optimizar mejor el tratamiento de los tipos de datos.


Todas las anteriores son correctas.
En un lenguaje fuertemente tipado se cumplen todas las condiciones anteriores.

3.1TiposdedatosprimitivosI
Los tipos primitivos son aqullos datos sencillos que constituyen los tipos de informacin ms
habituales:nmeros,caracteresyvaloreslgicosobooleanos.Alcontrarioqueenotroslenguajesde
programacinorientadosaobjetos,enJavanosonobjetos.
Una de las mayores ventajas de tratar con tipos primitivos en lugar de con objetos, es que el
compiladordeJavapuedeoptimizarmejorsuuso.Otraimportantecaracterstica,esquecadauno
delostiposprimitivostieneidnticotamaoycomportamientoentodaslasversionesdeJavaypara
cualquier tipo de ordenador. Esto quiere decir que no debemos preocuparnos de cmo se
representarn los datos en distintas plataformas, y asegura la portabilidad de los programas, a
diferencia de lo que ocurre con otros lenguajes. Por ejemplo, el tipo int siempre se representar
con32bits,consigno,yenelformatoderepresentacincomplementoa2,encualquierplataforma
quesoporteJava.
TIPOSDEDATOSPRIMITIVOS
Tipo

Descripcin

Bytes

Rango

128a127
32,768a32,767
2,147,483,648a2,147,483,647
9,223,372,036,854,775,808 a
9,223,372,036,854,775,807
+/1.4E45(+/1.4times1045)a
+/3.4E38(+/3.4times1038)

+/4.9E324(+/4.9times10324)
a+/1.7E308(+/1.7times10308)

byte
short
int

Enteromuycorto
Enterocorto
Entero

1
2
4

long

Enterolargo

float

double

Numeroconpuntoflotantede
precisinindividualconhasta
7dgitossignificativos
Numeroconpuntoflotantede
precisindobleconhasta16
dgitossignificativos

\u0000

char

CarcterUnicode2

Valorpor
default
0
0
0
0L
0.0f

0.0d

\u0000

a
\uFFFF

boolean ValorVerdaderooFalso

trueofalse

public class Example {


public static void main(String[] args) {
//declarar variables
byte mes = 12;
int contador = 0;
double pi = 3.1415926535897932384626433832795;
float interes = 4.25e2F;
char letra = 'Z';
boolean encontrado = true;
//imprimir valores
System.out.println(mes); //imprimir 12
System.out.println(contador); //imprimir 0
System.out.println(pi); //imprimir 3.141592653589793
System.out.println(interes); //imprimir 425.0

12

false

DesarrollodeAplicacionesWeb

System.out.println(letra); //imprimir Z
System.out.println(encontrado); //imprimir true
}
}

Tema2

SABASQU?.
Javaespecificaeltamaoyformatodetodoslostiposdedatosprimitivosconindependenciadela
plataformaosistemaoperativodondeseejecuteelprograma,deformaqueelprogramadornotiene
que preocuparse sobre las dependencias del sistema, y no es necesario escribir versiones distintas
delprogramaparacadaplataforma.

Hayunapeculiaridadenlostiposdedatosprimitivos,yesqueeltipodedatocharesconsiderado
por el compilador como un tipo numrico, ya que los valores que guarda son el cdigo Unicode
correspondiente al carcter que representa, no el carcter en s, por lo que puede operarse con
caracterescomosisetrataradenmerosenteros.
Porotraparte,alahoradeelegireltipodedatoquevamosautilizarqucriterioseguiremospara
elegiruntipodedatouotro?Puesdeberemostenerencuentacmoeslainformacinquehayque
guardar, si es de tipo texto, numrico, y, adems, qu rango de valores puede alcanzar. En este
sentido, hay veces que aunque queramos representar un nmero sin decimales, tendremos que
utilizardatosdetiporeal.
Porejemplo,eltipodedatointnopodrarepresentarlapoblacinmundialdelplaneta,yaqueel
valor mximo que alcanza es de 2.147.483.647, siendo ste el nmero mximo de combinaciones
posiblescon32bits,teniendoencuentaquelarepresentacindelosnmerosenterosenJavautiliza
complemento a 2. Si queremos representar el valor correspondiente a la poblacin mundial del
planeta, cerca de 7 mil millones de habitantes, tendramos que utilizar al menos un tipo de dato
long,osinotenemosproblemasdeespaciountipofloat.
Sinembargo,lostiposrealestienenotroproblema:laprecisin.Vamosavermssobreellosenel
siguienteapartado.

Si quieres obtener informacin sobre cmo se lleva a cabo la representacin interna de


nmerosenterosysobrelaaritmticabinaria,puedesconsultarelsiguienteenlace:
http://platea.pntic.mec.es/~lgonzale/tic/binarios/aritmetica.html

3.2TiposdedatosprimitivosII
Eltipodedatorealpermiterepresentarcualquiernmerocondecimales.Aligualqueocurreconlos
enteros,lamayoradeloslenguajesdefinenmsdeuntipodedatoreal,enfuncindelnmerode
bitsusadopararepresentarlos.Cuantomayorseaesenmero:

Msgrandepodrserelnmerorealrepresentadoenvalorabsoluto
Mayorserlaprecisindelapartedecimal

Entrecadadosnmerosrealescualesquiera,siempretendremosinfinitosnmerosreales,porloque
la mayora de ellos los representaremos de forma aproximada. Por ejemplo, en la aritmtica
convencional, cuando dividimos 10 entre 3, el resultado es 3.3333333, con la secuencia de 3

13

Creacindemiprimerprograma

DAW

repitindoseinfinitamente.Enelordenadorslopodemosalmacenarunnmerofinitodebits,porlo
queelalmacenamientodeunnmerorealsersiempreunaaproximacin.
Losnmerosrealesserepresentanencomaflotante,queconsisteentrasladarlacomadecimalala
primeracifrasignificativadelvalor,conobjetodepoderrepresentarelmximodenmerosposible.
Unnmeroseexpresacomo:

Valor=mantisax2exponente

En concreto, slo se almacena la mantisa y el exponente al que va elevada la base. Los bits
empleados por la mantisa representan la precisin del nmero real, es decir, el nmero de cifras
decimales significativas que puede tener el nmero real, mientras que los bits del exponente
expresan la diferencia entre el mayor y el menor nmero representable, lo que viene a ser el
intervaloderepresentacin.
EnJavalasvariablesdetipofloatseempleanpararepresentarlosnmerosencomaflotantede
simpleprecisinde32bits,deloscuales24sonparalamantisay8paraelexponente.Lamantisaes
unvalorentre1.0y1.0yelexponenterepresentalapotenciade2necesariaparaobtenerelvalor
quesequiererepresentar.Porsuparte,lasvariablestipodoublerepresentanlosnmerosencoma
flotantededobleprecisinde64bits,deloscuales53sonparalamantisay11paraelexponente.
La mayora de los programadores en Java emplean el tipo double cuando trabajan con datos de tipo
real, es una forma de asegurarse de que los errores cometidos por las sucesivas aproximaciones
sean menores. De hecho, Java considera los valores en coma flotante como de tipo double por
defecto.

Con el objetivo de conseguir la mxima portabilidad de los programas, Java utiliza el estndar
internacionalIEEE754paralarepresentacininternadelosnmerosencomaflotante,queesuna
formadeasegurarsedequeelresultadodelosclculosseaelmismoparadiferentesplataformas.

PARASABERMS
La siguiente pgina es la web oficial sobre el estndar internacional IEEE 7542008 para
representacindenmerosencomaflotante(eningls):
http://grouper.ieee.org/groups/754/
AUTOEVALUACIN:
Relaciona los tipos primitivos con los bits y rango de valores correspondientes,
escribiendo el nmero asociado en el hueco correspondiente.
Ejercicio de relacionar
Tipo Relacin
Caracterstica
short

Coma flotante de 64 bits, usando la representacin IEE754-2008

byte

Entero de 32 bits, rango de valores de -2.147.483.648 (-231) a 2.147.483.647


(+231-1)

double

Entero de 16 bits, rango de valores de -32.768 (-215) a +32.767 (+215-1)

long

Coma flotante de 32 bits, usando la representacin IEEE 745-2008

int

Entero de 8 bits, rango de valores de -128 (-27) a +127 (+27-1)

float

Entero de 64 bits, rango de valores de -9.223.372.036.854.775.808 (-263)


a 9.223.372.036.854.775.807 (+263-1)

Adems de los anteriores, tambin son tipos primitivos el tipo de dato boolean, con valores true y false, y el tipo de datos
char, que almacena el cdigo Unicode de un carcter.

14

DesarrollodeAplicacionesWeb

Tema2

3.3Declaracineinicializacin
Llegadosaestepuntocabepreguntarnoscmosecreanlasvariablesenunprograma?Qudebo
hacerantesdeusarunavariableenmiprograma?Puesbien,comopodrsimaginar,debemoscrear
las variables antes de poder utilizarlas en nuestros programas, indicando qu nombre va a tener y
qutipodeinformacinvaaalmacenar,endefinitiva,debemosdeclararlavariable.
Las variables se pueden declarar en cualquier bloque de cdigo, dentro de llaves. Y lo hacemos
indicandosuidentificadoryeltipodedato,separadasporcomassivamosadeclararvariasalavez,
porejemplo:
int numAlumnos = 15;
double radio = 3.14, importe = 102.95;
De esta forma, estamos declarando numAlumnos como una variable de tipo int, y otras dos
variables radio e importe de tipo double. Aunque no es obligatorio, hemos aprovechado la
declaracindelasvariablesparainicializarlasalosvalores15,3.14y102.95respectivamente.
Silavariablevaapermanecerinalterablealolargodelprograma,ladeclararemoscomoconstante,
utilizandolapalabrareservadafinaldelasiguienteforma:
final double PI = 3.1415926536;
Enocasionespuedequealdeclararunavariablenoledemosvalor,qucreesqueocurreenestos
casos?Puesqueelcompiladorleasignaunvalorpordefecto,aunquedependedeltipodevariable
quesetrate:

Lasvariablesmiembrosseinicializan automticamente,sinolesdamosunvalor.Cuando
sondetiponumrico,seinicializanpordefectoa0,sidondetipocarcter,seinicializanal
carcternull(\0),sisondetipobooleanselesasignaelvalorpordefectofalse,ysison
tiporeferenciadoseinicializananull.
Las variables locales no se inicializan automticamente. Debemos asignarles nosotros un
valorantesdeserusadas,yaquesielcompiladordetectaquelavariableseusaantesdeque
seleasigneunvalor,produceunerror.Porejemploenestecaso:
int p;
int q = p; // error

Ytambinenesteotro,yaqueseintentausarunavariablelocalquepodranohaberseinicializado:
int p;
if (. . . )
p = 5 ;
int q = p; // error
Enelejemploanteriorlainstruccinifhacequesisecumplelacondicinquehayentreparntesis
(cualquieraqueindiquemos),entonceselprogramaasignarelvalor5alavariablep;sinosecumple
lacondicin,pquedarsininicializar.Perosipnosehainicializado,notendravalorparaasignrselo
aq.
Porello,elcompiladordetectaeseposibleproblemayproduceunerrordeltipoLavariablepodra
nohabersidoinicializada,independientementedesisecumpleonolacondicindelif.

15

Creacindemiprimerprograma

DAW

AUTOEVALUACIN:
De las siguientes, seala cul es la afirmacin correcta:
La declaracin de una variable consiste bsicamente en indicar el tipo que va a tener
seguido del nombre y su valor.
Java no tiene restriccin de tipos.
Todos los tipos tienen las mismas operaciones a realizar con ellos: suma, resta,
multiplicacin, etc.
Todas las anteriores son incorrectas.
Nada de lo afirmado sobre declaracin de variables, tipado de datos y operaciones es correcto.

3.4Tiposreferenciados
Apartirdelosochotiposdatosprimitivos,sepuedenconstruirotrostiposdedatos.Estostiposde
datossellamantiposreferenciadosoreferencias,porqueseutilizanparaalmacenarladireccinde
losdatosenlamemoriadelordenador.
int[] arrayDeEnteros;
Cuenta cuentaCliente;
Enlaprimerainstruccindeclaramosunalistadenmerosdelmismotipo,enestecaso,enteros.En
la segunda instruccin estamos declarando la variable u objeto cuentaCliente como una referencia
detipoCuenta.
ComocomentbamosalprincipiodelapartadodeTiposdedatos,cualquieraplicacindehoyenda
necesitanoperderdevistaunaciertacantidaddedatos.Cuandoelconjuntodedatosutilizadotiene
caractersticassimilaressesuelenagruparenestructurasparafacilitarelaccesoalosmismos,sonlos
llamadosdatosestructurados.
Sondatosestructuradoslosarrays,listas,rboles,etc.Puedenestarenlamemoriadelprogramaen
ejecucin,guardadoseneldiscocomoficheros,oalmacenadosenunabasededatos.
Adems de los ocho tipos de datos primitivos que ya hemos descrito, Java proporciona un
tratamientoespecialalostextosocadenasdecaracteresmedianteeltipodedatoString.Javacrea
automticamente un nuevo objeto de tipo String cuando se encuentra una cadena de caracteres
encerradaentrecomillasdobles.Enrealidadsetratadeobjetos,yportantosontiposreferenciados,
perosepuedenutilizardeformasencillacomosifueranvariablesdetiposprimitivos:
String mensaje;
mensaje= "El primer programa";
Hemos visto qu son las
variables,cmosedeclaran
y los tipos de datos que
pueden
adoptar.
Anteriormentehemosvisto
un ejemplo de creacin de
variables, en esta ocasin
vamos a crear ms

16

DesarrollodeAplicacionesWeb

Tema2

variables, pero de distintos tipos primitivos y los vamos a mostrar por pantalla. Los tipos
referenciadoslosveremosenlasiguienteunidad.
Para mostrar por pantalla un mensaje utilizamos System.out, conocido como la salida estndar
delprograma.Estemtodoloquehaceesescribirunconjuntodecaracteresatravsdelalneade
comandos.EnNetbeansestalneadecomandosapareceenlaparteinferiordelapantalla.Podemos
utilizar System.out.print o System.out.println. En el segundo caso lo que hace el
mtodoesquejustodespusdeescribirelmensaje,sitaelcursoralprincipiodelalneasiguiente.
Eltextoencolorgrisqueapareceentrecaracteres//soncomentariosquepermitendocumentarel
cdigo,peronosontenidosencuentaporelcompiladory,portanto,noafectanalaejecucindel
programa.

3.5Tiposenumerados
Lostiposdedatosenumeradossonunaformadedeclararunavariableconunconjuntorestringido
de valores. Por ejemplo, los das de la semana, las estaciones del ao, los meses, etc. Es como si
definiramosnuestropropiotipodedatos.
Laformadedeclararlosesconlapalabrareservadaenum,seguidadelnombredelavariableylalista
de valores que puede tomar entre llaves. A los valores que se colocan dentro de las llaves se les
consideracomoconstantes,vanseparadosporcomasydebenservaloresnicos.
La lista de valores se coloca entre llaves, porque un tipo de datos enum no es otra cosa que una
especiedeclaseenJava,ytodaslasclasesllevansucontenidoentrellaves.
Al considerar Java este tipo de datos como si de una clase se tratara, no slo podemos definir los
valoresdeuntipoenumerado,sinoquetambinpodemosdefiniroperacionesarealizarconlyotro
tipo de elementos, lo que hace que este tipo de dato sea ms verstil y potente que en otros
lenguajesdeprogramacin.
CITASPARAPENSAR
Oigoyolvido.Veoyrecuerdo.Hagoycomprendo.Proverbiochino.
En el siguiente ejemplo puedes comprobar el uso que se hace de los tipos de datos enumerados.
TenemosunavariableDiasquealmacenalosdasdelasemana.Paraaccederacadaelementodel
tipo enumerado se utiliza el nombre de la variable seguido de un punto y el valor en la lista. Ms
tarde veremos que podemos aadir mtodos y campos o variables en la declaracin del tipo
enumerado,yaquecomohemoscomentadountipoenumeradoenJavatieneelmismotratamiento
quelasclases.
En este ejemplo hemos utilizado el mtodo System.out.print. Como podrs comprobar si lo
ejecutas,
la
instruccinnmero18
escribe el texto que
tiene entre comillas
pero no salta a la
siguiente lnea, por lo
que la instruccin

17

Creacindemiprimerprograma

nmero19escribejustoacontinuacin.

DAW

Sinembargo,tambinpodemosescribirvariaslneasusandounanicasentencia.Aslohacemosen
la instruccin nmero 20, la cual imprime como resultado tres lneas de texto. Para ello hemos
utilizado un carcter especial, llamado carcter escape (\). Este carcter sirve para darle ciertas
rdenes al compilador, en lugar de que salga impreso en pantalla. Despus del carcter de escape
vieneotrocarcterqueindicalaordenarealizar,juntosrecibenelnombredesecuenciadeescape.
Lasecuenciadeescape\nrecibeelnombredecarcterdenuevalnea.Cadavezqueelcompilador
se encuentra en un texto ese carcter, el resultado es que mueve el cursor al principio de la lnea
siguiente.Enelprximoapartadovamosaveralgunasdelassecuenciasdeescapemsutilizadas.

18

DesarrollodeAplicacionesWeb

Tema2

4. Literales de los tipos primitivos


CASO
Ada se encuentra con Mara y Juan.
Cmo van esos avances con Java? Juan sabe lo que significa eso, Ada se interesa por el
trabajo que estn llevando a cabo. Ya tienen claro qu tipos de datos utilizar, pero necesitan
cerciorarse de los valores que pueden almacenar esos tipos de datos, es decir, qu literales pueden
contener, para estar seguros que han hecho la eleccin adecuada.
Muy bien contesta Juan. Si quieres te hacemos una demostracin para que veas la estructura
del programa.
A Ada le satisface la eficacia con que trabajan Mara y Juan, apenas ha comenzado con el proyecto
y pronto podr ver resultados inmediatos.

Unliteral,valorliteraloconstanteliteralesunvalorconcretoparalostiposdedatosprimitivosdel
lenguaje, el tipo String o el tipo null. Los literales booleanos tienen dos nicos valores que
puedeaceptareltipo:
trueyfalse.Porejemplo,conlainstruccinbooleanencontrado=true;estamosdeclarando
unavariabledetipobooleanaalacualleasignamoselvalorliteraltrue.
Losliteralesenterossepuedenrepresentarentresnotaciones:

Decimal:porejemplo20.Eslaformamscomn.
Octal: por ejemplo 024. Un nmero en octal siempre empieza por cero, seguido de dgitos
octales(del0al7).
Hexadecimal: por ejemplo 0x14. Un nmero en hexadecimal siempre empieza por 0x
seguidodedgitoshexadecimales(del0al9,delaaalafodelaAalaF).

LasconstantesliteralesdetipolongseledebeaadirdetrsunalL,porejemplo873L,sinose
considerapordefectodetipoint.SesueleutilizarLparaevitarlaconfusindelaeleminsculacon
1.
Losliteralesrealesoencomaflotanteseexpresanconcomadecimaloennotacincientfica,osea,
seguidosdeunexponenteeE.ElvalorpuedefinalizarseconunafounaFparaindicaelformato
float o con una d o una D para indicar el formato double (por defecto es double). Por
ejemplo, podemos representar un mismo literal real de las siguientes formas: 13.2, 13.2D,
1.32e1, 0.132E2. Otras constantes literales reales son por ejemplo: .54, 31.21E-5, 2.f,
6.022137e+23f,3.141e-9d.
Unliteralcarcterpuedeescribirsecomouncarcterentrecomillassimplescomo'a','','Z','p',etc.
oporsucdigodelatablaUnicode,anteponiendolasecuenciadeescape\sielvalorloponemos
enoctalo\usiponemoselvalorenhexadecimal.Porejemplo,sisabemosquetantoenASCIIcomo
en Unicode, la letra A (mayscula) es el smbolo nmero 65, y que 65 en octal es 101 y 41 en
hexadecimal, podemos representar esta letra como '\101' en octal y '\u0041' en hexadecimal.
Existenunoscaracteresespecialesqueserepresentanutilizandosecuenciasdeescape:
Secuenciadeescape
\b
\t
\n
\f

Significado
Retroceso
Tabulador
Saltodelnea
Saltodepgina

Secuenciadeescape
\r
\
\
\\

Significado
Retornodecarro
Carctercomillasdobles
Carctercomillassimples
Barradiagonal
19

Creacindemiprimerprograma

DAW

Normalmente, los objetos en Java deben ser creados con la orden new. Sin embargo, los literales
String no lo necesitan ya que son objetos que se crean implcitamente por Java.

Los literales de cadenas de caracteres se indican entre comillas dobles. En el ejemplo anterior El
primerprogramaesunliteraldetipocadenadecaracteres.Alconstruirunacadenadecaracteresse
puedeincluircualquiercarcterUnicodeexceptouncarcterderetornodecarro,porejemploenla
siguiente instruccin utilizamos la secuencia de escape \ para escribir dobles comillas dentro del
mensaje:
String texto = "Juan dijo: \"Hoy hace un da fantstico\"";
En el ejemplo anterior de tipos enumerados ya estbamos utilizando secuencias de escape, para
introducirunsaltodelneaenunacadenadecaracteres,utilizandoelcarcterespecial\n.

20

DesarrollodeAplicacionesWeb

Tema2

5. Operadores y expresiones.
CASO
Mara y Juan tienen definidas las variables y tipos de datos a utilizar en la aplicacin. Es el momento
de ponerse a realizar los clculos que permitan manipular esos datos, sumar, restar, multiplicar,
dividir y mucho ms. En definitiva se trata de llevar los conocimientos matemticos al terreno de la
programacin, ver cmo se pueden hacer operaciones aritmticas, lgicas o de comparacin en el
lenguaje Java.
Tambin necesitarn algn operador que permita evaluar una condicin y decidir las acciones a
realizar en cada caso. Es importante conocer bien cmo el lenguaje evala esas expresiones, en
definitiva, cul es la precedencia que tiene cada operador.

Losoperadoresllevanacabooperacionessobreunconjuntodedatosuoperandos,representados
por literales y/o identificadores. Los operadores pueden ser unarios, binarios o terciarios, segn el
nmero de operandos que utilicen sean uno, dos o tres, respectivamente. Los operadores actan
sobrelostiposdedatosprimitivosydevuelventambinuntipodedatoprimitivo.
Los operadores se combinan con los literales y/o identificadores para formar expresiones. Una
expresin es una combinacin de operadores y operandos que se evala produciendo un nico
resultadodeuntipodeterminado.
Elresultadodeunaexpresinpuedeserusadocomopartedeotraexpresinoenunasentenciao
instruccin.Lasexpresiones,combinadasconalgunaspalabrasreservadasoporsmismas,forman
lasllamadassentenciasoinstrucciones.
Porejemplo,pensemosenlasiguienteexpresinJava:
i + 1
Con esta expresin estamos utilizando un operador aritmtico para sumarle una cantidad a la
variablei,peroesnecesarioindicaralprogramaquhacerconelresultadodedichaexpresin:
suma = i + 1;
Queloalmaceneenunavariablellamadasuma,porejemplo.Enestecasoyatendramosunaaccin
completa,esdecir,unasentenciaoinstruccin.
Msejemplosdesentenciasoinstruccioneslostenemosenlasdeclaracionesdevariables,vistasen
apartados anteriores, o en las estructuras bsicas del lenguaje como sentencias condicionales o
bucles,queveremosenunidadesposteriores.
Como curiosidad comentar que las expresiones de asignacin, al poder ser usadas como parte de
otrasasignacionesuoperaciones,sonconsideradastantoexpresionesensmismascomosentencias.

CITAS PARA PENSAR


Lo que no hemos realizado no es ms que lo que todava no hemos intentado hacer.
AlexisdeTocqueville.

5.1Operadoresaritmticos
Los operadores aritmticos son aquellos operados que combinados con los operandos forman
expresionesmatemticasoaritmticas.

21

Creacindemiprimerprograma

Operador
OperacinJava
ExpresinJava Resultado

Operadorunariodecambiodesigno
10
10
+
Adicin
1.2+9.3
10.5

Sustraccin
312.512.3
300.2
*
Multiplicacin
1.7*1.2
1.02
/
Divisin(enteraoreal)
0.5/0.2
2.5
%
Restodeladivisinentera
25%3
1
Elresultadodeestetipodeexpresionesdependedelosoperandosqueutilicen:

DAW

Tipodelosoperandos
Resultado
Unoperandodetipolongyningunoreal(floatodouble)
long
Ningnoperandodetipolongnireal(floatodouble)
int
Almenosunoperandodetipodouble
double
Almenosunoperandodetipofloatyningunodouble
float
Otro tipo de operadores aritmticos son los operadores unarios incrementales y decrementales.
Producenunresultadodelmismotipoqueeloperando,ypodemosutilizarlosconnotacinprefija,si
eloperadorapareceantesqueeloperando,onotacinpostfija,sieloperadoraparecedespusdel
operando.Enlatablapuedesverunejemplodeutilizacindecadaoperadorincremental.
Tipooperador
++(incremental)

ExpresinJava
Prefija:
x=3;
y=++x;
//xvale4eyvale4

(decremental)

5//elresultadoes4

Postfija:
x=3;
y=x++;
//xvale4eyvale3

En el ejemplo vemos un programa bsico que utiliza operadores aritmticos. Observa que usamos
System.out.printf para mostrar por pantalla un texto formateado. El texto entre dobles
comillasson losargumentosdelmtodoprintfy siusamosmsdeuno,seseparanconcomas.
Primero indicamos cmo queremos que salga el texto, y despus el texto que queremos mostrar.
Fjate que con el primer %s nos estamos refiriendo a una variable de tipo String, o sea, a la
primeracadenadetexto,conelsiguiente%salasegundacadenayconelltimo%salatercera.Con
%fnosreferimosaunargumentodetipofloat,etc.

5.2Operadoresdeasignacin
Elprincipaloperadordeestacategoraeseloperadorasignacin=,quepermitealprogramadarle
unvaloraunavariable,yqueyahemosutilizadoenvariasocasionesenestaunidad.Ademsdeeste
operador, Java proporciona otros operadores de asignacin combinados con los operadores
aritmticos,quepermitenabreviaroreducirciertasexpresiones.

22

DesarrollodeAplicacionesWeb

Tema2

Porejemplo,eloperador+=sumaelvalordelaexpresinaladerechadeloperadorconelvalordela
variable que hay a la izquierda del operador, y almacena el resultado en dicha variable. En la
siguientetablasemuestrantodoslosoperadoresdeasignacincompuestosquepodemosutilizaren
Java
Operador EjemploenJava Expresinequivalente
+=
op1+=op2
op1=op1+op2
=
op1=op2
op1=op1op2
*=
op1*=op2
op1=op1*op2
/=
op1/=op2
op1=op1/op2
%=
op1%=op2
op1=op1%op2
Unejemplodeoperadoresdeasignacincombinadoslotenemosacontinuacin:

Parasaberms
En el siguiente enlace tienes informacin interesante sobre cmo se pueden utilizar los
caracteresespecialesincluidosenlaordenprintf(eningls):
http://www.java2s.com/Tutorial/Java/0120__Development/UsingJavasprintfMethod.htm

5.3Operadorcondicional
Eloperadorcondicional?:sirveparaevaluarunacondicinydevolverunresultadoenfuncindesi
esverdaderaofalsadichacondicin.EselnicooperadorternariodeJava,ycomotal,necesitatres
operandosparaformarunaexpresin.
Elprimeroperandosesitaalaizquierdadelsmbolodeinterrogacin,ysiempreserunaexpresin
booleana, tambin llamada condicin. El siguiente operando se sita a la derecha del smbolo de
interrogacin y antes de los dos puntos, y es el valor que devolver el operador condicional si la
condicinesverdadera.Elltimooperando,queaparecedespusdelosdospuntos,eslaexpresin
cuyoresultadosedevolversilacondicinevaluadaesfalsa.
condicin ? exp1 : exp2
Porejemplo,enlaexpresin:
(x>y)?x:y;
Seevalalacondicindesixesmayorquey,encasoafirmativosedevuelveelvalordelavariable
x,yencasocontrariosedevuelveelvalordey.

23

Creacindemiprimerprograma

DAW

El operador condicional se puede sustituir por la sentencia ifthenelse que veremos en la


siguienteunidaddeEstructurasdecontrol.

CITAS PARA PENSAR.


La buena escritura debe ser concisa. Una oracin no debe contener palabras
innecesarias,unprrafonodebeconteneroracionesinnecesarias.
WilliamStrunk,Jr.

5.4Operadoresderelacin
Losoperadoresrelacionalesseutilizanparacomparardatosdetipoprimitivo(numrico,carctery
booleano).Elresultadoseutilizaren otrasexpresionesosentencias,que ejecutarnunaaccin u
otraenfuncindesisecumpleonolarelacin.
EstasexpresionesenJavadansiemprecomoresultadounvalorbooleanotrueofalse.Enlatabla
siguienteaparecenlosoperadoresrelacionalesenJava.
Operador EjemploenJava Significado
==
op1==op2
op1igualaop2
!=
op1!=op2
op1distintodeop2
>
op1>op2
op1mayorqueop2
<
op1<op2
op1menorqueop2
>=
op1>=op2
op1mayoroigualqueop2
<=
op1<=op2
op1menoroigualqueop2
Hastaahorahemosvistoejemplosquecreabanvariablesyseinicializabanconalgnvalor.Peroysi
loquequeremosesqueelusuariointroduzcaunvaloralprograma?
Entonces debemos agregarle interactividad a nuestro programa, por ejemplo utilizando la clase
Scanner.
Aunque no hemos visto todava qu son las
clases y los objetos, de momento vamos a
pensarquelaclaseScannernosvaapermitir
leer los datos que se escriben por teclado, y
que para usarla es necesario importar el
paquetedeclasesquelacontiene.Elcdigodel
ejemplo lo tienes a continuacin. El programa
sequedaresperandoaqueelusuarioescriba
algoeneltecladoypulselateclaintro.Enese
momento se convierte lo ledo a un valor del
tipo int y lo guarda en la variable indicada.
Ademsdelosoperadoresrelacionales,eneste
ejemplo utilizamos tambin el operador
condicional,quecomparasilosnmerossoniguales.Siloson,devuelvelacadenaigualesysino,la
cadenadistintos.

AUTOEVALUACIN:
Seala cules son los operadores relacionales en Java.
= =, ! =, >, <, > =, < =.

==, =!, >, <, =>, =<.

=, !=, >, <, >=, <=.

==, !=, >, <, >=, <=.


Tienes claro cules son los operadores relacionales en Java.

24

DesarrollodeAplicacionesWeb

Tema2

5.5Operadoreslgicos
Los operadores lgicos realizan operaciones sobre valores booleanos, o resultados de expresiones
relacionales,dandocomoresultadounvalorbooleano.
Los operadores lgicos los podemos ver en la tabla que se muestra a continuacin. Existen ciertos
casosenlosqueelsegundooperandodeunaexpresinlgicanoseevalaparaahorrartiempode
ejecucin, porque con el primero ya es suficiente para saber cul va a ser el resultado de la
expresin.
Porejemplo,enlaexpresina && bsiaesfalso,nosesiguecomprobandolaexpresin,puesto
queyasesabequelacondicindequeambosseanverdaderonosevaacumplir.Enestoscasoses
ms conveniente colocar el operando ms propenso a ser falso en el lado de la izquierda. Igual
ocurreconeloperador||,encuyocasoesmsfavorablecolocareloperandomspropensoaser
verdaderoenelladoizquierdo.
Operador
!
&
|
^
&&
||

EjemploenJava
!op
op1&op2
op1|op2
op1^op2
op1&&op2
op1||op2

Significado
Devuelvetruesieloperandoesfalseyviceversa.
Devuelvetruesiop1yop2sontrue
Devuelvetruesiop1uop2sontrue
Devuelvetruesislounodelosoperandosestrue
Igualque&,perosiop1esfalseyanoseevalaop2
Igualque|,perosiop1estrueyanoseevalaop2

Enelsiguientecdigo
puedes
ver
un
ejemplodeutilizacin
de
operadores
lgicos:

5.6Operadoresdebits
Losoperadoresaniveldebitssecaracterizanporquerealizanoperacionessobrenmerosenteros(o
char)ensurepresentacinbinaria,esdecir,sobrecadadgitobinario.
EnlatablatieneslosoperadoresaniveldebitsqueutilizaJava.

25

Creacindemiprimerprograma

DAW

Operador EjemploenJava Significado


~
~op
Realizaelcomplementobinariodeop(invierteelvalordecadabit)
&
op1&op2
RealizalaoperacinANDbinariasobreop1yop2
|
op1|op2
RealizalaoperacinORbinariasobreop1yop2
^
op1^op2
RealizalaoperacinORexclusivo(XOR)binariasobreop1yop2
<<
op1<<op2
Desplazaop2veceshacialaizquierdalosbitsdeop1
>>
op1>>op2
Desplazaop2veceshacialaderechalosbitsdeop1
>>>
op1>>>op2
Desplazaop2(enpositivo)veceshacialaderechalosbitsdeop1

PARASABERMS
Los operadores de bits raramente los vas a utilizar en tus aplicaciones de gestin. No
obstante, si sientes curiosidad sobre su funcionamiento, puedes ver el siguiente enlace
dedicadoaestetipodeoperadores:
http://www.zator.com/Cpp/E4_9_3.htm

5.7Trabajoconcadenas
YahemosvistoenelapartadodeliteralesqueelobjetoStringsecorrespondeconunasecuencia
decaracteresentrecomillados,comoporejemplohola.EsteliteralsepuedeutilizarenJavacomo
sideuntipodedatosprimitivosetratase,y,comocasoespecial,nonecesitalaordennewparaser
creado.
Nosetrataaqudequenosadentremosenloqueesunaclaseuobjeto,puestoqueloveremosen
unidades posteriores, y trabajaremos mucho sobre ello. Aqu slo vamos a utilizar determinadas
operacionesquepodemosrealizarconelobjetoString,yloversmuchomsclaroconejemplos
descriptivos.
Para aplicar una operacin a una variable de tipo String, escribiremos su nombre seguido de la
operacin, separados por un punto. Entre las principales operaciones que podemos utilizar para
trabajarconcadenasdecaracteresestnlassiguientes:

26

Creacin.Comohemosvistoenelapartadodeliterales,podemoscrearunavariabledetipo
String simplemente asignndole una cadena de caracteres encerrada entre comillas
dobles.
Obtencin de longitud. Si necesitamos saber la longitud de un String, utilizaremos el
mtodolength().
Concatenacin.Seutilizaeloperador+oelmtodoconcat()paraconcatenarcadenasde
caracteres.
Comparacin. El mtodo equals() nos devuelve un valor booleano que indica si las
cadenascomparadassononoiguales.ElmtodoequalsIgnoreCase()hacelopropio,
ignorandolasmaysculasdelascadenasaconsiderar.
Obtencindesubcadenas.Podemosobtenercadenasderivadasdeunacadenaoriginalcon
el mtodo substring(), al cual le debemos indicar el inicio y el fin de la subcadena a
obtener.
Cambio a maysculas/minsculas. Los mtodos toUpperCase() y toLowerCase()
devuelvenunanuevavariablequetransformaenmaysculasominsculas,respectivamente,
lavariableinicial.
Valueof. Utilizaremos este mtodo para convertir un tipo de dato primitivo (int, long,
float,etc.)aunavariabledetipoString.

DesarrollodeAplicacionesWeb

Tema2

A continuacin varios ejemplos de las distintas operaciones que podemos realizar con cadenas de
caracteresoStringenJava:

5.8Precedenciadeoperadores
El orden de precedencia de los operadores determina la secuencia en que deben realizarse las
operacionescuandoenunaexpresinintervienenoperadoresdedistintotipo.
LasreglasdeprecedenciadeoperadoresqueutilizaJavacoincidenconlasreglasdelasexpresiones
dellgebraconvencional.Porejemplo:

Lamultiplicacin,divisinyrestodeunaoperacinseevalanprimero.
Si dentro de la misma expresin tengo varias operaciones de este tipo, empezar
evalundolasdeizquierdaaderecha.

Lasumaylarestaseaplicandespusquelasanteriores.Delamismaforma,sidentrodela
mismaexpresintengovariassumasyrestasempezarevalundolasdeizquierdaaderecha.

Alahoradeevaluarunaexpresinesnecesariotenerencuentalaasociatividaddelosoperadores.
Laasociatividadindicaquoperadorseevalaantes,encondicionesdeigualdaddeprecedencia.Los
operadoresdeasignacin,eloperadorcondicional(?:),losoperadoresincrementales(++,--)yel
casting son asociativos por la derecha. El resto de operadores son asociativos por la izquierda, es
decir,queseempiezanacalcularenelmismoordenenelqueestnescritos:deizquierdaaderecha.
Porejemplo,enlaexpresinsiguiente:
10 / 2 * 5
Realmentelaoperacinqueserealizaes(10 / 2 ) * 5,porqueambosoperadores,divisiny
multiplicacin,tienenigualprecedenciayportantoseevalaprimeroelqueantesnosencontramos
por la izquierda, que es la divisin. El resultado de la expresin es 25. Si fueran asociativos por la
derecha, puedes comprobar que el resultado sera diferente, primero multiplicaramos 2 * 5 y
luegodividiramosentre10,porloqueelresultadosera1.Enestaotraexpresin:
x = y = z = 1

27

Creacindemiprimerprograma

DAW

Realmentelaoperacinqueserealizaesx = (y = (z = 1)).Primeroasignamoselvalorde1a
lavariablez,luegoalavariabley,paraterminarasignandoelresultadodeestaltimaasignacina
x.Sieloperadorasignacinfueraasociativoporlaizquierdaestaoperacinnosepodrarealizar,ya
queintentaramosasignaraxelvalordey,peroyannohabrasidoinicializada.
En la tabla se detalla el orden de precedencia y la asociatividad de los operadores que hemos
comentadoenesteapartado.Losoperadoressemuestrandemayoramenorprecedencia.
Operador
++
+++(cast)!~
*/%
+
<<>>>>>
<<=>>=
==!=
&
^
|
&&
||
?:
=+==*=/=%=

Tipo
Unario,notacinpostfija
Unario,notacinprefija
Aritmticos
Aritmticos
Bits
Relacionales
Relacionales
Lgico,Bits
Lgico,Bits
Lgico,Bits
Lgico
Lgico
Operadorcondicional
Asignacin

Asociatividad
Derecha
Derecha
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Derecha
Derecha

REFLEXIONA.
Creesqueesunabuenaprcticadeprogramacinutilizarparntesisenexpresionesaritmticas
complejas,ancuandonoseannecesarios?
Elusodeparntesis,inclusocuandonosonnecesarios,puedehacermsfcildeleerlasexpresiones
aritmticascomplejas.

28

DesarrollodeAplicacionesWeb

Tema2

6. Conversin de tipo.
CASO
Mara ha avanzado mucho en sus conocimientos sobre Java y ha contado con mucha ayuda por
parte de Juan. Ahora mismo tiene un problema con el cdigo, y le comenta Estoy atrancada en el
cdigo. Tengo una variable de tipo byte y quiero asignarle un valor de tipo int, pero el compilador me
da un error de posible prdida de precisin t sabes qu significa eso?. Claro le contesta Juan,
es un problema de conversin de tipos, para asignarle el valor a la variable de tipo byte debes
hacer un casting. Ah! dice Mara, y cmo se hace eso?

Imaginaquequeremosdividirunnmeroentreotrotendrdecimaleselresultadodeesadivisin?
Podemos pensar que siempre que el denominador no sea divisible entre el divisor, tendremos un
resultadocondecimales,peronoesas.Sieldenominadoryeldivisorsonvariablesdetipoentero,el
resultadoserenteroynotendrdecimales.Paraqueelresultadotengadecimalesnecesitaremos
hacerunaconversindetipo.
Lasconversionesdetiposerealizanparahacerqueelresultadodeunaexpresinseadeltipoque
nosotrosdeseamos,enelejemploanteriorparahacerqueelresultadodeladivisinseadetiporeal
y,porende,tengadecimales.Existendostiposdeconversiones:

Conversiones automticas. Cuando a una variable de un tipo se le asigna un valor de otro


tiponumricoconmenosbitsparasurepresentacin,serealizaunaconversinautomtica.
Enesecaso,elvalorsedicequeespromocionadoaltipomsgrande(eldelavariable),para
poderhacerlaasignacin.Tambinserealizanconversionesautomticasenlasoperaciones
aritmticas, cuando estamos utilizando valores de distinto tipo, el valor ms pequeo se
promocionaalvalormsgrande,yaqueeltipomayorsiemprepodrrepresentarcualquier
valordeltipomenor(porejemplo,deintalongodefloatadouble).
Conversionesexplcitas.Cuandohacemosunaconversindeuntipoconmsbitsauntipo
con menos bits. En estos casos debemos indicar que queremos hacer la conversin de
maneraexpresa,yaquesepuedeproducirunaprdidadedatosyhemosdeserconscientes
de ello. Este tipo de conversiones se realiza con el operador cast. El operador cast es un
operadorunarioqueseformacolocandodelantedelvaloraconvertireltipodedatoentre
parntesis. Tiene la misma precedencia que el resto de operadores unarios y se asocia de
izquierdaaderecha.

Debemostenerencuentaqueunvalornumriconuncapuedeserasignadoaunavariabledeun
tipomenorenrango,sinoesconunaconversinexplcita.Porejemplo:
int a;
byte b;
a = 12;
b = 12;
b = a;
byte b = (byte) a;

//
//
//
//
//
//

no se realiza conversin alguna


se permite porque 12 est dentro
del rango permitido de valores para b
error, no permitido (incluso aunque
12 podra almacenarse en un byte)
Correcto, forzamos conversin explcita

Enelejemploanteriorvemosuncasotpicodeerrordetipos,yaqueestamosintentandoasignarlea
b el valor de a, siendo b de un tipo ms pequeo. Lo correcto es promocionar a al tipo de datos
byte,yentoncesasignarlesuvaloralavariableb.

29

Creacindemiprimerprograma

DAW

6.1ConversindetiposdedatosenJava
TabladeConversindeTiposdeDatosPrimitivos

Tipodestino

boolean char byte short int long


boolean

N
N
N
N N
char
N

C
C
Cl Cl
byte
N
C

CI
Cl Cl
short
N
C
C

Cl Cl
Tipoorigen
int
N
C
C
C

Cl
long
N
C
C
C
C

float
N
C
C
C
C
C
double
N
C
C
C
C
C
Explicacindelossmbolosutilizados:

float double
N
N
Cl
Cl
Cl
Cl
Cl
Cl
Cl*
Cl
Cl*
Cl*

Cl
C

N: Conversin no permitida (un boolean no se puede convertir a ningn otro tipo y


viceversa).
CI:Conversinimplcitaoautomtica.Unasteriscoindicaquepuedehaberposibleprdida
dedatos.
C:Castingdetiposoconversinexplcita.
Elasteriscoindicaquepuedehaberunaposibleprdidadedatos,porejemploalconvertir
unnmerodetipointqueusalos32bitsposiblesdelarepresentacin,auntipofloat,que
tambinusa32bitsparalarepresentacin,pero8deloscualessonparaelexponente.
En cualquier caso, las conversiones de nmeros en coma flotante a nmeros enteros
siemprenecesitarnunCasting,ydeberemostenermuchocuidadodebidoalaprdidade
precisinqueellosupone.

6.1.1 - Reglas de Promocin de Tipos de Datos


Cuando en una expresin hay datos o variables de distinto tipo, el compilador realiza la
promocindeunostiposenotros,paraobtenercomoresultadoeltipofinaldelaexpresin.
Estapromocindetipossehacesiguiendounasreglasbsicasenbasealascualesserealiza
estapromocindetipos,yresumidamentesonlassiguientes:

Siunodelosoperandosesdetipodouble,elotroesconvertidoadouble.

Encualquierotrocaso:

30

Sielunodelosoperandosesfloat,elotroseconvierteafloat

Siunodelosoperandoseslong,elotroseconviertealong

Si no se cumple ninguna de las condiciones anteriores, entonces ambos


operandossonconvertidosaltipoint.

DesarrollodeAplicacionesWeb

Tema2

6.1.2 - Conversin de nmeros en Coma flotante (float, double) a enteros (int)


Cuando convertimos nmeros en coma flotante a nmeros enteros, la parte decimal se
trunca(redondeoacero).Siqueremoshacerotrotipoderedondeo,podemosutilizar,entre
otras,lassiguientesfunciones:
Math.round(num):Redondeoalsiguientenmeroentero.
Math.ceil(num):Mnimoenteroqueseamayoroigualanum.
Math.floor(num):Enteromayor,queseainferioroigualanum.

double num=3.5;
x=Math.round(num);
y=Math.ceil(num);
z=Math.floor(num);

// x = 4
// y = 4
// z = 3

6.1.3 - Conversiones entre caracteres (char) y enteros (int)


Como un tipo char lo que guarda en realidad es el cdigo Unicode de un carcter, los
caracterespuedenserconsideradoscomonmerosenterossinsigno.
Ejemplo:
int num;
char c;
num = (int) A;
c = (char) 65;
c = (char) ((int) A + 1);

//num = 65
// c = A
// c = B

6.1.4 - Conversiones de tipo con cadenas de caracteres (String)


Paraconvertircadenasdetextoaotrostiposdedatosseutilizanlassiguientesfunciones:
num=Byte.parseByte(cad);
num=Short.parseShort(cad);
num=Integer.parseInt(cad);
num=Long.parseLong(cad);
num=Float.parseFloat(cad);
num=Double.parseDouble(cad);

Porejemplo,sihemosledodetecladounnmeroqueestalmacenadoenunavariablede
tipo String llamada cadena, y lo queremos convertir al tipo de datos byte, haramos lo
siguiente:
byte n=Byte.parseByte(cadena);

31

Creacindemiprimerprograma

DAW

7. Comentarios.
CASO
Juan ha podido comprobar los avances que ha hecho Mara con la programacin. Ya domina todos
los aspectos bsicos sobre sintaxis, estructura de un programa, variables y tipos de datos. Ada le
acaba de comunicar que van a sumarse al proyecto dos personas ms, Ana y Carlos que estn
haciendo las prcticas del ciclo de Desarrollo de Aplicaciones Multiplataforma en la empresa. Al
principio de cada programa indicaremos una breve descripcin y el autor. En operaciones
complicadas podramos aadir un comentario les ayudar a entender mejor qu es lo que hace
indica Juan. De acuerdo comenta Mara, y podemos ir metiendo los comentarios de la
herramienta esa que me comentaste, Javadoc, para que se cree una documentacin an ms
completa. Aj! asiente Juan, pues manos a la obra!

Loscomentariossonmuyimportantesalahoradedescribirquhaceundeterminadoprograma.A
lolargodelaunidadloshemosutilizadoparadocumentarlosejemplosymejorarlacomprensindel
cdigo. Para lograr ese objetivo, es normal que cada programa comience con unas lneas de
comentario que indiquen, al menos, una breve descripcin del programa, el autor del mismo y la
ltimafechaenquesehamodificado.
Todos los lenguajes de programacin disponen de alguna forma de introducir comentarios en el
cdigo.EnelcasodeJava,nospodemosencontrarlossiguientestiposdecomentarios:

Comentariosdeunasolalnea.Utilizaremoseldelimitador//paraintroducircomentariosde
slounalnea.
// comentario de una sola lnea

Comentariosdemltipleslneas.Paraintroducirestetipodecomentarios,utilizaremosuna
barrainclinadayunasterisco(/*),alprincipiodelprrafoyunasteriscoseguidodeunabarra
inclinada(*/)alfinaldelmismo.
/* Esto es un comentario
de varias lneas */

Comentarios Javadoc. Utilizaremos los delimitadores /** y */. Al igual que con los
comentarios tradicionales, el texto entre estos delimitadores ser ignorado por el
compilador. Este tipo de comentarios se emplean para generar documentacin automtica
del programa. A travs del programa javadoc, incluido en JavaSE, se recogen todos estos
comentariosysellevanaundocumentoenformato.html.
/** Comentario de documentacin.
Javadoc extrae los comentarios del cdigo y
genera un archivo html a partir de este tipo de comentarios
*/

RECOMENDACIN
Una buena prctica de programacin es aadir en la ltima llave que delimita cada bloque de cdigo,
un comentario indicando a qu clase o mtodo pertenece esa llave.

PARASABERMS
SiquieresirfamiliarizndoteconlainformacinquehayenlawebdeOracle,enelsiguiente
enlacepuedesencontrarmsinformacinsobrelaherramientaJavadocincluidaenelKitde
DesarrollodeJavaSE(eningls):
http://download.oracle.com/javase/6/docs/technotes/guides/javadoc/index.html

32

DesarrollodeAplicacionesWeb

Tema3

INDICE

1.Introduccin...................................................................................................................................2
2.FundamentosdelaProgramacinOrientadaaObjetos................................................................3
2.1.Conceptos...............................................................................................................................................4
2.2.Beneficios................................................................................................................................................5
2.3.Caractersticas.........................................................................................................................................6
2.4.Lenguajesdeprogramacinorientadosaobjetos..................................................................................7
3.ClasesyObjetos.Caractersticasdelosobjetos............................................................................9
3.1.Propiedadesymtodosdelosobjetos.................................................................................................10
3.2.Interaccinentreobjetos......................................................................................................................10
3.3.Clases....................................................................................................................................................11
4.Utilizacindeobjetos...................................................................................................................13
4.1.Ciclodevidadelosobjetos...................................................................................................................14
4.2.Declaracin...........................................................................................................................................14
4.3.Instanciacin.........................................................................................................................................15
4.4.Manipulacin........................................................................................................................................16
4.5.Destruccindeobjetosyliberacindememoria.................................................................................17
5.Utilizacindemtodos................................................................................................................19
5.1.Parmetrosyvaloresdevueltos............................................................................................................20
5.3.Eloperadorthis.....................................................................................................................................22
5.4.Mtodosestticos.................................................................................................................................23
6.Librerasdeobjetos(paquetes)...................................................................................................25
6.1.Sentenciaimport...................................................................................................................................26
6.2.Compilaryejecutarclasesconpaquetes..............................................................................................27
6.3.Jerarquadepaquetes..........................................................................................................................28
6.4.LibrerasJava.........................................................................................................................................29
7.Programacindelaconsola:entradaysalidadelainformacin................................................31
7.1.ConceptossobrelaclaseSystem..........................................................................................................32
7.2.Entradaporteclado.ClaseSystem.......................................................................................................33
7.3.Entradaporteclado.ClaseScanner......................................................................................................33
7.4.Salidaporpantalla................................................................................................................................35
7.5.Salidadeerror.......................................................................................................................................36

Utilizacindeobjetos

DAW

Utilizacindeobjetos.
Caso prctico
Ada y Juan se han reunido para discutir sobre distintos proyectos de BK Programacin. Ada le
comenta a Juan que estn teniendo algunos problemas con determinados proyectos. A menudo
surgen modificaciones o mejoras en el software en el mbito de los contratos de mantenimiento que
tienen suscritos con los clientes, y realizar las modificaciones en los programas est suponiendo en
muchos casos modificar el programa casi en su totalidad.
A eso se ha de sumar que las tareas de modificacin son encargadas a las personas ms adecuadas
en ese momento, segn la carga de trabajo que haya; que no tienen por qu coincidir con las
personas que desarrollaron el programa. Las modificaciones en los proyectos se estn retrasando, y
hay algunas que deben estar listas antes de que surja el nuevo cambio de versin.
En reuniones anteriores se ha comentado la posibilidad de aumentar el precio del contrato de
mantenimiento de los clientes. Se ha consultado con el equipo de comerciales y a regaadientes han
aceptado un aumento que an est por decidir, pero an as quizs no sea suficiente. La empresa
necesita mejorar el mtodo de trabajo para reducir costes de mantenimiento del software y alcanzar
la rentabilidad deseada.

1.- Introduccin.
Sinosparamosaobservarelmundoquenosrodea,podemosapreciarquecasitodoestformado
por objetos. Existen coches, edificios, sillas, mesas, semforos, ascensores e incluso personas o
animales. Todos ellos pueden ser considerados objetos, con una serie de caractersticas y
comportamientos.Porejemplo,existencochesdediferentesmarcas,colores,etc.ypuedenacelerar,
frenar, girar, etc., o las personas tenemos diferente color de pelo, ojos, altura y peso y podemos
nacer,crecer,comer,dormir,etc.
Los programas son el resultado de la bsqueda y obtencin de una solucin para un problema del
mundo real. Pero en qu medida los programas estn organizados de la misma manera que el
problemaquetratandesolucionar?Larespuestaesquemuchasveceslosprogramasseajustanms
alostrminosdelsistemaenelqueseejecutarnquealosdelpropioproblema.
Si redactamos los programas utilizando los mismos trminos de nuestro mundo real, es decir,
utilizando objetos, y no los trminos del sistema o computadora donde se vaya a ejecutar,
conseguiremosquestosseanmslegiblesy,portanto,msfcilesdemodificar.
Esto es precisamente lo que pretende la Programacin Orientada a Objetos (POO), en ingls OOP
(Object Oriented Programming), establecer una serie de tcnicas que permitan trasladar los
problemasdelmundorealanuestrosistemainformtico.Ahoraqueyaconocemoslasintaxisbsica
de Java, es el momento de comenzar a utilizar las caractersticas orientadas a objetos de este
lenguaje,yestudiarlosconceptosfundamentalesdeestemodelodeprogramacin.

DesarrollodeAplicacionesWeb

2.- Fundamentos de
Orientada a Objetos.

Tema3

la

Programacin

Caso prctico
Juan cuenta con la ayuda de Mara para desarrollar la aplicacin para la Clnica Veterinaria. Lo
normal es pensar en tener una aplicacin de escritorio para las altas y bajas de clientes y la gestin
de mascotas, y una parte web para que la clnica pueda estar presente en Internet e, incluso, realizar
la venta on-line de sus productos. Mara tiene bastante experiencia en administracin de pginas
web, pero para estar capacitada en el desarrollo de aplicaciones en Java, necesita adquirir
conocimientos adicionales.
Juan le explica que tienen que utilizar un mtodo de programacin que les ayude a organizar los
programas, a trabajar en equipo de forma que si uno de ellos tiene que dejar una parte para que se
encargue el otro, que ste lo pueda retomar con el mnimo esfuerzo. Adems, interesa poder reutilizar
todo el cdigo que vayan creando, para ir ms rpido a la hora de programar. Juan le explica que si
consiguen adoptar ese mtodo de trabajo, no slo redundar en una mejor organizacin para ellos,
sino que ayudar a que las modificaciones en los programas sean ms llevaderas de lo que lo estn
siendo ahora.
Mara asiente ante las explicaciones de Juan, e intuye que todo lo entender mejor conforme vaya
conociendo los conceptos de Programacin Orientada a Objetos.
De lo que realmente se trata es de que BK Programacin invierta el menor tiempo posible en los
proyectos que realice, aprovechando material elaborado con el esfuerzo ya realizado en otras
aplicaciones.

Dentro de las distintas formas de hacer las cosas en programacin, distinguimos dos paradigmas
fundamentales:
9 ProgramacinEstructurada,secreanfuncionesyprocedimientosquedefinenlasaccionesa
realizar,yqueposteriormenteformanlosprogramas.
9 ProgramacinOrientadaaObjetos,consideralosprogramasentrminosdeobjetosytodo
giraalrededordeellos.
Peroenquconsistenrealmenteestosparadigmas?Veamosestosdosmodelosdeprogramacin
con ms detenimiento. Inicialmente se programaba aplicando las tcnicas de programacin
tradicional, tambin conocidas como Programacin Estructurada. El problema se descompona en
unidades ms pequeas hasta llegar a acciones o verbos muy simples y fciles de codificar. Por
ejemplo, en la resolucin de una ecuacin de primer grado, lo que hacemos es descomponer el
problemaenaccionesmspequeasopasosdiferenciados:
9 Pedirvalordeloscoeficientes.
9 Calcularelvalordelaincgnita.
9 Mostrarelresultado.
Sinosdamoscuenta,estaseriedeaccionesopasosdiferenciadosnosonotracosaqueverbos;por
ejemploelverbopedir,calcular,mostrar,etc.
Sin embargo, la Programacin Orientada a Objetos aplica de otra forma diferente la tcnica de
programacin"divideyvencers".Esteparadigmasurgeenunintentodesalvarlasdificultadesque,
deformainnata,poseeelsoftware.Paraelloloquehaceesdescomponer,enlugardeacciones,en
objetos. El principal objetivo sigue siendo descomponer el problema en problemas ms pequeos,
que sean fciles de manejar y mantener, fijndonos en cul es el escenario del problema e
intentando reflejarlo en nuestro programa. O sea, se trata de trasladar la visin del mundo real a
nuestrosprogramas.PorestemotivosedicequelaProgramacinOrientadaaObjetosabordalos

Utilizacindeobjetos

DAW

problemasdeunaformamsnatural,entendiendocomonaturalqueestmsencontactoconel
mundoquenosrodea.
La Programacin Estructurada se centra en el conjunto de acciones a realizar en un programa,
haciendo una divisin de procesos y datos. La Programacin Orientada a Objetos se centra en la
relacin que existe entre los datos y las acciones a realizar con ellos, y los encierra dentro del
conceptodeobjeto,tratandoderealizarunaabstraccinlomscercanaalmundoreal.

La Programacin Orientada a Objetos es un sistema o conjunto de reglas que nos ayudan a


descomponerlaaplicacinenobjetos.Amenudosetrataderepresentarlasentidadesyobjetos
que nos encontramos en el mundo real mediante componentes de una aplicacin. Es decir,
debemosestablecerunacorrespondenciadirectaentreelespaciodelproblemayelespaciodela
solucin.Peroenlaprcticaestoququieredecir?Puesquealahoradeescribirunprograma,nos
fijaremosenlosobjetosinvolucrados,suscaractersticascomunesylasaccionesquepuedenrealizar.
Una vez localizados los objetos que intervienen en el problema real (espacio del problema), los
tendremosquetrasladaralprogramainformtico(espaciodelasolucin).Conesteplanteamiento,
lasolucinaunproblemadadoseconvierteenunatareasencillaybienorganizada.

Autoevaluacin
Relaciona el trmino con su definicin, escribiendo el nmero asociado a la definicin en
el hueco correspondiente.
Ejercicio de relacionar
Paradigma
Relacin
Definicin
Programacin Orientada 2
1. Maneja funciones y procedimientos que definen las
a Objetos.
acciones a realizar.
Programacin
2. Representa las entidades del mundo real mediante
1
Estructurada.
componentes de la aplicacin.
La Programacin Orientada a Objetos y la Programacin Estructurada son paradigmas o modelos de programacin.

2.1.Conceptos.
Para entender mejor la filosofa de orientacin a objetos veamos algunas caractersticas que la
diferenciandelastcnicasdeprogramacintradicional.
En la Programacin Estructurada, el programa estaba compuesto por un conjunto de datos y
funciones "globales". El trmino global significaba que eran accesibles por todo el programa,
pudiendoserllamadosencualquierubicacindelaaplicacin.Dentrodelasfuncionessesituaban
las instrucciones del programa que manipulaban los datos. Funciones y datos se encontraban
separadosytotalmenteindependientes.Estoocasionabadosproblemasprincipales:
9

Losprogramassecreabanyestructurabandeacuerdoconlaarquitecturadelacomputadora
dondesetenanqueejecutar.

Al estar separados los datos de las funciones, stos eran


visiblesentodalaaplicacin.Elloocasionabaquecualquier
modificacinenlosdatospodarequerirlamodificacinen
todas las funciones del programa, en correspondencia con
loscambiosenlosdatos.

DesarrollodeAplicacionesWeb

Tema3

EnlaProgramacinOrientadaaObjetoslasituacinesdiferente.Lautilizacindeobjetospermite
un mayor nivel de abstraccin que con la Programacin Estructurada, y ofrece las siguientes
diferenciasconrespectoasta:
9

Elprogramadororganizasuprogramaenobjetos,queson
representacionesdelmundorealqueestnmscercanas
alaformadepensardelagente.

Losdatos,juntoconlasfuncionesquelosmanipulan,son
parteinternadelosobjetosynoestnaccesiblesalresto
de los objetos. Por tanto, los cambios en los datos de un
objeto slo afectan a las funciones definidas para ese
objeto,peronoalrestodelaaplicacin.

TodoslosprogramasescritosbajoelparadigmaorientadoaObjetossepuedenescribirigualmente
mediantelaProgramacinEstructurada.Sinembargo,laProgramacinOrientadaaObjetoseslaque
mayorfacilidadpresentaparaeldesarrollodeprogramasbasadoseninterfacesgrficasdeusuario.

2.2.Beneficios.
Segnloquehemosvistohastaahora,un
objeto es cualquier entidad que podemos
veroapreciar.Elconceptofundamentalde
la Programacin Orientada a Objetos son,
precisamente, los objetos. Pero qu
beneficios aporta la utilizacin de objetos?
Fundamentalmente la posibilidad de
representar el problema en trminos del
mundo real, que como hemos dicho estn
ms cercanos a nuestra forma de pensar,
pero existen otra serie de ventajas como
lassiguientes:

Comprensin.Losconceptosdelespaciodelproblemasehayanreflejadosenelcdigodel
programa,porloquelameralecturadelcdigonosdescribelasolucindelproblemaenel
mundoreal.

Modularidad. Facilita la modularidad del cdigo, al estar las definiciones de objetos en


mdulos o archivos independientes, hace que las aplicaciones estn mejor organizadas y
seanmsfcilesdeentender.

Fcil mantenimiento. Cualquier modificacin en las acciones queda automticamente


reflejada en los datos, ya que ambos estn estrechamente relacionados. Esto hace que el
mantenimiento de las aplicaciones, as como su correccin y modificacin sea mucho ms
fcil.Porejemplo,podemosquererutilizarunalgoritmomsrpido,sintenerquecambiarel
programaprincipal.Porotraparte,alestarlasaplicacionesmejororganizadas,esmsfcil
localizarcualquierelementoquesequieramodificary/ocorregir.Estoesimportanteyaque

Utilizacindeobjetos

DAW

seestimaquelosmayorescostesdesoftwarenoestnenelprocesodedesarrolloens,sino
enelmantenimientoposteriordeesesoftwarealolargodesuvidatil.
9

Seguridad.Laprobabilidaddecometererroressevereducida,yaquenopodemosmodificar
los datos de un objeto directamente, sino que debemos hacerlo mediante las acciones
definidas para ese objeto. Imaginemos un objeto lavadora. Se compone de un motor,
tambor, cables, tubos, etc. Para usar una lavadora no se nos ocurre abrirla y empezar a
manipular esos elementos, ya que lo ms probable es que se estropee. En lugar de eso
utilizamos los programas de lavado establecidos. Pues algo parecido con los objetos, no
podemosmanipularlosinternamente,sloutilizarlasaccionesqueparaelloshaydefinidas.

Reusabilidad. Los objetos se definen como entidades reutilizables, es decir, que los
programas que trabajan con las mismas estructuras de informacin, pueden reutilizar las
definicionesdeobjetosempleadasenotrosprogramas,einclusolasaccionesdefinidassobre
ellos. Por ejemplo, podemos crear la definicin de un objeto de tipo persona para una
aplicacin de negocios y deseamos construir a continuacin otra aplicacin, digamos de
educacin,endondeutilizamostambinpersonas,noesnecesariocreardenuevoelobjeto,
sino que por medio de la reusabilidad podemos utilizar el tipo de objeto persona
previamentedefinido.

Citas para pensar


Primeroresuelveelproblema.Entonces,escribeelcdigo.
JohnJohnson

2.3.Caractersticas.
CuandohablamosdeProgramacinOrientadaaObjetos,existenunaseriedecaractersticasquese
deben cumplir. Cualquier lenguaje de programacin orientado a objetos las debe contemplar. Las
caractersticasmsimportantesdelparadigmadelaprogramacinorientadaaobjetosson:
9

Abstraccin. Es el proceso por el cual definimos las caractersticas ms importantes de un


objeto,sinpreocuparnosdecmoseescribirnenelcdigodelprograma,simplementelo
definimos de forma general. En la Programacin Orientada a Objetos la herramienta ms
importante para soportar la abstraccin es la clase. Bsicamente, una clase es un tipo de
datoqueagrupalascaractersticascomunesdeunconjuntodeobjetos.Poderverlosobjetos
del mundo real que deseamos trasladar a nuestros programas, en trminos abstractos,
resultadegranutilidadparaunbuendiseodelsoftware,yaquenosayudaacomprender
mejorelproblemayatenerunavisinglobaldetodoelconjunto.Porejemplo,sipensamos
enunaclaseVehculoqueagrupalascaractersticascomunesdetodosellos,apartirdedicha
clasepodramoscrearobjetoscomoCocheyCamin.EntoncessedicequeVehculoesuna
abstraccindeCocheydeCamin.

Modularidad. Una vez que hemos representado el escenario del problema en nuestra
aplicacin,tenemoscomoresultadounconjuntodeobjetossoftwareautilizar.Esteconjunto
de objetos se crean a partir de una o varias clases. Cada clase se encuentra en un archivo
diferente,porloquelamodularidadnospermitemodificarlascaractersticasdelaclaseque
defineunobjeto,sinqueestoafectealrestodeclasesdelaaplicacin.

DesarrollodeAplicacionesWeb

Tema3

9 Encapsulacin. Tambin llamada "ocultamiento de la informacin". La encapsulacin o


encapsulamientoeselmecanismobsicoparaocultarlainformacindelaspartesinternas
de un objeto a los dems objetos de la aplicacin. Con la encapsulacin un objeto puede
ocultarlainformacinquecontienealmundoexterior,obienrestringirelaccesoalamisma
para evitar ser manipulado de forma inadecuada. Por ejemplo, pensemos en un programa
condosobjetos,unobjetoPersonayotroCoche.PersonasecomunicaconelobjetoCoche
parallegarasudestino,utilizandoparaellolasaccionesqueCochetengadefinidascomopor
ejemploconducir.Esdecir,PersonautilizaCocheperonosabecmofuncionainternamente,
slosabeutilizarsusmtodosoacciones.
9

Jerarqua. Mediante esta propiedad


podemos definir relaciones de jerarquas
entre clases y objetos. Las dos jerarquas
ms importantes son la jerarqua "es un"
llamadageneralizacinoespecializaciny
la jerarqua "es parte de", llamada
agregacin. Conviene detallar algunos
aspectos:
Lageneralizacinoespecializacin,tambinconocidacomoherencia,permitecrear

unaclasenuevaentrminosdeunaclaseyaexistente(herenciasimple)odevarias
clases ya existentes (herencia mltiple). Por ejemplo, podemos crear la clase
CochedeCarreras a partir de la clase Coche, y as slo tendremos que definir las
nuevascaractersticasquetenga.
La agregacin, tambin conocida como inclusin, permite agrupar objetos

relacionados entre s dentro de una clase. As, un Coche est formado por Motor,
Ruedas,FrenosyVentanas.SedicequeCocheesunaagregacinyMotor,Ruedas,
FrenosyVentanassonagregadosdeCoche.
9

Polimorfismo.Estapropiedadindicalacapacidaddequevariasclasescreadasapartirdeuna
antecesorarealicenunamismaaccindeformadiferente.Porejemplo,pensemosenlaclase
Animalylaaccindeexpresarse.NosencontramosquecadatipodeAnimalpuedehacerlo
demaneradistinta,losPerrosladran,losGatosmaullan,lasPersonashablamos,etc.Dicho
deotramanera,elpolimorfismoindicalaposibilidaddetomarunobjeto(detipoAnimal,por
ejemplo),eindicarlequerealicelaaccindeexpresarse,estaaccinserdiferentesegnel
tipodemamferodelquesetrate.

2.4.Lenguajesdeprogramacinorientadosaobjetos.
Unapanormicadelaevolucindeloslenguajesdeprogramacinorientadosaobjetoshastallegara
losutilizadosactualmenteeslasiguiente:
9

Simula(1962).ElprimerlenguajeconobjetosfueB1000en1961,seguidoporSketchpaden
1962,elcualcontenaclonesocopiasdeobjetos.Sinembargo,fueSimulaelprimerlenguaje
que introdujo el concepto de clase, como elemento que incorpora datos y las operaciones
sobreesosdatos.En1967surgiSimula67queincorporabaunmayornmerodetiposde
datos,ademsdelapoyoaobjetos.

Utilizacindeobjetos

DAW

9 SmallTalk(1972).BasadoenSimula67,laprimeraversinfueSmalltalk72,alaquesigui
Smalltalk 76, versin totalmente orientada a objetos. Se caracteriza por soportar las
principales propiedades de la Programacin Orientada a Objetos y por poseer un entorno
quefacilitaelrpidodesarrollodeaplicaciones.ElModeloVistaControlador(MVC)fueuna
importantecontribucindeestelenguajealmundodelaprogramacin.EllenguajeSmalltalk
hainfluidosobreotrosmuchoslenguajescomoC++yJava.
9

C++ (1985). C++ fue diseado por Bjarne Stoustrup en los laboratorios donde trabajaba,
entre1982y1985.LenguajequederivadelC,alqueaadeunaseriedemecanismosquele
conviertenenunlenguajeorientadoaobjetos.Notienerecolectordebasuraautomtica,lo
que obliga a utilizar un destructor de objetos no utilizados. En este lenguaje es donde
aparece el concepto de clase tal y como lo conocemos actualmente, como un conjunto de
datosyfuncionesquelosmanipulan.

Eiffel(1986).Creadoen1985porBertrandMeyer,recibesunombreenhonoralafamosa
torredePars.Tieneuna sintaxissimilaraC.Soportatodaslaspropiedades fundamentales
delosobjetos,utilizadosobretodoenambientesuniversitariosydeinvestigacin.Entresus
caractersticasdestacalaposibilidaddetraduccindecdigoEiffelaLenguajeC.Aunquees
unlenguajebastantepotente,nologrlaaceptacindeC++yJava.

Java (1995). Diseado por Gosling de Sun Microsystems a finales de 1995. Es un lenguaje
orientado a objetos diseado desde cero, que recibe muchas influencias de C++. Como
sabemos, se caracteriza porque produce un bytecode que posteriormente es interpretado
porlamquinavirtual.LarevolucindeInternethainfluidomuchoenelaugedeJava.

C#(2000).EllenguajeC#,tambinesconocidocomoSharp.FuecreadoporMicrosoft,como
una ampliacin de C con orientacin a objetos. Est basado en C++ y en Java. Una de sus
principalesventajasqueevitamuchosdelosproblemasdediseodeC++.

Autoevaluacin
Relaciona los lenguajes de programacin indicados con la caracterstica
correspondiente, escribiendo el nmero asociado a la caracterstica en el hueco
correspondiente.
Ejercicio de relacionar
Lenguaje de programacin Relacin
Tiene la caracterstica de que
1. Fue el primer lenguaje que introdujo el
3
Java
concepto de clase.
2. Introdujo el concepto del Modelo-Vista2
SmallTalk
Controlador.
3. Produce un bytecode para ser interpretado por
1
Simula
la mquina virtual.
4. Introduce el concepto de clase tal cual lo
4
C++
conocemos, con atributos y mtodos.
C++ fue diseado basndose en C y aadindole la orientacin a objetos. Posteriormente, surgira Java, que recibi
influencias de C++ y de Ada-95.

DesarrollodeAplicacionesWeb

Tema3

3.- Clases y Objetos. Caractersticas de los


objetos.
Caso prctico
Mara ha hecho un descanso de cinco minutos. Se est tomando un caf y est repasando los
conceptos de Programacin Orientada a Objetos. Piensa que este paradigma supone un cambio de
enfoque con respecto a las tcnicas tradicionales. Ahora lo que necesita es ahondar en el concepto
de objeto, que parece ser el eje central de este modelo de programacin.

Al principio de la unidad veamos que el mundo real est compuesto de objetos, y podemos
considerarobjetoscasicualquiercosaquepodemosverysentir.Cuandoescribimosunprogramaen
un lenguaje orientado a objetos, debemos identificar cada una de las partes del problema con
objetospresentesenelmundoreal,paraluegotrasladarlosalmodelocomputacionalqueestamos
creando.
En este contexto, un objeto de software es una representacin de un objeto del mundo real,
compuesto de una serie de caractersticas y un comportamiento especfico. Pero qu es ms
concretamenteunobjetoenProgramacinOrientadaaObjetos?Vemoslo.
Unobjetoesunconjuntodedatosconlasoperacionesdefinidasparaellos.Losobjetostienenun
estadoyuncomportamiento.

Por tanto, estudiando los objetos que estn


presentes en un problema podemos dar con la
solucin a dicho problema. Los objetos tienen unas
caractersticasfundamentalesquelosdistinguen:
9

Identidad. Es la caracterstica que permite


diferenciar un objeto de otro. De esta
manera,aunquedosobjetosseanexactamenteigualesensusatributos,sondistintosentre
s.Puedeserunadireccindememoria,elnombredelobjetoocualquierotroelementoque
utiliceellenguajeparadistinguirlos.Porejemplo,dosvehculosquehayansalidodelamisma
cadenadefabricacinyseanigualesaparentemente,sondistintosporquetienenuncdigo
quelosidentifica.

Estado.Elestadodeunobjetovienedeterminadoporunaseriedeparmetrosoatributos
quelodescriben,ylosvaloresdestos.Porejemplo,sitenemosunobjetoCoche,elestado
estaradefinidoporatributoscomoMarca,Modelo,Color,Cilindrada,etc.

Comportamiento.Sonlasaccionesquesepuedenrealizarsobreelobjeto.Enotraspalabras,
sonlosmtodosoprocedimientosquerealizaelobjeto.Siguiendoconelejemplodelobjeto
Coche, el el comportamiento seran acciones como: arrancar(), parar(),
acelerar(),frenar(),etc.

Utilizacindeobjetos

DAW

3.1.Propiedadesymtodosdelosobjetos.
Como acabamos de ver todo objeto tiene un estado y un comportamiento. Concretando un poco
ms,laspartesdeunobjetoson:
9

Campos, Atributos o Propiedades: Parte del


objeto que almacena los datos. Tambin se les
denomina Variables Miembro. Estos datos
pueden ser de cualquier tipo primitivo
(boolean, char, int, double, etc) o ser su
vezserotroobjeto.Porejemplo,unobjetodela
clase Coche puede tener un objeto de la clase
Ruedas.
9 Mtodos o Funciones Miembro: Parte del
objetoquellevaacabolasoperacionessobrelos
atributosdefinidosparaeseobjeto.
La idea principal es que el objeto rene en una sola entidad los datos y las operaciones, y para
acceder a los datos privados del objeto debemos utilizar los mtodos que hay definidos para ese
objeto.
La nica forma de manipular la informacin del objeto es a travs de sus mtodos. Es decir, si
queremossaberelvalordealgnatributo,tenemosqueutilizarelmtodoquenosmuestreelvalor
deeseatributo.Deestaforma,evitamosquemtodosexternospuedanalterarlosdatosdelobjeto
demanerainadecuada.Sedicequelosdatosylosmtodosestnencapsuladosdentrodelobjeto.

3.2.Interaccinentreobjetos.
Dentrodeunprogramalosobjetossecomunicanllamandounosaotrosasusmtodos.Losmtodos
estndentrodelosobjetosydescribenelcomportamientodeunobjetocuandorecibeunallamada
a uno de sus mtodos. En otras palabras, cuando un objeto, objeto1, quiere actuar sobre otro,
objeto2,tienequeejecutarunodesusmtodos.Entoncessedicequeelobjeto2recibeunmensaje
delobjeto1.
Unmensajeeslaaccinquerealizaunobjeto.Unmtodoeslafuncinoprocedimientoalquese
llamaparaactuarsobreunobjeto.
Losdistintosmensajesquepuederecibirunobjetooalosquepuederesponderrecibenelnombre
deprotocolodeeseobjeto.
Elprocesodeinteraccinentreobjetossesueleresumirdiciendoqueseha"enviadounmensaje"
(hecho una peticin) a un objeto, y el objeto determina "qu hacer con el mensaje" (ejecuta el
cdigodelmtodo).Cuandoseejecutaunprogramaseproducenlassiguientesacciones:
9

Creacindelosobjetosamedidaquesenecesitan.

Comunicacinentrelosobjetosmedianteelenvodemensajesunosaotros,oelusuarioa
losobjetos.

Eliminacindelosobjetoscuandonosonnecesariosparadejarespaciolibreenlamemoria
delcomputador.

10

DesarrollodeAplicacionesWeb

Tema3

Losobjetossepuedencomunicarentreellosinvocandoalosmtodosdelosotrosobjetos.

Autoevaluacin
Cuando un objeto, objeto1, ejecuta un mtodo de otro, objeto2, se dice que el objeto2 le
ha mandado un mensaje al objeto1.
Verdadero.

Falso.

En este caso se dice que es el objeto1 el que le ha mandado un mensaje al objeto2.

3.3.Clases.
Hasta ahora hemos visto lo que son los objetos. Un
programa informtico se compone de muchos objetos,
algunos de los cuales comparten la misma estructura y
comportamiento. Si tuviramos que definir su estructura y
comportamiento objeto cada vez que queremos crear un
objeto,estaramosutilizandomuchocdigoredundante.Por
ello lo que se hace es crear una clase, que es una
descripcindeunconjuntodeobjetosquecompartenunaestructurayuncomportamientocomn.
Yapartirdelaclase,secreantantas"copias"o"instancias"comonecesitemos.Esascopiassonlos
objetosdelaclase.
Lasclasesconstandedatosymtodosqueresumenlascaractersticascomunesdeunconjuntode
objetos.Unprogramainformticoestcompuestoporunconjuntodeclases,apartirdelascualesse
creanobjetosqueinteractanentres.
Si recuerdas, cuando utilizbamos los tipos de datos enumerados, los definamos con la palabra
reservadaenum ylalistadevaloresentrellaves,ydecamosqueuntipodedatosenum noesotra
cosa que una especie de clase en Java. Efectivamente, todas las clases llevan su contenido entre
llaves.Yunaclasetienelamismaestructuraqueuntipodedatoenumerado,aadindoleunaserie
demtodosyvariables.
Enotraspalabras,unaclaseesunaplantillaoprototipodondeseespecifican:
9 Losatributoscomunesatodoslosobjetosdelaclase.
9 Losmtodosquepuedenutilizarseparamanejaresosobjetos.
Para declarar una clase en Java se utiliza la palabra reservada class. La declaracin de una clase
estcompuestapor:
9 Cabecera de la clase. La cabecera es un poco ms
compleja que como aqu definimos, pero por ahora
slo nos interesa saber que est compuesta por una
serie de modificadores, en este caso hemos puesto
publicqueindicaqueesunaclasepblicaalaque
puedenaccederotrasclasesdelprograma,lapalabra
reservadaclassyelnombredelaclase.
9 Cuerpo de la clase. En l se especifican encerrados
entrellaveslosatributosylosmtodosquevaatener
laclase.

11

Utilizacindeobjetos

DAW

Enlaunidadanterioryahemosutilizadoclases,aunqueannosabamossusignificadoexacto.Por
ejemplo, en los ejemplos de la unidad o en la tarea, estbamos utilizando clases, todas ellas eran
clases principales, no tenan ningn atributo y el nico mtodo del que disponan era el mtodo
main().
Elmtodomain()seutilizaparaindicarquesetratadeunaclaseprincipal,apartirdelacualvaa
empezarlaejecucindelprograma.Estemtodonoaparecesilaclasequeestamoscreandonovaa
serlaclaseprincipaldelprograma.

12

DesarrollodeAplicacionesWeb

Tema3

4.- Utilizacin de objetos.


Caso prctico
Mara sigue fuera de la oficina. Esta noche en casa quiere repasar conceptos sobre Programacin
Orientada a objetos, as que aprovecha un momento para llamar a Juan y le comenta:
-Ya s todo sobre objetos -le dice- slo que...
-Solo qu? -aade Juan.
-Solo me falta saber... cmo se crea un objeto?
Juan sonre ante la pregunta de Mara, y le explica que los objetos se crean como si fuera declarando
una variable ms, tan slo que el tipo de datos de dicho objeto ser una clase. Tras declararlos hay
que instanciarlos con la orden new para reservar memoria para ellos, y despus ya podremos
utilizarlos, refirindonos a su contenido con el operador punto.
-Te mando un documento por email que lo explica todo muy bien.
-Ah, gracias! Esta noche le echo un vistazo -aade Mara.

Unavezquehemoscreadounaclase,podemoscrearobjetosennuestroprogramaapartirdeesas
clases.
Cuando creamos un objeto a partir de una clase se dice que hemos creado una "instancia de la
clase". A efectos prcticos, "objeto" e "instancia de clase" son trminos similares. Es decir, nos
referimos a objetos como instancias cuando queremos hacer hincapi que son de una clase
particular.
Losobjetossecreanapartirdelasclases,yrepresentancasosindividualesdestas.

Para entender mejor el concepto entre un objeto y su clase, piensa en un molde de galletas y las
galletas. El molde sera la clase, que define las caractersticas del objeto, por ejemplo su forma y
tamao.Lasgalletascreadasapartirdeesemoldesonlosobjetosoinstancias.
Otro ejemplo, imagina una clase Persona que rena las caractersticas comunes de las personas
(color de pelo, ojos, peso, altura, etc.) y las acciones que pueden realizar (crecer, dormir, comer,
etc.).PosteriormentedentrodelprogramapodremoscrearunobjetoTrabajadorqueestbasadoen
esaclasePersona.EntoncessedicequeelobjetoTrabajadoresunainstanciadelaclasePersona,o
quelaclasePersonaesunaabstraccindelobjetoTrabajador.
Cualquierobjetoinstanciadodeunaclasecontieneunacopiadetodoslosatributosdefinidosenla
clase. En otras palabras, lo que estamos haciendo es reservar un espacio en la memoria del
ordenador para guardar sus atributos y mtodos. Por tanto, cada objeto tiene una zona de
almacenamientopropiadondeseguardatodasuinformacin,queserdistintaaladecualquierotro
objeto.Alasvariablesmiembroinstanciadastambinselesllamavariablesinstancia.Deigualforma,
alosmtodosquemanipulanesasvariablesselesllamamtodosinstancia.
En el ejemplo del objeto Trabajador, las variables instancia seran color_de_pelo, peso,
altura,etc.Ylosmtodosinstanciaserancrecer(),dormir(),comer(),etc.

Autoevaluacin
Las variables instancia son un tipo de variables miembro.
Verdadero.

Falso.

Lasvariablesmiembropuedenservariablesinstanciaovariablesdeclase.Esteltimotipoesuncasoparticularcuandoel
valordelavariableoatributoescompartidoportodoslosobjetosdelaclase.

13

Utilizacindeobjetos

DAW

4.1.Ciclodevidadelosobjetos.

Todo programa en Java parte de una nica clase, que


como hemos comentado se trata de la clase principal.
Estaclaseejecutarelcontenidodesumtodomain(),el
cual ser el que utilice las dems clases del programa,
creeobjetosylancemensajesaotrosobjetos.
Las instancias u objetos tienen un tiempo de vida
determinado.Cuandounobjetonosevaautilizarmsen
el programa, es destruido por el recolector de basura para liberar recursos que pueden ser
reutilizadosporotrosobjetos.
Alavistadeloanterior,podemosconcluirquelosobjetostienenunciclodevida,enelcualpodemos
distinguirlassiguientesfases:
9

Creacin,dondesehacelareservadememoriaeinicializacindeatributos.

Manipulacin,quesellevaacabocuandosehaceusodelosatributosymtodosdelobjeto.

Destruccin,eliminacindelobjetoyliberacinderecursos.

4.2.Declaracin.
Paralacreacindeunobjetohayqueseguirlossiguientespasos:
9

Declaracin:Definireltipodeobjeto.

Instanciacin:Creacindelobjetoutilizandoeloperadornew.

PeroenquconsistenestospasosaniveldeprogramacinenJava?Veamosprimerocmodeclarar
unobjeto.Paraladefinicindeltipodeobjetodebemosemplearlasiguienteinstruccin:
<tipo> nombre_objeto;
Donde:
9

tipoeslaclaseapartirdelacualsevaacrearelobjeto,y

nombre_objetoeselnombredelavariablereferenciaconlacualnosreferiremosalobjeto.

Lostiposreferenciadosoreferenciasseutilizanparaguardarladireccindelosdatosenlamemoria
delordenador.
Nada ms crear una referencia, sta se encuentra vaca. Cuando una referencia a un objeto no
contieneningunainstanciasedicequeesunareferencianula,esdecir,quecontieneelvalornull.
Estoquieredecirquelareferenciaestcreadaperoqueelobjetonoestinstanciadotodava,por
esolareferenciaapuntaaunobjetoinexistentellamado"nulo".
Para entender mejor la declaracin de objetos veamos un ejemplo. Cuando veamos los tipos de
datos en la Unidad 2, decamos que Java proporciona un tipo de dato especial para los textos o

14

DesarrollodeAplicacionesWeb

Tema3

cadenasdecaracteresqueeraeltipodedatoString.Veamosquerealmenteestetipodedatoes
untiporeferenciadoycrebamosunavariablemensajedeesetipodedatodelasiguienteforma:
String mensaje;
Losnombresdelaclaseempiezanconmayscula,comoString,ylosnombresdelosobjetoscon
minscula,comomensaje,assabemosqutipodeelementoutilizando.
Pues bien, String es realmente la clase a partir de la cual creamos nuestro objeto llamado
mensaje.
Siobservaspocosediferenciaestadeclaracindelasdeclaracionesdevariablesquehacamospara
lostiposprimitivos.AntesdecamosquemensajeeraunavariabledeltipodedatoString.Ahora
realmentevemosquemensajeesunobjetodelaclaseString.Peromensajeannocontieneel
objetoporquenohasidoinstanciado,veamoscmohacerlo.
Por tanto, cuando creamos un objeto estamos haciendo uso de una variable que almacena la
direccindeeseobjetoenmemoria.Esavariableesunareferenciaountipodedatosreferenciado,
porquenocontieneeldatosinolaposicindeldatoenlamemoriadelordenador.
String saludo = new String ("Bienvenido a Java");
String s; //s vale null
s = saludo; //asignacin de referencias
En las instrucciones anteriores, las variables s y saludo apuntan al mismo objeto de la clase
String.Estoimplicaquecualquiermodificacinenelobjetosaludomodificatambinelobjetoal
quehacereferencialavariables,yaquerealmentesonelmismo.

4.3.Instanciacin.
Unavezcreadalareferenciaalobjeto,debemoscrearlainstanciauobjetoquesevaaguardaren
esareferencia.Paraelloutilizamoslaordennew conlasiguientesintaxis:
nombre_objeto = new <Constructor_de_la_Clase>([<par1>, <par2>, ...,
<parN>]);
Donde:
9

nombre_objeto es el nombre de la variable referencia con la cual nos referiremos al


objeto,
9 neweseloperadorparacrearelobjeto,
9 Constructor_de_la_Claseesunmtodoespecialdelaclase,quesellamaigualque
ella,yseencargadeinicializarelobjeto,esdecir,dedarunosvaloresinicialesasusatributos,
y
9 par1-parN,sonparmetrosquepuedeononecesitarelconstructorparadarlosvalores
inicialesalosatributosdelobjeto.

15

Utilizacindeobjetos

DAW

Durante la instanciacin del objeto, sereserva memoria suficiente para el objeto. De estatarea se
encargaJavayjuegaunpapelmuyimportanteelrecolectordebasura,queseencargadeeliminar
delamemorialosobjetosnoutilizadosparaquestapuedavolveraserutilizada.
Deestemodo,parainstanciarunobjetoString,haramoslosiguiente:
mensaje = new String;
As estaramos instanciando el objeto mensaje. Para ello utilizaramos el operador new y el
constructordelaclaseString alaqueperteneceelobjetosegnladeclaracinquehemoshecho
en el apartado anterior. A continuacin utilizamos el constructor, que se llama igual que la clase,
String.
En el ejemplo anterior el objeto se creara con la cadena vaca (""), si queremos que tenga un
contenidodebemosutilizarparmetrosenelconstructor,as:
mensaje = new String ("El primer programa");
Javapermiteutilizarla claseString comosideun tipo de datoprimitivosetratara,poresono
hacefaltautilizareloperadornew parainstanciarunobjetodelaclaseString.
Ladeclaracineinstanciacindeunobjetopuederealizarseenlamismainstruccin,as:
String mensaje = new String ("El primer programa");

4.4.Manipulacin.
Una vez creado e instanciado el objeto cmo accedemos a su contenido? Para acceder a los
atributosymtodosdelobjetoutilizaremoselnombredelobjetoseguidodeloperadorpunto(.)yel
nombredelatributoomtodoquequeremosutilizar.Cuandoutilizamoseloperadorpuntosedice
queestamosenviandounmensajealobjeto.Laformageneraldeenviarunmensajeaunobjetoes:
nombre_objeto.mensaje

Porejemplo,paraaccederalasvariablesinstanciaoatributosseutilizalasiguientesintaxis:
nombre_objeto.atributo
Yparaaccederalosmtodosofuncionesmiembrodelobjetoseutilizalasintaxises:
nombre_objeto.mtodo( [par1, par2, ..., parN] )
Enlasentenciaanteriorpar1,par2,etc.sonlosparmetrosqueutilizaelmtodo.Apareceentre
corchetesparaindicarsonopcionales.
Paraentendermejorcmosemanipulanobjetosvamosautilizarunejemplo.Paraellonecesitamos
laBibliotecadeClasesJavaoAPI(ApplicationProgrammingInterfaceInterfazdeprogramacinde
aplicaciones).Unodelospaquetesdelibrerasobibliotecasesjava.awt.Estepaquetecontieneclases
destinadas a la creacin de objetos grficos e imgenes. Vemos por ejemplo cmo crear un
rectngulo.

16

DesarrollodeAplicacionesWeb

Tema3

En primer lugar instanciamos el objeto utilizando el mtodo constructor, que se llama igual que el
objeto,eindicandolosparmetroscorrespondientesalaposicinyalasdimensionesdelrectngulo:
Rectangle rect = new Rectangle(50, 50, 150, 150);
Unavezinstanciadoelobjetorectngulosiqueremoscambiarelvalordelosatributosutilizamosel
operadorpunto.Porejemplo,paracambiarladimensindelrectngulo:
rect.height=100;
rect.width=100;
Obienpodemosutilizarunmtodoparahacerloanterior:
rect.setSize(200, 200);
Acontinuacinpuedesaccederalcdigodelejemplo:
/*
* Muestra como se manipulan objetos en Java
*/
import java.awt.Rectangle;
/**
*
* @author FMA
*/
public class Manipular {
public static void main(String[] args) {
// Instanciamos el objeto rect indicando posicion y dimensiones
Rectangle rect = new Rectangle( 50, 50, 150, 150 );
//Consultamos las coordenadas x e y del rectangulo
System.out.println( "------- Coordenadas esquina superior izqda. -------");
System.out.println("\tx = " + rect.x + "\n\ty = " + rect.y);
// Consultamos las dimensiones (altura y anchura) del rectangulo
System.out.println( "\n----------------- Dimensiones -------------------");
System.out.println("\tAlto = " + rect.height );
System.out.println( "\tAncho = " + rect.width);
//Cambiar coordenadas del rectangulo
rect.height=100;
rect.width=100;
rect.setSize(200, 200);
System.out.println( "\n-- Nuevos valores de los atributos --");
System.out.println("\tx = " + rect.x + "\n\ty = " + rect.y);
System.out.println("\tAlto = " + rect.height );
System.out.println( "\tAncho = " + rect.width);
}
}

4.5.Destruccindeobjetosyliberacindememoria.
Cuandounobjetodejadeserutilizado,esnecesarioliberarelespaciodememoriayotrosrecursos
queposeaparapoderserreutilizadosporelprograma.Aestaaccinseledenominadestruccindel
objeto.

17

Utilizacindeobjetos

DAW

EnJavaladestruccindeobjetoscorreacargodelrecolectordebasura(garbagecollector).Esun
sistemadedestruccinautomticadeobjetosqueyanosonutilizados.Loquesehaceesliberaruna
zonadememoriaquehabasidoreservadapreviamentemedianteeloperadornew.Estoevitaque
losprogramadorestenganquepreocuparsederealizarlaliberacindememoria.
Elrecolectordebasuraseejecutaenmodosegundoplanoydemaneramuyeficienteparanoafectar
alavelocidaddelprogramaqueseestejecutando.Loquehaceesqueperidicamentevabuscando
objetos que ya no son referenciados, y cuando encuentra alguno lo marca para ser eliminado.
Despusloseliminaenelmomentoqueconsideraoportuno.
Justo antes de que un objeto sea eliminado por el recolector de basura, se ejecuta su mtodo
finalize().Siqueremosforzarqueseejecuteelprocesodefinalizacindetodoslosobjetosdel
programa podemos utilizar el mtodo runFinalization() de la clase System. La clase
System formapartedelaBibliotecadeClasesdeJavaycontienediversasclasesparalaentraday
salida de informacin, acceso a variables de entorno del programa y otros mtodos de diversa
utilidad.Paraforzarelprocesodefinalizacinejecutaramos:
System.runFinalization();

Autoevaluacin
Las fases del ciclo de vida de un objeto son: Creacin, Manipulacin y Destruccin.
Verdadero.

Falso.

Efectivamente, los objetos tienen un tiempo de vida limitado y esas son las fases que atraviesan durante su vida til.

18

DesarrollodeAplicacionesWeb

Tema3

5.- Utilizacin de mtodos.


Caso prctico
Mara est contenta con lo que est aprendiendo sobre Java, bsicamente se trata de ampliar sus
conocimientos y con la experiencia que ella tiene no le resultar difcil ponerse a programar en poco
tiempo.
Juan ha comenzado el proyecto de la Clnica Veterinaria y quiere implicarse ella tambin lo antes
posible. Adems, estn los dos becarios Ana y Carlos, que se han incorporado al proyecto hace
poco y hay que comenzar a pensar en tareas para ellos.
Por lo pronto, Mara contina con el documento facilitado por Juan, ahora tiene que ver cmo se
utilizan los mtodos, aunque intuye que no va a ser algo muy diferente a las funciones y
procedimientos de cualquier otro lenguaje.

Losmtodos,juntoconlosatributos,formanparte
delaestructurainternadeunobjeto.Losmtodos
contienen la declaracin de variables locales y las
operacionesquesepuedenrealizarparaelobjeto,
y que son ejecutadas cuando el mtodo es
invocado. Se definen en el cuerpo de la clase y
posteriormentesoninstanciadosparaconvertirseenmtodosinstanciadeunobjeto.

Para utilizar los mtodos adecuadamente es conveniente conocer la estructura bsica de que
disponen.
Al igual que las clases, los mtodos estn
compuestos por una cabecera y un cuerpo. La
cabecera tambin tiene modificadores, en este
caso hemos utilizado public para indicar que
elmtodoespblico,locualquieredecirquele
pueden enviar mensajes no slo los mtodos
del objeto sino los mtodos de cualquier otro
objetoexterno.
Dentro de un mtodo nos encontramos el
cuerpodelmtodoquecontieneelcdigodela
accin a realizar. Las acciones que un mtodo
puederealizarson:
9

Inicializarlosatributosdelobjeto
9 Consultarlosvaloresdelosatributos
9 Modificarlosvaloresdelosatributos
9 Llamaraotrosmtodos,delmismodelobjetoodeobjetosexternos

Citas para pensar


En cuestin de sentido comn tomar un mtodo y probarlo. Pero lo importante es
probaralgo.
(FranklinDelanoRoosevelt)

19

Utilizacindeobjetos

DAW

5.1.Parmetrosyvaloresdevueltos.
Los mtodos se pueden utilizar tanto para consultar informacin sobre el objeto como para
modificarsuestado.Lainformacinconsultadadelobjetosedevuelveatravsdeloqueseconoce
como valor de retorno, y la modificacin del estado del objeto, o sea, de sus atributos, se hace
mediantelalistadeparmetros.
Engeneral,lalistadeparmetrosdeunmtodosepuededeclarardedosformasdiferentes:
9

Porvalor.Elvalordelosparmetrosnosedevuelvealfinalizarelmtodo,esdecir,cualquier
modificacinquesehagaenlosparmetrosnotendrefectounavezsesalgadelmtodo.
Esto es as porque cuando se llama al mtodo desde cualquier parte del programa, dicho
mtodorecibeunacopiadelosargumentos,portantocualquiermodificacinquehagaser
sobrelacopia,nosobrelasvariablesoriginales.
9 Por referencia. La modificacin en los valores de los parmetros s tienen efecto tras la
finalizacin del mtodo. Cuando pasamos una variable a un mtodo por referencia lo que
estamoshaciendoespasarladireccindeldatoenmemoria,portantocualquiercambioen
eldatoseguirmodificadounavezquesalgamosdelmtodo.
En el lenguaje Java, todas las variables se pasan por valor, excepto los objetos que se pasan por
referencia.EnJava,ladeclaracindeunmtodotienedosrestricciones:
9

Unmtodosiempre tieneque devolverunvalor (nohayvalorpordefecto). Estevalor de


retorno es el valor que devuelve el mtodo cuando termina de ejecutarse, al mtodo o
programa que lo llam. Puede ser un tipo primitivo, un tipo referenciado o bien el tipo
void,queindicaqueelmtodonodevuelveningnvalor.
9 Unmtodotieneunnmerofijodeargumentos.Losargumentossonvariablesatravsde
las cuales se pasa informacin al mtodo desde el lugar del que se llame, para que ste
pueda utilizar dichos valores durante su ejecucin. Los argumentos reciben el nombre de
parmetroscuandoaparecenenladeclaracindelmtodo.
Elvalorderetornoeslainformacinquedevuelveunmtodotrassuejecucin.

Segnhemosvistoenelapartadoanterior,lacabeceradeunmtodosedeclaracomosigue:
public tipo_de_dato_devuelto nombre_metodo (lista_de_parametros);
Comovemos,eltipodedatodevueltoaparecedespusdelmodificadorpublicysecorresponde
conelvalorderetorno.
La lista de parmetros aparece al final de la cabecera del mtodo, justo despus del nombre,
encerradosentresignosdeparntesisyseparadosporcomas.Sedebeindicareltipodedatodecada
parmetroas:
(tipo_parmetro1 nombre_parmetro1, ..., tipo_parmetroN nombre_parmetroN)

Cuandosellamealmtodo,sedeberutilizarelnombredelmtodo,seguidodelosargumentosque
debencoincidirconlalistadeparmetros.

20

DesarrollodeAplicacionesWeb

Tema3

Lalistadeargumentosenlallamadaaunmtododebecoincidirennmero,tipoyordenconlos
parmetrosdelmtodo,yaquedelocontrarioseproduciraunerrordesintaxis.
5.2.Constructores.
Recuerdas cuando hablbamos de la creacin e instanciacin de un objeto? Decamos que
utilizbamoseloperadornewseguidodelnombredelaclaseyunaparejadeabrircerrarparntesis.
Adems,elnombredelaclaseerarealmenteelconstructordelamisma,ylodefinamoscomoun
mtodoespecialquesirveparainicializarvalores.Enesteapartadovamosaverunpocomssobre
losconstructores.
Unconstructoresunmtodoespecialconelmismonombredelaclaseyquenodevuelveningn
valortrassuejecucin.

Cuando creamos un objeto debemos instanciarlo


utilizando el constructor de la clase. Veamos la clase
Date proporcionada por la Biblioteca de Clases de
Java. Si queremos instanciar un objeto a partir de la
clase Date tan slo tendremos que utilizar el
constructor seguido de una pareja de abrircerrar
parntesis:
Date fecha = new Date();
Con la anterior instruccin estamos creando un
objetofechadetipoDate,quecontendrlafechayhoraactualdelsistema.
La estructura de los constructores es similar a la de cualquier mtodo, salvo que no tiene tipo de
dato devuelto porque no devuelve ningn valor. Est formada por una cabecera y un cuerpo, que
contienelainicializacindeatributosyrestodeinstruccionesdelconstructor.
Elmtodoconstructortienelassiguientesparticularidades:
9
9
9
9
9

Elconstructoresinvocadoautomticamenteenlacreacindeunobjeto,ysloesavez.
Los constructores no empiezan con minscula, como el resto de los mtodos, ya que se
llamanigualquelaclaseylasclasesempiezanconletramayscula.
Puedehabervariosconstructoresparaunaclase.
Comocualquiermtodo,elconstructorpuedetenerparmetrosparadefinirquvaloresdar
alosatributosdelobjeto.
Elconstructorpordefectoesaqulquenotieneargumentosoparmetros.Cuandocreamos
unobjetollamandoalnombredelaclasesinargumentos,estamosutilizandoelconstructor
pordefecto.
Esnecesario quetodaclasetengaal menos unconstructor.Si nodefinimosconstructores
paraunaclase,ysloenesecaso,elcompiladorcreaunconstructorpordefectovaco,que
inicializa los atributos a sus valores por defecto, segn del tipo que sean: 0 para los tipos
numricos,falseparalosboolean ynull paralostipocarcterylasreferencias.Dicho
constructorloquehaceesllamaralconstructorsinargumentosdelasuperclase(clasedela
cual hereda); si la superclase no tiene constructor sin argumentos se produce un error de
compilacin.

21

Utilizacindeobjetos

DAW

Cuando definimos constructores personalizados, el constructor por defecto deja de existir, y si no


definimos nosotros un constructor sin argumentos cuando intentemos utilizar el constructor por
defectonosdarunerrordecompilacin.

5.3.Eloperadorthis.
Los constructores y mtodos de un objeto
suelenutilizareloperadorthis.Esteoperador
sirveparareferirsealosatributosdeunobjeto
cuando estamos dentro de l. Sobre todo se
utiliza cuando existe ambigedad entre el
nombre de un parmetro y el nombre de un
atributo, entonces en lugar del nombre del
atributo solamente escribiremos this.nombre_atributo, y as no habr duda de a qu
elementonosestamosrefiriendo.
Vamos a ilustrar mediante un ejemplo la utilizacin de objetos y mtodos, as como el uso de
parmetrosyeloperadorthis.Aunquelacreacindeclaseslaveremosenlassiguientesunidades,
en este ejercicio creamos una pequea clase para que podamos instanciar el objeto con el que
vamosatrabajar.
Las clases se suelen representar como un rectngulo, y dentro de l se sitan los atributos y los
mtodosdedichaclase.
Enlaimagen,laclasePajaro estcompuestaportresatributos,unodeelloselnombreyotros
dosqueindicanlaposicindelave,posX yposY.Tienedosmtodosconstructoresyunmtodo
volar().Comosabemos,losmtodosconstructoresrecibenelmismonombredelaclase,ypuede
habervariosparaunamismaclase,dentrodeellasediferencianunosdeotrosporlosparmetros
queutilizan.

Ejercicioresuelto
Dada una clase principal llamada Pajaro, se definen los atributos y mtodos que aparecen en la
imagen.Losmtodosrealizanlassiguientesacciones:
9

pajaro(). Constructor por defecto. En este caso, el constructor por defecto no contiene
ningunainstruccin,yaqueJavainicializadeformaautomticalasvariablesmiembro,sino
ledamosningnvalor.
9 pajaro(String nombre, int posX, int posY). Constructor que recibe como
argumentosunacadenadetextoydosenterosparainicializarelvalordelosatributos.
9 volar(int posX, int posY). Mtodo que recibe como argumentos dos enteros:
posX y posY, y devuelve un valor de tipo double como resultado, usando la palabra
clave return. El valor devuelto es el resultado de aplicar un desplazamiento de acuerdo
conlasiguientefrmula:

Disea un programa que utilice la clase Pajaro, cree una instancia de dicha clase y ejecute sus
mtodos.

22

DesarrollodeAplicacionesWeb

Tema3

LoprimeroquedebemoshacerescrearlaclasePajaro,consusmtodosyatributos.Deacuerdo
conlosdatosquetenemos,elcdigodelaclaseseraelsiguiente:
Debemos tener en cuenta que se trata de una clase
principal, lo cual quiere decir que debe contener un
mtodo main() dentro de ella. En el mtodo
main() vamos a situar el cdigo de nuestro
programa.Elejerciciodicequetenemosquecrearuna
instanciadelaclaseyejecutarsusmtodos,entrelos
que estn el constructor y el mtodo volar().
Tambin es conveniente imprimir el resultado de
ejecutarelmtodovolar().Portanto,loquehara
elprogramasera:
9

Crearunobjetodelaclaseeinicializarlo.
9 Invocaralmtodovolar.
9 Imprimirporpantallaladistanciarecorrida.
Para inicializar el objeto utilizaremos el constructor con parmetros, despus ejecutaremos el
mtodo volar() del objeto creado y finalmente imprimiremos el valor que nos devuelve el
mtodo.Elcdigodelaclasemain()quedaracomosigue:

Siejecutamosnuestroprogramaelresultadoseraelsiguiente:

5.4.Mtodosestticos.
Cuando trabajbamos con cadenas de caracteres utilizando la
claseString,veamoslasoperacionesquepodamoshacercon
ellas: obtener longitud, comparar dos cadenas de caracteres,
cambiar a maysculas o minsculas, etc. Pues bien, sin saberlo
estbamos utilizando mtodos estticos definidos por Java para
la clase String. Pero qu son los mtodos estticos?
Vemoslo.
Los mtodos estticos son aquellos mtodos definidos para una clase que se pueden usar
directamente,sinnecesidaddecrearunobjetodedichaclase.Tambinsellamanmtodosdeclase.
Parallamaraunmtodoestticoutilizaremos:
9

Elnombredelmtodo,silollamamosdesdelamismaclaseenlaqueseencuentradefinido.
9 Elnombredelaclase,seguidoporeloperadorpunto(.)mselnombredelmtodoesttico,
silollamamosdesdeunaclasedistintaalaqueseencuentradefinido:

23

Utilizacindeobjetos

DAW

9 nombre_clase.nombre_metodo_estatico
9 Elnombredelobjeto,seguidoporeloperadorpunto(.)mselnombredelmtodoesttico.
Utilizaremos esta forma cuando tengamos un objeto instanciado de la clase en la que se
encuentradefinidoelmtodoesttico,ynopodamosutilizarlaanterior:
nombre_objeto.nombre_metodo_estatico
Los mtodos estticos no afectan al estado de los objetos instanciados de la clase (variables
instancia),ysuelenutilizarsepararealizaroperacionescomunesatodoslosobjetosdelaclase.Por
ejemplo,sinecesitamoscontarelnmerodeobjetosinstanciadosdeunaclase,podramosutilizarun
mtodo esttico que fuera incrementando el valor de una variable entera de la clase conforme se
vancreandolosobjetos.
EnlaBibliotecadeClasesdeJavaexistenmuchasclasesquecontienenmtodosestticos.Pensemos
en las clases que ya hemos utilizado en unidades anteriores, como hemos comentado la clase
String con todas las operaciones que podamos hacer con ella y con los objetos instanciados a
partirdeella.ObienlaclaseMath.paralaconversindetiposdedatos.Todosellossonmtodos
estticosquelaAPIdeJavadefineparaesasclases.Loimportanteesquetengamosencuentaqueal
tratarsedemtodosestticos,parautilizarlosnonecesitamoscrearunobjetodedichasclases.

Autoevaluacin
Los mtodos estticos, tambin llamados mtodos instancia, suelen utilizarse para
realizar operaciones comunes a todos los objetos de la clase.
Verdadero.

Falso.

Los mtodos estticos no pueden ser mtodos instancia porque se utilizan directamente, sin crear un objeto de la clase

24

DesarrollodeAplicacionesWeb

Tema3

6.- Libreras de objetos (paquetes).


Caso prctico
-Vaya! -exclama Mara- No consigo encontrar la clase Persona dentro del conjunto de clases que
hasta ahora he creado.
-Por qu no pruebas a dividir las clases en paquetes? -pregunta Juan- En un paquete agrupas las
que estn relacionadas, y as te ser ms fcil encontrar una clase la prxima vez. Adems puedes
crear paquetes dentro de otros, como si fuera una estructura de directorios.
-Ah s? Pues es justo lo que necesito para resolver este desorden. Voy a ponerme con ello -aade
Mara.

Conforme nuestros programas se van haciendo ms grandes, el nmero de clases va creciendo.


Metertodaslasclasesennicodirectorionoayudaaqueestnbienorganizadas,lomejoreshacer
grupos de clases, de forma que todas las clases que estn relacionadas o traten sobre un mismo
temaestnenelmismogrupo.
Unpaquetedeclasesesunaagrupacindeclasesqueconsideramosqueestnrelacionadasentres
otratandeuntemacomn.
Lasclasesdeunmismopaquetetienenunaccesoprivilegiadoalosatributosymtodosdeotras
clases de dicho paquete. Es por ello por lo que se considera que los paquetes son tambin, en
ciertomodo,unidadesdeencapsulacinyocultacindeinformacin.
Javanosayudaaorganizarlasclasesenpaquetes.Encadafichero.javaquehagamos,alprincipio,
podemosindicaraqupaquetepertenecelaclasequehagamosenesefichero.
Los paquetes se declaran utilizando la palabra clave package seguida del nombre del paquete.
Paraestablecerelpaquetealqueperteneceunaclasehayqueponerunasentenciadedeclaracin
comolasiguientealprincipiodelaclase:
package Nombre_de_Paquete;
Por ejemplo, si decidimos agrupar en un paquete
"ejemplos" un programa llamado "Bienvenida",
pondramos
en
nuestro
fichero
Bienvenida.java losiguiente:

El cdigo es exactamente igual que como hemos venido haciendo hasta ahora, solamente hemos
aadidolalnea"package ejemplos;"alprincipio.Enlaimagensemuestracmoaparecenlos
paquetesenelentornointegradodeNetbeans.

Debesconocer
En la siguiente presentacin puedes ver una demostracin de cmo hemos creado el
proyectoBienvenida:
Creacindeproyectoconpaquetes

25

Utilizacindeobjetos

DAW

SeleccionamosFichero/Nuevoproyecto

EnlaventanadeproyectonuevoseleccionamosenCategoras
JavayeneltipodeproyectoAplicacinJava

EscribimoselnombredelproyectoBienvenidaysiqueremos
cambiarlaubicacindelosarchivosdelproyectoseleccionamos
Browse

Escribimoselnombredelpaqueteydelaclaseprincipalde
nuestroproyecto

Unavezcreadoelproyectoharemosdobleclicenelarchivodel
paquetedefuentesyescribiremoselcdigodelejemploindicado
enlaunidad

ClicderechosobrelaclaseJavayseleccionamosRunFileoclicen
elbotnejecutar

6.1.Sentenciaimport.
Cuando queremos utilizar una clase que est en un paquete distinto a la clase que estamos
utilizando,sesueleutilizarlasentenciaimport.Porejemplo,siqueremosutilizarlaclaseScanner
queestenelpaquetejava.util delaBibliotecadeClasesdeJava,tendremosqueutilizaresta
sentencia:
import java.util.Scanner;
Sepuedenimportartodaslasclasesdeunpaquete,as:

26

DesarrollodeAplicacionesWeb

import java.awt.*;

Tema3

Estasentenciadebeapareceralprincipiodelaclase,justodespusdelasentenciapackage,sista
existiese.
Tambin podemos utilizar la clase sin sentencia import, en cuyo caso cada vez que queramos
usarladebemosindicarsurutacompleta:
java.util.Scanner teclado = new java.util.Scanner (System.in);
Hasta aqu todo correcto. Sin embargo, al trabajar con paquetes, Java nos obliga a organizar los
directorios,compilaryejecutardeciertaformaparaquetodofuncioneadecuadamente.

6.2.Compilaryejecutarclasesconpaquetes.
Si hacemos que Bienvenida.java pertenezca al paquete ejemplos, debemos crear un subdirectorio
"ejemplos"ymeterdentroelarchivoBienvenida.java.
Porejemplo,enLinuxtendramosestaestructuradedirectorios:
/<directorio_usuario>/Proyecto_Bienvenida/ejemplos/Bienvenida.java
Debemos tener cuidado con las maysculas y las minsculas, para evitar problemas, tenemos que
ponerelnombreen"package"exactamenteigualqueelnombredelsubdirectorio.
Para compilar la clase Bienvenida.java que est en el paquete ejemplos debemos situarnos en el
directoriopadredelpaqueteycompilardesdeah:
$ cd /<directorio_usuario>/Proyecto_Bienvenida
$ javac ejemplos/Bienvenida.java
Sitodovabien,eneldirectorioejemplosnosaparecerlaclasecompiladaBienvenida.class.

Para ejecutar la clase compilada Bienvenida.class que est en el directorio ejemplos,


debemos seguir situados en el directorio padre del paquete. El nombre completo de la clase es
"paquete.clase",esdecir"ejemplos.Bienvenida".Lospasosseranlossiguientes:
$ cd /<directorio_usuario>/Proyecto_Bienvenida
$ java ejemplos/Bienvenida

27

Utilizacindeobjetos

Bienvenido a Java

DAW

Sitodoescorrecto,debesalirelmensaje"BienvenidoaJava"porlapantalla.
Si el proyecto lo hemos creado desde un entorno integrado como Netbeans, la compilacin y
ejecucin se realizar al ejecutar la opcin RunFile (Ejecutar archivo) o hacer clic sobre el botn
Ejecutar.

6.3.Jerarquadepaquetes.
Para organizar mejor las cosas, un paquete, en vez de clases, tambin puede contener otros
paquetes.Esdecir,podemoshacersubpaquetesdelospaquetesysubpaquetesdelossubpaquetesy
as sucesivamente. Esto permite agrupar paquetes relacionados en un paquete ms grande. Por
ejemplo,siquierodividirmisclasesdeejemplosenejemplosbsicosyejemplosavanzados,puedo
ponermsnivelesdepaquetesseparandoporpuntos:
package ejemplos.basicos;
package ejemplos.avanzados;
Aniveldesistemaoperativo,tendramosquecrearlossubdirectoriosbsicosyavanzadosdentrodel
directorioejemplos,ymeterahlasclasesquecorrespondan.
Paracompilar,eneldirectoriodelproyectohabraquecompilarponiendotodoelpathhastallegara
laclase.Esdecir,elnombredelaclasevacontodoslospaquetesseparadosporpuntos,porejemplo
ejemplos.basicos.Bienvenida.
Laestructuradedirectoriosenelsistemaoperativocuandousamossubpaquetessera:
/<directorio_usuario>/Proyecto_Bienvenida/ejemplos/basicos/HolaMundo
.java
Ylacompilacinyejecucinsera:
$ cd /<directorio_usuario>/Proyecto_Bienvenida
$ javac ejemplos/basicos/Bienvenida.java
$ java ejemplos/basicos/Bienvenida
Hola Mundo

28

DesarrollodeAplicacionesWeb

Tema3

La Biblioteca de Clases de Java se organiza haciendo uso de esta jerarqua de paquetes. As por
ejemplo,siquieroaccederalaclaseDate,tendrqueimportarlaindicandosurutacompleta,osea,
java.util.Date,as:
import java.util.Date;

Citas para pensar


Tanbuenocomoesheredarunabiblioteca,esmejorcoleccionaruna.AugustineBirrel

6.4.LibrerasJava.
CuandodescargamoselentornodecompilacinyejecucindeJava,obtenemoslaAPIdeJava.Como
ya sabemos, se trata de un conjunto de bibliotecas que nos proporciona paquetes de clases tiles
paranuestrosprogramas.
UtilizarlasclasesymtodosdelaBibliotecadeJavanosvaayudarareducireltiempodedesarrollo
considerablemente,porloqueesimportantequeaprendamosaconsultarlayconozcamoslasclases
msutilizadas.
LospaquetesmsimportantesqueofreceellenguajeJavason:
9

9
9

9
9
9

java.io.Contienelasclasesquegestionanlaentradaysalida,yaseaparamanipularficheros,
leer o escribir en pantalla, en memoria, etc. Este paquete contiene por ejemplo la clase
BufferedReaderqueseutilizaparalaentradaporteclado.
java.lang.Contienelasclasesbsicasdellenguaje.Estepaquetenoesnecesarioimportarlo,
ya que es importado automticamente por el entorno de ejecucin. En este paquete se
encuentralaclaseObject,quesirvecomorazparalajerarquadeclasesdeJava,olaclase
System queyahemosutilizadoenalgunosejemplosyquerepresentaalsistemaenelque
seestejecutandolaaplicacin.Tambinpodemosencontrarenestepaquetelasclasesque
"envuelven" los tipos primitivos de datos. Lo que proporciona una serie de mtodos para
cadatipodedatodeutilidad,comoporejemplolasconversionesdedatos.
java.util.Bibliotecadeclasesdeutilidadgeneralparaelprogramador.Estepaquetecontiene
por ejemplo la clase Scanner utilizada para la entrada por teclado de diferentes tipos de
datos,laclaseDate,paraeltratamientodefechas,etc.
java.math.Contieneherramientasparamanipulacionesmatemticas.
java.awt. Incluye las clases relacionadas con la construccin de interfaces de usuario, es
decir,lasquenospermitenconstruirventanas,cajasdetexto,botones,etc.Algunasdelas
clasesquepodemosencontrarenestepaquetesonButton,TextField,Frame,Label,
etc.
java.swing.Contieneotroconjuntodeclasesparalaconstruccindeinterfacesavanzadasde
usuario. Los componentes que se engloban dentro de este paquete se denominan
componentes Swing, y suponen una alternativa mucho ms potente que AWT para
construirinterfacesdeusuario.
java.net.ConjuntodeclasesparalaprogramacinenlaredlocaleInternet.
java.sql. Contiene las clases necesarias para programar en Java el acceso a las bases de
datos.
java.security.Bibliotecadeclasesparaimplementarmecanismosdeseguridad.

29

Utilizacindeobjetos

DAW

Como se puede comprobar Java ofrece una completa jerarqua de clases organizadas a travs de
paquetes.

Parasaberms
EnelsiguienteenlacepuedesaccederalainformacinoficialsobrelaBibliotecadeClasesde
Java(estenIngls).
InformacinoficialsobrelaBibliotecadeClasesdeJava.
http://www.oracle.com/technetwork/java/javase/documentation/apijsp136079.html

30

DesarrollodeAplicacionesWeb

Tema3

7.- Programacin de la consola: entrada y


salida de la informacin.
Caso prctico
Juan va a realizar algunas pruebas con el proyecto de la Clnica Veterinaria. Le comenta a Mara que
lo que tienen ahora mismo es la estructura bsica del proyecto, que bsicamente se trata de la
definicin de algunas clases y objetos que se van a utilizar. Van a necesitar introducir datos por
pantalla para ver cmo se comportan esos objetos, y mostrar por pantalla el resultado de
manipularlos. Para ello utilizarn las clases System y Scanner.
Estas clases ya las hemos utilizado anteriormente, estn en los paquetes java.lang y java.util,
respectivamente, observa en el siguiente cdigo cmo las utilizo dice Juan.
De acuerdo, ensame ese cdigo comenta Mara.

Los programas a veces necesitan acceder a los


recursos del sistema, como por ejemplo los
dispositivos de entrada/salida estndar, para
recoger datos de teclado o mostrar datos por
pantalla.
En Java, la entrada por teclado y la salida de
informacin por pantalla se hace mediante la
clase System del paquete java.lang de la
BibliotecadeClasesdeJava.
Comocualquierotraclase,estcompuestademtodosyatributos.LosatributosdelaclaseSystem
sontresobjetosqueseutilizanparalaentradaysalidaestndar.Estosobjetossonlossiguientes:
9

System.in.Entradaestndar:teclado.
9 System.out.Salidaestndar:pantalla.
9 System.err.Salidadeerrorestndar,seproducetambinporpantalla,peroseimplementa
como un fichero distinto al anterior para distinguir la salida normal del programa de los
mensajesdeerror.Seutilizaparamostrarmensajesdeerror.
NosepuedencrearobjetosapartirdelaclaseSystem,sinoqueseutilizadirectamentellamandoa
cualquieradesusmtodosconeloperadordemanipulacindeobjetos,esdecir,eloperadorpunto
(.):
System.out.println("Bienvenido a Java");

Parasaberms
En el siguiente enlace puedes consultar los atributos y mtodos de la clase System del
paquetejava.langpertenecientealaBibliotecadeClasesdeJava:
ClaseSystemdeJava.
http://download.oracle.com/javase/7/docs/api/
Autoevaluacin
La clase System del paquete java.io, como cualquier clase, est formada por mtodos y
atributos, y adems es una clase que no se puede instanciar, sino que se utiliza
directamente.
Verdadero.

Falso.

La clase System pertenece al paquete java.lang.

31

Utilizacindeobjetos

DAW

7.1.ConceptossobrelaclaseSystem.
La lectura por teclado es muy importante cuando
empezamos a hacer nuestros primeros programas.
Para entender mejor en qu consiste la clase
System, y en particular el objeto System.in
vamosadescribirlomsdetenidamente.
En el apartado anterior hemos dicho que System.in
es un atributo de la clase System, que est dentro
delpaquetejava.lang.Peroadems,siconsultamoslaBibliotecadeClasesdeJava,nosdamos
cuenta que es un objeto, y como todos los objetos debe ser instanciado. En efecto, volviendo a
consultarlabibliotecadeclasesnosdamoscuentaqueSystem.in esunainstanciadeunaclase
dejavaquesellamaInputStream.
En Java, InputStream nos permite leer en bytes, desde teclado, un archivo o cualquier otro
dispositivo de entrada. Con esta clase podemos utilizar por ejemplo el mtodo read() que
permiteleerunbytedelaentradaoskip(long n),quesaltanbytesdelaentrada.Peroloque
realmente nos interesa es poder leer texto o nmeros, no bytes, para hacernos ms cmoda la
entradadedatos.Paraelloseutilizanlasclases:
9

InputStreamReader. Convierte los bytes ledos en


caracteres.Particularmente,nosvaaservirparaconvertir
el objeto System.in en otro tipo de objeto que nos
permitaleercaracteres.
9 BufferedReader. Lee hasta un fin de lnea. Esta es la
clase que nos interesa utilizar, pues tiene un mtodo
readLine()quenosvaapermitirleercaractereshasta
elfinaldelnea.

LaformadeinstanciarestasclasesparausarlasconSystem.ineslasiguiente:
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader (isr);
En el cdigo anterior hemos creado un InputStreamReader a partir de System.ini y
pasamosdichoInputStreamReader alconstructordeBufferedReader.Elresultadoesque
laslecturasquehagamosconelobjetobr sonenrealidadrealizadassobreSystem.in,perocon
laventajadequepodemosleerunalneacompleta.As,porejemplo,siescribimosunaA,con:
String cadena = br.readLine();
Obtendremosencadenauna"A".
Sinembargo,seguimosnecesitandohacerlaconversinsiqueremosleernmeros.Porejemplo,si
escribimos un entero 32, en cadena obtendremos "32". Si recordamos, para convertir cadenas de

32

DesarrollodeAplicacionesWeb

Tema3

texto a enteros se utiliza el mtodo esttico parseInt() de la clase Integer, con lo cual la
lecturalaharamosas:
int numero = Integer.parseInt (br.readLine());

7.2.Entradaporteclado.ClaseSystem.
AcontinuacinvamosaverunejemplodecmoutilizarlaclaseSystem paralaentradadedatos
portecladoenJava.
Comoyahemosvistoenunidadesanteriores,paracompilaryejecutarelejemplopuedesutilizarlas
rdenes javac y java, o bien crear un nuevo proyecto en Netbeans y copiar el cdigo que se
proporcionaenelarchivosiguiente:
import java.io.BufferedReader;
import java.io.InputStreamReader;
/*
* Ejemplo de entrada por teclado con la clase System
*/
/**
*
* @author FMA
*/
public class EntradaTecladoSystem {
public static void main(String[] args) {
try{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.print("Introduce el texto: ");
String cad = br.readLine();
//salida por pantalla del texto introducido
System.out.println(cad);
System.out.print("Introduce un numero: ");
int num = Integer.parseInt(br.readLine());
// salida por pantalla del numero introducido
System.out.println(num);
} catch (Exception e) {
// System.out.println("Error al leer datos");
e.printStackTrace();
}
}
}

Observaquehemosmetidoelcdigoentreexcepcionestry-catch.Cuandoennuestroprograma
fallaalgo,porejemplolaconversindeunString aint,Javanosavisalanzandoexcepciones.Si
"capturamos"esaexcepcinennuestroprograma,podemosavisaralusuariodequhapasado.Esto
esconvenienteporquesinotratamoslaSystem excepcinseguramenteelprogramasepareyno
siga ejecutndose. El control de excepciones lo veremos en unidades posteriores, ahora slo nos
bastasaberqueenlasllavesdeltry colocamoselcdigoquepuedefallaryenlasllavesdelcatch
eltratamientodelaexcepcin.

7.3.Entradaporteclado.ClaseScanner.
Laentradaportecladoquehemosvistoenelapartadoanteriortieneelinconvenientedequeslo
podemos leer de manera fcil tipos de datos String. Si queremos leer otros tipos de datos
deberemosconvertirlacadenadetextoledaenesostiposdedatos.

33

Utilizacindeobjetos

DAW

ElkitdeDesarrollodeJava,apartirdesuversin1.5,incorporalaclasejava.util.Scanner,la
cualpermiteleertiposdedatosString,int,long,etc.,atravsdelaconsoladelaaplicacin.
Porejemploparaleeruntipodedatosenteroportecladosera:
Scanner teclado = new Scanner (System.in);
int i = teclado.nextInt ();
Obienestaotrainstruccinparaleerunalneacompleta,incluidotexto,nmerosoloquesea:
String cadena = teclado.nextLine();
En las instrucciones anteriores hemos creado un objeto de la clase Scanner llamado teclado
utilizandoelconstructordelaclase,alcuallehemospasadocomoparmetrolaentradabsicadel
sistemaSystem.inquepordefectoestasociadaalteclado.
Para conocer cmo funciona un objeto de la clase Scanner te proporcionamos el siguiente
ejemplo:
import java.util.Scanner;
/*
* Ejemplo de entrada de teclado con la clase Scanner
*/
/**
*
* @author FMA
*/
public class EntradaTecladoScanner {
public static void main(String[] args) {
// Creamos objeto teclado
Scanner teclado = new Scanner(System.in);
// Declaramos variables a utilizar
String nombre;
int edad;
boolean estudias;
float salario;
// Entrada de datos
System.out.println("Nombre: ");
nombre=teclado.nextLine();
System.out.println("Edad: ");
edad=teclado.nextInt();
System.out.println("Estudias: ");
estudias=teclado.nextBoolean();
System.out.println("Salario: ");
salario=teclado.nextFloat();
// Salida de datos
System.out.println("Bienvenido: " + nombre);
System.out.println("Tienes: " + edad +" aos");
System.out.println("Estudias: " + estudias);
System.out.println("Tu salario es: " + salario +" euros");
}
}

Parasaberms
SiquieresconoceralgomssobrelaclaseScannerpuedesconsultarelsiguienteenlace:
CapturardatosdesdetecladoconScanner.

34

DesarrollodeAplicacionesWeb

Tema3

http://chuwiki.chuidiang.org/index.php?title=Lectura_de_teclado_en_java

7.4.Salidaporpantalla.

LasalidaporpantallaenJavasehaceconelobjetoSystem.out.
Este objeto es una instancia de la clase PrintStream del
paquete java.lang. Si miramos la API de PrintStream
obtendremos la variedad de mtodos para mostrar datos por
pantalla,algunosdeestosson:
9

void print(String s):Escribeunacadenadetexto.


9 void println(String x):Escribeunacadenadetextoyterminalalnea.
9 void printf(String format, Object args): Escribe una cadena de texto
utilizandoformato.
En la orden print y println, cuando queramos escribir un mensaje y el valor de una variable
debemosutilizareloperadordeconcatenacindecadenas(+),porejemplo:
System.out.println(Bienvenido, + nombre);
Escribeelmensajede"Bienvenido,Carlos",sielvalordelavariablenombreesCarlos.
Lasrdenesprint yprintln todaslasvariablesqueescribenlasconsiderancomocadenasde
textosinformato,porejemplo,noseraposibleindicarqueescribaunnmerodecimalcondoscifras
decimalesoredondearlascifras,oescribirlospuntosdelosmiles,porejemplo.Paraelloseutilizala
ordenprintf().
La orden printf() utiliza unos cdigos de conversin para indicar si el contenido a mostrar de
qutipoes.Estoscdigossecaracterizanporquellevandelanteelsmbolo%,algunosdeellosson:
9
9
9
9
9

%c:Escribeuncarcter.
%s:Escribeunacadenadetexto.
%d:Escribeunentero.
%f:Escribeunnmeroenpuntoflotante.
%e:Escribeunnmeroenpuntoflotanteennotacincientfica.

Porejemplo,siqueremosescribirelnmerofloat12345.1684conelpuntodelosmilesyslodos
cifrasdecimaleslaordensera:
System.out.printf("% ,.2f\n", 12345.1684);
Estaordenmostraraelnmero12.345,17porpantalla.
Estasrdenespuedenutilizarlassecuenciasdeescapequevimosenunidadesanteriores,como"\n"
paracrearunsaltodelnea,"\t"paraintroducirunsaltodetabulacineneltexto,etc.

Parasaberms

35

Utilizacindeobjetos

DAW

Si quieres conocer algo ms sobre la orden printf() en el siguiente enlace tienes varios
ejemplosdeutilizacin:
Salidadedatosconlaordenprintf().
http://www.java2s.com/Tutorial/Java/0120__Development/UsingJavasprintfMethod.htm
EnesteotroenlacepuedesverunejemplointeresantedeusodelaclaseScannerjuntocon
lasrdenesprintfyprintln:
Ejemplodeentradaysalidadedatos.
http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter09/scannerConsol
e.html

7.5.Salidadeerror.
La salida de error est representada por el objeto System.err. Este objeto es tambin una
instancia de la clase PrintStream, por lo que podemos utilizar los mismos mtodos vistos
anteriormente.
Noparecemuytilutilizarout yerr sisudestinoeslamismapantalla,oalmenosenelcasode
la consola del sistema donde las dos salidas son representadas con el mismo color y no notamos
diferencia alguna. En cambio en la consola de varios entornos integrados de desarrollo como
NetBeansoEclipselasalidadeerr seveenuncolordiferente.Teniendoelsiguientecdigo:

LasalidadeesteejemploenNetbeanses:

ComovemosenunentornocomoNetbeans,utilizarlasdossalidasnospuedeayudaraunamejor
depuracindelcdigo.

Autoevaluacin
Relaciona cada clase con su funcin, escribiendo el nmero asociado a la funcin en el
hueco correspondiente.
Clase.

Relacin.

Funcin.

Scanner

1. Convierte los bytes ledos en caracteres.

PrintStream

2. Lee hasta un fin de lnea.

InputStreamReader

3. Lee diferentes tipos de datos desde la consola de la


aplicacin.

BufferedReader

4. Contiene varios mtodos para mostrar datos por pantalla.

PrintStream se utiliza para la salida de datos por pantalla y las otras clases, para la entrada de datos por teclado.

36

TEMA4

Contenido

1.Introduccin........................................................................................................................................1
2.Sentenciasybloques...........................................................................................................................3
3.Estructurasdeseleccin......................................................................................................................6
3.1.Estructuraifeifelse....................................................................................................................................7
3.2.Estructuraswitch.........................................................................................................................................9
4.Estructurasderepeticin..................................................................................................................11
4.1.Estructurafor.............................................................................................................................................11
4.2.Estructurafor/in.........................................................................................................................................13
4.3.Estructurawhile.........................................................................................................................................14
4.4.Estructuradowhile....................................................................................................................................15
5.Estructurasdesalto...........................................................................................................................17
5.1.Sentenciasbreakycontinue......................................................................................................................17
5.2.Etiquetas....................................................................................................................................................18
5.3.SentenciaReturn........................................................................................................................................19
6.Excepciones.......................................................................................................................................21
6.1.Capturarunaexcepcin.............................................................................................................................22
EJERCICIORESUELTO.......................................................................................................................................................................23
6.2.Elmanejodeexcepciones..........................................................................................................................24
6.3.Delegacindeexcepcionesconthrows.....................................................................................................25

7.Pruebadeprogramas........................................................................................................................26
7.1.Laespecificacin........................................................................................................................................27
7.2.Pruebasexhaustivas...................................................................................................................................27
7.3.PruebasdeCajaNegraoPruebasFuncionales..........................................................................................28
7.4.PruebasdeCajaBlancaoPruebasEstructurales.......................................................................................28
7.5.Otraspruebas.............................................................................................................................................29
Sabidurapopular:Cuatroojosvenmsquedos..........................................................................................29
7.6.RealizacindePruebasUnitariasconJUnit...............................................................................................30
TestconJUnit..................................................................................................................................................................30
8.Depuracindeprogramas.................................................................................................................36
DepuracinbsicaenNetBeans.......................................................................................................................39
9.Documentacindelcdigo................................................................................................................45
R.Caron.:"donotdocumentbadcoderewriteit".........................................................................................46
9.1Etiquetasyposicin....................................................................................................................................46
9.2.Usodelasetiquetas...................................................................................................................................47
9.3.Ordendelasetiquetas...............................................................................................................................48
DocumentacindeclasesconJavadoc............................................................................................................................................49

DiseodeAplicacionesWeb

Tema4

1. Introduccin
CASO PRCTICO
Los miembros de BK Programacin estn inmersos en el mundo de Java, ya conocen una buena
parte del lenguaje y ahora van a empezar a controlar el comportamiento de sus programas.
Mara pregunta a Juan: Dime Juan, En Java tambin hay condicionales y bucles?
Efectivamente Mara, como la gran mayora de los lenguajes de programacin, Java incorpora
estructuras que nos permiten tomar decisiones, repetir cdigo, etc. Cada estructura tiene sus ventajas
e inconvenientes y hay que saber dnde utilizar cada una de ellas. Aclara Juan.

EnunidadesanterioreshaspodidoaprendercuestionesbsicassobreellenguajeJAVA:definicinde
variables, tipos de datos, asignacin de valores, uso de literales, diferentes operadores que se
pueden aplicar, conversiones de tipos, insercin de comentarios, etc. Posteriormente, nos
sumergimos de lleno en el mundo de los objetos. Primero hemos conocido su filosofa, para ms
tardeirrecorriendolosconceptosytcnicasmsimportantesrelacionadasconellos:
Propiedades,mtodos,clases,declaracinyusodeobjetos,libreras,etc.
Vale,pareceserquetenemosloselementossuficientesparacomenzaragenerarprogramasescritos
enJAVA,Seguro?.
REFLEXIONA
Piensaenlasiguientepregunta:Cmounprogramapuededeterminarlaaparicinenpantallade
unmensajedeXITOoERROR,segnlosdatosdeentradaaportadosporunusuario?
Nosonslolosdatosdeentradaaportadosporunusuario,existenmsvariables.Sigueconatencinlaunidadylocomprenders.

Como habrs deducido, con lo que sabemos hasta ahora no es suficiente. Existen mltiples
situaciones que nuestros programas deben representar y que requieren tomar ciertas decisiones,
ofrecer diferentes alternativas o llevar a cabo determinadas operaciones repetitivamente para
conseguirsusobjetivos.
Si has programado alguna vez o tienes ciertos conocimientos bsicos sobre lenguajes de
programacin, sabes que la gran mayora de lenguajes poseen estructuras que permiten a los
programadorescontrolarelflujodelainformacindesusprogramas.Estorealmenteesunaventaja
paralapersonaqueestaprendiendounnuevolenguaje,otieneprevistoaprendermsdeuno,ya
que estas estructuras suelen ser comunes a todos (con algunos cambios de sintaxis o conjunto de
reglasquedefinenlassecuenciascorrectasdelos elementosdeunlenguajedeprogramacin.).Es
decir,siconocassentenciasdecontroldeflujoenotroslenguajes,loquevamosaveralolargode
estaunidadtevaasonarbastante.
Paraalguienquenohaprogramadonunca,unejemplosencillolevaapermitirentenderqueseso
delassentenciasdecontroldeflujo.Piensaenunfontanero(programador),principalmentetrabaja
conagua(datos)yseencargadehacerquestafluyapordondelquiere(programa)atravsdeun
conjuntodetuberas,codos,latiguillos,llavesdepaso,etc.(sentenciasdecontroldeflujo).
Pues esas estructuras de control de flujo son las que estudiaremos, conoceremos su estructura,
funcionamiento, cmo utilizarlas y dnde. A travs de ellas, al construir nuestros programas
podremoshacerquelosdatos(agua)fluyanporloscaminosadecuadospararepresentarlarealidad
delproblemayobtenerunresultadoadecuado.

Usodeestructurasdecontrol

DAW

Lostiposdeestructurasdeprogramacinqueseempleanparaelcontroldelflujodelosdatosson
lossiguientes:
9 Secuencia: compuestas por 0, 1 o N sentencias que se ejecutan en el orden en que han sido
escritas.Eslaestructuramssencillaysobrelaqueseconstruirnelrestodeestructuras.
9 Seleccin: es un tipo de sentencia especial de decisin y de un conjunto de secuencias de
instrucciones asociadas a ella. Segn la evaluacin de la sentencia de decisin se generar un
resultado(quesueleserverdaderoofalso)yenfuncindeste,seejecutarnunasecuenciade
instruccionesuotra.Lasestructurasdeseleccinpodrnsersimples,compuestasymltiples.
9 Iteracin: es un tipo de sentencia especial de decisin y una secuencia de instrucciones que
puedenserrepetidassegnelresultadodelaevaluacindelasentenciadedecisin.Esdecir,la
secuenciadeinstruccionesseejecutarrepetidamentesilasentenciadedecisinarrojaunvalor
correcto,enotrolaestructuraderepeticinsedetendr.
Adems de las sentencias tpicas de control de flujo, en esta unidad haremos una revisin de las
sentenciasdesalto,queaunquenosondemasiadorecomendables,esnecesarioconocerlas.Como
nuestrosprogramaspodrngenerarerroresysituacionesespeciales,echaremosunvistazoalmanejo
deexcepcionesenJAVA.Posteriormente,analizaremoslamejormaneradellevaracabolaspruebas
de nuestros programas y la depuracin de los mismos. Y finalmente, aprenderemos a valorar y
utilizarlasherramientasdedocumentacindeprogramas.
Vamosentoncesaponernoselmonodetrabajoyacogernuestracajadeherramientas,aversino
nosmojamosmucho!

DiseodeAplicacionesWeb

Tema4

2. Sentencias y bloques
CASO PRCTICO
Ada valora muy positivamente en un programador el orden y la pulcritud. Organizar correctamente el
cdigo fuente es de vital importancia cuando se trabaja en entornos colaborativos, en los que son
varios los desarrolladores los que forman los equipos de programacin. Por ello, incide en la
necesidad de recordar a Juan y Mara las nociones bsicas a la hora de escribir programas.

Este epgrafe lo utilizaremos para reafirmar cuestiones que son obvias y que en el transcurso de
anterioresunidadessehandadoporsabidas.Aunque,aveces,esconvenienterecordar.Loharemos
comounconjuntodeFAQs:
9 Cmo se escribe un programa sencillo? Si queremos que un programa sencillo realice
instrucciones o sentencias para obtener un determinado resultado, es necesario colocar stas
unadetrsdelaotra,exactamenteenelordenenquedebenejecutarse.
9 Podran colocarse todas las sentencias una detrs de otra, separadas por puntos y comas en
unamismalnea?,claroques,peronoesmuyrecomendable.Cadasentenciadebeestarescrita
enunalnea,deestamaneratucdigosermuchomslegibleylalocalizacindeerroresentus
programas ser ms sencilla y rpida. De hecho, cuando se utilizan herramientas de
programacin,loserroressuelenasociarseaunnmeroonmerosdelnea.
9 Puede una misma sentencia ocupar varias lneas en el programa?, s. Existen sentencias que,
porsutamao,puedengenerarvariaslneas.Perosiemprefinalizarnconunpuntoycoma.
9 EnJavatodaslassentenciasseterminanconpuntoycoma?,Efectivamente.Sidetrsdeuna
sentenciahadevenirotra,pondremosunpuntoycoma.Escribiendolasiguientesentenciaen
una nueva lnea. Pero en algunas ocasiones, sobre todo cuando utilizamos estructuras de
controldeflujo,detrsdelacabeceradeunaestructuradeestetiponodebecolocarsepuntoy
coma.Notepreocupes,loentenderscuandoanalicemoscadaunadeellas.
9 Qu es la sentencia nula en Java? La sentencia nula es una lnea que no contiene ninguna
instruccinyenlaquesloexisteunpuntoycoma.Comosunombreindica,estasentenciano
hacenada.
9 Quesunbloquedesentencias?Esunconjuntodesentenciasqueseencierraentrellavesy
queseejecutaracomosifueraunanicaorden.Sirveparaagruparsentenciasyparaclarificar
elcdigo.LosbloquesdesentenciassonutilizadosenJavaenlaprcticatotalidaddeestructuras
decontroldeflujo,clases,mtodos,etc.Lasiguientetablamuestradosformasdeconstruirun
bloquedesentencias.
Bloquedesentencias1

Bloquedesentencias2
{
sentencia1;
sentencia2;
;
sentenciaN;

{sentencia1; sentencia2;...; sentencia N;}


}

9 Enunbloquedesentencias,stasdebenestarcolocadasconunordenexacto?Enciertoscasos
s,aunquesialfinaldesuejecucinseobtieneelmismoresultado,podranocupardiferentes
posicionesennuestroprograma.

Usodeestructurasdecontrol

DAW

DEBESCONOCER
Observa los tres archivos que te ofrecemos a continuacin y compara su cdigo fuente.
Versquelostresobtienenelmismoresultado,perolaorganizacindelassentenciasque
loscomponenesdiferenteentreellos.
Sentencias,bloquesydiferentesorganizaciones
package organizacion_sentencias;
/**
*
* Organizacin de sentencias secuencial
*/
public class Organizacion_sentencias_1 {
public static void main(String[] args) {
System.out.println ("Organizacin secuencial de sentencias");
int dia=12;
System.out.println ("El da es: " + dia);
int mes=11;
System.out.println ("El mes es: " + mes);
int anio=2011;
System.out.println ("El anio es: " + anio);
}
}

Enesteprimerarchivo,lassentenciasestncolocadasenordensecuencial.
package organizacion_sentencias;
/**
*
* Organizacin de sentencias con declaracin previa
* de variables
*/
public class Organizacion_sentencias_2 {
public static void main(String[] args) {
// Zona de declaracin de variables
int dia=10;
int mes=11;
int anio=2011;
System.out.println ("Organizacin con declaracin previa de variables");
System.out.println ("El da es: " + dia);
System.out.println ("El mes es: " + mes);
System.out.println ("El anio es: " + anio);
}
}

Enestesegundoarchivo,sedeclaranalprincipiolasvariablesnecesarias.
EnJavanoesimprescindiblehacerloas,perosqueantesdeutilizarcualquiervariablestadebe
estarpreviamentedeclarada.Aunqueladeclaracindedichavariablepuedehacerseencualquier
lugardenuestroprograma.
package organizacion_sentencias;
/**
*
* Organizacin de sentencias en zonas diferenciadas
* segn las operaciones que se realicen en el cdigo
*/
public class Organizacion_sentencias_3 {
public static void main(String[] args) {
// Zona de declaracin de variables
int dia;
int mes;
int anio;
String fecha;
//Zona de inicializacin o entrada de datos
dia=10;
mes=11;
anio=2011;
fecha="";
//Zona de procesamiento
fecha=dia+"/"+mes+"/"+anio;

DiseodeAplicacionesWeb

Tema4

//Zona de salida
System.out.println ("Organizacin con zonas diferenciadas en el cdigo");
System.out.println ("La fecha es: " + fecha);
}
}

En este tercer archivo, podrs apreciar que se ha organizado el cdigo en las siguientes partes:
declaracin de variables, peticin de datos de entrada, procesamiento de dichos datos y
obtencin de la salida. Este tipo de organizacin est ms estandarizada y hace que nuestros
programasganenenlegibilidad.

Construyas de una forma o de otra tus programas, debes tener en cuenta siempre en Java las
siguientespremisas:
9 Declaracadavariableantesdeutilizarla.
9 Inicializaconunvalorcadavariablelaprimeravezquelautilices.
9 No es recomendable usar variables no inicializadas en nuestros programas, pueden provocar
erroresoresultadosimprevistos.

AUTOEVALUACIN
Indica qu afirmacin es correcta:

Paracrearunbloquedesentencias,esnecesariodelimitarstasentrellaves.Estebloque
funcionarcomosihubiramoscolocadounanicaorden.
LasentencianulaenJava,sepuederepresentarconunpuntoycomasloenunanicalnea.
ParafinalizarenJavacualquiersentencia,esnecesariohacerloconunpuntoycoma.
Todaslasafirmacionessoncorrectas.

Usodeestructurasdecontrol

DAW

3. Estructuras de seleccin
CASO PRCTICO
Juan est desarrollando un mtodo en el que ha de comparar los valores de las entradas de un login
y una contrasea hechas desde el teclado, con los valores almacenados en una base de datos. Para
poder hacer dicha comparacin necesitar utilizar una estructura condicional que le permita llevar a
cabo esta operacin, incluso necesitar que dicha estructura condicional sea capaz de decidir qu
hacer en funcin de si ambos valores son correctos o no.

Al principio de la unidad nos hacamos esta pregunta: Cmo un programa puede determinar la
aparicinenpantalladeunmensajedeXITOoERROR,segnlosdatosdeentradaaportadosporun
usuario?. Esta y otras preguntas se nos plantean en mltiples ocasiones cuando desarrollamos
programas.
Cmoconseguimosquenuestrosprogramaspuedantomardecisiones?Paracomenzar,loharemos
a travs de las estructuras de seleccin. Estas estructuras constan de una sentencia especial de
decisinydeunconjuntodesecuenciasdeinstrucciones.
El funcionamiento es sencillo, la sentencia de decisin ser evaluada y sta devolver un valor
(verdaderoofalso),enfuncindelvalordevueltoseejecutarunasecuenciadeinstruccionesuotra.
Por ejemplo, si el valor de una variable es mayor o igual que 5 se imprime por pantalla la palabra
APROBADOysiesmenor,seimprimeSUSPENSO.Paraesteejemplo,lacomprobacindelvalordela
variable ser la sentencia especial de decisin. La impresin de la palabra APROBADO ser una
secuenciadeinstruccionesylaimpresindelapalabraSUSPENSOserotra.Cadasecuenciaestar
asociada a cada uno de los resultados que puede arrojar la evaluacin de la sentencia especial de
decisin.

PARASABERMS
En el lenguaje de programacin C, verdadero o falso se representan mediante un literal
entero. 0 representar Falso y 1 o cualquier otro valor, representar Verdadero. Como
sabes,enJavalasvariablesdetipobooleano(en computacin es aquel que puede representar valores de lgica
binaria,estoes2 valores,valoresquenormalmenterepresentanfalsooverdadero)slopodrntomarlosvalorestrue
(verdadero)ofalse(falso).
Laevaluacindelassentenciasdedecisinoexpresionesquecontrolanlasestructurasde
seleccin,devolvernsiempreunvalorverdaderoofalso.
Lasestructurasdeseleccinsedividenen:
1.
2.
3.
4.

Estructurasdeseleccinsimplesoestructuraif.
Estructurasdeseleccincompuestaoestructuraifelse.
Estructurasdeseleccinbasadaseneloperadorcondicional.
Estructurasdeseleccinmltiplesoestructuraswitch.

A continuacin, detallaremos las caractersticas y funcionamiento de cada una de ellas. Es


importantequeatravsdelosejemplosquevamosaver,puedasdeterminarenqucircunstancias
utilizarcadaunadeestasestructuras.Aunqueunmismoproblemapuedeserresueltocondiferentes
estructuraseincluso,condiferentescombinacionesdestas.

DiseodeAplicacionesWeb

Tema4

3.1.Estructuraifeifelse
La estructura if es una estructura de seleccin o estructura condicional, en la que se evala una
expresin lgica o sentencia de decisin y en funcin del resultado, se ejecuta una sentencia o un
bloquedestas.
Laestructuraif puedepresentarsedelassiguientesformas:
Estructuraif simple.

if (expresin-lgica)
sentencia1;

Estructuraif dedoblealternativa.

if (expresin-lgica)
{
sentencia1;
sentencia2;
;
sentenciaN;
}

Si la evaluacin de la expresinlgica ofrece un resultado


verdadero,seejecutalasentencia1obienelbloquedesentencias
asociado. Si el resultado de dicha evaluacin es falso, no se
ejecutar ninguna instruccin asociada a la estructura
condicional.

if (expresin-lgica)
{
sentencia1;
if (expresin-lgica)
;
sentencia1;
sentenciaN;
else
} else {
sentencia1;
sentencia2;
;
sentenciaN;
}
Si la evaluacin de la expresinlgica ofrece un resultado
verdadero,seejecutarlaprimerasentenciaoelprimerbloquede
sentencias.Si,porelcontrario,laevaluacindelaexpresinlgica
ofreceunresultadofalso,noseejecutarlaprimerasentenciaoel
primerbloqueysseejecutarlasegundasentenciaoelsegundo
bloque.

Haciendo una interpretacin cercana al pseudocdigo


tendramosquesisecumplelacondicin(expresinlgica),
seejecutarunconjuntodeinstruccionesysinosecumple,
seejecutarotroconjuntodeinstrucciones.
Hay que tener en cuenta que la clusula else de la
sentencia if no es obligatoria. En algunos casos no
necesitaremos utilizarla, pero s se recomienda cuando es
necesario llevar a cabo alguna accin en el caso de que la
expresinlgicanosecumpla.
Enaquelloscasosenlosquenoexisteclusulaelse,silaexpresinlgicaesfalsa,simplementese
continuarnejecutandolassiguientessentenciasqueaparezcanbajolaestructuracondicionalif.
Los condicionales if e if-else pueden anidarse, de tal forma que dentro de un bloque de
sentencias puede incluirse otro if o if-else. El nivel de anidamiento queda a criterio del
programador, pero si ste es demasiado profundo podra provocar problemas de eficiencia y
legibilidad en el cdigo. En otras ocasiones, un nivel de anidamiento excesivo puede denotar la
necesidaddeutilizacindeotrasestructurasdeseleccinmsadecuadas.
Cuandoseutilizaanidamientodeestetipodeestructuras,esnecesarioponerespecialatencinen
saberaquif estasociadaunaclusulaelse.Normalmente,unelse estarasociadoconel
if inmediatamente superior o ms cercano que exista dentro del mismo bloque y que no se
encuentreyaasociadoaotroelse.

DEBESCONOCER
Paracompletarlainformacinquedebessabersobrelasestructurasifeifelse,observael
siguiente cdigo. En l podrs analizar el programa que realiza el clculo de la nota de un
examen de tipo test. Adems de calcular el valor de la nota, se ofrece como salida la

Usodeestructurasdecontrol

DAW

calificacin no numrica de dicho examen. Para obtenerla, se combinarn las diferentes


estructurascondicionalesaprendidashastaahora.
Prestaespecialatencinaloscomentariosincorporadosenelcdigofuente,ascomoala
forma de combinar las estructuras condicionales y a las expresiones lgicas utilizadas en
ellas.
package sentencias_condicionales;
/**
*
* Ejemplos de utilizacin de diferentes estructuras
* condicionales simples, completas y anidamiento de stas.
*/
public class Sentencias_condicionales {
/*Vamos a realizar el clculo de la nota de un examen
* de tipo test. Para ello, tendremos en cuenta el nmero
* total de pregunta, los aciertos y los errores. Dos errores
* anulan una respuesta correcta.
*
* Finalmente, se muestra por pantalla la nota obtenida, as
* como su calificacin no numrica.
*
* La obtencin de la calificacin no numrica se ha realizado
* combinando varias estructuras condicionales, mostrando expresiones
* lgicas compuestas, as como anidamiento.
*
*/
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int num_aciertos = 12;
int num_errores = 3;
int num_preguntas = 20;
float nota = 0;
String calificacion="";
//Procesamiento de datos
nota = ((num_aciertos - (num_errores/2))*10)/num_preguntas;
if (nota < 5)
{
calificacion="INSUFICIENTE";
}
else
{
/* Cada expresin lgica de estos if est compuesta por dos
* expresiones lgicas combinadas a travs del operador Y o AND
* que se representa con el smbolo &&. De tal manera, que para
* que la expresin lgica se cumpla (sea verdadera) la variable
* nota debe satisfacer ambas condiciones simultneamente
*/
if (nota >= 5 && nota <6)
calificacion="SUFICIENTE";
if (nota >= 6 && nota <7)
calificacion="BIEN";
if (nota >= 7 && nota <9)
calificacion="NOTABLE";
if (nota >= 9 && nota <=10)
calificacion="SOBRESALIENTE";
}
//Salida de informacin
System.out.println ("La nota obtenida es: " + nota);
System.out.println ("y la calificacin obtenida es: " + calificacion);
}
}

DiseodeAplicacionesWeb

Tema4

AUTOEVALUACIN
Cundo se mostrar por pantalla el mensaje incluido en el siguiente fragmento de
cdigo?
If (numero % 2 == 0);
System.out.print(El nmero es par /n);

Nunca

Siempre

Cuandoelrestodeladivisinentre2delcontenidodelavariablenumero,seacero.

Aunquedetrsdelaexpresinlgicadelaestructuraifexisteunpuntoycoma,lasentenciaqueimprimeelmensajeenpantallasiempre
seejecutar.

3.2.Estructuraswitch
Qu podemos hacer cuando nuestro programa debe elegir entre ms de dos alternativas?, una
posiblesolucinpodraseremplearestructurasifanidadas,aunquenosiempreestasolucinesla
ms eficiente. Cuando estamos ante estas situaciones podemos utilizar la estructura de seleccin
mltipleswitch.Enlasiguientetablasemuestratantolasintaxis,comoelfuncionamientodeesta
estructura.
Estructuraswitch
Sintaxis:

Condiciones:
9 Dondeexpresindebeserdeltipochar,
byte,shortoint,ylasconstantesdecada
casedebenserdeestetipoodeuntipo
compatible.
9 Laexpresindebeirentreparntesis.
9 Cadacasellevarasociadounvaloryse
finalizarcondospuntos.
9 Elbloquedesentenciasasociadoala
clusuladefaultpuedefinalizarconuna
sentenciaderupturabreakono.

switch (expresion) {
case valor1:
sentencia1_1;
sentencia1_2;
.
break;
.
.
case valorN:
sentenciaN_1;
sentenciaN_2;
.
break;
default:
sentencias-default;
}

Funcionamiento:
9 Las diferentes alternativas de esta estructura estarn precedidas de la clusula case que se
ejecutarcuandoelvalorasociadoalcasecoincidaconelvalorobtenidoalevaluarlaexpresin
delswitch.
9 Enlasclusulascase,nopuedenindicarseexpresionescondicionales,rangosdevaloresolistas
de valores. (otros lenguajes de programacin s lo permiten). Habr que asociar una clusula
caseacadaunodelosvaloresquedebansertenidosencuenta.
9 Laclusuladefaultserutilizadaparaindicaruncasopordefecto,lassentenciasasociadasala
clusuladefaultseejecutarnsiningunodelosvaloresindicadosenlasclusulascasecoincide
conelresultadodelaevaluacindelaexpresindelaestructuraswitch.
9 La clusula default puede no existir, y por tanto, si ningn case ha sido activado finalizara el
switch.
9 Cadaclusulacasepuedellevarasociadasunaovariassentencias,sinnecesidaddedelimitar
dichosbloquespormediodellaves.
9 Enelmomentoenelqueelresultadodelaevaluacindelaexpresincoincideconalgunode
losvaloresasociadosalasclusulascase,seejecutarntodaslasinstruccionesasociadashasta
la aparicin de una sentencia break de ruptura. (la sentencia break se analizar en epgrafes
posteriores)

Usodeestructurasdecontrol

DAW

En resumen, se ha de comparar el valor de una expresin con un


conjuntodeconstantes,sielvalordelaexpresincoincideconalgn
valordedichasconstantes,seejecutarnlosbloquesdeinstrucciones
asociados a cada una de ellas. Si no existiese coincidencia, se
ejecutaranunaseriedeinstruccionespordefecto.

DEBESCONOCER
Compruebaelsiguientefragmentodecdigoenelqueseresuelveelclculodelanotade
unexamendetipotest,utilizandolaestructuraswitch.
package sentencias_condicionales;
/**
*
* @author Pc
*/
public class condicional_switch {
/*Vamos a realizar el clculo de la nota de un examen
* de tipo test. Para ello, tendremos en cuenta el nmero
* total de preguntas, los aciertos y los errores. Dos errores
* anulan una respuesta correcta.
*
* La nota que vamos a obtener ser un nmero entero.
*
* Finalmente, se muestra por pantalla la nota obtenida, as
* como su calificacin no numrica.
*
* La obtencin de la calificacin no numrica se ha realizado
* utilizando la estructura condicional mltiple o switch.
*
*/
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int num_aciertos = 17;
int num_errores = 3;
int num_preguntas = 20;
int nota = 0;
String calificacion="";
//Procesamiento de datos
nota = ((num_aciertos - (num_errores/2))*10)/num_preguntas;
switch (nota) {
case 5: calificacion="SUFICIENTE";
break;
case 6: calificacion="BIEN";
break;
case 7: calificacion="NOTABLE";
break;
case 8: calificacion="NOTABLE";
break;
case 9: calificacion="SOBRESALIENTE";
break;
case 10: calificacion="SOBRESALIENTE";
break;
default: calificacion="INSUFICIENTE";
}
//Salida de informacin
System.out.println ("La nota obtenida es: " + nota);
System.out.println ("y la calificacin obtenida es: " + calificacion);
}
}

10

DiseodeAplicacionesWeb

Tema4

4. Estructuras de repeticin
CASO PRCTICO
Juan ya tiene claro cmo realizar la comprobacin de los valores de login y contrasea introducidos
por teclado, pero le surge una duda: Cmo podra controlar el nmero de veces que el usuario ha
introducido mal la contrasea?
Ada le indica que podra utilizar una estructura de repeticin que solicitase al usuario la introduccin
de la contrasea hasta un mximo de tres veces. Aunque comenta que puede haber mltiples
soluciones y todas vlidas, lo importante es conocer las herramientas que podemos emplear y saber
cundo aplicarlas.

Nuestros programas ya son capaces de controlar su ejecucin teniendo en cuenta determinadas


condiciones,peroanhemosdeaprenderunconjuntodeestructurasquenospermitarepetiruna
secuencia de instrucciones determinada. La funcin de estas estructuras es repetir la ejecucin de
unaseriedeinstruccionesteniendoencuentaunacondicin.
Aestetipodeestructurasselasdenominaestructurasderepeticin,estructurasrepetitivas,bucleso
estructurasiterativas.EnJavaexistencuatroclasesdebucles:
9
9
9
9

Buclefor(repitepara)
Buclefor/in(repiteparacada)
BucleWhile(repitemientras)
BucleDoWhile(repitehasta)

Losbuclesforyfor/inseconsideranbuclescontroladosporcontador.Porelcontrario,losbucles
whileydo...whileseconsideranbuclescontroladosporsucesos.
Lautilizacindeunosbuclesuotrosparasolucionarunproblemadependerengranmedidadelas
siguientespreguntas:
9 Sabemosaprioricuntasvecesnecesitamosrepetirunconjuntodeinstrucciones?
9 Sabemos si hemos de repetir un conjunto de instrucciones si una condicin satisface un
conjuntodevalores?
9 Sabemoshastacundodebemosestarrepitiendounconjuntodeinstrucciones?
9 Sabemos si hemos de estar repitiendo un conjunto de instrucciones mientras se cumpla una
condicin?

RECOMENDACIN
Estudia cada tipo de estructura repetitiva, conoce su funcionamiento y podrs llegar a la
conclusindequealgunosdeestosbuclessonequivalentesentres.Unmismoproblema,
podrserresueltoempleandodiferentestiposdebuclesyobtenerlosmismosresultados.
Estasyotraspreguntastendrnsurespuestaencuantoanalicemos
cadaunadeestructurasrepetitivasendetalle.

4.1.Estructurafor
Hemos indicado anteriormente que el bucle for es un bucle
controlado por contador. Este tipo de bucle tiene las siguientes
caractersticas:
9 Seejecutaunnmerodeterminadodeveces.

11

Usodeestructurasdecontrol

9 Utilizaunavariablecontadoraquecontrolalasiteracionesdelbucle.

DAW

Engeneral,existentresoperacionesquesellevanacaboenestetipodebucles:
9 Seinicializalavariablecontadora.
9 Se evala el valor de la variable contador, por medio de una comparacin de su valor con el
nmerodeiteracionesespecificado.
9 Semodificaoactualizaelvalordelcontadoratravsdeincrementosodecrementosdeste,en
cadaunadelasiteraciones.

RECOMENDACIN
Lainicializacindelavariablecontadoradeberealizasecorrectamenteparagarantizarqueel
buclelleveacabo,almenos,laprimerarepeticindesucdigointerno.
La condicin de terminacin del bucle debe variar en el interior del mismo, de no ser as,
podemoscaerenlacreacindeunbucleinfinito.Cuestinquesedebeevitarportodoslos
medios.
Es necesario estudiar el nmero de veces que se repite el bucle, pues debe ajustarse al
nmerodevecesestipulado.
Enlasiguientetabla,podemosverlaespecificacindelaestructurafor:
Estructurarepetitivafor
9 Donde inicializacin es una
Sintaxis:
expresinenlaqueseinicializaunavariable
for (inicializacin; condicin; iteracin)
de control, que ser la encargada de
sentencia;
controlarelfinaldelbucle.
(estructuraforconunanicasentencia)
9 Donde condicin es una expresin que
evaluar la variable de control. Mientras la
Sintaxis:
condicin sea falsa, el cuerpo del bucle
for (inicializacin; condicin; iteracin)
estar repitindose. Cuando la condicin se
{
cumpla,terminarlaejecucindelbucle.
sentencia1;
sentencia2;
9 Donde iteracin indica la manera en la
...
que la variable de control va cambiando en
sentenciaN;
}
cadaiteracindelbucle.Podrsermediante
(estructuraforconunbloquedesentencias)
incrementoodecremento,ynosolodeuno
enuno.

DEBESCONOCER
Como venimos haciendo para el resto de estructuras, observa el siguiente archivo Java y
podrsanalizarunejemplodeutilizacindelbucleforparalaimpresinporpantalladela
tablademultiplicardelsiete.Leeatentamenteloscomentariosincluidosenelcdigo,pues
aclaranalgunascuestionesinteresantessobreestebucle.
public class repetitiva_for {
/* En este ejemplo se utiliza la estructura repetitiva for
* para representar en pantalla la tabla de multiplicar del siete
*/
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int numero = 7;
int contador;
int resultado=0;
//Salida de informacin
System.out.println ("Tabla de multiplicar del " + numero);
System.out.println (".............................. ");

12

DiseodeAplicacionesWeb

Tema4

//Utilizamos ahora el bucle for


for (contador=1; contador<=10;contador++)
/* La cabecera del bucle incorpora la inicializacin de la variable
* de control, la condicin de multiplicacin hasta el 10 y el
* incremento de dicha variable de uno en uno en cada iteracin del
* bucle.
* En este caso contador++ incrementar en una unidad el valor de
* dicha variable.
*/
{
resultado = contador * numero;
System.out.println(numero + " x " + contador + " = " + resultado);
/* A travs del operador + aplicado a cadenas de caracteres,
* concatenamos los valores de las variables con las cadenas de
* caracteres que necesitamos para representar correctamente la
* salida de cada multiplicacin.
*/
}
}
}

AUTOEVALUACIN
Cuando construimos la cabecera de un bucle for, podemos prescindir de alguno de los tres
elementos que la forman e incluso, podemos utilizar ms de una variable contadora separando
stas por comas. Pero, Qu conseguiremos si construimos un bucle de la siguiente forma?
for (;;){
//instrucciones
}

Unbucleinfinito.
Nada,darunerror.
Unbuclequeseejecutaraunanicavez.
Laconstruccindelacabeceradelbuclehaprescindidodecadaunadelaspartestpicas(inicializacin,condicineiteracin),peroal
mantenerlospuntosycomasenloslugaresadecuados,elconjuntodeinstruccionesquepudieranincluirseenelcuerpodelbucleestarn
ejecutndoseeternamente.

4.2.Estructurafor/in
Junto a la estructura for, for/in
tambin se considera un bucle
controlado por contador. Este
bucle es una mejora incorporada
enlaversin5.0.deJava.
Este tipo de bucles permite
realizar recorridos sobre arrays y
coleccionesdeobjetos.Losarrays
son colecciones de variables que
tienenelmismotipoysereferencianporunnombrecomn.Asmismo,lascoleccionesdeobjetos
sonobjetosquesedicesoniterables,oquesepuedeiterarsobreellos.
Estebucleesnombradotambincomobucleformejorado,obucleforeach.Enotroslenguajesde
programacinexistenbuclesmuyparecidosaeste.
Lasintaxiseslasiguiente:

13

Usodeestructurasdecontrol

DAW

for (declaracin: expresin) {


sentencia1;

sentenciaN;
}

9 Dondeexpresinesunarrayounacoleccindeobjetos.
9 Donde declaracin es la declaracin de una variable cuyo tipo sea compatible con
expresin.Normalmente,sereltipoyelnombredelavariableadeclarar.
El funcionamiento consiste en que para cada elemento de la expresin, guarda el elemento en la
variable declarada y haz las instrucciones contenidas en el bucle. Despus, en cada una de las
iteraciones del bucle tendremos en la variable declarada el elemento actual de la expresin. Por
tanto, para el caso de los arrays y de las colecciones de objetos, se recorrer desde el primer
elementoquelosformahastaelltimo.
Observa el contenido del cdigo representado en la siguiente imagen, puedes apreciar cmo se
construyeunbucledeestetipoysuutilizacinsobreunarray.
Los bucles for/in permitirn al programador despreocuparse del nmero de veces que se ha de
iterar,peronosabremosenquiteracinnosencontramossalvoqueseaadaartificialmentealguna
variablecontadoraquenospuedaofrecerestainformacin.

4.3.Estructurawhile
Elbuclewhileeslaprimeradelasestructurasderepeticincontroladasporsucesosquevamosa
estudiar. La utilizacin de este bucle responde al planteamiento de la siguiente pregunta: Qu
podemos hacer si lo nico que sabemos es que se han de repetir un conjunto de instrucciones
mientrassecumplaunadeterminadacondicin?.
La caracterstica fundamental de este tipo de estructura repetitiva estriba en ser til en aquellos
casosenlosquelasinstruccionesqueformanelcuerpodelbuclepodrasernecesarioejecutarlaso
no.Esdecir,enelbuclewhilesiempreseevaluarlacondicinquelocontrola,ysidichacondicin
escierta,elcuerpodelbucleseejecutarunavez,yseseguirejecutandomientraslacondicinsea
cierta.Perosienlaevaluacininicialdelacondicinstanoesverdadera,elcuerpodelbuclenose
ejecutar.
Es imprescindible que en el interior del bucle while se realice alguna accin que modifique la
condicinquecontrolalaejecucindelmismo,encasocontrarioestaramosanteunbucleinfinito.
Estructurarepetitivawhile
Sintaxis:
Sintaxis:
while (condicin)
sentencia;

while (condicin) {
sentencia1;

sentenciaN;
}

Funcionamiento:
Mientraslacondicinseacierta,elbucleserepetir,ejecutandola/sinstruccin/esdesuinterior.
En el momento en el que la condicin no se cumpla, el control del flujo del programa pasar a la
siguienteinstruccinqueexistajustodetrsdelbuclewhile.
La condicin se evaluar siempre al principio, y podr darse el caso de que las instrucciones
contenidasenlnolleguenaejecutarsenuncasinosesatisfacelacondicindepartida.

14

DiseodeAplicacionesWeb

Tema4

En la siguiente imagen puedes ver un diagrama de flujo que


representaelfuncionamientodeestetipodeestructura

DEBESCONOCER
Observaelsiguientecdigojavaypodrsanalizarunejemplo
de utilizacin del bucle while para la impresin por pantalla
de la tabla de multiplicar del siete. Lee atentamente los
comentarios incluidos en el cdigo, pues aclaran algunas
cuestiones interesantes sobre este bucle. Como podrs
comprobar, el resultado de este bucle es totalmente
equivalentealobtenidoutilizandoelbuclefor.
public class repetitiva_while {
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int numero = 7;
int contador;
int resultado=0;
//Salida de informacin
System.out.println ("Tabla de multiplicar del " + numero);
System.out.println (".............................. ");
//Utilizamos ahora el bucle while
contador = 1; //inicializamos la variable contadora
while (contador <= 10) //Establecemos la condicin del bucle
{
resultado = contador * numero;
System.out.println(numero + " x " + contador + " = " + resultado);
//Modificamos el valor de la variable contadora, para hacer que el
//bucle pueda seguir iterando hasta llegar a finalizar
contador++;
}
}
}

AUTOEVALUACIN
Utilizando el siguiente fragmento de cdigo estamos construyendo un bucle infinito.
while (true)
System.out.println(Imprimiendo desde dentro del bucle \n);

Verdadero
Falso
Lacondicindelbuclesiempreserciertayestarcontinuamenteejecutndose.

4.4.Estructuradowhile
La segunda de las estructuras repetitivas controladas por sucesos es dowhile. En este caso, la
preguntaquenosplanteamoseslasiguiente:Qupodemoshacersilonicoquesabemosesquese
handeejecutar,almenosunavez,unconjuntodeinstruccionesyseguirrepitindosehastaquese
cumplaunadeterminadacondicin?.
La caracterstica fundamental de este tipo de estructura repetitiva estriba en ser til en aquellos
casosenlosquelasinstruccionesqueformanelcuerpodelbuclenecesitanserejecutadas,almenos,
una vez y repetir su ejecucin hasta que la condicin sea verdadera. Por tanto, en esta estructura
repetitivasiempreseejecutaelcuerpodelbucleunaprimeravez.
Esimprescindiblequeenelinteriordelbucleserealicealgunaaccinquemodifiquelacondicinque
controlalaejecucindelmismo,encasocontrarioestaramosanteunbucleinfinito.

15

Usodeestructurasdecontrol

Estructurarepetitivadowhile

DAW

Sintaxis:
do
{

Sintaxis:
do

sentencia1;

sentenciaN;

sentencia;
while (condicin);

}
while (condicin);

Funcionamiento:
Elcuerpodelbucleseejecutalaprimeravez,acontinuacinseevaluarlacondiciny,sistaes
falsa,elcuerpoelbuclevolverarepetirse.Elbuclefinalizarcuandolaevaluacindelacondicin
seaverdadera.Enesemomentoelcontroldelflujodelprogramapasaralasiguienteinstruccin
que exista justo detrs del bucle dowhile. La condicin se evaluar siempre despus de una
primera ejecucin del cuerpo del bucle, por lo que no se dar el caso de que las instrucciones
contenidasenlnolleguenaejecutarsenunca.
Enlasiguienteimagenpuedesverundiagramadeflujoquerepresenta
elfuncionamientodeestetipodeestructurarepetitiva.

DEBESCONOCER
Accedealsiguientearchivojavaypodrsanalizarunejemplode
utilizacin del bucle dowhile para la impresin por pantalla de
la tabla de multiplicar del siete. Lee atentamente los
comentarios incluidos en el cdigo, pues aclaran algunas
cuestiones interesantes sobre este bucle. Como podrs
comprobar, el resultado de este bucle es totalmente equivalente al obtenido utilizando el
bucleforyelbuclewhile.
public class repetitiva_dowhile {
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int numero = 7;
int contador;
int resultado=0;
//Salida de informacin
System.out.println ("Tabla de multiplicar del " + numero);
System.out.println (".............................. ");
//Utilizamos ahora el bucle do-while
contador = 1; //inicializamos la variable contadora
do
{
resultado = contador * numero;
System.out.println(numero + " x " + contador + " = " + resultado);
//Modificamos el valor de la variable contadora, para hacer que el
//bucle pueda seguir iterando hasta llegar a finalizar
contador++;
}while (contador <= 10); //Establecemos la condicin del bucle
}
}

16

DiseodeAplicacionesWeb

Tema4

5. Estructuras de salto
CASO PRCTICO
Juan recuerda que algunos lenguajes de programacin permitan realizar saltos a lo largo de la
ejecucin de los programas y conoce dos sentencias que an se siguen utilizando para ello.
Ada, mientras toma un libro sobre Java de la estantera del despacho, le aconseja: Las instrucciones
de salto a veces han sido mal valoradas por la comunidad de programadores, pero en Java algunas
de ellas son totalmente necesarias. Mira, en este libro se habla del uso de las sentencias break,
continue y return...

Saltaronosaltar?heahlacuestin.Enlagranmayoradelibrosdeprogramacinypublicaciones
deInternet,siempresenosrecomiendaqueprescindamosdesentenciasdesaltoincondicional,es
ms,sedesaconsejasuusoporprovocarunamalaestructuracindelcdigoyunincrementoenla
dificultadparaelmantenimientodelosmismos.PeroJavaincorporaciertassentenciasoestructuras
de salto que es necesario conocer y que pueden sernos tiles en algunas partes de nuestros
programas.
Estasestructurasdesaltocorrespondenalassentenciasbreak,continue,lasetiquetasdesaltoyla
sentenciareturn.Pasamosahoraaanalizarsusintaxisyfuncionamiento.

5.1.Sentenciasbreakycontinue
Se trata de dos instrucciones que permiten modificar el comportamiento de otras estructuras o
sentenciasdecontrol,simplementeporelhechodeestarincluidasenalgnpuntodesusecuencia
deinstrucciones.
La sentencia break incidir sobre las estructuras de control switch, while, for y dowhile del
siguientemodo:
9 Siapareceunasentenciabreakdentrodelasecuenciadeinstruccionesdecualquieradelas
estructurasmencionadasanteriormente,dichaestructuraterminarinmediatamente.
9 Si aparece una sentencia break dentro de un bucle anidado slo finalizar la sentencia de
iteracinmsinterna,elrestoseejecutadeformanormal.
Esdecir,quebreaksirvepararomperelflujodecontroldeunbucle,aunquenosehayacumplidola
condicin del bucle. Si colocamos un break dentro del cdigo de un bucle, cuando se alcance el
break, automticamente se saldr del bucle pasando a ejecutarse la siguiente instruccin
inmediatamentedespusdel.
En la siguiente imagen, puedes apreciar
cmoseutilizaralasentenciabreakdentro
deunbuclefor.
La sentencia continue incidir sobre las
sentencias o estructuras de control while,
forydowhiledelsiguientemodo:
9 Siapareceunasentenciacontinuedentrodelasecuenciadeinstruccionesdecualquierade
las sentencias anteriormente indicadas, dicha sentencia dar por terminada la iteracin
actual y se ejecuta una nueva iteracin, evaluando de nuevo la expresin condicional del
bucle.

17

Usodeestructurasdecontrol

DAW

9 Si aparece en el interior de un bucle anidado solo afectar a la sentencia de iteracin ms


interna,elrestoseejecutaradeformanormal.
Esdecir,lasentenciacontinueforzaraqueseejecutelasiguienteiteracindelbucle,sinteneren
cuenta las instrucciones que pudiera haber despus del continue, y hasta el final del cdigo del
bucle.

En la imagen de la izquierda, puedes apreciar


cmo se utiliza la sentencia continue en un
bucle for para imprimir por pantalla slo los
nmerospares.

Para clarificar algo ms el funcionamiento de ambas sentencias de


salto,teofrecemosaladerechaundiagramarepresentativo.

AUTOEVALUACIN
La instruccin break puede utilizarse en las estructuras de control switch, while, for y dowhile, no siendo imprescindible utilizarla en la clusula defaultde la estructura switch.
Verdadero
Falso
si en una clusula default no existe una sentencia break, directamente se pasara a la finalizacin de la estructura condicional mltiple.

5.2.Etiquetas
Ya lo indicbamos al comienzo del epgrafe dedicado a las estructuras de salto, los saltos
incondicionales y en especial, saltos a una etiqueta son totalmente desaconsejables. No obstante,
Javapermiteasociaretiquetascuandosevaarealizarunsalto.Deestemodopuedeconseguirsealgo
msdelegibilidadenelcdigo.
Lasestructurasdesaltobreakycontinue,puedentenerasociadasetiquetas.Esaloquesellama
un break etiquetado o un continue etiquetado. Pero slo se recomienda su uso cuando se hace
necesariosalirdebuclesanidadoshaciadiferentesniveles.
Y cmo se crea un salto a una etiqueta? En primer lugar, crearemos la etiqueta mediante un
identificador seguidodedospuntos(:).Acontinuacin,seescribenlassentenciasJavaasociadasa
dichaetiquetaencerradasentrellaves.Porasdecirlo,lacreacindeunaetiquetaescomofijarun
puntodesaltoenelprogramaparapodersaltaraldesdeotrolugardedichoprograma.

18

DiseodeAplicacionesWeb

Tema4

Cmosellevaacaboelsalto?Essencillo,enellugardondevayamosacolocarlasentenciabreako
continue,aadiremosdetrselidentificadordelaetiqueta.Conello,conseguiremosqueelsaltose
realiceaunlugardeterminado.
Lasintaxisserbreak<etiqueta>.
Quizaaquellos/asquehanprogramadoenHTML lessueneestaherramienta,yaquetienecierta
similitudconlasanclasquepuedencrearseenelinteriordeunapginaweb,alasquenosllevarel
hiperenlaceolinkquehayamosasociado.
Tambinparaaquellos/asquehancreadoalgunavezarchivosporlotesoarchivosbatchbajoMSDOS
es probable que tambin les resulte familiar el uso de etiquetas, pues la sentencia GOTO que se
utilizaba en este tipo de archivos, haca saltar el flujo del programa al lugar donde se ubicaba la
etiquetaqueseindicaraendichasentencia.
A continuacin, te ofrecemos un
ejemplo de declaracin y uso de
etiquetas en un bucle. Como podrs
apreciar, las sentencias asociadas a
cadaetiquetaestnencerradasentre
llavesparadelimitarassumbitode
accin.

5.3.SentenciaReturn
Ya sabemos cmo modificar la ejecucin de bucles y estructuras condicionales mltiples, pero
Podramosmodificarlaejecucindeunmtodo?Esposiblehacerquestosdetengansuejecucin
antes de que finalice el cdigo asociado a ellos?. S es posible, a travs de la sentencia return
podremosconseguirlo.
Lasentenciareturnpuedeutilizarsededosformas:
9 Paraterminarlaejecucindelmtododondeestescrita,conloquetransferirelcontrolal
puntodesdeelquesehizolallamadaalmtodo,continuandoelprogramaporlasentencia
inmediatamenteposterior.
9 Paradevolveroretornarunvalor,siemprequejuntoareturnseincluyaunaexpresinde
untipodeterminado.Portanto,enellugardondeseinvocalmtodoseobtendrelvalor
resultantedelaevaluacindelaexpresinqueacompaabaalmtodo.
En general, una sentencia return suele aparecer al final de un mtodo, de este modo el mtodo
tendrunaentradayunasalida.Tambinesposibleutilizarunasentenciareturnencualquierpunto
de un mtodo, con lo que ste finalizar en el lugar donde se encuentre dicho return. No ser
recomendable incluir ms de un return en un mtodo y por regla general, deber ir al final del
mtodocomohemoscomentado.
Elvalorderetornoesopcional,silohubieradeberadeserdelmismotipoodeuntipocompatibleal
tipo del valor de retorno definido en la cabecera del mtodo, pudiendo ser desde un entero a un
objetocreadopornosotros.Sinolotuviera,eltipoderetornoseravoid,yreturnserviraparasalir

19

Usodeestructurasdecontrol

DAW

delmtodosinnecesidaddellegaraejecutartodaslasinstruccionesqueseencuentrandespusdel
return.

PARASABERMS
Enelsiguientearchivojavaencontrarselcdigodeunprogramaqueobtienelasumade
dosnmeros,empleandoparaellounmtodosencilloqueretornaelvalordelasumadelos
nmerosqueselehanpasadocomoparmetros.
Prestaatencinaloscomentariosyfjateenlasconversionesaenterodelaentradadelos
operandosporconsola.
import java.io.*;
/**
*
* Uso de return en un mtodo
*/
public class sentencia_return {
private
static
BufferedReader
InputStreamReader(System.in));

stdin

new

BufferedReader(

new

public static int suma(int numero1, int numero2)


{
int resultado;
resultado = numero1 + numero2;
return resultado; //Mediante return devolvemos el resultado de la suma
}
public static void main(String[] args) throws IOException {
//Declaracin de variables
String input; //Esta variable recibir la entrada de teclado
int primer_numero, segundo_numero; //Estas variables almacenarn los operandos
// Solicitamos que el usuario introduzca dos nmeros por consola
System.out.print ("Introduce el primer operando:");
input = stdin.readLine(); //Leemos la entrada como cadena de caracteres
primer_numero = Integer.parseInt(input); //Transformamos a entero lo introducido
System.out.print ("Introduce el segundo operando: ");
input = stdin.readLine(); //Leemos la entrada como cadena de caracteres
segundo_numero = Integer.parseInt(input); //Transformamos a entero lo introducido
//Imprimimos los nmeros introducidos
System.out.println ("Los operandos son: " + primer_numero + " y " + segundo_numero);
System.out.println ("obteniendo su suma... ");
//Invocamos al mtodo que realiza la suma, pasndole los parmetros adecuados
System.out.println
("La
suma
de
ambos
operandos
es:
suma(primer_numero,segundo_numero));

"

}
}

AUTOEVALUACIN
Qu afirmacin es correcta?
Conreturn,sepuedefinalizarlaejecucindelmtodoenelqueseencuentre.

Conreturn,siempreseretornarunvalordelmismotipoodeuntipocompatible

aldefinidoenlacabeceradelmtodo.
Conreturn,puederetornarseunvalordeundeterminadotipoysuelehacerseal

finaldelmtodo.Adems,elrestoderespuestastambinsoncorrectas.
Efectivamente,siencontramosunreturnantesdelafinalizacindelcdigoasociadoaunmtodo,stedevolverelcontroldelflujodel
programaalainstruccininmediatamenteposteriorqueexistiesetraslainvocacinalmtodo.

20

DiseodeAplicacionesWeb

Tema4

6. Excepciones
CASO PRCTICO
Para que las aplicaciones desarrolladas por BK Programacin mantengan una valoracin positiva a lo
largo del tiempo por parte de sus clientes, es necesario que stas no se vean comprometidas durante
su ejecucin. Hay innumerables ocasiones en las que programas que aparentemente son formidables
(por su interfaz, facilidad de uso, etc.) comienzan a generar errores en tiempo de ejecucin que hacen
que el usuario desconfe de ellos da a da.
Para evitar estas situaciones, Ada va a fomentar en Mara y Juan la cultura de la deteccin, control y
solucin de errores a travs de las poderosas herramientas que Java les ofrece.

A lo largo de nuestro aprendizaje de Java nos hemos topado en alguna ocasin con errores, pero
stos suelen ser los que nos ha indicado el compilador. Un punto y coma por aqu, un nombre de
variable incorrecto por all, pueden hacer que nuestro compilador nos avise de estos descuidos.
Cuandolosvemos,secorrigenyobtenemosnuestraclasecompiladacorrectamente.
Pero, Slo existen este tipo de errores? Podran existir errores no sintcticos en nuestros
programas?.Estclaroques,unprogramaperfectamentecompiladoenelquenoexistenerroresde
sintaxis,puedegenerarotrostiposdeerroresquequizaparezcanentiempodeejecucin.Aestos
erroresselesconocecomoexcepciones.
Aprenderemos a gestionar de manera adecuada estas excepciones y tendremos la oportunidad de
utilizarelpotentesistemademanejodeerroresqueJavaincorpora.Lapotenciadeestesistemade
manejodeerroresradicaen:
1. Queelcdigoqueseencargademanejarloserrores,esperfectamenteidentificableenlos
programas.Estecdigopuedeestarseparadodelcdigoquemanejalaaplicacin.
2. Que Java tiene una gran cantidad de errores estndar asociados a multitud de fallos
comunes, como por ejemplo divisiones por cero, fallos de entrada de datos, etc. Al tener
tantas excepciones localizadas, podemos gestionar de manera especfica cada uno de los
erroresqueseproduzcan.
EnJavasepuedenprepararlosfragmentosdecdigoquepuedenprovocarerroresdeejecucinpara
que si se produce una excepcin, el flujo del programa es lanzado (throw) hacia ciertas zonas o
rutinas que han sido creadas previamente por el programador y cuya finalidad ser el tratamiento
efectivo de dichas excepciones. Si no se captura la excepcin, el programa se detendr con toda
probabilidad.
En Java, las excepciones estn representadas por clases. El paquete java.lang.Exception y sus
subpaquetescontienentodoslostiposdeexcepciones.Todaslasexcepcionesderivarndelaclase
Throwable,existiendoclasesmsespecficas.PordebajodelaclaseThrowableexistenlasclases
Error y Exception. Error es una clase que se encargar de los errores que se produzcan en la
mquinavirtual,noennuestrosprogramas.YlaclaseExceptionserlaqueanosotrosnosinterese
conocer,puesgestionaloserroresprovocadosenlosprogramas.
Javalanzarunaexcepcinenrespuestaaunasituacinpocousual.Cuandoseproduceunerrorse
generaunobjetoasociadoaesaexcepcin.EsteobjetoesdelaclaseExceptionodealgunadesus
herederas.Esteobjetosepasaalcdigoquesehadefinidoparamanejarlaexcepcin.Dichocdigo
puedemanipularlaspropiedadesdelobjetoException.

21

Usodeestructurasdecontrol

DAW

El programador tambin puede lanzar sus propias excepciones. Las excepciones en Java sern
objetosdeclasesderivadasdelaclasebaseException.Existetodaunajerarquadeclasesderivada
delaclasebaseException.Estasclasesderivadasseubicanendosgruposprincipales:
9 Lasexcepcionesentiempodeejecucin,queocurrencuandoelprogramadornohatenido
cuidadoalescribirsucdigo.
9 Lasexcepcionesqueindicanquehasucedidoalgoinesperadoofueradecontrol.
EnlasiguienteimagenteofrecemosunaaproximacinalajerarquadelasexcepcionesenJava.

6.1.Capturarunaexcepcin
Parapodercapturarexcepciones,emplearemoslaestructuradecapturadeexcepcionestrycatch
finally.
Bsicamente,paracapturarunaexcepcinloqueharemosserdeclararbloquesdecdigodondees
posiblequeocurraunaexcepcin.Estoloharemosmedianteunbloquetry(intentar).Siocurreuna
excepcin dentro de estos bloques, se lanza una excepcin. Estas excepciones lanzadas se pueden
capturarpormediodebloquescatch.Serdentrodeestetipodebloquesdondeseharelmanejo
delasexcepciones.
Susintaxises:
try {
cdigo que puede generar excepciones;
} catch (Tipo_excepcion_1 objeto_excepcion) {
Manejo de excepcin de Tipo_excepcion_1;
} catch (Tipo_excepcion_2 objeto_excepcion) {
Manejo de excepcin de Tipo_excepcion_2;
}
...
finally {
instrucciones que se ejecutan siempre
}

En esta estructura, la parte catch puede repetirse tantas veces como excepciones diferentes se
deseencapturar.Lapartefinallyesopcionaly,siaparece,solopodrhacerlounasolavez.
Cadacatchmanejauntipodeexcepcin.Cuandoseproduceunaexcepcin,sebuscaelcatchque
poseaelmanejadordeexcepcinadecuado,serelqueutiliceelmismotipodeexcepcinqueseha
producido. Esto puede causar problemas si no se tiene cuidado, ya que la clase Exception es la

22

DiseodeAplicacionesWeb

Tema4

superclase de todas las dems. Por lo que si se produjo, por ejemplo, una excepcin de tipo
AritmethicExceptionyelprimercatchcapturaeltipogenricoException,seresecatchelque
seejecuteynolosdems.
Poresoelltimocatchdebeserelquecaptureexcepcionesgenricasylosprimerosdebenserlos
msespecficos.Lgicamentesivamosatrataratodaslasexcepciones(seandeltipoquesean)igual,
entoncesbastaconunsolocatchquecaptureobjetosException.
EJERCICIORESUELTO
RealizaunprogramaenJavaenelquesesolicitealusuariolaintroduccindeunnmeroporteclado
comprendidoentreel0y el100. Utilizandomanejode excepciones,debes controlarlaentradade
dichonmeroyvolverasolicitarloencasodequestaseaincorrecta.
/*
* Ejercicio resuelto sobre manejo de excepciones.
* El programa solicita que el usuario introduzca por teclado
* un nmero entre 0 y 100, debiendo gestionarse la entrada
* por medio de excepciones.
*/
import java.io.*;
public class ejercicio_resuelto_excepciones {
public static void main(String[] args){
int numero=-1;
int intentos=0;
String linea;
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
do{
try{
System.out.print("Introduzca un nmero entre 0 y 100: ");
linea = teclado.readLine();
numero = Integer.parseInt(linea);
}catch(IOException e){
System.out.println("Error al leer del teclado.");
}catch(NumberFormatException e){
System.out.println("Debe introducir un nmero entre 0 y 100.");
}finally{
intentos++;
}
}while (numero < 0 || numero > 100);
System.out.println("El nmero introducido es: " + numero);
System.out.println("Nmero de intentos: " + intentos);
}
}

Enesteprogramasesolicitarepetidamenteunnmeroutilizandounaestructuradowhile,mientras
el nmero introducido sea menor que 0 y mayor que 100. Como al solicitar el nmero pueden
producirseloserroressiguientes:
9 Deentradadeinformacinatravs delaexcepcinIOExceptiongenerada porel mtodo
readLine()delaclaseBufferedReader.
9 DeconversindetiposatravsdelaexcepcinNumberFormatExceptiongeneradaporel
mtodoparseInt().
Entoncessehacenecesarialautilizacindebloquescatchquegestionencadaunadelasexcepciones
quepuedanproducirse.Cuandoseproduceunaexcepcin,secomparasicoincideconlaexcepcin
del primer catch. Si no coincide, se compara con la del segundo catch y as sucesivamente. Si se

23

Usodeestructurasdecontrol

DAW

encuentrauncatchquecoincideconlaexcepcinagestionar,seejecutarelbloquedesentencias
asociadoaste.
Si ningn bloque catch coincide con la excepcin lanzada, dicha excepcin se lanzar fuera de la
estructuratrycatchfinally.
Elbloquefinally,seejecutartantositrytermincorrectamente,comosisecapturunaexcepcin
enalgnbloquecatch.Portanto,siexistebloquefinallysteseejecutarsiempre.

DEBESCONOCER
Sideseasconocerenmayordetalleelmanejodeexcepciones,teaconsejamoselsiguiente
enlaceenelquepodrsencontrarunvdeoilustrativosobresucreacinymanejo.
http://www.youtube.com/watch?v=2gWTVxe31g8&feature=related
Elvideocomienzaindicandoqueexistenvariasformasdecapturarlasposiblesexcepcionesquenuestrosprogramas pueden generar.La
estructuratrycatchesanalizadaenprimerlugar,atravsdeunejemploqueconvierteunacadenadetextoaentero.Primerosehaceuna
gestin de la excepcin de manera sencilla y, posteriormente, se van aadiendo bloques catch para incluir diferentes posibilidades de
tratamiento de la excepcin en funcin del error generado. Seguidamente, se hace referencia a la utilizacin de la sentencia throw
exceptionparaindicarqueunmtodopuedegenerarunaexcepcin,perostanosergestionadaporelpropiomtodo,sinoporelquelo
llam.Esaloquesellamapropagacindeexcepciones.

AUTOEVALUACIN
Si en un programa no capturamos una excepcin, ser la mquina virtual de Java la que lo
har por nosotros, pero inmediatamente detendr la ejecucin del programa y mostrar una
traza y un mensaje de error. Siendo una traza, la forma de localizar dnde se han producido
errores.
Verdadero
Falso

Ases,siunmtodonogestionalasexcepcionesqueseproducenenl,laexcepcinserpasadaalmtodoquellamalmtodo.Yas
ocurrir sucesivamente si no existe gestin de las excepciones en niveles superiores, hasta llegar a la mquina virtual de Java que
detendrlaejecucindelprograma.

6.2.Elmanejodeexcepciones
Comohemoscomentado,siempredebemoscontrolarlasexcepcionesquesepuedanproducirode
lo contrario nuestro software quedar expuesto a fallos. Las excepciones pueden tratarse de dos
formas:
9 Interrupcin. En este caso se asume que el programa ha encontrado un error
irrecuperable.Laoperacinquediolugaralaexcepcinseanulayseentiendequenohay
maneraderegresaralcdigoqueprovoclaexcepcin.Esdecir,laoperacinquedioorigin
elerror,seanula.
9 Reanudacin. Se puede manejar el error y regresar de nuevo al cdigo que provoc el
error.
Javaemplealaprimeraforma,peropuedesimularselasegundamediantelautilizacindeunbloque
try en el interior de un while, que
se repetir hasta que el error deje
de existir. En la siguiente imagen
tienes un ejemplo de cmo llevar a
caboestasimulacin.
En este ejemplo, a travs de la

24

DiseodeAplicacionesWeb

Tema4

funcin de generacin de nmeros aleatorios se obtiene el valor del ndice i. Con dicho valor se
accede a una posicin del array que contiene cinco cadenas de caracteres. Este acceso, a veces
puede generar un error del tipo ArrayIndexOutOfBoundsException, que debemos gestionar a
travs de un catch. Al estar el bloque catch dentro de un while, se seguir intentando el acceso
hastaquenohayaerror.

6.3.Delegacindeexcepcionesconthrows
Puede haber problemas con las excepciones al usar llamadas a mtodos en nuestros programas?
Efectivamente, si se produjese una excepcin es necesario saber quin ser el encargado de
solucionarla. Puede ser que sea el propio mtodo llamado o el cdigo que hizo la llamada a dicho
mtodo.
Quizpudiramospensarquedeberaserelpropiomtodoelqueseencarguedesusexcepciones,
aunqueesposiblehacerquelaexcepcinsearesueltaporelcdigoquehizolallamada.Cuandoun
mtodo utiliza una sentencia que puede generar una excepcin, pero dicha excepcin no es
capturadaytratadaporl,sinoqueseencargasugestinaquinllamalmtodo,decimosquese
haproducidodelegacindeexcepciones.
Para establecer esta delegacin, en la cabecera del mtodo se declara el tipo de excepciones que
puedegeneraryquedebernsergestionadasporquieninvoqueadichomtodo.Utilizaremospara
ellolasentenciathrowsytrasesapalabraseindicaquexcepcionespuedeprovocarelcdigodel
mtodo.Siocurreunaexcepcinenelmtodo,elcdigoabandonaesemtodoyregresaalcdigo
desdeelquesellamalmtodo.Allseposarenelcatchapropiadoparaesaexcepcin.Susintaxis
eslasiguiente:
public
...
public
String
Return
}
...
}

class delegacion_excepciones {
int leeao(BufferedReader lector) throws IOException, NumberFormatException{
linea = teclado.readLine();
Integer.parseInt(linea);

DondeIOExceptionyNumberFormatException,serandosposiblesexcepcionesqueelmtodo
leeaopodragenerar,peroquenogestiona.Portanto,unmtodopuedeincluirensucabeceraun
listadodeexcepcionesquepuedelanzar,separadasporcomas.

PARASABERMS
Si deseas saber algo ms sobre la delegacin de excepciones, te proponemos el siguiente
enlace:
http://dis.um.es/~bmoros/Tutorial/parte9/cap93.html
AdemstevolvemosaremitiralvideodemostrativosobremanejodeexcepcionesenJava
queseincluyenelepgrafeanterior,tituladocapturarunaexcepcin.

25

Usodeestructurasdecontrol

DAW

7. Prueba de programas
CASO PRCTICO
Continuando con el especial inters de BK Programacin porque sus aplicaciones sean de verdadera
calidad, Ada est dispuesta a emprender un plan de pruebas de software que sea capaz de reducir al
mnimo posible los errores que puedan contener las aplicaciones que estn desarrollando.
Juan y Mara ya conocan de la existencia de ciertas pruebas que se suelen hacer al software, pero
necesitarn aprender bien las tcnicas y utilizar las herramientas que los entornos de desarrollo
ofrecen para tal proceso.

A veces, los programas son complejos y es difcil hacer que stos funcionen correctamente. Las
pruebasdelsoftwaresonunconjuntodetcnicasutilizadasparaverificarqueunprogramallevaa
cabosutareacorrectamente.Vindolodesdeotropuntodevista,podramosdecirquelarealizacin
depruebasennuestrosprogramasintentanrevelarlaexistenciadeerrores.Cuandodetectamosque
existeunerror,necesitamoslocalizarlollevandoacabotcnicasdedepuracindecdigo,paraluego
acometerlasmodificacionesnecesariasqueeliminendichoerror.
Noobstante,lastcnicasdepruebadelsoftwarenogarantizanquetodosloserroresvayanasalira
laluzyanas,habrprogramasdegrantamaoquesiganconteniendoerroresocultosenellos.De
todas maneras, la realizacin de pruebas de software est considerada como una etapa de gran
importancia en el desarrollo de software. Casi la mitad del tiempo dedicado al desarrollo de un
programa,seempleaenlarealizacindepruebasalmismo.Enalgunasorganizaciones,larealizacin
de pruebas se considera tan importante que existen equipos de desarrollo de software en los que
haytantosprobadoresdesoftwarecomoprogramadores.
Los procesos de prueba y depuracin requieren una considerable cantidad de tiempo y esfuerzo,
hacindosedifciltomarunadecisinacertadaentrecontinuarlapruebadelprogramaoentregarlo
ensuestadoactualalcliente.
Un concepto muy importante con el que vamos a trabajar es el de verificacin de programas. La
verificacindeprogramasesunprocesoporelqueseintentacorroborarqueunprogramahacelo
queseesperadel.Setratadeconfirmarqueelprogramacumpleconsusespecificaciones.
En esta parte de la unidad nos centraremos en las tcnicas de prueba sistemtica de programas,
verificacinyanlisisdedeficienciasdelsoftware.
Lastcnicasqueveremosson:
9
9
9
9

Pruebasdecajanegraotestfuncionales.
Pruebasdecajablancaotestestructurales.
Revisionesorecorridos.
Anlisispasoapasodelcdigoconundepurador(debugger).

Unpequeoprogramaqueconsistesloenunanicaclase,normalmentepuedeserprobadodeuna
solavez.Encambio,unprogramademayortamaoqueincluyemscantidaddeclases,esposible
queporsucomplejidad,debaserprobadoporpartes.EnJava,eltamaonaturaldecadaunadeesas
partesserlaclaseyserconvenienteprobarnuestrosprogramasclaseporclase.Estoesllamado
PruebasdeUnidad.Ycuandoserealizanpruebasdefuncionamientoreuniendotodaslaspartesdel
programacompleto,laspruebasrecibenelnombredePruebasdeIntegracinoPruebasdeSistema.

26

DiseodeAplicacionesWeb

Tema4

AUTOEVALUACIN
En el proceso de [ verificacin ] se trata de confirmar que el programa cumple con sus [
especificaciones].

7.1.Laespecificacin
Elpuntodepartidaparacualquierpruebaeslaespecificacin.Nopodemosconsiderarunaprdida
de tiempo el anlisis claro de dicha informacin. En ocasiones, podra ser necesario volver a
entrevistaraunclienteoalfuturousuariodelprograma.
Paraentenderlaimportanciadeesteelemento,supongamoslasiguienteespecificacin:
9 Esnecesarioescribirunprogramaquesolicitelaentradaalusuariodenmerosatravsde
cajasdetexto.Elprogramadebecalcularymostrarlasumadelosnmeros.
A priori, esta especificacin puede parecer simple y clara. Nada ms lejos de la realidad, ya que
existenlagunascomo:
1. Losnmerossonenterosocomaflotante?
2. Culeselrangoyprecisindedichosnmeros?
3. Puedenincluirsenmerosnegativos?
Si estas preguntas no son aclaradas antes de que el programador comience su trabajo, pueden
producirse dificultades en el desarrollo del programa. Por tanto, ser parte del proceso de
programacin el estudio de la especificacin para descubrir cualesquiera omisiones o confusin y
paraconseguirunaespecificacintotalmenteclara.
Acontinuacinsemuestraunaversinmuchomsclaradelaespecificacinanterior:
9 Esnecesarioescribirunprogramaquesolicitelaentradaalusuariodeunaseriedenmeros
enterosatravsdeunacajadetexto.Losenterosestnenelrango0a10000.Elprograma
calculaymuestralasumadelosnmeros.
Comopuedesapreciar,estaespecificacinesmsprecisaalestablecerelrangopermitidodeentrada
devalores,porejemplo.
Unavezvaloradalaimportanciadeunacorrectaespecificacin,elprogramadorpuedecomenzarel
proceso de pruebas del software a travs de las herramientas que se detallarn en los siguientes
epgrafesdelaunidad.

7.2.Pruebasexhaustivas
He de probar todas las posibilidades?, es una pregunta que puede surgir cuando comenzamos a
programar. Podramos pensar en que la realizacin de una prueba requerira probar nuestro
software con todos los posibles valores de entrada. Este tipo de prueba se denomina prueba
exhaustiva y significa que seleccionamos todos los posibles valores de entrada, as como todas sus
posiblescombinacionesyhacemosquenuestroprogramaopereconellos.Pensemosunmomento
enelampliorangodeposiblesvaloresquepuedentomarlosnmerosintdeJava.Teimaginaslo
quepuedesuponerrealizarunapruebadeestetipo?podramosestarhablandodeaos!.

27

Usodeestructurasdecontrol
DAW

En resumen, la pruebaa exhaustivaa (aunque sea


s para un
n programa pequeo) n
no es factib
ble. Es
importante reconocer que
q la prueb
ba completaa de program
mas no es posible, por lo que tendrremos
queadoptarotrastcnicasmsadeecuadas.

AUTOEV
VALUACI
N
Durante unna prueba exhaustiva
e
h
hemos
de seeleccionar una
u muestraa de los possibles valorres de
entrada deel programaa y hacer que
q ste tom
me diferentes caminoss de ejecuciin para veer los
resultados que se obtieenen.
dadero
Verd
Falsso

Nosetratadep
probarlosdifereentescaminosdeeejecucin,setra
atadeprobarco
ontodoslosposib
blesvaloresdeen
ntradadelprogrrama,lo
cualpuederesu
ultarextremadam
mentetedioso.

7.3.Prueb
basdeCa
ajaNegraoPruebassFuncion
nales
Descartadass las pruebaas exhaustivvas, una tccnica ms aadecuada paara la
realizacin de
d nuestras pruebas es el empleo de
d las Pruebas de Caja Negra.
N
E
Estetipode
basaenutilizzarunosdato
osdeentrad
daquepuede
enser
pruebasseb
representativo
os de todos los posibles datos de en
ntrada. Con ellos, se pone en
funccionamientoelprogramaayseanalizaaquocurre..
d Caja Negrra porque no se utiliza ningn cono
ocimiento deel funcionam
miento intern
no del
Se llaman de
programa como
c
parte de la prueb
ba, slo se consideran
c
laas entradas y las salidass. El program
ma se
piensacomosifueraun
nacajanegraaquerecibedatosdeen
ntradayofreceunassalid
dasdetermin
nadas.
mbredePruebasFuncio
onalesporqueutilizasolaamenteelco
onocimiento
odela
Tambinreecibenelnom
funcindelprograma(n
nocmotrab
bajainternam
mente).
previsto,anttesdeejecuttarlapruebaa.Esa
Inicialmentee,seanotanlosdatosdeepruebayeelresultadop
loquesedeenominaesp
pecificacino
oplanificaci
ndelaprue
eba.Posterio
ormente,seponeelproggrama
enfuncionaamiento,se introducenllosdatosysseexaminanlassalidasp
paraversieexistendifere
encias
entreelresultadoprevistoyelresu
ultadoobteniido.Losdato
osdepruebaadeberntambincomp
probar
n manejadass por el programa, de acuerdo a su especificacin. Es decir,
si las excepciones son
tendremos que ponerr en aprieto
os a nuestrro programaa a travs de unos d
datos de en
ntrada
determinad
dos,paracom
mprobarsireeaccionacorrectamentealasespecifficacionesqu
uedebacumplir.

7.4.Pru
uebasdeCajaBlan
ncaoPrue
ebasEstru
ucturales
Esteotrotipodeprruebassebaasaenelconocimientodelfuncionam
mientointern
nodel
program
ma,laestruccturadelmismoparase
eleccionarlo
osdatosdep
prueba.Alolargo
de las pruebas de caja blanca cada declarracin que forma
f
parte del program
ma es
ejecutadaenalgnmom
n
mento.Porlo
oquecadasecuenciadeinstruccioneesocaminoporel
quepueda fluirelproggramaesejecutadaenalgunaocasi
nduranted
dichapruebaa.Considerndose
caminosnu
ulos,sentencciascondicionalessimpleesocompuestas,bucles,,etc.Laprueebadeberiincluir
cualquiercaaminodelprrogramaqueepuedageneerarunaexce
epcin.
Estetipodeepruebasesttmuyligadoalcdigoffuentedelprrograma,detalforma,quelaperson
naque
realizalasp
pruebasdebeeescogerdisstintosvaloresdeentrad
daparacheq
quearcadaunodelospo
osibles

28

DiseodeAplicacionesWeb

Tema4

caminosdeejecucinqueexistenenelprogramayverificarquelosresultadosdecadaunodeellos
sonadecuados.

AUTOEVALUACIN
Si nos encontramos realizando pruebas y estamos examinando el funcionamiento de un bucle
while, estaremos realizando Pruebas de Caja [ Blanca ].

7.5.Otraspruebas
Adems de las tpicas pruebas de Caja Blanca y Negra, existen otras tcnicas de prueba que
detallamosacontinuacin:
a) Revisiones,inspeccionesorecorridos:
Estatcnicanohaceusodelcomputadorparaintentarerradicarerroresenelcdigo.Enun
recorridoseestudiaellistadodelprograma(juntoconlaespecificacin)paraintentarhacer
visibleslosposibleserrores.Esrecomendableque quienlleveacaboelrecorridonoseala
mismapersonaquedesarrollelcdigoarevisar.
Sihasprogramadoalgunavez,quiztesueneestasituacin:
Llevasmsdeunahorabuscandounerrorenelcdigodetuprograma,yaquesteteest
generando errores de compilacin o ejecucin. Miras, vuelves a mirar, revisas, repasas,
cambiasalgunavariableosentencia,...Nada,noencuentroelfallo!.Depronto,uncolega
releetucdigomientrassetomauncafyoyesdetrsdetiunavozquedice:Anda,tefalta
unparntesisah!.

Sabidurapopular:Cuatroojosvenmsquedos.
Para llevar a cabo este tipo de prueba necesitaremos la especificacin del programa y el
cdigofuenteenpapel.Lasaccionesquesuelenrealizarseson:inspeccionarlainicializacin
devariables,realizacindellamadasamtodoscorrectas,definicinadecuadadecabeceras
demtodos,parmetroscorrectos,etc.Posteriormente,sehadellevaracabounarevisin
de la lgica del programa simulando ejecutar los mtodos como si nosotros mismos
furamos el computador. Las pruebas de revisin o recorrido no comprueban el estilo del
cdigo, sino posibles deficiencias que pueden provocar errores. Est demostrado que los
recorridossonunavaadecuadaparaencontrarerrores.
a) Anlisispasoapaso:
ExistenalgunosentornosdedesarrolloparaJavaqueincorporandepuracinpasoapasodel
cdigo.Estopermitealprogramadorejecutarunaaunacadainstruccindesuprograma.De
este modo, es posible ver qu camino de ejecucin se est tomando, los valores de las
distintas variables, etc. Este anlisis paso a paso est estructurado y automatizado,
permitindonos comprobar si el flujo del programa es el correcto, si los valores de las
variablesvaranenfuncindelaejecucindelprograma,etc.
Estatcnicasueleconfirmarodesmentirlaexistenciadeundeterminadofallo,aunqueest
mscercadeladepuracindeprogramasquedelapropiapruebadelosmismos.

29

Usodeestructurasdecontrol

DAW

7.6.RealizacindePruebasUnitariasconJUnit
Alcomienzodeestapartedelaunidaddedicadaalaspruebasydepuracindesoftware,hablamos
deuntipodepruebasqueseaplicanacadaunadelasclasesquehayamosdefinido.EranlasPruebas
Unitarias.
Esciertoquecualquiercdigoqueescribamosdeberadeserprobadoantesdedarporfinalizadala
implementacin de una clase, ya que si no, no estaramos totalmente seguros de su correcto
funcionamiento. Para verificar que el cdigo no contiene errores de programacin y que adems
realiza adecuadamente lo que nosotros esperbamos de l, es realizando una serie de test que lo
corroboren.
Quinnohaidoescribiendomensajesdesalidadetextoalolargodesucdigo?Estaesunatcnica
muyutilizadaparacontrolarelvalordeciertasvariablesyparaladeteccindeposibleserrores,lo
queconfirmaquetodosrealizamospruebasanuestrosprogramasdealgunauotramanera.
Pero,Existenformasmsavanzadas,eficientesysegurasdeprobarelcdigo?,S.Podemosutilizar
paraelloJUnit.AtravsdeJUnittendremoslaposibilidadderealizartestanuestrasclasesdeforma
sencilla,rpidayelegante,ascomovalidarlosresultadosquenosofrecen.
YquesJUnit?EsunconjuntodebibliotecasqueseutilizanenprogramacinparahacerPruebas
UnitariasaaplicacionesJava.Elconjuntodeclases(framework)incluidasenJUnitpermitecontrolar
laejecucindelasclasesJava,detalformaquepodremosevaluarsielfuncionamientodecadauno
delosmtodosdelaclaserealizasutrabajocomodebera.JUnitseempleaparaindicarsilaclaseen
cuestin ha pasado los test de prueba, en otro caso se devolver una notificacin de fallo en el
mtodocorrespondiente.
Actualmente, el entorno de desarrollo NetBeans cuanta con plugins que permiten la generacin
automticadeplantillasdepruebasdeclasesJava.
PorquutilizarJUnit?Acontinuacintedamosalgunasrazonesdepesoporlaqueesteframework
estmuyextendidoentrelacomunidaddeprogramadoresJava:
9 AtravsdelostestdeJUnitseincrementalacalidadyvelocidaddegeneracindecdigo.
9 Laescrituradetestessencilla.
9 Los test JUnit chequean sus propios resultados y proporcionan informacin de retorno al
instante.
9 LostestsJUnitincrementanlaestabilidaddelsoftware.
9 LostestJUnitseescribenenJava.
9 JUnitesgratuito.

PARASABERMS
El IDE NetBeans 7.0. ya incorpora JUnit desde la instalacin, por lo que podemos beneficiarnos de
esta herramienta de testeo slo con utilizarla desde el IDE. Si quieres conocer cmo realizar los
primerospasosconellayverejemplosdeutilizacin,terecomendamosveaslosiguiente:

Test con JUnit


ElviernesdicteuntallerenelqueconversbamossobreTecnologasJavayluegodesarrollamos
unaaplicacinmuybsicaparademostrarcmoutilizarJUnitconNetBeans.

30

Dise
odeAplicaccionesWeb

Tema4
4

Pasoss
1

CreearunproyectoDesktop
con
nNetBeans

Creearunaclaseellamada
Operaciones

Diseadosunfo
ormularioy
agrregramoscom
mponentesd
de
maneraquequ
uedesimilaraala
figu
ura:

Cdiggodelosbottones
try {
do
ouble a = Do
ouble.parseDo
ouble(jTextF
Field1.getTe
ext());
do
ouble b = Do
ouble.parseDo
ouble(jTextF
Field2.getTe
ext());
Op
peraciones operaciones
o
= new Operac
ciones();
do
ouble r = op
peraciones.Su
umar(a, b);
jT
TextField3.setText(Strin
ng.valueOf(r
r));
} cat
tch (Excepti
ion ex) {
JO
OptionPane.showMessageDialog(this, ex.getMessa
age().toStri
ing());
}

Creamoslostest

S
Seleccionam
moslasclasess

EnelmenHerramientaas,
mosCrearpru
uebasJUnit
seleccionam

S
Seleccionam
moslaversin
ndeJUnit

31

Usodeestructurasdecontrol

DAW

onamos
Enlaventanasiguienteseleccio
pruebas.
losparrmetrosparranuestrasp
LequittamoslaseleeccinaProb
bar
InicializadoryProb
barFinalizado
or

NetBeaanscrealascclasesdeTesst.
Observvequelasclaasesterminaanen
TEST

oslaclaseOperacionesTTest.java.
Abrimo
10 Segenerarlosmttodosdelaclase
originaal.

Editam
mostodaslassclasesy
comen
ntamoslalineeafail("Thettestcase
isapro
ototype.");colocando//
11
(comentarios)delaantedelasen
ntencia.
Ahoraindicamoslo
osparmetro
osparael
testyeelresultado.

12 Ejecutaamoseltest

Nosmuestralasaliidacolorverrde
13 indican
ndoquelasp
pruebasfuerron
exitosaas.

Pensem
mosquealgu
uienporerro
orcambia
elcdigodelmtodoSumar()
quedandodeestamanera
14

public double Suma


ar(double a,
, double
b){
return a + b * 2;
}

Ejecutaamosnuevam
menteeltesst

32

Dise
odeAplicaccionesWeb

Tema4
4

Observamossendetallelasalida

Estoindicaenelmtodoque
eestaelerro
orypodamo
oscorregirlo..Erauntalleemuybsico
opara
estud
diantesquenuncahanu
utilizadoTestt.

mosotropaso
oapasodeccmousarJU
UnitenNetB
Beans.
Veam
Crearrunaclase(V
Veamoscm
mocrearunaaclasedetesst)

SSobrelaclasequedeseamos
t
testearpulsa
aconelbot
n
d
derechoene
elmen

ToolsCre
eateJUnitT
Test.

PulsaOK.
P
Y
Ysecrearu
unanuevaclaasede
t
testconeles
squeletoquee
p
permitirpro
obarlaclase.
L
Lanuevaclas
sesecreaen
nel
m
mismopaqu
etequelaclasea
enlalocalizacin
t
testearpero

TestPackag
ges.Ademsssellama
c
comolaclase
eoriginalpero
lsufijoTest.
a
aadiendoe

33

Usodeestructurasdecontrol

DAW

Ahorayapuedesprogramarla
clasedeTest.

EjecutandolosTest

Pulsaconelbotnderechosobre
elproyectoyejecutalaopcinde
menTest.

Enesteejemplopodemosverlasiguienteinformacin:
Aparecerenlaventanainferior a) %detestpasados(58,3%),esdecirloquehan
funcionado.
elresultadodeejecutarlosTests.
b) ElNdetestpasados(7tests),elNdetestquehan
fallado(5Tests)yeltiempoquehantardadoen
ejecutarse(0,266segundos)
c) Eliconoenverdesignificaquetodoslostestdeesaclase
hanfuncionadocorrectamente.
d) Eliconoenrojosignificaquealmenosuntesthafallado.
e) Eliconoenverdesignificaqueesetestconcretoenla
clasehafuncionadocorrectamente.

34

DiseodeAplicacionesWeb

f)

Tema4

LosiconosamarillosignificanquesonTestquehan
fallado.

MiraahoraelsiguientevdeodeejemplosconJUnit
http://www.youtube.com/watch?v=SkQH637rpM
En este video se realiza una introduccin inicial a las funciones principales del framework JUnit,
posteriormente se indica dnde y cmo llevar a cabo la descarga del framework y su instalacin
como plugin en el IDE Eclipse. (Estas acciones no habra que llevarlas a cabo en NetBeans 7.0.). A
continuacin,atravsdeunejemplodesumadedosoperandos,creauntestparacomprobarque
losmtodosdelaclasellevanacabocorrectamentesusfunciones.

AUTOEVALUACIN
En versiones anteriores a NetBeans 7.0., para poder trabajar con el FrameWork JUnit era
necesario incorporarlo manualmente al IDE.
Verdadero
Falso

Efectivamente,yaenlaversin7.0.noesnecesarioyalrealizarlainstalacinseaceptalalicenciadeJUnitdesdeelinicio.Conloque
podremosutilizaresteFrameWorkdirectamenteennuestroNetBeans7.0.

35

Usodeestructurasdecontrol

DAW

8. Depuracin de programas
CASO PRCTICO
Ada y Juan ya conocen las capacidades del depurador que incorpora el entorno NetBeans y van a
ensear a Mara las ventajas de utilizarlo.
Puedes depurar tus programas haciendo dos cosas: creando Breakpoints o haciendo ejecuciones
paso a paso. Le comenta Juan.
Mara, que estaba codificando un nuevo mtodo, se detiene un momento y pregunta: Entonces,
cuando el programa llega al Breakpoint podr saber qu valor tiene una variable determinada?
Efectivamente Mara, y podrs saber el valor de aquellas que t decidas. De este modo a travs de
los puntos de ruptura y de las ejecuciones paso a paso podrs descubrir dnde puede haber errores
en tus programas. Conocer bien las herramientas que el depurador nos ofrece es algo que puede
ahorrarnos mucho trabajo. Aporta Ada.

La Depuracin de programas es el proceso por el cual se identifican y corrigen errores de


programacin. Generalmente, en el argot de programacin se utiliza la palabra debugging, que
significalocalizacinyeliminacindebichos(bugs)oerroresdeprograma.Atravsdeesteproceso
sedescubrenloserroresyseidentificaquzonasdelprogramalosproducen.Haytresetapasporlas
queunprogramapasacuandosteesdesarrolladoyquepuedengenerarerrores:
9 Compilacin: Una vez que hemos terminado de afinar un programa, solemos pasar
generalmente cierto tiempo eliminando errores de compilacin. El compilador de Java
mostrar una serie de chequeos en el cdigo, sacando a la luz errores que pueden no
apreciarseasimplevista.Unavezqueelprogramaesliberadodeloserroresdecompilacin,
obtendremosdelalgunosresultadosvisiblesperoquiznohagaanloquequeremos.
9 Enlazado:Todoslosprogramashacenusodelibrerasdemtodosyotrosutilizanmtodos
generadosporlospropiosprogramadores.Unmtodoesenlazado(linked)slocuandoste
es llamado, durante el proceso de ejecucin. Pero cuando el programa es compilado, se
realizan comprobaciones para saber si los mtodos llamados existen y sus parmetros son
correctosennmeroytipo.Asqueloserroresdeenlazadosondetectadosdurantelaetapa
decompilacin.
9 Ejecucin:Cuandoelprogramaentraenejecucin,esmuyfrecuentequestenofuncione
como se esperaba. De hecho, es normal que el programa falle. Algunos errores sern
detectados automticamente y el programador ser informado, como acceder a una parte
deunarrayquenoexiste(errordendices)porejemplo.Otrossonmssutilesydanlugar
simplemente a comportamientos no esperados, debido a la existencia de errores ocultos
(bugs)enelprograma.Deahlostrminosbugydebugging.Elproblemadeladepuracines
quelossntomasdeunposibleerrorsongeneralmentepococlaros,hayquerecurrirauna
labordeinvestigacinparaencontrarlacausa.
Ladepuracindeprogramasesalgoascomoserdoctor:existeunsntoma,hemosdeencontrarla
causayentoncesdeterminarelproblema.Eltrabajodeeliminacindeerrorespuedeserinteresante.
Ladepuracinylapruebasuelenrequerirunacantidaddetiempoconsiderableencomparacincon
eltiempodedicadoalaprimeracodificacindelprograma.Peronotepreocupes,esnormalemplear
mstiempoenesteproceso.
Y cmo llevamos a cabo la depuracin de nuestros programas?, pues a travs del debugger o
depurador del sistema de desarrollo Java que estemos utilizando. Este depurador ser una
herramienta que nos ayudar a eliminar posibles errores de nuestro programa. Podremos utilizar
depuradores simples, como el jdb propio de Java basado en lnea de comandos. O bien, utilizar el

36

DiseodeAplicacionesWeb

Tema4

depurador existente en nuestro IDE (en nuestro caso NetBeans). Este ltimo tipo de depuradores
muestralossiguienteselementosenpantalla:Elprogramaenfuncionamiento,elcdigofuentedel
programaylosnombresyvaloresactualesdelasvariablesqueseseleccionen.
Quelementospodemosutilizareneldepurador?Existenalmenosdoselementosfundamentales
quepodemosutilizarennuestrodebuggerodepurador,sonlossiguientes:
9 Breakpointsopuntosderuptura:Estospuntospuedenserdeterminadosporelpropio
programadoralolargodelcdigofuentedesuaplicacin.UnBreakpointesunlugarenel
programa en el que la ejecucin se detiene. Estos puntos se insertan en una determinada
lnea del cdigo, entonces el programa se pone en funcionamiento y cuando el flujo de
ejecucinllegahastal,laejecucinquedacongeladayunpunteroindicaellugarenelque
la ejecucin se ha detenido. El depurador muestra los valores de las variables tal y como
estnenesemomentodelaejecucin.Cualquierdiscrepanciaentreelvaloractualyelvalor
quedeberantenersuponeunaimportanteinformacinparaelprocesodedepuracin.
9 Ejecucin paso a paso: El depurador tambin nos permite ejecutar un programa paso a
paso,esdecir,lneaporlnea.Atravsdeestaherramientapodremosseguirelprogresode
ejecucindenuestraaplicacinysupervisarsufuncionamiento.Cuandolaejecucinnoesla
esperada quiz estemos cerca de localizar un error o bug. En ocasiones, si utilizamos
mtodosprocedentesdelibrerasestndarnonecesitaremoshacerunrecorridopasoapaso
por el interior de stos mtodos, ya que es seguro que no contendrn errores internos y
podremos ahorrar tiempo no entrando en su interior paso a paso. El debugger ofrece la
posibilidaddeentraronoendichomtodos.

DEBESCONOCER
Para completar tus conocimientos sobre la depuracin de programas, te proponemos los
siguientesenlacesenlosquepodrsencontrarcmosellevanacabolastareasbsicasde
depuracinatravsdelIDENetBeans.
DepuracindeprogramasconNetBeans
La depuracin (debug) permite examinar las aplicaciones para buscar errores, ya que posibilita
observar las lneas que se van ejecutando, as como los valores que van tomando las variables en
cadapaso.
Para realizar la depuracin de un programa, se debe establecer en primer lugar un punto de
interrupcin donde debe pararse la ejecucin de la aplicacin. Esto se consigue con alguna de las
siguientesaccionessobrelalneadecdigoenlaquesedeseeestablecerelpuntodeinterrupcin:

Clicenelmargenizquierdo

Mencontextual>"Ocultar/Mostrarlneade
puntodeinterrupcin"

Pulsandolacombinacindeteclas:Ctrl+F8

Men "Depurar > Ocultar/Mostrar lnea de


puntodeinterrupcin"

37

Usodeestructurasdecontrol

DAW

Al realizar alguna de esas acciones, se marca en color rosado la lnea que se ha convertido en un
puntodeinterrupcin,ysemuestraunpequeocuadradoenelmargenizquierdo.
Una vez establecido al menos un punto de interrupcin, se debe ejecutar la aplicacin en modo
depuracin.Estosepuedellevaracabosobreelproyectooslosobreelarchivoactual:
9

Depurararchivoactual:
Mencontextual>"DebugnombreArchivo"
Men"Depurar>DebugnombreArchivo"
Pulsandolacombinacindeteclas:Ctrl+Maysculas+F5

Depurarproyecto:
Men"Depurar>DebugMainProject"
Icono"DebugMainProject"

Alllegarlaejecucindelaaplicacinalpuntode
interrupcin establecido, se destaca en color
verdelalneadecdigoenlaqueseencuentre
laejecucin.
En la parte inferior se muestra la ventana de
observacin de las variables locales, en la que
se puede comprobar el valor que va tomando
cadavariable.
A partir del momento en que se para la
ejecucindelprogramasepuedecontinuarcon
la ejecucin lnea a lnea utilizando la opcin
"Continuarejecucin":
9

PulsandolateclaF8

Men"Depurar>Continuarejecucin"

Icono"Continuarejecucin"

As se va mostrando en verde la lnea que se va


ejecutando en cada momento, y se van
actualizandoenlaventanainferiorlosvaloresque
vantomandolasvariableslocales.
Encasodequesedeseaqueelprogramacontine
la ejecucin sin ms paradas, se dispone de la
opcin"Continuar":
9
9

PulsandolateclaF5
Men"Depurar>Continuar"

Icono"Continuar"

38

DiseodeAplicacionesWeb

Tema4

39

DepuracinbsicaenNetBeans.

Usodeestructurasdecontrol

DAW

40

DiseodeAplicacionesWeb

Tema4

41

Usodeestructurasdecontrol

DAW

10

11

12

42

DiseodeAplicacionesWeb

Tema4

43

13

14

15

Usodeestructurasdecontrol

DAW

PARASABERMS
Si deseas conocer algo ms sobre depuracin de programas, pero a un nivel algo ms
avanzado,accedealsiguientevdeo.
http://www.youtube.com/watch?v=qAo9bWDzj0
ElvdeocomienzaconunadescripcingenricasobrelasfuncionesdeldepuradordelentornoIDE
NetBeans. Seguidamente se realiza una descripcin de las herramientas principales del depurador,
llevandoacaboejemplosdedepuracinutilizando:Stepinto,StepOut,StepOver,Breakpoints
(simples, condicionales, cuantificados), Watches y Call Stack. Como puede observarse se han
utilizadounaampliagamadeherramientasdeldepuradorquepuedensermuytilesparallevarel
procesodedepuracincongarantas.

44

DiseodeAplicacionesWeb

Tema4

9. Documentacin del cdigo


CASO PRCTICO
Ada est mostrando a Juan la documentacin sobre una serie de mtodos estndar que van a
necesitar para completar el desarrollo de una parte de la aplicacin. Esta documentacin tiene un
formato estructurado y puede accederse a ella a travs del navegador web.
Qu til y fcil est siendo el acceso esta documentacin! La verdad es que los que la han
generado se lo han currado bastante. Generar esta documentacin se llevar mucho tiempo, no
Ada? Pregunta Juan mientras recoge de la impresora la documentacin impresa.
Ada prepara rpidamente una clase en blanco y comienza a incorporarle una serie de comentarios:
Vers Juan, documentar el cdigo es vital y si incorporas a tu cdigo fuente unos comentarios en el
formato que te voy a mostrar, la documentacin puede ser generada automticamente a travs de la
herramienta Javadoc. Observa... Responde Ada.

Llegadosaestepunto,vamosaconsiderarunacuestindegranimportancia,ladocumentacindel
cdigofuente.
Piensaenlassiguientescuestiones:
9 Quincreesqueaccederaladocumentacindelcdigofuente?Puessernlosautoresdel
propiocdigouotrosdesarrolladores.
9 Por qu hemos de documentar nuestro cdigo? Porque facilitaremos su mantenimiento y
reutilizacin.
9 Qudebemosdocumentar?Obligatoriamente:clases,paquetes,constructores,mtodosy
atributos.
Opcionalmente:bucles,partesdealgoritmosqueestimemosoportunocomentar,
A lo largo de nuestra vida como programadores es probable que nos veamos en la necesidad de
reutilizar, modificar y mantener nuestro propio cdigo o incluso, cdigo de otros desarrolladores.
Nocreesqueseramuytilquedichocdigoestuvieraconvenientementedocumentado?Cuntas
vecesnohemosledocdigodeotrosprogramadoresyquiznohayamoscomprendidoquestaban
haciendo en tal o cual mtodo?. Como podrs comprender, la generacin de una documentacin
adecuada de nuestros programas puede suponer una inestimable ayuda para realizar ciertos
procesosenelsoftware.
SianalizamosladocumentacindelasclasesproporcionadaenlospaquetesquedistribuyeSun,nos
daremos cuenta de que dicha documentacin ha sido generada con una herramienta llamada
Javadoc. Pues bien, nosotros tambin podremos generar la documentacin de nuestro cdigo a
travsdedichaherramienta.
Sidesdeelprincipionosacostumbramosadocumentarelfuncionamientodenuestrasclasesdesde
elpropiocdigofuente,estaremosfacilitandolageneracindelafuturadocumentacindenuestras
aplicaciones. Cmo lo logramos? A travs de una serie de comentarios especiales, llamados
comentariosdedocumentacinqueserntomadosporJavadocparagenerarunaseriedearchivos
HTMLquepermitirnposteriormente,navegarpornuestradocumentacinconcualquiernavegador
web.
Loscomentariosdedocumentacintienenunamarcadecomienzo(/**)yunamarcadefin(*/).En
suinteriorpodremosencontrardospartesdiferenciadas:unapararealizarunadescripcinyotraen
laqueencontraremosmsetiquetasdedocumentacin.Veamosunejemplo:

45

Usodeestructurasdecontrol

DAW

/**
* Descripcin principal (texto/HTML)
*
* Etiquetas (texto/HTML)
*/

Este es el formato general de un comentario de documentacin. Comenzamos con la marca de


comienzoenunalnea.
Cada lnea de comentario comenzar con un asterisco. El final del comentario de documentacin
deberincorporarlamarcadefin.Lasdospartesdiferenciadasdeestecomentarioson:
9 Zona de descripcin: es aquella en la que el programador escribe un comentario sobre la
clase,atributo,constructoromtodoquesevayaacodificarbajoelcomentario.Sepuede
incluirlacantidaddetextoquesenecesite,pudiendoaadiretiquetasHTMLqueformateen
el texto escrito y as ofrecer una visualizacin mejorada al generar la documentacin
medianteJavadoc.
9 Zonadeetiquetas:enestapartesecolocarunconjuntodeetiquetasdedocumentacina
las que se asocian textos. Cada etiqueta tendr un significado especial y aparecern en
lugaresdeterminadosdeladocumentacin,unavezhayasidogenerada.
Enlasiguienteimagenpuedesobservarunejemplodeuncomentariodedocumentacin.

R.Caron.:"donotdocumentbadcoderewriteit"
REFLEXIONA
Documentar el cdigo de un programa es aadir suficiente informacin como para explicar lo que
hace,puntoporpunto,deformaquenoslolosordenadoressepanquhacer,sinoqueademslos
humanosentiendanquestnhaciendoyporqu.Documentarunprogramanoesslounactode
buenhacerdelprogramadorporaquellodedejarlaobrarematada.Esademsunanecesidadque
slo se aprecia en su debida magnitud cuando hay errores que reparar o hay que extender el
programaconnuevascapacidadesoadaptarloaunnuevoescenario.

9.1Etiquetasyposicin
Cuandohemosdeincorporardeterminadasetiquetasanuestroscomentariosdedocumentacines
necesario conocer dnde y qu etiquetas colocar, segn el tipo de cdigo que estemos
documentandoenesemomento.Existirndostiposgeneralesdeetiquetas:
1. Etiquetas de bloque: Son etiquetas que slo pueden ser incluidas en el bloque de
documentacin,despusdeladescripcinprincipalycomienzanconelsmbolo@.
2. Etiquetasentexto:Sonetiquetasquepuedenponerseencualquierpuntodeladescripcino
en cualquier punto de la documentacin asociadaa una etiqueta de bloque. Son etiquetas
definidasentrellaves,delasiguienteforma{@etiqueta}

46

DiseodeAplicacionesWeb

Tema4

Enlasiguientetablapodrsencontrarunareferenciasobrelasdiferentesetiquetasysumbitode
uso.

9.2.Usodelasetiquetas
Culessonlasetiquetastpicasysusignificado?Pasaremosseguidamenteaenumerarydescribirla
funcindelasetiquetasmshabitualesalahoradegenerarcomentariosdedocumentacin.
9 @autor texto con el nombre: Esta etiqueta slo se admite en clases e interfaces. El texto
despusdelaetiquetanonecesitarunformatoespecial.Podremosincluirtantasetiquetasde
estetipocomonecesitemos.
9 @version texto de la versin: El texto de la versin no necesitar un formato especial. Es
convenienteincluirelnmerodelaversinylafechadesta.Podremosincluirvariasetiquetas
deestetipounadetrsdeotra.
9 @deprecatedtexto:Indicaquenodeberautilizarse,indicandoeneltextolascausasdeello.Se
puede utilizar en todos los apartados de la documentacin. Si se ha realizado una sustitucin
deberaindicarsequutilizarensulugar.Porejemplo:
@deprecated El
metodoCorrecto}

mtodo

no

funciona

correctamente.

Se

recomienda

el

uso

de

{@ling

9 @exceptionnombreexcepcintexto:Estaetiquetaesequivalentea@throws.
9 @param nombreatributo texto: Esta etiqueta es aplicable a parmetros de constructores y
mtodos. Describe los parmetros del constructor o mtodo. Nombreatributo es idntico al
nombredelparmetro.Cadaetiqueta@paramirseguidadelnombredelparmetroydespus
deunadescripcindeste.Porejemplo:
@param fromIndex El ndice del primer elemento que debe ser eliminado.

9 @return texto: Esta etiqueta se puede omitir en los mtodos que devuelven void. Deber
aparecer en todos los mtodos, dejando explcito qu tipo o clase de valor devuelve y sus
posiblesrangosdevalores.Veamosunejemplo:
/**
* Chequea si un vector no contiene elementos.
*
* @return <code>verdadero</code>si solo si este vector no contiene componentes, esto es,
su tamao es cero;
* <code>falso</code> en cualquier otro caso.
*/
public boolean VectorVacio() {
return elementCount == 0;
}

9 @see referencia: Se aplica a clases, interfaces, constructores, mtodos, atributos y paquetes.


Aadeenlacesdereferenciaaotraspartesdeladocumentacin.Podremosaadiralaetiqueta:
cadenasdecaracteres,enlacesHTMLapginasyaotraszonasdelcdigo.Porejemplo:

47

Usodeestructurasdecontrol

*
a
*
*

DAW

@see "Diseo de patrones: La reusabilidad de los elementos de la programacin orientada


objetos
@see <a href="http://www.w3.org/WAI/">Web Accessibility Initiative</a>
@see String#equals(Object) equals

9 @throws nombreexcepcin texto: En nombreexcepcin tendremos que indicar el nombre


completodesta.Podremosaadirunaetiquetaporcadaexcepcinqueselanceexplcitamente
con una clusula throws, pero siguiendo el orden alfabtico. Esta etiqueta es aplicable a
constructoresymtodos,describiendolasposiblesexcepcionesdelconstructor/mtodo.

AUTOEVALUACIN
Qu etiqueta podra omitirse en un mtodo que devuelve void?
@param

@throws

@return

@returnnoseranecesariaalnodevolvernadaelmtodo.

9.3.Ordendelasetiquetas
Lasetiquetasdebendisponerseenunordendeterminado,eselsiguiente:
Ordendelasetiquetasencomentariosdedocumentacin
etiqueta
Descripcin
En clases e interfaces. Se pueden poner varios. Es mejor ponerlas en orden
@autor
cronolgico.
@version
Enclaseseinterfaces.
En mtodos y constructores. Se colocarn tantos como parmetros tenga el
@param
constructoromtodo.Mejorenelmismoordenenelqueseencuentrendeclarados.
@return
Enmtodos.
Enconstructoresymtodos.Mejorenelmismoordenenelquesehandeclarado,o
@exception
enordenalfabtico.
@throws
Esequivalentea@exception.
Podemos poner varios. Comenzaremos por los ms generales y despus los ms
@see
especficos.
@deprecated

PARASABERMS
SiquieresconocercmoobteneratravsdeJavadocladocumentacindetusaplicaciones,
observaelsiguientecdigo:
/*
* ejemplojavadoc.java
*
* Created on July 5, 2003, 4:24 AM
*/
/**
* Clase que comienza la estructura de escepciones
* @author Roberto Canales
* @since 1.0
* @see Visitar www.adictosaltrabajo.com
*/
class RCException extends Exception
{
void depura(String psError)
{
System.out.println("Error: " + psError);
}

48

DiseodeAplicacionesWeb

Tema4

RCException(String psError)
{
super(psError);
depura(psError);
}
}
/**
*
* @author Roberto Canales
* @since 1.0
* @see Visitar www.adictosaltrabajo.com
*/
public class ejemplojavadoc {
/** Constantes publicas
public static final int
public static final int
public static final int

de gestion errores*/
ERROR
= 0;
LOG
= 1;
INFO
= 2;

/** Constructor por defecto */


public ejemplojavadoc() {
}
void depura(String sError)
{
System.out.println("ejemplojavadoc: " + sError);
}

/**
* @param args Array de argumentos
*/
public static void main(String[] args) {
/** Construimos un objeto no esttico */
ejemplojavadoc objetoAuxiliar = new ejemplojavadoc();
try
{
objetoAuxiliar.ejecuta();
}
catch(RCException e)
{
objetoAuxiliar.depura("Excepcion = " + e.getMessage());
}
}
/**
* Punto de entrada a la aplicacin
* @exception RCException Se genera una excepcin genrica.
* @return true
*/
public boolean ejecuta() throws RCException
{
/** Retornamos true por defecto */
int error = 0;
if(error == 0)
{
throw new RCException("Invocamos excepciones");
}
return true;
}
}

DocumentacindeclasesconJavadoc
Con el fin de facilitar la compresin de uso de una clase y sus mtodos, stos deben estar
debidamente documentados informando de su funcionamiento, de los parmetros que se deben
utilizarydelosresultadosqueseobtienen.

49

Usodeestructurasdecontrol

DAW

Para facilitar esta tarea, Java dispone de la herramienta javadoc, que genera una documentacin
estandarizadaobtenindoseenformatoweb,semejantealaAPIoficialdeJava.
Sedebeseguirunmodeloconcretoparaquesegenereladocumentacindeformacorrecta:
9

Todosloscomentariosdebencomenzarpor/**yterminarcon*/

Sedebedocumentarlaclaseycadamtodo,escribiendouncomentariodelantedecadaunode
ellos.

DentrodelcomentariosepuedenutilizaretiquetasHTML.

Elcomentariocomenzarconunadescripcingeneraldelobjetivodelaclaseydelosmtodos.

Despussepuedenindicarunaseriedevaloresutilizandounasetiquetaspredefinidas,siendo
lasmsimportanteslassiguientes:
@author:Paraindicarelnombredelautordelaclaseomtodo.
@version:Permiteespecificarlaversindelaclaseomtodo.
@param:Descripcindecadaparmetrodelmtodo.
@return:Descripcindelvalorqueretornaelmtodo.
@throws:Excepcinquepuedelanzarelmtodo.

01./**
02.* Aqu se debe escribir una descripcin general del funcionamiento de la clase
03.*
04.* @author nombre del autor
05.* @version 1.0
06.*/
07.public class ClaseEjemploJavadoc {
08.
09./** atributo1 sirve para lo que sea */
10.public String atributo1;
11.private int atributo2;
12.
13./**
14.* Descripcin del mtodo constructor
15.*
16.* @param atributo1 Descripcin del primer parmetro
17.* @param atributo2 Descripcin del segundo parmetro
18.*/
19.ClaseEjemploJavadoc(String atributo1, int atributo2) {
20.this.atributo1 = atributo1;
21.this.atributo2 = atributo2;
22.}
23.
24./**
25.* Descripcin del mtodo mtodo1
26.*
27.* @param parmetro3 Descripcin del valor que debe pasarse como parmetro
28.* @return Descripcin del valor que retorna el mtodo al ser llamado
29.*/
30.public int mtodo1(int parmetro) {
31.return 1;
32.}
33.}

ElentornoNetBeansproporcionaunaformasencilladegenerarladocumentacinenformatoHTML
atravsdejavadoc.ParaellosepuedeutilizarelmenEjecutar>GenerarJavadoc,odesdeelmen
contextualdelproyecto.

50

DiseodeAplicacionesWeb

Tema4

Al generar la documentacin se abre la pgina web que la


contiene,quetendrelsiguienteestilo:

Para comprobar si se ha incluido toda la informacin


necesaria o para facilitar la inclusin de los comentarios,
NetBeans ofrece la herramienta Analizador Javadoc:
Herramientas > Analizar Javadoc, que abre una ventana
informando de la informacin que falta y la posibilidad de
solucionarlosproblemasencontrados.

51

TEMA5

INDICE

1.Conceptodeclase...............................................................................................................................4
1.1Repasodelconceptodeobjeto.....................................................................................................................4
1.2Elconceptodeclase......................................................................................................................................5
2.Estructuraymiembrosdeunaclase...................................................................................................7
2.1Declaracindeunaclase...............................................................................................................................8
2.2Cabeceradeunaclase...................................................................................................................................9
2.3Cuerpodeunaclase....................................................................................................................................10
2.4Miembrosestticosodeclase....................................................................................................................11
3.Atributos............................................................................................................................................12
3.1Declaracindeatributos.............................................................................................................................13
3.2Modificadoresdeacceso............................................................................................................................14
3.3Modificadoresdecontenido.......................................................................................................................15
3.4Atributosestticos......................................................................................................................................16
4.Mtodos............................................................................................................................................18
4.1Declaracindeunmtodo..........................................................................................................................18
4.2Cabecerademtodo...................................................................................................................................19
4.3Modificadoresenladeclaracindeunmtodo.........................................................................................20
4.4Parmetrosenunmtodo..........................................................................................................................22
4.5Cuerpodeunmtodo.................................................................................................................................23
4.6Sobrecargademtodos..............................................................................................................................25
4.7Sobrecargadeoperadores..........................................................................................................................27
4.8Lareferenciathis.........................................................................................................................................27
4.9Mtodosestticos.......................................................................................................................................28
5.Encapsulacin,controldeaccesoyvisibilidad..................................................................................30
5.1Ocultacindeatributos.Mtodosdeacceso.............................................................................................31
5.2Ocultacindemtodos...............................................................................................................................32
6.Utilizacindelosmtodosyatributosdeunaclase.........................................................................35
6.1Declaracindeunobjeto............................................................................................................................35
6.2Creacindeunobjeto.................................................................................................................................36
6.3Manipulacindeunobjeto:utilizacindemtodosyatributos....................................................37
7.Constructores....................................................................................................................................41
7.1Conceptodeconstructor............................................................................................................................41
7.2Creacindeconstructores..........................................................................................................................42
7.3Utilizacindeconstructores........................................................................................................................43
7.4Constructoresdecopia...............................................................................................................................47
EJERCICIORESUELTO.........................................................................................................................................48
7.5Destruccindeobjetos...............................................................................................................................48
8.Introduccinalaherencia.................................................................................................................50
8.1Creacinyutilizacindeclasesheredadas.................................................................................................51
9.Empaquetadodeclases.....................................................................................................................53
9.1Jerarquadepaquetes.................................................................................................................................53
9.2Utilizacindelospaquetes.........................................................................................................................54
9.3Inclusindeunaclaseenunpaquete.........................................................................................................55
9.4Procesodecreacindeunpaquete............................................................................................................56

[PROGRAMACIN]

ProgramacindelcursodeDesarrollodeAplicacionesWeb
JosLuisComesaaCurso2011/2012

Desarrollodeclases

DAW

DesarrollodeAplicacionesWeb

Tema5

DESARROLLODECLASES
CASO PRCTICO
Tras su primer contacto con la Programacin Orientada a Objetos, Mara est muchoms
convencida de los beneficios que se pueden obtener utilizando este tipo de metodologa.
Las explicaciones de Juan y su breve experiencia con los objetos le hacen ahora ver elmundo de la
programacin desde otro punto de vista. Este nuevo mtodo de trabajo les va apermitir distribuir las
tareas de desarrollo de una manera ms eficiente y poder adaptarse acambios, correcciones y
mejoras con mucho menos esfuerzo a la hora de modificar cdigo.
Mara est convencida de que es el momento de empezar a escribir el cdigo de sus propias clases
para, acontinuacin, pasarlas a otros compaeros que las puedan usarlas. Una vez que otras
personas reciban esasclases, podrn desentenderse de cmo estn hechas por dentro (principios de
encapsulamiento y ocultacin deinformacin) y limitarse nicamente a utilizarlas a travs de sus
mtodos.
Para llevar a cabo esta labor Juan va a proseguir con las explicaciones con las que empez cuando
comenzarona trabajar con objetos e introdujo el concepto de clase:
Ha llegado el momento de empezar a desarrollar nuestras propias clases , le dice Juan.
Genial, vamos a comenzar a desarrollar la primera biblioteca de clases para BK Programacin,
no es as?
Bueno, sa es la idea. A ver si tenemos nuestro primer paquete de clases, que podramos
llamarcom.bkprogramacion.
Pues venga vamos all!

Desarrollodeclases

DAW

1.Conceptodeclase
CASO PRCTICO.
El equipo de trabajo que han formado Mara y Juan parece funcionar bastante bien. Elproyecto que
tienen entre manos para la aplicacin informtica de la clnica veterinariaempieza a tomar forma
respecto a los requisitos que el cliente necesita. Es el momento de queempiecen a pensar en los
distintos objetos con los que pueden modelar la informacin cuyotratamiento desean automatizar.
Muchos de estos objetos no van a ser proporcionados por lasbibliotecas de Java, de manera que
habr que fabricarlos, es decir, van a tener que disear eimplementar las clases (los moldes o
plantillas) que les permitirn crear los objetos quevan a necesitar. Ha llegado el momento de
enfrentarse al concepto de clase.

Comoyahasvistoenanterioresunidades,lasclasesestncompuestasporatributosymtodos.Una
claseespecificalascaractersticascomunesdeunconjuntodeobjetos.
Deestaformalosprogramasqueescribasestarnformadosporunconjuntodeclasesapartirdelas
cualesirscreandoobjetosqueseinterrelacionarnunosconotros.
Enestaunidadsevaautilizarelconceptodeobjetoascomoalgunasdelasdiversasestructuras
decontrolbsicasqueofrececualquierlenguajedeprogramacin.Todosesosconceptoshansido
explicados y utilizadosen las unidades anteriores. Si consideras que es necesario hacer un repaso
del concepto de objeto o del uso de lasestructuras de control elementales, ste es el momento de
hacerlo.

1.1Repasodelconceptodeobjeto
Desdeelcomienzodelmdulollevasutilizandoelconceptodeobjetoparadesarrollartusprogramas
deejemplo. En las unidades anteriores se ha descrito un objeto como una entidad que contiene
informacin y quees capaz de realizar ciertas operaciones con esa informacin. Segn los valores
que tenga esa informacin elobjeto tendr un estado determinado y segn las operaciones que
puedallevaracaboconesosdatossernresponsablesdeuncomportamientoconcreto.
Recuerda que entre las caractersticas fundamentales de un objeto se encontraban la identidad
(losobjetossonnicosyportantodistinguiblesentres,aunquepuedahaberobjetosexactamenteiguales),unestado
(los atributos que describen al objeto y los valores que tienen en cada momento) y un determinado
comportamiento(accionesquesepuedenrealizarsobreelobjeto).

Algunosejemplosdeobjetosquepodramosimaginarpodranser:
9 Uncochedecolorrojo,marcaSEAT,modeloToledo,delao2003.Enesteejemplotenemos
unaseriedeatributos,comoelcolor(enestecasorojo),lamarca,elmodelo,elao,etc.As
mismo tambin podramos imaginar determinadas caractersticas como la cantidad de
combustiblequelequeda,oelnmerodekilmetrosrecorridoshastaelmomento.
9 Uncochedecoloramarillo,marcaOpel,modeloAstra,delao2002.
9 Otrocochedecoloramarillo,marcaOpel,modeloAstraytambindelao2002.Setratara
deotroobjetoconlasmismaspropiedadesqueelanterior,peroseraunsegundoobjeto.
9 Uncocodrilodecuatrometrosdelongitudydeveinteaosdeedad.
9 Un crculo de radio 2 centmetros, con centro en las coordenadas (0,0) y relleno de color
amarillo.
9 Un crculo de radio 3 centmetros, con centro en las coordenadas (1,2) y relleno de color
verde.

DesarrollodeAplicacionesWeb

Tema5

Siobservaslosejemplosanteriorespodrsdistinguirsindemasiadadificultadalmenostresfamilias
deobjetosdiferentes,quenotienennadaqueverunaconotra:
9 Loscoches.
9 Loscrculos.
9 Loscocodrilos.
Es de suponer entonces que cada objeto tendr determinadas posibilidades de comportamiento
(acciones)dependiendo de la familia a la que pertenezcan. Por ejemplo, en el caso de los coches
podramosimaginaraccionescomo:arrancar,frenar,acelerar,cambiardemarcha,etc.Enelcasode
loscocodrilospodrasimaginarotrasaccionescomo:desplazarse,comer,dormir,cazar,etc.Parael
casodelcrculosepodranplantearaccionescomo:clculodelasuperficiedelcrculo,clculodela
longituddelacircunferenciaquelorodea,etc.
Por otro lado, tambin podras imaginar algunos atributos cuyos valores podran ir cambiando en
funcin de lasacciones que se realizaran sobre el objeto: ubicacin del coche (coordenadas),
velocidad instantnea, kilmetrosrecorridos, velocidad media, cantidad de combustible en el
depsito, etc. En el caso de los cocodrilos podrasimaginar otros atributos como: peso actual, el
nmerodedientesactuales(irperdiendoalgunosalolargodesuvida),elnmerodepresasqueha
cazadohastaelmomento,etc.
Comopuedesver,unobjetopuedesercualquiercosaquepuedasdescribirentrminosde
atributosyacciones.
Unobjetonoesmsquelarepresentacindecualquierentidadconcretaoabstractaquepuedas
percibir oimaginar y que pueda resultar de utilidad para modelar los elementos el entorno del
problemaquedeseasresolver.

Autoevaluacin
Tenemos un objeto bombilla, de marca ACME, que se puede encender o apagar, que
tiene una potencia de 50vatios y ha costado 3 euros. La bombilla se encuentra en este
momento apagada. A partir de esta informacin,sabras decir qu atributos y qu
acciones (comportamiento) podramos relacionar con ese objeto bombilla?
Objeto bombilla con atributos potencia (50 vatios), precio (3 euros), marca
(ACME) y estado (apagada).Las acciones que se podran ejercer sobre el objeto
seran encender y apagar.
Objeto bombilla con atributos precio (3 euros), marca (ACME) y apagado. Las
acciones que se podranejercer sobre el objeto seran encender y apagar.
Objeto bombilla con atributos precio (3 euros), marca (ACME), potencia (50
vatios) y estado (apagada).No se puede ejercer ninguna accin sobre el objeto.
Se trata de un objeto bombilla cuyas posibles acciones son encender, apagar y
arreglar. Sus atributos seran los mismos que en el primer caso

1.2Elconceptodeclase
Estclaroquedentrodeunmismoprogramatendrslaoportunidaddeencontrardecenas,cientoso
incluso miles de objetos. En algunos casos no se parecern en nada unos a otros,pero tambin
podrs observar que habr muchos que tengan un gran parecido,compartiendo un mismo
comportamiento y unos mismos atributos. Habr muchos objetosque slo se diferenciaran por los
valoresquetomanalgunosdeesosatributos.

Desarrollodeclases

DAW

Esaqudondeentraenescenaelconceptodeclase.Estclaroquenopodemosdefinirlaestructuray
el comportamiento de cada objeto cada vez que va a ser utilizado dentro de unprograma, pues la
escritura del cdigo sera una tarea interminable y redundante. La ideaes poder disponer de una
plantillaomodeloparacadaconjuntodeobjetosqueseandelmismotipo,esdecir,quetenganlos
mismosatributosyuncomportamientosimilar.

DESTACADO.
Una clase consiste en la definicin de un tipo de objeto. Se trata de una descripcin detallada de
cmo van a serlos objetos que pertenezcan a esa clase indicando qu tipo de informacin
contendrn(atributos)ycmosepodrinteractuarconellos(comportamiento).
Comoyahasvistoenunidadesanteriores,unaclaseconsisteenunplantillaenlaqueseespecifican:
9 Los atributos que van a ser comunes a todos los objetos que pertenezcan a esa clase
(informacin).
9 Losmtodosquepermiteninteractuarconesosobjetos(comportamiento).
A partir de este momento podrs hablar ya sin confusin de objetos y de clases,sabiendo que los
primerossoninstanciasconcretasdelassegundas,quenosonmsqueunaabstraccinodefinicin.
Sinosvolvemosafijarenlosejemplosdeobjetosdelapartadoanteriorpodramosobservarquelas
clasesseranloqueclasificamoscomofamiliasdeobjetos(coches,cocodrilosycrculos).
En el lenguaje cotidiano de muchos programadores puede ser habitual la confusin entre los
trminos clase yobjeto. Aunque normalmente el contexto nos permite distinguir si nos estamos
refiriendorealmenteaunaclase(definicin abstracta)oaunobjeto(instancia concreta),hayquetener
cuidadoconsuusoparanodarlugarainterpretacioneserrneas,especialmenteduranteelproceso
deaprendizaje.

AUTOEVALUACIN.
Un objeto y una clase en realidad hacen referencia al mismo concepto. Podra decirse
que son sinnimos.
Verdadero
Falso

DesarrollodeAplicacionesWeb

Tema5

2.Estructuraymiembrosdeunaclase
CASO PRCTICO
Mara empieza a tener bastante ms claro en qu consiste una clase y cul es ladiferencia respecto a
un objeto. Es el momento de empezar a crear en Java algunasde las clases que han estado
pensando que podran ser tiles para su aplicacin. Paraello es necesario saber cmo se declara una
clase en un lenguaje de programacindeterminado. Los becarios Ana y Carlos intuyen que van a
comenzar a ver cmoest hecha una clase por dentro. Parece ser que es el momento de empezar a
tomar notas:
De acuerdo, ya hemos diseado algunas de las clases que queremos para nuestra aplicacin.
Pero, cmoescribimos eso en Java? Cmo declaramos o definimos una clase en Java? Qu
palabras reservadas hay queutilizar? Qu partes tiene esa definicin? pregunta Mara con
inters.
Bien, es el momento de ver cmo es la estructura de una clase y cmo podemos escribirla en Java
para luegopoder fabricar objetos que pertenezcan a esa clase. Le responde Juan.

Comoyahasvistoenanterioresunidades,lasclasesestncompuestasporatributosymtodos.Una
claseespecificalascaractersticascomunesdeunconjuntodeobjetos.Deestaformalosprogramas
queescribasestarnformadosporunconjuntodeclasesapartirdelascualesirscreandoobjetos
queseinterrelacionarnunosconotros.
Enestaunidadsevaautilizarelconceptodeobjetoascomoalgunasdelasdiversasestructuras
decontrolbsicasqueofrececualquierlenguajedeprogramacin.Todosesosconceptoshansido
explicados y utilizadosen las unidades anteriores. Si consideras que es necesario hacer un repaso
del concepto de objeto o del uso de lasestructuras de control elementales, ste es el momento de
hacerlo.

EnunidadesanterioresyaseindicqueparadeclararunaclaseenJavaseusalapalabrareservada
class.Enladeclaracindeunaclasevasaencontrar:
9 Cabeceradelaclase.Compuestaporunaseriedemodificadoresdeacceso,lapalabrareservada
classyelnombredelaclase.
9 Cuerpodelaclase.Enlseespecificanlosdistintosmiembrosdelaclase:atributosymtodos.
Esdecir,elcontenidodelaclase.

Comopuedesobservar,elcuerpodelaclaseesdondese
declaranlosatributosquecaracterizanalosobjetosdela
clase y donde se define e implementa el
comportamiento de dichos objetos; es decir, donde se
declaraneimplementanlosmtodos.

AUTOEVALUACIN.
Toda definicin de una clase consta de cabecera y cuerpo. En la cabecera se definen los
atributos de los objetosque se crearn a partir de esa clase y en el cuerpo estarn
definidos los distintos mtodos disponibles paramanipular esos objetos.
Verdadero

Falso

Desarrollodeclases

DAW

2.1Declaracindeunaclase.
LadeclaracindeunaclaseenJavatienelasiguienteestructurageneral:
[modificadores] class <NombreClase> [herencia] [interfaces] { // Cabecera de la clase
// Cuerpo de la clase
Declaracin de los atributos
Declaracin de los mtodos
}

Unejemplobsicoperocompletopodraser:
/**
*
* Ejemplo de clase Punto
*/
class Punto {
// Atributos
int x,y;
// Mtodos
int obtenerX () { return x; }
int obtenerY() {return y;}
void establecerX (int vx) { x= vx; };
void establecerY (int vy) { y= vy; };
}

Enestecasosetratadeunaclasemuysencillaenlaqueelcuerpodelaclase(elreaentrelasllaves)
contieneelcdigoylasdeclaracionesnecesariasparaquelosobjetosqueseconstruyan(basndose
en esta clase) puedanfuncionar apropiadamente en un programa (declaraciones de atributos para
contener el estado del objeto ymtodos que implementen el comportamiento de la clase y los
objetoscreadosapartirdeella).
Si te fijas en los distintos programas que se han desarrollado en los ejemplos de las unidades
anteriores, podrsobservar que cada uno de esos programas era en s mismo una clase Java: se
declarabanconlapalabrareservadaclassycontenanalgunosatributos(variables)ascomoalgunos
mtodos(comomnimoelmtodomain).
Enelejemploanteriorhemosvistolomnimoquesetienequeindicarenlacabeceradeunaclase(el
nombrede la clase y la palabra reservada class). Se puede proporcionar bastante ms informacin
mediantemodificadoresyotrosindicadorescomoporejemploelnombredesusuperclase(siesque
esa clase hereda deotra), si implementa algn interfaz y algunas cosas ms que irs aprendiendo
pocoapoco.
A la hora de implementar una clase Java (escribirla en un archivo con un editor de textos o con
algunaherramientaintegradacomoporejemploNetbeansoEclipse)debestenerencuenta:
9 Porconvenio,sehadecididoqueenlenguajeJavalosnombresdelasclasesdebendeempezar
por una letra mayscula. As, cada vez que observes en el cdigo una palabra con la primera
letra en mayscula sabrs que se trata de una clase sin necesidad de tener que buscar su
declaracin.Adems,sielnombredelaclaseestformadoporvariaspalabras,cadaunade
ellas tambin tendr su primera letra en mayscula. Siguiendo esta recomendacin, algunos
ejemplos de nombres de clases podran ser: Recta, Circulo, Coche, CocheDeportivo, Jugador,
JugadorFutbol,AnimalMarino,AnimalAcuatico,etc.

DesarrollodeAplicacionesWeb

Tema5

9 ElarchivoenelqueseencuentraunaclaseJavadebetenerelmismonombrequeesaclasesi
queremos poder utilizarla desde otras clases que se encuentren fuera de ese archivo (clase
principaldelarchivo).
9 Tantoladefinicincomolaimplementacindeunaclaseseincluyeenelmismoarchivo(archivo
.java). En otros lenguajes como por ejemplo C++, definicin e implementacin podran ir en
archivosseparados(porejemploenC++,seransendosarchivosconextensiones.hy.cpp).

PARASABERMS.
Siquieresampliarunpocomssobreestetemapuedesecharunvistazoalostutorialesde
iniciacindeJavaenelsitiowebdeOracle(eningls):
http://download.oracle.com/javase/tutorial/java/javaOO/classes.html

2.2Cabeceradeunaclase.
Engeneral,ladeclaracindeunaclasepuedeincluirlossiguienteselementosyenelsiguienteorden:
1. Modificadorestalescomopublic,abstractofinal.
2. Elnombredelaclase(conlaprimeraletradecadapalabraenmaysculas,porconvenio).
3. El nombre de su clase padre (superclase), si es que se especifica, precedido por la palabra
reservadaextends(extiendeoheredade).
4. Unalistaseparadaporcomasdeinterfacesquesonimplementadasporlaclase,precedidapor
lapalabrareservadaimplements(implementa).
5. Elcuerpodelaclase,encerradoentrellaves{}.
Lasintaxiscompletadeunacabecera(loscuatroprimerospuntos)quedadelaforma:
[modificadores]
class
<NombreClase>
<NombreInterface1>]
[[implements<NombreInterface2>] ] {

[extends

<NombreSuperClase>][implements

EnelejemploanteriordelaclasePuntotenamoslasiguientecabecera:
class Punto {

Enestecasonohaymodificadores,niindicadoresdeherencia,niimplementacindeinterfaces.Tan
sololapalabrareservadaclassyelnombredelaclase.Eslomnimoquepuedehaberenlacabecera
deunaclase.
Laherenciaylasinterfaceslasversmsadelante.Vamosaverahoraculessonlosmodificadores
quesepuedenindicaralcrearlaclaseyquefectostienen.Losmodificadoresdeclaseson:
[public] [final | abstract]

Veamosqusignificadotienecadaunodeellos:
9 Modificador public.Indicaquelaclaseesvisible(sepuedencrearobjetosdeesaclase)desde
cualquierotraclase.Esdecir,desdecualquierotrapartedelprograma.Sinoseespecificaeste
modificador, la clase slo podr ser utilizada desde clases que estn en el mismo paquete. El
concepto de paquete lo veremos ms adelante. Slo puede haber una clase public (clase
principal)enunarchivo.java.Elrestodeclasesquesedefinanenesearchivonosernpblicas.
9 Modificadorabstract.Indicaquelaclaseesabstracta.Unaclaseabstractanoesinstanciable.Es
decir,noesposiblecrearobjetosdeesaclase(habrqueutilizarclasesqueheredendeella).En
este momento es posible que te parezca que no tenga sentido que esto pueda suceder (si no

Desarrollodeclases

DAW

puedescrearobjetosdeesaclase,paraqulaquieres?),peropuederesultartilalahorade
crear una jerarqua de clases. Esto lo vers tambin ms adelante al estudiar el concepto de
herencia.
9 Modificador final. Indica que no podrs crear clases que hereden de ella. Tambin volvers a
este modificador cuando estudies el concepto de herencia. Los modificadores final y abstract
sonexcluyentes(slosepuedeutilizarunodeellos).
Todos estos modificadores y palabras reservadas las iremos viendo poco a poco, as que no te
preocupesdemasiadoporintentarentendertodasellasenestemomento.
EnelejemploanteriordelaclasePuntotendramosunaclasequeseraslovisible(utilizable)desde
elmismopaqueteenelqueseencuentralaclase(modificadordeaccesoporomisinodepaquete,o
package). Desdefuera de ese paquete no sera visible o accesible. Para poder utilizarla desde
cualquierpartedelcdigodelprogramabastaraconaadirelatributopublic:publicclassPunto.

AUTOEVALUACIN.
Si queremos poder instanciar objetos de una clase X desde cualquier parte de un
programa, qu modificador omodificadores habr que utilizar en su declaracin?
private
public
abstract
Ninguno de los anteriores

2.3Cuerpodeunaclase.
Como ya has visto anteriormente, el cuerpo de una clase se encuentra encerrado entrellaves y
contieneladeclaracineimplementacindesusmiembros.Losmiembrosdeunaclasepuedenser:
9 Atributos,queespecificanlosdatosquepodrcontenerunobjetodelaclase.
9 Mtodos,queimplementanlasaccionesquesepodrnrealizarconunobjetodelaclase.
Una clase puede no contener en su declaracin atributos o mtodos, pero debe de contener al
menosunodelosdos(laclasenopuedeservaca).
EnelejemploanteriordondesedefinaunaclasePunto,tendramoslossiguientesatributos:
9 Atributox,detipoint.
9 Atributoy,detipoint.
Esdecir,dosvaloresdetipoentero.CualquierobjetodelaclasePuntoqueseacreadoalmacenar
ensuinteriordosnmerosenteros(xey).CadaobjetodiferentedelaclasePuntocontendrsendos
valoresxey,quepodrncoincidironoconelcontenidodeotrosobjetosdeesamismaclasePunto.
Porejemplo,sisehandeclaradovariosobjetosdetipoPunto:
Punto p1, p2, p3;

Sabremosquecadaunodeesosobjetosp1,p2yp3contendrnunpardecoordenadas(x,y)que
definen elestadodeeseobjeto.Puede queesosvalorescoincidanconlosdeotrosobjetosdetipo

10

DesarrollodeAplicacionesWeb

Tema5

Punto,opuedequeno,peroencualquiercasosernobjetosdiferentescreadosapartirdelmismo
molde(delamismaclase).
Porotrolado,laclasePuntotambindefinaunaseriedemtodos:
9
9
9
9

intobtenerX(){returnx;}
intobtenerY(){returny;}
voidestablecerX(intvx){x=vx;};
voidestablecerY(intvy){y=vy;};

Cada uno de esos mtodos puede ser llamado desde cualquier objeto que sea una instancia de la
clasePunto.Setratadeoperacionesquepermitenmanipularlosdatos(atributos)contenidosenel
objetobienparacalcularotrosdatosobienparamodificarlospropiosatributos.

AUTOEVALUACIN.
Si disponemos de varios objetos que han sido creados a partir de la misma definicin de
clase, en realidadtendremos un nico objeto, pues hacen referencia a un mismo tipo de
clase (plantilla).
Verdadero

Falso

2.4Miembrosestticosodeclase.
Cada vez que se produce una instancia de una clase (es decir, se crea un objeto de esa clase), se
desencadenanuna serie de procesos (construccin del objeto) que dan lugar a la creacin en
memoriadeunespaciofsicoqueconstituirelobjetocreado.Deestamaneracadaobjetotendrsus
propiosmiembrosaimagenysemejanzadelaplantillapropuestaporlaclase.
Por otro lado, podrs encontrarte con ocasiones en las que determinados miembrosde la clase
(atributos o mtodos) no tienen demasiado sentido como partes del objeto,sino ms bien como
partesdelaclaseens(partesdelaplantilla,peronodecadainstanciadeesaplantilla).Porejemplo,
si creamos una clase Coche y quisiramosdisponer de un atributo con el nombre de la clase (un
atributo de tipo String con lacadena Coche), no tiene mucho sentido replicar ese atributo para
todos los objetosde la clase Coche, pues para todos va a tener siempre el mismo valor (la
cadenaCoche).Esms,eseatributopuedetenersentidoyexistenciaalmargendelaexistenciade
cualquier objeto detipo Coche. Podra no haberse creado ningn objeto de la clase Coche y sin
embargoseguirateniendosentidopoderaccederaeseatributodenombredelaclase,puessetrata
en efecto de un atributo de la propia clase msque de un atributo de cada objeto instancia de la
clase.
ParapoderdefinirmiembrosestticosenJavaseutilizaelmodificadorstatic.Losmiembros(tanto
atributoscomo mtodos) declarados utilizando este modificador son conocidos como miembros
estticosomiembrosdeclase.Acontinuacinvasaestudiarlacreacinyutilizacindeatributosy
mtodos.Encadacasoverscmodeclararyusaratributosestticosymtodosestticos.

11

Desarrollodeclases

DAW

3.Atributos
CASO PRCTICO.
Mara est entusiasmada con las posibilidades que le ofrece el concepto de clase para podercrear
cualquier tipo de objeto que a ella se le ocurra. Ya ha aprendido cmo declarar lacabecera de una
clase en Java y ha estado probando con algunos de los ejemplos que le haproporcionado Juan.
Entiende ms o menos cmo funcionan algunos de los modificadores dela clase, pero ha visto que el
cuerpo es algo ms complejo: ya no se trata de una simple lneade cdigo como en el caso de la
cabecera. Ahora tiene un conjunto de lneas de cdigo queparecen hasta cierto punto un programa en
pequeo. Puede encontrarse con declaraciones devariables, estructuras de control, realizacin de
clculos, etc.
Lo primero que Mara ha observado es que al principio suele haber algunas declaraciones de
variables:
Estas declaraciones de variables son lo que hemos llamado atributos? le pregunta a Juan.
As es contesta Ada, que en ese momento acaba de entrar por la puerta con Ana y con Carlos.
Ahora que estis todos juntos, creo que ha llegado el momento que os explique algunas cosas
acerca delos miembros de una clase. Vamos a empezar por los atributos.

Losatributosconstituyenlaestructurainternadelosobjetosdeunaclase.Setratadelconjuntode
datosquelosobjetosdeunadeterminadaclasealmacenancuandosoncreados.Esdecirescomosi
fueran variables cuyombito de existencia es el objeto dentro del cual han sido creadas. Fuera del
objetoesasvariablesnotienensentidoysielobjetodejadeexistir,esasvariablestambindeberan
hacerlo (proceso de destruccin del objeto).Los atributos a veces tambin son conocidos con el
nombredevariablesmiembroovariablesdeobjeto.
Los atributos pueden ser de cualquier tipo de los que
pueda ser cualquier otra variable en un programa en
Java:desde tipos elementales como int, boolean o float
hastatiposreferenciadoscomoarrays,Stringsuobjetos.
Adems del tipo y del nombre, la declaracin de un
atributo
puede
contener
tambin
algunos
modificadores(como por ejemplo public, private,
protected o static). Por ejemplo, en el caso de la clase
Punto que habamosdefinido en el aparado anterior
podrashaberdeclaradosusatributoscomo:
public int x;
public int y;

De esta manera estaras indicando que ambos atributos son pblicos, es decir, accesibles por
cualquierpartedelcdigoprogramaquetengaaccesoaunobjetodeesaclase.
Comoyaversmsadelantealestudiarelconceptodeencapsulacin,lonormalesdeclarartodos
losatributos(oalmenoslamayora)comoprivados(private) demaneraquesisedeseaaccedero
manipularalgnatributosetengaquehaceratravsdelosmtodosproporcionadosporlaclase.

AUTOEVALUACIN.
Dado que normalmente se pretende encapsular el contenido de un objeto en su interior y
permitir el acceso a susatributos nicamente a travs de los mtodos, los atributos de
una clase suelen declararse con el modificadorpublic.
Verdadero
Falso

12

DesarrollodeAplicacionesWeb

Tema5

3.1Declaracindeatributos.
Lasintaxisgeneralparaladeclaracindeunatributoenelinteriordeunaclasees:
[modificadores] <tipo><nombreAtributo>;

Ejemplos:
int x;
public int elementoX, elementoY;
private int x, y, z;
static double descuentoGeneral;
final bool casado;

Tesuenabastante,verdad?Ladeclaracindelosatributosenunaclaseesexactamenteigualala
declaracinde cualquier variable tal y como has estudiado en las unidades anteriores y similar a
como se hace en cualquierlenguaje de programacin. Es decir mediante la indicacin del tipo y a
continuacinelnombredelatributo,pudindosedeclararvariosatributosdelmismotipomediante
una lista de nombres de atributos separada porcomas (exactamente como ya has estudiado al
declararvariables).
Ladeclaracindeunatributo(ovariablemiembroovariabledeobjeto)consisteenladeclaracin
deunavariablequenicamenteexisteenelinteriordelobjetoyportantosuvidacomenzarcuando
elobjetocomienceaexistir(elobjetoseacreado).Estosignificaquecadavezquesecreeunobjeto
secrearntantasvariablescomoatributoscontengaeseobjetoensuinterior(definidasenlaclase,
queeslaplantillaomoldedelobjeto).Todasesasvariablesestarnencapsuladasdentrodelobjeto
yslotendrnsentidodentrodel.
EnelejemploqueestamosutilizandodeobjetosdetipoPunto(instanciasdelaclasePunto),cada
vez que secree un nuevo Punto p1, se crearn sendos atributos x, y de tipo int que estarn en el
interiordeesepuntop1.
SiacontinuacinsecreaunnuevoobjetoPuntop2,secrearnotrosdosnuevosatributosx,yde
tipointqueestarnestavezalojadosenelinteriordep2.Yassucesivamente
Dentrodeladeclaracindeunatributopuedesencontrartrespartes:
9 Modificadores. Son palabras reservadas que permiten modificar la utilizacin del atributo
(indicarelcontroldeacceso,sielatributoesconstante,sisetratadeunatributodeclase,etc.).
Losiremosviendounoauno.
9 Tipo.Indicaeltipodelatributo.Puedetratarsedeuntipoprimitivo(int,char,bool,double)o
biendeunoreferenciado(objeto,array,etc.).
9 Nombre. Identificador nico para el nombre del atributo. Por convenio se suelen utilizar las
minsculas.Encasodequesetratedeunidentificadorquecontengavariaspalabras,apartir
de la segunda palabra se suele poner la letra de cada palabra en maysculas. Por ejemplo:
primerValor, valor, puertaIzquierda, cuartoTrasero, equipoVecendor, sumaTotal,
nombreCandidatoFinal,etc.CualquieridentificadorvlidodeJavaseradmitidocomonombre
deatributovlido,peroesimportanteseguiresteconvenioparafacilitarlalegibilidaddelcdigo
(todoslosprogramadoresdeJavaloutilizan).
Como puedes observar, los atributos de una clase tambin pueden contener modificadores en su
declaracin(como suceda al declarar la propia clase). Estos modificadores permiten indicar cierto

13

Desarrollodeclases

DAW

comportamiento de unatributo a la hora de utilizarlo. Entre los modificadores de un atributo


podemosdistinguir:
9 Modificadores de acceso. Indican la forma de acceso al atributo desde otra clase. Son
modificadoresexcluyentesentres.Slosepuedeponeruno.
9 Modificadoresdecontenido.Nosonexcluyentes.Puedenaparecervariosalavez.
9 Otrosmodificadores: transientyvolatile.Elprimeroseutiliza paraindicarqueunatributoes
transitorio (no persistente) y el segundo es para indicar al compilador que no debe realizar
optimizaciones sobre esa variable. Es ms que probable que no necesites utilizarlos en este
mdulo.
Aqutieneslasintaxiscompletadeladeclaracindeunatributoteniendoencuentalalistadetodos
losmodificadoreseindicandoculessonincompatiblesunosconotros:
[private | protected | public] [static] [final] [transient] [volatile] <tipo><nombreAtributo>;

Vamosaestudiarcondetallecadaunodeellos.

3.2Modificadoresdeacceso.
LosmodificadoresdeaccesodisponiblesenJavaparaunatributoson:
9 Modificadordeaccesoporomisin(odepaquete).Sinoseindicaningnmodificadordeacceso
enla declaracin del atributo, se utilizar este tipo de acceso. Se permitir el acceso a este
atributodesdetodaslasclasesqueestndentrodelmismopaquete(package)queestaclase(la
que contiene elatributo que se est declarando). No es necesario escribir ninguna palabra
reservada.Sinoseponenadasesuponesedeseaindicarestemododeacceso.
9 Modificador de acceso public. Indica que cualquier clase (por muy ajena o lejana que sea)
tieneaccesoaeseatributo.Noesmuyhabitualdeclararatributospblicos(public).
9 Modificadordeaccesoprivate.Indicaqueslosepuedeaccederalatributodesdedentrodela
propiaclase.Elatributoestarocultoparacualquierotrazonadecdigofueradelaclaseenla
queestdeclaradoelatributo.Esloopuestoaloquepermitepublic.
9 Modificadordeaccesoprotected.Enestecasosepermitiraccederalatributodesdecualquier
subclase (lo vers msadelante al estudiar la herencia) de la clase en la que se
encuentredeclaradoelatributo,ytambindesdelasclasesdelmismopaquete.
Acontinuacinpuedesobservarunresumendelosdistintosnivelesaccesibilidadquepermitecada
modificador:

Sinmodificador(paquete)
public
private
protected

Mismaclase

Subclase

Mismopaquete

Otropaquete

Recuerdaquelosmodificadoresdeaccesosonexcluyentes!Slosepuedeutilizarunodeellosen
ladeclaracindeunatributo.

EJERCICIORESUELTO.

14

DesarrollodeAplicacionesWeb

Tema5

Imagina que quieres escribir una clase que represente un rectngulo en el plano. Para ello has
pensadoenlossiguientesatributos:
9 Atributosx1,y1,querepresentanlacoordenadasdelvrticeinferiorizquierdodelrectngulo.
Ambosdetipodouble(nmerosreales).
9 Atributosx2,y2,querepresentanlascoordenadasdelvrticesuperiorderechodelrectngulo.
Tambindetipodouble(nmerosreales).
Conestosdospuntos(x1,y1)y(x2,y2)sepuededefinirperfectamentelaubicacindeunrectngulo
enelplano.
Escribeunaclasequecontengatodosesosatributosteniendoencuentaquequeremosqueseauna
clasevisibledesdecualquierpartedel programay quesusatributosseantambinaccesiblesdesde
cualquierpartedelcdigo.
Respuesta:

Dadoquesetratadeunaclasequepodrusarsedesdecualquierpartedelprograma,utilizaremosel
modificadordeaccesopublicparalaclase:
public class Rectangulo

Los cuatro atributos que necesitamos tambin han de ser visibles desde cualquier parte, as que
tambinseutilizarelmodificadordeaccesopublicparalosatributos:
public double x1, y1; // Vrtice inferior izquierdo
public double x2, y2; // Vrtice superior derecho

Deestamaneralaclasecompletaquedara:
public class Rectangulo {
public double x1, y1; // Vrtice inferior izquierdo
public double x2, y2; // Vrtice superior derecho
}

3.3Modificadoresdecontenido.
Los modificadores de contenido no son excluyentes (pueden aparecer varios para un mismo
atributo).Sonlossiguientes:
9 Modificadorstatic.Hacequeelatributoseacomnparatodoslosobjetosdeunamismaclase.
Esdecir, todas las clases compartirn ese mismo atributo con el mismo valor. Es un caso de
miembroesttico o miembro de clase: un atributo esttico o atributo de clase o variable de
clase.
9 Modificadorfinal.Indicaqueelatributoesunaconstante.Suvalornopodrsermodificadoalo
largodelavidadelobjeto.Porconvenio,elnombredelosatributosconstantes(final)seescribe
contodaslasletrasenmaysculas.
Enelsiguienteapartadosobreatributosestticosversunejemplocompletodeunatributoesttico
(static).Veamosahoraunejemplodeatributoconstante(final).
Imagina que ests diseando un conjunto de clases para trabajar con expresionesgeomtricas
(figuras, superficies, volmenes, etc.) y necesitas utilizar muy a menudo laconstante pi con
abundantescifrassignificativas,porejemplo,3.14159265.Utilizaresaconstanteliteralmuyamenudo
puede resultar tedioso adems de poco operativo (imaginaque el futuro hubiera que cambiar la

15

Desarrollodeclases

DAW

cantidaddecifrassignificativas).Laideaesdeclararlaunasolavez,asociarleunnombresimblico(un
identificador) y utilizar eseidentificador cada vez que se necesite la constante. En tal caso puede
resultar muy tildeclarar un atributo final con el valor 3.14159265 dentro de la clase en la que se
considereoportunoutilizarla.Elmejoridentificadorquepodrasutilizarparaellaserprobablemente
elpropionombredelaconstante(yenmaysculas,paraseguirelconveniodenombres),esdecir,PI.
Aspodraquedarladeclaracindelatributo:
class claseGeometria {
// Declaracin de constantes
public final float PI= 3.14159265;

AUTOEVALUACIN.
Con qu modificador puede indicarse en Java que un atributo es constante?
Con el modificador constant.
Con el modificador starter.
Con el modificador final.
Con el modificador static.

3.4Atributosestticos.
Como ya has visto, el modificador static hace que el
atributoseacomn(elmismo)paratodoslosobjetosde
una mismaclase. En este caso s podra decirse que la
existencia delatributo no depende de la existencia del
objeto,sinodelapropiaclaseyportantoslohabruno,
independientementedel nmero de objetos que se
creen. El atributo ser siempre elmismo para todos los
objetos y tendr un valor nicoindependientemente de
cada objeto. Es ms, aunque no existaningn objeto de
esa clase, el atributo s existir y podrcontener un valor (pues se trata de un atributo de la clase
msquedelobjeto).
Unodelosejemplosmshabituales(ysencillos)deatributosestticosodeclaseeseldeuncontador
que indica el nmerode objetos de esa clase que se han ido creando. Por ejemplo, en la clase de
ejemploPuntopodrasincluirunatributoquefueraesecontadorparallevarunregistrodelnmero
deobjetosdelaclasePuntoquesevanconstruyendodurantelaejecucindelprograma.
Otro ejemplo de atributo esttico (y en este caso tambin constante) que tambin se ha
mencionadoanteriormentealhablardemiembrosestticoseradisponerdeunatributonombre,que
contuvieraunStringconelnombredelaclase.Nuevamenteeseatributoslotienesentidoparala
clase,pueshabrdesercompartidoportodoslosobjetosqueseandeesaclase(eselnombredela
clasealaquepertenecenlosobjetosyportantosiempreserlamismaeigualparatodos,notiene
sentidoquecadaobjetodetipoPuntoalmaceneensuinteriorelnombredelaclase,esolodebera
hacerlapropiaclase).
class Punto {
// Coordenadas del punto

16

DesarrollodeAplicacionesWeb

Tema5

private int x, y;
// Atributos de clase: cantidad de puntos creados hasta el momento
public static cantidadPuntos;
public static final nombre;

Obviamente, para que esto funcione como ests pensando, tambin habr que escribir el cdigo
necesario paraque cada vez que se cree un objeto de la clase Punto se incremente el valor del
atributocantidadPuntos.
Volversaesteejemploparaimplementaresaotrapartecuandoestudieslosconstructores.
EJERCICIORESUELTO.
Ampliarelejercicioanteriordelrectnguloincluyendolossiguientesatributos:
9 AtributonumRectangulos,quealmacenaelnmerodeobjetosdetiporectngulocreadoshasta
elmomento.
9 Atributonombre,quealmacenaelnombrequeselequieradaracadarectngulo.
9 AtributonombreFigura,quealmacenaelnombredelaclase,esdecir,Rectngulo.
9 Atributo PI, que contiene el nombre de la constante PI con una precisin de cuatro cifras
decimales.
NosedeseaquelosatributosnombreynumRectangulospuedanservisiblesdesdefueradelaclase.
Yademssedeseaquelaclaseseaaccesiblesolamentedesdesupropiopaquete.
Respuesta:

Los atributos numRectangulos, nombreFigura y PI podran ser estticos pues se trata de valores
msasociadosalapropiaclasequeacadaunodelosobjetosquesepuedanircreando.Adems,en
elcasodePIynombreFigura,tambinpodraserunatributofinal,puessetratadevaloresnicosy
constantes(3.1416enelcasodePIyRectnguloenelcasodenombreFigura).
Dadoquenosedeseaquesetengaaccesibilidada losatributosnombreynumRectangulosdesde
fueradelaclasepodrautilizarseelatributoprivateparacadaunodeellos.
Porltimohayquetenerencuentaquesedeseaquelaclasesloseaaccesibledesdeelinteriordel
paquetealquepertenece,portantohabrqueutilizarelmodificadorporomisinodepaquete.Esto
es,noincluirningnmodificadordeaccesoenlacabeceradelaclase.
Teniendoencuentatodoloanteriorlaclasepodraquedarfinalmenteas:
class Rectangulo { // Sin modificador public para que slo sea accesible desde el paquete
// Atributos de clase
private static int numRectangulos; // Nmero total de rectngulos creados
public static final String nombreFigura= Rectngulo; // Nombre de la clase
public static final double PI= 3.1416; // Constante PI
// Atributos de objeto
private String nombre; // Nombre del rectngulo
public double x1, y1; // Vrtice inferior izquierdo
public double x2, y2; // Vrtice superior derecho
}

17

Desarrollodeclases

DAW

4.Mtodos
CASO PRCTICO.
Mara ya ha estado utilizando mtodos para poder manipular algunos de los objetosque han creado
en programas bsicos de prueba. En el proyecto de la ClnicaVeterinaria en el que est trabajando
junto con Juan van a tener que crear bastantestipos de objetos (clases) que representen el sistema
de informacin que quierenmodelar y automatizar. Ya han pensado y definido muchos de los atributos
que van atener esas clases. Ahora necesitan empezar a definir qu tipos de acciones se van apoder
realizar sobre la informacin que contenga cada clase o familia de objetos:
Ya tengo pensadas algunas de las acciones que van a ser necesarias para manipular algunas de
las clases quehemos planteado Le dice Mara a Juan.
Muy bien. Entonces es el momento de empezar a definir mtodos.
Perfecto. Y cmo lo hacemos? Cuando hemos utilizado objetos de clases ya incorporadas en el
lenguaje,simplemente he utilizado sus mtodos, pero an no he declarado ninguno.
No te preocupes, vamos a ver algunos ejemplos de declaracin, implementacin y utilizacin de
mtodos deuna clase. Vers cmo es mucho ms sencillo de lo que piensas.

Como ya has visto anteriormente, los mtodos son las herramientas que nos sirven paradefinir el
comportamientodeunobjetoensusinteraccionesconotrosobjetos.Formanpartedelaestructura
internadelobjetojuntoconlosatributos.
Enelprocesodedeclaracindeunaclasequeestsestudiandoyahasvistocmoescribirlacabecera
delaclaseycmoespecificarsusatributosdentrodelcuerpodelaclase.Tansolofaltayadeclararlos
mtodos,queestarntambinenelinteriordelcuerpodelaclasejuntoconlosatributos.
Los mtodos suelen declararse despus de los atributos. Aunque atributos y mtodos pueden
aparecermezcladosportodoelinteriordelcuerpodelaclaseesaconsejablenohacerloparamejorar
laclaridadylalegibilidaddelcdigo.Deesemodo,cuandoechemosunvistazorpidoalcontenido
deuna clase, podremos ver rpidamente los atributos al principio (normalmente ocuparn menos
lneasdecdigoysernfcilesdereconocer)ycadaunodelosmtodosinmediatamentedespus.
Cadamtodo puede ocupar un nmero de lneas de cdigo ms o menos grande en funcin de
lacomplejidaddelprocesoquepretendaimplementar.
Los mtodos representan la interfaz de una clase. Son la forma que tienen otros objetos de
comunicarse con unobjeto determinado solicitndole cierta informacin o pidindole que lleve a
cabo una determinada accin. Estemodo de programar, como ya has visto en unidades anteriores,
facilitamucholatareaaldesarrolladordeaplicaciones,pueslepermiteabstraersedelcontenidode
lasclaseshaciendousonicamentedelinterfaz(mtodos).

AUTOEVALUACIN.
Qu elementos forman la interfaz de un objeto?
Los atributos del objeto.
Las variables locales de los mtodos del objeto.
Los mtodos.
Los atributos estticos de la clase.

4.1Declaracindeunmtodo.
Ladefinicindeunmtodosecomponededospartes:
9 Cabecera del mtodo, que contiene el nombre del mtodo junto con el tipo devuelto, un
conjuntodeposiblesmodificadoresyunalistadeparmetros.

18

DesarrollodeAplicacionesWeb

Tema5

9 Cuerpo del mtodo, que contiene las sentencias que implementan el comportamiento del
mtodo(incluidasposiblessentenciasdedeclaracindevariableslocales).
Loselementosmnimosquedebenaparecerenladeclaracindeunmtodoson:
9
9
9
9

Eltipodevueltoporelmtodo.
Elnombredelmtodo.
Losparntesis.
Elcuerpodelmtodoentrellaves:{}.

Por ejemplo, en la clase Punto que se ha estado utilizando en los apartados anteriores podras
encontrarelsiguientemtodo:
int obtenerX ()
{
// Cuerpo del mtodo

Donde:
9
9
9
9

Eltipodevueltoporelmtodoesint.
ElnombredelmtodoesobtenerX.
Norecibeningnparmetro:apareceunalistavacaentreparntesis:().
Elcuerpodelmtodoestodoelcdigoquehabraenceradoentrellaves:{}.
Dentro del cuerpo del mtodo podrs encontrar
declaraciones de variables, sentencias y todo tipo de
estructurasde control (bucles, condiciones, etc.) que has
estudiadoenlosapartadosanteriores.
Ahora bien, la declaracin de un mtodo puede incluir
algunoselementosms.Vamosaestudiarcondetallecada
unodeellos.

4.2Cabecerademtodo.
Ladeclaracindeunmtodopuedeincluirlossiguienteselementos:
1. Modificadores (como por ejemplo los ya vistos public o private, ms algunos otros que irs
conociendopocoapoco).Noesobligatorioincluirmodificadoresenladeclaracin.
2. Eltipodevuelto(otipoderetorno),queconsisteeneltipodedato(primitivooreferencia)que
el mtodo devuelve tras ser ejecutado. Si eliges void como tipo devuelto, el mtodo no
devolverningnvalor.
3. Elnombredelmtodo,aplicndoseparalosnombreselmismoconvenioqueparalosatributos.
4. Unalistadeparmetrosseparadosporcomasyentreparntesisdondecadaparmetrodebeir
precedido por su tipo. Si el mtodo no tiene parmetros la lista estar vaca y nicamente
aparecernlosparntesis.
5. Una lista de excepciones que el mtodo puede lanzar. Se utiliza la palabra reservada throws
seguidadeunalistadenombresdeexcepcionesseparadasporcomas.Noesobligatorioqueun
mtodoincluyaunalistadeexcepciones,aunquemuchasvecesserconveniente.Enunidades

19

Desarrollodeclases

DAW

anterioresyahastrabajadoconelconceptodeexcepcinymsadelantevolversahaceruso
deellas.
6. Elcuerpodelmtodo,encerradoentrellaves.Elcuerpocontendrelcdigodelmtodo (una
lista sentencias y estructuras de control en lenguaje Java) as como la posible declaracin de
variableslocales.
Lasintaxisgeneraldelacabeceradeunmtodopodraentoncesquedaras:
[private | protected | public] [static] [abstract] [final] [native] [synchronized]
<tipo><nombreMtodo> ( [<lista_parametros>] )
[throws<lista_excepciones>]

Como sucede con todos los identificadores en Java


(variables, clases,objetos, mtodos, etc.), puede usarse
cualquier identificador que cumplalas normas. Ahora
bien, para mejorar la legibilidad del cdigo, se
haestablecido el siguiente convenio para nombrar los
mtodos: utilizar unverbo en minscula o bien un
nombre formado por varias palabrasque comience por
unverboenminscula,seguidoporadjetivos,nombres,
etc.loscualessaparecernenmaysculas.
Algunosejemplosdemtodosquesiguenesteconveniopodranser:ejecutar,romper,mover,subir,
responder,obtenerX, establecerValor, estaVacio, estaLleno, moverFicha, subirPalanca,
responderRapido,girarRuedaIzquierda,abrirPuertaDelantera,CambiarMarcha,etc.
EnelejemplodelaclasePunto,puedesobservarcmolosmtodosobtenerXyobtenerYsiguenel
conveniodenombresparalosmtodos,devuelvenenamboscasosuntipoint,sulistadeparmetros
esvaca(notienenparmetros)ynolanzanningntipodeexcepcin:
9 intobtenerX()
9 intobtenerY()

AUTOEVALUACIN.
Con cul de los siguientes modificadores no puede ser declarado un mtodo en Java?
private.
extern.
static.
public.

4.3Modificadoresenladeclaracindeunmtodo.
Enla declaracindeunmtodotambinpuedenaparecermodificadores(comoenladeclaracinde
laclaseodelosatributos).Unmtodopuedetenerlossiguientestiposdemodificadores:
9 Modificadores de acceso. Son los mismos que en el caso de los atributos (por omisin o de
paquete,public, private y protected) y tienen el mismo cometido (acceso al mtodo slo por
parte de clases delmismo paquete, o por cualquier parte del programa, o slo para la propia
clase,otambinparalassubclases).

20

DesarrollodeAplicacionesWeb

Tema5

9 Modificadoresdecontenido.Sontambinlosmismosqueenelcasodelosatributos(staticy
final)juntocon,aunquesusignificadonoeselmismo.
9 Otros modificadores (no son aplicables a los atributos, slo a los mtodos): abstract,
native,synchronized.
Unmtodostaticesunmtodocuyaimplementacinesigualparatodoslosobjetosdelaclaseyslo
tendraccesoalosatributosestticosdelaclase(dadoquesetratadeunmtododeclaseynode
objeto,slopodraccederalainformacindeclaseynoladeunobjetoenparticular).Estetipode
mtodospuedenserllamadossinnecesidaddetenerunobjetodelaclaseinstanciado.
En Java un ejemplo tpico de mtodos estticos se encuentra en la clase Math, cuyosmtodos son
todos estticos (Math.abs, Math.sin, Math.cos, etc.). Como habrspodido comprobar en este
ejemplo,lallamadaamtodosestticossehacenormalmenteusandoelnombredelapropiaclasey
noeldeunainstancia(objeto),puessetratarealmentedeunmtododeclase.Encualquiercaso,los
objetos tambin admiten la invocacin de los mtodos estticos de su clase y funcionara
correctamente.
Un mtodo final es un mtodo que no permite ser sobrescrito por las clases descendientes de la
clase a la quepertenece el mtodo. Volvers a ver este modificador cuando estudies en detalle la
herencia.
El modificador native es utilizado para sealar que un mtodo ha sido implementado en cdigo
nativo (en unlenguaje que ha sido compilado a lenguaje mquina, como por ejemplo C o C++). En
estoscasossimplementeseindicalacabeceradelmtodo,puesnotienecuerpoescritoenJava.
Unmtodoabstract(mtodoabstracto)esunmtodoquenotieneimplementacin(elcuerpoest
vaco). Laimplementacin ser realizada en las clases descendientes. Un mtodo slo puede ser
declarado como abstractsi se encuentra dentro de una clase abstract. Tambin volvers a este
modificadorenunidadesposteriorescuandotrabajesconlaherencia.
Porltimo,siunmtodohasidodeclaradocomosynchronized,elentornodeejecucinobligara
quecuandounprocesoestejecutandoesemtodo,elrestodeprocesosquetenganquellamara
esemismomtododebernesperaraqueelotroprocesotermine.Puederesultartilsisabesqueun
determinado mtodo va a poder serllamado concurrentemente por varios procesos a la vez. Por
ahoranolovasanecesitar.
Dada la cantidad de modificadores que has visto hasta el momento y su posible aplicacin en la
declaracindeclases,atributosomtodos,veamosunresumendetodoslosquehasvistoyenqu
casospuedenaplicarse:

Clase Atributo Mtodo


Sinmodificador(paquete)

public

private

protected

static

final

synchronized

native

abstract

21

Desarrollodeclases

DAW

4.4Parmetrosenunmtodo.
Lalistadeparmetrosdeun mtodosecolocatraselnombredelmtodo.Esta
lista
estarconstituida
por
pares
de
la
forma
<tipoParametro><nombreParametro>. Cadaunodeesosparesestarseparado
porcomasylalistacompletaestarencerradaentreparntesis:
<tipo> nombreMetodo ( <tipo_1><nombreParametro_1>, <tipo_2>
<nombreParametro_2>, , <tipo_n><nombreParametro_n> )

Silalistadeparmetrosesvaca,tansoloaparecernlosparntesis:
<tipo><nombreMetodo> ( )

Alahoradedeclararunmtodo,debestenerencuenta:
9 Puedes incluir cualquier cantidad de parmetros. Se trata de una decisin del programador,
pudiendoserinclusounalistavaca.
9 Losparmetrospodrnserdecualquiertipo(tiposprimitivos,referencias,objetos,arrays,etc.).
9 Noestpermitidoqueelnombredeunavariablelocaldelmtodocoincidaconelnombredeun
parmetro.
9 Nopuedehaberdosparmetrosconelmismonombre.Seproduciraambigedad.
9 Sielnombredealgnparmetrocoincideconelnombredeun atributodelaclase,steser
ocultado por el parmetro. Es decir, al indicar ese nombre en el cdigo del mtodo estars
haciendoreferenciaalparmetroynoalatributo.Parapoderaccederalatributo tendrsque
hacerusodeloperadordeautorreferenciathis,queversunpocomsadelante.
9 En Java el paso de parmetros es siempre por valor, excepto en el caso de los tipos
referenciados (por ejemplo los objetos) en cuyo caso se est pasando efectivamente una
referencia.Lareferencia(elobjetoensmismo)nopodrsercambiadaperoselementosdesu
interior (atributos) a travs de sus mtodos o por acceso directo si se trata de un miembro
pblico.
Esposibleutilizarunaconstruccinespecialllamadavarargs(argumentosvariables)quepermiteque
unmtodopuedatenerunnmerovariabledeparmetros.Parautilizarestemecanismosecolocan
unospuntossuspensivos(trespuntos:)despusdeltipodelcualsepuedetenerunalistavariable
deargumentos,unespacioenblancoyacontinuacinelnombredelparmetroqueaglutinarlalista
deargumentosvariables.
<tipo><nombreMetodo> (<tipo> <nombre<)

Esposibleademsmezclarelusodevarargsconparmetrosfijos.Entalcaso,lalistadeparmetros
variablesdebeapareceralfinal(yslopuedeapareceruna).
En realidad se trata una manera transparente de pasar un array con un nmero variable de
elementosparanotenerquehacerlomanualmente.Dentrodelmtodohabrqueirrecorriendoel
arrayparairobteniendocadaunodeloselementosdelalistadeargumentosvariables.

PARASABERMS.
Si quieres ver algunos ejemplos de cmo utilizar el mecanismo de argumentos variables,
puedesecharunvistazoalossiguientesenlaces(eningls):
http://www.javatips.org/javasetips/java.lang/usingthevarargslanguagefeature.html
http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

22

DesarrollodeAplicacionesWeb

Tema5

Tambinpuedesecharunvistazoalartculogeneralsobrepasodeparmetrosamtodosen
losmanualesdeOraclesobreJava:
http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html

4.5Cuerpodeunmtodo.
Elinteriordeunmtodo(cuerpo)estcompuestoporunaseriedesentenciasenlenguajeJava:
9 Sentencias de declaracin de variables locales al
mtodo.
9 Sentencias que implementan la lgica del mtodo
(estructurasdecontrolcomobuclesocondiciones;
utilizacindemtodosdeotrosobjetos;clculode
expresiones matemticas, lgicas o de cadenas;
creacindenuevosobjetos,etc.).Esdecir,todolo
quehasvistoenlasunidadesanteriores.
9 Sentencia de devolucin del valor de retorno
(return).Apareceralfinaldelmtodoyeslaque
permite devolver la informacin que se le ha
pedido al mtodo. Es la ltima parte del proceso y la forma de comunicarse con la parte de
cdigoquellamalmtodo(pasodemensajedevuelta).Estasentenciadedevolucinsiempre
tienequeapareceralfinaldelmtodo.Tansolosieltipodevueltoporelmtodoesvoid(vaco)
nodebeaparecer(puesnohayquedevolvernadaalcdigollamante).
EnelejemplodelaclasePunto,tenaslosmtodosobtenerXyobtenerY.Veamosunodeellos:
int obtenerX ()
{
return x;
}

En ambos casos lo nico que hace el mtodo es precisamente devolver un valor (utilizacin de la
sentenciareturn). No recibe parmetros (mensajes o informacin de entrada) ni hace clculos, ni
obtieneresultadosintermediosofinales.Tansolodevuelveelcontenidodeunatributo.Setratade
unodelosmtodosmssencillosquesepuedenimplementar:unmtodoquedevuelveelvalorde
unatributo.Eninglsselessuelellamarmtodosdetipoget,queeninglssignificaobtener.
Adems de esos dos mtodos, la clase tambin dispona de otros dos que sirven para la funcin
opuesta(establecerXyestablecerX).Veamosunodeellos:
void establecerX (int vx)
{
x= vx;
}

En este caso se trata de pasar un valor al mtodo (parmetro vx de tipo int) el cual ser utilizado
paramodificarelcontenidodelatributoxdelobjeto.Comohabrspodidocomprobar,ahoranose
devuelveningnvalor(eltipodevueltoesvoidynohaysentenciareturn).Eninglssesuelehablar
de mtodos de tipo set, que en inglssignifica poner o fijar (establecer un valor). El mtodo
establecerYesprcticamenteigualperoparaestablecerelvalordelatributoy.

23

Desarrollodeclases

DAW

Normalmente el cdigo en el interior de un mtodo ser algo ms complejo y estar formado un


conjuntodesentenciasenlasqueserealizarnclculos,setomarndecisiones,serepetirnacciones,
etc.Puedesverunejemplomscompletoenelsiguienteejercicio.
EJERCICIORESUELTO.
Vamos a seguir ampliando la clase en la que se representa un rectngulo en el plano (clase
Rectangulo).Paraellohaspensadoenlossiguientesmtodospblicos:
9 Mtodos obtenerNombre y establecerNombre, que permiten el acceso y modificacin del
atributonombredelrectngulo.
9 MtodocalcularSuperfice,quecalculaelreaencerradaporelrectngulo.
9 MtodocalcularPermetro,quecalculalalongituddelpermetrodelrectngulo.
9 Mtododesplazar,quemuevelaubicacindelrectnguloenelplanoenunacantidadX(parael
ejeX) y otra cantidad Y (para el eje Y). Se trata simplemente de sumar el desplazamiento X a
lascoordenadas x1 y x2, y el desplazamiento Y a las coordenadas y1 e y2. Los parmetros de
entradadeestemtodosernportantoXeY,detipodouble.
9 Mtodo obtenerNumRectangulos, que devuelve el nmero de rectngulos creados hasta el
momento.
IncluyelaimplementacindecadaunodeesosmtodosenlaclaseRectangulo.
Respuesta:

En el caso del mtodo obtenerNombre, se trata simplemente de devolver el valor del atributo
nombre:
public String obtenerNombre () {
return nombre;
}

ParaelimplementarelmtodoestablecerNombretambinesmuysencillo.Setratademodificarel
contenidodelatributonombreporelvalorproporcionadoatravsdeunparmetrodeentrada:
public void establecerNombre (String nom) {
nombre= nom;
}

Losmtodosdeclculodesuperficieypermetronovanarecibirningnparmetrodeentrada,tan
solo debenrealizar clculos a partir de los atributos contenidos en el objeto para obtener los
resultadosperseguidos.Encadacasohabrqueaplicarlaexpresinmatemticaapropiada:
9 Enelcasodelasuperficie,habrquecalcularlalongituddelabaseylaalturadelrectnguloa
partirdelascoordenadasdelasesquinasinferiorizquierda(x1,y1)ysuperiorderecha(x2,y2)de
la figura.La base sera la diferencia entre x2 y x1, y la altura la diferencia entre y2 e y1. A
continuacin tan solotendras que utilizar la consabida frmula de base por altura, es decir,
unamultiplicacin.
9 En el caso del permetro habr tambin que calcular la longitud de la base y de la altura del
rectnguloyacontinuacinsumardosveceslalongituddelabaseydosveceslalongituddela
altura.
Enamboscasoselresultadofinaltendrqueserdevueltoatravsdelasentenciareturn.Tambin
esaconsejable en ambos casos la utilizacin de variables locales para almacenar los clculos
intermedios(comolabaseolaaltura).

24

DesarrollodeAplicacionesWeb

Tema5

public double calcularSuperficie () {


double area, base, altura; // Variables locales
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del rea
area= base * altura;
// Devolucin del valor de retorno
return area;
}
public double calcularPerimetro () {
double perimetro, base, altura; // Variables locales
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del permetro
perimetro= 2*base + 2*altura;
// Devolucin del valor de retorno
return perimetro;
}

Enelcasodelmtododesplazar,setratademodificar:
9 Loscontenidosdelosatributosx1yx2sumndoleselparmetroX,
9 Loscontenidosdelosatributosy1ey2sumndoleselparmetroY.
public void desplazar (double X, double Y) {
// Desplazamiento en el eje X
x1= x1 + X;
x2= x2 + X;
// Desplazamiento en el eje X
y1= y1 + Y;
y2= y2 + Y;
}

Enestecasonosedevuelveningnvalor(tipodevueltovaco:void).
Por ltimo, el mtodo obtenerNumRectangulos simplemente debe devolver el valor del
atributonumRectangulos.Enestecasoesrazonableplantearsequeestemtodopodrasermsbien
unmtododeclase(esttico)msqueunmtododeobjeto,puesenrealidadesunacaracterstica
delaclasemsquealgnobjetoenparticular.Paraellotansolotendrasqueutilizarelmodificador
deaccesostatic:
public static int obtenerNumRectangulos () {
return numRectangulos;
}

4.6Sobrecargademtodos
En principio podras pensar que un mtodo puede aparecer una sola vez en la declaracin de
unaclase (no se debera repetir el mismo nombre para varios mtodos). Pero no tiene porqu
siempresuceder as. Es posible tener varias versiones de un mismo mtodo (varios mtodos con el
mismonombre)graciasalasobrecargademtodos.
El lenguaje Java soporta la caracterstica conocida como sobrecarga de mtodos. sta permite
declararenunamismaclasevariasversionesdelmismomtodoconelmismonombre.Laformaque
tendrelcompiladordedistinguirentrevariosmtodosquetenganelmismonombresermediante
la lista de parmetros del mtodo: siel mtodo tiene una lista de parmetros diferente, ser
considerado como un mtodo diferente (aunque tenga elmismo nombre) y el analizador lxico no
producirunerrordecompilacinalencontrardosnombresdemtodoigualesenlamismaclase.

25

Desarrollodeclases

DAW

Imagnate que ests desarrollando una clase para escribir sobre un lienzo que permite utilizar
diferentestipografas en funcin del tipo de informacin que se va a escribir. Es probable que
necesitemos un mtododiferente segn se vaya a pintar un nmero entero (int), un nmero real
(double) o una cadena de caracteres(String). Una primera opcin podra ser definir un nombre de
mtododiferentedependiendodeloquesevayaaescribirenellienzo.Porejemplo:
9
9
9
9

MtodopintarEntero(intentero).
MtodopintarReal(doublereal).
MtodopintarCadena(doubleString).
MtodopintarEnteroCadena(intentero,Stringcadena).

Yassucesivamenteparatodosloscasosquedeseescontemplar
La posibilidad que te ofrece la sobrecarga es utilizar un mismo nombre para todos esos mtodos
(dado que en elfondo hacen lo mismo: pintar). Pero para poder distinguir unos de otros ser
necesario que siempre exista algunadiferencia entre ellos en las listas de parmetros (bien en el
nmerodeparmetros,bieneneltipodelosparmetros).Volviendoalejemploanterior,podramos
utilizarunmismonombre,porejemplopintar,paratodoslosmtodosanteriores:
9
9
9
9

Mtodopintar(intentero).
Mtodopintar(doublereal).
Mtodopintar(doubleString).
Mtodopintar(intentero,Stringcadena).

En este caso el compilador no vaa generar ningn error pues se cumplen las normas yaque unos
mtodossonperfectamentedistinguiblesdeotros(apesardetenerelmismonombre)graciasaque
tienenlistasdeparmetrosdiferentes.
Lo que s habra producido un error de compilacin habra sido por ejemplo incluir otro mtodo
pintar (intentero), pues es imposible distinguirlo de otro mtodo con el mismo nombre y con la
mismalistadeparmetros(yaexisteunmtodopintarconunnicoparmetrodetipoint).
Tambindebestenerencuentaqueeltipodevueltoporelmtodonoesconsideradoalahorade
identificarunmtodo,asqueuntipodevueltodiferentenoessuficienteparadistinguirunmtodo
de otro. Es decir, nopodras definir dos mtodos exactamente iguales en nombre y lista de
parmetroseintentardistinguirlosindicandountipodevueltodiferente.Elcompiladorproducirun
errordeduplicidadenelnombredelmtodoynotelopermitir.
Es conveniente no abusar de sobrecarga de mtodos y utilizarla con cierta moderacin (cuando
realmentepuedebeneficiarsuuso),dadoquepodrahacerelcdigomenoslegible.

AUTOEVALUACIN.
En una clase Java puedes definir tantos mtodos con el mismo nombre como desees y sin
ningn tipo derestriccin pues el lenguaje soporta la sobrecarga de mtodos y el
compilador sabr distinguir unos mtodos deotros.
Verdadero

26

Falso

DesarrollodeAplicacionesWeb

Tema5

4.7Sobrecargadeoperadores.
Delmismomodoquehemosvistolaposibilidaddesobrecargarmtodos(disponer
de variasversiones de un mtodo con el mismo nombre cambiando su lista de
parmetros), podra plantearsetambin la opcin de sobrecargar operadores del
lenguajetalescomo+,,*,(),<,>,etc.paradarlesotrosignificadodependiendodel
tipodeobjetosconlosquevayaaoperar.
Enalgunoscasospuederesultartilparaayudaramejorarlalegibilidaddelcdigo,
puesesosoperadoresresultanmuyintuitivosypuedendarunaidearpidadecules
sufuncionamiento.
Un tpico ejemplo podra ser el de la sobrecarga de operadores aritmticos como la suma (+) o el
producto(*)paraoperarconfracciones.SisedefinenobjetosdeunaclaseFraccin(quecontendr
los atributos numeradory denominador) podran sobrecargarse los operadores aritmticos (habra
queredefinireloperadorsuma(+)paralasuma,eloperadorasterisco(*)paraelproducto,etc.)para
esta clase y as podran utilizarse para sumar omultiplicar objetos de tipo Fraccin mediante el
algoritmo especfico de suma o de producto del objetoFraccin (pues esos operadores no estn
preparadosenellenguajeparaoperarconesosobjetos).
EnalgunoslenguajesdeprogramacincomoporejemploC++oC#sepermitelasobrecarga,perono
esalgosoportadoentodosloslenguajes.QusucedeenelcasoconcretodeJava?
EllenguajeJavanosoportalasobrecargadeoperadores.
En el ejemplo anterior de los objetos de tipo Fraccin, habr que declarar mtodos en la clase
Fraccinqueseencarguenderealizaresasoperaciones,peronolopodremoshacersobrecargando
losoperadoresdellenguaje(lossmbolosdelasuma,resta,producto,etc.).Porejemplo:
public Fraccion sumar (Fraccion sumando)
public Fraccion multiplicar (Fraccion multiplicando)

Yassucesivamente
Dado que en este mdulo se est utilizando el lenguaje Java para aprender a programar, no
podremos hacer usode esta funcionalidad. Ms adelante, cuando aprendas a programar en otros
lenguajes,esposiblequestengaslaposibilidaddeutilizaresterecurso.

AUTOEVALUACIN.
La sobrecarga de operadores en Java permite rescribir el significado de operadores
del lenguaje tales como +,-, *, <, >, etc. Esto puede resultar muy til a la hora de
mejorar la legibilidad del cdigo cuando definimos porejemplo nuevos objetos
matemticos (nmeros racionales, nmeros complejos, conjuntos, etc.).
Verdadero

Falso

4.8Lareferenciathis.
Lapalabrareservadathisconsisteenunareferenciaalobjetoactual.Elusodeesteoperadorpuede
resultar muy til a la hora de evitar la ambigedad que puedeproducirse entre el nombre de un
parmetro de un mtodo y el nombre de unatributo cuando ambos tienen el mismo identificador
(mismonombre).Entalescasoselparmetroocultaalatributoynotendramosaccesodirectoal

27

Desarrollodeclases

DAW

(alescribir el identificador estaramos haciendo referencia al parmetro y no alatributo). En estos


casoslareferenciathisnospermiteaccederaestosatributosocultadosporlosparmetros.
Dadoquethisesunareferenciaalapropiaclaseenlaqueteencuentrasenesemomento,puedes
acceder a susatributos mediante el operador punto (.) como sucede con cualquier otra clase u
objeto. Por tanto, en lugar deponer el nombre del atributo (que estos casos hara referencia al
parmetro), podras escribirthis.nombreAtributo, de manera que el compilador sabr que te ests
refiriendoalatributoyseeliminarlaambigedad.
EnelejemplodelaclasePunto,podramosutilizarlareferenciathissielnombredelparmetrodel
mtodocoincidieraconeldelatributoquesedeseamodificar.Porejemplo:
void establecerX (int x)
{
this.x= x;
}

Enestecasohasidoindispensableelusodethis,puessinoseraimposiblesaberenqu casoste
estsrefiriendo al parmetro x y en cules al atributo x. Para el compilador el identificador x ser
siempreelparmetro,pueshaocultadoalatributo.
Enalgunoscasospuederesultartilhacerusodelareferenciathisaunquenoseanecesario,pues
puedeayudaramejorarlalegibilidaddelcdigo.

PARASABERMS.
PuedesecharunvistazoalartculogeneralsobrelareferenciathisenlosmanualesdeOracle
(eningls):
http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

AUTOEVALUACIN.
La referencia this en Java resulta muy til cuando se quieren utilizar en un mtodo
nombres de parmetros quecoinciden con los nombres de variables locales del mtodo.
Verdadero

Falso

EJERCICIORESUELTO.
Modificar el mtodo obtenerNombre de la clase Rectangulo de ejercicios anteriores utilizando la
referenciathis.
Respuesta:

Si utilizamos la referencia this en este mtodo, entonces podremos utilizar como identificador del
parmetro elmismo identificador que tiene el atributo (aunque no tiene porqu hacerse si no se
desea):
public void establecerNombre (String nombre) {
this.nombre= nombre;
}

4.9Mtodosestticos.
Comoyahasvistoenocasionesanteriores,unmtodoestticoesunmtodoquepuedeserusado
directamente desde la clase, sin necesidad de tener que crear una instancia para poderutilizar al

28

DesarrollodeAplicacionesWeb

Tema5

mtodo.Tambinsonconocidoscomomtodosdeclase(comosucedaconlosatributosdeclase),
frentealosmtodosdeobjeto(esnecesariounobjetoparapoderdisponerdeellos).
Losmtodosestticosnopuedenmanipularatributosdeinstancias(objetos)sinoatributosestticos
(de clase) y suelen ser utilizados para realizar operaciones comunes a todos losobjetos de la clase,
msqueparaunainstanciaconcreta.
Algunosejemplosdeoperacionesquesuelenrealizarsedesdemtodosestticos:
9 Accesoaatributosespecficosdeclase:incrementoodecrementodecontadoresinternosdela
clase(nodeinstancias),accesoaunposibleatributodenombredelaclase,etc.
9 Operacionesgenricasrelacionadasconlaclaseperoquenoutilizanatributosdeinstancia.Por
ejemplouna clase NIF (o DNI) que permite trabajar con el DNI y la letra del NIF y que
proporcionafuncionesadicionalesparacalcularlaletraNIFdeunnmerodeDNIqueselepase
comoparmetro.Esemtodopuedeserinteresanteparaserusadodesdefueradelaclasede
maneraindependientealaexistenciadeobjetosdetipoNIF.
EnlabibliotecadeJavaesmuyhabitualencontrarseconclasesqueproporcionanmtodosestticos
que puedenresultar muy tiles para clculos auxiliares, conversiones de tipos, etc. Por ejemplo, la
mayora de las clases delpaquete java.lang que representan tipos (Integer, String, Float, Double,
Boolean,etc.)ofrecenmtodosestticosparahacerconversiones.Aqutienesalgunosejemplos:
9 staticStringvalueOf(inti).DevuelvelarepresentacinenformatoString(cadena)deunvalor
int.Setratadeunmtodoquenotienequevernadaenabsolutoconinstanciasdeconcretasde
String, sinode un mtodo auxiliar que puede servir como herramienta para ser usada desde
otras clases. Seutilizara directamente con el nombre de la clase. Por ejemplo: String
enteroCadena=String.valueOf(23).
9 static String valueOf (float f). Algo similar para un valor de tipo float. Ejemplo de uso:
StringfloatCadena=String.valueOf(24.341).
9 static int parseInt (String s). En este caso se trata de un mtodo esttico de la clase Integer.
Analizala cadena pasada como parmetro y la transforma en un int. Ejemplo de uso: int
cadenaEntero=Integer.parseInt(12).
Todoslosejemplosanterioressoncasosenlosqueseutilizadirectamentelaclasecomounaespecie
decajadeherramientasquecontienemtodosquepuedenserutilizadosdesdecualquierparte,por
esosuelensermtodospblicos.

PARASABERMS.
Puedesecharunvistazoaalgunasclasesdelpaquetejava.lang(porejemploInteger,String,
Float, Double,Boolean y Math) y observar la gran cantidad de mtodos estticos que
ofrecenparaserutilizadossinnecesidaddetenerquecrearobjetosdeesasclases:
Package
java.lang.http://docs.oracle.com/javase/7/docs/api/java/lang/package
summary.html

29

Desarrollodeclases

DAW

5.Encapsulacin,controldeaccesoyvisibilidad.
CASO PRCTICO.
Juan est desarrollando algunas de las clases que van a necesitar para el proyectode la Clnica
Veterinaria y empiezan a asaltarle dudas acerca de cundo deben servisibles unos u otros
miembros. Recuerda ha estado viendo con Mara los distintosmodificadores de acceso aplicables a
las clases, atributos y mtodos. Est claro quehasta que no empiece a utilizarlos para casos
concretos y con aplicacin prcticareal no terminar de comprender exactamente su mecnica de
funcionamiento:
Cundo interesa ocultar un determinado miembro, cundo interesa que otro miembro sea visible, en
qucasos vale la pena crear un mtodo para acceder al valor de un atributo, etc.

DentrodelaProgramacinOrientadaaObjetosyahasvistoqueesmuyimportanteelconceptode
ocultacin,lacualhasidologradagraciasalaencapsulacindelainformacindentrodelasclases.
Deestamaneraunaclasepuedeocultarpartedesucontenidoorestringirelaccesoalparaevitar
que sea manipulado de manerainadecuada. Los modificadores de acceso en Java permiten
especificarelmbitodevisibilidaddelosmiembrosdeunaclase,proporcionandoasunmecanismo
deaccesibilidadavariosniveles.
Acabasdeestudiarquecuandosedefinenlosmiembrosdeunaclase(atributosomtodos),eincluso
la propia clase, se indica (aunque sea por omisin) un modificador deacceso. En funcin de la
visibilidadquesedeseequetenganlosobjetosolosmiembrosdeesosobjetosseelegiralgunode
losmodificadoresdeaccesoquehasestudiado.Ahoraqueyasabescmoescribirunaclasecompleta
(declaracindelaclase,declaracindesusatributosydeclaracindesusmtodos),vamosahacerun
repasogeneraldelasopcionesdevisibilidad(controldeacceso)quehasestudiado.
Losmodificadoresdeaccesodeterminansiunaclasepuedeutilizardeterminadosmiembros(acceder
aatributosoinvocarmiembros)deotraclase.Existendosnivelesdecontroldeacceso:
1. Anivelgeneral(niveldeclase):visibilidaddelapropiaclase.
2. Aniveldemiembros:especificacin,miembropormiembro,desuniveldevisibilidad.
Enelcasodelaclase,yaestudiastequelosnivelesdevisibilidadpodanser:
9 Pblico (modificador public), en cuyo caso la claseera visible a cualquier otra clase (cualquier
otrofragmentodecdigodelprograma).
9 Privada al paquete (sin modificador o modificador por omisin). En este caso, la clase slo
ser visible a las dems clases del mismo paquete, pero no al resto del cdigo del programa
(otrospaquetes).
En el caso de los miembros, disponas de otras dos posibilidades ms de niveles de accesibilidad,
teniendountotaldecuatroopcionesalahoradedefinirelcontroldeaccesoalmiembro:
9 Pblico(modificadorpublic),igualqueenelcasoglobaldelaclaseyconelmismosignificado
(miembrovisibledesdecualquierpartedelcdigo).
9 Privado al paquete (sin modificador), tambin con el mismo significado que en el caso de la
clase(miembrovisibleslodesdeclasesdelmismopaquete,nisiquieraservisibledesdeuna
subclasesalvosistaestenelmismopaquete).
9 Privado(modificadorprivate),dondeslolapropiaclasetieneaccesoalmiembro.
9 Protegido(modificadorprotected)

30

DesarrollodeAplicacionesWeb

Tema5

PARASABERMS.
Puedesecharunvistazoalartculosobreelcontroldeaccesoalosmiembrosdeunaclase
JavaenlosmanualesdeOracle(eningls):
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

AUTOEVALUACIN.
Si queremos que un atributo de una clase sea accesible solamente desde el cdigo de la propia
clase o deaquellas clases que hereden de ella, qu modificador de acceso deberamos
utilizar?
private.
protected.
public.
Ninguno de los anteriores.

5.1Ocultacindeatributos.Mtodosdeacceso.
Losatributosdeunaclasesuelenserdeclaradoscomoprivadosalaclaseo,comomucho,protected
(accesiblestambinporclasesheredadas),peronocomopublic.Deestamanerapuedesevitarque
seanmanipuladosinadecuadamente(porejemplosmodificarlossinningntipodecontrol)desdeel
exteriordelobjeto.
En estos casos lo que se suele hacer es declarar esos atributos como privados oprotegidos y crear
mtodos pblicos que permitan acceder a esos atributos. Si setrata de un atributo cuyo contenido
puede ser observado pero no modificadodirectamente, puede implementarse un mtodo de
obtencindelatributo(eninglsselessuelellamarmtododetipoget)ysielatributopuedeser
modificado,puedestambinimplementarotromtodoparalamodificacinoestablecimientodel
valordelatributo(eninglsselesuelellamarmtododetiposet).Estoyalohasvistoenapartados
anteriores.
SirecuerdaslaclasePuntoquehemosutilizadocomoejemplo,yahicistealgoasconlosmtodosde
obtencinyestablecimientodelascoordenadas:
private int x, y;
// Mtodos get
public int obtenerX () { return
public int obtenerY () { return
// Mtodos set
public void establecerX (int x)
public void establecerY (int y)

x; }
y; }
{ this.x= x; }
{ this.y= y; }

As,parapoderobtenerelvalordelatributoxdeunobjetodetipoPuntosernecesarioutilizarel
mtodoobtenerX()ynosepodraccederdirectamentealatributoxdelobjeto.
Enalgunoscasoslosprogramadoresdirectamenteutilizannombreseninglsparanombraraestos
mtodos:
getX ,getY (), setX, setY, getNombre, setNombre, getColor, etc.

Tambinpuedendarsecasosenlosquenointeresaquepuedaobservarsedirectamenteelvalorde
un atributo,sino un determinado procesamiento o clculo que se haga con el atributo (pero no el
valororiginal).PorejemplopodrastenerunatributoDNIquealmacenelos8dgitosdelDNIperono
la letra del NIF (pues se puedecalcular a partir de los dgitos). El mtodo de acceso para el DNI

31

Desarrollodeclases

DAW

(mtodogetDNI)podraproporcionarelDNIcompleto(esdecir,elNIF,incluyendolaletra),mientras
quelaletranoesalmacenadarealmenteenelatributodelobjeto.Algosimilarpodrasucederconel
dgito de control de una cuenta bancaria, que puede no seralmacenado en el objeto, pero s
calculadoydevueltocuandosenospideelnmerodecuentacompleto.
Enotroscasospuedeinteresardisponerdemtodosdemodificacindeunatributoperoatravsde
undeterminado procesamiento previo para por ejemplo poder controlar errores o valores
inadecuados.VolviendoalejemplodelNIF,unmtodoparamodificarunDNI(mtodosetDNI)podra
incluirlaletra(NIFcompleto),demaneraqueaspodracomprobarsesielnmerodeDNIylaletra
coinciden (es un NIF vlido). En tal caso sealmacenar el DNI y en caso contrario se producir un
error de validacin (por ejemplo lanzando unaexcepcin). En cualquier caso, el DNI que se
almacenaraserasolamenteelnmeroynolaletra(pueslaletraescalculableapartirdelnmerode
DNI).

AUTOEVALUACIN.
Los atributos de una clase suelen ser declarados como public para facilitar el acceso y la
visibilidad de losmiembros de la clase.
Verdadero

Falso

5.2Ocultacindemtodos.
Normalmentelosmtodosdeunaclasepertenecenasuinterfazyportantoparecelgicoquesean
declarados como pblicos. Pero tambin es cierto que pueden darse casos en los que existala
necesidad de disponer de algunos mtodos privados a la clase. Se trata de mtodos querealizan
operacionesintermediasoauxiliaresyquesonutilizadosporlosmtodosquesformanpartedela
interfaz.Esetipodemtodos(decomprobacin,deadaptacindeformatos,declculosintermedios,
etc.)suelen declararse comoprivados puesnoson deinters (onoesapropiadoqueseanvisibles)
fueradelcontextodelinteriordelobjeto.
En el ejemplo anterior de objetos que contienen un DNI, ser necesario calcular la letra
correspondienteaundeterminadonmerodeDNIocomprobarsiunadeterminadacombinacinde
nmero y letra forman un DNIvlido. Este tipo de clculos y comprobaciones podran ser
implementadosenmtodosprivadosdelaclase(oalmenoscomomtodosprotegidos).

AUTOEVALUACIN.
Dado que los mtodos de una clase forman la interfaz de comunicacin de esa clase con
otras clases, todos loselementos de una clase deben ser siempre declarados como
pblicos.
Verdadero

Falso

EJERCICIORESUELTO.
Vamos a intentar implementar una clase que incluya todo lo que has visto hasta ahora. Se desea
crearunaclasequerepresenteunDNIespaolyquetengalassiguientescaractersticas:

32

DesarrollodeAplicacionesWeb

Tema5

9 LaclasealmacenarelnmerodeDNIenunint,singuardarlaletra,puessepuedecalculara
partirdel nmero. Este atributo ser privado a la clase. Formato del atributo: private int
numDNI.
9 Para acceder al DNI se dispondr de dos mtodos obtener (get), uno que proporcionar el
nmerodeDNI(slolascifrasnumricas)yotroquedevolverelNIFcompleto(incluidalaletra).
Elformatodelmtodoser:
publicintobtenerDNI().
publicStringobtenerNIF().
9 ParamodificarelDNIsedispondrdedosmtodosestablecer(set),quepermitirnmodificarel
DNI.UnoenelquehabrqueproporcionarelNIFcompleto(nmeroyletra).Yotroenelque
nicamenteser necesario proporcionar el DNI (las siete u ocho cifras). Si el DNI/NIF es
incorrectosedeberalanzaralgntipodeexcepcin.Elformatodelosmtodos(sobrecargados)
ser:
publicvoidestablecer(Stringnif)throws
publicvoidestablecer(intdni)throws
9 Laclasedispondrdealgunosmtodosinternosprivadosparacalcularlaletradeunnmerode
DNIcualquiera,paracomprobarsiunDNIconsuletraesvlido,paraextraerlaletradeunNIF,
etc.Aquellos mtodos que no utilicen ninguna variable de objeto podran declararse como
estticos(pertenecientesalaclase).Formatodelosmtodos:
privatestaticcharcalcularLetraNIF(intdni).
privatebooleanvalidarNIF(Stringnif).
privatestaticcharextraerLetraNIF(Stringnif).
privatestaticintextraerNumeroNIF(Stringnif).
ParacalcularlaletraNIFcorrespondienteaunnmerodeDNIpuedesconsultarelartculosobreel
NIFdelaWikipedia:
http://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci%C3%B3n_fiscal
Respuesta:

En el siguiente documento puedes observar el proceso completo de elaboracin de todos los


elementosdelaclase:
/**---------------------------------------------------------------* Clase DNI
----------------------------------------------------------------*/
public class DNI {
// Atributos estticos
// Cadena con las letras posibles del DNI ordenados para el clculo de DNI
private static final String LETRAS_DNI= "TRWAGMYFPDXBNJZSQVHLCKE";
// Atributos de objeto
private int numDNI;
// Mtodos
public String obtenerNIF () {
// Variables locales
String cadenaNIF;
// NIF con letra para devolver
char letraNIF;
// Letra del nmero de NIF calculado
// Clculo de la letra del NIF
letraNIF= calcularLetraNIF (numDNI);
// Construccin de la cadena del DNI: nmero + letra
cadenaNIF= Integer.toString(numDNI) + String.valueOf(letraNIF);
// Devolucin del resultado
return cadenaNIF;
}
public int obtenerDNI () {
return numDNI;
}

33

Desarrollodeclases

DAW

public void establecer (String nif) throws Exception {


if (DNI.validarNIF (nif)) { // Valor vlido: lo almacenamos
this.numDNI= DNI.extraerNumeroNIF(nif);
}
else { // Valor invlido: lanzamos una excepcin
throw new Exception ("NIF invlido: " + nif);
}
}
public void establecer (int dni) throws Exception {
// Comprobacin de rangos
if (dni>999999 && dni<99999999) {
this.numDNI= dni; // Valor vlido: lo almacenamos
}
else { // Valor invlido: lanzamos una excepcin
throw new Exception ("DNI invlido: " + String.valueOf(dni));
}
}
private static char calcularLetraNIF (int dni) {
char letra;
// Clculo de la letra NIF
letra= LETRAS_DNI.charAt(dni % 23);
// Devolucin de la letra NIF
return letra;
}
private static char extraerLetraNIF (String nif) {
char letra=
nif.charAt(nif.length()-1);
return letra;
}
private static int extraerNumeroNIF (String nif) {
int numero= Integer.parseInt(nif.substring(0, nif.length()-1));
return numero;
}
private static boolean validarNIF (String nif) {
boolean valido= true;
// Suponemos el NIF vlido mientras no se encuentre algn fallo
char letra_calculada;
char letra_leida;
int dni_leido;
if (nif == null) { // El parmetro debe ser un objeto no vaco
valido= false;
}
else if (nif.length()<8 || nif.length()>9) {
// La cadena debe estar entre 8(7+1) y 9(8+1)
caracteres
valido= false;
}
else {
letra_leida= DNI.extraerLetraNIF (nif);
// Extraemos la letra de NIF
(letra)
dni_leido= DNI.extraerNumeroNIF (nif); // Extraemos el nmero de DNI (int)
letra_calculada= DNI.calcularLetraNIF(dni_leido);
// Calculamos la letra de
NIF a partir del nmero extrado
if (letra_leida == letra_calculada) {
// Comparamos la letra extrada con la calculada
// Todas las comprobaciones han resultado vlidas. El NIF es vlido.
valido= true;
}
else {
valido= false;
}
}
return valido;
}
}

34

DesarrollodeAplicacionesWeb

Tema5

6.Utilizacindelosmtodosyatributosdeunaclase.
CASO PRCTICO.
Juan ya ha terminado de escribir algunas de las clases de prueba para la aplicacin que est
comenzando a desarrollar junto con Mara. Es el momento de crear instancias de esas clases (es
decir, objetos) para probar si estn correctamente implementadas. La idea de Juan es pasar las
clases a Mara junto con cierta documentacin sobre su interfaz para que ella no tenga que examinar
los detalles de implementacin de las clases. De esta manera ella escribir cdigo en el que crear
objetos a partir de las clases de Juan y a continuacin comenzar a utilizar sus miembros pblicos. Si
todo ha ido bien, Mara habr hecho uso de las clases de Juan sin tener que haber participado
directamente en su desarrollo. Si se producen problemas de ejecucin (de compilacin no deberan
producirse porque ya los habra resuelto Juan), Mara podr informar de cules han sido esos errores
para que Juan pueda intentar corregirlos, ya que l es quien sabr en qu parte del cdigo habr que
tocar.

Una vez que ya tienes implementada una clase con todos sus atributos y mtodos, ha llegado el
momento de utilizarla, es decir, de instanciar objetos de esa clase e interaccionar con ellos. En
unidadesanterioresyahasvistocmodeclararunobjetodeunaclasedeterminada,instanciarlocon
eloperadornewyutilizarsusmtodosyatributos

PARASABERMS.
Puedes echar un vistazo a los artculos sobre la creacin y uso de objetos en Java en los
manualesdeOracle:

http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
EnlacealartculodelmanualdeJavadeOracleenelquesedescribeelprocesodecreacin
deunobjeto.(eningls).

http://docs.oracle.com/javase/tutorial/java/javaOO/usingobject.html
EnlacealartculodelmanualdeJavadeOracleenelquesedescribecmoutilizarunobjeto
enJava(eningls).

6.1Declaracindeunobjeto.
Comoyahasvistoenunidadesanteriores,ladeclaracindeunobjetoserealizaexactamenteigual
queladeclaracindeunavariabledecualquiertipo:
<tipo> nombreVariable;

En este caso el tipo ser alguna clase que ya hayas implementado o bien alguna de las
proporcionadasporlabibliotecadeJavaoporalgunaotrabibliotecaescritaporterceros.
Porejemplo:
Punto p1;
Rectangulo r1, r2;
Coche cocheAntonio;
String palabra;

Esas variables (p1, r1, r2, cocheAntonio, palabra) en realidad son referencias (tambin conocidas
comopunterosodireccionesdememoria)queapuntan(hacenreferencia)aunobjeto(unazona
dememoria)delaclaseindicadaenladeclaracin.
Como ya estudiaste en la unidad dedicada a los objetos, un objeto recin declarado (referencia
recincreada)noapuntaanada.Sedicequelareferenciaestvacaoqueesunareferencianula(la
variableobjetocontieneelvalornull).Esdecir,lavariableexisteyestpreparadaparaguardaruna

35

Desarrollodeclases

DAW

direccindememoriaqueserlazonadondeseencuentreelobjetoalqueharreferencia,peroel
objeto an no existe (no ha sido creado o instanciado). Por tanto se dice que apunta a un objeto
nulooinexistente.
Paraqueesavariable(referencia)apunterealmenteaunobjeto(contengaunareferenciaodireccin
dememoriaqueapunteaunazonadememoriaenlaquesehareservadoespacioparaunobjeto)es
necesariocrearoinstanciarelobjeto.Paraelloseutilizaeloperadornew.

AUTOEVALUACIN.
Aunque la declaracin de un objeto es imprescindible para poder utilizarlo, ese objeto no
existir hasta que no se construya una instancia de la clase del objeto. Es decir, mientras la
clase no sea instanciada, el objeto an no existir y lo nico que se tendr ser una variable
que contendr un objeto vaco o nulo.
Verdadero

Falso

EJERCICIORESUELTO.
Utilizando la clase Rectangulo implementada en ejercicios anteriores, indica como declararas tres
objetos(variables)deesaclasellamadosr1,r2,r3.
Respuesta

Setratasimplementederealizarunadeclaracindeesastresvariables:
Rectangulo r1;
Rectangulo r2:
Rectangulo r3:

Tambinpodrashaberdeclaradolostresobjetosenlamismasentenciadedeclaracin:
Rectangulo r1, r2, r3;

6.2Creacindeunobjeto.
Para poder crear un objeto (instancia de una clase) es necesario utilizar el operador new, el cual
tienelasiguientesintaxis:
nombreObjeto= new <ConstructorClase> ([listaParametros]);

El constructor de una clase (ConstructorClase) es un mtodo especial que tiene toda clase y cuyo
nombrecoincideconeldelaclase.Esquienseencargadecrearoconstruirelobjeto,solicitandola
reservadememorianecesariaparalosatributoseinicializndolosaalgnvalorsifueranecesario.
Dadoqueelconstructoresunmtodomsdelaclase,podrtenertambinsulistadeparmetros
comotienentodoslosmtodos.
De la tarea de reservar memoria para la estructura del objeto (sus atributos ms alguna otra
informacin de carcter interno para el entorno de ejecucin) se encarga el propio entorno de
ejecucinde Java.Es decir,que porel hecho de ejecutar un mtodoconstructor,elentornosabr
quetienequerealizarunaseriedetareas(solicituddeunazonadememoriadisponible,reservade
memoriaparalosatributos,enlacedelavariableobjetoaesazona,etc.)ysepondrrpidamentea
desempearlas.

36

DesarrollodeAplicacionesWeb

Tema5

Cuandoescribaselcdigodeunaclasenoesnecesarioqueimplementeselmtodoconstructorsino
quieres hacerlo. Java se encarga de dotar de un constructor por omisin (tambin conocido como
constructorpordefecto)atodaclase.Eseconstructorporomisinseocuparexclusivamentedelas
tareasdereservadememoria.Sideseasqueelconstructorrealiceotrastareasadicionales,tendrs
queescribirlot.Elconstructorporomisinnotieneparmetros.
Elconstructorpordefectonoseveenelcdigodeunaclase.LoincluirelcompiladordeJavaal
compilarlaclasesidescubrequenosehacreadoningnmtodoconstructorparaesaclase.
Algunosejemplosdeinstanciacinocreacindeobjetospodranser:
p1= new Punto ();
r1= new Rectangulo ();
r2= new Rectangulo;
cocheAntonio= new Coche();
palabra= String;

Enelcasodelosconstructores,sistosnotienenparmetros,puedenomitirselosparntesisvacos.
Unobjetopuedeserdeclaradoeinstanciadoenlamismalnea.Porejemplo:
Punto p1= new Punto ();

AUTOEVALUACIN.
Si una clase no tiene constructor porque el programador no lo ha implementado, Java se
encargar de dotar a esa clase de un constructor por defecto de manera que cualquier clase
instanciable siempre tendr al menos un constructor
Verdadero

Falso

EJERCICIORESUELTO.
Ampliarelejercicioanteriorinstanciandolosobjetosr1,r2,r3medianteelconstructorpordefecto.
Respuesta

Habra que aadir simplemente una sentencia de creacin o instanciacin (llamada al constructor
medianteeloperadornew)porcadaobjetoquesedeseecrear:
Rectangulo r1, r2,
r1= new Rectangulo
r2= new Rectangulo
r3= new Rectangulo

r3;
();
();
();

6.3Manipulacindeunobjeto:utilizacindemtodosyatributos.
Una vez que un objeto ha sido declarado y creado (clase instanciada) ya s se puede decir que el
objetoexisteenelentornodeejecucin,yportantoquepuedesermanipuladocomounobjetoms
enelprograma,hacindoseusodesusatributosysusmtodos.
Paraaccederaunmiembrodeunobjetoseutilizaeloperadorpunto(.)delsiguientemodo:
<nombreObjeto>.<nombreMiembro>

Donde<nombreMiembro>serelnombredealgnmiembrodelobjeto(atributoomtodo)alcual
setengaacceso.

37

Desarrollodeclases

DAW

Por ejemplo, en el caso de los objetos de tipo Punto que has declarado e instanciado en los
apartadosanteriores,podrasaccederasusmiembrosdelasiguientemanera:
Punto p1, p2, p3;
p1= new Punto();
p1.x= 5;
p1.y= 6;
System.out.printf ("p1.x: %d\np1.y: %d\n", p1.x, p1.y);
System.out.printf ("p1.x: %d\np1.y: %d\n", p1.obtenerX(), p1.obtenerY());
p1.establecerX(25);
p1.establecerX(30);
System.out.printf ("p1.x: %d\np1.y: %d\n", p1.obtenerX(), p1.obtenerY());

Esdecir,colocandoeloperadorpunto(.)acontinuacindelnombredelobjetoyseguidodelnombre
delmiembroalquesedeseaacceder.
EJERCICIORESUELTO.
Utilizarelejemplodelosrectngulosparacrearunrectngulor1,asignarlelosvaloresx1=0,y1=0,
x2=10,y2=10,calcularsureaysupermetroymostrarlosenpantalla.
Respuesta

Setratadedeclarareinstanciarelobjetor1,rellenarsusatributosdeubicacin(coordenadasdelas
esquinas), e invocar a los mtodos calcularSuperficie y calcularPerimetro utilizando el operador
punto(.).Porejemplo:
Rectangulo r1= new Rectangulo ();
r1.x= 0;
r1.y= 0;
r2.x= 10;
r2.y= 10;
area= r1.calcularSuperficie ();
permetro= r1.calcularPerimetro ();

Porltimofaltaramostrarenpantallalainformacincalculada.
PodemosobservaracontinuacinunejemplocompletodondeseinstanciaunobjetoRectanguloy
semanipulansusmiembros:
Claseprincipalomain
/*
Ejemplo de uso de la clase Rectangulo
*/
package ejemplorectangulos01;
/**
*
* Programa Principal (clase principal)
*/
public class EjemploRectangulos01 {

public static void main(String[] args) {


Rectangulo r1, r2;
r1= new Rectangulo ();
r2= new Rectangulo ();
r1.x1= 0;
r1.y1= 0;
r1.x2= 10;
r1.y2= 10;
r1.establecerNombre ("rectangulo1");
System.out.printf ("PRUEBA DE USO DE LA CLASE RECTNGULO\n");
System.out.printf ("------------------------------------\n\n");
System.out.printf ("r1.x1: %4.2f\nr1.y1: %4.2f\n", r1.x1, r1.y1);
System.out.printf ("r1.x2: %4.2f\nr1.y2: %4.2f\n", r1.x2, r1.y2);

38

DesarrollodeAplicacionesWeb

Tema5

System.out.printf
("Perimetro:
%4.2f\nSuperficie:
%4.2f\n",
r1.CalcularPerimetro(),
r1.CalcularSuperficie());
System.out.printf ("Desplazamos X=3, Y=3\n");
r1.desplazar (3,3);
System.out.printf ("r1.x1: %4.2f\nr1.y1: %4.2f\n", r1.x1, r1.y1);
System.out.printf ("r1.x2: %4.2f\nr1.y2: %4.2f\n", r1.x2, r1.y2);
}
}

Claserectngulo
package ejemplorectangulos01;
/**---------------------------------------------------------------* Clase Rectangulo
----------------------------------------------------------------*/
public class Rectangulo {
// Atributos de clase
private static int numRectangulos;
creados
public static final String nombreFigura= "Rectngulo";
public static final double PI= 3.1416;
// Atributos de objeto
private String nombre;
public double x1, y1;
public double x2, y2;

//

Nmero

total

de

rectngulos

// Nombre de la clase
// Constante PI

// Nombre del rectngulo


// Vrtice inferior izquierdo
// Vrtice superior derecho

// Mtodo obtenerNombre
public String obtenerNombre () {
return nombre;
}
// Mtodo establecerNombre
public void establecerNombre (String nom) {
nombre= nom;
}
// Mtodo CalcularSuperficie
public double CalcularSuperficie () {
double area, base, altura;
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del rea
area= base * altura;
// Devolucin del valor de retorno
return area;
}
// Mtodo CalcularPerimetro
public double CalcularPerimetro () {
double perimetro, base, altura;
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del permetro
perimetro= 2*base + 2*altura;
// Devolucin del valor de retorno
return perimetro;
}

39

Desarrollodeclases

// Mtodo desplazar
public void desplazar (double X, double Y) {
// Desplazamiento en el eje X
x1= x1 + X;
x2= x2 + X;
// Desplazamiento en el eje X
y1= y1 + Y;
y2= y2 + Y;
}
// Mtodo obtenerNumRectangulos
public static int obtenerNumRectangulos () {
return numRectangulos;
}
}

40

DAW

DesarrollodeAplicacionesWeb

Tema5

7.Constructores.
CASO PRCTICO.
Mara y Juan ya han creado y utilizado objetos y cuentan con algunos pequeos programas de
ejemplo compuestos por varias clases adems de la clase principal (la que contiene el mtodo main).
Ada ha estado revisando su trabajo y ha quedado muy satisfecha, aunque al observar la estructura
de las clases les ha comentado algo que los ha dejado un poco despistados:
Estas clases tienen muy buena pinta, aunque faltara aadirles algunos constructores para poder
mejorar su flexibilidad a la hora de instanciar objetos, no creis?.
Ambos han asentido porque eran conscientes de que hasta el momento no haban estado incluyendo
constructores en sus clases, estaban aprovechando el constructor por defecto que aada el
compilador.
Parece que ha llegado el momento de aadir nuestros propios constructores, le dice Mara a
Juan.

Comoyahasestudiadoenunidadesanteriores,enelciclodevidadeunobjetosepuedendistinguir
lasfasesde:
9 Construccindelobjeto.
9 Manipulacinyutilizacindelobjetoaccediendoasusmiembros.
9 Destruccindelobjeto.
Comohasvistoenelapartadoanterior,durantelafasedeconstruccinoinstanciacindeunobjeto
es cuando se reserva espacio en memoria para sus atributos y se inicializan algunos de ellos. Un
constructor es un mtodo especial con el mismo nombre de la clase y que se encarga de realizar
esteproceso.
Elprocesodedeclaracinycreacindeunobjetomedianteeloperadornewyahasidoestudiadoen
apartadosanteriores.Sinembargolasclasesquehastaahorahascreadonotenanconstructor.Has
estadoutilizandolosconstructorespordefectoqueproporcionaJavaalcompilarlaclase.Hallegado
elmomentodequeempiecesaimplementartuspropiosconstructores.
Losmtodosconstructoresseencargandellevaracaboelprocesodecreacinoconstruccindeun
objeto.

AUTOEVALUACIN.
Con qu nombre es conocido el mtodo especial de una clase que se encarga de reservar
espacio e inicializar atributos cuando se crea un objeto nuevo? Qu nombre tendr ese
mtodo en la clase?
Mtodo constructor. Su nombre dentro de la clase ser constructor..
Mtodo inicializador. Su nombre dentro de la clase ser el mismo nombre que tenga
la clase..
Mtodo constructor. Su nombre dentro de la clase ser el mismo nombre que tenga la
clase..
Mtodo constructor. Su nombre dentro de la clase ser new.

7.1Conceptodeconstructor.
Unconstructoresunmtodoquetieneelmismonombrequelaclasealaqueperteneceyqueno
devuelveningnvalortrassuejecucin.Sufuncinesladeproporcionarelmecanismodecreacin
deinstancias(objetos)delaclase.

41

Desarrollodeclases

DAW

Cuandounobjetoesdeclarado,enrealidadannoexiste.Tansolosetratadeunnombresimblico
(unavariable)queenelfuturoharreferenciaaunazonadememoriaquecontendrlainformacin
querepresentarealmenteaunobjeto.Paraqueesavariabledeobjetoanvaca(sesueledecir
queesunareferencianulaovaca)apunte,ohagareferenciaaunazonadememoriaquerepresente
a una instancia de clase (objeto) existente, es necesario construir el objeto. Ese proceso se
realizar a travs del mtodo constructor de la clase. Por tanto para crear un nuevo objeto es
necesariorealizaruna llamadaaunmtodoconstructor dela clasealaque perteneceeseobjeto.
Eseprocesoserealizamediantelautilizacindeloperadornew.
Hastaelmomentoyahasutilizadoennumerosasocasioneseloperadornewparainstanciarocrear
objetos. En realidad lo que estabas haciendo era una llamada al constructor de la clase para que
reservaramemoriaparaeseobjetoyportantocrearfsicamenteelobjetoenlamemoria(dotarlo
de existencia fsica dentro de la memoria del ordenador). Dado que en esta unidad ests ya
definiendotuspropiasclases,parecequehallegadoelmomentodequeempiecesaescribirtambin
losconstructoresdetusclases.
Porotrolado,siunconstructoresalfinyalcabounaespeciedemtodo(aunquealgoespecial)y
Javasoportalasobrecargade mtodos,podrasplanteartelasiguientepregunta:podrunaclase
disponerdemsdeconstructor?Enotraspalabras,serposiblelasobrecargadeconstructores?La
respuestaesafirmativa.
Unamismaclasepuededisponerdevariosconstructores.Losconstructoressoportanlasobrecarga.
Esnecesarioquetodaclasetengaalmenosunconstructor.Sinosedefineningnconstructorenuna
clase, el compilador crear por nosotros un constructor por defecto vaco que se encarga de
inicializar todos los atributos a sus valores por defecto (0 para los numricos, null para las
referencias,falseparalosboolean,etc.).
Algunasanalogasquepodrasimaginarpararepresentarelconstructordeunaclasepodranser:
9
9
9
9

Losmoldesdecocinaparaflanes,galletas,pastas,etc.
Uncubodeplayaparacrearcastillosdearena.
Unmoldedeunlingotedeoro.
Unabolsaparahacercubitosdehielo.

Una vez que incluyas un constructor personalizado a una clase, el compilador ya no incluir el
constructor por defecto (sin parmetros) y por tanto si intentas usarlo se producira un error de
compilacin. Si quieres que tu clase tenga tambin un constructor sin parmetros tendrs que
escribirsucdigo(yanoloharportielcompilador)

7.2Creacindeconstructores.
Cuandoseescribeelcdigodeunaclasenormalmentesepretendequelosobjetosdeesaclasese
creendeunadeterminadamanera.Paraellosedefinenunoomsconstructoresenlaclase.Enla
definicindeunconstructorseindican:
9 Eltipodeacceso.
9 Elnombredelaclase(elnombredeunmtodoconstructoressiempreelnombredelapropia
clase).
9 Lalistadeparmetrosquepuedeaceptar.

42

DesarrollodeAplicacionesWeb

9 Silanzaonoexcepciones.
9 Elcuerpodelconstructor(unbloquedecdigocomoeldecualquiermtodo).

Tema5

Comopuedesobservar,laestructuradelosconstructoresessimilaraladecualquiermtodo,conlas
excepcionesdequenotienetipodedatodevuelto(nodevuelveningnvalor)yqueelnombredel
mtodoconstructordebeserobligatoriamenteelnombredelaclase.

REFLEXIONA
Si defines constructores personalizados para una clase, el constructor por defecto (sin
parmetros)paraesaclasedejadesergeneradoporelcompilador,demaneraquetendrs
quecrearlotsiquierespoderutilizarlo.
Sisehacreadounconstructorconparmetrosynosehaimplementadoelconstructorpor
defecto, el intento de utilizacin del constructor por defecto producir un error de
compilacin(elcompiladornoloharpornosotros).
UnejemplodeconstructorparalaclasePuntopodraser:
public Punto (int x, int y)
{
this.x= x;
this.y= y;
cantidadPuntos++; // Suponiendo que tengamos un atributo esttico cantidadPuntos
}

Enestecasoelconstructorrecibedosparmetros.Ademsdereservarespacioparalosatributos(de
locualseencargaautomticamenteJava),tambinasignasendosvaloresinicialesalosatributosxe
y.Porltimoincrementaunatributo(probablementeesttico)llamadocantidadPuntos.

AUTOEVALUACIN.
El constructor por defecto (sin parmetros) est siempre disponible para usarlo en cualquier
clase.
Verdadero
Falso

7.3Utilizacindeconstructores.
Una vez que dispongas de tus propios constructores personalizados, la forma de utilizarlos es
igualque con el constructor por defecto (mediante la utilizacin de la palabra reservada new)
peroteniendo en cuenta que si has declarado parmetros en tu mtodo constructor, tendrs que
llamaralconstructorconalgnvalorparaesosparmetros.
UnejemplodeutilizacindelconstructorquehascreadoparalaclasePuntoenelapartadoanterior
podraser:
Punto p1;
p1= new Punto (10, 7);

En este caso no se estara utilizando el constructor por defecto sino el constructor que acabas de
implementarenelcualademsdereservarmemoriaseasignaunvaloraalgunosdelosatributos.

PARASABERMS.
PuedesecharunvistazoalartculosobreconstructoresdeunaclaseJavaenlosmanualesde
Oracle(eningls):
http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

43

Desarrollodeclases

DAW

Tambinpuedesecharunvistazoaestosvdeosqueyasetehanrecomendadoenunidades
anteriores. Ahoraprobablemente comprenders mucho mejor el proceso que se muestra
puesesmsomenosloquehastenidoquehacert:
http://www.youtube.com/watch?v=lhtCbiI8JuE
Resumen:Vdeoenelqueserealizaunadescripcindelaprogramacinorientadaaobjetos.Caracterizacin
deunobjetoyejemplosdesuscaractersticas(comportamiento,estado,identidad).Ejemploenelquesecrea
unaclase en Java: clase ser humano con atributos diversos, mtodos get y set, y constructor. Utilizacin de
lareferenciathis.

TutorialdeJavaenespaolCaptulo14ClasesyObjetos.Parte2.
http://www.youtube.com/watch?v=k92WaQyzVd4
Resumen: Vdeo en el que se contina utilizando la clase ser humano instanciando objetos a travs
delconstructor y aplicando algunos de sus mtodos para observar su comportamiento.

EJERCICIORESUELTO.
AmpliarelejerciciodelaclaseRectanguloaadindoletresconstructores:
1. Un constructor sin parmetros (para sustituir al constructor por defecto) que haga que los
valoresinicialesdelasesquinasdelrectngulosean(0,0)y(1,1);
2. Un constructor con cuatro parmetros, x1, y1, x2, y2, que rellene los valores iniciales de los
atributosdelrectnguloconlosvaloresproporcionadosatravsdelosparmetros.
3. Un constructor con dos parmetros, base y altura, que cree un rectngulo donde el vrtice
inferiorderechoestubicadoenlaposicin(0,0)yquetengaunabaseyunaalturatalycomo
indicanlosdosparmetrosproporcionados.
Respuesta

Enelcasodelprimerconstructorlonicoquehayquehaceresrellenarlosatributosx1,y1,x2,y2
conlosvalores0,0,1,1:
public
{
x1=
y1=
x2=
y2=
}

Rectangulo ()
0.0;
0.0;
1.0;
1.0;

Paraelsegundoconstructoressuficienteconasignaralosatributosx1,y1,x2,y2losvaloresdelos
parmetrosx1, y1, x2, y2. Tan solo hay que tener en cuenta que al tener los mismos nombres los
parmetrosdelmtodoquelosatributosdelaclase,estosltimossonocultadosporlosprimerosy
parapoderteneraccesoaellostendrsqueutilizareloperadordeautorrerferenciathis:
public Rectangulo (double x1, double y1, double x2, double y2)
{
this.x1= x1;
this.y1= y1;
this.x2= x2;
this.y2= y2;
}

Enelcasodeltercerconstructortendrsqueinicializarelvrtice(x1,y1)a(0,0)yelvrtice(x2,y2)a
(0+base,0+altura),esdecira(base,altura):
public Rectangulo (double base, double altura)
{
this.x1= 0.0;
this.y1= 0.0;
this.x2= base;
this.y2= altura;
}

44

DesarrollodeAplicacionesWeb

Tema5

MiraahoraunejemplocompletodondeseamplalaclaseRectanguloconesostresconstructoresy
seutilizanenunprogramadepruebadesdeelsiguienteenlace:
Claseprincipalomain
/*
* Ejemplo de uso de la clase Rectangulo con constructores
*/
package ejemplorectangulos02;
/**
*
* Programa Principal (clase principal)
*/
public class EjemploRectangulos02 {

public static void main(String[] args) {


Rectangulo r1, r2, r3;
System.out.printf ("PRUEBA DE USO DE LA CLASE RECTNGULO\n");
System.out.printf ("------------------------------------\n\n");
System.out.printf ("Creando rectngulos...\n\n");
r1= new Rectangulo ();
r2= new Rectangulo (1,1, 3,3);
r3= new Rectangulo (10, 5);

System.out.printf ("Recngulo r1: \n");


System.out.printf ("r1.x1: %4.2f\nr1.y1: %4.2f\n",
System.out.printf ("r1.x2: %4.2f\nr1.y2: %4.2f\n",
System.out.printf
("Perimetro:
%4.2f\nSuperficie:
r1.CalcularSuperficie());
System.out.printf ("Recngulo r2: \n");
System.out.printf ("r2.x1: %4.2f\nr2.y1: %4.2f\n",
System.out.printf ("r2.x2: %4.2f\nr2.y2: %4.2f\n",
System.out.printf
("Perimetro:
%4.2f\nSuperficie:
r2.CalcularSuperficie());
System.out.printf ("Recngulo r3: \n");
System.out.printf ("r3.x1: %4.2f\nr3.y1: %4.2f\n",
System.out.printf ("r3.x2: %4.2f\nr3.y2: %4.2f\n",
System.out.printf
("Perimetro:
%4.2f\nSuperficie:
r3.CalcularSuperficie());

r1.x1, r1.y1);
r1.x2, r1.y2);
%4.2f\n",
r1.CalcularPerimetro(),

r2.x1, r2.y1);
r2.x2, r2.y2);
%4.2f\n",
r2.CalcularPerimetro(),

r3.x1, r3.y1);
r3.x2, r3.y2);
%4.2f\n",
r3.CalcularPerimetro(),

}
}

ClaseRectangulo
package ejemplorectangulos02;
/**---------------------------------------------------------------* Clase Rectangulo.
* Incluye constructores.
----------------------------------------------------------------*/
public class Rectangulo {
// Atributos de clase (estticos)
private static int numRectangulos;
creados
public static final String nombreFigura= "Rectngulo";
public static final double PI= 3.1416;
// Atributos de objeto
private String nombre;
public double x1, y1;
public double x2, y2;

//

Nmero

total

de

rectngulos

// Nombre de la clase
// Constante PI

// Nombre del rectngulo


// Vrtice inferior izquierdo
// Vrtice superior derecho

//----------------// Constructores
//----------------public Rectangulo ()
{

45

Desarrollodeclases

x1=
y1=
x2=
y2=
}

0.0;
0.0;
1.0;
1.0;

public Rectangulo (double x1, double y1, double x2, double y2)
{
this.x1= x1;
this.y1= y1;
this.x2= x2;
this.y2= y2;
}
public Rectangulo (double base, double altura)
{
this.x1= 0.0;
this.y1= 0.0;
this.x2= base;
this.y2= altura;
}
//------------------------------// Mtodos estticos (de clase)
//------------------------------// Mtodos de estticos pblicos
// ----------------------------// Mtodo obtenerNumRectangulos
public static int obtenerNumRectangulos () {
return numRectangulos;
}
//------------------// Mtodos de objeto
//------------------//Mtodos pblicos
//----------------// Mtodo obtenerNombre
public String obtenerNombre () {
return nombre;
}
// Mtodo establecerNombre
public void establecerNombre (String nom) {
nombre= nom;
}
// Mtodo CalcularSuperficie
public double CalcularSuperficie () {
double area, base, altura;
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del rea
area= base * altura;
// Devolucin del valor de retorno
return area;
}
// Mtodo CalcularPerimetro
public double CalcularPerimetro () {
double perimetro, base, altura;
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;

46

DAW

DesarrollodeAplicacionesWeb

Tema5

// Clculo del permetro


perimetro= 2*base + 2*altura;
// Devolucin del valor de retorno
return perimetro;
}
// Mtodo desplazar
public void desplazar (double X, double Y) {
// Desplazamiento en el eje X
x1= x1 + X;
x2= x2 + X;
// Desplazamiento en el eje X
y1= y1 + Y;
y2= y2 + Y;
}
}

7.4Constructoresdecopia.
Una forma de iniciar un objeto podra ser mediante la copia de los valores de los atributos deotro
objeto ya existente. Imagina que necesitas varios objetos iguales (con los mismosvalores en sus
atributos) y que ya tienes uno de ellos perfectamente configurado (susatributos contienen los
valoresquetnecesitas).Estarabiendisponerdeunconstructorquehicieracopiasidnticasdeese
objeto.
Duranteelprocesodecreacindeunobjetopuedesgenerarobjetosexactamenteiguales(basados
en la misma clase) que se distinguirn posteriormente porque podrn tener estados distintos
(valoresdiferentes en los atributos). La idea es poder decirle a la clase que adems de generar un
objetonuevo,quelohagaconlosmismosvaloresquetengaotroobjetoyaexistente.Esdecir,algo
ascomosipudierasclonarelobjetotantasvecescomotehagafalta.Aestetipodemecanismosele
suelellamarconstructorcopiaoconstructordecopia.
Un constructor copia es un mtodo constructor como los que ya has utilizado pero con la
particularidad de querecibe como parmetro una referencia al objeto cuyo contenido se desea
copiar.Estemtodorevisacadaunodelosatributosdelobjetorecibidocomoparmetroysecopian
todos sus valores en los atributos del objeto que seest creando en ese momento en el mtodo
constructor.
UnejemplodeconstructorcopiaparalaclasePuntopodraser:
public Punto (Punto p)
{
this.x= p.obtenerX();
this.y= p.obtenerY();
}

En este caso el constructor recibe como parmetro un objeto del mismo tipo que el que va a ser
creado (clasePunto), inspecciona el valor de sus atributos (atributos x e y), y los reproduce en los
atributosdelobjetoenprocesodeconstruccin(this).
Unejemplodeutilizacindeeseconstructorpodraser:
Punto p1, p2;
p1= new Punto (10, 7);
p2= new Punto (p1);

47

Desarrollodeclases

Enestecasoelobjetop2secreaapartirdelosvaloresdelobjetop1.

DAW

AUTOEVALUACIN.
Toda clase debe incluir un constructor copia en su implementacin. Verdadero o falso?
Verdadero
Falso

EJERCICIORESUELTO.
AmpliarelejerciciodelaclaseRectanguloaadindoleunconstructorcopia.
Respuesta

Setratadeaadirunnuevoconstructorademsdelostresqueyahabamoscreado:
// Constructor copia
public Rectangulo (Rectangulo r) {
this.x1= r.x1;
this.y1= r.y1;
this.x2= r.x2;
this.y2= r.y2;
}

Para usar este constructor basta con haber creado anteriormente otro Rectangulo para utilizarlo
comobasedelacopia.Porejemplo:
Rectangulo r1, r2;
r1= new Rectangulo (0,0,2,2);
r2= new Rectangulo (r1);

7.5Destruccindeobjetos.
Comoyahasestudiadoenunidadesanteriores,cuandounobjetodejadeserutilizado,losrecursos
usados por l (memoria, acceso a archivos, conexiones con bases de datos, etc.) deberande ser
liberadosparaquepuedanvolveraserutilizadosporotrosprocesos(mecanismodedestruccindel
objeto).
Mientras que de la construccin de los objetos se encargan los mtodos constructores, de la
destruccin seencarga un proceso del entorno de ejecucin conocido como recolector de basura
(garbage collector). Esteproceso va buscando peridicamente objetos que ya no son referenciados
(nohayningunavariablequehagareferenciaaellos)ylosmarcaparasereliminados.Posteriormente
losireliminandodelamemoriacuandoloconsidereoportuno(enfuncindelacargadelsistema,
losrecursosdisponibles,etc.).
Normalmente se suele decir que en Java no hay mtodo destructor y que en otros lenguajes
orientados a objetoscomo C++, s se implementa explcitamente el destructor de una clase de la
mismamaneraquesedefineelconstructor.EnrealidadenJavatambinesposibleimplementarel
mtododestructordeunaclase,setratadelmtodofinalize().
Estemtodofinalizeesllamadoporelrecolectordebasuracuandovaadestruirelobjeto(locual
nuncasesabecundovaasucederexactamente,puesunacosaesqueelobjetoseamarcadopara
ser borrado y otra que seaborrado efectivamente). Si ese mtodo no existe, se ejecutar un
destructorpordefecto(elmtodofinalizequecontienelaclaseObject,delacualheredantodaslas
clases en Java) que liberar la memoria ocupada por elobjeto. Se recomienda por tanto que si un
objetoutilizadeterminadosrecursosdeloscualesnotienesgarantaqueelentornodeejecucinlos
vayaaliberar(cerrararchivos,cerrarconexionesdered,cerrarconexionesconbasesdedatos,etc.),

48

DesarrollodeAplicacionesWeb

Tema5

implementesexplcitamenteunmtodofinalizeentusclases.Sielnicorecursoqueutilizatuclase
es la memoria necesaria para albergar sus atributos, eso s ser liberado sin problemas. Pero si
setratadealgomscomplejo,sermejorqueteencarguestmismodehacerloimplementandotu
destructorpersonalizado(finalize).
Porotrolado,estaformadefuncionardelentornodeejecucindeJava(destruccindeobjetosno
referenciadosmedianteelrecolectordebasura)implicaquenopuedassaberexactamentecundoun
objetovaaserdefinitivamentedestruido,puessiunavariabledejadeserreferenciada(secierrael
mbitodeejecucindondefuecreada)noimplicanecesariamentequeseainmediatamenteborrada,
sinoquesimplementeesmarcadaparaqueelrecolectorlaborrecuandopuedahacerlo.
Sienunmomentodadofueranecesariogarantizarqueelprocesodefinalizacin(mtodofinalize)
seainvocado,puedesrecurriralmtodorunFinalization()delaclaseSystemparaforzarlo:
System.runFinalization ();

Estemtodoseencargadellamaratodoslosmtodosfinalizedetodoslosobjetosmarcadosporel
recolectordebasuraparaserdestruidos.
Si necesitas implementar un destructor (normalmente no ser necesario), debes tener en cuenta
que:
9 Elnombredelmtododestructordebeserfinalize().
9 Nopuederecibirparmetros.
9 Slo puede haber un destructor en una clase. No es posible la sobrecarga dado que no tiene
parmetros.
9 Nopuededevolverningnvalor.Debeserdetipovoid.

AUTOEVALUACIN.
Cuando se abandona el mbito de un objeto en Java ste es marcado por el recolector de
basura para serdestruido. En muchas ocasiones una clase Java no tiene un mtodo destructor,
pero si fuera necesario hacerlopodras implementar un mtodo destructor en una clase Java?
Qu nombre habra que ponerle?
S es posible. El nombre del mtodo sera finalize().
No es posible disponer de un mtodo destructor en una clase Java.
S es posible. El nombre del mtodo sera destructor ().
S es posible. El nombre del mtodo sera ~nombreClase, como en el lenguaje C

49

Desarrollodeclases

DAW

8.Introduccinalaherencia.
CASO PRCTICO.
Mara y Juan ya han implementado algunos objetos con atributos y mtodos tanto de objeto como de
clase (estticos), les han incluido constructores y los han utilizado desde otros objetos. Se consideran
relativamente competentes para empezar a desarrollar pequeas aplicaciones basadas en la
metodologa de la Programacin Orientada a Objetos. Ada sigue muy satisfecha con estos avances
y los ha felicitado por su esfuerzo. Pero tambin les ha dicho lo siguiente:
Perfecto, ya sabis trabajar con clases y con objetos, y cmo utilizar sus mtodos, sus atributos y
sus constructores. Sois capaces de trabajar con la sobrecarga y conocis conceptos tales como
encapsulacin, visibilidad u ocultacin de informacin. An nos quedan por ver algunos conceptos
ms dentro de la Programacin Orientada a Objetos. Los iremos viendo poco a poco Por ejemplo,
habis odo hablar alguna vez sobre la herencia?

La herencia es uno de los conceptos


fundamentales
que
introduce
la
programacin orientada a objetos. La idea
fundamental es permitir crear nuevas clases
aprovechando las caractersticas (atributos y
mtodos)deotrasclasesyacreadasevitando
as tener que volver a definir esas
caractersticas(reutilizacin).
A una clase que hereda de otra se le llama
subclase o clase hija y aquella de la que se
heredaesconocidacomosuperclaseoclase
padre. Tambin se puede hablar en general de clases descendientes o clases ascendientes. Al
heredar, la subclase adquiere todas las caractersticas (atributos y mtodos) de su superclase,
aunque algunas de ellas pueden ser sobrescritas o modificadas dentro de la subclase (a eso se le
suelellamarespecializacin).
Unaclasepuedeheredardeotraqueasuvezhapodidoheredardeunatercerayassucesivamente.
Estosignificaquelasclasesvantomandotodaslascaractersticasdesusclasesascendientes(noslo
de su superclase o clase padre inmediata) a lo largo de toda la rama del rbol de la jerarqua de
clasesenlaqueseencuentre.
Imaginaquequieresmodelarelfuncionamientodealgunosvehculosparatrabajarconellosenun
programa de simulacin. Lo primero que haces es pensar en una clase Vehculo que tendr un
conjuntodeatributos(porejemplo:posicinactual,velocidadactualyvelocidadmximaquepuede
alcanzar el vehculo) y de mtodos (por ejemplo: detener, acelerar, frenar, establecerDireccin,
establecersentido).
Dado que vas a trabajar con muchos tipos de vehculos, no tendrs suficiente con esas
caractersticas, as que seguramente vas a necesitar nuevas clases que las incorporen. Pero las
caractersticas bsicas que has definido en la clase Vehculo van a ser compartidas por cualquier
nuevo vehculo que vayas a modelar. Esto significa que si creas otra clase podras heredar de
Vehculotodasesosatributosypropiedadesytansolotendrasqueaadirlasnuevas.
Si vas a trabajar con vehculos que se desplazan por tierra, agua y aire, tendrs que idear nuevas
clases con caractersticas adicionales. Por ejemplo, podras crear una clase VehiculoTerrestre, que
herede las caractersticas de Vehculo, pero que tambin incorpore atributos como el nmero de

50

DesarrollodeAplicacionesWeb

Tema5

ruedas o la altura de los bajos). A su vez, podra idearse una nueva clase que herede de
VehiculoTerrestreyqueincorporenuevosatributosymtodoscomo,porejemplo,unaclaseCoche.
Y as sucesivamente con toda la jerarqua de clases heredadas que consideres oportunas para
representarlomejorposibleelentornoylainformacinsobrelaquevanatrabajartusprogramas.

8.1Creacinyutilizacindeclasesheredadas.
CmoseindicaenJavaqueunaclaseheredadeotra?Paraindicarqueunaclaseheredadeotraes
necesarioutilizarlapalabrareservadaextendsjuntoconelnombredelaclasedelaquesequieren
heredarsuscaractersticas:
class<NombreClase> extends <nombreSuperClase> {
...
}

Enelejemploanteriordelosvehculos,laclaseVehiculoTerrestrepodraquedarasalserdeclarada:
class VehiculoTerrestre extends Vehculo {
...
}

YenelcasodelaclaseCoche:
class Coche extends VehculoTerrestre {
...
}

En unidades posteriores estudiars detalladamente cmo crear una jerarqua de clases y qu


relacin existe entre la herencia y los distintos modificadores de clases, atributos y mtodos. Por
ahoraessuficienteconqueentiendaselconceptodeherenciaysepasreconocercundounaclase
heredadeotra(usodelapalabrareservadaextends).
Puedes comprobar que en las bibliotecas proporcionadas por Java aparecen jerarquas bastante
complejasdeclasesheredadasenlascualessehanidoaprovechandocadaunodelosmiembrosde
unaclasebaseparairconstruyendolasdistintasclasesderivadasaadiendo(yavecesmodificando)
pocoapoconuevafuncionalidad.
Esosuelesucederencualquierproyectodesoftwareconformesevanaanalizando,descomponiendo
y modelando los datos con los que hay que trabajar. La idea es poder representar de una manera
eficiente toda la informacin que es manipulada por el sistema que se desea automatizar. Una
jerarquadeclasessueleserunabuenaformadehacerlo.
EnelcasodeJava,cualquierclaseconlaquetrabajestendrunascendiente.Sienladeclaracinde
clasenoindicaslaclasedelaquesehereda(noseincluye unextends),el compiladorconsiderar
automticamente que se hereda de la clase Object, que es la clase que se encuentra en el nivel
superiordetodalajerarquadeclasesenJava(yqueeslanicaquenoheredadenadie).
TambinirsviendoalestudiardistintoscomponentesdelasbibliotecasdeJava(porejemploenel
caso de las interfaces grficas) que para poder crear objetos basados en las clases proporcionadas
poresasbibliotecastendrsquecreartuspropiasclasesqueheredendealgunasdeesasclases.Para
ellostendrsquehacerusodelapalabrareservadaextends.
EnJavatodaslasclasessondescendientes(demaneraexplcitaoimplcita)delaclaseObject.

AUTOEVALUACIN.
De qu objeto hereda cualquier clase en Java?

51

Desarrollodeclases

Exception
Object
Element
Ninguno de los anteriores

52

DAW

DesarrollodeAplicacionesWeb

Tema5

9.Empaquetadodeclases.
CASO PRCTICO.
Mara y Juan ya han terminado por ahora de escribir todas las clases que haban diseado.
Es el momento de organizar adecuadamente todo el cdigo que tienen implementado a lo largo de
todas esas clases. Mara recuerda que hace algunos das Juan ya le habl de la posibilidad de
organizar las clases en paquetes:
Este sera un buen momento para poner en prctica todo aquello que me enseaste sobre los
paquetes, no?
La verdad es que tienes razn. Esto hay que organizarlo un poco Le contesta Juan.

La encapsulacin de la informacin dentro de las clases ha permitido llevar a cabo el proceso de


ocultacin,queesfundamentalparaeltrabajoconclasesyobjetos.Esposiblequeconformevaya
aumentando la complejidad de tus aplicaciones necesites que algunas de tus clases puedan tener
accesoapartedelaimplementacindeotrasdebidoalasrelacionesqueseestablezcanentreellasa
la hora de disear tu modelo de datos. En estos casos se puede hablar de un nivel superior de
encapsulamientoyocultacinconocidocomoempaquetado.
Un paquete consiste en un conjunto de clases relacionadas entre s y agrupadas bajo un mismo
nombre.Normalmenteseencuentran enunmismopaquete todasaquellasclasesqueformanuna
bibliotecaoquerenenalgntipodecaractersticaencomn.Estolaorganizacindelasclasespara
luegolocalizarfcilmenteaquellasquevayasnecesitando.

9.1Jerarquadepaquetes.
Los paquetes en Java pueden organizarse jerrquicamente de manera similar a lo que puedes
encontrarenlaestructuradecarpetasenundispositivodealmacenamiento,donde:
9 Lasclasesserancomolosarchivos.
9 Cadapaqueteseracomounacarpetaquecontienearchivos(clases).
9 Cada paquete puede adems contener otros paquetes (como las carpetas que contienen
carpetas).
9 Parapoderhacerreferenciaaunaclasedentrodeunaestructuradepaquetes,habrqueindicar
la trayectoria completa desde el paquete raz de la jerarqua hasta el paquete en el que se
encuentra la clase, indicando por ltimo el nombre de la clase (como el path absoluto de un
archivo).
La estructura de paquetes en Java permite organizar y clasificar las clases, evitando conflictos de
nombresyfacilitandolaubicacindeunaclasedentrodeunaestructurajerrquica.
Porotrolado,laorganizacinenpaquetespermitetambinelcontroldeaccesoamiembrosdelas
clases desde otras clases que estn en el mismo paquete gracias a los modificadores de acceso
(recuerdaqueunodelosmodificadoresquevisteeraprecisamenteeldepaquete).
LasclasesqueformanpartedelajerarquadeclasesdeJavaseencuentranorganizadasendiversos
paquetes.
Todas las clases proporcionadas por Java en sus bibliotecas son
miembros de distintos paquetes y se encuentran organizadas
jerrquicamente.Dentrodecadapaquetehabrunconjuntode
clasesconalgntipoderelacinentreellas.Sedicequetodoese
conjunto de paquetes forman la API de Java. Por ejemplo las

53

Desarrollodeclases

DAW

clases bsicas del lenguaje se encuentran en el paquete java.lang, las clases de entrada/salida las
podrs encontrar en el paquete java.io y en el paquete java.math podrs observar algunas clases
paratrabajarconnmerosgrandesydegranprecisin.
RECOMENDACIN.
En la unidad dedicada a la utilizacin de objetos, se hizo una descripcin general de los paquetes
ms importantes ofrecidos por el lenguaje Java. Puede ser un buen momento para volver a echarles
un vistazo.

PARASABERMS.
Puedes echar un vistazo a toda la jerarqua de paquetes de la API de Java en la
documentacinoficialdeOracle(eningls):
http://docs.oracle.com/javase/7/docs/api/index.html

9.2Utilizacindelospaquetes.
Esposibleaccederacualquierclasedecualquierpaquete(siemprequeesepaqueteestdisponible
en nuestro sistema, obviamente) mediante la calificacin completa de la clase dentro de la
estructura jerrquica de paquete. Es decir indicando la trayectoria completa de paquetes desde el
paquete raz hasta la propia clase. Eso se puede hacer utilizando el operador punto (.) para
especificarcadasubpaquete:
paquete_raiz.subpaquete1.subpaquete2. .subpaquete_n.NombreClase

Porejemplo:java.lang.String.
En este caso se est haciendo referencia a la clase String que se encuentra dentro del paquete
java.lang.EstepaquetecontienelasclaseselementalesparapoderdesarrollarunaaplicacinJava.
Otroejemplopodraser:java.util.regex.Patern.
En este otro caso se hace referencia a la clase Patern ubicada en el paquete java.util.regex, que
contieneclasesparatrabajarconexpresionesregulares.
Dado que puede resultar bastante tedioso tener que escribir la trayectoria completa de una clase
cadavezquesequierautilizar,existelaposibilidaddeindicarquesedeseatrabajarconlasclasesde
unoovariospaquetes.Deesamaneracuandosevayaautilizarunaclasequepertenezcaaunode
esospaquetesnosernecesarioindicartodasutrayectoria.Paraelloseutilizalasentenciaimport
(importar):
import paquete_raiz.subpaquete1.subpaquete2. .subpaquete_n.NombreClase;

De esta manera a partir de ese momento podr utilizarse directamente NombreClase en lugar de
todasutrayectoriacompleta.
Losejemplosanterioresquedaranentonces:
import java.lang.String;
import java.util.regex.Patern;

Sisuponemosquevamosautilizarvariasclasesdeunmismopaquete,enlugardehacerunimport
de cada una de ellas, podemos utilizar el comodn (smbolo asterisco: *) para indicar que
queremosimportartodaslasclasesdeesepaqueteynoslounadeterminada:
import java.lang.*;
import java.util.regex.*;

54

DesarrollodeAplicacionesWeb

Tema5

Siunpaquetecontienesubpaquetes,elcomodnnoimportarlasclasesdelossubpaquetes,tansolo
lasquehayaenelpaquete.Laimportacindelasclasescontenidasenlossubpaqueteshabrque
indicarlaexplcitamente.Porejemplo:
import java.util.*;
import java.util.regex.*;

Enestecasoseimportarntodaslasclasesdelpaquetejava.util(clasesDate,Calendar,Timer,etc.)y
de su subpaquete java.util.regex (Matcher y Pattern), pero las de otros subpaquetes como
java.util.concurrentojava.util.jar.
Por ltimo tan solo indicar que en el caso del paquete java.lang, no es necesario realizar
importacin. El compilador, dada la importancia de este paquete, permite el uso de sus clases sin
necesidad de indicar su trayectoria (es como si todo archivo Java incluyera en su primera lnea la
sentenciaimportjava.lang.*).

AUTOEVALUACIN.
La sentencia import nos facilita las cosas a la hora de especificar las clases que queremos
utilizar en nuestro archivo Java. Con el uso del comodn (asterisco) podemos importar todas
las clases y subpaquetes que se encuentran en un determinado paquete a travs de una sola
sentencia import.
Verdadero
Falso

9.3Inclusindeunaclaseenunpaquete.
Al principio de cada archivo .java se puede indicar a qu paquete pertenece mediante la
palabrareservadapackage seguida del nombre del paquete:
package nombre_paquete;

Porejemplo:
package paqueteEjemplo;
class claseEjemplo {

Lasentenciapackagedebeserincluidaencadaarchivofuentedecadaclasequequierasincluirese
paquete.Sienunarchivofuentehaydefinidasmsdeunaclase,todasesasclasesformarnpartedel
paqueteindicadoenlasentenciapackage.
Si al comienzo de un archivo Java no se incluyen ninguna sentencia package, el compilador
considerar que lasclases de ese archivo formarn parte del paquete por omisin (un paquete sin
nombreasociadoalproyecto).
Para evitar la ambigedad, dentro de un mismo paquete no puede haber dos clases con el mismo
nombre,aunque s pueden existir clases con el mismo nombre si estn en paquetes diferentes. El
compiladorsercapazdedistinguirunaclasedeotragraciasaquepertenecenapaquetesdistintos.
Como ya has visto en unidades anteriores, el nombre de un archivo fuente en Java se construye
utilizando elnombre de la clase pblica que contiene junto con la extensin .java, pudiendo haber
nicamente una clasepblica por cada archivo fuente. El nombre de la clase deba coincidir (en
maysculasyminsculas)exactamenteconelnombredelarchivoenelqueseencontrabadefinida.

55

Desarrollodeclases

DAW

As,siporejemplotenasunaclasePuntodentrodeunarchivoPunto.java,lacompilacindaralugar
aunarchivoPunto.class.
Enelcasodelospaquetes,lacorrespondenciaesaniveldedirectoriosocarpetas.Esdecir,silaclase
Puntoseencuentradentrodelpaqueteprog.figuras,elarchivoPunto.javadeberaencontrarseenla
carpetaprog\figuras. Para que esto funcione correctamente el compilador ha de ser capaz de
localizartodoslospaquetes(tantolosestndardeJavacomolosdefinidosporotrosprogramadores).
Es decir, que el compiladordebe tener conocimiento de dnde comienza la estructura de carpetas
definidaporlospaquetesyenlacualseencuentranlasclases.ParaelloseutilizaelClassPathcuyo
funcionamientohabrsestudiadoenlasprimerasunidadesdeestemdulo.Setratadeunavariable
deentornoquecontienetodaslasrutasenlasquecomienzanlasestructurasdedirectorios(distintas
jerarquasposiblesdepaquetes)enlasqueestncontenidaslasclases.

9.4Procesodecreacindeunpaquete.
ParacrearunpaqueteenJavaterecomendamosseguirlossiguientespasos:
1. Ponerunnombrealpaquete.SueleserhabitualutilizareldominiodeInternetdelaempresa
que hacreado el paquete. Por ejemplo, para el caso de miempresa.com, podra utilizarse un
nombredepaquetecom.miempresa.
2. Crear una estructura jerrquica de carpetas equivalente a la estructura de subpaquetes. La
rutadelarazdeesaestructurajerrquicadeberestarespecificadaenelClassPathdeJava.
3. Especificaraqupaquetepertenecenlaclase(oclases)deelarchivo.javamedianteelusode
lasentenciapackagetalycomohasvistoenelapartadoanterior.
Este proceso ya lo has debido de llevar a cabo en unidades anteriores al compilar y ejecutarclases
conpaquetes.Estospasossimplementesonparaquetesirvancomorecordatoriodelprocedimiento
quedebesseguiraalahoradeclasificar,jerarquizaryutilizartuspropiasclases.

56

TEMA6

INDICE
1.Introduccin.......................................................................................................................................4
1.1.Excepciones.................................................................................................................................................4

2.Conceptodeflujo...............................................................................................................................6
Sockets..............................................................................................................................................................................6
Quesunsocket?..............................................................................................................................................................................6
Tiposdesocket..................................................................................................................................................................................6
ClaseSocket.......................................................................................................................................................................................7
ServiciosdelaclaseSocket................................................................................................................................................................7
ClaseServerSocket.............................................................................................................................................................................7
ServiciosdelaclaseServerSocket......................................................................................................................................................7
Comunicacinentreclienteservidor.................................................................................................................................................8
ClaseDatagramSocket.......................................................................................................................................................................8
ServiciosdelaclaseDatagramSocket................................................................................................................................................8
ClaseDatagramPacket.......................................................................................................................................................................8

Threads..............................................................................................................................................................................9
Quesunthread?............................................................................................................................................................................9
Quganamos?.................................................................................................................................................................................9
AtributosdeunthreadenJAVA.........................................................................................................................................................9
ClaseThread......................................................................................................................................................................................9
ServiciosdelaclaseThread.............................................................................................................................................................10
EstadosdeunThread......................................................................................................................................................................10
Sincronizacin..................................................................................................................................................................................10

Ejemplo:Unchat..............................................................................................................................................................11
Servidor.java....................................................................................................................................................................................11
Flujo.java.........................................................................................................................................................................................11
Cliente.java......................................................................................................................................................................................12

3.Clasesrelativasaflujos....................................................................................................................14
3.1.Ejemplocomentadodeunaclaseconflujos.............................................................................................15

4.Flujos................................................................................................................................................16
4.1.Flujospredefinidos.Entradaysalidaestndar.........................................................................................16
4.2.Flujospredefinidos.Entradaysalidaestndar.Ejemplo..........................................................................17
4.3.Flujosbasadosenbytes............................................................................................................................18
4.4.Flujosbasadosencaracteres....................................................................................................................19
4.5.Rutasdelosficheros.................................................................................................................................20

5.Trabajandoconficheros...................................................................................................................21
5.1.Escrituraylecturadeinformacinenficheros.........................................................................................21
5.2.Ficherosbinariosyficherosdetexto(I)....................................................................................................22
5.2.1.Ficherosbinariosyficherosdetexto(II)..............................................................................................................23

5.3.Modosdeacceso.Registros......................................................................................................................25
5.4.Accesosecuencial.....................................................................................................................................25
5.5.Accesoaleatorio........................................................................................................................................27

6.Aplicacionesdelalmacenamientodeinformacinenficheros.......................................................29
7.Utilizacindelossistemasdeficheros............................................................................................30
7.1.ClaseFile...................................................................................................................................................30
7.2.InterfaceFilenameFilter............................................................................................................................31
7.3.Creacinyeliminacindeficherosydirectorios......................................................................................32

8.Almacenamientodeobjetosenficheros.Persistencia.Serializacin..............................................34
8.1.Serializacin:utilidad................................................................................................................................34

Almacenandodatos

DAW

DesarrollodeAplicacionesWeb

Tema6

Almacenandodatos.
Caso prctico
Ada est repasando los requisitos de la aplicacin informtica que estn desarrollando para la clnica
veterinaria.
En particular, ahora mismo se est centrando en estudiar las necesidades respecto al
almacenamiento de datos. Ada piensa que hay ciertas partes de la aplicacin que no necesitan una
base de datos para guardar los datos, y sera suficiente con emplear ficheros. Por ejemplo, para
guardar datos de configuracin de la aplicacin.
Tras repasar, se rene con Mara y Juan para planificar adecuadamente el tema de los ficheros que
van a usar en la aplicacin, ya que es un asunto muy importante, que no deben dejar aparcado por
ms tiempo.
Precisamente Antonio, que cada vez est ms entusiasmado con la idea de estudiar algn ciclo, de
momento, est matriculado y cursando el mdulo de Programacin, y est repasando para el examen
que tiene la semana que viene, uno de los temas que le "cae" es precisamente el de almacenamiento
de informacin en ficheros.

Almacenandodatos

DAW

1.Introduccin.
Cuandodesarrollasprogramas,enlamayoradeelloslosusuariospuedenpedirlealaaplicacinque
realicecosasypuedasuministrarledatosconlosquesequierehaceralgo.Unavezintroducidoslos
datos y las rdenes, se espera que el programa manipule de alguna forma esos datos, para
proporcionarunarespuestaalosolicitado.

Adems, normalmente interesa que el programa guarde los datos que se le han introducido, de
formaquesielprogramatermina,losdatosnosepierdanypuedanserrecuperadosenunasesin
posterior. La forma ms normal de hacer esto es mediante la utilizacin de ficheros, que se
guardarnenundispositivodememorianovoltil(normalmenteundisco).

Portanto,sabemosqueelalmacenamientoenvariablesovectores(arrays)estemporal,losdatosse
pierden en las variables cuando estn fuera de su mbito o cuando el programa termina. Las
computadorasutilizanficherosparaguardarlosdatos,inclusodespusdequeelprogramatermine
suejecucin.Sesueledenominaralosdatosqueseguardanenficherosdatospersistentes,porque
existen,persistenmsalldelaejecucindelaaplicacin.Losordenadoresalmacenanlosficheros
enunidadesdealmacenamientosecundariocomodiscosduros,discospticos,etc.Enestaunidad
veremoscmohacerconJavaestasoperacionesdecrear,actualizaryprocesarficheros.

Atodasestasoperaciones,queconstituyenunflujodeinformacindelprogramaconelexterior,se
lesconocecomoEntrada/Salida(E/S).

Distinguimos dos tipos de E/S: la E/S estndar que se realiza con el terminal del usuario y la E/S a
travsdeficheros,enlaquesetrabajaconficherosdedisco.

TodaslasoperacionesdeE/SenJavavienenproporcionadasporelpaqueteestndardelAPIdeJava
denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de
ficheros.

El contenido de un archivo puede interpretarse como campos y registros (grupos de campos),


dndoleunsignificadoalconjuntodebitsqueenrealidadposee.

Parasaberms
A continuacin puedes ampliar tusconocimientos sobre Entrada y Salida en general, enel
mundodelainformtica.Versqueesunbastotemaloqueabarca.
EntradaySalida.

http://exa.unne.edu.ar/depar/areas/informatica/SistemasOperativos/SO5.htm

1.1.Excepciones.
Cuando se trabaja con archivos, es normal que pueda haber errores, por ejemplo: podramos
intentar leer un archivo que no existe, o podramos intentar escribir en un archivo para el que no
tenemospermisosdeescritura.Paramanejartodosestoserroresdebemosutilizarexcepciones.Las
dosexcepcionesmscomunesalmanejararchivosson:
9 FileNotFoundException:Sinosepuedeencontrarelarchivo.
9 IOException:Sinosetienenpermisosdelecturaoescrituraosielarchivoestdaado.
Unesquemabsicodeusodelacapturaytratamientodeexcepcionesenunprograma,podraser
este,importandoelpaquetejava.io.IOException:
importjava.io.IOException;
// ...
public static void main(String[] args) {

DesarrollodeAplicacionesWeb

Tema6

try {
// Se ejecuta algo que puede producir una excepcin
} catch (FileNotFoundException e) {
// manejo de una excepcin por no encontrar un archivo
} catch (IOException e) {
// manejo de una excepcin de entrada/salida
} catch (Exception e) {
// manejo de una excepcin cualquiera
} finally {
// cdigo a ejecutar haya o no excepcin
}
}

Seala la opcin correcta:


Java no ofrece soporte para excepciones.
Un campo y un archivo es lo mismo.
Si se intenta abrir un archivo que no existe, entonces saltar una excepcin.
Ninguna es correcta.

EnelsiguienteenlacehayunmanualmuyinteresantedeJava.Puedesconsultardesdeel
ndice,msinformacinsobrelasexcepcionesenJava.
ExcepcionesenJava.http://www.webtaller.com/manual-java/indice_manual_java.php

Almacenandodatos

DAW

2.Conceptodeflujo.
Caso prctico
Antonio est estudiando un poco antes de irse a dormir. Se ha tomado un vaso de leche con cacao y
est repasando el concepto de flujo. Entenderlo al principio, cuando lo estudi por primera vez, le
cost un poco, pero ya lo entiende a la perfeccin y piensa que si le sale alguna pregunta en el
examen de la semana que viene, sobre esto, seguro que la va a acertar.

LaclaseStreamrepresentaunflujoocorrientededatos,
es decir, un conjunto secuencial de bytes, como puede
ser un archivo, un dispositivo de entrada/salida (en
adelante E/S), memoria, un conector TCP/IP (Protocolo
deControldeTransmisin/ProtocolodeInternet),etc.
CualquierprogramarealizadoenJavaquenecesitellevar
a cabo una operacin de entrada salida lo har a travs
deunstream.

Un flujo es una abstraccin de aquello que produzca o


consumainformacin.Esunaentidadlgica.

Las clases y mtodos de E/S que necesitamos emplear son las mismas independientemente del
dispositivoconelqueestemosactuando,luego,elncleodeJava,sabrsitienequetratarconel
teclado, el monitor, un sistema de archivos o un socket de red liberando al programador de tener
quesaberconquinestinteractuando.
LavinculacindeunflujoaldispositivofsicolahaceelsistemadeentradaysalidadeJava.

En resumen, ser el flujo el que tenga que comunicarse con el sistema operativo concreto y
"entendrselas"conl.Deestamanera,notenemosquecambiarabsolutamentenadaennuestra
aplicacin,quevaaserindependientetantodelosdispositivosfsicosdealmacenamientocomodel
sistemaoperativosobreelqueseejecuta.Estoesprimordialenunlenguajemultiplataformaytan
altamenteportablecomoJava.

Seala la opcin correcta:


La clase Stream puede representar, al instanciarse, a un archivo.
Si programamos en Java, hay que tener en cuenta el sistema operativo cuando tratemos
con flujos, pues vara su tratamiento debido a la diferencia de plataformas.
La clase keyboard es la clase a utilizar al leer flujos de teclado.
La vinculacin de un flujo al dispositivo fsico la hace el hardware de la mquina.
Parasaberms
EnlasiguientepresentacinpuedesaprendermssobresocketsenJava.
Sockets
Quesunsocket?
9 Definicin: Un socket es un punto final de un enlace de comunicacin de dos vas entre dos
programasqueseejecutanatravsdelared.
9 Elclienteyelservidordebenponersedeacuerdosobreelprotocoloqueutilizarn.

Tiposdesocket
Haydostiposdesocket:
9 Orientadoaconexin:

DesarrollodeAplicacionesWeb

Tema6

Estableceuncaminovirtualentreservidorycliente,fiable,sinprdidasdeinformacinni
duplicados,lainformacinllegaenelmismoordenqueseenva.
Elclienteabreunasesinenelservidoryesteguardaunestadodelcliente.
ElclienteutilizalaclaseSocket
ElservidorutilizalaclaseServerSocket
9 Noorientadoaconexin:
Envodedatagramasdetamaofijo.Noesfiable,puedehaberprdidasdeinformaciny
duplicados,ylainformacinpuedellegarendistintoordendelqueseenva.
Noseguardaningnestadodelclienteenelservidor,porello,esmstoleranteafallosdel
sistema.
TantoelclientecomoelservidorutilizanlaclaseDatagramSocket.
Todasestasclases(Socket,ServerSocketyDatagramSocket)seencuentranenelpaquetejava.net

ClaseSocket
9 Constructores:
publicSocket()
publicSocket(InetAddressaddress,intport)
publicSocket(Stringhost,intport)
publicSocket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)
publicSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)
address/localAddr:direccinIPdelamquinaremota/local.
port/localPort:puertodelamquinaremota/local.
host:nombredelamquinaremota
Enelcasodelprimerconstructorcreaunsocketsinconexin.

ServiciosdelaclaseSocket
9 publicInetAddressgetInetAddress():
DevuelveladireccinIPdelamquinaenlaqueestamosconectados.
9 publicintgetPort():
Devuelveelpuertodelamquinaremota.
9 publicvoidclose()
Cierraelcanaldecomunicacin.
9 publicInputStreamgetInputStream():
Devuelveelcanaldelecturadelsocket.
9 publicOutputStreamgetOutputStream():
Devuelveelcanaldeescrituradelsocket.
Ademas JAVA proporciona dos llamadas para saber la @IP y puerto local (getLocalAddress() y
getLocalPort())

ClaseServerSocket
9 Constructores:
publicServerSocket(intport)
publicServerSocket(intport,intbacklog)
publicServerSocket(intport,intbacklog,InetAddressbindAddr)
port:puertodelamquinaservidora.
backlog:tamaodelacoladeespera,enelprimeroes50.
bindAddr:direccinIPlocalqueseharpblicamedianteelbind.
9 ElconstructorServerSocketseencargadehacerelbindyellisten.

ServiciosdelaclaseServerSocket
9 publicSocketaccept():

Almacenandodatos

DAW

Devuelve el socket resultado de aceptar una peticin, para llevar a cabo la comunicacin
conelcliente.
9 publicvoidclose()
Cierraelcanaldecomunicacin.
9 publicInetAddressgetInetAddress():
DevuelveladireccinIPdelamquinalocal.
9 publicintgetLocalPort():
Devuelveelpuertodelamquinalocal.

Comunicacinentreclienteservidor
9 Para la transmisin de datos entre cliente y servidor se utilizarn las clases DataInputStream
(recibirdatos)yDataOutputStream(enviardatos)
9 Estasclasesdisponendemtodosparaleeryescribirdatosenelsocket:
read/writeBoolean
read/writeChar
read/writeDouble,read/writeFloat,read/writeInt,read/writeLong,read/writeShort
read/writeUTF(leer/escribircadenasdecaracteres)
9 Paraenviarlosdatosseutilizaelmtodoflush()delaclaseDataOutputStream.

ClaseDatagramSocket
9 Constructores:
publicDatagramSocket()
publicDatagramSocket(intport)
publicDatagramSocket(intport,InetAddressladdr)
port:puertodelamquina.
laddr:direccinIPlocalqueseharpblicamedianteelbind.
9 ElconstructorDatagramSocketseencargadehacerelbind.
9 Elprimerconstructorcogeunpuertolibre.

ServiciosdelaclaseDatagramSocket
publicvoidconnect(InetAddressaddress,intport):
Conectaelsocketalamquinaremotaconla@IPaddressypuertoport.
publicvoidclose()
Cierraelcanaldecomunicacin.
publicvoiddisconnect():
Desconectaelsocket.
publicInetAddressgetInetAddress():
Devuelvela@IPdelamquinaremota.
publicintgetPort():
Devuelveelpuertodelamquinaremota.
Tambinhaydosllamadasparasaberla@IPypuertolocal(getLocalAddress()ygetLocalPort()).
publicvoidsend(DatagramPacketp):
Envaundatagramaalamquinaremota,porelsocketasociado.
publicvoidreceive(DatagramPacketp):
Recibeundatagramadeotramquina,porelsocketasociado.

ClaseDatagramPacket
9 Constructores:
publicDatagramPacket(byte[]buff,intlength)
Construye un DatagramPacket para recibir paquetes en el buffer buff, de longitud
length

DesarrollodeAplicacionesWeb

Tema6

publicDatagramPacket(byte[]buff,intlength,InetAddressaddress,intport)
Construye un DatagramPacket para envar paquetes con datos del buffer buff, de
longitudlength,ala@IPaddressyelpuertoport.
9 Servicios:
Para la actualizacin y consulta de los diferentes campos de un DatagramPacket
disponemos de los siguientes mtodos: set/getAddress, set/getData, set/getLength,
set/getPort

Threads
Quesunthread?
9 Definicin:Unthreadesunflujosecuencialdecontroldentrodeunprograma.
9 Estdefinidoporuncontadordeprograma(PC)yunpunteroalapila(SP)
9 Unthreadnopuedeejecutarseporsmismo,hadehacerlodentrodeunprograma.
9 Todoslosthreadsdeunprocesocompartenlosrecursos(Ej:canalesE/S,memoria,...)

Quganamos?
9 Conseguimosconcurrenciaentreprocesosytambindentrodeunmismoproceso.
9 Tambinpodemosconseguirparalelismosidisponemosdeunaarquitecturamultiprocesador.
9 Elcambiodecontextoentrethreadsnoestancostosoalsistemacomoelcambiodecontexto
entreprocesos.

AtributosdeunthreadenJAVA
9 Unthreadtiene:
Nombre
Prioridad
Hadeseguirlasiguienterelacin:
MIN_PRIORITY<=Prioridad<=MAX_PRIORITY
LaprioridadpordefectoesNORM_PRIORITY
Valores:
MIN_PRIORITY=1
NORM_PRIORITY=5
MAX_PRIORITY=10

ClaseThread
9 Constructores:
publicThread()
Creaunthreadestndar.
publicThread(Runnabletarget)
CreaunthreadenbaseaunaclasequeimplementalainterfazRunnable.
publicThread(Runnabletarget,Stringname)
Equivalentealanteriorconstructordndoleelnombrenamealthread.
publicThread(Stringname)
Creaunthreadestndarconelnombrename.
publicThread(ThreadGroupgroup,Runnabletarget)
Crea un thread en base a una clase que implementa la interfaz Runnable dentro del
ThreadGroup.
publicThread(ThreadGroupgroup,Runnabletarget,Stringname)
Equivalentealanteriorconstructordndoleelnombrenamealthread.
publicThread(ThreadGroupgroup,Stringname)
CreaunthreadestndarconelnombrenamedentrodelThreadGroup

Almacenand
dodatos

DAW

9 Cuando
osecreaunthreadnoseeponeenmarcha,selohemosdeindicarexplcittamente.
9 UnThrreadGroupesunconjunttodethreadss,loscualestienenaccessoainformacinentreellos.

Serviciosde
elaclaseThrread
9 publicSStringgetNam
me():
Deevuelveelno
ombrequeid
dentificaaltthread.
9 publicStringsetName(Stringn
name):
Caambiaelnom
mbredelthreead.
9 publicintgetPriorityy()
Deevuelvelaprrioridaddeltthread.
9 publicvoidsetPriorrity(intnewP
Priority)
oridaddelthread
Caambialaprio
9 publicTThreadGroup
pgetThreadG
Group():
Deevuelveelgrrupodedond
deprocedeeelthread.
9 voidrun()
Esselmtodoq
queejecutarrunthreadcuandoeste
esepongaen
nmarcha.
9 voidstaart()
Inicialaejecuccindelthreead.
9 voidjoin()
Essperaaqueu
unthreadterminesuejeecucin.
Po
odemosespeecificareltieempodeespeeramximo..
9 voidsleeep(longmiliis)
Bloqueaelthrreadmilismilisegundos.
Haayotroparmetroquep
permiteafinaarmseltiem
mpodebloqueoennano
osegundos.
9 voidstop/destroy())
Deestruyeelthreadsinelim
minarestructturas,estoestareadelm
mtodojoin.
9 staticThreadcurren
ntThread()
Deevuelveelth
hreadqueseestejecutaandoactualm
mente.
9 booleaanisAlive()
Mirasiunthre
M
eadnohaterminadosueejecucin
9 staticvoidyield()
mbiodeconttextoentrefflujos.
Prrovocaelcam

EstadosdeunThread

Sincronizaccin
Aqu se preesenta el pro
oblema de que
q varios th
hreads inten
nten accederr a los mismos datos y que
q el
resultadofinalseaincorrrecto.
9 Por ejeemplo: Acceeso a una vaariable global x con vallor inicial 0,, y dos threeads que inttentan
increm
mentarsuvalorenunaun
nidad.
9 Silosthreadsnoesstnsincronizadosunreesultadoposiibleseraquelavariablextengaelvvalor1
(incorrrecto)

10

DesarrollodeAplicacionesWeb

Tema6

9 Solucin: Para resolver el problema anterior se utiliza la etiqueta synchronized junto con el
objetoquesequieresincronizar.
Enelcasoanteriorsesolucionaradelasiguienteforma:
synchronized(this){x++;}
thiseslaclasequecontienelavariableglobal
Conestosegarantizaelaccesoenexclusinmutua.
9 Siqueremosaccederaunmtodoenexclusinmutuatenemoslassiguientesopciones:
Igualqueelejemploanterior:
synchronized(this){this.incrementar()}
Declarandoelmtodocomosincronizado:
synchronizedvoidincrementar()
Tambinsepuedensincronizarvariosthreadsmediantelosmtodos:wait(),notify()y
notifyAll()

Ejemplo:Unchat
Servidor.java
import java.io.*;
import java.net.*;
importjava.util.*;
public class Servidor extends Thread{
public static Vector usuarios = new Vector();
public static void main (String args[]){
ServerSocket sfd = null;
try{
sfd = new ServerSocket(7000);
}catch (IOException ioe){
System.out.println("Comunicacin rechazada."+ioe);
System.exit(1);
}while (true){
try{
Socket nsfd = sfd.accept();
System.out.println("Conexion aceptada de: "+nsfd.getInetAddress());
Flujoflujo = new Flujo(nsfd);
Thread t = new Thread(flujo);
t.start();
}catch(IOException ioe){
System.out.println("Error: "+ioe);
}
}
}
}

Flujo.java
import java.net.*;
import java.io.*;
importjava.util.*;
public class Flujo extends Thread{
Socket nsfd;
DataInputStreamFlujoLectura;
DataOutputStreamFlujoEscritura;
publicFlujo (Socket sfd){
nsfd = sfd;
try{
Flujo Lectura = new DataInputStream(new BufferedInputStream(sfd.getInputStream()));
Flujo
Escritura
=
new
DataOutputStream(new
BufferedOutputStream(sfd.getOutputStream()));
}catch(IOExceptionioe){
System.out.println("IOException(Flujo): "+ioe);
}
}
publicvoidrun(){
broadcast(nsfd.getInetAddress()+> se ha conectado");
Servidor.usuarios.add ((Object) this);
while(true){
try{
String linea = FlujoLectura.readUTF();

11

Almacenandodatos

if (!linea.equals("")){
linea = nsfd.getInetAddress() +> + linea;
broadcast(linea);
}
}
catch(IOException ioe){
Servidor.usuarios.removeElement(this);
broadcast(nsfd.getInetAddress()+> se ha desconectado");
break;
}
}
}
public void broadcast(String mensaje){
synchronized (Servidor.usuarios){
Enumeration e = Servidor.usuarios.elements();
while (e.hasMoreElements()){
Flujo f = (Flujo) e.nextElement();
try{
synchronized(f.FlujoEscritura){
f.FlujoEscritura.writeUTF(mensaje);
f.FlujoEscritura.flush();
}
}
catch(IOException ioe){
System.out.println("Error: "+ioe);
}
}
}
}
}

Cliente.java
import java.io.*;
import java.net.*;
importjava.awt.*;
importjava.awt.event.*;
public class Cliente extends Frame implements ActionListener
{
static Socket sfd = null;
staticDataInputStream EntradaSocket;
staticDataOutputStream SalidaSocket;
staticTextField salida;
staticTextArea entrada;
String texto;
publicCliente()
{
setTitle("Chat");
setSize(350,200);
salida = new TextField(30);
salida.addActionListener(this);
entrada = new TextArea();
entrada.setEditable(false);
add("South",salida);
add("Center", entrada);
setVisible(true);
}
public static void main(String[] args){
Cliente cliente = new Cliente();
try
{
sfd = new Socket("192.168.0.1",7000);
EntradaSocket = new DataInputStream(new BufferedInputStream(sfd.getInputStream()));
SalidaSocket = new DataOutputStream(new BufferedOutputStream(sfd.getOutputStream()));
}
catch (UnknownHostExceptionuhe)
{
System.out.println("No se puede acceder al servidor.");
System.exit(1);
}
catch (IOException ioe)
{
System.out.println("Comunicacin rechazada.");

12

DAW

DesarrollodeAplicacionesWeb

Tema6

System.exit(1);
}
while (true)
{
try
{
String linea = EntradaSocket.readUTF();
entrada.append(linea+"\n");
}
catch(IOException ioe)
{
System.exit(1);
}
}
}
public void actionPerformed (ActionEvent e)
{
texto = salida.getText();
salida.setText("");
try
{
SalidaSocket.writeUTF(texto);
SalidaSocket.flush();
}
catch (IOException ioe)
{
System.out.println("Error: "+ioe);
}
}
publicbooleanhandleEvent(Event e)
{
if ((e.target == this) && (e.id == Event.WINDOW_DESTROY)){
if (sfd != null){
try{
sfd.close();
}catch (IOException ioe)
{
System.out.println("Error: "+ioe);
}
this.dispose();
}
}
return true;
}
}

13

Almacenandodatos

DAW

3.Clasesrelativasaflujos.
Caso prctico
Otro aspecto importante que Ada trata con Mara y Juan, acerca de los ficheros para la aplicacin de
la clnica, es el tipo de ficheros a usar. Es decir, deben estudiar si es conveniente utilizar ficheros
para almacenar datos en ficheros de texto, o si deben utilizar ficheros binarios. Mara comenta Quizs debemos usar los dos tipos de ficheros, depender de qu se vaya a guardar, -Juan le
contesta -tienes razn Mara, pero debemos pensar entonces cmo va el programa a leer y a escribir
la informacin, tendremos que utilizar las clases Java adecuadas segn los ficheros que decidamos
usar.

Existendostiposdeflujos,flujosdebytes(byte
streams)
y
flujos
de
caracteres
(characterstreams).
9

Los flujos de caracteres (16 bits) se usan


para manipular datos legibles por
humanos (por ejemplo un fichero de
texto). Vienen determinados por dos
clases abstractas: Reader y Writer.
Dichasclasesmanejanflujosdecaracteres
Unicode. De ellas derivan subclases
concretas que implementan los mtodos
definidosdestacadoslosmtodos read()
y write() que, en este caso, leen y
escriben
caracteres
de
datos
respectivamente.
9 Los flujos de bytes (8 bits) se usan para
manipulardatosbinarios,legiblessolopor
la maquina (por ejemplo un fichero de
programa). Su uso est orientado a la
lectura y escritura de datos binarios. El
tratamiento del flujo de bytes viene
determinadopordosclasesabstractasque
son InputStream y OutputStream.
Estas dos clases son las que definen los
mtodos que sus subclases tendrn implementados y, de entre todos, destacan read() y
write()queleenyescribenbytesdedatosrespectivamente.
Las clases del paquete java.io se pueden ver en la ilustracin. Destacamos las clases relativas a
flujos:

BufferedInputStream:permiteleerdatosatravsdeunflujoconunbufferintermedio.
BufferedOutputStream:implementalosmtodosparaescribirenunflujoatravsdeun

buffer.

FileInputStream:permiteleerbytesdeunfichero.
FileOutputStream:permiteescribirbytesenunficheroodescriptor.
StreamTokenizer:estaclaserecibeunflujodeentrada,loanaliza(parse)ydivideen

StringReader:esunflujodecaracterescuyafuenteesunacadenadecaracteresostring.
StringWriter:esunflujodecaracterescuyasalidaesunbufferdecadenadecaracteres,

diversospedazos(tokens),permitiendoleerunoencadamomento.

quepuedeutilizarseparaconstruirunstring.

14

DesarrollodeAplicacionesWeb

Tema6

Destacarquehayclasesquese"montan"sobreotrosflujosparamodificarlaformadetrabajarcon
ellos. Por ejemplo, con BufferedInputStream podemos aadir un buffer a un flujo
FileInputStream, de manera que se mejore la eficiencia de los accesos a los dispositivos en los
quesealmacenaelficheroconelqueconectaelflujo.

3.1.Ejemplocomentadodeunaclaseconflujos.
Vamosaverunejemploconunadelasclasescomentadas,enconcreto,conStreamTokenizer.
La clase StreamTokenizer obtiene un flujo de entrada y lo divide en "tokens". El flujo
tokenizerpuedereconoceridentificadores,nmerosyotrascadenas.
El ejemplo que puedes descargarte en el siguiente recurso, muestra cmo utilizar la clase
StreamTokenizer para contar nmeros y palabras de un fichero de texto. Se abre el flujo con
ayudadelaclase FileReader,ypuedesvercmose"monta"elflujo StreamTokenizersobreel
FileReader, es decir, que se construye el objeto StreamTokenizer con el flujo FileReader como
argumento,yentoncesseempiezaaiterarsobrel.
packagetokenizer;
importjava.io.FileNotFoundException;
importjava.io.FileReader;
importjava.io.IOException;
importjava.io.StreamTokenizer;

public class token {


public void contarPalabrasyNumeros(String nombre_fichero) {
StreamTokenizersTokenizer = null;
intcontapal = 0, numNumeros = 0;
try {
sTokenizer = new StreamTokenizer(new FileReader(nombre_fichero));
while (sTokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (sTokenizer.ttype == StreamTokenizer.TT_WORD)
contapal++;
else if (sTokenizer.ttype == StreamTokenizer.TT_NUMBER)
numNumeros++;
}
System.out.println("Nmero de palabras en el fichero: " + contapal);
System.out.println("Nmero de nmeros en el fichero: " + numNumeros);
} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage()) ;
} catch (IOException ex) {
System.out.println(ex.getMessage()) ;
}
}
/**
* @paramargs the command line arguments
*/
public static void main(String[] args) {
new Main().countWordsAndNumbers("c:\\datos.txt");
}
}

ElmtodonextTokendevuelveunintqueindicaeltipodetokenledo.Hayunaseriedeconstantes
definidasparadeterminareltipodetoken:
9
9
9
9

TT_WORDindicaqueeltokenesunapalabra.
TT_NUMBERindicaqueeltokenesunnmero.
TT_EOLindicaquesehaledoelfindelnea.
TT_EOFindicaquesehallegadoalfindelflujodeentrada.

15

Almacenandodatos

DAW

Enelcdigodelaclase,apreciamosqueseiterarhastallegaralfindelfichero.Paracadatoken,se
mirasutipo,ysegneltiposeincrementaelcontadordepalabrasodenmeros.

Indica si la siguiente afirmacin es verdadera o falsa.


Segn el sistema operativo que utilicemos, habr que utilizar un flujo u otro.
Verdadero.

Falso.

4.Flujos.
Caso prctico
Ana y Antonio salen de clase. Antonio ha quedado con una amiga y Ana va camino de casa
pensando en lo que le explicaron en clase hace unos das. Como se qued con dudas, tambin le
consult a Mara. En concreto, le asaltaban dudas sobre cmo leer y escribir datos por teclado en un
programa, y tambin varias dudas sobre lectura y escritura de informacin en ficheros. Mara le
solvent las dudas hablndole sobre el tema, pero an as, tena que probarlo tranquilamente en
casa, hacindose unos pequeos ejemplos, para comprobar toda la nueva informacin aprendida.
-Antes de irte, -dice Antonio a Ana, -sintate a hablar con nosotros un rato.
-Bueno, pero me voy a ir enseguida, -contesta Ana-.

Hemosvistoquesunflujoyqueexisteunrboldeclasesamplioparasumanejo.Ahoravamosa
verenprimerlugarlosflujospredefinidos,tambinconocidoscomodeentradaysalida,ydespus
veremoslosflujosbasadosenbytesylosflujosbasadosencarcter.
"Loescuchyloolvid,loviyloentend,lohiceyloaprend".Confucio.

Parasaberms
Antes,hemosmencionadoUnicode.PuedesconsultarelorigenymscosassobreUnicode,
enelenlacedelaWikipedia:
http://www.juntadeandalucia.es/educacion/adistancia/cursos/mod/scorm/player.php?id=7
4601&currentorg=eXeContenidos4df9bd3a1eeeacaecb3a&mode=normal&scoid=145047

4.1.Flujospredefinidos.Entradaysalidaestndar.
Tradicionalmente,losusuariosdelsistemaoperativoUnix,LinuxytambinMSDOS,hanutilizadoun
tipo de entrada/salida conocida comnmente por entrada/salida estndar. El fichero de entrada
estndar(stdin)estpicamenteelteclado.Elficherodesalidaestndar(stdout)estpicamentela
pantalla(olaventanadelterminal).Elficherodesalidadeerrorestndar(stderr)tambinsedirige
normalmentealapantalla,peroseimplementacomootroficherodeformaquesepuedadistinguir
entrelasalidanormaly(siesnecesario)losmensajesdeerror.
Java tiene acceso a la entrada/salida estndar a travs de la clase System. En concreto, los tres
ficherosqueseimplementanson:
9

Stdin.EsunobjetodetipoInputStream,yestdefinidoenlaclaseSystemcomoflujode

entradaestndar.Pordefectoeselteclado,peropuederedirigirseparacadahostocada
usuario,deformaquesecorrespondaconcualquierotrodispositivodeentrada.
9 Stdout. System.outimplementastdoutcomounainstanciadelaclasePrintStream.Se
puedenutilizarlosmtodosprint()yprintln()concualquiertipobsicoJavacomo
argumento.
9 Stderr.EsunobjetodetipoPrintStream.EsunflujodesalidadefinidoenlaclaseSystemy
representalasalidadeerrorestndar.Pordefecto,eselmonitor,aunqueesposible
redireccionarloaotrodispositivodesalida.
Paralaentrada,seusaelmtodoreadparaleerdelaentradaestndar:
9 intSystem.in.read();
Leeelsiguiente byte (char)delaentradaestndar.

16

DesarrollodeAplicacionesWeb
9

Tema6

intSystem.in.read(byte[] b);
Leerunconjuntodebytesdelaentradaestndaryloalmacenaenelvectorb.

Para la salida, se usa el mtodo print para escribir en la salida estndar:


9

System.out.print(String);
Muestraeltextoenlaconsola.
System.out.println(String);
Muestraeltextoenlaconsolayseguidamenteefectaunsaltodelnea.

Normalmente,paraleervaloresnumricos,loquesehaceestomarelvalordelaentradaestndar
en forma de cadena y entonces usar mtodos que permiten transformar el texto a nmeros (int,
float,double,etc.)segnserequiera.
Funcionesdeconversin.
Mtodo
Funcionamiento
Convierteunacadenaenunnmeroenterodeun
byte Byte.parseByte(String)
byte
short Short.parseShort(String)
Convierteunacadenaenunnmeroenterocorto
intInteger.parseInt(String)
Convierteunacadenaenunnmeroentero
longLong.parseLong(String)
Convierteunacadenaenunnmeroenterolargo
floatFloat.parseInt(String)
Convierteunacadenaenunnmerorealsimple
doubleDouble.parseInt(String)
Convierteunacadenaenunnmerorealdoble
booleanBoolean.parseBoolean(String) Convierteunacadenaenunvalorlgico

4.2.Flujospredefinidos.Entradaysalidaestndar.Ejemplo.
Veamosunejemploenelqueseleeportecladohastapulsarlatecladeretorno,enesemomentoel
programaacabarimprimiendoporlasalidaestndarlacadenaleda.
ParairconstruyendolacadenaconloscaracteresledospodramosusarlaclaseStringBufferola
StringBuilder. La clase StringBuffer permite almacenar cadenas que cambiarn en la
ejecucin del programa. StringBuilder es similar, pero no es sncrona. De este modo, para la
mayoradelasaplicaciones,dondeseejecutaunsolohilo,suponeunamejoraderendimientosobre
StringBuffer.
Elprocesodelecturahadeestarenunbloquetry..catch.
Import java.io.IOException;
public class leeEestandar {
public static void main(String[] args) {
// Cadena donde iremos almacenando los caracteres que se escriban
StringBuilder str = new StringBuilder();
char c;
// Por si ocurre una excepcin ponemos el bloque try-cath
try{
// Mientras la entrada de terclado no sea Intro
while ((c=(char)System.in.read())!='\n'){
// Aadir el character ledo a la cadena str
str.append(c);
}
}catch(IOException ex){
System.out.println(ex.getMessage()); }
// Escribir la cadena que se ha ido tecleando
System.out.println("Cadena introducida: " + str);
}
}

Seala la opcin correcta:


Read es una clase de System que permite leer caracteres.
StringBuffer permite leer y StringBuilder escribir en la salida estndar.

La clase keyboard tambin permite leer flujos de teclado.

17

Almacenandodatos

DAW

Stderr por defecto dirige al monitor pero se puede direccionar a otro dispositivo.
Debesconocer
Debemos procesar las excepciones que la propia mquina virtual va a lanzar. Existen dos
mecanismosbsicosparagestionarloserroresquesepuedenproducirenunaaplicacin:el
primeroconsisteenutilizarlaestructura try-catch,quepermiteintentarcapturarunerror
quesepuedaproducir.Seponeel try,elcdigoencuestinysefinalizaconel catch.En
esaseccindel catchesdondepondremoslasoperacionesarealizarcuandosedetecteun
error.Sepuedenponervariosbloquescatch:unagenricayotrasmsdetalladas.
El otro mecanismo consiste en declarar que nuestro mtodo puede lanzar una excepcin,
peronogestionarlaenesemtodo,sinotratarla,porejemplo,enelmtodo main()enel
queseestllamandoaesemtodo.

4.3.Flujosbasadosenbytes.
Estetipodeflujoseselidneoparaelmanejodeentradasysalidasdebytes,ysuusoportantoest
orientadoalalecturayescrituradedatosbinarios.
Paraeltratamientodelosflujosdebytes,Javatienedosclasesabstractasqueson InputStreamy
OutputStream.Cadaunadeestasclasesabstractastienevariassubclasesconcretas,quecontrolan
lasdiferenciasentrelosdistintosdispositivosdeE/Squesepuedenutilizar.
classFileInputStreamextandsInputStream {
FileInputStream (String fichero) throws FileNotFoundException;
FileInputStream (File fichero) throws FileNotFoundException;
... ... ...
}
classFileOutputStream extends OutputStream {
FileOutputStream (String fichero) throws FileNotFoundException;
FileOutputStream (File fichero) throws FileNotFoundException;
... ... ...
}
OutputStream y el InputStream y todas sus subclases, reciben en el constructor el objeto que

representaelflujodedatosparaeldispositivodeentradaosalida.
Porejemplo,podemoscopiarelcontenidodeunficheroenotro:
voidcopia (String origen, String destino) throws IOException {
try{
// Obtener los nombres de los ficheros de origen y destino
// y abrir la conexin a los ficheros.
InputStreamfentrada = new FileInputStream(origen);
OutputStreamfsalida = new FileOutputStream(destino);
// Crear una variable para leer el flujo de bytes del origen
byte[] buffer= new byte[256];
while (true) {
// Leer el flujo de bytes
int n = fentrada.read(buffer);
// Si no queda nada por leer, salir delwhile
if (n < 0)
break;
// Escribir el flujo de bytes ledos al fichero destino
fsalida.write(buffer, 0, n);
}
// Cerrar los ficheros
fentrada.close();
fsalida.close();
}catch(IOException ex){
System.out.println(ex.getMessage()); }

Recomendacin
En los enlaces siguientes puedes ver la documentacin oficial de Oracle sobre
FileInputStreamysobreFileOutputStream.

18

DesarrollodeAplicacionesWeb
FileInputStream.
FileOutputStream.

Tema6

http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileInputStream.html
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html

4.4.Flujosbasadosencaracteres.

Las clases orientadas al flujo de bytes nos proporcionan la suficiente


funcionalidad para realizar cualquier tipo de operacin de entrada o
salida,peronopuedentrabajardirectamenteconcaracteresUnicode,
los cuales estn representados por dos bytes. Por eso, se consider
necesarialacreacindelasclasesorientadasalflujodecaracterespara
ofrecernoselsoportenecesarioparaeltratamientodecaracteres.
Para los flujos de caracteres, Java dispone de dos clases abstractas:
ReaderyWriter.
Reader, Writer, y todas sus subclases, reciben en el constructor el
objetoquerepresentaelflujodedatosparaeldispositivodeentradao
salida.
Hay que recordar que cada vez que se llama a un constructor se abre el flujo de datos y es
necesariocerrarlocuandonolonecesitemos.
Existen muchos tipos de flujos dependiendo de la utilidad que le vayamos a dar a los datos que
extraemosdelosdispositivos.
Unflujopuedeserenvueltoporotroflujoparatratarelflujodedatosdeformacmoda.As,un
bufferWriternospermitemanipularelflujodedatoscomounbuffer,perosiloenvolvemosenun
PrintWriter lo podemos escribir con muchas ms funcionalidades adicionales para diferentes
tiposdedatos.
Enesteejemplodecdigo,sevecmopodemosescribirlasalidaestndaraunfichero.Cuandose
tecleelapalabra"salir",sedejardeleeryentoncessesaldrdelbucledelectura.
Podemos ver cmo se usa InputStreamReader que es un puente de flujos de bytes a flujos de
caracteres:leebytesylosdecodificaacaracteres.BufferedReaderleetextodeunflujodeentrada
decaracteres,permitiendoefectuarunalecturaeficientedecaracteres,vectoresylneas.
Comovemosenelcdigo,usamos FileWriterparaflujosdecaracteres,puesparadatosbinarios
seutilizaFileOutputStream.
try{
PrintWriter out = null;
out = new PrintWriter(new FileWriter("c:\\salida.txt", true));
BufferedReaderbr = new BufferedReader(
newInputStreamReader(System.in));
String s;
while (!(s = br.readLine()).equals("salir")){
out.println(s);
}
out.close();
}
catch(IOException ex){
System.out.println(ex.getMessage()); }

Indica si es verdadera o falsa la siguiente afirmacin:


Para flujos de caracteres es mejor usar las clases Reader y Writer en vez de InputStream y
OutputStream.
Verdadero.

Falso.

19

Almacenandodatos

DAW

4.5.Rutasdelosficheros.

Enlosejemplosquevemoseneltemaestamosusandolarutade
losficherostalycomoseusanenMSDOS,oWindows,esdecir,
porejemplo:
c:\\datos\Programacion\fichero.txt

Cuando operamos con rutas de ficheros, el carcter separador


entre directorios o carpetas suele cambiar dependiendo del
sistemaoperativoenelqueseestejecutandoelprograma.
Para evitar problemas en la ejecucin de los programas cuando
seejecutenenunouotrosistemaoperativo,yportantopersiguiendoquenuestrasaplicacionessean
lomsportablesposibles,serecomiendausarenJava:File.separator.
Podramoshacerunafuncinquealpasarleunarutanosdevolvieralaadecuadasegnelseparador
delsistemaactual,delsiguientemodo:
String substFileSeparator(String ruta){
String separador = "\\";
try{
// Si estamos en Windows
if ( File.separator.equals(separador) )
separador = "/" ;
// Reemplaza todas las cadenas que coinciden con la expresin
// regular dada oldSep por la cadena File.separator
returnruta.replaceAll(separador, File.separator);
}catch(Exception e){
// Por si ocurre una java.util.regex.PatternSyntaxException
returnruta.replaceAll(separador + separador, File.separator);
}
}

Indica si es verdadera o falsa la siguiente afirmacin.


Cuando trabajamos con fichero en Java, no es necesario capturar las excepciones, el sistema
se ocupa automticamente de ellas. Verdadero o Falso?
Verdadero.

20

Falso.

DesarrollodeAplicacionesWeb

Tema6

5.Trabajandoconficheros.
Caso prctico
Juan le comenta a Mara -Tenemos que programar una copia de seguridad diaria de los datos del
ficheros de texto plano que utiliza el programa para guardar la informacin. -Mientras Mara escucha
a Juan, recuerda que para copias de seguridad, siempre ha comprobado que la mejor opcin es
utilizar ficheros secuenciales.

CreesqueesunabuenaopcinlaquepiensaMaraoutilizarasotraensulugar?
Enesteapartadovasavermuchascosassobrelosficheros:cmoleeryescribirenellos,aunqueya
hemos visto algo sobre eso, hablaremos de las formas de acceso a los ficheros: secuencial o de
maneraaleatoria.
Siemprehemosdetenerencuentaquelamaneradeprocederconficherosdebeser:
Abrirobiencrearsinoexisteelfichero.
Hacerlasoperacionesquenecesitemos.
Cerrarelfichero,paranoperderlainformacinquesehayamodificadooaadido.
Tambin es muy importante el control de las excepciones, para evitar que se produzcan fallos en
tiempodeejecucin.Siintentamosabrirsinmsunfichero,sincomprobarsiexisteono,ynoexiste,
saltarunaexcepcin.

Parasaberms
En el siguiente enlace a la wikipedia podrs ver la descripcin de varias extensiones que
puedenpresentarlosarchivos.
Extensindeunarchivo.
http://es.wikipedia.org/wiki/Extensi%C3%B3n_de_archivo

5.1.Escrituraylecturadeinformacinenficheros.

Acabamosdemencionarlospasosfundamentalesparaprocederconficheros:abrir,operar,cerrar.
Adems de esas consideraciones, debemos tener en cuenta tambin las clases Java a emplear, es
decir,recuerdaquehemoscomentadoquesivamosatratarconficherosdetexto,esmseficiente
emplear las clases de ReaderWriter, frente a las clases de InputStreamy OutputStream que
estnindicadasparaflujosdebytes.
Otracosaaconsiderar,cuandosevaahacerusodeficheros,eslaformadeaccesoalficheroquese
vaautilizar,sivaaserdemanerasecuencialobienaleatoria.Enunficherosecuencial,paraacceder
a un dato debemos recorrer todo el fichero desde el principio hasta llegar a su posicin. Sin
embargo,enunficherodeaccesoaleatorio(Eslaposibilidaddeaccederaunelementoarbitrariodeunasecuenciadedatos
en el mismo tiempo) podemos posicionarnos directamente en una posicin del fichero, y ah leer o
escribir.
AunqueyahasvistounejemploqueusaBufferedReader,insistimosaqusobrelafilosofadeestas
clases,queusanlaideadeunbuffer.
Laideaesquecuandounaaplicacinnecesitaleerdatosdeunfichero,tienequeestaresperandoa
queeldiscoenelqueestelficheroleproporcionelainformacin.
Undispositivocualquieradememoriamasiva(Consisteenuntipodealmacenamientopermanente,novoltil,adiferencia
delamemoriaprincipaldelordenadorquesesvoltil,peroposeemayorcapacidaddealmacenamientoquelamemoriaprincipal,aunque
esmslentaquesta),pormuyrpidoquesea,esmuchomslentoquelaCPUdelordenador.

Asque,esfundamentalreducirelnmerodeaccesosalficheroafindemejorarlaeficienciadela
aplicacin,yparaelloseasociaalficherounamemoriaintermedia,elbuffer,demodoquecuandose
necesitaleerunbytedelarchivo,enrealidadsetraenhastaelbufferasociadoalflujo,yaqueesuna
memoriamuchomsrpidaquecualquierotrodispositivodememoriamasiva.
Cualquier operacin de Entrada/Salida a ficheros puede generar una IOException, es decir, un
error de Entrada/Salida. Puede ser por ejemplo, que el fichero no exista, o que el dispositivo no
funcionecorrectamente,oquenuestraaplicacinnotengapermisosdelecturaoescriturasobreel

21

Almacenandodatos

DAW

ficheroencuestin.Poreso,lassentenciasqueinvolucranoperacionessobreficheros,debenirenun
bloquetry.

Seala si es verdadera o es falsa la siguiente afirmacin:


La idea de usar buffers con los ficheros es incrementar los accesos fsicos a disco.
Verdadero.

Falso.

5.2.Ficherosbinariosyficherosdetexto(I).
Ya comentamos anteriormente que los ficheros se utilizan para guardar la informacin en un
soporte: disco duro, disquetes, memorias usb, dvd, etc., y posteriormente poder recuperarla.
Tambindistinguimosdostiposdeficheros:losdetextoylosbinarios.
Enlosficherosdetextolainformacinseguardacomocaracteres.Esoscaracteresestncodificados
enUnicode,oenASCIIuotrascodificacionesdetexto.
En la siguiente porcin de cdigo puedes ver cmo para un fichero existente, que en este caso es
texto.txt,averiguamoslacodificacinqueposee,usandoelmtodogetEncoding()
FileInputStream fichero;
try {
// Elegimos fichero para leer flujos de bytes "crudos"
fichero = new FileInputStream("c:\\texto.txt");
// InputStreamReader sirve de puente de flujos de byte a caracteres
InputStreamReaderunReader = new InputStreamReader(fichero);
// Vemos la codificacin actual
System.out.println(unReader.getEncoding());
} catch (FileNotFoundException ex) {
Logger.getLogger(textos.class.getName()).log(Level.SEVERE, null, ex);
}

Paraarchivosdetexto,sepuedeabrirelficheroparaleerusandolaclase FileReader.Estaclase
nosproporcionamtodosparaleercaracteres.Cuandonosinteresenoleercarcteracarcter,sino
leer lneas completas, podemos usar la clase BufferedReader a partir de FileReader. Lo
podemoshacerdelasiguienteforma:
File arch = new File ("C:\\fich.txt");
FileReaderfr = new FileReader (arch);
BufferedReaderbr = new BufferedReader(fr);
...
String linea = br.readLine();

Paraescribirenarchivosdetextolopodramoshacer,teniendoencuenta:
FileWriterfich = null;
PrintWriter pw = null;
fich = new FileWriter("c:/fich2.txt");
pw = new PrintWriter(fichero);
pw.println("Linea de texto");
...

Si el fichero al que queremos escribir existe y lo que queremos es aadir informacin, entonces
pasaremoselsegundoparmetrocomotrue:
FileWriter("c:/fich2.txt",true);

22

DesarrollodeAplicacionesWeb

Tema6

Parasaberms
EnelsiguienteenlaceawikipediapuedesverelcdigoASCII.

Binario

Dec

Hex

00100000

32

20

00100001
00100010
00100011
00100100
00100101
00100110
00100111
00101000
00101001
00101010
00101011
00101100
00101101
00101110
00101111
00110000
00110001
00110010
00110011
00110100
00110101
00110110
00110111
00111000
00111001
00111010
00111011
00111100
00111101
00111110
00111111

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F

Repre
senta
espacio
()
!
"
#
$
%
&
'
(
)
*
+
,

.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?

Binario

Dec

Hex

0100 0000
0100 0001
0100 0010
0100 0011
0100 0100
0100 0101
0100 0110
0100 0111
0100 1000
0100 1001
0100 1010
0100 1011
0100 1100
0100 1101
0100 1110
0100 1111
0101 0000
0101 0001
0101 0010
0101 0011
0101 0100
0101 0101
0101 0110
0101 0111
0101 1000
0101 1001
0101 1010
0101 1011
0101 1100
0101 1101
0101 1110
0101 1111

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F

Repre
senta
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_

Binario

Dec

Hex

0110 0000
0110 0001
0110 0010
0110 0011
0110 0100
0110 0101
0110 0110
0110 0111
0110 1000
0110 1001
0110 1010
0110 1011
0110 1100
0110 1101
0110 1110
0110 1111
0111 0000
0111 0001
0111 0010
0111 0011
0111 0100
0111 0101
0111 0110
0111 0111
0111 1000
0111 1001
0111 1010
0111 1011
0111 1100
0111 1101
0111 1110

96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E

Repres
enta
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~

5.2.1.Ficherosbinariosyficherosdetexto(II).
Los ficheros binarios almacenan la informacin en bytes, codificada en binario, pudiendo ser de
cualquiertipo:fotografas,nmeros,letras,archivosejecutables,etc.
Los archivosbinarios guardan una representacin de los datos en el fichero. O sea que, cuando se
guardatextonoseguardaeltextoens,sinoqueseguardasurepresentacinencdigoUTF8(Esun
formatodecodificacindecaracteresUnicodeusandosmbolosdelongitudvariable).
Paraleerdatosdeunficherobinario,JavaproporcionalaclaseFileInputStream.Dichaclasetrabaja
conbytesqueseleendesdeelflujoasociadoaunfichero.Aqupuedesverunejemplocomentado.
packagefileinputconbuffer;
importjava.io.BufferedInputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
public class leerConBuffer {
public static void main(String[] args) {
int tama ;
try{
// Creamos un nuevo objeto File, que es la ruta hasta el fichero desde
File f = new File("C:\\apuntes\\test.bin");
// Construimosunflujo de tipo FileInputStream (un flujo de entrada desde

23

Almacenandodatos

DAW

// fichero) sobre el objeto File. Estamos conectando nuestra aplicacin


// a un extremo del flujo, por donde van a salir los datos, y "pidiendo"
// al Sistema Operativo que conecte el otro extremo al fichero que indica
// la ruta establecida por el objeto File f que habamos creado antes. De
FileInputStreamflujoEntrada = new FileInputStream(f);
BufferedInputStreamfEntradaConBuffer = new BufferedInputStream(flujoEntrada);
// Escribimos el tamaodel fichero en bytes.
tama = fEntradaConBuffer.available();
System.out.println("Bytes disponibles: " + tama);
// Indicamos que vamos a intentar leer 50 bytes del fichero.
System.out.println("Leyendo 50 bytes....");
// Creamos unarray de 50 bytes para llenarlo con los 50 bytes
// que leamos del flujo (realmente del fichero)*/
bytebytearray[] = new byte[50];
// El mtodo read() de la clase FileInputStream recibe como parmetro un
// array de byte, y lo llena leyendo bytes desde el flujo.
// Devuelve un nmero entero, que es el nmero de bytes que realmente se
// han ledo desde el flujo. Si el fichero tiene menos de 50 bytes, no
// podr leer los 50 bytes, y escribir un mensaje indicndolo.
if (fEntradaConBuffer.read(bytearray) != 50)
System.out.println("No se pudieron leer 50 bytes");
// Usamos un constructor adecuado de la clase String, que crea un nuevo
// String a partir de los bytes ledos desde el flujo, que se almacenaron
// en el arraybytearray, y escribimos eseString.
System.out.println(new String(bytearray, 0, 50));
// Finalmentecerramos el flujo.Es importante cerrar los flujos
// para liberar ese recurso. Al cerrar el flujo, se comprueba que no
// haya quedado ningn dato en el flujo sin que se haya ledo por la aplicacin. */
fEntradaConBuffer.close();
// Capturamos la excepcin de
// producirse en este caso es
// es el mensaje que enviamos
}catch (IOException e){
System.err.println("No se encuentra
}
}

Entrada/Salida. El error que puede


que el fichero no est accesible, y
en tal caso.
el fichero");

Paraescribirdatosaunficherobinario,laclasenospermiteusarunficheroparaescrituradebytes
en l, es la claseFileOutputStream. La filosofa es la misma que para la lectura de datos, pero
ahora el flujo es en direccin contraria, desde la aplicacin que hace de fuente de datos hasta el
fichero,quelosconsume.
Enlasiguientepresentacinpuedesverunesquemadecmoutilizarbufferparaoptimizarlalectura
detecladodesdeconsola,pormediodelasenvolturas,podemosusarmtodoscomo readline(),
delaclaseBufferedReader,queenvuelveaunobjetodelaclaseInputStreamReader.
EnvolturasoWrappers
Leerdesdeconsola
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in);

9 Buf esunflujodecaracteresqueseenlazaalaconsolaatravsdelaclaseSystem.in.Esta
seenvuelveparapasardebyteachar
9 InputStreamReader (InputStream inp):clasequeconviertedebyteacarcter.
9 BufferedReader (Reader input):clasequerecibeunflujodecaracteresdeentrada.

Bytes

24

readLine()

BufferedReader
InputStreamReader
System.in
(ImputStream)

read()
read(byte[])

intread()
read(char[])

DesarrollodeAplicacionesWeb

Tema6

Resumentextualalternativo

Seala si es verdadera o falsa la siguiente afirmacin:


Para leer datos desde un fichero codificados en binario empleamos la clase
FileOutputStream.
Verdadero.

Falso.

5.3.Modosdeacceso.Registros.

En Java no se impone una estructura en un fichero, por lo que


conceptos como el de registro que si existen en otros lenguajes, en
principionoexistenenlosarchivosquesecreanconJava.Portanto,los
programadoresdebenestructurarlosficherosdemodoquecumplanconlosrequerimientosdesus
aplicaciones.
As,elprogramadordefinirsuregistroconelnmerodebytesqueleinteresen,movindoseluego
porelficheroteniendoencuentaesetamaoquehadefinido.
Se dice que un fichero es de acceso directo o de organizacin directa cuando para acceder a un
registro n cualquiera, no se tiene que pasar por los n1 registros anteriores. En caso contrario,
estamoshablandodeficherossecuenciales.
ConJavasepuedetrabajarconficherossecuencialesyconficherosdeaccesoaleatorio.
Enlosficherossecuenciales,lainformacinsealmacenademanerasecuencial,demaneraquepara
recuperarlasedebehacerenelmismoordenenquelainformacinsehaintroducidoenelarchivo.
Siporejemploqueremosleerelregistrodelficheroqueocupalaposicintres(enlailustracinsera
elnmero5),tendremosqueabrirelficheroyleerlosprimerostresregistros,hastaquefinalmente
leamoselregistronmerotres.
Porelcontrario,sisetrataradeunficherodeaccesoaleatorio,podramosaccederdirectamenteala
posicintresdelfichero,oalaquenosinteresara.

Seala la opcin correcta:


Java slo admite el uso de ficheros aleatorios.
Con los ficheros de acceso aleatorio se puede acceder a un registro determinado
directamente.
Los ficheros secuenciales se deben leer de tres en tres registros.
Todas son falsas.

5.4.Accesosecuencial.
En el siguiente ejemplo vemos cmo se escriben datos en un fichero secuencial: el nombre y
apellidosdeunapersonautilizandoelmtodo writeUTF()queproporciona DataOutputStream,
seguidodesuedadquelaescribimosconelmtodowriteInt()delamismaclase.Acontinuacin
escribimoslomismoparaunasegundapersonaydenuevoparaunatercera.Despuscerramosel
fichero.Yahoraloabrimosdenuevoparairleyendodemanerasecuenciallosdatosalmacenados
enelfichero,yescribindolosaconsola.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package escylecsecuen;
import java.io.DataInputStream;
import java.io.DataOutputStream;

25

Almacenandodatos
import
import
import
import

DAW

java.io.FileInputStream;
java.io.FileNotFoundException;
java.io.FileOutputStream;
java.io.IOException;

/**
*
* @author JJBH
*/
public class escylee {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Declarar un objeto de tipo archivo
DataOutputStream archivo = null ;
DataInputStream fich = null ;
String nombre = null ;
int edad = 0 ;
try {
// Creando o abriendo para aadir el archivo
archivo = new DataOutputStream( new FileOutputStream("c:\\secuencial.dat",true) );
// Escribir el nombre y los apellidos
archivo.writeUTF( "Antonio Lpez Prez
" );
archivo.writeInt(33) ;
archivo.writeUTF( "Pedro Piqueras Pearanda" );
archivo.writeInt(45) ;
archivo.writeUTF( "Jos Antonio Ruiz Prez " ) ;
archivo.writeInt(51) ;
// Cerrar fichero
archivo.close();
// Abrir para leer
fich = new DataInputStream( new FileInputStream("c:\\secuencial.dat") );
nombre = fich.readUTF() ;
System.out.println(nombre) ;
edad = fich.readInt() ;
System.out.println(edad) ;
nombre = fich.readUTF() ;
System.out.println(nombre) ;
edad = fich.readInt() ;
System.out.println(edad) ;
nombre = fich.readUTF() ;
System.out.println(nombre) ;
edad = fich.readInt() ;
System.out.println(edad) ;
fich.close();

} catch(FileNotFoundException fnfe) { /* Archivo no encontrado */ }


catch (IOException ioe) { /* Error al escribir */ }
catch (Exception e) { /* Error de otro tipo*/
System.out.println(e.getMessage());}
}
}

Fjatealver elcdigo,quehemostenidolaprecaucindeirescribiendolas cadenasdecaracteres


conelmismotamao,demaneraquesepamosluegoeltamaodelregistroquetenemosqueleer.
Por tanto para buscar informacin en un fichero secuencial, tendremos que abrir el fichero e ir
leyendoregistroshastaencontrarelregistroquebuscamos.

Y si queremos eliminar un registro en un fichero secuencial, qu hacemos? Esta operacin es un


problema, puesto que no podemos quitar el registro y reordenar el resto. Una opcin, aunque
costosa,seracrearunnuevofichero.Recorremoselficherooriginalyvamoscopiandoregistrosenel
nuevo hasta llegar al registro que queremos borrar. Ese no lo copiamos al nuevo, y seguimos
copiandohastaelfinal,elrestoderegistrosalnuevofichero.Deestemodo,obtendramosunnuevo
ficheroqueseraelmismoquetenamosperosinelregistroquequeramosborrar.Portanto,sise

26

DesarrollodeAplicacionesWeb

Tema6

prev que se va a borrar en el fichero, no es recomendable usar un fichero de este tipo, o sea,
secuencial.

Seala si es verdadera o es falsa la siguiente afirmacin:


Para encontrar una informacin almacenada en la mitad de un fichero secuencial, podemos
acceder directamente a esa posicin sin pasar por los datos anteriores a esa informacin.
Verdadero.

Falso.

5.5.Accesoaleatorio.
Avecesnonecesitamosleerunficherodeprincipioafin,sinoaccederalficherocomosifuerauna
base de datos, donde se accede a un registro concreto del fichero. Java proporciona la clase
RandomAccessFileparaestetipodeentrada/salida.
La clase RandomAccessFile permite utilizar un fichero de acceso aleatorio en el que el
programadordefineelformatodelosregistros.

RandomAccessFile objFile = new RandomAccessFile( ruta, modo );

Donderutaesladireccinfsicaenelsistemadearchivosymodopuedeser:
9
9

"r"paraslolectura.
"rw"paralecturayescritura.

La clase RandomAccessFile implementa los interfaces DataInput y DataOutput. Para abrir un


archivoenmodolecturaharamos:
RandomAccessFile in = new RandomAccessFile(input.dat, r);

Paraabrirloenmodolecturayescritura:
RandomAccessFile inOut = new RandomAccessFile(input.dat, rw);

Estaclasepermiteleeryescribirsobreelfichero,nosenecesitandosclasesdiferentes.

Hay que especificar el modo de acceso al construir un objeto de esta clase: slo lectura o
lectura/escritura.

Disponedemtodosespecficosdedesplazamientocomo seeky skipBytesparapodermoverse


deunregistroaotrodelfichero,oposicionarsedirectamenteenunaposicinconcretadelfichero.
Noestbasadaenelconceptodeflujosostreams.

En la siguiente presentacin vemos cmo crear un fichero, cmo podemos acceder, y actualizar
informacinenl.

Ficherosdeaccesoaleatorio
Crearfichero:
Debidoalaexistenciadedosconstructores,tenemosdosposibilidadesdeabrirunficherodeacceso
aleatorio:
9 Medianteelnombredelfichero:
miFichero = new RandomAccessFile(String nombre, String modo);

Medianteunobjetofile:

miFichero = new RandomAccessFile(File fichero, String modo);

27

Almacenandodatos

DAW

Elparmetromododeterminasisetieneaccesodeslolectura(r)obiendelectura/escritura(rw).
Porejemplo,sepuedeabrirunficherodeslolectura:
RandomAccessFile miRAFile;
miRAFile = new RandomAccessFile(/usr/bin/pepe.txt,rw);

Accederalainformacin:
9 ConunobjetoRandomAccessFilesetieneaccesoatodaslasoperacionesread()ywrite()delas
clasesDataInputStreamyDataOutputStream
9 Sedisponedemuchosmtodosparaubicarsedentrodeunfichero:
long getFilePointer()

Devuelvelaposicinactualdelpunterdelfichero

void seek(long pos)

Sita el puntero del fichero en una posicin determinada. La posicin se da como un


desplazamientoenbytesdesdeelcomienzodelfichero.Laposicin0marcaelcomienzode
esefichero

long length()

Devuelvelalongituddelfichero.Laposicinlength()marcaelfinaldeesefichero.

int skipBytes(int desplazamiento)

Desplaza el puntero desde la posicin actual, el nmero de bytes indicado por


desplazamiento

Actualizarlainformacin:
Conlosficherosdeaccesoaleatoriosepuedeaadirinformacinaunficheroaleatorioexistente.
Aqunosiramosalfinaldelfichero:
miFR = new RandomAccessFile(c:\\aleatorios\prueba.dat,rw);
miFR.seek(miFR.length());

Cualquierwrite()quehagamosapartirdeestepuntodelcdigoaadirinformacinalfichero.

Indica si es verdadera o es falsa la siguiente afirmacin:


Para decirle el modo de lectura y escritura a un objeto RandomAccessFile debemos pasar
como parmetro "rw".
Verdadero.

28

Falso.

DesarrollodeApllicacionesW
Web

Tema6
6

6.A
Aplicacio
onesdela
almacena
amientodeinform
macine
enfichero
os.
Caso
o prctico
Anto
onio ha qued
dado con Ana
a para estud
diar sobre el tema de fich
heros. De cam
mino a la bib
blioteca, Ana
a
le pre
egunta a Anttonio -Crees que los ficcheros se utillizan realmen
nte, o ya esttn desfasad
dos y slo se
e
utiliza
an las basess de datos? -Antonio
trass pensarlo un
n momento le
e dice a Ana
a -Yo creo qu
ue s, piensa
a
en el mp3 que ussas muchas veces,
v
la m
sica va grab
bada en ese tipo
t
de ficherros.

Has pensado la diversidad de ficheros que existe, segn la infformacin


quesseguarda?

otos que haces con tu cmara


c
digital, o con el mvil, se gu
uardan en
Las fo
ficheros. As, existe una gran cantidad de ficheros de imagen, segn el
mto
odoqueusen
nparaguard
darlainform
macin.Pore
ejemplo,ten
nemoslos
ficherosdeexten
nsin:.jpg,.tiiff,gif,.bmp,,etc.

sicaqueoyyesentump
p3oenelrep
productorde
emp3detu coche,est almacenadaaenficheross
Lam
queaalmacenanlaainformacinenformato
omp3.

Los sistemas
s
op
perativos, co
omo Linux, Windows, etc., estn constituido
os por un montn dee
instru
uccionesein
nformacinq
queseguardaenficheross.

Elpro
opiocdigo fuentedelo
oslenguajes deprogram
macin,como
oJava,C,etcc.,seguardaaenficheross
detextoplanolamayoradeveces.

Tamb
binseguard
daenfichero
oslaspelculaasenformatto.avi,.mp4,etc.

Y porr supuesto, se
s usan muccho actualmente los fich
heros XML, que
q al fin y al cabo son ficheros dee
texto
oplano,pero
oquesiguenunaestructu
uradetermin
nada.XMLseeempleamu
uchoparaelintercambio
o
deinfformacinestructuradaentrediferentesplataformas.

Parasaberms
Enellsiguienteeenlacealaw
wikipediapuedessabermssobreeelformato
oMp3.
http://es.wikipedia.org/wiki/M
MP3
Indicca si es verrdadera o faalsa la sigu
uiente afirm
macin:
Un fichero
fi
.bmpp guarda infformacin de
d msica co
odificada. Verdadero

o o falso?
Verddadero.

Falso.

29

Almacenandodatos

DAW

7.Utilizacindelossistemasdeficheros.
Caso prctico
Ana est estudiando en la biblioteca, junto a Antonio. Est repasando lo que le explicaron en clase
sobre las operaciones relativas a ficheros en Java. En concreto, est mirando lo relativo a crear
carpetas o directorios, listar directorios, borrarlos, operar en definitiva con ellos. Va a repasar ahora
en la biblioteca, para tener claros los conceptos y cuando llegue de vuelta a casa, probar a compilar
algunos ejemplos que a ella misma se le ocurran.

Hasvistoenlosapartadosanteriorescmooperarenficheros:abrirlos,cerrarlos,escribirenellos,
etc.

Lo que no hemos visto es lo relativo a crear y borrar directorios, poder filtrar archivos, es decir,
buscarsloaquellosquetengandeterminadacaracterstica,porejemplo,quesuextensinsea:.txt.

Ahoraveremoscmohacerestascosas,ytambincomoborrarficheros,ycrearlos,aunquecrearlos
yalohemosvistoenalgunosejemplosanteriores.

Parasaberms
Accediendoaesteenlace,tendrsunavisindetalladasobrelaorganizacindeficheros.
OrganizacindeFicherosyMtodosdeEnlacehttp://www.um.es/docencia/barzana/IAGP/Iagp7.html

7.1.ClaseFile.
LaclaseFileproporcionaunarepresentacinabstractadeficherosydirectorios.
Esta clase, permite examinar y manipular archivos y directorios, independientemente de la
plataformaenlaqueseesttrabajando:Linux,Windows,etc.

LasinstanciasdelaclaseFilerepresentannombresdearchivo,nolosarchivosensmismos.

El archivo correspondiente a un nombre dado podra ser que no existiera, por ello, habr que
controlarlasposiblesexcepciones.

AltrabajarconFile,lasrutaspuedenser:
9
9

Relativasaldirectorioactual.
Absolutassilarutaquelepasamoscomoparmetroempiezapor
Labarra"/"enUnix,Linux.
Letradeunidad(C:,D:,etc.)enWindows.
UNC(universalnamingconvention)enwindows,comoporejemplo:

File miFile=new File("\\\\mimaquina\\download\\prueba.txt");

AtravsdelobjetoFile,unprogramapuedeexaminarlosatributosdelarchivo,cambiarsunombre,
borrarlo o cambiar sus permisos. Dado un objeto file, podemos hacer las siguientes operaciones
conl:
9

Renombrarelarchivo,conelmtodorenameTo() (Consisteenunaseriedesentenciasparallevaracabouna
accin. Un mtodo est asociado a una clase. Puede tener parmetros de entrada y puede devolver un valor de retorno). El
objeto File dejar de referirse al archivo renombrado, ya que el String con el nombre del
archivoenelobjetoFilenocambia.

30

DesarrollodeAplicacionesWeb
9
9

9
9

Tema6

Borrarelarchivo,conelmtodo delete().Tambin,con deleteOnExit()seborracuando


finalizalaejecucindelamquinavirtualJava.
Crearunnuevoficheroconunnombrenico.Elmtodoesttico createTempFile()creaun
fichero temporal y devuelve un objeto File que apunta a l. Es til para crear archivos
temporales,queluegoseborran,asegurndonostenerunnombredearchivonorepetido.
Establecer la fecha y la hora de modificacin del archivo con setLastModified(). Por
File("prueba.txt").setLastModified(new
ejemplo, se podra hacer: new
Date().getTime()); para establecerle la fecha actual al fichero que se le pasa como
parmetro,enestecasoprueba.txt.
Crear un directorio con el mtodo mkdir(). Tambin existe mkdirs(), que crea los
directoriossuperioressinoexisten.
Listarelcontenidodeun directorio.Losmtodos list()y listFiles()listanelcontenido
de un directorio list() devuelve un vector de String con los nombres de los archivos,
listFiles()devuelveunvectordeobjetosFile.
Listar los nombres de archivo de la raz del sistema de archivos, mediante el mtodo esttico
listRoots().

Un objeto de la clase File representa un fichero en s mismo. Verdadero o falso?


Verdadero.

Falso.

7.2.InterfaceFilenameFilter.
Enocasionesnosinteresaverlalistadelosarchivosqueencajanconundeterminadocriterio.

As,nospuedeinteresarunfiltroparaverlosficherosmodificadosdespusdeunafecha,olosque
tienenuntamaomayordelqueindiquemos,etc.

Elinterface FilenameFiltersepuedeusarparacrearfiltrosqueestablezcancriteriosdefiltrado
relativos al nombre de los ficheros. Una clase que lo implemente debe definir e implementar el
mtodo:
boolean accept(File dir, String nombre)

Estemtododevolververdadero(true),enelcasodequeelficherocuyonombreseindicaenel
parmetronombreaparezcaenlalistadelosficherosdeldirectorioindicadoporelparmetrodir.

En el siguiente ejemplo vemos cmo se listan los ficheros de la carpeta c:\datos que tengan la
extensin .odt. Usamos try y catch para capturar las posibles excepciones, como que no exista
dichacarpeta.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package filtrarficheros;
import java.io.File;
import java.io.FilenameFilter;
public class Filtro implements FilenameFilter {
String extension;
Filtro(String extension){
this.extension=extension;
}
public boolean accept(File dir, String name){
return name.endsWith(extension);
}

31

Almacenandodatos

DAW

public static void main(String[] args) {


try {
File fichero=new File("c:\\datos\\.");
String[] listadeArchivos = fichero.list();
listadeArchivos = fichero.list(new Filtrar(".odt"));
int numarchivos = listadeArchivos.length ;
if (numarchivos < 1)
System.out.println("No hay archivos que listar");
else
{
for(int conta = 0; conta < listadeArchivos.length; conta++)
System.out.println(listadeArchivos[conta]);
}
}
catch (Exception ex) {
System.out.println("Error al buscar en la ruta indicada");
}
}
}

Una clase que implemente FileNameFilter puede o no implementar el mtodo accept.


Verdadero.

Falso.

7.3.Creacinyeliminacindeficherosydirectorios.
Podemoscrearunficherodelsiguientemodo:
9

Creamoselobjetoqueencapsulaelfichero,porejemplo,suponiendoquevamosacrearun
ficherollamadomiFichero.txt,enlacarpetaC:\\prueba,haramos:

File fichero = new File("c:\\prueba\\miFichero.txt");


9

ApartirdelobjetoFile creamoselficherofsicamente,conlasiguienteinstruccin,que
devuelveunbooleanconvalortruesisecrecorrectamente,ofalsesinosepudocrear:

fichero.createNewFile()

Para borrar un fichero, podemos usar la clase File, comprobando previamente si existe, del
siguientemodo:
9

Fijamoselnombredelacarpetaydelficherocon:

File fichero = new File("C:\\prueba", "agenda.txt");


9

Comprobamossiexisteelficheroconexists()ysiesasloborramoscon:

fichero.delete();

Paracreardirectorios,podramoshacer:
package crearcarpetas;
import java.io.File;
/**
*
* @author JJBH
*/
public class CrearDirec {
public static void main(String[] args) {
try {
// Declaracin de variables

32

DesarrollodeAplicacionesWeb

Tema6

String directorio = "C:\\micarpeta";


String varios = "carpeta1/carpeta2/carpeta3";
// Crear un directorio
boolean exito = (new File(directorio)).mkdir();
if (exito)
System.out.println("Directorio: " + directorio + " creado");
// Crear varios directorios
exito = (new File(varios)).mkdirs();
if (exito)
System.out.println("Directorios: " + varios + " creados");
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
}

Para borrar un directorio con Java tenemos que borrar cada uno de los ficheros y directorios que
stecontenga.Alpoderalmacenarotrosdirectorios,sepodrarecorrerrecursivamenteeldirectorio
parairborrandotodoslosficheros.

Sepuedelistarelcontenidodeldirectoriocon:
File[] ficheros = directorio.listFiles();

y entonces poder ir borrando. Si el elemento es un directorio, lo sabemos mediante el mtodo


isDirectory,

33

Almacenandodatos

DAW

8.Almacenamientodeobjetosenficheros.Persistencia.Serializacin.
Caso prctico
Para la aplicacin de la clnica veterinaria Mara le propone a Juan emplear un fichero para guardar
los datos de los clientes de la clnica. -Como vamos a guardar datos de la clase Cliente, tendremos
que serializar los datos.

Queslaserializacin?Esunprocesoporelqueunobjetoseconvierteenunasecuenciadebytes
conlaquemstardesepodrreconstruirelvalordesusvariables.Estopermiteguardarunobjeto
enunarchivo.

Paraserializarunobjeto:
9

ste debe implementar el interface java.io.Serializable. Este interface no tiene


mtodos, slo se usa para informar a la JVM (Java Virtual Machine) que un objeto va a ser
serializado.
9 TodoslosobjetosincluidosenltienenqueimplementarelinterfazSerializable.
Todos los tipos primitivos en Java son serializables por defecto. (Al igual que los arrays y otros
muchostiposestndar).

Paraleeryescribirobjetosserializablesaunstreamseutilizanlasclasesjava:ObjectInputStream
yObjectOutputStream.

Enelsiguienteejemplosepuedevercmoleerunobjetoserializadoqueseguardantes.Eneste
caso,setratadeunStringserializado:
FileInputStream fich = new FileInputStream(str.out);
ObjectInputStream os = new ObjectInputStream(fich);
Object o = os.readObject();

As vemos que readObject lee un objeto desde el flujo de entrada fich. Cuando se leen objetos
desdeunflujo,sedebetenerencuentaqutipodeobjetosseesperanenelflujo,ysehandeleeren
elmismoordenenqueseguardaron.

Para serializar un fichero basta con implementar el interface Serializable.


Verdadero.
Falso.
Parasaberms
Enelsiguienteenlaceapuedesverunpocomssobreserializacin.
SerializacinenJava.http://nereida.deioc.ull.es/~cleon/psd/0405/prct/p5/pspdf/p5.ps
MssobreserializacinenJava.http://www2.uah.es/jcaceres/cursos/java/archivos/capsulas/capsula_serializable.pdf

8.1.Serializacin:utilidad.
LaserializacinenJavasedesarrollparautilizarseconRMI.RMInecesitabaunmododeconvertir
los parmetros necesarios a enviar a un objeto en una mquina remota, y tambin para devolver
valoresdesdeella,enformadeflujosdebytes.Paradatosprimitivosesfcil,peroparaobjetosms
complejosnotanto,yesemecanismoesprecisamenteloqueproporcionalaserializacin.

Elmtodo writeObjectseutilizaparaguardarunobjetoatravsdeunflujodesalida.Elobjeto
pasadoawriteObjectdebeimplementarelinterfazSerializable.

34

DesarrollodeAplicacionesWeb

Tema6

FileOutputStream fisal = new FileOutputStream(cadenas.out);


ObjectOutputStream oos = new ObjectOutputStream(fisal);
Oos.writeObject();

LaserializacindeobjetosseempleatambinenlaarquitecturadecomponentessoftwareJavaBean.
Lasclasesbeansecarganenherramientasdeconstruccindesoftwarevisual,comoNetBeans.Con
la paleta de diseo se puede personalizar el bean asignando fuentes, tamaos, texto y otras
propiedades.

Unavezquesehapersonalizadoelbean,paraguardarlo,seemplealaserializacin:sealmacenael
objetoconelvalordesuscamposenunficheroconextensin.ser,quesueleemplazarsedentrode
unfichero.jar.

Parasaberms
Enesteenlaceapuedesverunvdeoenelquesecreaunaaplicacinsobreserializacin.No
esthechaconNetBeans,sinoconEclipse,peroesonopresentaningninconveniente.
http://www.youtube.com/watch?v=4eU6WMOVMh4&feature=player_embedded

35

TEMA7

INDICE
1.Introduccin........................................................................................................................................4
2.LibrerasdeJavaparadesarrollarGUIs...............................................................................................5
2.1AWT...............................................................................................................................................................6
PrincipalescomponentesAWT..........................................................................................................................................6
2.2Swing.............................................................................................................................................................7
ComponentesdeSwing.....................................................................................................................................................7
3. Creacin de interfaces grficos de usuario utilizando asistentes y herramientas del entorno
integrado...............................................................................................................................................14
3.1Diseandoconasistentes............................................................................................................................14
4.Eventos..............................................................................................................................................19
4.1Introduccin................................................................................................................................................19
Quesunevento?.........................................................................................................................................................19
Queslaprogramacinguiadaporeventos?...............................................................................................................19
4.2Modelodegestindeeventos....................................................................................................................19
Ejemplodelmodelodegestindeeventos....................................................................................................................21
4.3Tiposdeeventos.........................................................................................................................................24
4.4Eventosdeteclado......................................................................................................................................24
Cdigodeloyentedeteclado..........................................................................................................................................25
4.5Eventosderatn.........................................................................................................................................26
4.6Creacindecontroladoresdeeventos.......................................................................................................29
5.Generacindeprogramasenentornogrfico..................................................................................30
5.1Contenedores..............................................................................................................................................30
5.2Cerrarlaaplicacin......................................................................................................................................31
5.3Organizadoresdecontenedores:layoutmanagers....................................................................................31
5.4Contenedorligero:JPanel...........................................................................................................................33
5.5Etiquetasycamposdetexto.......................................................................................................................33
PropiedadesasociadasaJTextField,ylosmtodosquepermitenmodificarlas.............................................................34
5.6Botones.......................................................................................................................................................35
5.7Casillasdeverificacinybotonesderadio.................................................................................................36
5.8Listas............................................................................................................................................................36
5.8.1Listas(II).................................................................................................................................................................39
EjemploCopiarunalistaaotra....................................................................................................................................39
5.9Listasdesplegables......................................................................................................................................40
EjemploPruebaJComboBox...........................................................................................................................41
5.10Mens.......................................................................................................................................................42
EjemploPruebaMenu..................................................................................................................................................42
5.10.1Separadores..........................................................................................................................................................45
5.10.2Aceleradoresdetecladoymnemnicos...............................................................................................................46

Comunicndonosconelusuario.Interfaces

DAW

DesarrollodeAplicacionesWeb

Comunicndonos
Interfaces

Tema7

con

el

usuario.

CASO.
Ana est cursando el mdulo de Programacin. En el aula, suele sentarse junto a un compaero:
Jos Javier. En clase llevan unos das explicndoles cmo construir aplicaciones Java, utilizando
interfaces grficas de usuario (GUI). Pero, qu es una interfaz de usuario? A grandes rasgos, les
han comentado que una interfaz de usuario es el medio con que el usuario puede comunicarse con
una computadora. Las interfaces grficas de usuario incluyen elementos tales como: mens,
ventanas, paneles, etc, en general, elementos grficos que facilitan la comunicacin entre el ser
humano y la computadora.
Hasta ahora, las aplicaciones de ejemplo que haban realizado, estaban en modo consola, o modo
carcter, y estn contentos porque estn viendo las posibilidades que se les abren ahora. Estn
comprobando que podrn dar a sus aplicaciones un aspecto mucho ms agradable para el usuario.
Ana le comenta a Jos Javier:
-As podremos dar un aspecto profesional a nuestros programas.

Comunicndonosconelusuario.Interfaces

DAW

1.Introduccin.
Hoyendalasinterfacesdelosprogramassoncadavezmssofisticadasyatractivasparaelusuario.
Sonintuitivasycadavezmsfcilesdeusar:pantallastctiles,etc.
Sin embargo, no siempre ha sido as. No hace muchos aos, antes de que surgieran y se
popularizaran las interfaces grficas de usuario para que el usuario interactuara con el sistema
operativo con sistemas como Windows, etc, se trabajaba en modo consola, o modo carcter, es
decir,seledabanlasordenesalordenadorconcomandosporteclado,dehecho,porentoncesno
existaelratn.
Asque,coneltiempo,conlaideadesimplificarelusodelosordenadoresparaextenderelusoaun
cada vez mayor espectro de gente, de usuarios de todo tipo, y no slo para los expertos, se ha
convertidoenunaprcticahabitualutilizarinterfacesgrficasdeusuario(IGUGUIeningls),para
queelusuariointeracteyestablezcauncontactomsfcileintuitivoconelordenador
En ocasiones, vers otras definiciones de interfaz, como la que define una interfaz como un
dispositivo que permite comunicar dos sistemas que no hablan el mismo lenguaje. Tambin se
emplea el trmino interfaz para definir el juego de conexiones y dispositivos que hacen posible la
comunicacinentredossistemas.
Aquenelmdulo,cuandohablamosdeinterfaznosreferimosalacaravisibledelosprogramastaly
comosepresentaalosusuariosparaqueinteractenconlamquina.Lainterfazgrficaimplicala
presencia de un monitor de ordenador, en el que veremos la interfaz constituida por una serie de
menseiconosquerepresentanlasopcionesqueelusuariopuedetomardentrodelsistema
Las interfaces grficas de usuario proporcionan al usuario ventanas, cuadros de dilogo, barras de
herramientas, botones, listas desplegables y muchos otros elementos. Las aplicaciones son
conducidasporeventosysedesarrollanhaciendousodelasclasesqueparaellonosofreceelAPIde
Java.

En1981aparecieronlosprimerosordenadorespersonales,losllamadosPCs,perohasta1993nose
generalizaron las interfaces grficas de usuario. El escritorio del sistema operativo Windows de
Microsoft y su sistema de ventanas sobre la pantalla se ha estandarizado y universalizado, pero
fueronlosordenadoresMacintoshdelacompaaApplelospionerosenintroducirlasinterfaces
grficasdeusuario.

Enelsiguienteenlacepuedesverlaevolucinenlasinterfacesgrficasdediversosoftware,
entreellos,eldelasGUIdeMACOS,odeWindowsenlassucesivasversiones
http://www.guidebookgallery.org/screenshots

Seala la opcin correcta acerca de las interfaces grficas de usuario:


Son sinnimos de ficheros de texto.
Las ventanas de una aplicacin no seran un ejemplo de elemento de interfaz grfica de

usuario.
Surgen con la idea de facilitar la interactuacin del usuario con la mquina.
Ninguna es correcta.

DesarrollodeApllicacionesW
Web

Tema7
7

2.LibrerasdeJavap
paradesa
arrollarG
GUIs.
CASO
O.
Jos
Javier est
un poco ab
brumado por la cantidad de
d compone
entes que tien
ne Java para
a desarrollarr
interffaces grfico
os. Piensa que hay tanto
os, que son tantas clase
es, que nuncca podr aprendrselos..
Ana le
l dice:
-Jos Javier, no
o te preocup
pes, seguro que
q
haciend
do programa
as, enseguida
a ubicars los
l que mss
utilice
es, y el resto
o, siempre tie
enes la docum
mentacin de
e Java para cuando dude
es, consultarrla.

Hemo
os visto quee la interfaz grfica de usuario es la parte dell programa que permite
e al usuario
o
interaaccionarcon
nl.Pero,c
molapodeemoscrearenJava?
El AP
PI (Application Program
mming Interfface) de Javva proporcio
ona una librera de claases para ell
desarrrollo de intterfaces grfficas de usuario (en realidad son do
os: AWT y SSwing). Esass libreras see
englo
obanbajolossnombresde AWT y Swing ,queasuvvezformanp
partedelasJJavaFoundaationClassess
oJFC
C.
Entree las clases de
d las JFC haay un grupo de elementtos importan
nte que ayud
da a la consstruccin de
e
interffacesgrficaasdeusuario
o(GUI)enJaava.
Loselementosqu
uecomponen
nlasJFCson:
9 Componente
C
es
Swingg:
encontramos
componentess tales como botones, cuadros
tanasoelem
d
detexto,ven
mentosdemen.
9 Soporte
S
de diferentes aspecctos y
comportamie
entos (Look and Feel): Permite
laa eleccin de diferentes aparien
ncias de
e
entorno.
Porr ejemplo, el
e mismo programa
p
puede
adqu
uirir un asspecto Mettal Java
(m
multiplataforma, iguaal en cualquier
c
e
entorno),
Motif (el asp
pecto estndar para
e
entornosUni
ix)oWindow
ws(paraenttornosWindows).Deesttaforma,el aspectode laaplicacin
n
p
puede
ser ind
dependientee de la plataaforma, lo cu
ualest muyy bien para u
un lenguaje que lleva laa
seadeidenttidaddemulltiplataformaa,ysepuede
eelegirelquesedeseeeencadamom
mento.
9 In
nterfaz de programaci
p
n Java 2D: permite inccorporar grficos en do
os dimension
nes, texto e
e
im
mgenesdealtacalidad..
9 Soportedea
S
arrastraryso
oltar(DragaandDrop)en
ntreaplicacio
onesJavayaaplicaciones nativas(est
diiseadaparaejeccutarseenelentornoinformtico
o(lenguajedem
quinaysistemaoperativo)alqueesehacereferenccia.Eltrminosee
em
mplea en contra
aposicin a una aplicacin, porr ejemplo, escrita en Java que no es nativa, n
no est diseada
a para una sola
a
pllataforma). Es decir, se im
mplementa un
u portapap
peles. Llamamos aplicaciones nativaas a las quee

eestndesarro
olladasenun
nentornoy unaplataforrmaconcretos(porejem
mploWindow
wsoUnix),yy
slofuncionaarnenesap
plataforma.
9 Soportedeim
S
mpresin.
9 Soportesonid
S
do:Captura,,reproducci
nyprocesaamientoded
datosdeaudioyMIDI
9 Soporteded
S
ispositivosd
deentradad
distintosdelteclado,parrajapons,chino,etc.
9 Soportedefu
S
uncionesdeAccesibilidaad,paracreaarinterfacesparadiscap
pacitados:Pe
ermiteeluso
o
d tecnologaas como los lectores dee pantallas o
de
o las pantallas Braille ad
daptadas a las personass
d
discapacitada
as.
Coneestaslibreraas,Javaprop
porcionauncconjuntode herramientaasparalaconstruccind
deinterfacess
grficcasquetieneenunaaparienciayseccomportand
deformasem
mejanteenttodaslasplataformasen
n
lasqu
ueseejecuteen.

Seaala la opcin incorrectta. JFC con


nsta de los siguientes elementos:
e
Componenttes Swing.
Soporte de diversos lo
ook and feeel.
Soporte de impresin.

Interfaz dee programaacin Java 3D.

Comunicndonosconelusuario.Interfaces

DAW

2.1AWT.
Cuando apareci Java, los componentes grficos disponibles para el desarrollo de GUI se
encontrabanenlalibreradenominadaAbstractWindowToolkit(AWT).
Las clases AWT se desarrollaron usando cdigo nativo (o sea, cdigo asociado a una plataforma
concreta). Eso dificultaba la portabilidad de las aplicaciones. Al usar cdigo nativo, para poder
conservarlaportabilidaderanecesariorestringirlafuncionalidadalosmnimoscomunesatodaslas
plataformas donde se pretenda usar AWT. Como consecuencia, AWT es una librera con una
funcionalidadmuypobre.
Laestructurabsicadelalibreragiraentornoacomponentesycontenedores.
Los contenedores contienen componentes y son componentes a su vez, de forma que los eventos
puedentratarsetantoencontenedorescomoencomponentes.
AWTesadecuadaparainterfacesgrficassencillas,peronoparaproyectosmscomplejos.
Ms tarde, cuando apareci Java 2 surgi una librera ms robusta, verstil y flexible: Swing. AWT
ansigueestandodisponible,dehechoseusaporloscomponentesdeSwing.
PrincipalescomponentesAWT
NOMBREDELACLASEAWT UTILIDADDELCOMPONENTE
Applet
Ventanaparaunaappletqueseincluyeenunapginaweb.
Button
Creaunbotndeaccin.
Creaunreadetrabajoenlaquesepuededibujar.
Canvas
EselnicocomponenteAWTquenotieneunequivalenteSwing.
Checkbox
Creaunacasilladeverificacin.
Label
Creaunaetiqueta.
Menu
Creaunmen.
ComboBox
Creaunalistadesplegable.
List
Creauncuadrodelista.
Frame
Creaunmarcoparalasventanasdeaplicacin.
Dialog
Creauncuadrodedilogo.
Creaunreadetrabajoquepuedecontenerotroscontroleso
Panel
componentes.
PopupMenu
Creaunmenemergente.
RadioButton
Creaunbotnderadio.
ScrollBar
Creaunabarradedesplazamiento.
ScrollPane
Creauncuadrodedesplazamiento.
TextArea
Creaunreadetextodedosdimensiones.
TextField
Creauncuadrodetextodeunadimensin.
Window
Creaunaventana.

PginaoficialdeSunOraclesobreAWT(eningls)
http://download.oracle.com/javase/6/docs/technotes/guides/awt/

AWTsiguesiendoimprescindible,yaquetodosloscomponentesSwingseconstruyenhaciendouso
de clases de AWT. De hecho, como puedes comprobar en el API, todos los componentes Swing,
como por ejemplo JButton (es la clase Swing que usamos para crear cualquier botn de accin en
unaventana),derivandelaclase JComponent ,queasuvezderivadelaclaseAWT Container .
LasclasesasociadasacadaunodeloscomponentesAWTseencuentranenelpaquetejava.awt.
Las clases relacionadas con el manejo de eventos en AWT (Es el modo que tiene una clase de proporcionar
notificacionesalosclientesdelaclasecuandoocurrealgodignoderesearenunobjeto.Elusomshabitualparaloseventosseproduce

DesarrollodeAplicacionesWeb

Tema7

enlasinterfacesgrficas;normalmente,lasclasesquerepresentancontrolesdelainterfazdisponendeeventosquesenotificancuandoel
usuariointeractaconelcontrol(porejemplo,hacerclicenunbotn))estnenelpaquetejava.awt.event.

AWTfuelaprimeraformadeconstruirlasventanasenJava,pero:
9 limitabalaportabilidad,
9 restringalafuncionalidady
9 requerademasiadosrecursos.

AWT est indicado para proyectos muy grandes y de gran complejidad.


Si
No

Decamos ms arriba, que las JFC proporcionan soporte para impresin. En el siguiente
enlacetienesmsinformacinsobreimpresinenJava.
http://artemisa.unicauca.edu.co/~dparedes/java/jdcbook/render.html

2.2Swing.
Cuando se vio que era necesario mejorar las caractersticas que ofreca AWT, distintas empresas
empezaron a sacar sus controles propios para mejorar algunas de las caractersticas de AWT. As,
NetscapesacunalibreradeclasesllamadaInternetFoundationClassesparausarconJava,yeso
oblig a Sun (todava no adquirida por Oracle) a
reaccionar para adaptar el lenguaje a las nuevas
necesidades.
Se desarroll en colaboracin con Netscape todo el
conjunto de componentes Swing que se aadieron a la
JFC.
SwingesunalibreradeJavaparalageneracindelGUI
en aplicaciones. Swing se apoya sobre AWT y aade
JComponents. La arquitectura de los componentes de
Swing facilita la personalizacin de apariencia y
comportamiento, si lo comparamos con los
componentesAWT.

AcontinuacintienesunatablaconlalistadeloscontrolesSwingmshabituales.Debes
tener en cuenta que las imgenes estn obtenidas eligiendo el aspecto (LookAndFeel)
multiplataformapropiodeJava.
ComponentesdeSwing
JApplet
VentanaparaunaAppletqueseincluyeenunapginaweb

Botndeaccin.Pararealizar
JButton
algunaaccinoproceso.

Comunicndonosconelusuario.Interfaces

JColorChooser

Casilladeverificacin.Seusa
normalmenteparaindicaropcionesque
sonindependientes,pudindose
seleccionaralgunas,todasoninguna

Paneldecontrolesquepermiteal
usuarioseleccionaruncolor

JComboBox

Listadesplegable

JCheckBox

JComponent
JDesktopPane

JDialog

JEditorPane

JFileChooser

DAW

ClasebaseparaloscomponentesSwing
Contenedorusadoparacrearunescritorio,esdeciruninterfazpara
mltiplesdocumentosenlamismaaplicacin

Clasebaseparacrearuncuadrode
dilogo.Loscuadrosdedilogoson
ventanasquesolicitanoproporcionan
informacinalusuario

Componentedetextoparaeditarvariostiposdecontenido

Permitealusuarioelegirun
archivoparalalecturao
escritura,mostrandouna
ventanaquenospermite
navegarporlosdistintosdiscosy
carpetasdenuestroordenador

DesarrollodeAplicacionesWeb

JFrame

JInternalFrame

JLabel

JLayeredPane

JList

JMenu

JMenuBar

JMenuItem

Tema7

VersinextendidadeFramede
AWT.Creaunmarcoparalas
ventanasdeaplicacin,dando
soportealospanelesbasey
otrospaneles.Suelenserlas
ventanasprincipalesdela
aplicacin

Unaventanadepesoligero,quese
incluyedentrodeunmarcoJFrame,de
formaquenopuedesacarsedelinterior
deeseJFrame.Escomounnuevo
documentoenlaaplicacinprincipal

Unaetiquetaquepuede
conteneruntextocorto,ouna
imagen,oambascosas
AadecapasauncontenedorSwing,deformaquesepuedansolapar
unoscomponentesconotros

Uncuadrodelistaparaseleccionarunoo
varioselementosdeunalista

Unmendelista
desplegable,queincluye
JMenuItemsyquese
visualizadentrodela
barrademen
(JMenuBar)
Unabarrademen,que
aparecegeneralmente
situadadebajodelabarra
dettulodelaventana

Cadaunadelasopcionesde
unmenconcreto

Comunicndonosconelusuario.Interfaces
JOptionPane

JPanel

JPasswordField

JPopUpMenu

JPopMenu.Separator

JProgressBar

JRadioButton

JRadioButtonMenuItem

JRootPane
JScrollBar

10

DAW

Proporcionaimplementacionesde
cuadrosdedilogoemergentes,mso
menosestndaryprefabricados,
queelusuariopuedeincluircon
muchafacilidadensuaplicacin
Unreadetrabajoquepuedecontenerotroscontrolesocomponentes.
EsuncontenedorSwingdepesoligero
Uncuadrodetextodondenose
muestranloscaracteresque
realmenteseintroducen,sinoalgn
otro(puntosoasteriscos).Seusapara
introducircontraseasdeformaque
otraspersonasnopuedanverelvalor
introducido

Unmenemergente.Laimagendelejemploest
sacadadeunaaplicacindedibujo

Separadorparaunmenemergente
especfico.Permitehacergruposcon
opcionesdentrodelmen.

Unabarradeprogreso,que
visualizagrficamenteun
valorenteroenunintervalo

Creaunbotnderadio.Seusa
normalmenteparaseleccionaruna
opcindeentrevariasexcluyentes
entres

Botndeopcinparaunelemento
deunmen
Componentefundamentalenlajerarquadelcontenedor.Eselpanel
raz.
Unabarradedesplazamiento

DesarrollodeAplicacionesWeb

JScrollPane

Tema7

Panelcontenedorquegestionalas
barrasdedesplazamiento
verticalesyhorizontalesylas
cabecerasdefilasycolumnas.

JSeparator

Separadordemen

JSlider

JSplitPane

JSpinner

JTabbedPane

Barradeslizante.Componenteque
permiteseleccionarunvalorenun
intervalodeslizandounbotn

Paneldivididoendossubpaneles
cuyotamaorelativopuede
modificarsepinchandoy/o
arrastrandolaseparacinentre
ambos

Uncuadrodeentradadeunalneaque
permiteseleccionarunnmero(oelvalor
deunobjeto)deunasecuenciaordenada.
Normalmenteproporcionaunparde
botonesdeflecha,parapasaralsiguienteo
anteriornmero,(oalsiguienteoanterior
valordelasecuencia).

Panelquecontienemltiples
subpaneles,quepuedenser
seleccionadoshaciendoclic
sobrelapestaadecadauno

11

Comunicndonosconelusuario.Interfaces

JTable

Unatablabidimensionalpara
presentardatos

JTextArea

Creaunreadetextodedosdimensiones
paratextoplano

JTextField

Creauncuadrodetextodeuna
dimensin

JTextPane
JToggleButton

JToolBar
JToolBar.Separator

JToolTip

JTree

JViewPort
JWindow

12

DAW

Componentedetextoquesepuedemarcarconatributos

Botndedosestados(on/offo
pulsado/sinpulsar)
Barradeherramientas,para
visualizarcontrolesusados
normalmente.
Separadorespecficode
barrasdeherramientas
Unaespeciedeetiquetaemergente,que
apareceparavisualizarlautilidaddeun
componentecuandoelcursordelratn
pasaporencimadeldetenindose
brevemente,sinnecesidaddepulsarnada.

Visualizaunconjuntodedatosjerrquicosenformade
rbol

Vistapormediodelacualsevelainformacinsubyacente.Cuandose
hacescrollrealmenteloquesemuevenoeslainformacin,sinoel
JViewportatravsdelcualselamira
Ventanaquepuedevisualizarseencualquiersitiodelescritorio

DesarrollodeAplicacionesWeb

Tema7

PorcadacomponenteAWT(exceptoCanvas)existeuncomponenteSwingequivalente,cuyonombre
empieza por J, que permite ms funcionalidad siendo menos pesado. As, por ejemplo, para el
componente AWT Button existe el equivalente Swing JButton, que permite como funcionalidad
adicionalladecrearbotonescondistintasformas(rectangulares,circulares,etc),incluirimgenesen
elbotn,tenerdistintasrepresentacionesparaunmismobotnsegnestseleccionado,obajoel
cursor,etc.
LaraznporlaquenoexisteJCanvasesquelospanelesdelaclaseJPanelyasoportantodoloqueel
componente Canvas de AWT soportaba. No se consider necesario aadir un componente Swing
JCanvasporseparado.

AlgunascaractersticasmsdeSwing,podemosmencionar:
9 Esindependientedelaarquitectura(metodologanonativapropiadeJava)
9 Proporciona todo lo necesario para la creacin de entornos grficos, tales como diseo de
mens,botones,cuadrosdetexto,manipulacindeeventos,etc.
9 LoscomponentesSwingnonecesitanunaventanapropiadelsistemaoperativocadauno,sino
que son visualizados dentro de la ventana que los contiene mediante mtodos grficos, por lo
querequierenbastantesmenosrecursos.
9 LasclasesSwingestncompletamenteescritasenJava,conloquelaportabilidadestotal,ala
vez que no hay obligacin de restringir la funcionalidad a los mnimos comunes de todas las
plataformas
9 Por ello las clase Swing aportan una considerable gama de funciones que haciendo uso de la
funcionalidadbsicapropiadeAWTaumentanlasposibilidadesdediseodeinterfacesgrficas.
9 Debido a sus caractersticas, los componentes AWT se llaman componentes de peso pesado
por la gran cantidad de recursos del sistema que usan, y los componentes Swing se llaman
componentes de peso ligero por no necesitar su propia ventana del sistema operativo y por
tantoconsumirmuchosmenosrecursos.
9 Aunque todos los componentes Swing derivan de componentes AWT y de hecho se pueden
mezclar en una misma aplicacin componentes de ambos tipos, se desaconseja hacerlo. Es
preferibledesarrollaraplicacionesenteramenteSwing,querequierenmenosrecursosysonms
portables.

13

Comunicndonosconelusuario.Interfaces

DAW

3. Creacin de interfaces grficos de usuario utilizando asistentes y


herramientasdelentornointegrado.
CASO.
Ana le ha tomado el gusto a hacer programas con la librera Swing de Java y utilizando el IDE
NetBeans. Le parece tan fcil que no lo puede creer. Pensaba que sera difcil el uso de los controles
de las libreras, pero ha descubierto que es poco menos que cogerlos de la paleta y arrastrarlos hasta
el formulario donde quiere situarlos.
- Pero si esto lo podra hacer hasta mi sobrino pequeo, piensa para s.

Crearaplicacionesqueincluyaninterfacesgrficosdeusuario,conNetBeans,esmuysencillodebido
alasfacilidadesquenosproporcionansusasistentesyherramientas.
ElIDEdeprogramacinnosproporcionaundiseadorparacrearaplicacionesdeunamanerafcil,
sin tener que preocuparnos demasiado del cdigo. Simplemente nos debemos centrar en el
funcionamientodelasmismas.
Un programador experimentado, probablemente no utilizar los asistentes, sino que escribir, casi
siempre,todoelcdigodelaaplicacin.Deestemodo,podrindicarporcdigolaubicacindelos
diferentes controles, de su interfaz grfica, en el contenedor (panel, marco, etc) en el que se
ubiquen.
Peroenelcasodeprogramadoresnovatos,osimplementesiqueremosahorrartiempoyesfuerzo,
tenemos la opcin de aprovecharnos de las capacidades que nos brinda un entorno de desarrollo
visualparadiseareimplementarformulariosgrficos.
AlgunasdelascaractersticasdeNetBeans,queayudanalageneracinrpidadeaplicaciones,yen
particulardeinterfacesson:
9 Modo de diseo libre (Free Design): permite mover
libremente los componentes de interfaz de usuario sobre el
panelomarco,sinatenerseaunodeloslayoutspordefecto.
9 Independencia de plataforma: diseando de la manera ms
fcil, es decir, arrastrando y soltando componentes desde la
paleta al rea de diseo visual, el NetBeans sugiere
alineacin, posicin, y dimensin de los componentes, de
manera que se ajusten para cualquier plataforma, y en
tiempodeejecucinelresultadoseaelptimo,sinimportar
elsistemaoperativodondeseejecutelaaplicacin.
9 Soporte de internacionalizacin. Se pueden internacionalizar
lasaplicacionesSwing,aportandolastraduccionesdecadenasdecaracteres,imgenes,etc,sin
necesidad de tener que reconstruir el proyecto, sin tener que compilarlo segn el pas al que
vaya dirigido. Se puede utilizar esta caractersticas empleando ficheros de recursos
(ResourceBundlefiles). Enellos,deberamosaportartodoslostextosvisibles,comoeltextode
etiquetas, campos de texto, botones, etc. NetBeans proporciona una asistente de
internacionalizacindesdeelmendeherramientas(Tools).

AUTOEVALUACIN.
NetBeans ayuda al programador de modo que pueda concentrarse en implementar la lgica de
negocio que se tenga que ejecutar por un evento dado.
Si
No

3.1Diseandoconasistentes.
Lospasosparacrearyejecutaraplicaciones,sepuedenresumiren:
9 Crearunproyecto.
9 Construirlainterfazconelusuario.

14

DesarrollodeAplicacionesWeb

Tema7

9 Aadirfuncionalidad,enbasealalgicadenegocio(Es la parte de la aplicacin que contiene el cdigo de las


tareasrelacionadasconlosprocesosdeunnegocio,talescomoventas,controldeinventario,contabilidad,etc.Normalmenterealizan
procesostalescomoentradasdedatos,consultasalosdatos,generacindeinformesymsespecficamentetodoelprocesamiento
queserealizadetrsdelaaplicacinvisibleparaelusuario)queserequiera.
9 Ejecutarelprograma.
Veamosunejemploconestospasos:
9 Primero,creaelproyectodelamaneratansimplecomopuedesveren:

15

Comunicndonosconelusuario.Interfaces

DAW

9 Acontinuacin,crealainterfazdeusuariotalycomovesen:

NecesitamoscrearuncontenedorJava
enelcualdispondremoslosotros
componentesdeinterfazgrficode
usuarionecesarios.

SeleccionamosBordeconttuloy
escribimosSumadeNmerosenel
campottulo.

16

DesarrollodeAplicacionesWeb

Tema7

Cdigoquesegeneradeformaautomtica,ydondeincluiremoslopuestoennegrita.
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}

ProcederemosigualparaelbotnLimpiardondepondremos:
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");
}

Deigualformaparaelbotnaadirteclearemos:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// Primero definimos las variables float
float num1, num2, result;
// Convertimos el texto a float
num1 = Float.parseFloat(jTextField1.getText());
num2 = Float.parseFloat(jTextField2.getText());
// Realizamos la suma
result = num1 + num2;
// Pasamos el valor del resultado al jTextField3
// A la misma vez, pasamos el valor de float a string
jTextField3.setText(String.valueOf(result));
}

ElIDE,ennuestrocasoNetBeans,puedeayudarnosaencontrarlalistadeeventosdisponiblesque
nuestroscomponentesGUIpuedenmanejar.
Cuandoestamosdiseandoelinterfaz,seleccionandocualquiercomponente,sepuedeaccederala
pestaaeventos.
En la pestaa Events podemos ver y editar manejadores de eventos asociados al componente GUI
activoactualmente.

17

Comunicndonosconelusuario.Interfaces

DAW

Cadavezquesepresionaunbotn,segeneraun ActionEvent ysepasaalmtodo actionPerformed


del listener ,elcual,ejecutaelcdigoquenosotrosdispusimosenelmanejadordeeventoparaeste
evento.
Para ser capaz de responder, cada componente GUI interactivo necesita registrar a un oyente de
eventosynecesitaimplementarunmanejadordeeventos.
Comovemos,elIDENetBeansseencargadeenganchareloyentedeeventopornosotros,demanera
quepodamosconcentrarnosenimplementarlalgicadenegocioquesetengaqueejecutarporel
evento.

En el siguiente enlace puedes ver, paso a paso, la creacin de un proyecto, que utiliza
interfazgrficadeusuario,conNetBeans,
http://www.udb.edu.sv/Academia/Laboratorios/informatica/Java/guia6Java.pdf

En este otro enlace tambin tienes un documento muy interesante, tambin paso a paso,
sobreconstruccindeinterfacesgrficosconNetBeans.
ftp://soporte.uson.mx/PUBLICO/02_ING.SISTEMAS.DE.INFORMACION/7_Interfaces_grficos_
de_usuario_con_Netbeans_ESPANHOL.pdf

Enelsiguientevdeopuedeverelprimerodeunaseriedecincovdeosenlosqueserealiza
unacalculadoraconlaayudadelosasistentesdeNetBeans.
http://www.youtube.com/watch?v=A9ZX5rWcDOE&feature=related

18

DesarrollodeAplicacionesWeb

Tema7

4.Eventos.
4.1Introduccin.
CASO.
Ana sabe que entender cmo funciona la programacin por eventos es algo relativamente fcil, el
problema est en utilizar correctamente los eventos ms adecuados en cada momento. Ana tiene
muy claro que el evento se asocia a un botn cuando se pulsa, pero Jos Javier la pone en duda,
cuando la llama por telfono para preguntarle unas dudas y le dice, que l cree, que el evento se
produce cuando el botn se suelta. Adems, le recuerda que en clase dijeron que al ser enfocado con
el ratn, o al accionar una combinacin de teclas asociadas, tambin se pueden producir eventos.
Tras hablarlo piensan que realmente no es tan complicado, porque se repiten muchos eventos y si
nos paramos a pensarlo, todos ellos son predecibles y bastante lgicos.

Quesunevento?
Es todo hecho que ocurre mientras se ejecuta la aplicacin. Normalmente, llamamos evento a
cualquierinteraccinquerealizaelusuarioconlaaplicacin,comopuedeser:
9 pulsarunbotnconelratn,
9 hacerdobleclic,
9 pulsaryarrastrar,
9 pulsarunacombinacindeteclasenelteclado,
9 pasarelratnporencimadeuncomponente,
9 salirelpunteroderatndeuncomponente,
9 abrirunaventana,etc.
Queslaprogramacinguiadaporeventos?
Imagina la ventana de cualquier aplicacin, por ejemplo la de un procesador de textos. En esa
ventana aparecen multitud de elementos grficos interactivos, de forma que no es posible que el
programadorhayaprevistotodaslasposiblesentradasquesepuedenproducirporpartedelusuario
encadamomento.
Con el control de flujo de programa de la programacin imperativa, el programador tendra que
estarcontinuamenteleyendolasentradas(deteclado,oratn,etc)ycomprobarparacadaentradao
interaccinproducidaporelusuario,decualsetratadeentretodaslasposibles,usandoestructuras
de flujo condicional ( if then else , switch ) para ejecutar el cdigo conveniente en cada caso. Si
piensasqueparacadaopcindelmen,paracadabotnoetiqueta,paracadalistadesplegable,y
portantoparacadacomponentedelaventana,incluyendolapropiaventana,habraquecomprobar
todos y cada uno de los eventos posibles, nos damos cuenta de que las posibilidades son casi
infinitas,ydesdeluegoimpredecibles.Portanto,deesemodoesimposiblesolucionarelproblema.
Paraabordarelproblemadetratarcorrectamentelasinteraccionesdelusuarioconlainterfazgrfica
delaaplicacinhayquecambiardeestrategia,ylaprogramacinguiadaporeventosesunabuena
solucin,veamoscmofuncionaelmodelodegestindeeventos.

4.2Modelodegestindeeventos.
Qusistemaoperativoutilizas?Poseeunentornogrfico?Hoyen
da,lamayoradesistemasoperativosutilizaninterfacesgrficasde
usuario. Este tipo de sistemas operativos estn continuamente
monitorizandoelentornoparacapturarytratarloseventosquese
producen.
Elsistemaoperativoinformadeestoseventosalosprogramasque
seestnejecutandoyentoncescadaprogramadecide,segnloque
sehayaprogramado,quhaceparadarrespuestaaesoseventos.
Cada vez que el usuario realiza una determinada accin sobre una aplicacin que estamos
programandoenJava,unclicsobreelratn,presionarunatecla,etc,seproduceuneventoqueel
sistemaoperativotransmiteaJava.

19

Comunicndonosconelusuario.Interfaces

DAW

Java crea un objeto de una determinada clase de evento, y este evento se transmite a un
determinadomtodoparaquelogestione.
ElmodelodeeventosdeJavaestbasadoendelegacin,esdecir,laresponsabilidaddegestionar
uneventoqueocurreenunobjetofuentelatieneotroobjetooyente.
Las fuentes de eventos ( event sources ) son objetos que detectan eventos y notifican a los
receptoresquesehanproducidodichoseventos.Ejemplosdefuentes:
9 Botnsobreelquesepulsaopinchaconelratn.
9 Campodetextoquepierdeelfoco.
9 Campodetextosobreelquesepresionaunatecla.
9 Ventanaquesecierra.
9 Etc.
EnelapartadoanteriordecreacindeinterfacesconayudadelosasistentesdelIDE,vimoslofcil
que es realizar este tipo de programacin, ya que el IDE hace muchas cosas, genera cdigo
automticamentepornosotros.
Perotambinpodramoshacerlonosotrostodo,sinotuviramosunIDEcomoNetBeans,oporque
simplementenosapetecierahacerlotododesdecdigo,sinusarasistentesnidiseadoresgrficos.
Enestecaso,lospasosaseguirsepuedenresumiren:
1. Crearlaclaseoyentequeimplementelainterfaz.
Ej. ActionListener :pulsarunbotn.
2. Implementarenlaclaseoyentelosmtodosdelainterfaz.
Ej. void actionPerformed(ActionEvent) .
3. Crear un objeto de la clase oyente y registrarlo como oyente en uno o ms componentes
grficosqueproporcioneninteraccinconelusuario.
Observaunejemplomuysencilloparaverestostrespasos:
Creandoelprograma:
public class Ventanilla extends JFrame {
JLabel etiqueta; // Declarar variables
JButton botonUno, botonDos;
JPanel panel;
public Ventanilla(){
// Creamos los componentes: una etiqueta,
// dos botones y un JPanel.
etiqueta = new JLabel(La etiqueta: );
botonUno = new JButton(Uno);
botonDos = new JButton(Dos);
panel = new JPanel();
// Aadimos los componentes al panel
panel.add(etiqueta);
panel.add(botonUno);
panel.add(botonDos);
// Aadir el panel al Frame
getContentPane().add(panel);
// Crear objeto de la clase oyente para cuando se pulse el botn
OyenteAccion oyenteBoton = new OyenteAccion();
// Registrar el objeto como oyente en los dos botones
botonUno.addActionListener(oyenteBoton);
botonDos.addActionListener(oyenteBoton);
}
}
// Implementacin en la clase oyente
class OyenteAccion implements ActionListener{
// Cuando se pinche en el botn
public void actionPerformed(ActionEvent evento){
// Obtener el botn que dispar el evento
JButton botn = (JButton) evento.getSource();
// Escribir en la etiqueta, el botn que se puls
etiqueta.setText(Botn pulsado: + botn.getText());
}
// Programa principal
public static void main(String args[]){
// Crear la ventana
Ventanilla Ventana = new Ventanilla();
// Establecer el ttulo, el tamao y hacerla visible
ventana.setTitle(Ttulo de la ventana);

20

DesarrollodeAplicacionesWeb

Tema7

ventana.setSize(350,80);
ventana.setVisible(true);
}
}

Alejecutarlo:

SegnpulsemoselbotnUnooDos,seescribirel
nombredelbotnpulsado.

Ejemplodelmodelodegestindeeventos

Creamoselproyecto:

Damosnombrealproyecto

CreamosunnuevoJFrame

21

Comunicndonosconelusuario.Interfaces

Damosnombrealmarco

Arrastramos un botn desde la paleta al


JFrame

Aadimos la funcionalidad: que escriba por


consolabotnpulsado.
Para ello, hacemos doble click sobre el botn
que hemos aadido. Automticamente
NetBeansgeneraelcdigoqueseve,paraque
escribamos el cdigo de lo que debe pasar
cuandosepulseenelbotn.

Aadimos la lnea de cdigo para que se


escribaporconsola

ConstruimoselproyectopulsandoF11

22

DAW

DesarrollodeAplicacionesWeb

Tema7

Laaplicacinenejecucin:
Hay asociado un oyente de eventos (Listener) apropiado para el
tipodeeventoquequeremoscomprobar.
Enelejemplo,hayunActionListener.

VemosqueNetBeansgenerelcdigosealado.
Sevequeaadeunoyentealbotn

Eloyenteessimplementeunprogramaquepermaneceactivo,enejecucinensegundoplano,de
formaparalelaalaaplicacin.
Se encarga exclusivamente de comprobar si se ha producido algn evento del tipo que l sabe
escucharsobreelcomponentealquesehaaadido
Enelcasodelbotndeaccin,elActionListenerseencargadecomprobarsisehaproducidoalgn
eventodeltipoActionEvent(eventodeaccin,comopulsarconelratnoseleccionarconelatajo
deteclado,porejemplo)sobreelbotn.
Enelmomentoqueeloyenteoyeointerceptauneventodeese
tipo,locaptura,ypasaelcontroldelflujodenuestraaplicacinal
Controladordelcomponentealqueestasociado.
El controlador no es ms que el cdigo que el programador ha
escrito para que se ejecute cuando se produce exactamente ese
evento sobre ese componente. Este cdigo recibe del listener
ademsdelcontrol,unparmetroqueesunobjetoEventodeltipo
deleventoescuchadoporeloyente.
En el caso del botn de accin, se transfiere el control al mtodo
actionPerformed() definido por el programador, pasndole como
parmetro el objeto evento del tipo ActionEvent que se ha
producido. El mtodo actionPerformed() contiene todas las
sentenciasquedebenejecutarse.

23

Comunicndonosconelusuario.Interfaces

DAW

Con la programacin guiada por eventos, el programador se concentra en estar


continuamente leyendo las entradas de teclado, de ratn, etc, para comprobar cada
entrada o interaccin producida por el usuario
Si
No

4.3Tiposdeeventos.
En la mayor parte de la literatura escrita sobre Java,
encontrarsdostiposbsicosdeeventos:
9 Fsicos o de bajo nivel: que corresponden a un evento
hardwareclaramenteidentificable.Porejemplo,sepuls
unatecla( KeyStrokeEvent ).Destacarlossiguientes:
En componentes: ComponentEvent . Indica que un
componentesehamovido,cambiadodetamaoode
visibilidad
En contenedores: ContainerEvent . Indica que el contenido de un contenedor ha cambiado
porqueseaadioeliminuncomponente.
Enventanas: WindowEvent .Indicaqueunaventanahacambiadosuestado.
FocusEvent ,indicaqueuncomponentehaobtenidooperdidolaentradadelfoco.
9 Semnticos o de mayor nivel de abstraccin: se componen de un conjunto de eventos fsicos,
quesesucedenenundeterminadoordenytienenunsignificadomsabstracto.Porejemplo:el
usuarioeligeunelementodeunalistadesplegable( ItemEvent ).
ActionEvent , ItemEvent , TextEvent , AdjustmentEvent
LoseventosenJavaseorganizanenunajerarquadeclases:
9 Laclasejava.util.EventObjecteslaclasebasedetodosloseventosenJava.
9 La clase java.awt.AWTEvent es la clase base de todos los eventos que se utilizan en la
construccindeGUIs.
9 CadatipodeeventoloqueseaEventtieneasociadaunainterfazloqueseaListenerquenospermite
definirmanejadoresdeeventos.
9 Con la idea de simplificar la implementacin de algunos manejadores de eventos, el paquete
java.awt.eventincluyeclasesloqueseaAdapterqueimplementanlasinterfacesloqueseaListener.

El evento que se dispara cuando le llega el foco a un botn es un evento de tipo fsico.
Si
No

4.4Eventosdeteclado.
Loseventosdetecladosegenerancomorespuestaaqueelusuariopulsaoliberaunateclamientras
uncomponentetieneelfocodeentrada.
KeyListener(oyentedeteclas)
Mtodo
Causadelainvocacin
keyPressed(KeyEvente)
Sehapulsadounatecla
keyReleased(KeyEvente) Sehaliberadounatecla
keyTyped(KeyEvente)
Sehapulsado(yavecessoltado)unatecla

KeyEvent(eventodeteclas)
Mtodosmsusuales
Explicacin
chargetKeyChar()
Devuelveelcarcterasociadoconlateclapulsada

24

DesarrollodeAplicacionesWeb
intgetKeyCode()
StringgetKeyText()
ObjectgetSource()

Tema7

Devuelveelvalorenteroquerepresentalateclapulsada
Devuelveuntextoquerepresentaelcdigodelatecla
MtodopertenecientealaclaseEventObject.Indicaelobjetoque
produjoelevento

LaclaseKeyEvent,definemuchasconstantesas:
9 KeyEventVK_A especificalateclaA.
9 KeyEventVK_ESCAPE especificalateclaESCAPE
En la siguiente presentacin tienes el cdigo del proyecto que te puedes descargar tambin a
continuacin. En l se puede ver un ejemplo del uso eventos. En concreto vemos cmo se estn
capturando los eventos que se producen al pulsar una tecla y liberarla. El programa escribe en un
readetextolasteclasqueseoprimen.
Cdigodeloyentedeteclado
import javax.swing.* ;
import java.awt.event.* ;
/**
*
* @author JJBH
*/
// Definimos la clase que hereda de JFrame
public class EscuchaTeclas extends JFrame {
// Variables para escribir
private String linea1 = "", linea2 = "", linea3 = "";
private JTextArea areaTexto;
// Constructor de la clase
public EscuchaTeclas () {
// Crear objeto JTextArea
areaTexto = new JTextArea( 10, 15 );
areaTexto.setText( "Pulsa cualquier tecla del teclado..." );
areaTexto.setEnabled( false );
// Aadir al JFrame el objeto areaTexto
this.getContentPane().add( areaTexto );
// Crear el objeto oyente de teclas
OyenteTeclas oyenteTec = new OyenteTeclas() ;
// Registrar el oyente en el JFrame
this.addKeyListener(oyenteTec);
}
// Implementar la clase oyente que implemente el interface KeyListener
class OyenteTeclas implements KeyListener{
// Gestionar evento de pulsacin de cualquier tecla
public void keyPressed( KeyEvent evento )
{
linea1 = "Se oprimi tecla: " + evento.getKeyText( evento.getKeyCode() );
establecerTexto( evento );
}
// Gestionar evento de liberacin de cualquier tecla
public void keyReleased( KeyEvent evento )
{
linea1 = "Se solt tecla: " + evento.getKeyText( evento.getKeyCode() );
establecerTexto( evento );
}
// manejar evento de pulsacin de una tecla de accin
public void keyTyped( KeyEvent evento )
{
linea1 = "Se escribi tecla: " + evento.getKeyChar();
establecerTexto( evento );
}
}

25

Comunicndonosconelusuario.Interfaces

DAW

// Establecer texto en el componente areaTexto


private void establecerTexto( KeyEvent evento )
{
// getKeyModifiersText devuelve una cadena que indica
// el modificador de la tecla, por ejemplo Shift
String temp = evento.getKeyModifiersText( evento.getModifiers() );
linea2 = "Esta tecla " + ( evento.isActionKey() ? "" : "no " ) +
"es una tecla de accin";
linea3 = "Teclas modificadoras oprimidas: " + ( temp.equals( "" ) ? "ninguna" : temp
);
// Establecer texto en el componente areaTexto
areaTexto.setText( linea1 + "\n" + linea2 + "\n" + linea3 + "\n" );
}
public static void main( String args[] )
{
// Crear objeto y establecer propidades
EscuchaTeclas ventana = new EscuchaTeclas();
ventana.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
ventana.setTitle("Ttulo de la ventana");
ventana.setSize( 360, 120 );
ventana.setVisible(true);
}
}

4.5Eventosderatn.
Similarmente a los eventos de teclado, los eventos del ratn se generan como respuesta a que el
usuariopulsaoliberaunbotndelratn,olomuevesobreuncomponente.
MouseListener(oyentederatn)
Sehapulsadounbotndelratnenun
mousePressed(MouseEvente)
componente
Sehaliberadounbotndelratnenun
mouseReleased(MouseEvente)
componente
Sehapulsadoyliberadounbotndelratnsobre
mouseClickerd(MouseEvente)
uncomponente.
Sehaentrado(conelpunterodelratn)enun
mouseEntered(KeyEvente)
componente.
Sehasalido(conelpunterodelratn)deun
mouseExited(KeyEvente)
componente.

MouseMotionListener(oyentederatn)
mouseDragged(MouseEvente)
Sepresionaunbotnysearrastraelratn
Semueveelpunterodelratnsobreun
mouseMoved(MouseEvente)
componente

MouseWheelListener(oyentederatn)
MouseWheelMoved(MouseWheelEvente)
Semuevelaruedadelratn

En el siguiente proyecto podemos ver una demostracin de un formulario con dos botones.
Implementamos un oyente MouseListener y registramos los dos botones para detectar tres de los
cincoeventosdelinterface.

import java.awt.event.* ;
public class miMarcoRaton extends javax.swing.JFrame {

/** Constructor: crea nuevo marco miMarcoRaton */

26

DesarrollodeAplicacionesWeb

Tema7

public miMarcoRaton() {
initComponents();
// Crear el objeto oyente de ratn
OyenteRaton oyenteRat = new OyenteRaton() ;
// Registrar el oyente en el botn de Aceptar
jButton1.addMouseListener(oyenteRat);
// Registrar el oyente en el botn de Cancelar
jButton2.addMouseListener(oyenteRat);
}
// Implementar la clase oyente que implemente el interface MouseListener
// Se deja en blanco el cuerpo de mouseEntered y de mouseExited, ya que
// no nos interesan en este ejemplo. Cuando se desea escuchar algn
// tipo de evento, de deben implementar todos los mtodos del interface
// para que la clase no tenga que ser definida como abstracta
class OyenteRaton implements MouseListener{
// Gestionar evento de pulsacin de cualquier tecla
public void mousePressed(MouseEvent e) {
escribir("Botn de ratn pulsado", e) ;
}
public void mouseReleased(MouseEvent e) {
escribir("Botn de ratn liberado", e);
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
escribir("Click en el botn del ratn", e);
}
void escribir(String eventDescription, MouseEvent e) {
// Escribir en el rea de texto la descripcin que
// se recibe como parmetro
jTextArea1.append(eventDescription + ".\n");
// Comprobamos cul de los dos botones es y lo escribimos
if (e.getComponent().getName().equals(jButton1.getName()) )
jTextArea1.append("Es el botn Aceptar.\n");
else
jTextArea1.append("Es el botn Cancelar.\n");
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("Aceptar");
jButton1.setName("Aceptar"); // NOI18N
jButton2.setText("Cancelar");
jButton2.setName("Cancelar"); // NOI18N
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

27

Comunicndonosconelusuario.Interfaces

DAW

.addGroup(layout.createSequentialGroup()
.addGap(80, 80, 80)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE,
402, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jButton2)
.addGap(18, 18, 18))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(126, 126, 126)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addComponent(jButton1)
.addGap(26, 26, 26))
.addGroup(layout.createSequentialGroup()
.addComponent(jButton2)
.addGap(18, 18, 18)))
.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(33, Short.MAX_VALUE))
);

177,

pack();
}// </editor-fold>//GEN-END:initComponents
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new miMarcoRaton().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration//GEN-END:variables
}

Comoseveenelcdigo,sedejaenblancoelcuerpodemouseEnteredydemouseExited,yaqueno
nos interesan en este ejemplo. Cuando se desea escuchar algn tipo de evento, de deben
implementar todos los mtodos del interface para que la clase no tenga que ser definida como
abstracta.
Paraevitartenerquehaceresto,podemosutilizaradaptadores(esunaclasequeimplementeunoyenteolistener,
peronorealizaningntipodeoperacin.Sedesarrollaronparaevitartenerqueimplementartodoslosmtodosdeuninterface,yaquesi
noseimplementanlaclaseseraabstracta).

Tienesunejemplodeusodelosadaptadoresenelsiguienteenlace:
http://eddi.ith.mx/Curso/Tutoriales/Ozito/post1dot0/ui/eventinnerclasses.html

En el enlace que ves a continuacin, hay tambin un ejemplo interesante de la


programacindeeventosdelratn.
http://www.sc.ehu.es/sbweb/fisica/cursoJava/applets/events/raton.htm

28

DesarrollodeAplicacionesWeb

Tema7

Cuando el usuario deja de pulsar una tecla se invoca a keyReleased(KeyEvent e).


Si
No

4.6Creacindecontroladoresdeeventos.
ApartirdelJDK1.4seintrodujoenJavalaclase EventHandler parasoportaroyentesdeeventomuy
sencillos.
Lautilidaddeestoscontroladoresomanejadoresdeeventoes:
9 Crearoyentesdeeventosintenerqueincluirlosenunaclasepropia.
9 Estoaumenteelrendimiento,yaquenoaadeotraclase.
Comoinconveniente,destacaladificultaddeconstruccin:loserroresnosedetectanentiempode
compilacin,sinoentiempodeejecucin.
Porestarazn,esmejorcrearcontroladoresdeeventoconlaayudadeunasistenteydocumentarlos
todoloposible.
El uso ms sencillo de EventHandler consiste en instalar un oyente que llama a un mtodo, en el
objeto objetivo sin argumentos. En el siguiente ejemplo creamos un ActionListener que invoca al
mtododibujarenunainstanciadejavax.swing.JFrame.
miBoton.addActionListener(
(ActionListener)EventHandler.create(ActionListener.class, frame,"dibujar"));

Cuando se pulse miBoton, se ejecutar la sentencia frame.dibujar(). Se obtendra el mismo efecto,


conmayorseguridadentiempodecompilacin,definiendounanuevaimplementacinalinterface
ActionListener yaadiendounainstanciadeelloalbotn:
// Cdigo equivalente empleando una clase interna en lugar de EventHandler.
miBoton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.dibujar();
}
});

Probablementeelusomstpicode EventHandler esextraerelvalordeunapropiedaddelafuente


delobjetoeventoyestablecerestevalorcomoelvalordeunapropiedaddelobjetodestino.Enel
siguienteejemplosecreaun ActionListener queestablecelapropiedadlabeldelobjetodestinoal
valordelapropiedadtextdelafuente(elvalordelapropiedadsource)delevento.
EventHandler.create(ActionListener.class, miBoton, "label", "source.text")

Estocorresponderaalaimplementacindelasiguienteclaseinterna:
// Cdigo equivalente utilizando una clase interna en vez de EventHandler.
new ActionListener {
public void actionPerformed(ActionEvent e) {
miBoton.setLabel(((JTextField)e.getSource()).getText());
}
}

El uso de EventHandler tiene como inconveniente, que los errores no se detectan en


tiempo de ejecucin.
Si
No

29

Comunicndonosconelusuario.Interfaces

DAW

5.Generacindeprogramasenentornogrfico.
CASO.
Jos Javier va de camino a la clase prctica en la que l, y el resto de la clase, van a probar a hacer
sus primeros pasos en programacin visual con entornos grficos, el profesor les explica que al
principio parece que todo es muy fcil sobre el papel, pero en realidad crear un proyecto con
componentes grficos no siempre es fcil. Pero el profesor lo tiene claro, hay que empezar por los
contenedores que, como su propio nombre indica, se emplean para contener o ubicar al resto de
componentes.

En este mismo tema, ms arriba, has visto la lista de los principales componentes Swing que se
incluyenenlamayoradelasaplicaciones,juntoconunabrevedescripcindesuuso,yunaimagen
quenosdeunaideadeculessuaspecto.
TambinhemosvistounejemplodecmocrearconlaayudadeNetBeansunossencillosprogramas.
Ahora,vamosaverconmayordetalle,loscomponentesmstpicosutilizadosenlosprogramasen
Javaycmoincluirlosdentrodeunaaplicacin.

Algosloesimposiblehastaquealguienlodudeytermineprobandolocontrario.
AlbertEinstein

5.1Contenedores.
Porlosejemplosvistoshastaahora,yatehabrsdadocuentadelanecesidaddequecadaaplicacin
contenga de alguna forma esos componentes. Qu componentes se usan para contener a los
dems?
EnSwingesafuncinladesempeanungrupodecomponentesllamadoscontenedoresSwing.
Existendostiposdeelementoscontenedores:
9 Contenedoresdealtonivelopesopesado.
9 Marcos: JFrame y JDialog paraaplicaciones
9 JApplet ,paraapplets(esuncomponentedeunaaplicacinqueseejecutaenelcontextodeotroprograma,porejemplo
unnavegadorweb.Elappletdebeejecutarseenuncontenedor,queloproporcionaunprogramaanfitrin,medianteunplugin,o
enaplicacionescomotelfonosmvilesquesoportanelmodelodeprogramacinporapplets).
9 Contenedoresdebajonivelopesoligero.Sonlospaneles: JRootPane y JPanel .
Cualquieraplicacin,coninterfazgrficodeusuariotpica,comienzaconlaaperturadeunaventana
principal, que suele contener la barra de ttulo, los botones de minimizar, maximizar/restaurar y
cerrar,yunosbordesquedelimitansutamao.
Esa ventana constituye un marco dentro del cual se van colocando el resto de componentes que
necesita el programador: men, barras de herramientas, barra de estado, botones, casillas de
verificacin,cuadrosdetexto,etc.
Esaventanaprincipalomarcoseraelcontenedordealtoniveldelaaplicacin.
TodaaplicacindeinterfazgrficadeusuarioJavatiene,almenos,uncontenedordealtonivel.
LoscontenedoresdealtonivelextiendendirectamenteaunaclasesimilardeAWT,esdecir, JFrame
extiende de Frame . Es decir, realmente necesitan crear una ventana del sistema operativo
independienteparacadaunodeellos.
Losdemscomponentesdelaaplicacinnotienensupropiaventanadelsistemaoperativo,sinoque
sedibujanensuobjetocontenedor.
Enlosejemplosanterioresdeltema,hemosvistoquepodemosaadirun JFrame desdeeldiseador
de NetBeans, o bien escribindolo directamente por cdigo. De igual forma para los componentes
queaadamossobrel.

Te recomendamos que mires la siguiente web para ver informacin sobre JFrame y
JDialog.
http://chuwiki.chuidiang.org/index.php?title=JFrame_y_JDialog

30

DesarrollodeAplicacionesWeb

Tema7

Cualquier componente de grfico de una aplicacin Java necesita tener su propia


ventana del sistema operativo.
Si
No

5.2Cerrarlaaplicacin.
Cuando quieres terminar la ejecucin de un programa, qu sueles hacer? Pues normalmente
pinchareneliconodecierredelaventanadelaaplicacin.
EnSwing,unacosaescerrarunaventana,yotraesqueesaventanadejedeexistircompletamente,o
cerrarlaaplicacincompletamente.
9 Se puede hacer que una ventana no est visible, y sin embargo que sta siga existiendo y
ocupandomemoriaparatodossuscomponentes,usandoelmtodo setVisible(false) .Eneste
caso bastara ejecutar para el JFrame el mtodo setVisible(true) para volver a ver la ventana
contodossuselementos.
9 Si queremos cerrar la aplicacin, es decir, que no slo se destruya la ventana en la que se
mostraba,sinoquesedestruyanyliberentodoslosrecursos(memoriayCPU)queesaaplicacin
tenareservados,tenemosqueinvocaralmtodo System.exit(0)
9 Tambin se puede invocar para la ventana JFrame al mtodo dispose() , heredado de la clase
Window,quenorequiereningnargumento,yqueborratodoslosrecursosdepantallausados
porestaventanayporsuscomponentes,ascomocualquierotraventanaquesehayaabierto
como hija de esta (dependiente de esta). Cualquier memoria que ocupara esta ventana y sus
componentes se libera y se devuelve al sistema operativo, y tanto la ventana como sus
componentes se marcan como no representables. Y sin embargo, el objeto ventana sigue
existiendo, y podra ser reconstruido invocando al mtodo pack() o la mtodo show() , aunque
deberanconstruirdenuevotodalaventana.
Las ventanas JFrame de Swing permiten establecer una operacin de cierre por defecto con el
mtodo setDefaultCloseOperation() ,definidoenlaclase JFrame .
Cmoseleindicaalmtodoelmododecerrarlaventana?
Losvaloresqueselepuedenpasarcomoparmetrosaestemtodosonunaseriedeconstantesde
clase:
9 DO_NOTHING_ON_CLOSE :Nohacenada,necesitaqueelprogramamanejelaoperacinenelmtodo
windowClosing() deunobjeto WindowListener registradoparalaventana.
9 HIDE_ON_CLOSE : Oculta de ser mostrado en la pantalla pero no destruye el marco o ventana
despusdeinvocarcualquierobjeto WindowListener registrado.
9 DISPOSE_ON_CLOSE : Oculta y termina (destruye) automticamente el marco o ventana despus
deinvocarcualquierobjeto WindowListener registrado.
9 EXIT_ON_CLOSE : Sale de la aplicacin usando el mtodo System.exit(0) . Al estar definida en
JFrame ,sepuedeusarconaplicaciones,peronoconapplets.

System.exit(0) oculta la ventana pero no libera los recursos de CPU y memoria que la
aplicacin tiene reservados.
Si
No

5.3Organizadoresdecontenedores:layoutmanagers.
Loslayoutmanagerssonfundamentalesenlacreacindeinterfacesdeusuario,yaquedeterminan
lasposicionesdeloscontrolesenuncontenedor.

31

Comunicndonosconelusuario.Interfaces

DAW

Enlenguajesdeprogramacinparaunanicaplataforma,elproblemaseramenorporqueelaspecto
serafcilmentecontrolable.Sinembargo,dadoqueJavaestorientadoalaportabilidaddelcdigo,
ste es uno de los aspectos ms complejos de la creacin de interfaces, ya que las medidas y
posicionesdependendelamquinaenconcreto.
Enalgunosentornosloscomponentessecolocanconcoordenadasabsolutas.EnJavasedesaconseja
esaprcticaporqueenlamayoradecasosesimposibleprevereltamaodeuncomponente.
Por tanto, en su lugar, se usan organizadores o tambin llamados administradores de diseo o
layout managers o gestores de distribucin que permiten colocar y maquetar de forma
independientedelascoordenadas.
Debemos hacer un buen diseo de la interfaz grfica, y as tenemos que elegir el mejor gestor de
distribucinparacadaunodeloscontenedoresopanelesdenuestraventana.
Estopodemosconseguirloconelmtodo setLayout() ,alqueselepasacomoargumentounobjeto
deltipode Layout quesequiereestablecer.
En NetBeans, una vez insertado un JFrame , si nos situamos sobre l y pulsamos botn derecho, se
puedever,comomuestralaimagen,queapareceunmen,elcualnospermiteelegirel layout que
queramos.

Enlasiguientewebpuedesvergrficamentelosdistintoslayouts
http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html
http://casidiablo.net/codigojavaflowlayoutborderlayoutgridlayout/

AcontinuacinsemuestraelusodeFlowLayoutparaposicionarvariosbotones.
Alignment:LEFT
HorizontalGap:5
VerticalCap:5

Conlosvalorespordefecto.Todoslos
componentesdelaventanasealinean
alaizquierdaunosseguidosdeotros,
siemprequeencuentrenespaciopara
sersituados.

Alignment:CENTER Alineacincentradadelos
HorizontalGap:25 componentesaumentandoelespacio
VerticalGap:25
horizontalyverticalentrelosmismos

Alignment:LEFT
HorizontalGap:5
VerticalGap:5

Conlasmismaspropiedadesdel
anterioryelmismoLayout,pero
aumentandoelanchodelaventana
paraquequepanmscontroles.Todos
loscomponentesdelaventanase
alineanalaizquierdaytodosenla
mismafila

Alignment:RIGHT
HorizontalGap:25
VerticalGap:25

Alineacinaladerechadelos
componentesconunaumentodel
espaciohorizontalyverticalentrelos
mismos

Alignment:LEFT
HorizontalGap:25
VerticalGap:25

Partiendodelaventanaconelancho
inicial,seaumentaelespacio
horizontalyverticalentrelos
controles(botonesenestecaso),
quedandodistribuidosdeestemodo

32

DesarrollodeAplicacionesWeb

Tema7

Cuando programamos en Java es aconsejable establecer coordenadas absolutas, siempre


que sea posible, en nuestros componentes.
Si
No

5.4Contenedorligero:JPanel.
Es la clase utilizada como contenedor genrico para agrupar
componentes.
Normalmente cuando una ventana de una aplicacin con interfaz
grficacualquierapresentavarioscomponentes,parahacerlams
atractivayordenadaalusuariosesuelehacerlosiguiente:
9 Crearunmarco,un JFrame .
9 Para organizar mejor el espacio en la ventana, aadiremos
varios paneles, de tipo JPanel . (Uno para introducir los datos
deentrada,otroparamostrarlosresultadosyuntercerocomo
zonadenotificacindeerrores.)
9 Cadaunodeesospanelesestardelimitadoporunbordequeincluirunttulo.Paraelloseusan
lasclasesdisponiblesen BorderFactory ( BevelBorder , CompoundBorder , EmptyBorder , EtchedBorder ,
9 LineBorder , LoweredBevelBorder , MatteBorder y TitledBorder )quenosdaunsurtidomsomenos
ampliodetiposdebordesaelegir.
9 Encadaunodeesospanelesseincluyenlasetiquetasycuadrosdetextoquesenecesitanpara
mostrarlainformacinadecuadamente.
Con NetBeans es tan fcil como arrastrar tantos controles JPanel de la paleta hasta el JFrame . Por
cdigo,tambinesmuysencillo,porejemplopodramoscrearunpanelrojo,darlesuscaractersticas
yaadirloal JFrame delsiguientemodo:

JPanel panelRojo = new JPanel();


panelRojo.setBackground(Color.RED);
panelRojo.setSize(300,300);
// Se crea una ventana
JFrame ventana=new JFrame("Prueba en rojo");
ventana.setLocation(100,100);
ventana.setVisible(true);
// Se coloca el JPanel en el content pane
Container contentPane=ventana.getContentPane();
contentPane.add(panelRojo);

CuandoenSundesarrollaronJava,losdiseadoresdeSwing,poralgunacircunstancia,determinaron
que para algunas funciones, como aadir un JComponent , los programadores no pudiramos usar
JFrame.add, sino que en lugar de ello, primeramente, tuviramos que obtener el objeto Container
asociadocon JFrame.getContentPane() ,yaadirlo.
Sun se dio cuenta del error y ahora permite utilizar JFrame.add, desde Java 1.5 en adelante. Sin
embargo,podemostenerelproblemadequeuncdigodesarrolladoyejecutadocorrectamenteen
1.5falleenmquinasquetenganinstalado1.4oanteriores.

Enlasiguientewebpuedesveralgomssobrepaneles.
http://members.fortunecity.es/mastermdei/usuarios.tripode.es/panel.html

5.5Etiquetasycamposdetexto.
LoscuadrosdetextoSwingvienenimplementadosenJavaporlaclase JTextField .
Parainsertaruncampodetexto,elprocedimientoestanfcilcomo:seleccionarel
botncorrespondientea JTextField enlapaletadecomponentes,eneldiseador,

33

Comunicndonosconelusuario.Interfaces

DAW

ypincharsobreelreadediseoencimadelpanelenelquequeremossituaresecampodetexto.El
tamaoyellugarenelquesesite,dependerdel Layout elegidoparaesepanel.
El componente Swing etiqueta JLabel , se utiliza para crear etiquetas de modo que podamos
insertarlasenunmarcoounpanelparavisualizaruntextoesttico,quenopuedeeditarelusuario.
Losconstructoresson:
9 JLabel() .Creaunobjeto JLabel sinnombreysinningunaimagenasociada.
9 JLabel(Icon imagen) .Creaunobjetosinnombreconunaimagenasociada.
9 JLabel(Icon imagen, int alineacionHorizontal) .Creaunaetiquetaconlaimagenespecificaday
lacentraenhorizontal.
9 JLabel(String texto) .Creaunaetiquetaconeltextoespecificado.
9 JLabel(String texto, Icon icono, int alineacionHorizontal) .Creaunaetiquetaconeltextoy
laimagenespecificadayalineadahorizontalmente.
9 JLabel(String texto, int alineacionHorizontal) .Creaunaetiquetaconeltextoespecificadoy
alineadohorizontalmente.
PropiedadesasociadasaJTextField,ylosmtodosquepermitenmodificarlas
Propiedad
Mtodosasociados
Descripcin
setBackground()
Estableceelcolordelfondodelcuadrode
Background
getBackground()
texto.
Permiteseleccionarlascaractersticasdel
Border
setBorder()
bordequetieneelcuadrodetextopara
delimitarlo
Establecesisevaapodermodificareltextodel
campodetextoporelusuariodelaaplicacin.
Editable
setEditable()
Aunqueseestablezcasuvalorafalse,el
programasquepodrmodificaresetexto.
setFont().
Establecelaspropiedadesdelafuente(tipode
Font
getFont()
letra,estiloytamaodeltexto)
Foreground
setForeground()
Estableceelcolordeltexto.
Establecelajustificacindeltextodentrodel
HorizontalAlignment setHorizontalAlignment() cuadrodetexto(Justificadoalaizquierda,
centradooaladerecha).
Estableceeltextoquecontieneelcuadrode
texto.Tambinesposiblemezclartextode
distintoscoloresyfuentes,usandoetiquetas
setText()
HTMLcomopartedeltexto.Paramsdetalles
Text
getText()
sobreelusodeHTMLeneltextodelos
componentes,debesmirarlaseccinUsing
HTMLinSwingComponentsdeltutorialde
Java,disponibleenladocumentacindelJDK.
Aadeuncomentariodeayudaflotante,de
setToolTipText()
ToolTipText
formaquesedespliegaaldetenerelcursor
getToolTipText()
encimadelcomponente.
Establecesielcomponentevaaestaractivoo
no.Uncomponentequenoestactivono
puederesponderalasentradasdelusuario.
Enabled
setEnabled()
Algunoscomponentes,comoJTextField,
modificansurepresentacinvisualparadejar
claroquenoestnactivos,mostrandouncolor
grisatenuado.
MaximunSize
setMaximumSize()
Estableceeltamaomximoparael

34

DesarrollodeAplicacionesWeb

MinimunSize

getMaximumSize()
setMinimumSize()
getMinimumSize()

PreferredSize

setPreferredSize()
getPreferredSize()

Opaque

setOpaque()

Tema7
componente.
Estableceeltamaomnimoparael
componente.
Estableceeltamaopreferidoparael
componente.Elvalorpreferidosetendren
cuentaalahoraderedimensionarlaventana,
segnelLayoutquesehayausado,para
procurarqueelaspectoseasiempreelmejor
posible,peronohaygarantasdequese
respetesiempre.
Establecesielcomponentevaaseropaco,osi
porelcontrariovaapermitirqueseveanotros
componentesquepuedanestardebajodel,
comosifuerauncristaltransparente.

EnelsiguienteenlacepuedesvercmousarDecimalFormatparapresentarunnmeroen
unJTextFieldorecogereltextodelJTextFieldyreconstruirelnmero.
http://chuwiki.chuidiang.org/index.php?title=DecimalFormat

Un componente JLabel permite al usuario de la aplicacin en ejecucin cambiar el texto


que muestra dicho componente.
Si
No

5.6Botones.
Ya has podido comprobar que prcticamente todas las
aplicaciones incluyen botones que al ser pulsados
efectan alguna accin: hacer un clculo, dar de alta un
libro,aceptarmodificaciones,etc.
Estos botones se denominan botones de accin,
precisamente porque realizan una accin cuando se
pulsan.EnSwing,laclasequelosimplementaenJavaesla
JButton .
Losprincipalesmtodosson:
9 void setText(String) :Asignaeltextoalbotn.
9 String getText() :Recogeeltexto.
Hayuntipoespecialdebotones,quesecomportancomointerruptoresdedosposicionesoestados
(pulsadoson, no pulsadosoff). Esos botones especiales se denominan botones on/off o
JToggleButton .

Acontinuacinpuedesverunpardeenlaces:unaenelquesediseaunainterfazgrficade
usuario sencilla, con los controles que hemos visto hasta ahora, y el segundo enlace, en
ingls,unejemploparaaadirunbotnenJavaporcdigo.
http://geocities.ws/wlopezm/articulos/gui_java.pdf

http://www.apl.jhu.edu/~hall/java/SwingTutorial/SwingTutorialJButton.html

35

Comunicndonosconelusuario.Interfaces

DAW

5.7Casillasdeverificacinybotonesderadio.
LascasillasdeverificacinenSwingestnimplementadasparaJavaporla
clase JCheckBox , y los botones de radio o de opcin por la clase
JRadioButton .Losgruposdebotones,porlaclase ButtonGroup .
Lafuncionalidaddeamboscomponentesesenrealidadlamisma.
9 Ambos tienen dos estados: Seleccionados o no seleccionados.
(marcadosonomarcados)
9 Ambossemarcanodesmarcanusandoelmtodo setSelected(boolean estado) ,queestablece
elvalorparasupropiedad selected .(Elestadotomaelvalor true paraseleccionadoy false para
noseleccionado)
9 Aamboslepodemospreguntarsiestnseleccionadosono,medianteelmtodo isSelected() ,
quedevuelve true sielcomponenteestseleccionadoy false sinoloest.
9 Para ambos podemos asociar un icono distinto para el estado de seleccionado y el de no
seleccionado.
JCheckBox puedenusarseenmensmediantelaclase JCheckBoxMenuItem .
JButtonGroup permite agrupar una serie de casillas de verificacin ( JRadioButton ), de entre las que
slo puede seleccionarse una. Marcar una de las casillas implica que el resto sean desmarcadas
automticamente. La forma de hacerlo consiste en aadir un JButtonGroup y luego, agregarle los
botones.
Cuando en un contenedor aparezcan agrupados varios botones de radio (o de opcin),
entenderemosquenosonopcionesindependientes,sinoqueslounodeellospodrestaractivoen
cadamomento,ynecesariamenteunodebeestaractivo.Portantoenesecontextoentendemosque
sonopcionesexcluyentesentres.

EnelsiguienteenlacepuedesverunvdeotutorialparacrearunejemplobsicodeJavacon
interfazgrfica.
http://www.youtube.com/watch?v=J0u_yf5CZNE&feature=related

Los componentes radiobotones y las casillas de verificacin tienen ambos dos estados:
seleccionado y no seleccionado.
Si
No

5.8Listas.
En casi todos los programas, nos encontramos con que se pide al usuario
que introduzca un dato, y adems un dato de entre una lista de valores
posibles,noundatocualquiera.
Laclase JList constituyeuncomponentelistasobreelquesepuedevery
seleccionar uno o varios elementos a la vez. En caso de haber ms
elementos de los que se pueden visualizar, es posible utilizar un
componente JScrollPanel paraqueaparezcanbarrasdedesplazamiento.

Paraaadirun JList enNetBeansprocederemoscomopodemosobservarenlasiguientepgina:

36

DesarrollodeAplicacionesWeb

Tema7

Arrastrarelcontrol List delapaletahastael


paneldondequeramossituarlo.
Pordefectovemosquelleva5elementos:
item1hastaitem5.

Unavezinsertadohacemosbotnderecho
sobreelcomponenteyseleccionamoslas
propiedades.

Pinchamosenelbotoncilloquehayala
derechadelapropiedadmodel.

Podemosintroducirloselementosque
queremosqueaparezcanenlalista

37

Comunicndonosconelusuario.Interfaces

DAW

Alaceptarvemosqueenlalistaaparecenlos
datosqueacabamosdeintroducir

Enloscomponentes JList ,unmodelo ListModel representaloscontenidosdelalista.Estosignifica


quelosdatosdelalistaseguardanenunaestructuradedatosindependiente,denominadamodelo
de la lista. Es fcil mostrar en una lista los elementos de un vector o array de objetos, usando un
constructorde JList quecreeunainstanciade ListModel automticamenteapartirdeesevector.
Vemosacontinuacinunejemplopararcrearunalista JList quemuestralascadenascontenidasen
elvectorinfo[]:
String[] info = {"Pato", "Loro", "Perro", "Cuervo"};
JList listaDatos = new JList(info);
/* El valor de la propiedad model de JList es un objeto que proporciona una visin
de slo lectura del vector info[]. El mtodo getModel() permite recoger ese modelo
en forma de Vector de objetos, y utilizar con los mtodos de la clase Vector, como
getElementAt(i), que proporciona el elemento de la posicin i del Vector. */
for (int i = 0; i < listaDatos.getModel().getSize(); i++) {
System.out.println(listaDatos.getModel().getElementAt(i));
}

AcontinuacinpuedesvercmocrearunJList,pasoapaso,enelenlacesiguiente.
http://jcmouse.blogspot.com/2010/02/anadireliminarelementosdejlisten.html

Enelenlacequetienesacontinuacinpuedesverunapresentacin,queaunqueconaudio
eningls,eslosuficientementeexplicativaparaentenderla.
http://bits.netbeans.org/media/quickstartguialign.swf
Resumen:SevisualizaelentornoNetBeansconunformulariodiseadoconvarioscontroles:
dospaneles,unoarribayotroabajo.Enelpaneldearribahaycuatrocamposdetextocon
susrespectivasetiquetasyelpaneldeabajoaparecevaco.Sehaceunclickenlaetiqueta
quehaymshaciaarribaalaizquierdayentoncessehaceclickenelbotndealinearala
derecha,queapareceenlabarradeherramientasquehaysobreelformulario.Serepitelo
mismoparalasotrasetiquetas.Traseso,seveahoracmocambiarotroaspecto,estavez
deloscamposdetexto.Seseleccionaeldeabajoalaizquierda,ysehaceclickconelbotn
derecho del ratn; en el men contextual se selecciona Autoresizing Horizontal. De este
modo,entiempodeejecucin,esecontrolsepodrcambiardetamaohorizontalmente.
Se aade ahora una etiqueta ms, arrastrndola desde la paleta de componentes de la
derechadelapantalla.
Ahoraseaadeuncontrolcomboboxaladerechadelaetiquetaaadida.
Seaadeahoraunaetiquetaenelpanelinferior,ydespusuncampodetextoasuderecha,
queseredimensionaarrastrndolodesdesubordederecho.Tambinseaadefinalmente
unalista.

38

DesarrollodeAplicacionesWeb

Tema7

5.8.1Listas(II).
Cuando trabajamos con un componente JList , podemos seleccionar un nico elemento, o varios
elementosalavez,queasuvezpuedenestarcontiguosonocontiguos.Laposibilidaddehacerlode
unauotramaneralaestablecemosconlapropiedad selectionMode .
Los valores posibles para la propiedad selectionMode para cada una de esas opciones son las
siguientesconstantesdeclasedelinterface ListSelectionModel :
9 MULTIPLE_INTERVAL_SELECTION : Es el valor por defecto. Permite seleccionar mltiples intervalos,
manteniendopulsadalateclaCTRLmientrasseseleccionanconelratnunoauno,olateclade
maysculas,mientrassepulsaelprimerelementoyelltimodeunintervalo.
9 SINGLE_INTERVAL_SELECTION : Permite seleccionar un nico intervalo, manteniendo pulsada la
teclamaysculasmientrasseseleccionaelprimeryltimoelementodelintervalo.
9 SINGLE_SELECTION :Permiteseleccionarcadavezunnicoelementodelalista.
Podemos establecer el valor de la propiedad selectedIndex con el mtodo setSelectedIndex() es
decir, el ndice del elemento seleccionado, para seleccionar el elemento del ndice que se le pasa
comoargumento.
Comohemoscomentado,losdatossealmacenanenunmodeloquealfinyalcaboesunvector,por
loquetienesentidohablardendiceseleccionado.
Tambin se dispone de un mtodo getSelectedIndex() con el que podemos averiguar el ndice del
elementoseleccionado.
El mtodo getSelectecValue() devuelve el objeto seleccionado, de tipo Object , sobre el que
tendremos que aplicar un casting explcito para obtener el elemento que realmente contiene la
lista(porejemploun String ).
Observa que la potencia de usar como modelo un vector de Object , es que en el JList podemos
mostrarrealmentecualquiercosa,comoporejemplo,unaimagen.
Elmtodo setSelectedValue() permiteestablecerculeselelementoquevaaestarseleccionado.
Sisepermitehacerseleccionesmltiples,contamosconlosmtodos:
9 setSelectedIndices() , alque se le pasa como argumento un vector de enteros que representa
losndicesaseleccionar.
9 getSelectedIndices() , que devuelve un vector de enteros que representa los ndices de los
elementosotemsqueenesemomentoestnseleccionadosenel JList .
9 getSelectedValues() ,quedevuelveunvectorde Object conloselementosseleccionadosenese
momentoenel JList .

EjemploCopiarunalistaaotra

// Cmo copiar elementos de una lista a otra.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PruebaSeleccionMultiple extends JFrame
{
private JList listaColores, listaCopia;
private JButton botonCopiar;
private final String nombresColores[] = { "Negro", "Azul", "Cyan",
"Gris oscuro", "Gris", "Verde", "Gris claro", "Magenta", "Naranja",
"Rosa", "Rojo", "Blanco", "Amarillo" };
// configurar GUI
public PruebaSeleccionMultiple()
{
super( "Listas de seleccin mltiple" );
// obtener panel de contenido y establecer su esquema
Container contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
// establecer objeto JList listaColores
listaColores = new JList( nombresColores );

39

Comunicndonosconelusuario.Interfaces

DAW

listaColores.setVisibleRowCount( 5 );
listaColores.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
contenedor.add( new JScrollPane( listaColores ) );
// crear botn copiar y registrar su componente de escucha
botonCopiar = new JButton( "Copiar >>>" );
botonCopiar.addActionListener(
new ActionListener() {

// clase interna annima

// manejar evento de botn


public void actionPerformed( ActionEvent evento )
{
// colocar valores seleccionados en listaCopia
listaCopia.setListData( listaColores.getSelectedValues() );
}
} // fin de clase interna annima
); // fin de la llamada a addActionListener
contenedor.add( botonCopiar );
// establecer objeto JList listaCopia
listaCopia = new JList( );
listaCopia.setVisibleRowCount( 5 );
listaCopia.setFixedCellWidth( 100 );
listaCopia.setFixedCellHeight( 15 );
listaCopia.setSelectionMode(
ListSelectionModel.SINGLE_INTERVAL_SELECTION );
contenedor.add( new JScrollPane( listaCopia ) );
setSize( 325, 130 );
setVisible( true );
} // fin del constructor PruebaSeleccionMultiple
public static void main( String args[] )
{
JFrame.setDefaultLookAndFeelDecorated(true);
PruebaSeleccionMultiple aplicacion = new PruebaSeleccionMultiple();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
} // fin de la clase PruebaSeleccionMultiple

Los componentes JList permiten la seleccin de elementos de una lista, siempre que
estn uno a continuacin del otro de manera secuencial.
Si
No

5.9Listasdesplegables.
Una lista desplegable se representa en Java con el componente Swing
JComboBox . Consiste en una lista en la que slo se puede elegir una
opcin.
SepuedencrearJComboBoxestantoeditablescomonoeditables.
Unalistadesplegableesunamezclaentreuncampodetextoeditabley
una lista. Si la propiedad editable de la lista desplegable la fijamos a verdadero, o sea a true, el
usuariopodrseleccionarunodelosvaloresdelalistaquesedespliegaalpulsarelbotndelaflecha
haciaabajoydispondrdelaposibilidaddetecleardirectamenteunvalorenelcampodetexto.
Establecemoslapropiedadeditabledel JComboBox elmtodo setEditable() ysecompruebaconel
mtodo isEditable() . La clase JComboBox ofrece una serie de mtodos que tienen nombres y
funcionalidadessimilaresalosdelaclase JList .

40

DesarrollodeAplicacionesWeb

Tema7

PuedesverenelsiguientevideotutorialcmosecreaunaaplicacinconNetBeans,enlaque
sevanaadiendoloscontrolesquehemosvisto,entreellosunalistadesplegable.
http://www.youtube.com/watch?v=EVdjtl8BFu4
Se ve como con el asistente de NetBeans se crea un nuevo proyecto. En l se crea un
formulario y sobre el formulario se arrastra un panel y luego otro, uno debajo del otro,
desdelapaletadecontroles.Entremediasdelosdospaneles,sesitancuatrobotonesque
searrastrantambindesdelapaleta.
EnelpaneldearribasesitandoscontrolesComboboxarrastradosdesdelapaleta,yenel
panel de abajo se sitan tres campos de texto. Los botones se cambian de etiquetan para
que muestren respectivamente los smbolos de la suma, la resta, la multiplicacin y la
divisin.
Tambin, se editan los valores posibles que pueden tomar los combos, para que sean
nmeros.

EjemploPruebaJComboBox
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import
import
import
import

javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JTextField;
javax.swing.WindowConstants;

/**
* Ejemplo de uso de JComboBox.
* @author chuidiang
*/
public class PruebaJComboBox {
private JTextField tf;
private JComboBox combo;
private JFrame v;
/**
* @param args
*/
public static void main(String[] args) {
new PruebaJComboBox();
}
public PruebaJComboBox()
{
// Creacion del JTextField
tf = new JTextField(20);
// Creacion del JComboBox y aadir los items.
combo = new JComboBox();
combo.addItem("uno");
combo.addItem("dos");
combo.addItem("tres");
// Accion a realizar cuando el JComboBox cambia de item seleccionado.
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tf.setText(combo.getSelectedItem().toString());
}
});
// Creacion de la ventana con los componentes
v = new JFrame();
v.getContentPane().setLayout(new FlowLayout());
v.getContentPane().add(combo);
v.getContentPane().add(tf);
v.pack();

41

Comunicndonosconelusuario.Interfaces

DAW

v.setVisible(true);
v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}

5.10Mens.
Enlasaplicacionesinformticassiempreseintentaqueelusuariodispongadeunmenparafacilitar
lalocalizacinunaoperacin.Lafilosofa,alcrearunmen,esquecontengatodaslasaccionesque
elusuariopuedarealizarenlaaplicacin.Lomsnormalytileshacerloclasificandooagrupandolas
operacionesporcategorasensubmens.
EnJavausamosloscomponentes JMenu y JMenuItem paracrearunmeneinsertarloenunabarrade
mens.
Labarrademensesuncomponente JMenuBar .Losconstructoressonlossiguientes:
9 JMenu() :Construyeunmensinttulo.
9 JMenu(String s) :Construyeunmenconttuloindicadopors.
9 JMenuItem() :Construyeunaopcinsiniconoysintexto.
9 JMenuItem(Icon icono) :Construyeunaopcinconiconoycontexto.
Podemosconstruirporcdigounmensencillocomoeldelaimagenconlassiguientessentencias:
// Crear la barra de men
JMenuBar barra = new JMenuBar();
// Crear el men Archivo
JMenu menu = new JMenu("Archivo");
// Crear las opciones del men
JMenuItem opcionAbrir = new JMenuItem("Abrir");
menu.add(opcionAbrir);
JMenuItem opcionguardar = new JMenuItem("Guardar");
menu.add(opcionguardar);
JMenuItem opcionSalir = new JMenuItem("Salir");
menu.add(opcionSalir);
// Aadir las opciones a la barra
barra.add(menu);
// Establecer la barra
setJMenuBar(barra);

Frecuentemente,dispondremosdealgunaopcindentrodeunmen,quealelegirla,nosdarpaso
aunconjuntomsampliodeopcionesposibles.
Cuandoenunmen,unelementodelmismoesasuvezunmen,seindicaconelsmboloalfinalde
esaopcin,deformaquesesepaque,alseleccionarla,nosabrirunnuevomen.
Paraincluirunmencomosubmendeotrobastaconincluircomotemdelmen,unobjetoque
tambinseaunmen,esdecir,incluirdentrodel JMenu unelementodetipo JMenu .
EjemploPruebaMenu
// Demostracin de los mens
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PruebaMenu extends JFrame
{
private final Color valoresColor[]={Color.black,Color.blue,Color.red,Color.green };
private JRadioButtonMenuItem elementosColor[], tiposLetra[];
private JCheckBoxMenuItem elementosEstilo[];
private JLabel pantallaEtiqueta;
private ButtonGroup grupoTiposLetra, grupoColores;
private int estilo;
// configurar GUI
public PruebaMenu()
{
super( "Uso de objetos JMenu" );
// establecer men Archivo y sus elementos de men
JMenu menuArchivo = new JMenu( "Archivo" );
menuArchivo.setMnemonic( 'A' );

42

DesarrollodeAplicacionesWeb

Tema7

// establecer elemento de men Acerca de...


JMenuItem elementoAcerca = new JMenuItem( "Acerca de..." );
elementoAcerca.setMnemonic( 'c' );
menuArchivo.add( elementoAcerca );
elementoAcerca.addActionListener(
new ActionListener() {

// clase interna annima

// mostrar cuadro de dilogo de mensaje cuando el usuario seleccione Acerca de...


public void actionPerformed( ActionEvent evento )
{
JOptionPane.showMessageDialog( PruebaMenu.this,
"ste es un ejemplo\ndel uso de mens",
"Acerca de", JOptionPane.PLAIN_MESSAGE );
}
}

// fin de la clase interna annima

); // fin de la llamada a addActionListener


// establecer elemento de men Salir
JMenuItem elementoSalir = new JMenuItem( "Salir" );
elementoSalir.setMnemonic( 'S' );
menuArchivo.add( elementoSalir );
elementoSalir.addActionListener(
new ActionListener() {

// clase interna annima

// terminar la aplicacin cuando el usuario haga clic en elementoSalir


public void actionPerformed( ActionEvent evento )
{
System.exit( 0 );
}
}

// fin de la clase interna annima

); // fin de la llamada a addActionListener


// crear barra de mens y adjuntarla a la ventana PruebaMenu
JMenuBar barra = new JMenuBar();
setJMenuBar( barra );
barra.add( menuArchivo );
// crear men Formato, con sus submens y elementos de men
JMenu menuFormato = new JMenu( "Formato" );
menuFormato.setMnemonic( 'F' );
// crear submen Color
String colores[] = { "Negro", "Azul", "Rojo", "Verde" };
JMenu menuColor = new JMenu( "Color" );
menuColor.setMnemonic( 'C' );
elementosColor = new JRadioButtonMenuItem[ colores.length ];
grupoColores = new ButtonGroup();
ManejadorEventos manejadorEventos = new ManejadorEventos();
// crear elementos de men tipo botones de opcin para el men Color
for ( int cuenta = 0; cuenta < colores.length; cuenta++ ) {
elementosColor[ cuenta ] =
new JRadioButtonMenuItem( colores[ cuenta ] );
menuColor.add( elementosColor[ cuenta ] );
grupoColores.add( elementosColor[ cuenta ] );
elementosColor[ cuenta ].addActionListener( manejadorEventos );
}
// seleccionar primer elemento del men Color
elementosColor[ 0 ].setSelected( true );
// agregar el men Formato a la barra de mens
menuFormato.add( menuColor );
menuFormato.addSeparator();
// crear submen Tipo de letra
String nombresTiposLetra[] = { "Serif", "Monospaced", "SansSerif" };
JMenu menuTiposLetra = new JMenu( "Tipo de letra" );

43

Comunicndonosconelusuario.Interfaces

menuTiposLetra.setMnemonic( 'T' );
tiposLetra = new JRadioButtonMenuItem[ nombresTiposLetra.length ];
grupoTiposLetra = new ButtonGroup();
// crear elementos de men tipo botones de opcin para el men Tipos de letra
for ( int cuenta = 0; cuenta < tiposLetra.length; cuenta++ ) {
tiposLetra[ cuenta ] = new JRadioButtonMenuItem( nombresTiposLetra[ cuenta ] );
menuTiposLetra.add( tiposLetra[ cuenta ] );
grupoTiposLetra.add( tiposLetra[ cuenta ] );
tiposLetra[ cuenta ].addActionListener( manejadorEventos );
}
// seleccionar el primer elemento del men Tipo de letra
tiposLetra[ 0 ].setSelected( true );
menuTiposLetra.addSeparator();
// establecer elementos del men Estilo
String nombresEstilo[] = { "Negrita", "Cursiva" };
elementosEstilo = new JCheckBoxMenuItem[ nombresEstilo.length ];
ManejadorEstilo manejadorEstilo = new ManejadorEstilo();
// crear elementos de men tipo casilla de verificacin para el men Estilo
for ( int cuenta = 0; cuenta < nombresEstilo.length; cuenta++ ) {
elementosEstilo[ cuenta ] =
new JCheckBoxMenuItem( nombresEstilo[ cuenta ] );
menuTiposLetra.add( elementosEstilo[ cuenta ] );
elementosEstilo[ cuenta ].addItemListener( manejadorEstilo );
}
// colocar men Tipo de letra en el men Formato
menuFormato.add( menuTiposLetra );
// agregar men Formato a la barra de mens
barra.add( menuFormato );
// establecer etiqueta para mostrar texto
pantallaEtiqueta = new JLabel( "Texto de ejemplo", SwingConstants.CENTER );
pantallaEtiqueta.setForeground( valoresColor[ 0 ] );
pantallaEtiqueta.setFont( new Font( "Serif", Font.PLAIN, 72 ) );
getContentPane().setBackground( Color.CYAN );
getContentPane().add( pantallaEtiqueta, BorderLayout.CENTER );
setSize( 550, 200 );
setVisible( true );
} // fin del constructor
public static void main( String args[] )
{
JFrame.setDefaultLookAndFeelDecorated(true);
PruebaMenu aplicacion = new PruebaMenu();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
// clase interna para manejar eventos de accin de los elementos de men
private class ManejadorEventos implements ActionListener {
// procesar selecciones de color y tipo de letra
public void actionPerformed( ActionEvent evento )
{
// procesar seleccin de color
for ( int cuenta = 0; cuenta < elementosColor.length; cuenta++ )
if ( elementosColor[ cuenta ].isSelected() ) {
pantallaEtiqueta.setForeground( valoresColor[ cuenta ] );
break;
}
// procesar seleccin de tipo de letra
for ( int cuenta = 0; cuenta < tiposLetra.length; cuenta++ )
if ( evento.getSource() == tiposLetra[ cuenta ] ) {
pantallaEtiqueta.setFont(

44

DAW

DesarrollodeAplicacionesWeb

Tema7

new Font( tiposLetra[ cuenta ].getText(), estilo, 72 ) );


break;
}
repaint();
} // fin del mtodo actionPerformed
} // fin de la clase ManejadorEventos
// clase interna para manejar eventos de los elementos de men tipo casilla de verificacin
private class ManejadorEstilo implements ItemListener {
// procesar selecciones de estilo de tipo de letra
public void itemStateChanged( ItemEvent e )
{
estilo = 0;
// checar seleccin de negrita
if ( elementosEstilo[ 0 ].isSelected() )
estilo += Font.BOLD;
// checar seleccin de cursiva
if ( elementosEstilo[ 1 ].isSelected() )
estilo += Font.ITALIC;
pantallaEtiqueta.setFont(
new Font( pantallaEtiqueta.getFont().getName(), estilo, 72 ) );
repaint();
}
} // fin de la clase ManejadorEstilo
} // fin de la clase PruebaMenu

Un men se crea utilizando el componente JMenu dentro de un JList


Si
No

5.10.1Separadores.
A veces, en un men pueden aparecer distintas opciones. Por ello, nos puede
interesardestacarundeterminadogrupodeopcionesoelementosdelmencomo
relacionadosentresporreferirseaunmismotema,osimplementeparasepararlos
deotrosquenotienenningunarelacinconellos.
ElcomponenteSwingquetenemosenJavaparaestafuncionalidades:
JSeparator ,quedibujaunalneahorizontalenelmen,yasseparavisualmenteen
dos partes a los componentes de ese men. En la imagen podemos ver cmo se han separado las
opcionesdeAbriryGuardardelaopcindeSalir,medianteestecomponente.
Alcdigoanterior,tanslohabraqueaadirleunalnea,laqueresaltamosennegrita:

menu.add(opcionguardar);
menu.add(new JSeparator());
JMenuItem opcionSalir = new JMenuItem("Salir");

En un men en Java se debe introducir siempre un separador para que se pueda


compilar el cdigo
Si
No

45

Comunicndonosconelusuario.Interfaces

DAW

Enesteenlacepodrsencontrarmsinformacinsobrediseodemens.
http://biblioteca.uns.edu.pe/saladocentes/archivoz/publicacionez/Programacion_Visual_co
n_Java_2.pdf

5.10.2Aceleradoresdetecladoymnemnicos.
Aveces,tenemosqueusarunaaplicacinconinterfazgrfica y
no disponemos de ratn, porque se nos ha roto, o cualquier
causa.
Adems, cuando diseamos una aplicacin, debemos
preocuparnosdelascaractersticasdeaccesibilidad.
Algunasempresasdedesarrollodesoftwareobliganatodossus
empleados a trabajar sin ratn al menos un da al ao, para
obligarlesatomarconcienciadelaimportanciadequetodassus
aplicacionesdebenseraccesibles,usablessindisponerderatn.
Yanosloenmens,sinoencualquiercomponente interactivodeunaaplicacin:campodetexto,
botndeaccin,listadesplegable,etc,esmuyrecomendablequepuedaseleccionarsesinelratn,
haciendousoexclusivamentedelteclado.
Paraconseguirquenuestrosmensseanaccesiblesmedianteelteclado,laideaesusaraceleradores
detecladooatajosdetecladoydemnemnicos.
Unaceleradoroatajodetecladoesunacombinacindeteclasqueseasociaaunaopcindelmen,
de forma que pulsndola se consigue el mismo efecto que abriendo el men y seleccionando esa
opcin.
Esa combinacin de teclas aparece escrita a la derecha de la opcin del men, de forma que el
usuariopuedatenerconocimientodesuexistencia.
Paraaadirunatajodeteclado,loquesehaceesemplearlapropiedad accelerator eneldiseador
Los atajosdetecladonosuelenasignarseatodaslasopcionesdelmen,sinosloalasquemsse
usan.
Un mnemnico consiste en resaltar una tecla dentro de esa opcin, mediante un subrayado, de
forma que pulsando Alt + <el mnemnico> se abra el men correspondiente. Por ejemplo en la
imagenconAlt+Aabriramosesemenqueseve,yahoraconCtrl+Gseguardaraeldocumento.
Paraaadirmediantecdigounmnemnicoaunaopcindelmen,sehacemediantelapropiedad
mnemonic .
Losmnemnicossquedeberanserincluidosparatodaslasopcionesdelmen,deformaquetodas
puedan ser elegidas haciendo uso slo del teclado, mejorando as la accesibilidad de nuestra
aplicacin. Para ver cmo se aadira mediante el diseador de NetBeans, mira el siguiente Debes
conocer.

Enelsiguienteenlacesepuedevercmoaadiraunaaplicacinqueestemosconstruyendo
conNetBeans,entreotrascosas,mnemnicosyaceleradores
http://jtagua.wordpress.com/2010/09/24/tutorialdejavaswing11jmenubarjmenu
jmenuitemjprogressbarjtextarea/

46

TEMA8

INDICE
1.Introduccinalasestructurasdealmacenamiento...........................................................................4
2.Cadenasdecaracteres.......................................................................................................................5
2.1.Operacionesavanzadasconcadenasdecaracteres.(I)..............................................................................6
2.1.1.Operacionesavanzadasconcadenasdecaracteres.(II)........................................................................................7
2.1.2.Operacionesavanzadasconcadenasdecaracteres.(III).......................................................................................8
Sintaxisdelascadenasdeformatoyusodelmtodoformat.........................................................................................11
2.1.3.Operacionesavanzadasconcadenasdecaracteres.(III).....................................................................................13
2.1.4.Operacionesavanzadasconcadenasdecaracteres.(IV).....................................................................................14
2.2.Expresionesregulares.(I)..........................................................................................................................15
2.2.1.Expresionesregulares.(II)....................................................................................................................................17
2.2.2.Expresionesregulares.(III)...................................................................................................................................18
3.Creacindearrays............................................................................................................................20
3.1.Usodearraysunidimensionales...............................................................................................................22
3.2.Inicializacin..............................................................................................................................................23
4.Arraysmultidimensionales...............................................................................................................25
4.1.Usodearraysmultidimensionales............................................................................................................26
4.2.Inicializacindearraysmultidimensionales.............................................................................................27
5.Clasesymtodosgenricos.(I)........................................................................................................28
5.1.Clasesymtodosgenricos.(II)................................................................................................................29
6.Introduccinalascolecciones.(I)....................................................................................................32
7.Conjuntos.(I)....................................................................................................................................34
7.1.Conjuntos.(II)............................................................................................................................................35
Ejercicioresuelto.............................................................................................................................................................................35
7.2.Conjuntos.(III)...........................................................................................................................................36
7.3.Conjuntos.(IV)..........................................................................................................................................37
7.4.Conjuntos.(V)...........................................................................................................................................38
Ejercicioresuelto.............................................................................................................................................................................38
8.Listas.(I)...........................................................................................................................................40
8.1.Listas.(II)...................................................................................................................................................41
8.2.Listas.(III)..................................................................................................................................................42
8.3.Listas.(IV)..................................................................................................................................................43
9.Conjuntosdeparesclave/valor........................................................................................................44
10.Iteradores.(I).................................................................................................................................45
10.1.Iteradores.(II).........................................................................................................................................45
11.Algoritmos.(I).................................................................................................................................47
11.1.Algoritmos.(II)........................................................................................................................................50
11.2.Algoritmos.(III).......................................................................................................................................51
12.TratamientodedocumentosestructuradosXML..........................................................................53
12.1.QuesundocumentoXML?.................................................................................................................54
12.2.LibrerasparaprocesardocumentosXML.(I).........................................................................................55
12.2.1.LibrerasparaprocesardocumentosXML.(II)....................................................................................................56
12.3.ManipulacindedocumentosXML.(I).....................................................................................................59
12.3.1.ManipulacindedocumentosXML.(II)...............................................................................................................60
Obtenerlalistadehijosdeunelementoyprocesarla.....................................................................................................................60
Aadirunnuevoelementohijoaotroelemento.............................................................................................................................60
12.3.2.ManipulacindedocumentosXML.(III)..............................................................................................................61
Eliminarunelementohijodeotroelemento...................................................................................................................................61
Cambiarelcontenidodeunelementocuandosoloestexto...........................................................................................................61
12.3.3.ManipulacindedocumentosXML.(IV)..............................................................................................................62
Atributosdeunelemento................................................................................................................................................................65

Aplicacindelasestructurasdealmacenamiento

DAW

DesarrollodeAplicacionesWeb

Tema8

APLICACINDELASESTRUCTURASDE
ALMACENAMIENTO.
CASO PRCTICO.
Ana ha recibido un pequeo encargo de parte de su tutora, Mara. Se trata de que realice un
pequeo programita, muy sencillo pero fundamental.
-Hola Ana -dice Mara-, hoy tengo una tarea especial para ti.
-Si? -responde Ana-. Estoy deseando, ltimamente no hay nada que se me resista, llevo dos
semanas en racha.
-Bueno, quizs esto se te resista un poco ms, es fcil, pero tiene cierta complicacin. Un cliente para
el que hicimos una aplicacin, nos ha dicho si podemos ayudarle. El cliente tiene una aplicacin para
gestionar los pedidos que recibe de sus clientes. Normalmente, recibe por correo electrnico los
pedidos en un formato concreto que todos sus clientes llevan tiempo usando. El cliente suele
transcribir el pedido desde el correo electrnico a la aplicacin, copiando dato a dato, pero nos ha
preguntado si es posible que copie todo el pedido de golpe, y que la aplicacin lo procese, detectando
posibles errores en el pedido.
-Qu? -dice Mara con cierta perplejidad.
-Me alegra que te guste -dice Mara esbozando una sonrisa picara-, se que te gustan los retos.
-Pero, eso como se hace? Cmo compruebo yo si el pedido es vlido? Y si el cliente ha puesto
un producto que no existe?
-No mujer, se trata de comprobar si el pedido tiene el formato correcto, y transformarlo de forma que
se genere un documento XML con los datos del pedido. Un documento XML luego se puede
incorporar fcilmente a los otros pedidos que tenga el cliente en su base de datos. De la verificacin
de si hay algn producto que no existe, o de si hay alguna incoherencia en el pedido se encarga otra
parte del software, que ya he realizado yo.
-Bueno -dice Mara justo despus de resoplar tres veces seguidas-, empieza por contarme que es el
formato XML.

Cuandoelvolumendedatosamanejarporunaaplicacineselevado,nobastaconutilizarvariables.
Manejarlosdatosdeun nicopedidoenunaaplicacinpuede serrelativamentesencillo,puesun
pedido est compuesto por una serie de datos y eso simplemente se traduce en varias variables.
Pero,quocurrecuandoenunaaplicacintenemosquegestionarvariospedidosalavez?
Lomismoocurreenotroscasos.Parapoderrealizarciertasaplicacionessenecesitapodermanejar
datosquevanmsalldemerosdatossimples(nmerosyletras).Aveces,losdatosquetieneque
manejarlaaplicacinsondatoscompuestos,esdecir,datosqueestncompuestosasuvezdevarios
datosmssimples.Porejemplo,unpedidoestcompuestoporvariosdatos,losdatospodranserel
clientequehaceelpedido,ladireccindeentrega,lafecharequeridadeentregaylosartculosdel
pedido.
Los datos compuestos son un tipo de estructura de datos, y en realidad ya los has manejado. Las
clases son un ejemplo de estructuras de datos que permiten almacenar datos compuestos, y el
objeto en s, la instancia de una clase, sera el dato compuesto. Pero, a veces, los datos tienen
estructurasanmscomplejas,ysonnecesariassolucionesadicionales.
Aqu podrs aprender esas soluciones adicionales. Esas soluciones consisten bsicamente en la
capacidaddepodermanejarvariosdatosdelmismoodiferentetipodeformadinmicayflexible.

Aplicacindelasestructurasdealmacenamiento

DAW

1.Introduccinalasestructurasdealmacenamiento.
Cmoalmacenarasenmemoriaunlistadodenmerosdelquetienesqueextraerelvalormximo?
Seguro que te resultara fcil. Pero, y si el listado de nmeros no tiene un tamao fijo, sino que
puedevariarentamaodeformadinmica?Entonceslacosasecomplica.
Un listado de nmeros que aumenta o decrece en tamao es una de las cosas que aprenders a
utilizaraqu,utilizandoestructurasdedatos.
Pasaremosporaltolasclasesylosobjetos,puesyaloshasvistoconanterioridad,perodebessaber
quelasclasesensmismassonlaevolucindeuntipodeestructurasdedatosconocidascomodatos
compuestos(tambinllamadasregistros).Lasclases,ademsdeaportarlaventajadeagrupardatos
relacionados entre s en una misma estructura (caracterstica aportada por los datos compuestos),
permitenagregarmtodosquemanejendichosdatos,ofreciendounaherramientadeprogramacin
sinigual.Perotodoestoyalosabas.
Lasestructurasdealmacenamiento,engeneral,sepuedenclasificardevariasformas.Porejemplo,
atendiendoasipuedenalmacenardatosdediferentetipo,osisolopuedenalmacenardatosdeun
solotipo,sepuedendistinguir:
9 Estructuras con capacidad de almacenar varios datos del mismo tipo: varios nmeros, varios
caracteres,etc.Ejemplosdeestasestructurassonlosarrays,lascadenasdecaracteres,laslistas
ylosconjuntos.
9 Estructurasconcapacidaddealmacenarvariosdatosdedistintotipo:nmeros,fechas,cadenas
de caracteres, etc., todo junto dentro de una misma estructura. Ejemplos de este tipo de
estructurassonlasclases.
Otraformadeclasificarlasestructurasdealmacenamientovaenfuncindesipuedenonocambiar
detamaodeformadinmica:
9 Estructurascuyotamaoseestableceenelmomentodelacreacinodefinicinysutamao
no puede variar despus. Ejemplos de estas estructuras son los arrays y las matrices (arrays
multimensionales).
9 Estructurascuyotamaoesvariable(conocidascomoestructurasdinmicas).Sutamaocrece
odecrecesegnlasnecesidadesdeformadinmica.Eselcasodelaslistas,rboles,conjuntosy,
comoveremostambin,elcasodealgunostiposdecadenasdecaracteres.
Porltimo,atendiendoalaformaenlaquelosdatosseordenandentrodelaestructura,podemos
diferenciarvariostiposdeestructuras:
9 Estructurasquenoseordenandepors,ydebeserelprogramadorelencargadodeordenarlos
datossifueranecesario.Unejemplodeestasestructurassonlosarrays.
9 Estructurasordenadas.Setratadeestructurasquealincorporarundatonuevoatodoslosdatos
existentes, este se almacena en una posicin concreta que ir en funcin del orden. El orden
establecido en la estructura puede variar dependiendo de las necesidades del programa:
alfabtico,ordennumricodemayoramenor,momentodeinsercin,etc.
Todavanoconocesmuchodelasestructuras,yprobablementetodotesuenararoyextrao.Note
preocupes,pocoapocoirsdescubrindolas.Versquesonsencillasdeutilizarymuycmodas.

El tamao de las estructuras de almacenamiento siempre se determina en el momento de


la creacin.

Verdadero
Falso

DesarrollodeAplicacionesWeb

Tema8

2.Cadenasdecaracteres.
CASO PRCTICO
Ana est asustada, le acaban de asignar una nueva tarea y le acaban de enviar por correo el formato
del archivo que tiene que procesar. El archivo tiene un formato concreto, un tanto extrao. Primero
tiene una cabecera con informacin general del pedido, y luego tiene los artculos del pedido, cada
uno en una lnea diferente.
Podr realizar la tarea encomendada? Seguro que s.
La empresa recibe los pedidos siguiendo un modelo normalizado. En realidad se trata de una
pequea aplicacin web que al rellenar un formulario, enva un correo electrnico con la informacin
siguiendo una estructura fija. A continuacin puedes ver un ejemplo:
## PEDIDO ##
Nmero de pedido: { 20304 }
Cliente: { Muebles Bonitos S.A. }
Cdigo del cliente: { 00293 }
Direccin de factura: { C/ De en frente, 11 }
Direccin de entrega: { C/ De al lado, 22 }
Nombre del contacto: { Elias }
Telfono del contacto: { 987654321 }
Correo electrnico del contacto: { mail@mail1234.com }
Fecha preferente de entrega: { 19/11/2012 }
Forma de pago: { Transferencia }
## ARTICULOS ##
{ Cdigo Artculo | Descripcin | Cantidad }
{ 0001231 | Tuercas tipo 1 | 200 }
{ 0001200 | Tornillos tipo 1 | 200 }
{ 0002200 | Arandelas tipo 2 | 200 }
## FIN ARTICULOS ##
## FIN PEDIDO ##

Como puedes observar, el pedido tiene una estructura fija, y solamente cambian los datos que estn
entre llaves. El resto del texto es fijo, dado que como se ha dicho antes, el pedido lo genera una
aplicacin web, y lo enva por correo electrnico al cliente.
Cuando un cliente solicita un pedido a esta empresa, no puede poner en ningn campo los smbolos
"{", "}", ni "|", porque entonces entrara en conflicto con el formato enviado por correo y dara
problemas, as que se opt por impedir que el cliente pudiera poner dichos caracteres extraos. Esto
garantiza que cada campo del pedido se va a poder leer adecuadamente.
Lo ms conflictivo, es la seccin de artculos del pedido, en su primera parte, tiene una especie de
cabecera que ayuda a identificar que es cada una de las columnas. Y despus, tiene tantas lneas
como artculos tenga el pedido, si tiene 100 artculos, tendrn 100 lneas que incluirn: cdigo del
artculo, descripcin del artculo y la cantidad.

Probablemente,unadelascosasquemsutilizarscuandoestsprogramandoencualquierlenguaje
de programacin son las cadenas de caracteres. Las cadenas de caracteres son estructuras de
almacenamientoquepermitenalmacenarunasecuenciadecaracteresdecasicualquierlongitud.Y
lapreguntaahoraes,quesuncarcter?
EnJavayentodolenguajedeprogramacin,yporende,entodosistemainformtico,loscaracteres
se codifican como secuencias de bits que representan a los smbolos usados en la comunicacin
humana.Estossmbolospuedenserletras,nmeros,smbolosmatemticoseinclusoideogramasy
pictogramas.

Siquierespuedesprofundizarenlacodificacindecaracteresleyendoelsiguienteartculo
delaWikipedia.
http://es.wikipedia.org/wiki/Codificacin_de_caracteres

Laformamshabitualdeverescritaunacadenadecaracteresescomounliteraldecadena.Consiste
simplementeenunasecuenciadecaracteresentrecomillasdobles,porejemplo:"Ejemplodecadena
decaracteres".
EnJava,losliteralesdecadenasonenrealidadinstanciasdelaclase String ,locualquieredecirque,
por el mero hecho de escribir un literal, se crear una instancia de dicha clase. Esto da mucha
flexibilidad, puesto que permite crear cadenas de muchas formas diferentes, pero obviamente
consumemuchamemoria.Laformamshabitualescrearunacadenapartiendodeunliteral:

Aplicacindelasestructurasdealmacenamiento

DAW

String cad="Ejemplo de cadena";

Enestecaso,elliteraldecadenasituadoaladerechadeligualesenrealidadunainstanciadelaclase
String . Al realizar esta asignacin hacemos que la variable cad se convierta en una referencia al
objetoyacreado.Otraformadecrearunacadenaesusandoeloperador new yunconstructor,como
porejemplo:
String cad=new String ("Ejemplo de cadena");

Cuandosecreanlascadenasdeestaforma,serealizaunacopiaenmemoriadelacadenapasadapor
parmetro.Lanuevainstanciadelaclase String harreferenciaportantoalacopiadelacadena,y
noaloriginal.

Fijateenelsiguientelneadecdigo,cuntasinstanciasdelaclaseStringves?
String cad="Ejemplo de cadena 1";
cad="Ejemplo de cadena 2";
cad=new String("Ejemplo de cadena 3");

Pues en realidad hay 4 instancias. La primera instancia es la que se crea con el literal de cadena
"Ejemplodecadena1".Elsegundoliteral,"Ejemplodecadena2",dalugaraotrainstanciadiferente
a la anterior. El tercer literal, "Ejemplo de cadena 3", es tambin nuevamente otra instancia de
String diferente.Yporltimo,alcrearunanuevainstanciadelaclase String atravsdeloperador
new ,secreaunnuevoobjeto String copiandoparaelloelcontenidodelacadenaqueselepasapor
parmetro,conloqueaqutenemoslacuartainstanciadelobjeto String ensolounalnea.

2.1.Operacionesavanzadasconcadenasdecaracteres.(I)
Quoperacionespuedeshacerconunacadena?Muchasmsdelasqueteimaginas.Empezaremos
conlaoperacinmssencilla:laconcatenacin.Laconcatenacineslaunindedoscadenas,para
formarunasola.EnJavaesmuysencillo,puesslotienesqueutilizareloperadordeconcatenacin
(signodesuma):
String cad = "Bien"+"venido!";
System.out.println(cad);

En la operacin anterior se est creando una nueva cadena, resultado de unir dos cadenas: una
cadena con el texto "Bien", y otra cadena con el texto "venido!". La segunda lnea de cdigo
muestraporlasalidaestndarelresultadodelaconcatenacin.Elresultadodesuejecucinserque
aparecereltexto"Bienvenido!"porlapantalla.
Otraformadeusarlaconcatenacin,queilustraquecadaliteraldecadenaesasuvezunainstancia
delaclase String ,esusandoelmtodoconcatdelobjeto String :
String cad="Bien".concat("venido!");
System.out.printf(cad);

Fjate bien en la expresin anterior, pues genera el mismo resultado que la primera opcin y en
ambasparticipantresinstanciasdelaclase String .Unainstanciaquecontieneeltexto"Bien",otra
instancia que contiene el texto "venido!", y otra que contiene el texto "Bienvenido!". La tercera
cadena se crea nueva al realizar la operacin de concatenacin, sin que las otras dos hayan
desaparecido.Peronotepreocupesporlasotrasdoscadenas,puesseborrarndememoriacuando
elrecolectordebasuradetectequeyanoseusan.
Fjate adems, que se puede invocar directamente un mtodo de la clase String , posponiendo el
mtodo al literal de cadena. Esto es una seal de que al escribir un literal de cadena, se crea una
instanciadelobjetoinmutable(aquellosquenosepuedenmodificarunavezcreados.EselcasodelosStringdeJava,
ascomolasclasesenvoltorioInteger,Float,Double,etc.) String .
Peronosolopodemosconcatenarunacadenaaotracadena.Graciasalmtodo toString() podemos
concatenarcadenasconliteralesnumricoseinstanciasdeotrosobjetossinproblemas.

Elmtodo toString() esunmtododisponibleentodaslasclasesdeJava.Suobjetivoessimple,


permitir la conversin de una instancia de clase en cadena de texto, de forma que se pueda
convertir a texto el contenido de la instancia. Lo de convertir, no siempre es posible, hay clases
fcilmenteconvertiblesatexto,comoeslaclase Integer ,porejemplo,yotrasquenosepueden
convertir,yqueelresultadodeinvocarelmtodo toString() esinformacinrelativaalainstancia.
6

DesarrollodeAplicacionesWeb

Tema8

Lagranventajadelaconcatenacinesqueelmtodo toString() seinvocarautomticamente,sin


quetengamosqueespecificarlo,porejemplo:
Integer i1=new Integer (1223); // La instancia i1 de la clase Integer contiene el nmero 1223.
System.out.println("Nmero: " + i1); // Se mostrar por pantalla el texto "Nmero: 1223"

Enelejemploanterior,sehainvocadoautomticamente i1.toString() ,paraconvertirelnmeroa


cadena. Esto se realizar para cualquier instancia de clase concatenada, pero cuidado, como se ha
dichoantes,notodaslasclasessepuedenconvertiracadenas.

Qu se mostrar como resultado


System.out.println(4+1+"-"+4+1); ?

de

ejecutar

el

siguiente

cdigo

Mostrarlacadena"541"
Mostrarlacadena"4114"
Esaoperacindarerror

2.1.1.Operacionesavanzadasconcadenasdecaracteres.(II)
Vamos a continuar revisando las operaciones que se pueden realizar con cadenas. Como vers las
operacionesarealizarsecomplicanunpocoapartirdeahora.Entodoslosejemploslavariablecad
contienelacadena"Bienvenido!",comosemuestraenlasimgenes.
9 int length() . Retorna un nmero entero
que contiene la longitud de una cadena, Stringcad= B e n v e n d o !
resultadodecontarelnmerodecaracteres
Longitud=12
porlaqueestcompuesta.Recuerdaqueun
espacioestambinuncarcter.
9 char charAt(int pos) . Retorna el carcter ubicado en la posicin pasada por parmetro. El
carcterobtenidodedichaposicinser
almacenadoenuntipodedato char .Las
0 1 2 3 4 5 6 7 8 9 10 11 Posicin
posiciones se empiezan a contar desde Stringcad= B e n v e n d o !
el 0 (y no desde el 1), y van desde 0
hastalongitud1.Porejemplo,elcdigo
cad.charAt(11)
cad.charAt(0) cad.charAt(4)
siguiente mostrara por pantalla el
carcter"v":
char t = cad.charAt(5);
System.out.println(t);

String substring(int beginIndex, int endIndex) .Estemtodopermiteextraerunasubcadena


de otra de mayor tamao. Una cadena
compuesta por todos los caracteres
0 1 2 3 4 5 6 7 8 9 10 11 Posicin
existentes entre la posicin beginIndex Stringcad= B e n v e n d o !
ylaposicinendIndex1.Porejemplo,
substring(5,11)
substring(0,5)
si pusiramos cad.substring(0,5) en
0 1 2 3 4 5 6 7 8 9 10 11 Posicin
nuestroprograma,sobrelavariablecad
anterior, dicho mtodo devolvera la Stringcad= B e n v e n d o !
subcadena "Bien" tal y como se
substring(2)
muestraenlaimagen.
9 String substring (int beginIndex) . Cuando al mtodo substring solo le proporcionamos un
parmetro, extraer una cadena que comenzar en el carcter con posicin beginIndex e ir
hasta el final de la cadena. En el siguiente ejemplo se mostrara por pantalla la cadena
ienvenido!:
String subcad = cad.substring(2);
System.out.println(subcad);

Otraoperacinmuyhabitualeslaconversindenmeroacadenaydecadenaanmero.Imagnate
que un usuario introduce su edad. Al recoger la edad desde la interfaz de usuario, capturars

Aplicacindelasestructurasdealmacenamiento

DAW

generalmente una cadena, pero, cmo compruebas que la edad es mayor que 0? Para poder
realizar esa comprobacin tienes que pasar la cadena a nmero. Empezaremos por ver como se
convierteunnmeroacadena.

Losnmerosgeneralmentesealmacenanenmemoriacomonmerosbinarios,esdecir,secuencias
deunosycerosconlosquesepuedeoperar(sumar,restar,etc.).Nodebesconfundirlostiposde
datos quecontienen nmeros( int , short , long , float y double )conlas secuenciasdecaracteres
querepresentanunnmero.Noeslomismo123que"123",elprimeroesunnmeroyelsegundo
esunacadenaformadaportrescaracteres:'1','2'y'3'.
Convertir un nmero a cadena es fcil desde que existe, para todas las clases Java, el mtodo
toString() .Graciasaesemtodopodemoshacercosascomolassiguientes:
String cad2="Nmero cinco: " + 5;
System.out.println(cad2);

Elresultadodelcdigoanterioresquesemostrarporpantalla"Nmerocinco:5",ynodarningn
error.EstoesposiblegraciasaqueJavaconvierteelnmero5asuclaseenvoltorio(wrapperclass)
correspondiente ( Integer , Float , Double , etc.), y despus ejecuta automticamente el mtodo
toString() dedichaclase.

Cul crees que ser el resultado de poner System.out.println(A+5f) ? Prubalo y recuerda: no


olvides indicar el tipo de literal ( f para lo literales de nmeros flotantes, y d para los literales de
nmerosdobles),asobtendrselresultadoesperadoynoalgodiferente.
2.1.2.Operacionesavanzadasconcadenasdecaracteres.(III)
Cmo comprobaras que la cadena "3" es mayor que 0? No puedes comparar directamente una
cadena con un nmero, as que necesitars aprender cmo convertir cadenas que contienen
nmeros a tipos de datos numricos ( int , short , long , float o double ). Esta es una operacin
habitual en todos los lenguajes de programacin, y Java, para este propsito, ofrece los mtodos
valueOf ,existentesentodaslasclasesenvoltoriodescendientesdelaclaseNumber: Integer , Long ,
Short , Float y Double .
Veamos un ejemplo de su uso para un nmero de doble precisin, para el resto de las clases es
similar:
String c="1234.5678";
double n;
try {
n=Double.valueOf(c).doubleValue();
} catch (NumberFormatException e)
{ /* Cdigo a ejecutar si no se puede convertir */ }

Fijate en el cdigo anterior, en l puedes comprobar cmo la cadena c contiene en su interior un


nmero, pero escrito con dgitos numricos (caracteres). El cdigo escrito esta destinado a
transformar la cadena en nmero, usando el mtodo valueOf . Este mtodo lanzar la excepcin
NumberFormatException sinoconsigueconvertireltextoanmero.Enelsiguientearchivo,tienesun
ejemplomscompleto,dondeaparecentambinejemplosparalasotrostiposnumricos:

import javax.swing.JOptionPane;
/**
* Ejemplo en el que se muestra la conversin de varias cadenas de texto, que
* contienen nmeros, a nmeros.
* @author Salvador Romero Villegas
*/
public class EjemplosConversionStringANumero {
boolean operacionCancelada;
/**
* Constructor de la clase.
*/
public EjemplosConversionStringANumero() {

DesarrollodeAplicacionesWeb

Tema8

setOperacionCancelada(false);
}
/**
* Mtodo que permite comprobar si la ltima operacin tipo Pedir ha sido
* cancelada.
* @return true si la ltima operacin realizada ha sido cancelada, false
* en otro caso.
*/
public boolean isOperacionCancelada() {
return operacionCancelada;
}
/**
* Mtodo que permite cambiar el estado de la variable privada
* operacionCancelada. Este mtodo es privado y solo debe usarse desde
* un mtodo propio de esta clase.
* @param operacionCancelada True o false, el nuevo estado para la variable.
*/
private void setOperacionCancelada(boolean operacionCancelada) {
this.operacionCancelada = operacionCancelada;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado
* es un nmero de doble precisin, en cualquiera de sus formatos. Admitir
* nmeros como: 2E10 (2*10^10); 2,45; etc.
* @param titulo
* @param mensaje
* @return
*/
public double PedirNumeroDouble(String titulo, String mensaje) {
double d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Double.valueOf(s).doubleValue();
NumeroValido = true;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado
* es un nmero de precisin sencilla, en cualquiera de sus formatos.
* @param titulo
* @param mensaje
* @return
*/
public float PedirNumeroFloat (String titulo, String mensaje) {
float d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Float.valueOf(s).floatValue();
NumeroValido = true;
} catch (NumberFormatException e) {

Aplicacindelasestructurasdealmacenamiento

DAW

JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",


"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado
* es un nmero entero.
* @param titulo
* @param mensaje
* @return
*/
public int PedirNumeroInteger (String titulo, String mensaje) {
int d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Integer.valueOf(s).intValue();
NumeroValido = true;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado
* es un nmero entero.
* @param titulo
* @param mensaje
* @return
*/
public long PedirNumeroLong (String titulo, String mensaje) {
long d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Long.valueOf(s).longValue();
NumeroValido = true;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado

10

DesarrollodeAplicacionesWeb

Tema8

* es un nmero entero corto.


* @param titulo
* @param mensaje
* @return
*/
public short PedirNumeroShort (String titulo, String mensaje) {
short d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Short.valueOf(s).shortValue();
NumeroValido = true;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
}

Seguro que ya te vas familiarizando con este embrollo y encontrars interesante todas estas
operaciones. Ahora te planteamos otro reto: imagina que tienes que mostrar el precio de un
productoporpantalla.Generalmente,siunproductovale,porejemplo3,3euros,elpreciosedebe
mostrarcomo"3,30",esdecir,seleaadeunceroextraalfinalparamostrarlascentsimas.Conlo
quesabemoshastaahora,usandolaconcatenacinenJava,podemosconseguirqueunacadenase
concateneaunnmeroflotante,peroelresultadonoserelesperado.
Pruebaelsiguientecdigo:
float precio=3.3f;
System.out.println("El precio es: "+precio+"");

Sihasprobadoelcdigoanterior,habrscomprobadoqueelresultadonomuestra"3,30"sinoque
muestra "3,3 ". Cmo lo solucionamos? Podramos dedicar bastantes lneas de cdigo hasta
conseguir algo que realmente funcione, pero no es necesario, dado que Java y otros lenguajes de
programacin(comoC),disponendeloquesedenominaformateadodecadenas.EnJavapodemos
formatear cadenas a travs del mtodo esttico format disponible en el objeto String . Este
mtodopermitecrearunacadenaproyectandolosargumentosenunformatoespecficodesalida.
Lomejoresverloconunejemplo,veamosculseralasolucinalproblemaplanteadoantes:
float precio=3.3f;
String salida=string.format ("El precio es: %.2f ", precio));
System.out.println(salida);

Elformatodesalida,tambindenominadocadenadeformato,eselprimerargumentodelmtodo
format .Lavariableprecio,situadacomosegundoargumento,eslavariablequeseproyectarenla
salida siguiendo un formato concreto. Seguro que te preguntars, qu es %.2f? Pues es un
especificador de formato, e indica cmo se deben formatear o proyectar los argumentos que hay
despusdelacadenadeformatoenelmtodo format .

Esnecesarioqueconozcasbienelmtodo format ylosespecificadoresdeformato.Poresemotivo,


tepedimosqueleasatentamenteelsiguientedocumento:

Sintaxisdelascadenasdeformatoyusodelmtodoformat.
EnJava,elmtodoestticoformatdelaclase String permiteformatearlosdatosquesemuestranal
usuarioolausuariadelaaplicacin.Elmtodo format tienelossiguientesargumentos:

11

Aplicacindelasestructurasdealmacenamiento

DAW

9 Cadenadeformato.Cadenaqueespecificacmoserelformatodesalida,enellasemezclar
textonormalconespecificadoresdeformato,queindicarncmosedebeformatearlosdatos.
9 Listadeargumentos.Variablesquecontienenlosdatoscuyosdatosseformatearn.Tieneque
habertantosargumentoscomoespecificadoresdeformatohayaenlacadenadeformato.
Losespecificadoresdeformatocomienzansiemprepor"%",esloquesedenominauncarcterde
escape(carcterquesirveparaindicarqueloquehayacontinuacinnoestextonormal,sinoalgo
especial). El especificador de formato debe llevar como mnimo el smbolo "%" y un carcter que
indicalaconversinarealizar,porejemplo" %d ".

Laconversinseindicaconunsimplecarcter,ysealaalmtodo format cmodebeserformateado


elargumento.Dependiendodeltipodedatopodemosusarunasconversionesuotras.Veamoslas
conversionesmsutilizadas:
Listadodeconversionesmsutilizadayejemplos.
Conversin
Formato Tiposdedatos
Ejemplo
Resultado
Boolean(cuandose
booleanb=true;
usanotrostiposde
Stringd=
Valorlgicoo
"%b"o
Resultado:
datossiemprelo
String.format("Resultado:
booleano.
"%B"
true
formatearescribiendo %b",b);
true).
System.out.println(d);
Cualquiera,se
Stringcad="holamundo";
convertirelobjetoa
Stringd=
Cadenade
"%s"o
Resultado:
cadenasiesposible
String.format("Resultado:
caracteres.
"%S"
holamundo
(invocandoelmtodo
%s",cad);
toString).
System.out.println(d);
inti=10;
Stringd=
Enterodecimal "%d"
Untipodedatoentero. String.format("Resultado:
Resultado:10
%d",i);
System.out.println(d);
doublei=10.5;
Nmeroen
Stringd=
"%e"o
Flotantessimpleso
Resultado:
notacin
String.format("Resultado:
"%E"
dobles.
1.050000E+01
cientfica
%E",i);
System.out.println(d);
floati=10.5f;
Stringd=
Nmero
Flotantessimpleso
Resultado:
"%f"
String.format("Resultado:
decimal
dobles.
10,500000
%f",i);
System.out.println(d);
Flotantessimpleso
Nmeroen
doublei=10.5;
dobles.Elnmerose
notacin
Stringd=
"%g"o
mostrarcomodecimal
Resultado:
cientficao
String.format("Resultado:
"%G"
oennotacincientfica
10.5000
decimal(lo
%g",i);
dependiendodeloque
mscorto)
System.out.println(d);
seamascorto.

Ahora que ya hemos visto alguna de las conversiones existentes (las ms importantes), veamos
algunosmodificadoresqueselepuedenaplicaralasconversiones,paraajustarcomoqueremosque
sealasalida.Losmodificadoressesitanentreelcarcterdeescape("%")ylaletraqueindicaeltipo
deconversin(d,f,g,etc.).

12

DesarrollodeAplicacionesWeb

Tema8

Podemosespecificar,porejemplo,elnmerodecaracteresquetendrcomomnimolasalidadeuna
conversin.Sieldatomostradonollegaaeseanchoencaracteres,serellenarconespacios(salvo
queseespecifiquelocontrario):
%[Ancho]Conversin

Elhechodequeestentrecorchetessignificaqueesopcional.Siqueremosporejemploquelasalida
generealmenos5caracteres(poniendoespaciosdelante)podramosponerloas:
String.format ("%5d",10);

Se mostrar el "10" pero tambin se aadirn 3 espacios delante para rellenar. Este tipo de
modificadorsepuedeusarconcualquierconversin.
Cuando se trata de conversiones de tipo numricas con decimales, solo para tipos de datos que
admitandecimales,podemosindicartambinlaprecisin,queserelnmerodedecimalesmnimos
quesemostrarn:
%[Ancho][.Precisin]Conversin

Comopuedesver,tanto elanchocomolaprecisinvanentrecorchetes,loscorchetes nohayque


ponerlos, solo indican que son modificaciones opcionales. Si queremos, por ejemplo, que la salida
genere3decimalescomomnimo,podremosponerloas:
String.format ("%.3f",4.2f);

Como el nmero indicado como parmetro solo tiene un decimal, el resultado se completar con
cerosporladerecha,generandounacadenacomolasiguiente:"4,200".
Una cadena de formato puede contener varios especificadores de formato y varios argumentos.
Veamosunejemplodeunacadenaconvariosespecificadoresdeformato:
String np="Lavadora";
int u=10;
float ppu = 302.4f;
float p=u*ppu;
String output=String.format("Producto: %s; Unidades: %d; Precio por unidad: %.2f ; Total:
%.2f ", np, u, ppu, p);
System.out.println(output);

Cuandoelordendelosargumentosesunpococomplicado,porquesereutilizanvariasvecesenla
cadenadeformatolosmismosargumentos,sepuederecurriralosndicesdeargumento.Setratade
especificar la posicin del argumento a utilizar, indicando la posicin del argumento (el primer
argumentoserael1ynoel0)seguidoporelsmbolodeldlar("$").Elndiceseubicaraalcomienzo
delespecificadordeformato,despusdelporcentaje,porejemplo:
int i=10;
int j=20;
String d=String.format("%1$d multiplicado por %2$d (%1$dx%2$d) es %3$d",i,j,i*j);
System.out.println(d);

El ejemplo anterior mostrara por pantalla la cadena "10 multiplicado por 20 (10x20) es 200". Los
ndices de argumento se pueden usar con todas las conversiones, y es compatible con otros
modificadoresdeformato(incluidalaprecisin).
2.1.3.Operacionesavanzadasconcadenasdecaracteres.(III)
Cmo puedo comprobar si dos cadenas son iguales? Qu ms operaciones ofrece Java sobre las
cadenas?Javaofreceunmontndeoperacionesmssobrecadena.Enlasiguientetablapuedesver
lasoperacionesmsimportantes.Entodoslosejemplosexpuestos,lasvariablescad1,cad2ycad3
soncadenasyaexistentes,ylavariablenumesunnmeroenteromayoroigualacero.
Mtodo.
Descripcin
Permite comparar dos cadenas entre s lexicogrficamente.
Retornar 0 si son iguales, un nmero menor que cero si la
cad1.compareTo(cad2)
cadena(cad1)esanteriorenordenalfabticoalaquesepasa
por argumento (cad2), y un nmero mayor que cero si la
cadenaesposteriorenordenalfabtico.
Cuando se comparan si dos cadenas son iguales, no se debe
cad1.equals(cad2)
usareloperadordecomparacin"==",sinoelmtodo equals .
Retornartruesisoniguales,yfalsesinoloson.

13

Aplicacindelasestructurasdealmacenamiento

cad1.compareToIgnoreCase(cad2)
cad1.equalsIgnoreCase(cad2)

cad1.trim()
cad1.toLowerCase()
cad1.toUpperCase()

cad1.indexOf(cad2)
cad1.indexOf(cad2,num)

cad1.contains(cad2)
cad1.startsWith(cad2)
cad1.endsWith(cad2)

cad1.replace(cad2,cad3)

DAW

El mtodo compareToIgnoreCase funciona igual que el mtodo


compareTo , pero ignora las maysculas y las minsculas a la
hora de hacer la comparacin. Las maysculas van antes en
orden alfabtico que las minsculas, por lo que hay que
tenerloencuenta.Elmtodo equalsIgnoresCase esigualqueel
mtodo equals perosintenerencuentalasminsculas.
Genera una copia de la cadena eliminando los espacios en
blancoanterioresyposterioresdelacadena.
Genera una copia de la cadena con todos los caracteres a
minscula.
Genera una copia de la cadena con todos los caracteres a
maysculas.
Si la cadena o carcter pasado por argumento est contenida
enlacadenainvocante,retornasuposicin,encasocontrario
retornar 1. Opcionalmente se le puede indicar la posicin a
partir de la cual buscar, lo cual es til para buscar varias
aparicionesdeunacadenadentrodeotra.
Retornar true si la cadena pasada por argumento est
contenida dentro de la cadena. En caso contrario retornar
false.
Retornar true si la cadena comienza por la cadena pasada
comoargumento.Encasocontrarioretornarfalse.
Retornartruesilacadenaacabaporlacadenapasadacomo
argumento.Encasocontrarioretornarfalse.
Generar una copia de la cadena cad1, en la que se
reemplazarn todas las apariciones de cad2 por cad3. El
reemplazo se har de izquierda a derecha, por ejemplo:
reemplazar"zzz"por"xx"enlacadena"zzzzz"generar"xxzz"
yno"zzxx".

Cul ser el resultado de ejecutar


cadena "hojalata"?

cad1.replace("l","j").indexOf("ja")

si cad1 contiene la

2
3
4
1

2.1.4.Operacionesavanzadasconcadenasdecaracteres.(IV)
Sabes cul es el principal problema de las cadenas de caracteres? Su alto consumo de memoria.
Cuando realizamos un programa que realiza muchsimas operaciones con cadenas, es necesario
optimizarelusodememoria.
EnJava, String esunobjetoinmutable,locualsignifica,entreotrascosas,quecadavezquecreamos
un String ,ounliteralde String ,secreaunnuevoobjetoquenoesmodificable.Javaproporcionala
clase StringBuilder ,lacualesunmutable(objetos que una vez creados se puedenmodificar sin problemas),y
permiteunamayoroptimizacindelamemoria.Tambinexistelaclase StringBuffer ,peroconsume
mayores recursos al estar pensada para aplicaciones multihilo (aplicaciones que ejecutan varias lneas de
ejecucinsimultneamenteyquenecesitanaccederadatoscompartidos.Cuandovariaslneasdeejecucin,cadaunaasu
ritmo, necesitan acceder a datos compartidos hay que tener mucho cuidado, para que los datos que manejan no sean
incoherentes),porloqueennuestrocasonoscentraremosenlaprimera.

14

DesarrollodeAplicacionesWeb

Tema8

Pero, en qu se diferencian StringBuilder de la clase String ? Pues bsicamente en que la clase


StringBuilder permitemodificarlacadenaquecontiene,mientrasquelaclase String no.Comoya
sedijoantes,alrealizaroperacionescomplejassecreaunanuevainstanciadelaclase String .
Veamos un pequeo ejemplo de uso de esta clase. En el ejemplo que vas a ver, se parte de una
cadena con errores, que modificaremos para ir hacindola legible. Lo primero que tenemos que
hacer es crear la instancia de esta clase. Se puede inicializar de muchas formas, por ejemplo,
partiendodeunliteraldecadena:
StringBuilder strb=new StringBuilder ("Hoal Muuundo");

Yahora,usandolosmtodos append (insertaralfinal), insert (insertarunacadenaocarcterenuna


posicin especfica), delete (eliminar los caracteres que hay entre dos posiciones) y replace
(reemplazar los caracteres que hay entre dos posiciones por otros diferentes), rectificaremos la
cadenaanteriorylaharemoscorrecta:
1. strb.delete(6,8); Eliminamoslas'uu'quesobranenlacadena.Laprimera'u'quesobraesten
laposicin6(noolvidescontarelespacio),ylaltima'u'aeliminarestenlaposicin7.Para
eliminardichoscaracteresdeformacorrectahayquepasarcomoprimerargumentolaposicin6
(posicininicial)ycomosegundoargumentolaposicin8(posicincontiguaalltimocarctera
eliminar),dadoquelaposicinfinalnoindicaelltimocarcteraeliminar,sinoelcarcterjusto
posterioralltimoquehayqueeliminar(igualqueocurraconelmtodo substring ).
2. strb.append ("!"); Aadimosalfinaldelacadenaelsmbolodecierredeexclamacin.
3. strb.insert (0,""); Insertamosenlaposicin0,elsmbolodeaperturadeexclamacin.
4. strb.replace (3,5,"la"); Reemplazamosloscaracteres'al'situadosentrelaposicininicial3y
laposicinfinal4,porlacadena'la'.Enestemtodoocurreigualqueenlosmtodos delete y
substring ,envezdeindicarcomoposicinfinallaposicin4,sedebeindicarjustolaposicin
contigua,esdecir5.
StringBuilder contiene muchos mtodos de la clase String ( charAt , indexOf , lenght , substring ,
replace ,etc.),peronotodos,puessonclasesdiferentesconfuncionalidadesrealmentediferentes.

Enlasiguientepginapuedesencontrarmsinformacin(eningls)sobrecmoutilizarla
claseStringBuilder.
http://download.oracle.com/javase/tutorial/java/data/buffers.html

Rotar una cadena es poner simplemente el primer carcter al final, y retroceder el resto
una posicin. Despus de unas cuantas rotaciones la cadena queda igual. Cul de las
siguientes expresiones servira para hacer una rotacin (rotar solo una posicin)?

stb.delete(0,1);strb.append(stb.charAt(0));
strb.append(strb.charAt(0));strb.delete(0,1);
strb.append(strb.charAt(0));strb.delete(0);
strb.append(strb.charAt(1));strb.delete(1,2);

2.2.Expresionesregulares.(I)
Tienen algo en comn todos los nmeros de DNI y de NIE? Podras hacer un programa que
verificarasiunDNIounNIEescorrecto?Seguroques.Sitefijas,losnmerosdeDNIylosdeNIE
tienen una estructura fija: X1234567Z (en el caso del NIE) y 1234567Z (en el caso del DNI). Ambos
siguenunpatrn(Modeloconelqueencajalainformacinqueestamosanalizandooquesimplementesehautilizado
paraconstruirdichainformacin.Unpatrn,enelcasodelainformtica,estconstituidoporunaseriedereglasfijasque
debencumplirseoserseguidasparaformarlainformacin.Lasdireccionesdecorreoelectrnico,porejemplo,todastienen
lamismaforma,yesoesporquetodassiguenelmismopatrnparaserconstruidas)quepodradescribirsecomo:

unaletrainicialopcional(solopresenteenlosNIE),seguidadeunasecuencianumricayfinalizando
conotraletra.Fcilno?

15

Aplicacindelasestructurasdealmacenamiento

DAW

Puesestaeslafuncindelasexpresionesregulares:permitircomprobarsiunacadenasigueonoun
patrnpreestablecido.Lasexpresionesregularessonunmecanismoparadescribiresospatrones,y
seconstruyendeunaformarelativamentesencilla.Existenmuchaslibrerasdiferentesparatrabajar
con expresiones regulares, y casi todas siguen, ms o menos, una sintaxis similar, con ligeras
variaciones.Dichasintaxisnospermiteindicarelpatrndeformacmoda,comosideunacadenade
textosetratase,enlaquedeterminadossmbolostienenunsignificadoespecial.Porejemplo"[01]+"
es una expresin regular que permite comprobar si una cadena conforma un nmero binario.
Veamosculessonlasreglasgeneralesparaconstruirunaexpresinregular:
9 Podemosindicarqueunacadenacontieneunconjuntodesmbolosfijo,simplementeponiendo
dichos smbolos en el patrn, excepto para algunos smbolos especiales que necesitarn un
carcterdeescapecomoveremosmsadelante.Porejemplo,elpatrn"aaa"admitircadenas
quecontengantresaes.
9 " [xyz] ".Entrecorchetespodemosindicaropcionalidad.Solounodelossmbolosquehayentre
los corchetes podr aparecer en el lugar donde estn los corchetes. Por ejemplo, la expresin
regular " aaa[xy] " admitir como vlidas las cadenas "aaax" y la cadena "aaay". Los corchetes
representanunaposicindelacadenaquepuedetomarunodevariosvaloresposibles.
9 " [a-z] " " [A-Z] " " [a-zA-Z] ". Usando el guin y los corchetes podemos indicar que el patrn
admite cualquier carcter entre la letra inicial y la final. Es importante que sepas que se
diferencia entre letras maysculas y minsculas, no son iguales de cara a las expresiones
regulares.
9 " [0-9] ". Y nuevamente, usando un guin, podemos indicar que se permite la presencia de un
dgito numrico entre 0 y 9, cualquiera de ellos, pero solo uno. Con las reglas anteriores
podemos indicar el conjunto de smbolos que admite el patrn y el orden que deben tener. Si
unacadenanocontienelossmbolosespecificadosenelpatrn,enelmismoorden,entoncesla
cadenanoencajarconelpatrn.Veamosahoracomoindicarrepeticiones:
9 " a? ".Usaremoselinterroganteparaindicarqueunsmbolopuedeaparecerunavezoninguna.
Deestaformalaletra"a"podraparecerunavezosimplementenoaparecer.
9 " a* ".Usaremoselasteriscoparaindicarqueunsmbolopuedeaparecerunavezomuchasveces,
pero tambin ninguna. Cadenas vlidas para esta expresin regular seran "aa", "aaa" o
"aaaaaaaa".
9 " a+ ".Usaremoselsmbolodesumaparaindicarqueotrosmbolodebeapareceralmenosuna
vez,pudiendorepetirsecuantasvecesquiera.
9 " a{1,4} " . Usando las llaves, podemos indicar el nmero mnimo y mximo de veces que un
smbolopodrrepetirse.Elprimernmerodelejemploeselnmero1,yquieredecirquelaletra
"a" debe aparecer al menos una vez. El segundo nmero, 4, indica que como mximo puede
repetirsecuatroveces.
9 " a{2,} ". Tambin es posible indicar solo el nmero mnimo de veces que un carcter debe
aparecer(sindeterminarelmximo),haciendousodelasllaves,indicandoelprimernmeroy
poniendolacoma(nolaolvides).
9 " a{5} ".Adiferenciadelaformaanterior,sisoloescribimosunnmeroentrellaves,sinponerla
comadetrs,significarqueelsmbolodebeaparecerunnmeroexactodeveces.Enestecaso,
la"a"debeaparecerexactamente5veces.
9 " [a-z]{1,4}[0-9]+ ".Losindicadoresderepeticinsepuedenusartambinconcorchetes,dado
queloscorchetesrepresentan,bsicamente,unsmbolo.Enelejemploanteriorsepermitirade
unaacuatroletrasminsculas,seguidasdealmenosundgitonumrico.

Con lo visto hasta ahora ya es posible construir una expresin regular capaz de verificar si una
cadena contiene un DNI o un NIE, seras capaz de averiguar cul es dicha expresin regular?
La expresin regular que permite verificar si una cadena contiene un DNI o un NIE es la siguiente:
"[XYxy]?[0-9]{1,9}[A-Za-z]"; aunque no es la nica solucin.

16

DesarrollodeAplicacionesWeb

Tema8

2.2.1.Expresionesregulares.(II)
Ycmousolasexpresionesregularesenunprograma?Puesdeunaformasencilla.Parasuuso,Java
ofrecelasclases Pattern y Matcher contenidasenelpaquete java.util.regex.* .Laclase Pattern se
utilizaparaprocesarlaexpresinregularycompilarla,locualsignificaverificarqueescorrectay
dejarlalistaparasuutilizacin.Laclase Matcher sirveparacomprobarsiunacadenacualquierasigue
onounpatrn.Veamosloconunejemplo:
Pattern p=Pattern.compile("[01]+");
Matcher m=p.matcher("00001010");
if (m.matches()) System.out.println("Si, contiene el patrn");
else System.out.println("No, no contiene el patrn");

Enelejemplo,elmtodoestticocompiledelaclase Pattern permitecrearunpatrn,dichomtodo


compila la expresin regular pasada por parmetro y genera una instancia de Pattern (p en el
ejemplo).Elpatrnppodrserusadomltiplesvecesparaverificarsiunacadenacoincideonocon
elpatrn,dichacomprobacinsehaceinvocandoelmtodo matcher ,elcualcombinaelpatrncon
lacadenadeentradaygeneraunainstanciadelaclase Matcher (menelejemplo).Laclase Matcher
contieneelresultadodelacomprobacinyofrecevariosmtodosparaanalizarlaformaenlaquela
cadenahaencajadoconunpatrn:
9 m.matches() .Devolvertruesitodalacadena(deprincipioafin)encajaconelpatrnofalseen
casocontrario.
9 m.lookingAt() . Devolver true si el patrn se ha encontrado al principio de la cadena. A
diferenciadelmtodo matches() ,lacadenapodrconteneralfinalcaracteresadicionales alos
indicadosporelpatrn,sinqueellosupongaunproblema.
9 m.find() .Devolvertruesielpatrnexisteenalgnlugarlacadena(nonecesariamentetodala
cadena debe coincidir con el patrn) y false en caso contrario, pudiendo tener ms de una
coincidencia. Para obtener la posicin exacta donde se ha producido la coincidencia con el
patrn podemos usar los mtodos m.start() y m.end() , para saber la posicin inicial y final
donde se ha encontrado. Una segunda invocacin del mtodo find() ir a la segunda
coincidencia (si existe), y as sucesivamente. Podemos reiniciar el mtodo find() , para que
vuelvaacomenzarporlaprimeracoincidencia,invocandoelmtodo m.reset() .

Veamos algunas construcciones adicionales que pueden ayudarnos a especificar expresiones


regularesmscomplejas:
9 "[^abc]" . El smbolo "^", cuando se pone justo detrs del corchete de apertura, significa
negacin. La expresin regular admitir cualquier smbolo diferente a los puestos entre
corchetes.Enestecaso,cualquiersmbolodiferentedea,boc.
9 "^[01]+$" . Cuando el smbolo "^" aparece al comienzo de la expresin regular, permite indicar
comienzo de lnea o de entrada. El smbolo "$" permite indicar fin de lnea o fin de entrada.
Usndolospodemosverificarqueunalneacompleta(deprincipioafin)encajeconlaexpresin
regular,esmuytilcuandosetrabajaenmodomultilnea(cadenasquecontienenensuinteriormsde
un salto de lnea a veces no se procesan bien con las expresiones regulares, dado que estas se limitan a verificar
generalmente solo la primera lnea. El modo multilnea permite buscar lneas completas que encajan con un patrn
dentrodeunacadenaquecontienevariaslneas)yconelmtodo find() .

9
9
9
9
9
9

"." .Elpuntosimbolizacualquiercarcter.
"\\d" .Undgitonumrico.Equivalea" [0-9] ".
"\\D" .Cualquiercosaexceptoundgitonumrico.Equivalea" [^0-9] .
"\\s" .Unespacioenblanco(incluyetabulaciones,saltosdelneayotrasformasdeespacio).
"\\S" .Cualquiercosaexceptounespacioenblanco.
"\\w" .Cualquiercarcterquepodrasencontrarenunapalabra.Equivalea"[azAZ_09]".

17

Aplicacindelasestructurasdealmacenamiento

DAW

En cuales de las siguientes opciones se cumple el patrn "A.\\d+"?


"GA99"siutilizamoselmtodofind

"GAX99"siutilizamoselmtodolookingAt

"AX99"siutilizamoselmtodomatches

"A99"siutilizamoselmtodomatches

2.2.2.Expresionesregulares.(III)
Teresultandifcileslasexpresionesregulares?Alprincipiosiempreloson...peronotepreocupes.
Hasta ahora has visto como las expresiones regulares permiten verificar datos de entrada,
permitiendocomprobarsiundatoindicadosigueelformatoesperado:queunDNItengaelformato
esperado, que un email sea un email y no otra cosa, etc. Pero ahora vamos a dar una vuelta de
tuercaadicional.
Losparntesis,deloscualesnohemoshabladohastaahora,tienenunsignificadoespecial,permiten
indicar repeticiones para un conjunto de smbolos, por ejemplo: "(#[01]){2,3}". En el ejemplo
anterior,laexpresin"#[01]"admitiracadenascomo"#0"o"#1",peroalponerloentreparntesise
indicarloscontadoresderepeticin,loqueestamosdiciendoesquelamismasecuenciasetieneque
repetir entre dos y tres veces, con lo que las cadenas que admitira seran del estilo a: "#0#1" o
"#0#1#0".
Pero los parntesis tienen una funcin adicional, y es la de permitir definir grupos. Un grupo
comienza cuando se abre un parntesis y termina cuando se cierra el parntesis. Los grupos
permitenaccederdeformacmodaalasdiferentespartesdeunacadenacuandoestacoincidecon
unaexpresinregular.Lomejoresverloconunejemplo(seguroqueteresultarfamiliar):
Pattern p=Pattern.compile("([XY]?)([0-9]{1,9})([A-Za-z])");
Matcher m=p.matcher("X123456789Z Y00110011M 999999T");
while (m.find())
{
System.out.println("Letra inicial (opcional):"+m.group(1));
System.out.println("Nmero:"+m.group(2));
System.out.println("Letra NIF:"+m.group(3));
}

Usandolosgrupos,podemosobtenerporseparadoeltextocontenidoencadaunodelosgrupos.En
el ejemplo anterior, en el patrn hay tres grupos: uno para la letra inicial (grupo 1), otro para el
nmerodelDNIoNIE(grupo2),yotroparalaletrafinaloletraNIF(grupo3).Alponerloengrupos,
usando el mtodo group() , podemos extraer la informacin de cada grupo y usarla a nuestra
conveniencia.

Tenencuentaqueelprimergrupoesel1,ynoel0.Sipones m.group(0) obtendrsunacadenacon


todalaocurrenciaocoincidenciadelpatrnenlacadena,esdecir,obtendrslasecuenciaentera
desmbolosquecoincideconelpatrn.

Enelejemploanteriorseusaelmtodo find ,stebuscarunaauna,cadaunadelasocurrenciasdel


patrn en la cadena. Cada vez que se invoca, busca la siguiente ocurrencia del patrn y devolver
truesihaencontradounaocurrencia.Sinoencuentraenunaiteracinningunaocurrenciaesporque
noexistenms,yretornarfalse,saliendodelbucle.Estaconstruccin while esmuytpicaparaeste
tipodemtodosyparalasiteraciones,queveremosmsadelante.
Loltimoimportantedelasexpresionesregularesquedebesconocersonlassecuenciasdeescape.
Cuandoenunaexpresinregularnecesitamosespecificarqueloquetienequehaberenlacadenaes
unparntesis,unallave,ouncorchete,tenemosqueusarunasecuenciadeescape,dadoqueesos
smbolostienenunsignificadoespecialenlospatrones.Paraello,simplementeantepondremos"\\"
alsmbolo.Porejemplo,"\\("significarquedebehaberunparntesisenlacadenayseomitirel
significado especial del parntesis. Lo mismo ocurre con "\\[", "\\]", "\\)", etc. Lo mismo para el

18

DesarrollodeAplicacionesWeb

Tema8

significado especial del punto, ste, tiene un significado especial (Lo recuerdas del apartado
anterior?)salvoqueseponga"\\.",quepasarasignificarunpuntoenvezdecualquiercarcter.
Laexcepcinsonlascomillas,quesepondranconunasolabarra:"\"".

Conloestudiadohastaahora,yapuedesutilizarlasexpresionesregularesysacarlespartido
casiquealmximo.Perolasexpresionesregularessonuncampomuyamplio,porloquees
muyaconsejablequeamplestusconocimientosconelsiguienteenlace:
http://download.oracle.com/javase/tutorial/essential/regex/

19

Aplicacindelasestructurasdealmacenamiento

DAW

3.Creacindearrays.
Caso prctico.
Despus del susto inicial, al recibir el archivo con el formato de pedido, Ana se puso a pensar. Vio
que lo ms adecuado era procesar el archivo de pedido lnea a lnea, viendo con que corresponde
cada lnea a travs de expresiones regulares.
Para identificar si hay un inicio o fin de seccin dentro del pedido, as como el inicio o fin del listado de
artculos, ha decidido usar la siguiente expresin regular:
"^##[]*(FIN){0,1}[]*(PEDIDO|ARTICULOS)[ ]*##$".

Y para identificar cada dato del pedido (nombre, direccin, etc.) va a utilizar la siguiente expresin
regular:
"^(.+):.*\\{(.*)\\}$"

Que al usar grupos le permitir separar el nombre del campo (direccin por ejemplo) de su valor
(direccin concreta). La expresin regular le ha costado mucho trabajo y ha tenido que pedir ayuda,
pero despus, una vez que la ha conseguido, se ha dado cuenta de que ha sido relativamente fcil.
De momento solo est haciendo pruebas, pero le estn saliendo muy bien, mira como lo lleva:
import
import
import
import
import
import
import
import
import

java.io.BufferedReader;
java.io.FileNotFoundException;
java.io.FileReader;
java.io.IOException;
java.util.Scanner;
java.util.logging.Level;
java.util.logging.Logger;
java.util.regex.Matcher;
java.util.regex.Pattern;

/* Clase que se encarga de procesar un pedido.


* El archivo con el pedido debe estar en codificacin UTF8, sino no funciona bien.
* Tu sistema debe soportar de forma nativa la coficacin UTF8, sino no
* funcionar del todo bien.
*/
public class ProcesarArchivo1 {
/* Entrada contendr una instancia de la clase Scanner que permitir
leer las teclas pulsadas desde teclado */
static Scanner entrada = new Scanner(System.in);
/* Definimos las expresiones regulares que usaremos una y otra vez para
cada lnea del pedido. La expresin regular "seccion" permite detectar
si hay un comienzo o fin de pedido, y la expresin campo, permite detectar
si hay un campo con informacin del pedido. */
static Pattern seccion = Pattern.compile("^##[ ]*(FIN)?[ ]*(PEDIDO|ARTICULOS)[ ]*##$");
static Pattern campo = Pattern.compile("^(.+):.*\\{(.*)\\}$");

public static void main(String[] args) {


BufferedReader lector;
/* 1er paso: cargamos el archivo para poder procesarlo lnea a lnea
* para ello nos apoyamos en la clase BufferedReader, que con el mtodo
* readLine nos permite recorrer todo el archivo lnea a lnea.
*/
if (args.length > 0) {
lector = cargarArchivo(args[0]);
} else {
lector = cargarArchivo();
}

if (lector == null) {
/* Si no se ha podido cargar el archivo, no contina con el
* procesado, simplemente termina la ejecucin. */
System.out.println("No se ha podido cargar el archivo.");
} else {
/* Si ha podido cargar el archivo, contina el procesado de lnea
* a lnea. */
String linea;
try {
linea = lector.readLine();
while (linea != null) {
procesarLinea(linea);
linea = lector.readLine();

20

DesarrollodeAplicacionesWeb

Tema8

}
} catch (IOException ex) {
System.out.println("Error de entrada y salida.");
}
}
}
/**
* Procesa una lnea del archivo de pedido para detectar que es y
* extraer la informacin que contiene.
* @param linea
*/
static void procesarLinea(String linea) {
Matcher deteccionSeccion = seccion.matcher(linea);
Matcher deteccionCampo = campo.matcher(linea);
/* Si el patrn coincide con el de un indicador de comienzo del pedido
* o de la seccin con el listado de artculos, se ejecutar este trozo
* de cdigo, pues habr encontrado el patrn.
*/
System.out.println(linea);
if (deteccionSeccion.matches()) {
if (deteccionSeccion.group(1)!=null) {
System.out.println("////
Detectado
deteccionSeccion.group(2));
} else {
System.out.println("////
Detectado
deteccionSeccion.group(2));
}
}

fin

inicio

seccin

seccin

de

de

"

"

/* Si el patrn coincide con el de un campo con informacin, entonces


se ejecutar este trozo de cdigo. */
else if (deteccionCampo.matches()) {
System.out.print("//// Detectado Campo:" + deteccionCampo.group(1));
System.out.println("; con el valor:" + deteccionCampo.group(2));
}
else
{
System.out.println("//// Esto no se que es (todava)");
}
}
/**
* cargarArchivo crear una instancia de la clase BufferedReader que
* permitir leer lnea a lnea el archivo de texto. Si no se ha podido
* cargar el archivo retornar null.
* @param name Nombre del archivo a cargar. si el nombre del archivo no
* se ha pasado por parmetro (valor null) se pedir al usuario que lo
* introduzca.
* @return null si no ha podido cargar el archivo, o la instancia de la
* clase BufferedReader si dicho archivo se ha podido cargar.
*/
static BufferedReader cargarArchivo(String name) {
String nombreArchivo = name;
BufferedReader reader = null;
if (name == null) {
System.out.print("Introduce el nombre del archivo:");
nombreArchivo = entrada.nextLine();
}
try {
FileReader f =new FileReader(nombreArchivo);
reader = new BufferedReader(f);
} catch (FileNotFoundException ex) {
Logger.getLogger(ProcesarArchivo1.class.getName()).log(Level.SEVERE, null, ex);
}
return reader;
}
/**
* Igual que el mtodo BufferedReader cargarArchivo(String name), pero
* que siempre le pedir al usuario que lo introduzca.
* @return null si no ha podido cargar el archivo, y una instancia de BufferedReader
* en otro caso.
*/

21

Aplicacindelasestructurasdealmacenamiento

DAW

static BufferedReader cargarArchivo() {


return cargarArchivo(null);
}
}

Ya tiene parte del trabajo hecho, al programa que ha realizado se le puede pasar el archivo de pedido
en texto plano, con codificacin UTF-8 y ya es capaz de procesarlo casi entero. Pero la parte de
artculos todava no la tiene terminada, bsicamente tiene dudas sobre donde almacenar la
informacin procesada, en especial, la lista de artculos.
Y dnde almacenaras t la lista de artculos del pedido? Una de las soluciones es usar arrays,
puede que sea justo lo que necesita Ana, pero puede que no.

Todosloslenguajesdeprogramacinpermitenelusodearrays,veamoscomosonenJava.
Losarrayspermitenalmacenarunacoleccindeobjetosodatosdelmismotipo.Sonmuytilesy
suutilizacinesmuysimple:
9 Declaracindelarray.Ladeclaracindeunarrayconsisteendecirestoesunarrayysiguela
siguienteestructura:" tipo[] nombre; ".Eltiposeruntipodevariableounaclaseyaexistente,
delacualsequieranalmacenarvariasunidades.
9 Creacindelarray.Lacreacindeunarrayconsisteendecireltamaoquetendrelarray,es
decir, el nmero de elementos que contendr, y se pone de la siguiente forma: nombre=new
tipo[dimension] , donde dimensin es un nmero entero positivo que indicar el tamao del
array.Unavezcreadoelarrayestenopodrcambiardetamao.
Veamosunejemplodesuuso:
int[] n; // Declaracin del array.
n = new int[10]; //Creacin del array reservando para l un espacio en memoria.
int[] m=new int[10]; // Declaracin y creacin en un mismo lugar.

Unavezhechoesto,yapodemosalmacenarvaloresencada
0 1
una de las posiciones del array, usando corchetes e
99 120
indicandoensuinteriorlaposicinenlaquequeremosleer
oescribir,teniendoencuentaquelaprimeraposicinesla
cero y la ltima el tamao del array menos uno. En el
ejemploanterior,laprimeraposicinserala0ylaltimaserala9.

6 7

9 Posicin

33

96

128

90

15

76

int[]n=newint[10];

Cules de las siguientes opciones permitira almacenar ms de 50 nmeros decimales?


int[] numeros; numeros=new int[51];

int[]numeros;numeros=newfloat[52];

double[]numeros;numeros=newdouble[53];
float[]numeros=newfloat[54];

3.1.Usodearraysunidimensionales.
Ya sabes declarar y crear arrays, pero, cmo y cuando se usan? Pues existen tres mbitos
principalmentedondesepuedenusar,ylostressonmuyimportantes:
1. modificacindeunaposicindelarray
2. accesoaunaposicindelarray
3. pasodeparmetros.
La modificacin de una posicin del array se realiza con una simple asignacin. Simplemente se
especifica entre corchetes la posicin a modificar despus del nombre del array. Veamoslo con un
simpleejemplo:
int[] Numeros=new int[3]; // Array de 3 nmeros (posiciones del 0 al 2).
Numeros[0]=99; // Primera posicin del array.
Numeros[1]=120; // Segunda posicin del array.
Numeros[2]=33; // Tercera y ltima posicin del array.

22

DesarrollodeAplicacionesWeb

Tema8

El acceso a un valor ya existente dentro de una posicin del array se consigue de forma similar,
simplementeponiendoelnombredelarrayylaposicinalacualsequiereaccederentrecorchetes:
int suma=Numeros[0] + Numeros[1] + Numeros[2];

Para nuestra comodidad, los arrays, como objetos que son en Java, disponen de una propiedad
pblica muy til. La propiedad length nos permite saber el tamao de cualquier array, lo cual es
especialmentetilenmtodosquetienencomoargumentounarray.
System.out.println("Longitud del array: "+Numeros.length);

El tercer uso principal de los arrays, como se dijo antes, es en el paso de parmetros. Para pasar
comoargumentounarrayaunafuncinomtodo,estadebetenerensudefinicinunparmetro
declaradocomoarray.Estoessimplementequeunodelosparmetrosdelafuncinseaunarray.
Veamosunejemplo:
int sumaarray (int[] j) {
int suma=0;
for (int i=0; i<j.length;i++)
suma=suma+j[i];
return suma;
}

Enelmtodoanteriorsepasacomoargumentounarraynumrico,sobreelcualsecalculalasuma
de todos los nmeros que contiene. Es un uso tpico de los arrays, fijate que especificar que un
argumento es un array es igual que declarar un array, sin la creacin del mismo. Para pasar como
argumentounarrayaunafuncin,simplementeseponeelnombredelarray:
int suma=sumaarray (Numeros);

EnJavalasvariablessepasanporcopiaalosmtodos,estoquieredecirquecuandosepasauna
variable a un mtodo, y se realiza una modificacin de su valor en dicho mtodo, el valor de la
variableenelmtododesdeelqueseharealizadolainvocacinnosemodifica.Perocuidado,eso
no pasa con los arrays. Cuando dicha modificacin se realiza en un array, es decir, se cambia el
valordeunodeloselementosdelarray,siquecambiasuvalordeformadefinitiva.
Veamosunejemploqueilustraambascosas:
public static void main(String[] args) {
int j=0; int[] i=new int(1); i[0]=0;
modificaArray(j,i);
System.out.println(j+"-"+i[0]); /* Mostrar por pantalla "01", puesto que el contenido del
array es modificado en la funcin, y aunque la variable j tambin se modifica, se modifica una
copia de la misma, dejando el original intacto */
}
int modificaArray(int j, int[] i); {
j++; i[0]++; /* Modificacin de los valores de la variable, solo afectar al array, no a j
*/
}

3.2.Inicializacin.
Rellenarunarray,parasuprimerautilizacin,esunatareamuyhabitualquepuedeserrpidamente
simplificada. Vamos a explorar dos sistemas que nos van a permitir inicializar un array de forma
cmodayrpida.
En primer lugar, una forma habitual de crear un array y rellenarlo es simplemente a travs de un
mtodo que lleve a cabo la creacin y el rellenado del array. Esto es sencillo desde que podemos
hacer que un mtodo retorne un array simplemente indicando en la declaracin que el valor
retornadoes tipo[] ,dondetipodedatoprimitivo( int , short , float ,...)ounaclaseexistente( String
porejemplo).Veamosunejemplo:
static int[] ArrayConNumerosConsecutivos (int totalNumeros) {
int[] r=new int[totalNumeros];
for (int i=0;i<totalNumeros;i++) r[i]=i;
return r;
}

Enelejemploanteriorsecreaunarrayconunaseriedenmerosconsecutivos,empezandoporel
cero, sencillo no? Este uso suele ahorrar bastantes lneas de cdigo en tareas repetitivas. Otra
formadeinicializarlosarrays,cuandoelnmerodeelementosesfijoysabidoapriori,esindicando

23

Aplicacindelasestructurasdealmacenamiento

DAW

entre llaves el listado de valores que tiene el array. En el siguiente ejemplo puedes ver la
inicializacindeunarraydetresnmeros,ylainicializacindeunarraycontrescadenasdetexto:
int[] array = {10, 20, 30};
String[]
diassemana=
{"Lunes",
"Domingo"};

"Martes",

"Mircoles",

"Jueves",

"Viernes",

"Sbado",

Perocuidado,lainicializacinsolosepuedeusarenciertoscasos.Lainicializacinanteriorfunciona
cuandosetratadeuntipodedatoprimitivo( int , short , float , double ,etc.)oun String ,yalgunos
pocoscasosms,peronofuncionarparacualquierobjeto.
Cuandosetratadeunarraydeobjetos,lainicializacindelmismoesunpocomsliosa,dadoqueel
valorinicialdeloselementosdelarraydeobjetossernull,oloqueeslomismo,crearunarrayde
objetosnosignificaquesehancreadolasinstanciasdelosobjetos.Hayquecrear,paracadaposicin
delarray,el objetodeltipocorrespondienteconeloperador new .Veamosunejemploconlaclase
StringBuilder .Enelsiguienteejemplosoloaparecernullporpantalla:
StringBuilder[] j=new StringBuilder[10];
for (int i=0; i<j.length;i++) System.out.println("Valor" +i + "="+j[i]); // Imprimir null
para los 10 valores.

Para solucionar este problema podemos optar por lo siguiente, crear para cada posicin del array
unainstanciadelobjeto:
StringBuilder[] j=new StringBuilder[10];
for (int i=0; i<j.length;i++) j[i]=new StringBuilder("cadena "+i);

Paraaccederaunapropiedadoaunmtodocuandoloselementosdelarraysonobjetos,puedes
usarlanotacindepuntodetrsdeloscorchetes,porejemplo:diassemana[0].length.Fijatebien
en el array diassemana anterior y piensa en lo que se mostrara por pantalla con el siguiente
cdigo:
System.out.println(diassemana[0].substring(0,2));

Cul es el valor de la posicin 3 del siguiente array: String[]

24

null
Unacadenavaca
Daraerrorynosepodracompilar

m=new String[10] ?

DesarrollodeAplicacionesWeb

Tema8

4.Arraysmultidimensionales.
Caso prctico.
Ana sigue dndole vueltas a como almacenar los diferentes datos del pedido, y sobre todo, sobre
como procesar los artculos, dado que los artculos del pedido pueden ser ms de uno. Ha pensado
en crear primero una clase para almacenar los datos del pedido, llamada Pedido, donde cada dato
del pedido sea un atributo de la clase. Pero claro, los artculos son ms de uno y no puede saber
cuntos atributos necesitar.
Para almacenar los artculos ha pensado en crear una clase llamada Articulo donde se meteran
todos los datos de cada artculo, y despus en la clase Pedido poner un array de artculos. Pero no lo
tiene claro y ha decidido preguntar a su tutora, Mara.

Questructuradedatosutilizarasparaalmacenarlospxelesdeunaimagendigital?Normalmente
lasimgenessoncuadradasasqueunadelasestructurasmsadecuadaseslamatriz.Enlamatriz
cadavalorpodraserelcolordecadapxel.Pero,quesunamatrizaniveldeprogramacin?Pues
es un array con dos dimensiones, o lo que es lo mismo, un array cuyos elementos son arrays de
nmeros.
Losarraysmultidimensionalesestnentodosloslenguajesdeprogramacinactuales,yobviamente
tambinenJava.LaformadecrearunarraydedosdimensionesenJavaeslasiguiente:
int[][] a2d=new int[4][5];

El cdigo anterior crear un array de dos dimensiones, o lo que es lo mismo, crear un array que
contendr4arraysde5nmeroscadauno.Vemosloconunejemplogrfico:
Posicinenla
1dimensin

0
1

2
3

10

11

12

13

14

15

16

17

18

19

Posicinenla
1dimensin

Posicinenla
2dimensin

Posicinenla
3dimensin

Posicinenla
4dimensin

Aligualqueconlosarraysdeunasoladimensin,losarraysmultidimensionalesdebendeclararsey
crearse. Podremos hacer arrays multidimensionales de todas las dimensiones que queramos y de
cualquiertipo.Enellostodosloselementosdelarrayserndelmismotipo,comoenelcasodelos
arrays de una sola dimensin. La declaracin comenzar especificando el tipo o la clase de los
elementos que forman el array, despus pondremos tantos corchetes como dimensiones tenga el
arrayyporltimoelnombredelarray,porejemplo:
int [][][] arrayde3dim;

La creacin se hace usando el operador new, seguido del tipo y los corchetes, en los cuales se
especificaeltamaodecadadimensin:
arrayde3dim=new int[2][3][4];

Todoesto,comoyahasvistoenunejemploanterior,sepuedeescribirenunanicasentencia.

Completa con los nmeros que faltan


int[][][] k=new int[10][11][12];
3
El array anterior es de
dimensiones, y tiene un total de

1320

nmeros enteros.

25

Aplicacindelasestructurasdealmacenamiento

DAW

4.1.Usodearraysmultidimensionales.
Y en qu se diferencia el uso de un array multidimensional con respecto a uno de una nica
dimensin?Puesenmuypocolaverdad.Continuaremosconelejemplodelapartadoanterior:
int[][] a2d=new int[4][5];

Paraaccederacadaunodeloselementosdelarrayanterior,habrqueindicarsuposicinenlasdos
dimensiones, teniendo en cuenta que los ndices de cada una de las dimensiones empiezan a
numerarseen0yquelaltimaposicineseltamaodeladimensinencuestinmenos1.
Puedesasignarunvaloraunaposicinconcretadentrodelarray,indicandolaposicinencadauna
delasdimensionesentrecorchetes:
a2d[0][0]=3;

Ycomoesdeimaginar,puedesusarunvaloralmacenadoenunaposicindelarraymultidimensional
simplementeponiendoelnombredelarrayylosndicesdelelementoalquedeseasaccederentre
corchetes,paracadaunadelasdimensionesdelarray.Porejemplo:
int suma=a2d[0][0]+a2d[0][1]+a2d[0][2]+a2d[0][3]+a2d[0][4];

Comoimaginars,losarraysmultidimensionalespuedentambinserpasadoscomoparmetrosalos
mtodos,simplementeescribiendoladeclaracindelarrayenlosargumentosdelmtodo,deforma
similaracomoserealizabaparaarraysdeunadimensin.Porejemplo:
static int sumaarray2d(int[][] a2d) {
int suma = 0;
for (int i1 = 0; i1 < a2d.length; i1++)
for (int i2 = 0; i2 < a2d[i1].length; i2++) suma += a2d[i1][i2];
return suma;
}

Delcdigoanterior,fjateespecialmenteenelusodelatributo length (quenospermiteobtenerel


tamao de un array). Aplicado directamente sobre el array nos permite saber el tamao de la
primeradimensin( a2d.length ).
Comolosarraysmultidimensionalessonarraysquetienencomoelementosarrays(exceptoelltimo
nivel que ya ser del tipo concreto almacenado), para saber el tamao de una dimensin superior
tenemosqueponerlosndicesentrecorchetesseguidosde length (a2d[i1].length) .
Para saber al tamao de una segunda dimensin (dentro de una funcin por ejemplo) hay que
hacerlo as y puede resultar un poco engorroso, pero gracias a esto podemos tener arrays
multidimensionalesirregulares.
Unamatrizesunejemplodearraymultidimensionalregular,porqu?
Puesporqueesunarrayquecontienearraysdenmerostodosdelmismotamao.Cuandoestono
es as, es decir, cuando
int [][] m=new int[4][];
los arrays de la segunda
0
1
2
3
dimensin
son
de
m[0]=new int[4];
0
diferente tamao entre
0
1
2
3
s, se puede decir que es
0
1
2
3
4
un
array
m[1]=new int[5];
1
multidimensional
5
6
7
8
9
irregular. En Java se
0
1
2
puede crear un array
m[2]=new int[3];
2
10
11
12
irregular
de
forma
relativamente
fcil,
0
1
2
3
4
m[3]=new int[5];
veamos un ejemplo para
3
15
16
17
18
19
dosdimensiones.

9 Declaramos y creamos el array pero sin especificar la segunda dimensin. Lo que estamos
haciendoenrealidadescrearsimplementeunarrayquecontendrarrays,sindecircomosonde
grandeslosarraysdelasiguientedimensin: int[][] irregular=new int[3][];
9 Despus creamos cada uno de los arrays unidimensionales (del tamao que queramos) y lo
asignamos a la posicin correspondiente del array anterior: irregular[0]=new int[7];
irregular[1]=new int[15]; irregular[2]=new int[9];

26

DesarrollodeAplicacionesWeb

Tema8

Cuandousesarraysirregulares,porseguridad,esconvenientequeverifiquessiemprequeelarray
no sea null en segundas dimensiones, y que la longitud sea la esperada antes de acceder a los
datos:
if (irregular[1]!=null && irregular[1].length>10) {...}

4.2.Inicializacindearraysmultidimensionales.
Enqusediferencialainicializacindearraysunidimensionalesdearraysmultidimensionales?En
muypoco.
Lainicializacindelosarraysmultidimensionalesesigualqueladelosarraysunidimensionales.Para
que una funcin retorne un array multidimensional, se hace igual que en arrays unidimensionales.
Simplemente hay que poner el tipo de dato seguido del nmero de corchetes correspondiente,
segnelnmerodedimensionesdelarray.Esoclaro,hayqueponerloenladefinicindelmtodo:
int[][] inicializarArray (int n, int m){
int[][] ret=new int[n][m];
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
ret[i][j]=n*m;
return ret;
}

Tambin se puede inicializar un array multidimensional usando las llaves, poniendo despus de la
declaracin del array un smbolo de igual, y encerrado entre llaves los diferentes valores del array
separadosporcomas,conlasalvedaddequehayqueponerunasllavesnuevascadavezquehaya
queponerlosdatosdeunanuevadimensin,lomejoresverloconunejemplo:
int[][] a2d={{0,1,2},{3,4,5},{6,7,8},{9,10,11}};
int[][][] a3d={{{0,1},{2,3}},{{0,1},{2,3}}};

Elprimerarrayanteriorseraunarrayde4por3yelsiguienteseraunarrayde2x2x2.Comopuedes
observar esta notacin a partir de 3 dimensiones ya es muy liosa y normalmente no se usa.
Utilizando esta notacin tambin podemos inicializar rpidamente arrays irregulares, simplemente
poniendoseparadosporcomasloselementosquetienecadadimensin:
int[][] i2d={{0,1},{0,1,2},{0,1,2,3},{0,1,2,3,4},{0,1,2,3,4,5}};
int[][][] i3d={ { {0,1},{0,2} } , {{0,1,3}} , {{0,3,4},{0,1,5} } };

EsposiblequeenalgunoslibrosyenInternetserefieranalosarraysusandootraterminologa.A
los arrays unidimensionales es comn llamarlos tambin arreglos o vectores, a los arrays de dos
dimensionesescomnllamarlosdirectamentematrices,yalosarraysdemsdedosdimensiones
esposiblequelosveasescritoscomomatricesmultidimensionales.Seacomosea,lomsnormal
enlajergainformticaesllamarlosarrays,trminoqueprocededelingls.

Dado el siguiente array: int[][][] i3d={{{0,1},{0,2}},


Cul es el valor de la posicin [1][1][2]?

{{0,1,3}},{{0,3,4},{0,1,5}}};

3
4
5
Ningunodelosanteriores

siintentasaccederaellasinverificarloobtendrasunaexcepcintipoArrayIndexOutOfBoundsException(excepcindeindicedearray
fueradeloslmites).

Las matrices tienen asociadas un amplio abanico de operaciones (transposicin, suma,


producto, etc.). En la siguiente pgina tienes ejemplos de cmo realizar algunas de estas
operaciones,usandoporsupuestoarrays:
www.sc.ehu.es/sbweb/fisica/cursoJava/numerico/matrices/matriz/matriz.htm

27

Aplicacindelasestructurasdealmacenamiento

DAW

5.Clasesymtodosgenricos.(I)
Caso prctico.
Mara se acerca a la mesa de Ana, quiere saber cmo lo lleva:
-Qu tal? Cmo vas con la tarea? -pregunta Mara.
-Bien, creo. Mi programita ya sabe procesar el archivo de pedido y he creado un par de clases para
almacenar los datos de forma estructurada para luego hacer el volcado XML, pero no se como
almacenar los artculos del pedido, porque son varios -comenta Ana.
-Pero, cul es el problema? Eso es algo sencillo.
-Pues que tengo que crear un array para guardar los artculos del pedido, y no s como averiguar el
nmero de artculos antes de empezar a procesarlos. Es necesario saber el nmero de artculos para
crear el array del tamao adecuado.
-Pues en vez de utilizar un array, podras utilizar una lista.

Sabes por qu se suele aprender el uso de los genricos? Pues porque se necesita para usar las
listas,aunquerealmentelosgenricossonunaherramientamuypotenteyquenospuedeahorrar
tareasdeprogramacinrepetitivas.
Lasclasesylosmtodosgenricossonunrecursodeprogramacindisponibleenmuchoslenguajes
de programacin. Su objetivo es claro: facilitar la reutilizacin del software, creando mtodos y
clases que puedan trabajar con diferentes tipos de objetos, evitando incomodas y engorrosas
conversionesdetipos.Suinicioseremontaalasplantillas(templates)deC++,ungranavanceenel
mundodeprogramacinsinduda.EnlenguajesdemsaltonivelcomoJavaoC#sehatransformado
en lo que se denomina genricos. Veamos un ejemplo sencillo de como transformar un mtodo
normalengenrico:
Versinnogenrica
Versingenricadelmtodo
public class util {
public static int compararTamano(Object[]
a,Object[] b) {
return a.length-b.length;
}
}

public class util {


public static <T> int compararTamano (T[]
a, T[] b) {
return a.length-b.length;
}
}

Losdosmtodosanteriorestienenunclaroobjetivo:permitircomprobarsiunarrayesmayorque
otro.
Retornarn 0 si ambos arrays son iguales, un nmero mayor de cero si el array a es mayor, y un
nmeromenordecerosielarraybesmayor,perounoesgenricoyelotrono.Laversingenrica
del mdulo incluye la expresin <T>, justo antes del tipo retornado por el mtodo. <T> es la
definicin de una variable o parmetro formal de tipo de la clase o mtodo genrico, al que
podemosllamarsimplementeparmetrodetipooparmetrogenrico.Esteparmetrogenrico(T)
se puede usar a lo largo de todo el mtodo o clase, dependiendo del mbito de definicin, y har
referencia a cualquier clase con la que nuestro algoritmo tenga que trabajar. Como veremos ms
adelante,puedehabermsdeunparmetrogenrico.
Utilizargenricostieneclarasventajas.Parainvocarunmtodogenrico,slohayquerealizaruna
invocacindetipogenrico,olvidndonosdelasconversionesdetipo.Estoconsisteenindicarqu
clasesointerfacesconcretasseutilizarnenlugardecadaparmetrogenrico(<T>),paradespus,
pasndolelosargumentoscorrespondientes,ejecutarelalgoritmo.Cadaclaseointerfazconcreta,la
podemosdenominartipootipobaseysedaporsentadoquelosargumentospasadosalmtodo
genricoserntambindedichotipobase.
Supongamos que el tipo base es Integer , pues para realizar la invocacin del mtodo genrico
anteriorbastaconindicareltipo,entrelossmbolosdemenorquymayorqu( <Integer> ),justo
antesdelnombredelmtodo.
InvocacindelmtodoNOgenrico
Invocacindelmtodogenrico
Integer []a={0,1,2,3,4};
Integer []b={0,1,2,3,4,5};
util.compararTamano ((Object[])a, (Object[])b);

..

28

Integer []a={0,1,2,3,4};
Integer []b={0,1,2,3,4,5};
util.<Integer>compararTamano (a, b);

DesarrollodeApllicacionesW
Web

Tema8
8

5.1.Clasesymtodosgenrico
os.(II)
Creees qu el c
digo es ms legible al utilizar gen
ricos o qu se complicca? La verdaad es que all
principiocuesta,perodespus,elcdigoseentiendemejorquessiseempiezaaainsertarcconversioness
detip
po.
Lasclasesgenriccassonequivalentesalo
osmtodosggenricospeeroaniveldeeclase,perm
mitendefinirr
unpaarmetrodeetipoogenricoquesepodrusar alolargodetodalaclaase,facilitan
ndoascrearr
clasesgenricasq
quesoncapaacesdetrabajarcondife
erentestipossdedatosbaase.Paracre
earunaclasee
odelnombreedelaclase:
genricaseespeccificanlospaarmetrosdeetipoallado
publi
ic class Util<T> {
T t1;
pu
ublic void invertir(T[] array) {
for (int i = 0; i < ar
rray.length / 2; i++) {
t1 = array[i];
array[i] = array[ar
rray.length - i - 1];
array[array.length - i - 1] = t1;
}
}
}

Enelejemploanterior,laclaaseUtilcontieneelmto
odoinvertir cuyafuncin
nesinvertir elordendee
quecrearun
n
losellementosdeecualquierarray,seadelltipoquesea.Parausar esaclasegeenricahayq
objetto o instanciia de dicha clase especificando el tipo base entre los smb
bolos menor que (<) y
y
mayo
orque(>),justodetrsdelnombreedelaclase.Veamosunejemplo:
Integ
ger[] numero
os={0,1,2,3,4,5,6,7,8,9};
Util<
<Integer> u=
= new Util<In
nteger>();
u.inv
vertir(numer
ros);
for (int
(
i=0;i<n
numeros.length;i++) Syst
tem.out.prin
ntln(numeros
s[i]);

Como
o puedes ob
bservar, el uso
u de genricos es sencillo, tanto
o a nivel de clase como
o a nivel dee
mto
odo.
Simplemente, a la hora de crear
c
una instancia de una
u clase geenrica, hay que especifficar el tipo,,
oenladefinicin(Util<in
nteger>u)co
omoenlacre
eacin(newUtil<Integerr>()).
tanto
Los genricos
g
loss vamos a usar
u
ampliam
mente a partir de ahoraa, aplicados a un mont
n de clasess
genricasquetieeneJavayqu
uesondegrranutilidad, porloqueeesconvenien
ntequeapre
endasbienaa
usarunaclasegenrica.

Losp
parmetrosd
detipodelasclasesgen
ricassolop
puedensercclases,nopuedenserjam
mstiposde
e
datoss primitivos como int, short, doub
ble, etc. En su lugar, de
ebemos usaar sus clasess envoltorio
o
Integger,Short,Do
ouble,etc.

Todavahayunm
montndeco
osasmssob
brelosmtodosylasclassesgenricasquedeberassaber.En
n
nalgunosusosinteresantesdelosgeenricos:
lasiguientetablasemuestran

29

Aplicacind
delasestructturasdealm
macenamientto

DAW

30

DesarrollodeAplicacionesWeb

Tema8

Dada la siguiente clase, donde el cdigo del mtodo prueba carece de importancia,
podras decir cul de las siguientes invocaciones es la correcta?
public class Util {
public static <T> int prueba (T t) { }
};

Util.<int>prueba(4);
Util.<Integer>prueba(newInteger(4));
Utilu=newUtil();u.<int>prueba(4);

31

Aplicacindelasestructurasdealmacenamiento

DAW

6.Introduccinalascolecciones.(I)
Caso prctico.
A Ana las listas siempre se le han atragantado, por eso no las usa. Despus de darle muchas
vueltas, ha pensado que no le queda ms remedio y que tendr que usarlas para almacenar los
artculos del pedido. Adems, ha concluido que es la mejor forma de gestionar un grupo de objetos,
aunque sean del mismo tipo.
No sabe si lo ms adecuado es usar una lista u otro tipo de coleccin, as que ha decido revisar todos
los tipos de colecciones disponibles en Java, para ver cul se adecua mejor a sus necesidades.

Qu consideras una coleccin? Pues seguramente al pensar en el trmino se te viene a la cabeza


unacoleccindelibrosoalgoparecido,ylaideanovamuydesencaminada.Unacoleccinanivelde
softwareesungrupodeelementosalmacenadosdeformaconjuntaenunamismaestructura.Eso
sonlascolecciones.
Las colecciones definen un conjunto de interfaces, clases genricas y algoritmos que permiten
manejargruposdeobjetos,todoelloenfocadoapotenciarlareusabilidaddelsoftwareyfacilitarlas
tareas de programacin. Te parecer increble el tiempo que se ahorra empleando colecciones y
cmo se reduce la complejidad del software usndolas adecuadamente. Las colecciones permiten
almacenar y manipular grupos de objetos que, a priori, estn relacionados entre s (aunque no es
obligatorioqueestnrelacionados,lolgicoesquesisealmacenanjuntosesporquetienenalguna
relacin entre s), pudiendo trabajar con cualquier tipo de objeto (de ah que se empleen los
genricosenlascolecciones).
Adems las colecciones permiten realizar algunas operaciones tiles sobre los elementos
almacenados, tales como bsqueda u ordenacin. En algunos casos es necesario que los objetos
almacenadoscumplanalgunascondiciones(queimplementenalgunasinterfaces),parapoderhacer
usodeestosalgoritmos.
Las colecciones son en general elementos de programacin que estn disponibles en muchos
lenguajes de programacin. En algunos lenguajes de programacin su uso es algo ms complejo
(comoeselcasodeC++),peroenJavasuusoesbastantesencillo,esalgoquedescubrirsalolargo
deloquequedadetema.
LascoleccionesenJavapartendeunaseriedeinterfacesbsicas.Cadainterfazdefineunmodelode
coleccinylasoperacionesquesepuedenllevaracabosobrelosdatosalmacenados,porloquees
necesarioconocerlas.Lainterfazinicial,atravsdelacualsehanconstruidoelrestodecolecciones,
es la interfaz java.util.Collection, que define las operaciones comunes a todas las colecciones
derivadas.Acontinuacinsemuestranlasoperacionesmsimportantesdefinidasporestainterfaz,
tenencuentaque Collection esunainterfazgenricadonde <E> eselparmetrodetipo(podra
sercualquierclase):
9 Mtodo int size() :retornaelnmerodeelementosdelacoleccin.
9 Mtodo boolean isEmpty() :retornarverdaderosilacoleccinestvaca.
9 Mtodo boolean contains (Object element) : retornar verdadero si la coleccin tiene el
elementopasadocomoparmetro.
9 Mtodo boolean add(E element) :permitiraadirelementosalacoleccin.
9 Mtodo boolean remove (Object element) :permitireliminarelementosdelacoleccin.
9 Mtodo Iterator<E> iterator() : permitir crear un iterador para recorrer los elementos de la
coleccin.Estosevemsadelante,notepreocupes.
9 Mtodo Object[] toArray() :permitepasarlacoleccinaunarraydeobjetostipoObject.
9 Mtodo containsAll(Collection<?> c) : permite comprobar si una coleccin contiene los
elementosexistentesenotracoleccin,siesas,retornaverdadero.
9 Mtodo addAll (Collection<? extends E> c) : permite aadir todos los elementos de una
coleccinaotracoleccin,siemprequeseandelmismotipo(oderivendelmismotipobase).
9 Mtodo boolean removeAll(Collection<?> c) : si los elementos de la coleccin pasada como
parmetroestnennuestracoleccin,seeliminan,elrestosequedan.
9 Mtodo boolean retainAll(Collection<?> c) : si los elementos de la coleccin pasada como
parmetroestnennuestracoleccin,sedejan,elrestoseeliminan.

32

DesarrollodeAplicacionesWeb

Tema8

9 Mtodo void clear() :vacarlacoleccin.


Ms adelante veremos cmo se usan estos mtodos, ser cuando veamos las implementaciones
(clasesgenricasqueimplementanalgunadelasinterfacesderivadasdelainterfaz Collection ).

33

Aplicacindelasestructurasdealmacenamiento

DAW

7.Conjuntos.(I)
Caso prctico.
Ana se toma un descanso, se levanta y en el pasillo se encuentra con Juan, con el que entabla una
conversacin bastante amena. Una cosa lleva a otra y al final, Ana saca el tema que ms le
preocupa:
-Cuntos tipos de colecciones hay? T te los sabes? -pregunta Ana.
-Yo? Qu va! Normalmente consulto la documentacin cuando los voy a usar, como todo el mundo.
Lo que s creo recordar es que haba cuatro tipos bsicos: los conjuntos, las listas, las colas y alguno
ms que no recuerdo. Ah s, los mapas, aunque creo que no se consideraban un tipo de coleccin.
Por qu lo preguntas?
-Pues porque tengo que usar uno y no s cul.

Conqurelacionaraslosconjuntos?Seguro
que con las matemticas. Los conjuntos son
Funcin
un tipo de coleccin que no admite
Zorro
DFCD3454
Hash
duplicados, derivados del concepto
matemticodeconjunto.
Elzorrorojo
Funcin
La interfaz java.util.Set define cmo deben
correatravs
52ED879E
Hash
ser los conjuntos, y extiende la interfaz
delhielo
Collection , aunque no aade ninguna
operacin nueva. Las implementaciones
Elzorrorojo
(clasesgenricasqueimplementanlainterfaz
Funcin
46042841
caminaa
Hash
Set )msusadassonlassiguientes:
travsdelhielo

9 java.util.HashSet .
Conjunto
que
almacenalosobjetosusandotablas hash (estructura de datos formada bsicamente por un array donde la

Entrada

Valor Hash

posicin de los datos va determinada por una funcin hash, permitiendo localizar la informacin de forma
extraordinariamenterpida.Losdatosestnordenadosenlatablaenbaseaunresumennumricodelosmismos(en
hexadecimal generalmente) obtenido a partir de un algoritmo para clculo de resmenes, denominadas funciones
hash. El resumen no tiene significado para un ser humano, se trata simplemente de un mecanismo para obtener un
nmeroasociadoaunconjuntodedatos.Elinconvenientedeestastablasesquelosdatosseordenanporelresumen
obtenido, y no por el valor almacenado. El resumen, de un buen algoritmo hash, no se parece en nada al contenido
almacenado)locualaceleraenormementeelaccesoalosobjetosalmacenados.

Inconvenientes:necesitanbastantememoriaynoalmacenanlosobjetosdeformaordenada(al
contrariopuedenaparecercompletamentedesordenados).
9 java.util.LinkedHashSet . Conjunto que almacena objetos combinando tablas hash , para un
acceso rpido a los datos, y listas enlazadas (estructura de datos que almacena los objetos enlazndolos
entresatravsdeunapuntadordememoriaopuntero,manteniendounorden,quegeneralmenteeseldemomento
de insercin, pero que puede ser otro. Cada dato se almacena en una estructura llamada nodo en la que existe un
campo, generalmente llamado siguiente, que contiene la direccin de memoria del siguiente nodo (con el siguiente
dato)) para conservar el orden. El orden de almacenamiento es el de insercin, por lo que se

puededecirqueesunaestructuraordenadaamedias.
Inconvenientes:necesitanbastantememoriayesalgomslentaque HashSet .
9 java.util.TreeSet .Conjuntoquealmacenalosobjetosusandounasestructurasconocidascomo
rbolesrojonegro.Sonmslentasquelosdostiposanteriores.perotienenunagranventaja:los
datos almacenados se ordenan por valor. Es decir, que aunque se inserten los elementos de
formadesordenada,internamenteseordenandependiendodelvalordecadauno.
Poco a poco, iremos viendo que son las listas enlazadas y los rboles (no profundizaremos en los
rbolesrojonegro,perosiveremoslasestructurastiporbolengeneral).Veamosunejemplodeuso
bsicodelaestructura HashSet ydespus,profundizaremosenlos LinkedHashSet ylos TreeSet .
Para crear un conjunto, simplemente creamos el HashSet indicando el tipo de objeto que va a
almacenar,dadoqueesunaclasegenricaquepuedetrabajarconcualquiertipodedatodebemos
crearlocomosigue(noolvideshacerlaimportacinde java.util.HashSet primero):
HashSet<Integer> conjunto=new HashSet<Integer>();

34

DesarrollodeAplicacionesWeb

Tema8

Despuspodremosiralmacenandoobjetosdentrodelconjuntousandoelmtodo add (definidopor


la interfaz Set ). Los objetos que se pueden insertar sern siempre del tipo especificado al crear el
conjunto:
Integer n=new Integer(10);
if (!conjunto.add(n)) System.out.println("Nmero ya en la lista.");

Si el elemento ya est en el conjunto, el mtodo add retornar false indicando que no se pueden
insertarduplicados.Sitodovabien,retornartrue.

Cul de las siguientes estructuras ordena automticamente los elementos segn su


valor?

HashSet
LinkedHashSet
TreeSet

7.1.Conjuntos.(II).
Yahoratepreguntars,cmoaccedoaloselementosalmacenadosenunconjunto?Paraobtener
los elementos almacenados en un conjunto hay que usar iteradores, que permiten obtener los
elementos del conjunto uno a uno de forma secuencial (no hay otra forma de acceder a los
elementos de un conjunto, es su inconveniente). Los iteradores se ven en mayor profundidad ms
adelante,demomento,vamosausariteradoresdeformatransparente,atravsdeunaestructura
for especial, denominada bucle for-each o bucle para cada. En el siguiente cdigo se usa un
bucleforeach,enllavariableivatomandotodoslosvaloresalmacenadosenelconjuntohastaque
llegaalltimo:
for (Integer i: conjunto) {
System.out.println("Elemento almacenado:"+i);
}

Comoveslaestructura for-each esmuysencilla:lapalabra for seguidade(tipovariable:coleccin)


yelcuerpodelbucle;tipoeseltipodelobjetosobreelquesehacreadolacoleccin,variablepues
eslavariabledondesealmacenarcadaelementodelacoleccinycoleccinpueslacoleccinens.
Losbucles for-each sepuedenusarparatodaslascolecciones.
Ejercicioresuelto
Realiza un pequeo programita que pregunte al usuario 5 nmeros diferentes (almacenndolos en
unHashSet),yquedespuscalculelasumadelosmismos(usandounbucleforeach).
Respuesta
Unasolucinposiblepodraserlasiguiente.Parapreguntaralusuariounnmeroyparamostrarlela
informacin sehausadolaclaseJOptionPane,peropodrashaberutilizadocualquierotrosistema.
Fijate en la solucin y vers que el uso de conjuntos ha simplificado enormemente el ejercicio,
permitiendoalprogramadorolaprogramadoracentrarseenotrosaspectos:
import java.util.HashSet;
import javax.swing.JOptionPane;
public class ejemplo {
public static void main(String[] args)
{
HashSet<Integer> conjunto=new HashSet<Integer>();
String str;
do {
str=JOptionPane.showInputDialog("Introduce un nmero "+(conjunto.size()+1)+":");
try {
Integer n= Integer.parseInt(str);
if (!conjunto.add(n))
JOptionPane.showMessageDialog(null, "Nmero ya en la lista. Debes introducir
otro.");
}
catch (NumberFormatException e)
{ JOptionPane.showMessageDialog(null,"Nmero errneo."); }

35

Aplicacindelasestructurasdealmacenamiento

DAW

} while (conjunto.size()<5);
// Calcular la suma
Integer suma=new Integer(0);
for (Integer i: conjunto) {
suma=suma+i;
}
JOptionPane.showMessageDialog(null,"La suma es:"+suma);
}
}

7.2.Conjuntos.(III).

36

dch

izq

dch

izq

dch
dch

dch

izq
izq

izq

Enqusediferencianlasestructuras LinkedHashSet y
publicclassNodo{
TreeSet de la estructura HashSet ? Ya se comento
publicNodosig;
antes, y es bsicamente en su funcionamiento
publicObjectv;
interno.
}
La estructura LinkedHashSet es una estructura que
internamente funciona como una lista enlazada,
sig
sig
sig
null
aunque usa tambin tablas hash para poder acceder
Nodo1
Nodo2
Nodo3
rpidamente a los elementos. Una lista enlazada es
unaestructurasimilaralarepresentadaenlaimagen
de la derecha, la cual est compuesta por nodos (elementos que forman la lista) que van
enlazndose entre s. Un nodo contiene dos cosas: el dato u objeto almacenado en la lista y el
siguientenododelalista.Sinohaysiguientenodo,seindicaponiendonulo(null)enlavariableque
contieneelsiguientenodo.
Laslistasenlazadastienenunmontndeoperacionesasociadasenlasquenovamosaprofundizar:
eliminacindeunnododelalista,insercindeunnodoalfinal,alprincipiooentredosnodos,etc.
Graciasalascoleccionespodremosutilizarlistasenlazadassintenerquecomplicarnosendetallesde
programacin.
Laestructura TreeSet ,encambio,utilizainternamenterboles.Losrbolessoncomolaslistaspero
mucho ms complejos. En vez de tener un nico elemento siguiente, pueden tener dos o ms
elementossiguientes,formandoestructurasorganizadasyjerrquicas.
Losnodossediferencianendostipos:nodospadreynodoshijo;unnodopadrepuedetenervarios
nodoshijoasociados(dependedeltipoderbol),dandolugaraunaestructuraquepareceunrbol
invertido(deahsunombre).
En la figura de la derecha se puede
Nodo
publicclassNodo
apreciar un rbol donde cada nodo Nivel0
{
puede tener dos hijos, denominados
publicNodoizq;
izquierdo (izq) y derecho (dch). Puesto
publicNododch;
Nodo
Nodo
que un nodo hijo puede tambin ser
publicObjectv;
padre a su vez, los rboles se suelen Nivel1
}
visualizar para su estudio por niveles
para entenderlos mejor, donde cada
Nodo
Nodo
nivelcontienehijosdelosnodosdelnivel Nivel2
null
null
anterior,exceptoelprimernivel(queno
tienepadre).
Losrbolessonestructurascomplejasde
null
null
null
null
manejar y que permiten operaciones
muy sofisticadas. Los rboles usados en los TreeSet , los rboles rojonegro, son rboles auto
ordenados,esdecir,quealinsertarunelemento,estequedaordenadoporsuvalordeformaqueal
recorrerelrbol,pasandoportodoslosnodos,loselementossalenordenados.Elejemplomostrado
enlaimagenessimplementeunrbolbinario,elmssimpledetodos.
Nuevamente,nosevaaprofundizarenlasoperacionesquesepuedenrealizarenunrbolanivel
interno(insercindenodos,eliminacindenodos,bsquedadeunvalor,etc.).Nosaprovecharemos

DesarrollodeAplicacionesWeb

Tema8

delascoleccionesparahacerusodesupotencial.Enlasiguientetablatienesunusocomparadode
TreeSet y LinkedHashSet . Su creacin es similar a como se hace con HashSet , simplemente
sustituyendo el nombre de la clase HashSet por una de las otras. Ni TreeSet , ni LinkedHashSet
admitenduplicados,yseusanlosmismosmtodosyavistosantes,losexistentesenlainterfaz Set
(queeslainterfazqueimplementan).

ConjuntoTreeSet
ConjuntoLinkedHashSet
TreeSet<Integer>t;
LinkedHashSet<Integer>t;
t=newTreeSet<Integer>();
t=newLinkedHashSet<Integer>();
t.add(newInteger(4));
t.add(newInteger(4));
Ejemplode t.add(newInteger(3));
t.add(newInteger(3));
uso
t.add(newInteger(1));
t.add(newInteger(1));
t.add(newInteger(99));
t.add(newInteger(99));
for(Integeri:t)System.out.println(i);
for(Integeri:t)System.out.println(i);
Resultado
mostrado
porpantalla

13499
(elresultadosaleordenadoporvalor)

43199
(losvaloressalenordenadossegnel
momentodeinsercinenelconjunto)

Un rbol cuyos nodos solo pueden tener un nico nodo hijo, en realidad es una lista.

Verdadero
Falso

7.3.Conjuntos.(IV)
Cmopodracopiarloselementosdeunconjuntodeunoaotro?Hay
que usar un bucle for y recorrer toda la lista para ello? Qu va! Para
facilitarestatarea,losconjuntos,ylascoleccionesengeneral,facilitanun
montn de operaciones para poder combinar los datos de varias
colecciones. Ya se vieron en un apartado anterior, aqu simplemente
vamosponerunejemplodesuuso.
Partimos del siguiente ejemplo, en el que hay dos colecciones de
diferentetipo,cadaunacon4nmerosenteros:
TreeSet<Integer> A= new TreeSet<Integer>();
A.add(9); A.add(19); A.add(5); A.add(7); // Elementos del conjunto A: 9, 19, 5 y 7
LinkedHashSet<Integer> B= new LinkedHashSet<Integer>();
B.add(10); B.add(20); B.add(5); B.add(7); // Elementos del conjunto B: 10, 20, 5 y 7

En el ejemplo anterior, el literal de nmero se convierte automticamente a la clase envoltorio


Integer sin tener que hacer nada, lo cual es una ventaja. Veamos las formas de combinar ambas
colecciones:

Combinacin.
Cdigo.
ElementosfinalesdelconjuntoA.
TodoslosdelconjuntoA,
Unin. Aadir todos los
aadiendolosdelB,pero
elementosdelconjuntoBenel A.addAll(B)
sin repetir los que ya
conjuntoA.
estn:5,7,9,10,19y20.
Todos los elementos del
Diferencia.
Eliminar
los
conjuntoA,quenoestn
elementos del conjunto B que A.removeAll(B)
enelconjuntoB:9,19.
puedanestarenelconjuntoA.
Todos los elementos del
Interseccin. Retiene los
conjuntoA, que tambin
elementos comunes a ambos A.retainAll(B)
estnenelconjuntoB:5
conjuntos.
y7.

37

Aplicacindelasestructurasdealmacenamiento

DAW

Recuerda,estasoperacionessoncomunesatodaslascolecciones.

Puede que no recuerdes cmo era eso de los conjuntos, y dada la ntima relacin de las
colecciones con el lgebra de conjuntos, es recomendable que repases cmo era aquello,
conelsiguienteartculodelaWikipedia.
http://es.wikipedia.org/wiki/%C3%81lgebra_de_conjuntos

Tienes un HashSet llamado vocales que contiene los elementos a, e, i, o, u, y


otro, llamado vocales_fuertes con los elementos a, e y o. De qu forma
podramos sacar una lista con las denominadas vocales dbiles (que son aquellas que no
son fuertes)?

vocales.retainAll(vocales_fuertes);
vocales.removeAll(vocales_fuertes);
NoesposiblehacerestoconHashSet,solosepuedehacerconTreeSetoLinkedHashSet.

7.4.Conjuntos.(V)
Por defecto, los TreeSet ordenan sus elementos de forma ascendente, pero, se podra cambiar el
ordendeordenacin?Los TreeSet tienenunconjuntodeoperacionesadicionales,ademsdelasque
incluyeporelhechodeserunconjunto,quepermiteentreotrascosas,cambiarlaformadeordenar
loselementos.Estoesespecialmentetilcuandoeltipodeobjetoquesealmacenanoesunsimple
nmero,sinoalgomscomplejo(unartculoporejemplo). TreeSet escapazdeordenartiposbsicos
(nmeros,cadenasyfechas)perootrotipodeobjetosnopuedeordenarloscontantafacilidad.
Para indicar a un TreeSet cmo tiene que ordenar los elementos, debemos decirle cundo un
elementovaantesodespusqueotro,ycundosoniguales.Paraello,utilizamoslainterfazgenrica
java.util.Comparator ,usadaengeneralenalgoritmosdeordenacin,comoveremosmsadelante.
Setratadecrearunaclasequeimplementedichainterfaz,asdefcil.Dichainterfazrequieredeun
nicomtodoquedebecalcularsiunobjetopasadoporparmetroesmayor,menoroigualqueotro
del mismo tipo. Veamos un ejemplo general de cmo implementar un comparador para una
hipotticaclaseObjeto:
class ComparadorDeObjetos implements Comparator<Objeto> {
public int compare(Objeto o1, Objeto o2) { ... }
}

Lainterfaz Comparator obligaaimplementarunnicomtodo,eselmtodo compare ,elcualtienedos


parmetros:losdoselementosacomparar.Lasreglassonsencillas,alahoradepersonalizardicho
mtodo:
9 Sielprimerobjeto(o1)esmenorqueelsegundo(o2),deberetornarunnmeroenteronegativo.
9 Sielprimerobjeto(o1)esmayorqueelsegundo(o2),deberetornarunnmeroenteropositivo.
9 Siambossoniguales,deberetornar0.
A veces, cuando el orden que deben tener los elementos es diferente al orden real (por ejemplo
cuandoordenamoslosnmerosenordeninverso),ladefinicindeantespuedeserunpocoliosa,as
queesrecomendableentalescasospensardelasiguienteforma:
9 Sielprimerobjeto(o1)debeirantesqueelsegundoobjeto(o2),retornarenteronegativo.
9 Sielprimerobjeto(o1)debeirdespusqueelsegundoobjeto(o2),retornarenteropositivo.
9 Siambossoniguales,deberetornar0.
Unavezcreadoelcomparadorsimplementetenemosquepasarlocomoparmetroenelmomento
delacreacinal TreeSet ,ylosdatosinternamentemantendrndichaordenacin:
TreeSet<Objeto> ts=new TreeSet<Objeto>(new ComparadorDeObjetos());

Ejercicioresuelto
ImagnatequeObjetoesunaclasecomolasiguiente:
class Objeto {

38

DesarrollodeAplicacionesWeb

Tema8

public int a;
public int b;
}

Imaginaqueahora,alaadirlosenunTreeSet,estossetienenqueordenardeformaquelasumade
susatributos(ayb)seadescendente,comoseraelcomparador?
Respuesta
Unadelasposiblessolucionesaesteproblemapodraserlasiguiente:
class ComparadorDeObjetos implements Comparador<Objeto> {
@Override
public int compare(Objeto o1, Objeto o2) {
int sumao1=o1.a+o1.b; int sumao2=o2.a+o2.b;
if (sumao1<sumao2) return 1;
else if (sumao1>sumao2) return -1;
else return 0;
}
}

39

Aplicacindelasestructurasdealmacenamiento

DAW

8.Listas.(I)
Caso prctico.
Juan se queda pensando despus de que Ana le preguntara si saba los tipos de colecciones que
haba en Java. Obviamente no lo saba, son muchos tipos, pero ya tena una respuesta preparada:
-Bueno, sea lo que sea, siempre puedes utilizar una lista para almacenar lo que sea. Yo siempre las
uso, pues te permiten almacenar cualquier tipo de objeto, extraer uno de las lista sin tener que
recorrerla entera, buscar si hay o no un elemento en ella, de forma cmoda. Son para m el mejor
invento desde la rueda -dijo Juan.
-Ya, supongo, pero hay dos tipos de listas que me interesan, LinkedList y ArrayList, cul es mejor?
Cul me conviene ms? -respondi Ana.

Enqusediferenciaunalistadeunconjunto?Laslistassonelementosdeprogramacinunpoco
ms avanzados que los conjuntos. Su ventaja es que amplan el conjunto de operaciones de las
coleccionesaadiendooperacionesextra,veamosalgunasdeellas:
9 Las listas si pueden almacenar duplicados, si no queremos duplicados, hay que verificar
manualmentequeelelementonoestenlalistaantesdesuinsercin.
9 Accesoposicional.Podemosaccederaunelementoindicandosuposicinenlalista.
9 Bsqueda.Esposiblebuscarelementosenlalistayobtenersuposicin.Enlosconjuntos,alser
colecciones sin aportar nada nuevo, solo se poda comprobar si un conjunto contena o no un
elementodelalista,retornandoverdaderoofalso.Laslistasmejoranesteaspecto.
9 Extraccin de sublistas. Es posible obtener una lista que contenga solo una parte de los
elementosdeformamuysencilla.
EnJava,paralaslistassedisponedeunainterfazllamada java.util.List ,ydosimplementaciones
( java.util.LinkedList y java.util.ArrayList ),condiferenciassignificativasentreellas.Losmtodos
de la interfaz List , que obviamente estarn en todas las implementaciones, y que permiten las
operacionesanterioresson:
9 E get(int index) .Elmtodo get permiteobtenerunelementopartiendodesuposicin(index).
9 E set(int index, E element) .Elmtodo set permitecambiarelelementoalmacenadoenuna
posicindelalista(index),porotro(element).
9 void add(int index, E element) . Se aade otra versin del mtodo add, en la cual se puede
insertar un elemento (element) en la lista en una posicin concreta (index), desplazando los
existentes.
9 E remove(int index) .Seaadeotraversindelmtodoremove,estaversinpermiteeliminar
unelementoindicandosuposicinenlalista.
9 boolean addAll(int index, Collection<? extends E> c) . Se aade otra versin del mtodo
addAll , que permite insertar una coleccin pasada por parmetro en una posicin de la lista,
desplazandoelrestodeelementos.
9 int indexOf(Object o) .Elmtodo indexOf permiteconocerlaposicin(ndice)deunelemento,
sidichoelementonoestenlalistaretornar1.
9 int lastIndexOf(Object o) .Elmtodo lastIndexOf nospermiteobtenerlaltimaocurrenciadel
objetoenlalista(dadoquelalistasipuedealmacenarduplicados).
9 List<E> subList(int from, int to) .Elmtodo subList generaunasublista(unavistaparcialde
lalista)conloselementoscomprendidosentrelaposicininicial(incluida)ylaposicinfinal(no
incluida).
Tenencuentaqueloselementosdeunalistaempiezananumerarsepor0.Esdecir,queelprimer
elementodelalistaesel0.TenencuentatambinqueListesunainterfazgenrica,porloque<E>
correspondeconeltipobaseusadocomoparmetrogenricoalcrearlalista.

Si M es una lista de nmeros enteros, sera correcto poner M.add(M.size(),3);?

S
No

InsertaunelementoalfinaldelalistayesequivalenteaponerM.add(3).

40

DesarrollodeAplicacionesWeb

Tema8

8.1.Listas.(II)
Y, cmo se usan las listas? Pues para usar una lista haremos uso de sus implementaciones
LinkedList y ArrayList . Veamos un ejemplo de su uso y despus obtendrs respuesta a esta
pregunta.
Supongo que intuirs como se usan, pero nunca viene mal un ejemplo sencillo, que nos aclare las
ideas.Elsiguienteejemplomuestracomousarun LinkedList perovaldratambinpara ArrayList
(noolvidesimportarlasclases java.util.LinkedList y java.util.ArrayList segnseanecesario).En
esteejemploseusanlosmtodosdeaccesoposicionalalalista:
LinkedList<Integer> t=new LinkedList<Integer>(); // Declaracin y creacin del LinkedList de
enteros.
t.add(1); // Aade un elemento al final de la lista.
t.add(3); // Aade otro elemento al final de la lista.
t.add(1,2); // Aade en la posicin 1 el elemento 2.
t.add(t.get(1)+t.get(2)); // Suma los valores contenidos en la posicin 1 y 2, y lo agrega al
final.
t.remove(0); // Elimina el primer elementos de la lista.
for (Integer i: t) System.out.println("Elemento:" + i); // Muestra la lista.

Enelejemploanterior,serealizanmuchasoperaciones,culserel contenidodelalistaalfinal?
Puesser2,3y5.Enelejemplocabedestacarelusodelbucle for-each ,recuerdaquesepuedeusar
encualquiercoleccin.
Veamos otro ejemplo, esta vez con ArrayList , de cmo obtener la posicin de un elemento en la
lista:
ArrayList<Integer> al=new ArrayList<Integer>(); // Declaracin y creacin del ArrayList de
enteros.
al.add(10); al.add(11); // Aadimos dos elementos a la lista.
al.set(al.indexOf(11), 12); // Sustituimos el 11 por el 12, primero lo buscamos y luego lo
reemplazamos.

Enelejemploanterior,seempleatantoelmtodo indexOf paraobtenerlaposicindeunelemento,


como el mtodo set para reemplazar el valor en una posicin, una combinacin muy habitual. El
ejemploanteriorgenerarun ArrayList quecontendrdosnmeros,el10yel12.Veamosahoraun
ejemploalgomsdifcil:
al.addAll(0, t.subList(1, t.size()));

Esteejemploesespecialporqueusasublistas.Seusaelmtodo size paraobtenereltamaodela


lista. Despus el mtodo subList para extraer una sublista de la lista (que inclua en origen los
nmeros 2, 3 y 5), desde la posicin 1 hasta el final de la lista (lo cual dejara fuera al primer
elemento).Yporltimo,seusaelmtodo addAll paraaadirtodosloselementosdelasublistaal
ArrayList anterior.
Debes saber que las operaciones aplicadas a una sublista repercuten sobre la lista original. Por
ejemplo, si ejecutamos el mtodo clear sobre una sublista, se borrarn todos los elementos de la
sublista,perotambinseborrarndichoselementosdelalistaoriginal:
al.subList(0, 2).clear();

Lomismoocurrealaadirunelemento,seaadeenlasublistayenlalistaoriginal.

Las listas enlazadas son un elemento muy recurrido y su funcionamiento interno es


complejo.Terecomendamoselsiguienteartculodelawikipediaparaprofundizarunpoco
msenlaslistasenlazadasylosdiferentestiposquehay.
http://es.wikipedia.org/wiki/Lista_enlazada

Completa con el nmero que falta.


Dado el siguiente cdigo:
LinkedList<Integer> t=new LinkedList<Integer>();
t.add(t.size()+1); t.add(t.size()+1); Integer suma = t.get(0) + t.get(1);

El valor de la variable suma despus de ejecutarlo es

41

Aplicacindelasestructurasdealmacenamiento

DAW

8.2.Listas.(III)
Yen qusediferenciaun LinkedList deun ArrayList ?Los LinkedList utilizanlistasdoblemente
enlazadas,quesonlistasenlazadas(comosevioenunapartadoanterior),peroquepermitenirhacia
atrsenlalistadeelementos.Loselementosdelalistaseencapsulanenlosllamadosnodos.
Los nodos van enlazados unos a otros para
publicclassnodo{

publicNodosig;
noperderelordenynolimitareltamaode

publicNodoant;
almacenamiento. Tener un doble enlace

publicObjectV;
significa que en cada nodo se almacena la
}
informacin de cul es el siguiente nodo y
sig
sig
sig
adems, de cul es el nodo anterior. Si un
Nodo2
Nodo2
Nodo2
null
null
nodo no tiene nodo siguiente o nodo
ant
ant
ant
anterior,sealmacenanullonuloparaambos
casos.
Noeselcasodelos ArrayList .Estosseimplementanutilizandoarraysquesevanredimensionando
conforme se necesita ms espacio o menos. La redimensin es transparente a nosotros, no nos
enteramos cuando se produce, pero eso redunda en una diferencia de rendimiento notable
dependiendodeluso.Los ArrayList sonmsrpidosencuantoaaccesoaloselementos,accedera
unelementosegnsuposicinesmsrpidoenunarrayqueenunalistadoblementeenlazada(hay
querecorrerlalista).Encambio,eliminarunelementoimplicamuchasmsoperacionesenunarray
queenunalistaenlazadadecualquiertipo.
Yestoquequieredecir?Quesisevanarealizarmuchasoperacionesdeeliminacindeelementos
sobre la lista, conviene usar una lista enlazada ( LinkedList ), pero si no se van a realizar muchas
eliminaciones,sinoquesolamentesevanainsertaryconsultarelementosporposicin,conviene
usarunalistabasadaenarraysredimensionados( ArrayList ).
LinkedList tiene otras ventajas que nos puede llevar a su uso. Implementa las interfaces
java.util.Queue y java.util.Deque .Dichasinterfacespermitenhacerusodelaslistascomosifueran
unacoladeprioridadounapila,respectivamente.
Lascolas,tambinconocidascomocolasdeprioridad,sonunalistaperoqueaportanmtodospara
trabajardeformadiferente.Tsabesloqueeshacercolaparaqueteatiendanenunaventanilla?
Puesigual.Setratadequeelqueprimeroquellegaeselprimeroenseratendido(FIFOeningls).
Simplemente se aportan tres mtodos nuevos: meter en el final de la lista ( add y offer ), sacar y
eliminarelelementomsantiguo( poll ),yexaminarelelementoalprincipiodelalistasineliminarlo
( peek ).Dichosmtodosestndisponiblesenlaslistasenlazadas LinkedList :
9 boolean add(E e) y boolean offer(E e) ,retornarntruesisehapodidoinsertarelelementoal
finaldela LinkedList .
9 E poll() retornarelprimerelementodela LinkedList yloeliminardelamisma.Alinsertaral
final,loselementosmsantiguossiempreestnalprincipio.Retornarnullsilalistaestvaca.
9 E peek() retornar el primer elemento de la LinkedList pero no lo eliminar, permite
examinarlo.Retornarnullsilalistaestvaca.
Laspilas,muchomenosusadas,sontodolocontrarioalaslistas.Unapilaesigualqueunamontaa
dehojasenblanco,paraaadirhojasnuevasseponenencimadelresto,ypararetirarunasecogela
primeraquehay,encimadetodas.Enlaspilaselltimoenllegareselprimeroenseratendido.Para
elloseproveendetresmtodos:meteralprincipiodelapila( push ),sacaryeliminardelprincipiode
lapila( pop ),yexaminarelprimerelementodelapila( peek ,igualquesiusaralalistacomounacola).
Laspilasseusanmenosyharemosmenoshincapienellas.Simplementetenenmenteque,tanto
lascolascomolaspilas,sonunalistaenlazadasobrelaquesehacenoperacionesespeciales.

Dada la siguiente lista, usada como si fuera una cola de prioridad, cul es la letra que
se mostrara por la pantalla tras su ejecucin?
LinkedList<String> tt=new LinkedList<String>();
tt.offer("A"); tt.offer("B"); tt.offer("C");
System.out.println(tt.poll());

42

DesarrollodeAplicacionesWeb

Tema8

8.3.Listas.(IV)
Alahoradeusarlaslistas,hayquetenerencuentaunpardedetalles,sabescules?Essencillo,
peroimportante.
No es lo mismo usar las colecciones (listas y conjuntos) con objetos inmutables ( Strings , Integer ,
etc.) que con objetos mutables. Los objetos inmutables no pueden ser modificados despus de su
creacin,porloquecuandoseincorporanalalista,atravsdelosmtodos add ,sepasanporcopia
(esdecir,serealizaunacopiadelosmismos).Encambiolosobjetosmutables(comolasclasesquet
puedescrear),nosecopian,yesopuedeproducirefectosnodeseados.
Imaginatelasiguienteclase,quecontieneunnmero:
class Test
{
public Integer num;
Test (int num) { this.num=new Integer(num); }
}

Laclasedeantesesmutable,porloquenosepasaporcopiaalalista.Ahoraimaginaelsiguiente
cdigoenelquesecreaunalistaqueusaestetipodeobjeto,yenelqueseinsertandosobjetos:
Test p1=new Test(11); // Se crea un objeto Test donde el entero que contiene vale 11.
Test p2=new Test(12); // Se crea otro objeto Test donde el entero que contiene vale 12.
LinkedList<Test> lista=new LinkedList<Test>(); // Creamos una lista enlazada para objetos tipo
Test.
lista.add(p1); // Aadimos el primero objeto test.
lista.add(p2); // Aadimos el segundo objeto test.
for (Test p:lista) System.out.println(p.num); // Mostramos la lista de objetos.

Qumostraraporpantallaelcdigoanterior?Simplementemostraralosnmeros11y12.Ahora
bien,qupasasimodificamoselvalordeunodelosnmerosdelosobjetostest?Qusemostrar
alejecutarelsiguientecdigo?
p1.num=44;
for (Test p:lista) System.out.println(p.num);

El resultado de ejecutar el cdigo anterior es que se muestran los nmeros 44 y 12. El nmero ha
sidomodificadoynohemostenidoquevolverainsertarelelementoenlalistaparaqueenlalistase
cambie tambin. Esto es porque en la lista no se almacena una copia del objeto Test, sino un
apuntadoradichoobjeto(solohayunacopiadelobjetoalaquesehacereferenciadesdedistintos
lugares).

"Controlarlacomplejidadeslaesenciadelaprogramacin."
BrianKerniga

En el siguiente documento encontrars mucha informacin adicional sobre las estructuras


de datos, incluyendo algunas estructuras de datos adicionales menos usadas que no se
abordan en este tema. Algunas palabras cambian, por ejemplo, llama arreglos a los
arrays (ya se coment con anterioridad la existencia de esa otra nomenclatura). Es un
textoqueprofundizabastante,enlasestructurasdedatos,asqueleeloconpacienciaysin
prisas:
http://www.utim.edu.mx/~svalero/docs/ED_Java.pdf

Los elementos de un ArrayList de objetos Short se copian al insertarse al ser objetos


mutables.

Verdadero
Falso

Loselementossepasanporcopiaporserinmutables,nomutables.

43

Aplicacindelasestructurasdealmacenamiento

DAW

9.Conjuntosdeparesclave/valor.
Caso prctico.
Juan se quedo pensativo despus de la conversacin con Ana. Ana se fue a su puesto a seguir
trabajando, pero el se qued dndole vueltas al asunto... Si que est bien preparada Ana, me ha
puesto en jaque y no saba qu responder. El hecho de no poder ayudar a Ana le frustr un poco.
De repente, apareci Mara. Entonces Juan aprovecha el momento para preguntar con ms detalle
acerca del trabajo de Ana. Mara se lo cuenta y de repente, se le enciende una bombilla a Juan...
dice: Vale, creo que puedo ayudar a Ana en algo, le aconsejare usar mapas y le explicar como se
usan.

Cmoalmacenaraslos datosde un diccionario?Tenemosporunlado cadapalabray porotrosu


significado. Para resolver este problema existen precisamente los arrays asociativos . Un tipo de
array asociativo son los mapas o diccionarios, que permiten almacenar pares de valores conocidos
como clave y valor. La clave se utiliza para acceder al valor, como una entrada de un diccionario
permiteaccederasudefinicin.
EnJavaexistelainterfaz java.util.Map quedefinelosmtodosquedebentenerlosmapas,yexisten
tres implementaciones principales de dicha interfaz: java.util.HashMap , java.util.TreeMap y
java.util.LinkedHashMap . Te suenan? Claro que si. Cada una de ellas, respectivamente, tiene
caractersticassimilaresa HashSet , TreeSet y LinkedHashSet ,tantoenfuncionamientointernocomo
enrendimiento.
Losmapasutilizanclasesgenricasparadarextensibilidadyflexibilidad,ypermitendefiniruntipo
baseparalaclave,yotrotipodiferenteparaelvalor.Veamosunejemplodecomocrearunmapa,
queesextensiblealosotrosdostiposdemapas:
HashMap<String,Integer> t=new HashMap<String,Integer>();

Elmapaanteriorpermiteusarcadenascomollavesyalmacenardeformaasociadaacadallave,un
nmero entero. Veamos los mtodos principales de la interfaz Map , disponibles en todas las
implementaciones.Enlosejemplos,VeseltipobaseusadoparaelvaloryKeltipobaseusadopara
lallave:
Mtodo.
Descripcin.
Inserta un par de objetos llave (key) y valor (value) en el
mapa.Silallaveyaexisteenelmapa,entoncesretornarel
Vput(Kkey,Vvalue);
valor asociado que tena antes, si la llave no exista,
entoncesretornarnull.
Obtiene el valor asociado a una llave ya almacenada en el
Vget(Objectkey);
mapa.Sinoexistelallave,retornarnull.
Eliminalallaveyelvalorasociado.Retornaelvalorasociado
Vremove(Objectkey);
a la llave, por si lo queremos utilizar para algo, o null, si la
llavenoexiste.
Retornartruesielmapatienealmacenadalallavepasada
booleancontainsKey(Objectkey);
porparmetro,falseencualquierotrocaso.
Retornartruesielmapatienealmacenadoelvalorpasado
booleancontainsValue(Objectvalue);
porparmetro,falseencualquierotrocaso.
Retornar el nmero de pares llave y valor almacenado en
intsize();
elmapa.
Retornartruesielmapaestvaco,falseencualquierotro
booleanisEmpty();
caso.
voidclear();
Vacaelmapa.

Completa el siguiente cdigo para que al final se muestre el nmero 40 por pantalla:
HashMap<String, String >datos=new HashMap<String,String>();
datos.put ("A","44");
System.out.println(Integer.parseInt (datos.get (" A ")) 4 );

44

DesarrollodeAplicacionesWeb

Tema8

10.Iteradores.(I)
Caso prctico.
Juan se acerco a la mesa de Ana y le dijo:
-Mara me ha contado la tarea que te ha encomendado y he pensado que quizs te convendra usar
mapas en algunos casos. Por ejemplo, para almacenar los datos del pedido asociados con una
etiqueta: nombre, direccin, fecha, etc. As creo que te ser ms fcil generar luego el XML.
-La verdad es que pensaba almacenar los datos del pedido en una clase especial llamada Pedido. No
tengo ni idea de que son los mapas -dijo Ana-, supongo que son como las listas, tienen iteradores?
-Segn me ha contado Mara, no necesitas hacer tanto, no es necesario crear una clase especfica
para los pedidos. Y respondiendo a tu pregunta, los mapas no tienen iteradores, pero hay una
solucin... te explico.

Qu son los iteradores realmente? Son un mecanismo que nos permite recorrer todos los
elementosdeunacoleccindeformasencilla,deformasecuencial,ydeformasegura.Losmapas,
como no derivan de la interfaz Collection realmente, no tienen iteradores, pero como veremos,
existeuntrucointeresante.
Lositeradorespermitenrecorrerlascoleccionesdedosformas:buclesforeach(existentesenJavaa
partirdelaversin1.5)yatravsde unbucle normalcreando uniterador. Comolosbucles foreach yaloshemosvistoantes(yhaquedadopatentesusimplicidad),nosvamosacentrarenelotro
mtodo,especialmentetilenversionesantiguasdeJava.Ahoralapreguntaes,cmosecreaun
iterador?Puesinvocandoelmtodo iterator() decualquiercoleccin.
Veamosunejemplo(enelejemplotesunacoleccincualquiera):
Iterator<Integer> it=t.iterator();

Fijate que se ha especificado un parmetro para el tipo de dato genrico en el iterador (poniendo
<Integer> despusde Iterator ).Estoesporquelositeradoressontambinclasesgenricas,yes
necesario especificar el tipo base que contendr el iterador. Sino se especifica el tipo base del
iterador,igualmentenospermitirarecorrerlacoleccin,peroretornarobjetostipo Object (clasede
laquederivantodaslasclases),conloquenosveremosobligadosaforzarlaconversindetipo.
Pararecorrerygestionarlacoleccin,eliteradorofrecetresmtodosbsicos:
9 boolean hasNext() .Retornartruesilequedanmselementosalacoleccinporvisitar.Falseen
casocontrario.
9 E next() . Retornar el siguiente elemento de la coleccin, si no existe siguiente elemento,
lanzarunaexcepcin( NoSuchElementException paraserexactos),conloqueconvienechequear
primerosielsiguienteelementoexiste.
9 remove() .Eliminadelacoleccinelltimoelementoretornadoenlaltimainvocacindenext
(noesnecesariopasarseloporparmetro).Cuidado,sinextnohasidoinvocadotodava,saltar
unaincomodaexcepcin.
Cmorecorreramosunacoleccinconestosmtodos?Puesdeunaformamuysencilla,unsimple
buclemientras( while )conlacondicin hasNext() nospermitehacerlo:
while (it.hasNext()) // Mientras que haya un siguiente elemento, seguiremos en el bucle.
{
Integer t=it.next(); // Escogemos el siguiente elemento.
if (t%2==0) it.remove(); //Si es necesario, podemos eliminar el elemento extrado de la
lista.
}

Qu elementos contendra la lista despus de ejecutar el bucle? Efectivamente, solo los nmeros
impares.

Laslistaspermitenaccesoposicionalatravsdelosmtodosgetyset,yaccesosecuencialatravs
deiteradores,culesparatlaformamscmodaderecorrertodosloselementos?Unacceso
posicional a travs un bucle for (i=0;i<lista.size();i++) o un acceso secuencial usando un
bucle while (iterador.hasNext()) ?

10.1.Iteradores.(II)
Qu inconvenientes tiene usar los iteradores sin especificar el tipo de objeto? En el siguiente
ejemplo, se genera una lista con los nmeros del 0 al 10. De la lista, se eliminan aquellos que son

45

Aplicacindelasestructurasdealmacenamiento

DAW

pares y solo se dejan los impares. En el ejemplo de la izquierda se especifica el tipo de objeto del
iterador,enelejemplodeladerechano,observaelusodelaconversindetiposenlalnea6.
Ejemplonoindicandoeltipodeobjetodel
Ejemploindicandoeltipodeobjetodeiterador.
iterador,
ArrayList
<Integer>
lista=new
ArrayList<Integer>();
for (int i=0;i<10;i++) lista.add(i);
Iterator<Integer> it=lista.iterator();
while (it.hasNext()) {
Integer t=it.next();
if (t%2==0) it.remove();
}

ArrayList
<Integer>
lista=new
ArrayList<Integer>();
for (int i=0;i<10;i++) lista.add(i);
Iterator it=lista.iterator();
while (it.hasNext()) {
Integer t=(Integer)it.next();
if (t%2==0) it.remove();
}

Uniteradoresseguroporqueestapensadoparanosobrepasarloslmitesdelacoleccin,ocultando
operaciones ms complicadas que pueden repercutir en errores de software. Pero realmente se
convierteeninsegurocuandoesnecesariohacerlaoperacindeconversindetipos.Silacoleccin
nocontienelosobjetosesperados,alintentarhacerlaconversin,saltarunaincmodaexcepcin.
Usargenricosaportagrandesventajas,perousndolosadecuadamente.
Para recorrer los mapas con iteradores, hay que hacer un pequeo truco. Usamos el mtodo
entrySet queofrecenlosmapasparagenerarunconjuntoconlasentradas(paresdellavevalor),o
bien,elmtodo keySet paragenerarunconjuntoconlasllavesexistentesenelmapa.Veamoscomo
seraparaelsegundocaso,elmssencillo:
HashMap<Integer,Integer> mapa=new HashMap<Integer,Integer>test();
for (int i=0;i<10;i++) mapa.put(i, i); // Insertamos datos de prueba en el mapa.
for (Integer llave:mapa.keySet()) // Recorremos el conjunto generado por keySet, contendr las
llaves.
{
Integer valor=mapa.get(llave); //Para cada llave, accedemos a su valor si es necesario.
}

Lo nico que tienes que tener en cuenta es que el conjunto generado por keySet no tendr
obviamente el mtodo add para aadir elementos al mismo, dado que eso tendrs que hacerlo a
travsdelmapa.

Siusasiteradores,ypiensaseliminarelementosdelacoleccin(einclusodeunmapa),debesusar
el mtodo remove del iterador y no el de la coleccin. Si eliminas los elementos utilizando el
mtodo remove de la coleccin, mientras ests dentro de un bucle de iteracin, o dentro de un
bucle foreach, los fallos que pueden producirse en tu programa son impredecibles. Logras
adivinarporqusepuedenproducirdichosproblemas?
Losproblemassondebidosaqueelmtodoremovedeliteradoreliminaelelementodedossitios:
de la coleccin y del iterador en s (que mantiene interiormente informacin del orden de los
elementos).Siusaselmtodoremovedelacoleccin,lainformacinsoloseeliminadeunlugar,
delacoleccin.

Cundo debemos invocar el mtodo remove() de los iteradores?

46

Encualquiermomento
Despusdeinvocarelmtodonext()
DespusdeinvocarelmtodohasNext()
No es conveniente usar este mtodo para eliminar elementos, es mejor usar el de la
coleccin

DesarrollodeAplicacionesWeb

Tema8

11.Algoritmos.(I)
Caso prctico.
Ada se acerc a preguntar a Ana. Ada era la jefa y Ana le tena mucho respeto. Ada le pregunt
cmo llevaba la tarea que le haba encomendado Mara. Era una tarea importante, as que prest
mucha atencin.
Ana le ense el cdigo que estaba elaborando, le dijo que en un principio haba pensado crear una
clase llamada Pedido, para almacenar los datos del pedido, pero que Juan le recomend usar mapas
para almacenar los pares de valor y dato. As que se decant por usar mapas para ese caso. Le
coment tambin que para almacenar los artculos si haba creado una pequea clase llamada
Articulo. Ada le dio el visto bueno:
-Pues Juan te ha recomendado de forma adecuada, no vas a necesitar hacer ningn procesamiento
especial de los datos del pedido, solo convertirlos de un formato especfico a XML. Eso s, sera
recomendable que los artculos del pedido vayan ordenados por cdigo de artculo -dijo Ada.
-Ordenar los artculos? Vaya, que jaleo -respondi Ana.
-Arriba ese nimo mujer, si has usado listas es muy fcil, djame ver tu cdigo y te explicar cmo
hacerlo.
-Si, aqu est, es el siguiente, espero que te guste:
import
import
import
import
import
import
import
import
import
import
import
import
import

java.io.BufferedReader;
java.io.FileNotFoundException;
java.io.FileReader;
java.io.IOException;
java.util.ArrayList;
java.util.HashMap;
java.util.List;
java.util.Map;
java.util.Scanner;
java.util.logging.Level;
java.util.logging.Logger;
java.util.regex.Matcher;
java.util.regex.Pattern;

/*
* Clase destinada a almacenar los datos de un artculo.
*/
class Articulo {
public String codArticulo;
public String descripcion;
public int cantidad;
}

/* Clase que se encarga de procesar un pedido.


* El archivo con el pedido debe estar en codificacin UTF8, sino no funciona
* bien.
* Tu sistema debe soportar de forma nativa la coficacin UTF8, sino no
* funcionar del todo bien.
*/
public class ProcesarArchivo2 {
/* Entrada contendr una instancia de la clase Scanner que permitir
leer las teclas pulsadas desde teclado */
static Scanner entrada = new Scanner(System.in);
/* Definimos las expresiones regulares que usaremos una y otra vez para
cada lnea del pedido. La expresin regular "seccion" permite detectar
si hay un comienzo o fin de pedido, y la expresin campo, permite detectar
si hay un campo con informacin del pedido. */
static Pattern seccion = Pattern.compile("^##[ ]*(FIN)?[ ]*(PEDIDO|ARTICULOS)[ ]*##$");
static Pattern campo = Pattern.compile("^(.+):.*\\{(.*)\\}$");
static Pattern articulo = Pattern.compile ("^\\{(.*)\\|(.*)\\|[ ]*([0-9]*)[ ]*\\}$");
public static void main(String[] args) {
BufferedReader lector;
ArrayList<Articulo> Articulos=new ArrayList<Articulo>();
HashMap<String,String> DatosPedido=new HashMap<String,String>();
/*
* 1er paso: cargamos el archivo para poder procesarlo lnea a lnea
* para ello nos apoyamos en la clase BufferedReader, que con el mtodo
* readLine nos permite recorrer todo el archivo lnea a lnea.
*/

47

Aplicacindelasestructurasdealmacenamiento

DAW

if (args.length > 0) {
lector = cargarArchivo(args[0]);
} else {
lector = cargarArchivo();
}

if (lector == null) {
/* Si no se ha podido cargar el archivo, no contina con el
* procesado, simplemente termina la ejecucin. */
System.out.println("No se ha podido cargar el archivo.");
} else {
/* Si ha podido cargar el archivo, contina el procesado de lnea
* a lnea. */
String linea;
try {
linea = lector.readLine();
while (linea != null) {
procesarLinea(linea,DatosPedido,Articulos);
linea = lector.readLine();
}
} catch (IOException ex) {
System.out.println("Error de entrada y salida.");
}
// Mostramos los datos del pedido para ver si son correctos.
for (String etiqueta:DatosPedido.keySet())
{
System.out.println("Dato pedido-->"+etiqueta+":"+DatosPedido.get(etiqueta));
}
// Mostramos los datos de los articulos para ver si son correctos.
for (Articulo ar:Articulos)
{
System.out.print("articulo codigo='"+ar.codArticulo+"' ");
System.out.print("descripcion='"+ar.descripcion+"' ");
System.out.println("cantidad='"+ar.cantidad+"'");
}
}
}
/**
* Procesa una lnea del archivo de pedido para detectar que es y
* extraer la informacin que contiene.
* @param linea
* @param datosPedido Mapa en el que ir metiendo la informacin del pedido.
* La llave del mapa ser el nombre del campo.
* @param articulos Lista en la que se irn metiendo los artculos del pedido.
* @return true si la lnea contiene informacin que corresponde al formato
* esperado, false en caso contrario.
*/
static boolean procesarLinea(String linea, Map<String,String> datosPedido,
List<Articulo> articulos) {
Matcher deteccionSeccion = seccion.matcher(linea);
Matcher deteccionCampo = campo.matcher(linea);
Matcher deteccionArticulo= articulo.matcher(linea);
/* Si el patrn coincide con el de un indicador de comienzo del pedido
* o de la seccin con el listado de artculos, se ejecutar este trozo
* de cdigo, pues habr encontrado el patrn. No hace nada,
* simplemente lo detecta para as no informar de algo raro.
*/
if (deteccionSeccion.matches()) {
return true;
}
/* Si el patrn coincide con el de un campo con datos del pedido
entonces meter tanto el campo como el valor en el mapa.*/
else if (deteccionCampo.matches()) {
datosPedido.put(deteccionCampo.group(1).trim().toLowerCase(),
deteccionCampo.group(2).trim());
return true;
}
/* Si el patrn coincide con el de un artculo, entonces
guardar los datos del pedido en una clase articulo y lo meter
en la lista de artculos.*/
else if (deteccionArticulo.matches())
{

48

DesarrollodeAplicacionesWeb

Tema8

Articulo n=new Articulo();


n.codArticulo=deteccionArticulo.group(1).trim();
n.descripcion=deteccionArticulo.group(2).trim();
n.cantidad=Integer.parseInt(deteccionArticulo.group(3));
articulos.add(n);
return true;
}
else { System.out.println("Cuidado! Lnea no procesable: "+linea); return false; }
}
/**
* cargarArchivo crear una instancia de la clase BufferedReader que
* permitir leer lnea a lnea el archivo de texto. Si no se ha podido
* cargar el archivo retornar null.
* @param name Nombre del archivo a cargar. si el nombre del archivo no
* se ha pasado por parmetro (valor null) se pedir al usuario que lo
* introduzca.
* @return null si no ha podido cargar el archivo, o la instancia de la
* clase BufferedReader si dicho archivo se ha podido cargar.
*/
static BufferedReader cargarArchivo(String name) {
String nombreArchivo = name;
BufferedReader reader = null;
if (name == null) {
System.out.print("Introduce el nombre del archivo:");
nombreArchivo = entrada.nextLine();
}
try {
FileReader f =new FileReader(nombreArchivo);
reader = new BufferedReader(f);
} catch (FileNotFoundException ex) {
Logger.getLogger(ProcesarArchivo2.class.getName()).log(Level.SEVERE, null, ex);
}
return reader;
}
/**
* Igual que el mtodo BufferedReader cargarArchivo(String name), pero
* que siempre le pedir al usuario que lo introduzca.
* @return null si no ha podido cargar el archivo, y una instancia de BufferedReader
* en otro caso.
*/
static BufferedReader cargarArchivo() {
return cargarArchivo(null);
}
}

Lapalabraalgoritmoseguroquetesuena,pero,aquserefiereenelcontextodelascoleccionesy
deotrasestructurasdedatos?Lascolecciones,losarrayseinclusolascadenas,tienenunconjunto
deoperacionestpicasasociadasquesonhabituales.Algunasdeestasoperacionesyalashemosvisto
antes,perootrasno.Veamosparaqunospuedenservirestasoperaciones:
9 Ordenarlistasyarrays.
9 Desordenarlistasyarrays.
9 Bsquedabinariaenlistasyarrays.
9 Conversindearraysalistasydelistasaarray.
9 Partircadenasyalmacenarelresultadoenunarray.
Estos algoritmos estn en su mayora recogidos como mtodos estticos de las clases
java.util.Collections y java.util.Arrays ,salvolosreferentesacadenasobviamente.
Losalgoritmosdeordenacinordenanloselementosenordennatural,siemprequeJavasepacomo
ordenarlos.
Como se explico en el apartado de conjuntos, cuando se desea que la ordenacin siga un orden
diferente, o simplemente los elementos no son ordenables de forma natural, hay que facilitar un
mecanismoparaquesepuedaproducirlaordenacin.Lostiposordenablesdeformanaturalson
losenteros,lascadenas(ordenalfabtico)ylasfechas,ypordefectosuordenesascendente.
La clase Collections y la clase Arrays facilitan el mtodo sort , que permiten ordenar
respectivamente listas y arrays. Los siguientes ejemplos ordenaran los nmeros de forma
ascendente(demenoramayor):

49

Aplicacindelasestructurasdealmacenamiento

DAW

Ejemplo de ordenacin de un array de Ejemplodeordenacindeunalistaconnmeros.


nmeros
Integer[] array={10,9,99,3,5};
Arrays.sort(array);

ArrayList<Integer> lista=new ArrayList<Integer>();


lista.add(10); lista.add(9);lista.add(99);
lista.add(3); lista.add(5);
Collections.sort(lista);

11.1.Algoritmos.(II)
EnJavahaydosmecanismosparacambiarlaformaenlaqueloselementosseordenan.Recuerdas
la tarea que Ada pidi a Ana? Que los artculos del pedido aparecieran ordenados por cdigo de
artculo. Imagina que tienes los artculos almacenados en una lista llamada articulos, y que cada
artculo se almacena en la siguiente clase (fijate que el cdigo de artculo es una cadena y no un
nmero):
class Articulo {
public String codArticulo; // Cdigo de artculo
public String descripcion; // Descripcin del artculo.
public int cantidad; // Cantidad a proveer del artculo.
}

La primera forma de ordenar consiste en crear una clase que implemente la interfaz
java.util.Comparator ,yporende,elmtodocomparedefinidoendichainterfaz.Estoseexplicen
elapartadodeconjuntos,alexplicarel TreeSet ,asquenovamosaprofundizarenello.Noobstante,
elcomparadorparaesecasopodraseras:
class comparadorArticulos implements Comparator<Articulo>{
@Override
public int compare( Articulo o1, Articulo o2) {
return o1.codArticulo.compareTo(o2.codArticulo);
}
}

Una vez creada esta clase, ordenar los elementos es muy sencillo, simplemente se pasa como
segundoparmetrodelmtodosortunainstanciadelcomparadorcreado:
Collections.sort(articulos, new comparadorArticulos());

La segunda forma es quizs ms sencilla cuando se trata de objetos cuya ordenacin no existe de
forma natural, pero requiere modificar la clase Articulo. Consiste en hacer que los objetos que se
meten en la lista o array implementen la interfaz java.util.Comparable . Todos los objetos que
implementan la interfaz Comparable son ordenables y se puede invocar el mtodo sort sin
indicaruncomparadorparaordenarlos.Lainterfaz comparable solorequiereimplementarelmtodo
compareTo :
class Articulo implements Comparable<Articulo>{
public String codArticulo;
public String descripcion;
public int cantidad;
@Override
public int compareTo(Articulo o) {
return codArticulo.compareTo(o.codArticulo);
}
}

Del ejemplo anterior se pueden denotar dos cosas importantes: que la interfaz Comparable es
genricayqueparaquefuncionesinproblemasesconvenienteindicareltipobasesobreelquese
permitelacomparacin(enestecaso,elobjetoArticulodebecompararseconsigomismo),yqueel
mtodo compareTo soloadmiteunparmetro,dadoquecompararelobjetoconelquesepasapor
parmetro.
El funcionamiento del mtodo compareTo es el mismo que el mtodo compare de la interfaz
Comparator :silaclasequesepasaporparmetroesigualalobjeto,setendraqueretornar0;sies
menoroanterior,sedeberaretornarunnmeromenorquecero;siesmayoroposterior,sedebera
retornarunnmeromayorque0.
Ordenarahoralalistadeartculosessencillo,fjatequefcil: Collections.sort(articulos);

50

DesarrollodeAplicacionesWeb

Tema8

Si tienes que ordenar los elementos de una lista de tres formas diferentes, cul de los
mtodos anteriores es ms conveniente?

Usarcomparadores,atravsdelainterfazjava.util.Comparator
Implementarlainterfazcomparableenelobjetoalmacenadoenlalista

11.2.Algoritmos.(III)
Qu ms ofrece las clases java.util.Collections y java.util.Arrays de Java? Una vez vista la
ordenacin,quizslomscomplicado,veamosalgunasoperacionesadicionales.Enlosejemplos,la
variablearrayesunarrayylavariablelistaesunalistadecualquiertipodeelemento:
Operacin
Descripcin
Ejemplos
Desordena una lista, este
Desordenaruna
mtodonoestdisponiblepara Collections.shuffle (lista);
lista.
arrays.
Rellena una lista o array
copiando el mismo valor en
Rellenarunalistao
Collections.fill (lista,elemento);
todosloselementosdelarrayo Arrays.fill (array,elemento);
array.
lista.tilparareiniciarunalista
oarray.
Permite realizar bsquedas
rpidas en un una lista o array
ordenados. Es necesario que la Collections.binarySearch(lista,elemento);
Busquedabinaria.
listaoarrayestnordenados,si Arrays.binarySearch(array, elemento);
no lo estn, la bsqueda no
tendrxito.
Permite rpidamente convertir
un array a una lista de List lista=Arrays.asList(array);
elementos, extremadamente Sieltipodedatoalmacenadoenelarrayes
til. No se especifica el tipo de conocido (Integer por ejemplo), es
Convertirunarray
lista retornado (no es ArrayList convenienteespecificareltipodeobjetode
alista.
ni LinkedList), solo se especifica lalista:
=
que retorna una lista que List<Integer>lista
Arrays.asList(array);
implementa
la
interfaz
java.util.List.
Permite convertir una lista a Para este ejemplo, supondremos que los
array. Esto se puede realizar en elementos de la lista son nmeros, dado
todaslascolecciones,ynoesun que hay que crear un array del tipo
Convertirunalista
mtodo de la clase Collections, almacenado en la lista, y del tamao de la
aarray.
sino propio de la interfaz lista:
array=new
Collection. Es conveniente que Integer[]
Integer[lista.size()];
sepasdesuexistencia.
lista.toArray(array);
Da la vuelta a una lista,
Darlavuelta.
ponindola en orden inverso al Collections.reverse(lista);
quetiene.

Otraoperacinquenosehavistohastaahoraesladividirunacadenaenpartes.Cuandounacadena
estformadainternamenteportrozosdetextoclaramentedelimitadosporunseparador(unacoma,
unpuntoycomaocualquierotro),esposibledividirlacadenayobtenercadaunodelostrozosde
textoporseparadoenunarraydecadenas.Esunaoperacinsencilla,perodadoqueesnecesario
conocerelfuncionamientodelosarraysydelasexpresionesregularesparasuuso,nosehapodido

51

Aplicacindelasestructurasdealmacenamiento

DAW

verhastaahora.Parapoderrealizarestaoperacin,usaremoselmtodo split delaclase String .El


delimitadoroseparadoresunaexpresinregular,nicoargumentodelmtodo split ,ypuedeser
obviamentetodolocomplejoqueseanecesario:
String texto="Z,B,A,X,M,O,P,U";
String []partes=texto.split(",");
Arrays.sort(partes);

Enelejemploanteriorlacadenatextocontieneunaseriedeletrasseparadasporcomas.Lacadena
se ha dividido con el mtodo split , y se ha guardado cada carcter por separado en un array.
Despus se ha ordenado el array. Increble lo que se puede llegar a hacer con solo tres lneas de
cdigo!

En el siguiente vdeo podrs ver en qu consiste la bsqueda binaria y como se aplica de


formasencilla:
http://www.youtube.com/watch?v=_B2mEOA7hSo
Vdeoenelqueseexplicaquelabsquedabinariaesunatcnicaquepermitebuscarrpidamente
nmerosen unarrayordenado(aunquetambinesaplicablealistasordenadas).Enelprocesode
bsquedabinariaconsisteendividirenhallarelpuntomediodelarray.Sielvalorbuscadocoincide
conelpuntomedio,entoncessehaencontrado.Sielvalorbuscadoesmenoralvalorquehayenla
mitaddelarray,entonceselvalorbuscadoestarenlaprimeramitaddelarray,seprocedeabuscar
elvalorendichamitad.Sielvalorbuscadoesmayoralvalorquehayenlamitaddelarray,entonces
el valor buscado estar en en la segunda mitad del array, y se procede a buscar el valor en dicha
mitad.
Para encontrar el valor en cada una de las mitades, se procede de igual forma, se busca el punto
centralysevuelveadividirendos.Elprocesocontinahastaquenosepuedavolverarealizaruna
nuevadivisin.

52

DesarrollodeAplicacionesWeb

Tema8

12.TratamientodedocumentosestructuradosXML.
Caso prctico.
Ana ya ha terminado lo principal, ya es capaz de procesar el pedido y de almacenar la informacin en
estructuras de memoria que luego podr proyectar a un documento XML, incluso ha ordenado los
artculos en base al cdigo de artculo, definitivamente era bastante ms fcil de lo que ella pensaba.
Ahora le toca la tarea ms ardua de todas, o al menos as lo ve ella, generar el documento XML con
la informacin del pedido, le resultar muy difcil?

Qu es XML? XML es un mecanismo extraordinariamente sencillo para estructurar, almacenar e


intercambiarinformacinentresistemasinformticos.
XMLdefineunlenguajedeetiquetas,muyfcildeentenderperoconunasreglasmuyestrictas,que
permite encapsular informacin de cualquier tipo para posteriormente ser manipulada. Se ha
extendidotantoquehoydaesunestndarenelintercambiodeinformacinentresistemas.
LainformacinenXMLvaescritaentextolegibleporelserhumano,peronoestpensadaparaque
sealedaporunserhumano,sinoporunamquina.Lainformacinvacodificadageneralmenteen
unicode, pero estructurada de forma que una mquina es capaz de procesarla eficazmente. Esto
tiene una clara ventaja: si necesitamos modificar algn dato de un documento en XML, podemos
hacerloconuneditordetextoplano.VeamosloselementosbsicosdelXML:
Elemento
Descripcin
Ejemplo
Es lo primero que encontramos en el documento
Cabecerao XML y define cosas como, por ejemplo, la
<?xml
version="1.0"
declaracin codificacin del documento XML (que suele ser encoding="ISO-8859-1"?>
delXML.
ISO88591oUTF8)ylaversindelestndarXML
quesiguenuestrodocumentoXML.
Una etiqueta es un delimitador de datos, y a su
vez, un elemento organizativo. La informacin va
entre las etiquetas de apertura (<pedido>) y <pedido>
informacin del pedido
Etiquetas.
cierre (</pedido>). Fjate en el nombre de la
</pedido>
etiqueta (pedido), debe ser el mismo tanto en
el cierre como en la apertura, respetando
maysculas.
Una etiqueta puede tener asociado uno o ms
atributos.Siempredebenirdetrsdelnombrede
cantidad="20">
la etiqueta, en la etiqueta de apertura, poniendo <articulo
informacin
Atributos.
elnombredelatributoseguidodeigualyelvalor </articulo>
encerradoentrecomillas.Siempredebesdejaral
menosunespacioentrelosatributos.
Entreelcierreylaaperturadeunaetiquetapuede <cliente>
Muebles Bonitos S.A.
Texto.
habertexto.
</cliente>
Cuandounaetiquetanotienecontenido,notiene
Etiquetassin porqu haber una etiqueta de cierre, pero no <fecha entrega="1/1/2012" />
contenido.
debesolvidarponerlabarradecierre(/)alfinal
delaetiquetaparaindicarquenotienecontenido.
Es posible introducir comentarios en XML y estos
Comentario. van dirigidos generalmente a un ser humano que <!-- comentario -->
leedirectamenteeldocumentoXML.

El nombre de la etiqueta y de los nombres de los atributos no deben tener espacios. Tambin es
convenienteevitarlospuntos,comasydemscaracteresdepuntuacin.Ensulugarsepuedeusarel
guinbajo( <pedido_enviado> </pedido_enviado> ).

Seala las lneas que no seran elementos XML vlidos.

53

Aplicacindelasestructurasdealmacenamiento

DAW

<cliente>InformticaElegante<cliente/>

<!>

<pedidofechaentrega=25/>

<direccion_entrega>sinespecificar</direccion_entrega>

12.1.QuesundocumentoXML?
Los documentos XML son documentos que solo utilizan los elementos expuestos en el apartado
anterior(declaracin,etiquetas,comentarios,etc.)deformaestructurada.Siguenunaestructurade
rbol,pseudojerrquica,permitiendoagruparlainformacinendiferentesniveles,quevandesdela
razalashojas.
Para comprender la estructura de un documento XML vamos a utilizar una terminologa afn a la
formaenlacualprocesaremoslosdocumentosXML.UndocumentoXMLestcompuestodesdeel
puntodevistadeprogramacinpornodos,pornodosquepueden(ono)contenerotrosnodos.Todo
esunnodo:
9 El par formado por la etiqueta de apertura ( <etiqueta> ) y por la de cierre ( </etiqueta> ),
junto con todo su contenido (elementos, atributos y texto de su interior) es un nodo llamado
elemento( Element desdeelpuntodevistadeprogramacin).Unelementopuedecontenerotros
elementos,esdecir,puedecontenerensuinteriorsubetiquetas,deformaanidada.
9 Un atributo es un nodo especial llamado atributo ( Attr desde el punto de vista de
programacin), que solo puede estar dentro de un elemento (concretamente dentro de la
etiquetadeapertura).
9 Eltextoesunnodoespecialllamadotexto( Text ),quesolopuedeestardentrodeunaetiqueta.
9 Uncomentarioesunnodoespecialllamadocomentario( Comment ),quepuedeestarencualquier
lugardeldocumentoXML.
9 Yporltimo,undocumentoesunnodoquecontieneunajerarquadenodosensuinterior.Est
formado opcionalmente por una declaracin, opcionalmente por uno o varios comentarios y
obligatoriamenteporunnicoelemento.
Estoesunpocolioso,verdad?Vamosaclarificarloconejemplos.Primero,tenemosqueentenderla
diferencia entre nodos padre y nodos hijo. Un elemento (par de etiquetas) puede contener varios
nodoshijo,quepuedensertextouotroselementos.Porejemplo:
<padre att1="valor" att2="valor">
texto 1
<ethija> texto 2 </ethija>
</padre>

Enelejemploanterior,elelementopadretendradoshijos:eltextotexto1,seraelprimerhijo,y
elelementoetiquetadocomoethija,elsegundo.Tendratambindosatributos,queseranodos
hijo tambin pero que se consideran especiales y la forma de acceso es diferente. A su vez, el
elementoethijatieneunnodohijo,quesereltextotexto2.Fcilno?
Ahora veamos el conjunto, un documento estar formado, como se dijo antes, por algunos
elementos opcionales, y obligatoriamente por un nico elemento (es decir, por nico par de
etiquetas que lo engloba todo) que contendr internamente el resto de informacin como nodos
hijo.Porejemplo:
<?xml version="1.0" encoding="ISO-8859-1"?>
<pedido>
<cliente> texto </cliente>
<codCliente> texto </codCliente>
...
</pedido>

Laetiquetapedidodelejemploanterior,serportantoelelementorazdeldocumentoydentrode
lestartodalainformacindeldocumentoXML.Ahoraseguroqueesmsfcil,no?

54

DesarrollodeAplicacionesWeb

Tema8

EnelsiguienteenlacepodrsencontrarunabreveguadelastecnologasasociadasaXML
actuales.Sonbastantesysupotencialesincreble.
http://www.w3c.es/divulgacion/guiasbreves/tecnologiasxml

XMLEssentials

Schema

Security

Transformation

Query

Components
Processing
Internationalization

Publishing

TecnologasXML
XML est compuesto por un conjunto de tecnologas esenciales como el
conjuntodeinformacinyespaciosde nombre.Abordanproblemascuando
seutilizanXMLencontextosdeaplicacionesespecficas.
Lasdescripcionesformalesdelosvocabularioscreanflexibilidadenentornos
decreacinylascadenasdecontroldecalidad.XMLSchemadelW3C,SML,y
las tecnologas de enlace de datos proporcionan las herramientas para el
controldecalidaddelosdatosXML.
La manipulacin de datos con XML requiere a veces de integridad,
autenticacinyprivacidad.FirmaXML,cifradoyXKMSpuedeayudaracrear
unentornoseguroparaXML.
Muy frecuentemente uno quiere transformar el contenido XML en otro
formato (incluyendo otros formatos XML). XSLT y XPath son herramientas
poderosasparalacreacindediferentesrepresentacionesdecontenidoXML.
XQuery(soportadoporXPath)esunlenguajedeconsultaparaextraerdatos
delXML,similaralasreglasdeSQLparalasbasesdedatos,oSPARQLparala
semnticaWeb.
The XML ecosystem is using additional tools to create a richer environment
forusingandmanipulatingXMLdocuments.Thesecomponentsincludestyle
sheets,xlinkxml:id,xinclude,xpointer,xforms,xmlfragments,andevents.
Unmodelodeprocesamientodefinequoperacionesdebenllevarseacabo
enquordendeundocumentoXML.
W3C ha trabajado con la comunidad en la internacionalizacin de XML, por
ejemplo,paraespecificarelidiomadelcontenidoXML.
XML surgi de la comunidad de publicacin tcnica. El uso de XSLFO para
publicarinclusograndesocomplejosdocumentosXMLaHTMLmultilinges,
losformatosPDFodeotrotipo;incluyendiagramasyfrmulasMathMLSVG
enlasalida.

12.2.LibrerasparaprocesardocumentosXML.(I)
QuinestablecelasbasesdelXML?PueselW3CoWoldWideWebConsortiumeslaentidadque
establece las bases del XML. Dicha entidad, adems de describir como es el XML internamente,
define un montn de tecnologas estndar adicionales para verificar, convertir y manipular
documentosXML.NosotrosnovamosaexplorartodaslastecnologasdeXMLaqu(sonmuchsimas),
solamentevamosausardosdeellas,aquellasquenosvanapermitirmanejardeformasimpleun
documentoXML:
9 Procesadores de XML. Son libreras para leer documentos XML y comprobar que estn bien
formados.EnJava,elprocesadormsutilizadoesSAX,lousaremosperosinpercatarnoscaside
ello.
9 XMLDOM.PermitetransformarundocumentoXMLenunmodelodeobjetos(dehecho DOM
significaDocumentObjectModel),accesiblecmodamentedesdeellenguajedeprogramacin.
DOM almacena cada elemento, atributo, texto, comentario, etc. del documento XML en una
estructura tipo rbol compuesta por nodos fcilmente accesibles, sin perder la jerarqua del
documento.Apartirdeahora,laestructuraDOMquealmacenaunXMLlallamaremosrbolo
jerarquadeobjetosDOM.
En Java, estas y otras funciones estn implementadas en la librera JAXP (Java API for XML
Processing),yyavanincorporadasenlaedicinestndardeJava(JavaSE).Enprimerlugarvamosa

55

Aplicacindelasestructurasdealmacenamiento

DAW

ver como convertir un documento XML a un rbol DOM, y viceversa, para despus ver cmo
manipulardesdeJavaunrbolDOM.
Para cargar un documento XML tenemos que hacer uso de un procesador de documentos XML
(conocidosgeneralmentecomoparsers)ydeunconstructordedocumentosDOM.LasclasesdeJava
quetendremosqueutilizarson:
9 javax.xml.parsers.DocumentBuilder : ser el procesador y transformar un documento XML a
DOM,seleconocecomoconstructordedocumentos.
9 javax.xml.parsers.DocumentBuilderFactory :permitecrearunconstructordedocumentos,esuna
fbricadeconstructoresdedocumentos.
9 org.w3c.dom.Document : una instancia de esta clase es un documento XML pero almacenado en
memoria siguiendo el modelo DOM. Cuando el parser procesa un documento XML crear una
instanciadeestaclaseconelcontenidodeldocumentoXML.
Ahorabien,estocmoseusa?Puesmuyfcil,enpocaslneas(noolvidesimportarlaslibreras):
try {
// 1 Creamos una nueva instancia de una fabrica de constructores de documentos.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2 A partir de la instancia anterior, fabricamos un constructor de documentos, que
procesar el XML.
DocumentBuilder db = dbf.newDocumentBuilder();
// 3 Procesamos el documento (almacenado en un archivo) y lo convertimos en un rbol DOM.
Document doc=db.parse(CaminoAArchivoXml);
} catch (Exception ex) {
System.out.println("Error! No se ha podido cargar el documento XML.");
}

Esunpocoenrevesadoperonotienemuchacomplicacin,esunpelnmscomplicadoparahacerel
caminoinverso(pasarelDOMaXML).Esteprocesopuedegenerarhastatrestiposdeexcepciones
diferentes. La ms comn, que el documento XML est mal formado, por lo que tienes que tener
cuidadoconlasintaxisXML.

Cul es la funcin de la clase org.w3c.dom.Document?

ProcesareldocumentoXML
AlmacenareldocumentoXMLenunmodelodeobjetosaccesibledesdeJava
Fabricarunnuevoconstructordedocumentos

12.2.1.LibrerasparaprocesardocumentosXML.(II)
YcmopasolajerarquaorboldeobjetosDOMaXML?EnJavaestoesunpelnmscomplicado
quelaoperacininversa,yrequiereelusodeunmontndeclasesdelpaquetejava.xml.transform,
pueslaideaestransformarelrbolDOMenunarchivodetextoquecontieneeldocumentoXML.
Lasclasesquetendremosqueusarson:
9 javax.xml.transform.TransformerFactory . Fbrica de transformadores, permite crear un nuevo
transformadorqueconvertirelrbolDOMaXML.
9 javax.xml.transform.Transformer .TransformadorquepermitepasarunrbolDOMaXML.
9 javax.xml.transform.TransformerException .Excepcinlanzadacuandoseproduceunfalloenla
transformacin.
9 javax.xml.transform.OutputKeys . Clase que contiene opciones de salida para el transformador.
Se suele usar para indicar la codificacin de salida (generalmente UTF8) del documento XML
generado.
9 javax.xml.transform.dom.DOMSource .ClasequeactuardeintermediariaentreelrbolDOMyel
transformador,permitiendoaltransformadoraccederalainformacindelrbolDOM.
9 javax.xml.transform.stream.StreamResult . Clase que actuar de intermediaria entre el
transformadoryelarchivooStringdondesealmacenareldocumentoXMLgenerado.

56

DesarrollodeAplicacionesWeb

Tema8

java.io.File . Clase que, como posiblemente sabrs, permite leer y escribir en un archivo
almacenadoendisco.ElarchivoserobviamenteeldocumentoXMLquevamosaescribirenel
disco.
Estoesunpocolioso,ono?Noloestantocuandoseveunejemplodecmorealizarelprocesode
transformacinderbolDOMaXML,veamoselejemplo:

try {
// 1 Creamos una instancia de la clase File para acceder al archivo donde guardaremos el XML.
File f=new File(CaminoAlArchivoXML);
//2 Creamos una nueva instancia del transformador a travs de la fbrica de transformadores.
Transformer transformer = TransformerFactory.newInstance().newTransformer();
//3 Establecemos algunas opciones de salida, como por ejemplo, la codificacin de salida.
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//4 Creamos el StreamResult, intermediaria entre el transformador y el archivo de destino.
StreamResult result = new StreamResult(f);
//5 Creamos el DOMSource, intermediaria entre el transformador y el rbol DOM.
DOMSource source = new DOMSource(doc);
//6 Realizamos la transformacin.
transformer.transform(source, result);
} catch (TransformerException ex) {
System.out.println("Error! No se ha podido llevar a cabo la transformacin.");
}

Acontinuacinteadjuntamos,cortesadelacasa, unadeesas clasesantiestrs...utilizalatodolo


quequieras,conellapodrsconvertirundocumentoXMLarbolDOMyviceversadeformasencilla.
El documento XML puede estar almacenado en un archivo o en una cadena de texto (e incluso en
Internet,paraloquenecesitaselURI).LosmtodosestticosDOM2XMLtepermitirnpasarelrbol
DOMaXML,ylosmtodosString2DOMyXML2DOMtepermitirnpasarundocumentoXMLaun
rbolDOM.
Tambin contiene el mtodo crearDOMVacio que permite crear un rbol DOM vaco, til para
empezarundocumentoXMLdecero.
package javaapplication1;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

java.io.ByteArrayInputStream;
java.io.File;
java.io.StringWriter;
java.util.logging.Level;
java.util.logging.Logger;
javax.xml.parsers.DocumentBuilder;
javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.ParserConfigurationException;
javax.xml.transform.OutputKeys;
javax.xml.transform.Transformer;
javax.xml.transform.TransformerException;
javax.xml.transform.TransformerFactory;
javax.xml.transform.dom.DOMSource;
javax.xml.transform.stream.StreamResult;
org.w3c.dom.Document;

/**
* Utilidades para pasar rboles DOM a documentos XML y viceversa.
* @author Salvador Romero Villegas
*/
public class DOMUtil {
/**
* Carga un archivo con un documento XML a un rbol DOM.
* @param CaminoAArchivoXml puede ser un archivo local de tu disco duro
* o una URI de Internet (http://...).
* @return el documento DOM o null si no se ha podido cargar el documento.
*/
public static Document XML2DOM (String CaminoAArchivoXml)
{
Document doc=null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc=db.parse(CaminoAArchivoXml);
} catch (Exception ex) {

57

Aplicacindelasestructurasdealmacenamiento
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return doc;
}
/**
* Convierte una cadena que contiene un documento XML a un rbol DOM.
* @param documentoXML cadena que contiene el documento XML.
* @return El rbol DOM o null si no se ha podido convertir.
*/
public static Document String2DOM (String documentoXML)
{
ByteArrayInputStream bais=new ByteArrayInputStream(documentoXML.getBytes());
Document doc=null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc=db.parse(bais);
} catch (Exception ex) {
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return doc;
}
/**
* Convierte un rbol DOM a una cadena que contiene un documento XML.
* @param doc rbol DOM.
* @return null si no se ha podido convertir o la cadena con el documento
* en XML si se ha podido convertir.
*/
public static String DOM2XML (Document doc)
{
String xmlString=null;
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
xmlString = result.getWriter().toString();
} catch (TransformerException ex) {
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
xmlString=null;
}
return xmlString;
}
/**
* Convierte un rbol DOM a XML y lo guarda en un archivo.
* @param doc Documento a convertir en XML.
* @param CaminoAlArchivoXML Camino o path para llegar al archivo en el
* disco.
* @return true si se ha podido convertir y false en cualquier otra situacin.
*/
public static boolean DOM2XML (Document doc, String CaminoAlArchivoXML)
{
try {
File f=new File(CaminoAlArchivoXML);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(f);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
return true;
} catch (TransformerException ex) {
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return false;
}
/**
* Crea un rbol DOM vaco.
* @param etiquetaRaiz Nombre de la etiqueta raz del rbol DOM, donce
* estar contenida el resto del documento.

58

DAW

DesarrollodeAplicacionesWeb

Tema8

* @return Retornar el documento creado o null si se ha producido algn


* error.
*/
public static Document crearDOMVacio(String etiquetaRaiz)
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
try {
db = dbf.newDocumentBuilder();
Document d=db.newDocument();
d.appendChild(d.createElement(etiquetaRaiz));
return d;
} catch (ParserConfigurationException ex) {
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}

12.3.ManipulacindedocumentosXML.(I)
Bien,ahorasabescargarundocumentoXMLaDOMydeDOMaXML,pero,cmosemodificael
rbolDOM?Cmoyasedijoantes,unrbolDOMesunaestructuraenrbol,jerrquicacomocabe
esperar,formadapornodosdediferentestipos.ElfuncionamientodelmodelodeobjetosDOMes
establecido por el organismo W3C, lo cual tiene una gran ventaja, el modelo es prcticamente el
mismoentodosloslenguajesdeprogramacin.
EnJava,prcticamentetodaslasclasesquevasanecesitarparamanipularunrbolDOMestnenel
paquete org.w3c.dom. Si vas a hacer un uso muy intenso de DOM es conveniente que hagas una
importacindetodaslasclasesdeestepaquete(importorg.w3c.dom.*;).
Tras convertir un documento XML a DOM lo que obtenemos es una instancia de la clase
org.w3c.dom.Document. Esta instancia ser el nodo principal que contendr en su interior toda la
jerarqua del documento XML. Dentro de un documento o rbol DOM podremos encontrar los
siguientestiposdeclases:
9 org.w3c.dom.Node (Nodo) . Todos los objetos contenidos en el rbol DOM son nodos. La clase
Document estambinuntipodenodo,consideradoelnodoprincipal.
9 org.w3c.dom.Element
(Elemento) .
Corresponde con cualquier par de etiquetas
( <pedido></pedido> )ytodosucontenido(atributos,texto,subetiquetas,etc.).
9 org.w3c.dom.Attr (Atributo) .Correspondeconcualquieratributo.
9 org.w3c.dom.Comment (Comentario) .Correspondeconuncomentario.
9 org.w3c.dom.Text (Texto) .Correspondeconeltextoqueencontramosdentrodedosetiquetas.
A qu te eran familiares? Claro que s. Estas clases tendrn diferentes mtodos para acceder y
manipular la informacin del rbol DOM. A continuacin vamos a ver las operaciones ms
importantessobreunrbolDOM.
Entodoslosejemplos,doccorrespondeconunainstanciadelaclase Document .
Obtenerelelementorazdeldocumento.
Como ya sabes, los documentos XML deben tener obligatoriamente un nico elemento
( <pedido></pedido> porejemplo),consideradoelelementoraz,dentrodelcualestelrestodela
informacin estructurada de forma jerrquica. Para obtener dicho elemento y poder manipularlo
podemosusarelmtodo getDocumentElement .
Element raiz=doc.getDocumentElement();

Buscarunelementoentodalajerarquadeldocumento.
Para realizar esta operacin se puede usar el mtodo getElementsByTagName disponible tanto en la
clase Document como en la clase Element . Dicha operacin busca un elemento por el nombre de la
etiquetayretornaunalistadenodos( NodeList )quecumplenconlacondicin.Siseusaenlaclase
Element , solo buscar entre las subetiquetas (subelementos) de dicha clase (no en todo el
documento).
NodeList nl=doc.getElementsByTagName("cliente");
Element cliente;
if (nl.getLength()==1) cliente=(Element)n2.item(0);

59

Aplicacindelasestructurasdealmacenamiento

DAW

Elmtodo getLength() delaclase NodeList ,permiteobtenerelnmerodeelementos(longituddela


lista)encontradoscuyonombredeetiquetaescoincidente.Elmtodo item permiteaccederacada
uno de los elementos encontrados, y se le pasa por argumento el ndice del elemento a obtener
(empezando por cero y acabando por longitud menos uno). Fijate que es necesario hacer una
conversindetiposdespusdeinvocarelmtodo item .Estoesporquelaclase NodeList almacena
unlistadodenodos( Node ),sindiferenciareltipo.

Dado el siguiente cdigo XML: <pedido><!--Datos


elementos DOM encontramos en el mismo.

del

pedido--></pedido>

indica que

org.w3c.dom.Element

org.w3c.dom.Node

org.w3c.dom.Text

org.w3c.dom.Comment

12.3.1.ManipulacindedocumentosXML.(II)
YqumsoperacionespuedorealizarsobreunrbolDOM?Vemoslas.
Obtenerlalistadehijosdeunelementoyprocesarla.
Setratadeobtenerunalistaconlosnodoshijodeunelementocualquiera,estospuedenserunsub
elemento (subetiqueta) o texto. Para sacar la lista de nodos hijo se puede usar el mtodo
getChildNodes :
NodeList nl=doc.getDocumentElement().getChildNodes();
for (int i=0; i<nl.getLength();i++) {
Node n=nl.item(i);
switch (n.getNodeType()){
case Node.ELEMENT_NODE: Element e=(Element)n;
System.out.println("Etiqueta:" + e.getTagName());
break;
case Node.TEXT_NODE: Text t=(Text)n;
System.out.println("Texto:" + t.getWholeText());
break;
}
}

Enelejemploanteriorseusanvariosmtodos.Elmtodo getNodeType() delaclaseNodepermite


saber de que tipo de nodo se trata, generalmente texto ( Node.TEXT_NODE ) o un subelemento
( Node.ELEMENT_NODE ). De esta forma podremos hacer la conversin de tipos adecuada y gestionar
cadaelementosegncorresponda.Tambinseusaelmtodo getTagName aplicadoaunelemento,
locualpermitirobtenerelnombredelaetiqueta,yelmtodo getWholeText aplicadoaunnodo
detipotexto( Text ),quepermiteobtenereltextocontenidoenelnodo.
Aadirunnuevoelementohijoaotroelemento.
Hemosvistocomomirar quehay dentrodeun documentoXMLperonohemosvistocomoaadir
cosasadichodocumento.ParaaadirunsubelementoountextoaunrbolDOM,primerohayque
crearlosnodoscorrespondientesydespusinsertarlosenlaposicinquequeramos.Paracrearun
nuevopardeetiquetasoelemento( Element )yunnuevonodotexto( Text ),lopodemoshacerdela
siguienteforma:
Element dirTag=doc.createElement("Direccion_entrega")
Text dirTxt=doc.createTextNode("C/Perdida S/N");

Ahoraloshemoscreado,perotodavanoloshemosinsertadoeneldocumento.Paraellopodemos
hacerlousandoelmtodo appendChild queaadirelnodo(seadeltipoquesea)alfinaldelalistade
hijosdelelementocorrespondiente:
dirTag.appendChild(dirTxt);
doc.getDocumentElement().appendChild(dirTag);

60

DesarrollodeAplicacionesWeb

Tema8

Enelejemploanterior,eltextoseaadecomohijodelaetiquetaDireccion_entrega,yasuvez,la
etiquetaDireccion_entregaseaadecomohijo,alfinaldeltodo,delaetiquetaoelementorazdel
documento. Aparte del mtodo appendChild , que siempre insertar al final, puedes utilizar los
siguientes mtodos para insertar nodos dentro de un arbol DOM (todos se usan sobre la clase
Element):
9 insertBefore (Node nuevo, Node referencia) . Insertar un nodo nuevo antes del nodo de
referencia.
9 replaceChild (Node nuevo, Node anterior) .Sustituyeunnodo(anterior)porunonuevo.

EnelsiguienteenlaceencontrarsaladocumentacindelAPIdeDOMparaJava,contodas
lasfuncionesdecadaclase.
http://docs.oracle.com/javase/1.4.2/docs/api/org/w3c/dom/packagesummary.html
12.3.2.ManipulacindedocumentosXML.(III)
SeguimosconlasoperacionessobrerbolesDOM.Sabrascmoeliminarnodosdeunrbol?No?
Vamosadescubrirlo.
Eliminarunelementohijodeotroelemento.
Paraeliminarunnodo,hayquerecurriralnodopadrededichonodo.Enelnodopadreseinvocael
mtodo removeChild ,alqueselepasalainstanciadelaclase Element conelnodoaeliminar(noel
nombre de la etiqueta, sino la instancia), lo cual implica que primero hay que buscar el nodo a
eliminar,ydespuseliminarlo.Veamosunejemplo:
NodeList nl3=doc.getElementsByTagName("Direccion_entrega");
for (int i=0;i<nl3.getLength();i++){
Element e=(Element)nl3.item(i);
Element parent=(Element)e.getParentNode();
parent.removeChild(e);
}

En el ejemplo anterior se eliminan todos las etiquetas, estn donde estn, que se llamen
Direccion_entrega. Para ello ha sido necesario buscar todos los elementos cuya etiqueta sea esa
(comoseexplicoenejemplosanteriores),recorrerlosresultadosobtenidosdelabsqueda,obtener
el nodo padre del hijo a travs del mtodo getParentNode , para as poder eliminar el nodo
correspondienteconelmtodo removeChild .
Noesobligatorioobviamenteinvocaralmtodo getParentNode sielnodopadreesconocido.Por
ejemplo,sielnodoesunhijodelelementooetiquetaraz,hubierabastadoconponerlosiguiente:
doc.getDocumentElement().removeChild(e);

Cambiarelcontenidodeunelementocuandosoloestexto.
Los mtodos getTextContent y setTextContent , aplicado a un elemento, permiten respectivamente
acceder al texto contenido dentro de un elemento o etiqueta. Tienes que tener cuidado, porque
utilizar setTextContent significa eliminar cualquier hijo (subelemento por ejemplo) que
previamentetuvieralaetiqueta.Ejemplo:
Element nuevo=doc.createElement("direccion_recogida").setTextContent("C/Del Medio S/N");
System.out.println(nuevo.getTextContent());

De los siguientes tipos de nodos, marca aquellos en los que no se pueda ejecutar dos
veces el mtodo appendChild :

Document

Element

Text

Attr

61

Aplicacindelasestructurasdealmacenamiento

DAW

12.3.3.ManipulacindedocumentosXML.(IV)
Caso prctico.
El documento XML que tiene que generar Ana tiene que seguir un formato especfico, para que la
otra aplicacin sea capaz de entenderlo. Esto significa que los nombres de las etiquetas tienen que
ser unos concretos para cada dato del pedido. Esta ha sido quizs la parte que ms complicada, ver
como encajar cada dato del mapa con su correspondiente etiqueta en XML, pero ha conseguido
resolverlo de forma elegante. De hecho, ya ha terminado su tarea, quieres ver el resultado?
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

java.io.BufferedReader;
java.io.FileNotFoundException;
java.io.FileReader;
java.io.IOException;
java.util.ArrayList;
java.util.Collections;
java.util.HashMap;
java.util.List;
java.util.Map;
java.util.Scanner;
java.util.logging.Level;
java.util.logging.Logger;
java.util.regex.Matcher;
java.util.regex.Pattern;
org.w3c.dom.*;

/*
* Clase destinada a almacenar los datos de un artculo.
*/
class Articulo implements Comparable<Articulo>{
public String codArticulo;
public String descripcion;
public int cantidad;
@Override
public int compareTo(Articulo o) {
return codArticulo.compareTo(o.codArticulo);
}
}

/* Clase que se encarga de procesar un pedido.


* El archivo con el pedido debe estar en codificacin UTF8, sino no funciona
* bien.
* Tu sistema debe soportar de forma nativa la coficacin UTF8, sino no
* funcionar del todo bien.
*/
public class ProcesarArchivo3 {
/* Entrada contendr una instancia de la clase Scanner que permitir
leer las teclas pulsadas desde teclado */
static Scanner entrada = new Scanner(System.in);
/* Definimos las expresiones regulares que usaremos una y otra vez para
cada lnea del pedido. La expresin regular "seccion" permite detectar
si hay un comienzo o fin de pedido, y la expresin campo, permite detectar
si hay un campo con informacin del pedido. */
static Pattern seccion = Pattern.compile("^##[ ]*(FIN)?[ ]*(PEDIDO|ARTICULOS)[ ]*##$");
static Pattern campo = Pattern.compile("^(.+):.*\\{(.*)\\}$");
static Pattern articulo = Pattern.compile ("^\\{(.*)\\|(.*)\\|[ ]*([0-9]*)[ ]*\\}$");
public static void main(String[] args) {
BufferedReader lector;
ArrayList<Articulo> Articulos=new ArrayList<Articulo>();
HashMap<String,String> DatosPedido=new HashMap<String,String>();
/*
* 1er paso: cargamos el archivo para poder procesarlo lnea a lnea
* para ello nos apoyamos en la clase BufferedReader, que con el mtodo
* readLine nos permite recorrer todo el archivo lnea a lnea.
*/
if (args.length > 0) {
lector = cargarArchivo(args[0]);
} else {
lector = cargarArchivo();
}

62

DesarrollodeAplicacionesWeb

Tema8

if (lector == null) {
/* Si no se ha podido cargar el archivo, no contina con el
* procesado, simplemente termina la ejecucin. */
System.out.println("No se ha podido cargar el archivo.");
} else {
/* 2 Paso: si ha podido cargar el archivo, contina el procesado
* de lnea a lnea. */
String linea;
try {
linea = lector.readLine();
while (linea != null) {
procesarLinea(linea,DatosPedido,Articulos);
linea = lector.readLine();
}
} catch (IOException ex) {
System.out.println("Error de entrada y salida.");
}
// 3er paso: Ordenamos los artculos por cdigo.
Collections.sort(Articulos);

/* 4er Paso: Pasamos el pedido a rbol DOM. */


// Creamos un rbol DOM vacio
Document doc=DOMUtil.crearDOMVacio("pedido");
// Pasamos los datos del pedido al DOM
pasarPedidoAXML(doc, DatosPedido, Articulos);
// Guardamos el XML en un archivo:
String salida;
if (args.length>1) salida=args[1];
else {
System.out.print("Introduce el archivo de salida: ");
salida=entrada.nextLine();
}
DOMUtil.DOM2XML(doc,salida);
}
}
/**
* Procesa una lnea del archivo de pedido para detectar que es y
* extraer la informacin que contiene.
* @param linea
* @param datosPedido Mapa en el que ir metiendo la informacin del pedido.
* La llave del mapa ser el nombre del campo.
* @param articulos Lista en la que se irn metiendo los artculos del pedido.
* @return true si la lnea contiene informacin que corresponde al formato
* esperado, false en caso contrario.
*/
static boolean procesarLinea(String linea, Map<String,String> datosPedido,
List<Articulo> articulos) {
Matcher deteccionSeccion = seccion.matcher(linea);
Matcher deteccionCampo = campo.matcher(linea);
Matcher deteccionArticulo= articulo.matcher(linea);
/* Si el patrn coincide con el de un indicador de comienzo del pedido
* o de la seccin con el listado de artculos, se ejecutar este trozo
* de cdigo, pues habr encontrado el patrn. No hace nada,
* simplemente lo detecta para as no informar de algo raro.
*/
if (deteccionSeccion.matches()) {
return true;
}
/* Si el patrn coincide con el de un campo con datos del pedido
entonces meter tanto el campo como el valor en el mapa.*/
else if (deteccionCampo.matches()) {
datosPedido.put(deteccionCampo.group(1).trim().toLowerCase(),
deteccionCampo.group(2).trim());
return true;
}
/* Si el patrn coincide con el de un artculo, entonces
guardar los datos del pedido en una clase articulo y lo meter
en la lista de artculos.*/
else if (deteccionArticulo.matches())
{
Articulo n=new Articulo();
n.codArticulo=deteccionArticulo.group(1).trim();

63

Aplicacindelasestructurasdealmacenamiento

DAW

n.descripcion=deteccionArticulo.group(2).trim();
n.cantidad=Integer.parseInt(deteccionArticulo.group(3));
articulos.add(n);
return true;
}
else { System.out.println("Cuidado! Lnea no procesable: "+linea); return false; }
}
/**
* cargarArchivo crear una instancia de la clase BufferedReader que
* permitir leer lnea a lnea el archivo de texto. Si no se ha podido
* cargar el archivo retornar null.
* @param name Nombre del archivo a cargar. si el nombre del archivo no
* se ha pasado por parmetro (valor null) se pedir al usuario que lo
* introduzca.
* @return null si no ha podido cargar el archivo, o la instancia de la
* clase BufferedReader si dicho archivo se ha podido cargar.
*/
static BufferedReader cargarArchivo(String name) {
String nombreArchivo = name;
BufferedReader reader = null;
if (name == null) {
System.out.print("Introduce el nombre del archivo con el pedido: ");
nombreArchivo = entrada.nextLine();
}
try {
FileReader f =new FileReader(nombreArchivo);
reader = new BufferedReader(f);
} catch (FileNotFoundException ex) {
Logger.getLogger(ProcesarArchivo3.class.getName()).log(Level.SEVERE, null, ex);
}
return reader;
}
/**
* Igual que el mtodo BufferedReader cargarArchivo(String name), pero
* que siempre le pedir al usuario que lo introduzca.
* @return null si no ha podido cargar el archivo, y una instancia de BufferedReader
* en otro caso.
*/
static BufferedReader cargarArchivo() {
return cargarArchivo(null);
}
/**
* Funcin que pasa los datos del pedido, almacendos en un mapa y
* una lista, a un documento XML.
* @param doc Documento DOM donde se almacenar toda la informacin.
* @param datosPedido Mapa con los datos del pedido.
* @param articulos Lista con los artculos del pedido.
*/
static void pasarPedidoAXML(Document doc,
Map<String,String> datosPedido,
List<Articulo> articulos)
{
for (String key:datosPedido.keySet())
{
//Eliminamos espacios y acentos de cada llave para que no haya problemas de
chequeo
Element e=null;
String key2=key.trim().replaceAll("\\s", "_").toLowerCase();
key2=key2.replace("", "a");
key2=key2.replace("", "e");
key2=key2.replace("", "i");
key2=key2.replace("", "o");
key2=key2.replace("", "u");
if (key2.equals("nombre_del_contacto"))
e=doc.createElement("contacto");
else if (key2.equals("forma_de_pago"))
e=doc.createElement("formaPago");
else if (key2.equals("direccion_de_factura"))
e=doc.createElement("dirFacturacion");
else if (key2.equals("correo_electronico_del_contacto"))
e=doc.createElement("mail");
else if (key2.equals("codigo_del_cliente"))
e=doc.createElement("codClient");
else if (key2.equals("cliente"))

64

DesarrollodeAplicacionesWeb

Tema8

e=doc.createElement("nombreCliente");
else if (key2.equals("numero_de_pedido"))
e=doc.createElement("numPedido");
else if (key2.equals("telefono_del_contacto"))
e=doc.createElement("telefono");
else if (key2.equals("fecha_preferente_de_entrega"))
e=doc.createElement("fechaPrefEntrega");
else if (key2.equals("direccion_de_entrega"))
e=doc.createElement("dirEntrega");
if (e!=null) {
e.setTextContent(datosPedido.get(key));
doc.getDocumentElement().appendChild(e);
}
else
{
Comment c=doc.createComment("Error procesando "+ key2);
doc.getDocumentElement().appendChild(c);
}
}
Element arts=doc.createElement("listaArticulos");
for (Articulo a:articulos)
{
Element art=doc.createElement("articulo");
art.setAttribute("codArticulo", a.codArticulo);
art.setAttribute("cantidad", a.cantidad+"");
art.setTextContent(a.descripcion);
arts.appendChild(art);
}
doc.getDocumentElement().appendChild(arts);
}
}

Yyasoloquedaunacosa,descubrircomomanejarlosatributosenunrbolDOM.
Atributosdeunelemento.
Porltimo,lomsfcil.Cualquierelementopuedecontenerunoovariosatributos.Accederaellos
essencillisimo,solonecesitamostresmtodos:
setAttribute paraestablecerocrearelvalordeunatributo, getAttribute paraobtenerelvalorde
unatributoy removeAttribute paraeliminarelvalordeunatributo.Veamosunejemplo:
doc.getDocumentElement().setAttribute("urgente","no");
System.out.println(doc.getDocumentElement().getAttribute("urgente"));

En el ejemplo anterior se aade el atributo urgente al elemento raz del documento con el valor
no, despus se consulta para ver su valor. Obviamente se puede realizar en cualquier otro
elementoquenoseaelraz.Paraeliminarelatributoestansencillocomolosiguiente:
doc.getDocumentElement().removeAttribute("urgente");

65

TEMA9

INDICE
1.Relacionesentreclases......................................................................................................................4
1.1.Composicin...............................................................................................................................................5
1.2.Herencia......................................................................................................................................................6
1.3.Herenciaocomposicin?..........................................................................................................................7
2Composicin.......................................................................................................................................9
2.1.Sintaxisdelacomposicin..........................................................................................................................9
Ejercicioresuelto...............................................................................................................................................................9
2.2.Usodelacomposicin(I).Preservacindelaocultacin.........................................................................11
Ejercicioresuelto.............................................................................................................................................................12
2.2.1.Usodelacomposicin(II).Llamadasaconstructores..........................................................................................13
Ejercicioresuelto.............................................................................................................................................................14
2.3.Clasesanidadasointernas........................................................................................................................15
3.Herencia...........................................................................................................................................17
3.1.Sintaxisdelaherencia..............................................................................................................................18
Ejercicioresuelto.............................................................................................................................................................18
3.2.Accesoamiembrosheredados.................................................................................................................19
Ejercicioresuelto.............................................................................................................................................................19
3.3.Utilizacindemiembrosheredados(I).Atributos....................................................................................20
Ejercicioresuelto.............................................................................................................................................................20
3.3.1Utilizacindemiembrosheredados(II).Mtodos................................................................................................22
Ejercicioresuelto.............................................................................................................................................................23
3.4.Redefinicindemtodosheredados........................................................................................................24
Ejercicioresuelto.............................................................................................................................................................25
3.5.Ampliacindemtodosheredados..........................................................................................................26
Ejercicioresuelto.............................................................................................................................................................26
3.6.Constructoresyherencia..........................................................................................................................27
Ejercicioresuelto.............................................................................................................................................................28
3.7.Creacinyutilizacindeclasesderivadas................................................................................................28
3.8.LaclaseObjectenJava.............................................................................................................................28
3.9.Herenciamltiple......................................................................................................................................29
4.Clasesabstractas..............................................................................................................................31
4.1.Declaracindeunaclaseabstracta..........................................................................................................32
Ejercicioresuelto.............................................................................................................................................................32
4.2.Mtodosabstractos..................................................................................................................................33
Ejercicioresuelto.............................................................................................................................................................34
4.3.Clasesymtodosfinales...........................................................................................................................35
5.Interfaces.........................................................................................................................................37
5.1.Conceptodeinterfaz.................................................................................................................................38