luis joyanes aguilar - java 2

482
 Java 2, incluyena  

Upload: edwiin-f-tabares-meza

Post on 02-Jun-2018

288 views

Category:

Documents


1 download

TRANSCRIPT

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 1/481

Java 2, incluyena

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 2/481

JAVA 2MANUALDE PROGRAMACIÓN

Luis Joyanes Aguilar

MatildeFernandez Azuela

Departamento de Lenguajesy SistemasInformáticose Ingeniería del SoftwareFacultad de Informática/ Escuela Universitaria de informática

Universidad Pontificia de Salamanca.CampusMadrid

OsborneMcGraw-Hill

MADRID BUENOS AIRES CARACAS GUATEMALA LISBOA MÉXICONUEVA YORK PANAMA SAN JUAN SANTAFÉDE BOGOTÁ SANTIAGO SA0 PAUL0

SAN FRANCISCO* SIDNEYSINGAPUR ST.LOUIS TOKIO* TORONTOAUCKLAND HAMBURG0 LONDRES* MILÁNMONTREAL NUEVADELHI PARiS

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 3/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 4/481

v i Contenido

I , 1 . Estructura de un programa aplicación en Java................................................1 . 1 I . 1 . Referencia a miembros deunaclase.........................................................

I ,17. Errores decompilaci ...............................................I ,12.2.Errores dee-iecuciónI .12.3. ErroresIbgicos .......................................................

25 27

I .12.Errores de programación ......................................................

....................................

Capítulo2. Características del lenguaje Java.......................................................... 31

2.1. Palabras resercadas.. ......................................................22 . Identi íicado res..... .................................................7.3. Tipos de datos ....................................................

..................

2.6. constantes................................................. ......................................2.7. La bibliotecadc clases de Java ....................................................7.8. Coiiceptos bisicossobreexcep ...................................................2.9.7.10.Las clasesChar act er y Bool ean ........................

La claseNxmber y sussubclases....................................

............................................................

.....................................

2.13.La sentenciad c asignación.......2.14.Expresiones.................. ..................................................

.................................................

2.15.C l a s e M a t h........... .........................................................

...............................2.18.Operadores aritméticos......................... .....................................7.19.Operadores relacionales................. .........................................2.20.Operadoreslb&'ICOS ............... ....................................................

.....................................................

...................................................

32 33 34 34

3841 44 45 46 48 4952525354 55 55 575758 61 61 63

656767

71

3. . La sentenciai f ........... 72 3.3 . La sentenciai f - e l s e 73 3.3 . Las sentenciasi f e I f - e l s e anidadas 74 3.4. La sentencias w i t c h ..................................................... 78

80.5. La sentenciaf o r ....................3.6. La sentenciabreak 83 3.7. La sentenciacont i nue ...... 85

Capítulo3. Decisionesy bucles ................. ............................................

.......................................................................................................

............................

...................................................................................... ..................................................................................

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 5/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 6/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 7/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 8/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 9/481

A.

B.C.

D.E.F.

.

Contenido

Palabras reservadasJava......................................................................................445

Prioridad de operadores 447 Guíade sintaxis ..............................................................................

Paquetes dela plataformaJava . Versiones .3 y .4 Beta...............................

Recursos: libros, revistasy WEB........................................................................

analítico............................................................................................................529

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 10/481

Cinco años después de lanzamiento, Java se ha convertido enun estándar de la industria, enun lenguaje de programación paradesarrollo de aplicaciones tanto de propósito general como deInternet,y también enun lenguaje para comenzarla formación en programación, al tener características excelentes para el aprendi-

zaje.Java, desarrollado por Sun Microsystems en1995,es un mag-níficoy completo lenguaje de programación orientadoa objetosdiseñado para distribuir contenidosa través de una red. Una de sus principales características es que permite operar de forma pendiente dela plataformay del sistema operativo que se estéuti-lizando. Esto quiere decir que permite crear una aplicación que podrá descargarse dela red y funcionar posteriormente en cual-quier tipo de plataforma de hardwareo software. Generalmente, y

al contrario, todo programa o aplicación queda atadoa dos cosas:al hardwarey al sistema operativo.Así, por ejemplo, una aplica-ción Windowssólo funcionará en plataforma (equipadacon procesadores Intel y sistema operativo Windows) igual queuna versión creada para Macsólo funciona sobre Power PCoImacy MacOSo la misma aplicación desarrollada para Unix, sólolo hace sobre plataformasUnix y no hay forma de que funcionesobre otra máquina.

La idea de Java, por el contrario, es poner una capa sobrecualquier plataforma de hardwarey sobre cualquier sistema ope-rativo que permite que cualquier aplicación desarrollada en Javaquede ligada únicamente a Java, independizada por lo tanto dela

xiii

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 11/481

xiv Prólogo

plataforma. Esta concepción queda recogida en el concepto de máquina vJVM (Java Virtual Machine),un software que interpreta instrucciones para cual-quier máquina sobre la que esté corriendoy que permite, una vez instalado, que unamisma aplicación pueda funcionar enun PCo en un Mac sin tener que tocarla. Hoyen día. cualquier sistema operativo moderno (Windows, Macintosh, Linux, Solaris. etc.) cuenta conuna JVM. Así,lo que hace Java en combinación con esta«máquina» es funcionar como hardwarey como sistema operativo virtual, emulan-do en software una CPU universal. Al instalar Java, éste actuará como una cabstracción entre un programay el sistema operativo. otorgando una total indepen-dencia de lo que haya por debajo; es decir, cualquier aplicación funcionará en-quier máquina e incluso en cualquier dispositivo.

Otra gran ventaja es quelos programadores no tendrán que desarrollar varia

versiones de la misma aplicación, puesto que el modelo de desarrollo es el mse trate del dispositivo más pequeñoo del más grande delos servidores. Otra granventaja es que permite que todas las máquinas. plataformasy aplicaciones se comu-niquen entresí accediendo desde cualquier equipo, dondequiera que esté situadlas aplicaciones que residan en una red, ya sea Interneto una intraneto extranet.

En definitiva, se puede decir que Java eslo más cercano que existe hoy día a unlenguaje de computación universal, lo que significa que puede correr en cua plataforma siemprey cuando una máquina virtual haya sido escrita para ella.

LAGENEALOGíADE JAVA

Java es un descendiente de C++ que asu vez es descendiente directo deC .Muchascaracterísticas de Java se han heredado de estos dos lenguajes. De C , Java ha-dadosu sintaxisy deC++,las características fundamentales de programación orie-tada a objetos.

El diseño original de Java fue concebido por James Gosling, Patrick NaugChris Warth, Ed Franky Mike Sheridan, ingenierosy desarrolladores de Sun Mi-crosystems en 1991, que tardaron18meses en terminar la primera versión de tra- bajo. Este lenguaje se llamó inicialmente«Oak»,y se le cambió el nombre por Javaen la primavera de 1995.

Sorprendentemente, la inquietud original para la creación de «Oak» nInternet. En realidad, se buscabaun lenguaje independiente de la plataforma (esdecir, de arquitectura neutra) que se pudiera utilizar para crear software qincrustara en dispositivos electrónicos diversos tales como controles remotos-móvilesu hornos de microondas. Aunque el modelo de lenguaje elegido fueC++,

se encontraron con que, si bien se podía compilarun programa C++ en cualquier tipode CPU (Unidad Central de Proceso), se requería, sin embargo,un compilador C++completo que corriese en esa CPU. El problema, en consecuencia, se convercompiladores carosy en gran consumo de tiempo para crear los programas. Sob

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 12/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 13/481

xv i Prólogo

Java. denominado máquina virtual Java(JUVLIi t+mdMachine,JVM) que actúa comoun interprete paralos bytecodes. La traducción de un programa encódigo4de bytesfacilita la ejecución del programa en una amplia variedad deentornay plataformas.La razón es simple:sólo es preciso implementar JVM en cada plataforma.

EVOLUCIÓN DE LAS VERSIONES DE JAVA

Java comenzó a desarrollarse en1991 conel nombre deProyectoOuk(«roble»eninglés) que era- según cuentan sus inventores- el árbol que veían desde su despa-cho. Tras muchas peripecias, Java salió al mercadoen 1995y el cambio de nombre parece que se debía a que era uno delos tipos de café que servíanen una cafeteríacercana al lugar en quetraba.jabanlos desarrolladoresy ésa es la razón de queellogotipo de Java sea una humeante taza de café.

Una de las primeras aplicaciones quelo soportan con especificacionescomunes para las que se comenzó a diseñar Java fue Internet;su objetivo era poder descar -gar en cualquier tipo de máquina aplicaciones residentesen la Web y ejecutarlas para trabajar con ellas contra la propia máquina del usuario.AI principio se tratabade aplicaciones HTML- páginas de puro contenido estático- y fue evolucionando yadaptándosea Internety a sus innovaciones tecnológicas; eso significa que Javasoporta XML demodomuy eficientey las nuevas tecnologías inalámbricas, celula-

res o móviles. Dos grandes especificaciones existen actualmente en torno a JJ2EE(Java 2 Enterprise Edition) yJ2ME(Java 2MicroEdition).J2EE,está orientada al desarrollo de aplicaciones de propósito generaly son

numerosos los grandes fabricantes (IBM. Nokia, Motorola, Hewlett-Packard....) quelo soportan con especificaciones comunes;J2EM,un nuevo estándar para disposi-tivos inalámbricos (móviles, de bolsilloo de mano(handhr lds ))que requieren unaintegración en dispositivos con poco espacio físico y memoria de trabajo.J2EEesya un auténtico estándarasíreconocido por la industriay J2EMva camino de con-vertirse en otro gran estándar. que en este caso está contribuyendo a la revoluinalátnbrica que está haciendo que Internet llegue a dispositivos electrónicotodo tipo, como teléfonos móviles (celulares), teléfonos de sobremesa, electr-mésticos, decodificadores deTVdigital, etc.

La versión original de Java que comenzó a comercializarsey expandirse conrapidez fue la1.O,aunque pronto apareció la versiónI . I ,que si biensólo cambió elsegundo dígito del número,los cambios fueron más profundos delo queel númerosuele indicar en la nomenclatura delos programas de software (modificaciones y pequeñas actualizaciones). De hecho, añadió numerosos elementosa la biblioteca.redefiniólossucesos (eventos) y reconfiguró la citada biblioteca. Posteriormentelaversión2, consusdiferentes kits de desarrollo, ha servido para asentar la eficiency calidad Java. Se puede considerar que Sun ha lanzado cinco versiones impo-tes del lenguaje Java:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 14/481

Prólogo xvii

Java 1.0. Una pequeña versión centrada en la Web disponible uniformemente para todoslosnavegadores Web popularesy que se lanzó en1995.J m u 1.1. Una versión lanzada en1997 con mejoras de la interfaz de usuario,manipulación de sucesos (eventos) reescrita totalmentey una tecnología decomponentes den oni nadaJ uv uBeuns.J u i w 2 c o t SDK1.2.Una versión ampliada significativamentey lanzada enIY98 con características de interfaces gráficas deusuario,conectividadde

bases de datosy muchas otras mejoras.J u w2 C O I ZSBK1.3. Una versión lanzada en el2000 que añade característicasnotables. como multimedia mejorada,más accesibilidady compilación másrápida.Juvrr2 ~ 0 1 1SDK1.3 hetu. Una versión lanzada a primeros del mes de junio de2001 que, entre otrasme.joras.introduce la posibilidad de trabajar con XML. Afinales del200 1 está prevista la salida de la versión definitiva.

Además delos kits de desarrollo de Java, existen numerosas herramientascomerciales de desarrollo paralos programadores de Java. Las más popularesson:

Symantec Visual Café.Borland Jbuilder.IBM Visual Age for Java.

Sun Forte for Java.Si usted trabaja con alguna herramienta distinta de SDK 1.3y 1.4 para crear pro-

gramas Javaa medida que lea este libro, necesita asegurarse que sus herramientasde desarrollo están actualizadas para soportar Java2.

Los programas de este libro fueron escritosy probados con Java SDKv. 1.3.1, laversiónmásactual existente durante el proceso de escritura del libro. Sin embargodurante la fase de pruebas de imprenta de la obra, Sun presentó oficialmente el29de mayo de2001 la versión Java SDKv. 1.4 beta con la cual fueron compiladosy

probados todoslos programas de nuevo, por lo que ustedno deberá tener ningún problema. Bueno, realmente,sí se le presentaráun «problema» comoa nosotros, pero que por fortuna nos resolvieronlos ingenieros deSunMicrosystems (AndrewBennetty Bill Shannon), cuya ayuday apoyo técnico destacamos de forma espe-cial.El «problema» es queal tratar de ejecutar losapplets bajo SDKv. 1.4 en elnavegador Webno le funcionarán completamentea menos que utiliceunos progra-mas p lug- in descargados del sitio deSun.

Losnavegadores existentes normalmenteno soportan- como es lógico- la últimaversión de Javay sólocuando ellos realizan la nueva versión es cuando tienen en

cuenta esta Última versión de Java. Sun ha resuelto esta situación proporcionanun plug-in (añadido/actualizacióno «parche»).Enrealidad, cualquier clase añadidaa JavaI.2y posterioresnose encuentra en la implementación de Java proporcionada

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 15/481

xviii Prólogo

porlosnavegadores. porlo que se originarán erroresal usar las nuevas clases. perono debiera haber problemas cuando se está escribiendo código que no usa estas-vas características. No obstante,en Java 1.4 esto no es así. pues se ha eliminado laopción de coinpilación por defecto del compilador( j r r i ~ r c . )existente en Java1.3queiiutotiiáticliiiieiitedirigía el códigoa la versiónI . 1 de la máquina virtual. Para solu-cionareste <<problemanse tienen dos posibilidades:Lisi r siempreJ r i i w Plug-in, locual le permitirá emplear lasúltiinas rne.jorasdel producto.o dirigir específicamen-te SLIcódigo aunamáquina virtual determinada compatible con el navegador corre- pondiente. mediante elempleodel modificador-tcrr,yetdel cornpilador.

Las nuevas actualizaciones

Sun Microsystems es propietaria de Java; sin embargo, numerosos fabricantes -tribuyen a lame-joray desarrollo de las especificaciones del ectándar. Sun propor-cionalas licencias de esta tecnología peroe.jercesiempreun cierto control sobre lasimplenientacionesque se hacen de la misma, con elob.jetivode mantener la inde- pendencia de la plataforma. Ese objetivo se trata de conseguir con procesos co-lados por el programaJCP ( J m wCoinmimi t~rocrss).en los que se determinael proceso formal de estandarizacióny continuar asegurándose de que las especifica-ciones siguen siendo compatibles.Es decir. que Java siga siendo Java.

Las actualizaciones más utilizadas actualmente son la versión Java 2(J2SE)y los kit de desarrollo JDK1.2 y 1.3. Sin embargo, ya está disponible( java . sun. corn/ j 2se/ 1 . 4 ) la versión más reciente.J2SE1.4 (kit de desarro-IloJDK 1.4). para las plataformas Solaris. Linuxy Windows.

Java J2SE 1.4 (incluida en el libro y en el CD)

Las aportaciones más interesantes se encuentran en la integración en el núcleo

plataforma de la posibilidad de trabajar conXML.estableciendo así los fundamen-tos básicos parala creación y consumo de servicios Web. Existen mejoras en laJFC (JCIVCIFoundationCln.w.7) que afectan al rendimiento de las aplicacionescliente basadas enSi.~.ingy gráficos Java 2D. También contemplael uso de arqui-tecturas de64 bits y se ha mejorado la seguridad con la integración de una nueAPI compatible Kerberos.

Direcciones Web de interés profesional

Internet está plagada de direcciones de interésy excelentes relativas a Java. Noobs -tante. además delos recursos que incluimos en el ApéndiceG (que aconsejamos

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 16/481

Prólogo xix

visite gradualmente) le daremos unas direcciones de gran interés sobre todo pdescargar softwarey documentación actualizada.

ht t p: / / ~av a. s ur ~. . c om/ j ~s e

h t t p : / / l d v a . s u n . c n m / Z s e / l . 3

h t t p : / / ! a v a . s u n . _ o m / 7 2 s e / 1 . 4 /

h t t p : / / j a v a . c u n . c o r r / j 2 c e / l . 3 / d o c s / .

n t t p : / / j a v a . c ~ ~ n . c o - / j ~ s e / l . 4 / d o e s /

kt t p: / j a v a . c ¿ n . - c m / i : r ~ - i * ~ t s / p ~ . ~ g i n / l . 3 .i r . d e x , h t m l

h t t p : / / ] a v a . s u n . c o m/ j ~s ~ / l . 4 / ~~~~/ ~~~ ~~/p l u g i n / i n c i e x . h:i l

- t t o: / / ] ava. s un. c om j 2me

PlatuforniciJnvtr 2, Srundurtl Edition I : I . 4

P1rrtufi)rmciJ a i w 2 Mi cr o Ecli-tion,J2 ME .ri.rtemci.r. naldm-17rico.r)

Como motor de búsqueda le recomendamosGoogle( w w w. o o g l e . corn),Al t avi s t a (w w w.al a v i s t a .corn) o Ask (www. ask. corn),aunquesi está acostumbrado a otros buscadores (tales comolos incluidos en Terra,Ya.StarMedia,Excite...) es recomendable que haga pruebas prácticas para ver si real-mente le puede ser ventajoso realizar el cambio.

EL LIBRO COMO HERRAMIENTADIDÁCTICA

La obraJ a ~ m2. M u t i i dde progrumacicínha sido diseñaday escrita pensando en personas que desean iniciarse en el mundo de la programación de Java tanto desarrollo de aplicaciones como para desarrollo deupplets.Tiene como objetivo primordial enseñara programar en Java para entornos abiertosy entornos deInternet en niveles de iniciacióny medios. Si bien esun libro pensado en el profe-sionaly en el estudiante autodidacto, la experiencia docente delos autores sehavolcado en el libro tratando de conseguir una obra didáctica que pueda servinosólo parasu uso en cursos profesionales, sino en cursos de enseñanzas regladatales comolosmódulos formativos de ciclo superior de la formación profesionalyen los primeros semestres de estudios universitarios de ingenieríay ciencias. Seha buscado que el libro fuera autosuficiente, aunque el rendimiento mayor del libr

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 17/481

xx Prólogo

conseguirá cuando el lector tenga una formaciónmínimade fundamentos de teoríade progranmación.Conocimientos de otroslengua.jesde programación. fundamen-talmenteestiloC/C++.ayudará considerablemente al aprendizaje gradual nosóloen el tiempo sino en el avance de contenidos.

Por todo ello. pensamos que el libro puede servir.ademásde aprendimje auto-didacto. para cursos de introducción a laprogramación/prograninciónen Java deunsemestre de duracióno cursos profesionales de unas30 -40 horas quey a poseanexperiencia en otroslengua-jesde programación.

CONTENIDO

Siempre que Sun lanza una nueva versión de Java haceun kit de desarrollo gratisque pone disponible en su Web para soportar a dicha versión. Este libro se creado utilizando elkit que se denominaJava 2 Software Development Kit,Standard Edition, Versión1.3(JDK 1.3). Tras lanzar Sun la versión 1.4 beta, sehan probado todas las aplicacionesy applefscon esta nueva versión(JDK 1.4).Así mismo, se han actualizadolos paquetes de la plataforma Java2 para incluirambas versionesy el contenido del CDad.juntoal libro que incluye dichas versio-nes paralos entornos Windowsy Linux. El libro consta de quincecapítiilosy sieteapéndices(A-G).Un breve contenido deloscapítulosy apéndices se reseñaa con-tinuación:

Capítulo1. IntroducciónCI JLiva.En este capítulo se realiza una descripción dela historia de Java junto a una breve descripción de las características más notabSe describe el concepto de aplicacióny de upplery los métodos para crearu n programa Java. Sun tiene disponible en su página Web(www.sun.com)el Kit deDesarrollo necesario para la compilacióny ejecución de programas denominadoJDK(Jui’u DevelopmentKif )y en este capítulo se explica este entorno de desarro-llo, así como los errores típicos que se producen en la fase depuración y pues punto de programas por parte del usuario.

Capítulo2. Caructeri~ricusdel lenguajeJavu.Todo lenguaje de programación.y Java no es una excepción, dispone deun conjunto de elementos básicos que cons-tituyensu núcleo fundamental para la escritura de programas. En el capítulo se de-criben: palabras reservadas. identificadores, tipos de datos. variables, constantyoperadores. así como una breve introduccióna las clasesy bibliotecas de clases deJava.

Capítulo3. Decisiorzesy bucles.Los programas requieren siempre de sentenciasy estructuras de control para seguir la secuencia dee.jecuciónde sus instrucciones.La ejecución secuencia1 deun programa requiere de modo continuo una toma dedecisiones e iteracioneso repeticiones: para ello, se utilizan sentencias de decisióny de iteración para realizar los bucleso repeticiones de acciones. Se describen

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 18/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 19/481

xxi i Contenido

nización.Su organización. diseñoy construcciónconstituyenel contenido funda-mental de este capítulo.

Capítulo15.E.struc~tirrn.se ci rr tosdefliiicíti.spor01 progrtrniudor:Una vez que el programador sabemane.jarestructuras de datos básicas como arraysy archivos, sen-tirá la necesidad con relativa frecuencia de utilizar estructuras de datos dinátales como listas, pilas y colas. Su conceptoy métodos de iinplementación se expli-can en este último capítulo.

En los apéndices. se incluyen herramientas de trabajo complementarias pael programador tales como:Lisrndode pa1cihrci.s r-eservad(isJuvci( A ) ;fiihladeprio-riúudde operadores( B ) ;Guíade sintaxisde J L I LY I2,que facilita la consulta al lec-

tor en la fase de escritura y depuración de prograinas(C) ;Paquetesde la platuformaJ a i n 3 más utilizados e incluidos en las versiones de1.3.1y 1.4 de los kit de desa-rrollo JDK( 0 ) ; Unaconzpuracicíneritw l o s 1rnguuje.sde progr-armickjnorientadosci ohjetosm r í s p o p l ~ i r e sen la uctucil idd:C++ y Java( E ) ;Coriteriidodel CDcomoelemento de ayudaen el aprendizajey formación en Java para el lector y herra-mienta desoftwarecomplementaria para cursosy seminarios en laboratorios de programación( F ) ; Recursosde J u i u : libros, revistasy sitios Web de interés.

CD QUE ACOMPAÑA AL LIBRO

El disco compacto que se adjuntaen las tapas de este libro contiene la versiónJava 2 y el kit de desarrolloJDK de Sun versiones1.3.1 y 1.4 para entornosWindowsy Linux. Así mismo, se han incluido todas las aplicacionesy appletssobresalientes incluidos en el libro con elob-jetivofundamental de ayudarle en el proceso de compilación y ejecución.

AGRADECIMIENTOS

Como ya hemos indicado anteriormente, no podemos terminar este prólogexpresar nuestra gratituda todo el equipo de Sun Microsystems enPaloAlto (Ca-lifornia),su disponibilidady efectividad a la hora de resolver cualquier consulta resultado una inestimable ayuda en el desarrollo de esta obra. Evidentement- portamientos profesionales como&tosson algunos delosmillones de razones parausar Java. Así pues, reiteramos nuestro agradecimiento a Sun Microsystem particular alos ingenieros:

Andrew BennettEngineering Manager. Sun Microsystems. Inc.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 20/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 21/481

2 Java 2. Manual de programación

Este capítulo introduce al lector en el mundo de Java, su fortalezay sus debilidades. Describe la programación en Javay por qué esdiferente de la programación en cualquier otro lenguaje, así comolas ventajas que estas diferencias pueden representar en la crea-ción de aplicaciones nuevasy eficientes.

El futuro de la computación está influenciado por InternetyJava es una parte importante de ese futuro.Java es el lenguaje deprogramación de lnternet y es una plataforma cruzada, orientadaa objetos, usada en la Redy preparada para multimedia. Desde sunacimiento real en1995,Java se ha convertido en un.lenguajemaduro para el desarrollo de aplicaciones críticasy eficientes.Este capítulo comienza con una breve historia de Javay sus carac-terísticas más sobresalientes, así como ejemplos sencillos de apli-cacionesy el concepto deapplefs Java.

1.1. LA HISTORIADE JAVAJava no fue creado originalmente para la red internet. Sun Microsystems comendesarrollarlo con el objetivo de crear un lenguaje, independiente de la plataforydel sistema operativo, para el desarrollo de electrónica de consumo (dispositelectrónicos inteligentes, como televisores, vídeos, equipos de música, etc.).

El proyecto original, denominadoGreencomenzó apoyándose enC++, pero amedida que se progresaba ensu desarrollo el equipo creador de<<Green»comenzóa encontrarse con dificultades, especialmente deportahilidad.Para evitar estas difi-

cultades, decidieron desarrollarsu propio lenguaje y en agosto de 1991 nació unnuevo lenguaje orientado a objetos. Este lenguaje fue bautizado con el nombrOak.En 1993, el proyectoGreen se volvió a renombrar y pasó a llamarseFirstP e n o nJuc.Sun invirtió un gran presupuesto y esfuerzo humano para intentar vder esta tecnología, hardware y software, sin gran éxito.

A mitad de 1993, se lanzó Mosaic, el primer navegador para la Web y comencrecer el interés por Internet (y en particular por laWorld Wide Web).Entonces, serediseñóel lenguaje para desarrollar aplicaciones para internet y, en enero de1995,Oakse convirtió en Java.Sun lanzó el entorno JDK1.Oen 1996, primera versión delkit de desarrollo de dominio público, que se convirtió en la primera especificaciónmal de la plataforma Java. Desde entonces se han lanzado diferentes versiones,que la primera comercial se denominó JDK1.1 y se lanzó a principios de 1997.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 22/481

Introducción a Java 3

En diciembre de 1998 Sun lanzó la plataforma Java 2 (que se conoció como JD1.2 durante su fase de pruebas beta). Esta versión de Java ya representó la madurde la plataforma Java. SunrenombróJava 1.2 como Java 2.

El paquete de Java que se utiliza en esta obra, incluye el compilador Java y otrutilidades, se denomina oficialmente Java2 JDK, versión1.3.

Los programas Java se pueden incluir(((embeber))o ((empotrar))) en páginasHTML y descargarse por navegadores Web para llevar animaciones e interacciona los clientes Web. Sin embargo, la potencia de Java no se limita a aplicacionWeb, Java es un lenguaje de programación de propósito general que posee cara-terísticas completas para programación de aplicaciones independienteso autóno-mas. Java, como lenguaje, es fundamentalmente orientado a objetos. Se diseñdesde sus orígenes como verdadero lenguaje orientado a objetos, al contrario q

otros lenguajes, comoC++y Ada, que tienen propiedades de lenguajesprocedi-mentales. La programación orientada a objetos(POO) es también, actualmente, unenfoque de programación muy popular que está reemplazando poco a poco a las t-nicas tradicionales de programación procedimentalo estructurada.

La última versión lanzada por Sun es Java 2 JDK 1.4 Beta. En la direcciówww.s u n . corn se pueden encontrar todas las versiones paraWindows9x,Windows2000/NT,UNIX,Unix (Solaris), Macintosh,...

1.2. ¿QUÉES JAVA?

El significado de Java tal y como se le conoce en la actualidad es el deun len-guaje de programación y un entorno para ejecución de programas escritos en lenguaje Java.AI contrario que los compiladores tradicionales, que convierten el códi-go fuente en instrucciones a nivel de máquina, el compilador Java traduce código fuente Java en instrucciones que son interpretadas por la Máquina VirtuJava (JVM, Java Virtual Machine).A diferencia de los lenguajesC y C++en losque está inspirado, Java es un lenguaje interpretado.Aunque hoy en día Java es por excelencia el lenguaje de programación paInternet y la World Wide Web en particular, Java no comenzó como proyectInternet y por esta circunstancia es idóneo para tareas de programación de pr- pósito general y, de hecho, muchas de las herramientas Java están escritas eJava.

1.2.1. Java como lenguaje de InternetJava es un lenguaje para programar en Internet que trata de resolver dos problemclaves con el contenido de Internet:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 23/481

4 Java 2. Manual de programación

Computadora localSistema operativoNavegador Java

Máquina virtualJava

En la actualidad, el contenido de la WWW es pasivoy estático.La entrega (Deliverry) del contenido WWW es dependiente de la config-ción de cada navegador Web de usuario.

Computadora servidor(host)Códigofuente Java

Código fuente

En el mundo de la Web, Java es una tecnología facilitadora que permite alosdesarrolladores crear páginas Web que se entregarán de modo consistente a tlosusuarios con un navegador habilitado para Java y con independencia de la-taforma hardwarey el sistema operativo que se esté utilizando'. Dado que el cód-go fuente se interpreta,si existe un intérprete Java para una plataforma específichardware o sistema operativo, se pueden escribir programas con el conocimienque serán útiles en esa plataforma.

La Figura1.1 muestra cómo el código fuente Java se transfiere en Internet.

la computadora servidor(host) se almacena el código fuente. Cuando un usuario duna computadora local se conecta con el servidor a través de Internet mediannavegador habilitado para Java, el código fuente se transfiere de la computaservidor a la computadora local.

1.2.2. Java como lenguaje de propósito general

A medida que Java se populariza en desarrollos de Internet, gana también com-guaje de propósito general. Java es totalmente portable a gran variedad de pla-mas hardware y sistemas operativos.

Java tiene muchos conceptos de sintaxis deC y C++,especialmente deC++,delque es un lenguaje derivado. Añade a C++ propiedades de gestión automátimemoriay soporte a nivel de lenguaje para aplicaciones multihilo. Por otra paJava, en principio a nivel medio, es más fácil de aprender y más fácil de utilizaC++ ya que las característicasmáscomplejas de C++ han sido eliminadas de Javaherencia múltiple, punteros (apuntadores)y sentenciag o t o entre otras.

En Cohnet al., Java. DeveloperS Reference, Indianapolis:Sams Net. 1996. se describenlas caracte-rísticas fundamentales del lenguaje Java original.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 24/481

Introducción a Java 5

Las iinpleinentaciones de la Máquina Virtual Java pueden ser muy eficaces y hace posible quelos programas Java se ejecuten tan rápidamente comolos programasC++.Esta característica clave de Java, unida asusfortalezas como lenguaje de Internet,lo hacen muy adecuado para desarrollos en sistemasclienteiservidor,soporte masivode lossistemasinformáticos de la mayoría de las empresas y organizaciones.

Las propiedades que se verán más adelante hacen a Java doblemente idóneo pdesarrolloscliente/servidory para desarrollos de Internet.

1.3. CARACTERISTICASDE JAVA

Java ha conseguido una enorme popularidad. Su rápida difusión e implantación e

mundo de la programación en Internety fuera de línea(offline)ha sido posible gra-cias asusimportantes características. Los creadores de Java escribieron un artícuya clásico, en el que definían al lenguaje como sencillo, orientado a objetos, di- buido, interpretado, robusto, seguro, arquitectura neutra, alto rendimiento, multiy dinámico. Analicemos más detenidamente cada característica.

1.3.1. Sencillo

Los lenguajes de programación orientados a objetos no son sencillosni fáciles deutilizar, pero Java esun poco más fácil que el popularC++*,lenguaje de desarrollode software más popular hasta la implantación de Java.

Java ha simplificado la programación enC++,añadiendo características funda-mentales de C++y eliminando alguna de las características que hacen aC++un len-guaje difícily complicado.

Java es simple porque constasólode tres tipos de datos primitivos: números,booleany arrays.Todo en Java es una clase. Por ejemplo, las cadenas son objetos

verdaderosy no arrays de caracteres. Otros conceptos que hacen la programacióen C++máscomplicada sonlos punteros y la herencia múltiple. Java elimina los punteros y reemplaza la herencia múltiple deC++con una estructura única deno-minadainterfaz ( i n te r face).

Java utiliza asignacióny recolección automática de basura(garbagecollection),aunqueC++ requiere al programador la asignación de memoria y recolección d basura.

Otra característica importante es que la elegante sintaxis de Java hace más fála escritura de programas.

En C++. Inicicicióny Refereiicia(McCraw-Hill,1999).de Luis Joyanesy HéctorCastán, podrá encon-trar unaguíade iniciación con enfoque similar a esta obra.si usted necesita iniciarse enC++.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 25/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 26/481

Introducción a Java

La programación orientada a objetos proporciona mayor flexibilidad, moduladad y reusabilidad. En la actualidad está ya muy implantado este tipo de programción y Java se convertirá en breve plazo en uno delos lenguajes más usados de propósito general.

1.3.3.

La computación distribuida implica que varias computadoras trabajan juntas enred. Java ha sido diseñado para facilitar la construcción de aplicaciones distribuimediante una colección de clases para uso en aplicaciones en red. La capacidadred está incorporada a Java. La escritura de programas en red es similar a enviarecibir datos a y desde un archivo. La utilización de una URL(Uniform Resource Locator)de Java puede hacer que una aplicación acceda fácilmente a un servidremoto.

1.3.4. Interpretado

Java esinterpretadoy se necesita unintérprete para ejecutar programas Java. Los programas se compilan en una Máquina Virtual Java generándose un código inmedio denominadobytecode.El bytecodees independiente de la máquina y se puede ejecutar en cualquier máquina que tenga un intérprete Java.

Normalmente, uncornpiladortraduce un programa en un lenguaje de alto nivela código máquina.El códigosólose puede ejecutar en la máquina nativa. Si se eje-cuta el programa en otras máquinas, éste ha de ser recompilado. Así por ejemcuando un programa escrito en C++ se compila en Windows, el código ejecutagenerado por el compiladorsólose puede ejecutar en una plataforma Windows. Enel caso de Java, se compila el código fuente una sola vez y elbytecodegenerado porel compilador Java se puede ejecutar en cualquier plataforma.

Nota:Los programas Java no necesitan ser recompilados en una máquina des-tino.Se compilan en un lenguaje ensamblador para una máquina imaginaria,denominadamáquinavirtual.

Sin embargo,los intérpretes Java tienen una seria desventaja sobrelossistemas

convencionales. Son, normalmente, mucho más lentos en ejecución. Innovaciorecientes en el mundo Java han avanzado sobre las ideas delos intérpretes y hanaparecido compiladores JIT(just -in-time)que leen la representación enbytecodeindependiente de la máquina de un programa Java, e inmediatamente antes de

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 27/481

8 Java 2. Manual de programación

la ejecución traduzca la representación enb-ytecodeen instrucciones de la máquinareal del sistema en el que el programa Java se está ejecutando. Dado quelos progra-mas Java se ejecutana continuación como instrucciones máquina, pueden ser castan rápidos como programas compilados en lenguajes más convencionales para-taformas de hardware específicas y mantener laportabilidadde la máquina virtual.

1.3.5. Robusto

Robusto significa fiable. Ningún lenguaje puede asegurar fiabilidad completa. Jaha escrito pensando en la verificación de posibles erroresy por ello como un lenguajefuertemente tipificado (con tipos). Java ha eliminado ciertos tipos de construccion programación presentes en otros lenguajes que son propensas a errores. No soporta, por ejemplo, punteros (apuntadores) y tiene una característica de manejo de exce-nes en tiempo de ejecución para proporcionar robustez en la programación.

Regla:Java utiliza recolección de basura en tiempo de ejecución en vez deliberación explícita de memoria. En lenguajes comoC++es necesario borraro liberar memoria una vez que el programa ha terminado.

1.3.6. Seguro

Java, como lenguaje de programación para Internet, se utiliza en un entorno d- buido y en red. Se puededescargarun appletJava y ejecutarlo en su computadorasin que se produzcan daños en su sistema, ya que Java implementa diversos m-nismos de seguridad para proteger su sistema de daños provocados por un pro-

mastray. La seguridad se basa en la premisa de que nada debe sertrusted. Naturalmente la seguridad absoluta no existe, pero, aunque se encuentran - blemas de seguridad en Java, éstos no son lo suficientemente notables como producir trastornos apreciables.

Nota:Existen numerosos sitios en la Red para información sobre seguridad dcomputadoras. Este sitio

de la universidad de Princeton (allí impartió clase el físico universal Einsteies excelente para estudiar problemas de seguridad informática, especialmen para Java,ActiveXy JavaScript.

www. cs . pr i ncet on. edu/ s i p/ .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 28/481

Introducción a Java

1.3.7. Arquitectura neutral

Una de las características más notables de Java es que es dearquitectura neutral,lo que también se define como independiente de la plataforma. Se puede escribun programa que se ejecute en cualquier plataforma con una Máquina VirtuaJava.

Se pueden ejecutarappletsde Java enun navegador Web; pero Java es algoque escribiruppletsde Java, ya que se pueden también ejecutar aplicaciones Javaautónomas(stand-alone)directamente en sistemas operativos que utilicenun intér - prete Java.

I I

Importante: Utilizando Java, los desarrolladores necesitan escribir una Únicaversión para ejecutarse en todas las plataformas, dado que losbytecodesno secorrespondena ninguna máquina específicay trabajan en todas las máquinas.

Comentario: Un programa Java es el mismosi se ejecuta en unPC, unMacintosh,o un sistema Unix.Es distinto delos lenguajes convencionalestales como

1.3.8. Portable

Java es un lenguaje de alto nivel que permite escribir tanto programas convenci-nales como aplicaciones para Internet(applets).Dado que Internet es una red for -mada por equipos muy diferentes interconectados por todo el mundo, result

fundamental paralos programas que rueden en ellasu independencia de la plata-forma en la que van a ser ejecutados. Dicha independencia se obtiene en Java gr-cias a que el compilador Java generaun código intermedio,bytecode(código byte),noejecutable porsí mismo en ninguna plataforma, pero que puede ser ejecutado agran velocidad mediante un intérprete incorporado en la máquina virtual Java. Elas diferentes plataformas existirán máquinas virtuales específicas,y cuando elcódigo bytellegue a esas máquinas virtuales será interpretado pasándolo al códigoadecuado para la computadora receptor de la aplicación. Las máquinas virtuales Jason programas capaces, entre otras cosas, de interpretar elcódigo byte,que pueden

venir incluidos enlosnavegadores, proporcionados con el sistema operativo, con elentorno Javao bien obtenerse a través de Internet (mediantedescargadel corres- pondiente programa). Por tanto, los programas Java pueden ejecutarse en cualqu plataforma sin necesidad de ser recompilados; es decir, son muy portables.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 29/481

10 Java 2. Manualde programación

Pero la portabilidad de Java aún va más allá; Java fue diseñado de mod pueda ser transferido anuekasarquitecturas.

En Java todoslos tipos de datos primitivos son de tamaños definidos con in-

pendencia de la máquina o sistema operativo en el que se ejecute el programcaracterística es distinta de C oC++,en los que el tamaño delos tipos dependerádel coinpiladory del sistema operativo.

Nota:El tamañofijode losnúmeros hace el programa portable.

I IRegla:El entorno Java es portable a nuevos sistemas operativosy hardware.

El compilador Java está escrito en Java.1 I

1.3.9. Alto rendimiento

Los coinpiladores de Java han ido mejorandosus prestaciones en las sucesivas

\ ersiones.Losnuevos compiladores conocidos comoJ lT@st-in-tirvze) permitenque prograinas Java independientes de la plataforma se ejecuten con cmismorendimientoen tiempo de ejecución quelos lenguajes convencionalescoin pi1ados.

1.3.10. Multíhilo

Java es uno delos primeros lenguajes que se han diseñado explícitamente para la posibilidad de múltiples hilos de ejecución; es decir, Java es multihilo(multith-reudit7g).Multihiloes la capacidad de un programa de ejecutar varias tareas sim-táneamente. Por ejemplo, la descarga de un archivo de vídeo mientras se gvídeo. La Programación multihilo está integrada en Java. En otros lenguajes quellamara procedimientos específicos de sistemas operativos para permitirmul-tihilo.

Los hilos sincronizados son muy Útiles en la creación de aplicaciones di-dasy en red.Porejemplo, una aplicación puede comunicarse con un servidor r-

to en un hilo, mientras que interactúa conun usuario en otro hilo diferente. Esta propiedad es muy útil en programación de redesy de interfaces gráficas de usuario.Un usuario de Internet puede oír una emisora de música mientras navega p página Weby un servidor puede servir a múltiples clientes al mismo tiempo.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 30/481

introducción a Java

1.3.1 Dinámico

Como Java es interpretado,es un lenguaje muy dinámico. En tiempo de ejecución, el

entorno Java puede extenderse (ampliarse) mediante enlace en clases que puedenestar localizadas en servidores remotoso en una red (por ejemplo,Esuna gran ventaja sobre lenguajes tradicionales como C++ que enlaza clases antesdel momento de la ejecución.

Se pueden añadir libremente nuevos métodosy propiedadesa una clase sin afec-tar a sus clientes. Por ejemplo, en la claseCuadr ado se pueden añadir nuevosdatos que indiquen el color del polígono yun nuevo método que calcule el períme-tro del cuadrado.El programa cliente original que utiliza la claseCuadr ado per -manece igual. En tiempo de ejecución, Java carga clases a medida que se necesitan

1.4. LA PROGRAMACIÓN ORIENTADA A OBJETOSCOMO BASE DE JAVA

La programación orientada a objetos (POO) es la base de Java y constituye una nuevforma de organización del conocimiento en la quelasentidades centrales sonlos objetos.En un objeto se unen una serie de datos con una relación lógica entreellos,a losquesedenominavariables de instancia,con las rutinas necesarias para manipularlos, a las quese denominamétodos.Los objetos se comunican unos con otros mediante interfaces biendefinidas a través de puso de mensajes;en los mensajes están asociados con méto-dos, de forma que cuando un objeto recibeun mensaje, ejecuta el método asociado.

Cuando se escribeun programa utilizando programación orientada a objetos, no sedefinen verdaderos objetos, sino clases; unaclasees como una plantilla para construirvarios objetos con características similares.Losobjetos se crean cuando se define unavariable de su clase. En las clases pueden existir unos métodos especiales denominadoconstructoresque se llaman siempre que se crea un objeto de esa clasey cuya misiónesiniciar el objeto.Losdestructoresson otros métodos especiales que pueden existir enlas clasesy cuya misión es realizar cualquier tarea final que corresponda realizar en elmomento de destruir el objeto. Las propiedades fundamentales delosobjetos son:

Elencapsulamiento, que consiste en la combinación delosdatosy las opera-ciones que se pueden ejecutar sobre esos datos en un objeto, impidiendousosindebidos al forzar que el acceso alos datos se efectúe siempre a través delosmétodos del objeto. En Java, la base del encapsulamiento es la clase, donde sedefine la estructuray el comportamiento que serán compartidos por el grupode objetos pertenecientes a la misma. Para hacer referencia alos componentesaccesibles de un objeto será necesario especificarsu sintaxis:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 31/481

12 Java 2. Manual de programación

La herencia es la capacidad para crear nuevas clases (descendientes) quconstruyen sobre otras existentes, permitiendo que éstas les transmitan s- piedades. En programación orientada a objetos, la reutilización de cód

efectúa creando una subclase que constituye una restriccióno extensión de laclase base, de la cual heredasus propiedades.El polimorjismoconsigue que un mismo mensaje pueda actuar sobre dife-tes tipos de objetos ycomportarsede modo distinto. El polimorfismo adquiesu máxima expresión en laderivacióno extensión de clases;es decir, cuandose obtienen nuevas clases a partir de una ya existente mediante la propiederivación de claseso herencia.

1.5. ESPECIFICACIONES DEL LENGUAJE JAVA

Los lenguajes de computadoras tienen reglas estrictas deusoque deben seguirse cuan-do se escriben programas con el objeto de ser comprendidos por la computadreferencia completa del estándar Java se encuentra en el libro Java LanguajeSpecification,de James Gosling, Prill Jorg y Grey Steele (Addison Wesley, 199

La especificación es una definición técnica del lenguaje que incluye siestructura y la interfaz de programación de aplicaciones (API,applicationpro-

gramminginterfuce)que contiene clases predefinidas. El lenguaje evoluciona r-damentey el mejorlugar para consultar las últimas versionesy actualizaciones delmismo se encuentra en el sitio Web de internet de Sun

Las versiones de Java de Sun se incluyen en JDK(JavaDeivlupmentKit),quees un conjunto detierramientasque incluyen un cornpilador, un intérprete,el entor -

no de ejecución Java, el lenguaje estándar Java y otras utilidades.En la actualidad existen cuatro versiones JDK. Este libro es compatible co1.4Beta, que es una mejora sustancial de las versiones anteriores JDK1.Oy JDK 1.1.La nueva versión JDK1.3incluye un compilador JIT(jusf-in-time) para ejecutarelcódigo Java.El entorno JDK está disponible paraWindows9Y98,WindowsNT/2000y Solaris, pero existen muchos entornos de desarrollo para Java:JBuilderde Borland,Visual Age Windows deIBM,Visual J++ de Microsoft, Visual Café de Symantec, e

Nota:Todoslos programas de este libro se pueden compilary ejecutar enlosentornos JDK1.2,JDK 1.3 y JDK 1.4 y deben poder trabajar con cualquierherramienta de desarrollo que soporte las citadas versiones.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 32/481

Introducción a Java 3

JDK consta deun conjunto de programas independientes cada uno deloscualesse invoca desde una línea de órdenes. Las herramientas de desarrollo más impo-tantes se pueden encontrar enlossiguientes sitios de Internet:

Café de Symantec www. symant ec. comSun Java Workshop www. j avasof . comVisual Age for Java byIBMJFactoryde RogeWave www. r ogewave. comJBuilderde lmprise www. i mpr i se. comVisualJ++ de Microsoft www. mi cr osof t . comForte de Sun www. sun. com

www. i bm. com

Estas herramientas proporcionan unEíD(Entorno Integrado de Desarrollo) que

permite el rápido desarrollo de programas. Le recomendamos utilice herramientEID para desarrollo de programasy ejecute las tareas integradas en la interfaz grá-fica de usuario, tales como:edición, compilación, construcción, depuraciónyayuda en linea.

1.6. APLICACIONESY APPLETS

Los programas en Java se dividen en dos grandes categorías:aplicacionesy applets.Las aplicaciones son programas autónomos independientes(standalone),tal comocualquier programa escrito utilizando lenguajes de alto nivel, comoC++,C, Ada,etc.; las aplicaciones se pueden ejecutar en cualquier computadora con un intérp-te de Javay son ideales para desarrollo de software. Losappletsson un tipo espe-cial de programas Java que se pueden ejecutar directamente en un navegador Wcompatible Java;losappletsson adecuados para desarrollar proyectos Web.

Losappletsson programas que están incrustados, ((empotrados))(embedded)enotro lenguaje; así cuando se utiliza Java en una página Web, el código Java se emp-

tra dentro del código HTML. Por el contrario, unaaplicaciónes un programa Javaque no está incrustado en HTML ni en ningún otro lenguaje y puede ser ejecutadde modo autónomo.

Naturalmente, a primera vista parece deducirse que las aplicaciones son mágrandes (y en principio más complejas) quelos applets.Sin embargo, esto no esnecesariamente verdad.

1.6.1 Semejanzasy diferencias entre aplicacionesy applets

Una de las primeras preguntas que suele hacerse el programador principiante eJava es: ;Cuándo debo utilizar una aplicacióny cuándo unapplet?La respuesta no

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 33/481

14 Java 2. Manual de programación

siempre es fácil, pero ineludiblemente pasa por conocer las semejanzas y d-cias que tienen ambos tipos de programas. Gran parte del código de las apl-nes y los uppletses el mismo, presentándose las diferencias al considerarlosentornos de ejecución de los programas.

Regla:Las aplicaciones se ejecutan como programas independienteso autónomos,

Losupplets deben ejecutarse en un navegador Web.de modo similar a cualquierotro lenguaje de alto nivel.

El desarrollo de las aplicaciones Java suele ser algo más rápido de desaquelosupplets,debido a que no necesita crearun archivo HTMLy cargarlo en unnavegador Web para visualizarlosresultados.

Sugerencia:Sisu programa no necesita ejecutarse en un navegador Web, elicrear aplicaciones.

Un aspecto muy importante en el desarrollo de programas es la seguridaLosuppletsnecesitan unas condiciones de seguridad para evitar daños en el sistemel que está funcionando el navegador, por tanto, tienen ciertas limitaciones. Alimitaciones a considerar son:

Losappletsno pueden leero escribir en el sistema de archivos de la comput-dora, pues en caso contrario podrían producir daños en archivosy propagarvirus.Losuppletsno pueden establecer conexiones entre la computadora de un u-rioy otra computadora, excepto que sea el servidor donde están almacelos applets'.Losappletsno pueden ejecutar programas de la computadora donde residnavegador, dado que podrían originar daños al sistema.

Por el contrario, las aplicaciones pueden interactuar directamente con la c-tadora sobre la que se ejecutan, sin las limitacionesanteriormentemencionadas.

Esta actividad comienzaya a desarrollarse conlas tecnologíasNapstercreadas por Fanning, un estu-diante norteamericanoa primeros delaño2000. Otras tecnologías similares conGnutella,Scour, etc.,y selasconocede modo genérico como tecnologíasP2P peer- ro-peer) .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 34/481

Introducción a Java 15

Notas:En general, se puede convertir un applet Java para ejecutarse como una apli-

Una aplicación no siempre se puede convertir para ejecutarse como uncación sin pérdida de funcionalidad.upplet, debido a las limitaciones de seguridad de los applets.

En este libro aprenderá fundamentalmente a escribir aplicaciones Java, aunqutambién dedicaremos atención especial a desarrollarapplets.

1.7. CREACIÓNDE PROGRAMASAntes de que una computadora pueda procesar un programa en un lenguaje de anivel, el programador debe introducir el programa fuente en la computadora y computadora a su vez debe almacenarlo en un formato ejecutable en memoria. Letapas clásicas en un lenguaje tradicional son:edición, compilación, enlace, ejecu-cióny depuraciónde un programa.

Las herramientas fundamentales empleadas en el proceso de creación de program

son, por tanto:editor, compilador, depuradory, naturalmente, elsistema operativo.El editores un programa utilizado para crear, guardar (salvaro almacenar) ycorregir archivos fuente (escritos en lenguaje Java). Elcompiladores un programaque traduce un programa escrito en un lenguaje de alto nivel a un lenguaje máq-na. Eldepuradores un programa que ayuda a localizar errores en otros programas.El sistemaoperativoes el programa con el que interactúa el usuario con el objetode especificar qué programas de aplicacióny/uoperaciones del sistema debe ejecu-tar la computadora (los sistemas operativos más utilizadosson: Windows9x/NT/2000,Linux, Unix, Solaris y Mac)'.

1.7.1 Etapas para crear un programa

La creación de un programa debe comenzar con la escritura del código fuencorrespondiente a la aplicación. Cada programa Java debe tener al menos una claUn ejemplo de una aplicación Java sencilla que sirva de modelo es el popula((Hol a mundo)) de Stroustrup (el autor deC++),modificado para que visualice unmensaje de bienvenida con el nombre de un pequeño pueblo andaluz.

' Microsoft ha anunciado el lanzamiento de la arquitectura.NETy el sistema operativo WindowsXP parael segundo trimestre de200 I .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 35/481

16 Java 2. Manual de programación

/ / E s t a apl i caci ón vi sual i za: Hol a Car chel ej o. Bi enveni do a J ava

p u b l i c class Bi enveni doI

p u b l i c s t a t i c v o i d mai n ( St r i ng[ ] ar gc)t

Cyc t em out . pr i nt l n( "Hol aCar chel ej o. Bi enveni do a J ava") ;

Las etapas que preparan un programa parasu ejecución son:

1. Crear una carpeta de proyectoen la que se recojan todos los archivos sign-

ficativos, incluyendo clases que se desean incluir.2. Utilizar un programaeditor que introduzca cada línea del programfuente en memoria ylo guarde en la carpeta proyecto como un archivfuente.

3. Utilizar el programacompilador para traducir el programa fuente enbyteco-de (código en bytes). Si existenerrores de sintaxis(un error gramatical de unalínea en un programa Java), el compilador visualiza esos errores en un-tana.

4. Utilizar el programa editor para corregir esos errores, modificandoy vol-viendo a guardar el programa fuente. Cuando el programa fuentelibre de errores, el compilador guarda su traducción enbytecodecomo unarchivo.

5 . El intérprete Java (JVM) traduce y ejecuta cada instrucción enbytecode.6. Si el código no funciona correctamente se puede utilizar el depurado

ejecutar el programa paso a paso y examinar el efecto de las instruccindividuales.

Edición

Editar el programaBi enveni do con un editor " escribiendo el texto correspon-diente al programa fuente. Debe darle un nombre al archivo fuente que conel programa( Bi enveni do. j ava). Por convenio, el archivo del programa fuen-te debe terminar con la extensión j ava. Almacene el programa en la carpetaC : \ j dkl . 3 . O 2\ bi n.

Los editores que sehan utilizado en la preparación de este librosonEdit.com y Notepad.exe(se tra- bajó bajo Windows98).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 36/481

Introducción a Java 17

Error típico: Palabras mal escritas: Java es sensible a las letras mayúsculas yminúsculasy el siguiente programadaríaerror:

Ipubl ic c lass Bi enveni doI

publi c s t a t i c vo id Mai n ( St r i ng[ ] ar gs )t

Sys t e m out . pr i nt l n( "Hol a Car chel ej o. Bi enveni do a J ava") ;

puesmaindebe escribirse sólo en minúsculas.

y Los nombresde métodos y variables con una letra minúscula.Losnombres de las clases comienzan normalmente con una letra mayúscula

Compilación

La orden siguiente compilaBi enveni do. ava:

j avac Bi enveni do. ] ava

Si no existen errores de sintaxis, el compilador genera un archivo denominad

Bi enveni do. c l a s s . El archivo no es un archivo objeto tal como se genera enotros compiladores de lenguajes de alto nivel. Este archivo se llamabytecode.Elbytecodees similar a las instrucciones máquina, pero su arquitectura es neutraly se puede ejecutar en cualquier plataforma que tenga el entorno en tiempo de ejecuciy el intérprete Java.

Nota:Una gran ventaja de Javaes que el códigobykcode puede ejecutarse endiferentes plataformas hardware y sistemas operativos.

El cornpilador enlazará el archivo del código fuente en Javay objetos impor -tados.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 37/481

18 Java 2. Manualde programación

Archivofuente

Objetosimportados

Compilador

Figura 1.3. Elcódigo fuente de un programase compila en bytecode.

Ejecución

Para ejecutarun programa Java, se debe ejecutar el bytecode del programa en -quier plataforma que soporte un interprete Java. La siguiente orden ejecuta e-go bytecode del programaaplicaciónBi enveni do. j ava:

j ava Bi enveni do

La salida de este programa se muestra en la Figura1.4.

Figura 1.4. La salida del programaBi enveni do.

1.8. COMPONENTES DE UNA APLICACIÓN

En un programa aplicación, destacanlos siguientes elementos:Comentarios,4Palabras reservadas, Sentencias, Bloques, Clases, Métodos,el métodoma in.

Comentarios

La primera línea del programaBi enveni do es un Comentario.LosComentariossirven para documentarlos programas y en ellos se escribenanota-

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 38/481

Introducción a Java 19

ciones sobre cómo funciona el programao sobre cómo se ha construido.Loscomentarios ayudan a los programadores actualesy futuroso a los usuarios delosmismos a comprender el programa. En Java, como en todosloslenguajes de pro-

gramación, los comentarios no son sentencias de programación y son, por con-guiente, ignorados por el cornpilador. En Java, los comentarios que constan una única línea están precedidos por dos barras inclinadas( / /), si se extiendensobre varias líneas están encerrados entre/ * y * / . Cuando el compiladorencuentra un comentario del tipo/ / ignora todo el texto que viene a continua-ción hasta el final de línea, y cuando el compilador se encuentra con un come-tario dela forma/ * y */ ignora todo el texto entre ambos juegos de caracteres.Ejemplos de comentarios:

/ / Esto es un coment ar i o r el at i vo/ * a l a S i e r r a de C a z o r l a , escr i t opor Mackoy * /

Existen también otra clase de comentarios, denominados comentariosde docu-rnentacion,que pueden ser extraídos a archivosHTMLutilizandojavadoc.Es nece-sario introducirlos entre los símbolos/ **. . . */ .

Palabras reservadas

Las palabras reservadaso palabras clave (Keywords) son palabras que tienen undeterminado significado para el compilador y no pueden ser utilizadas para otfines. Por ejemplo, la palabraw h i l e significa que se habrá de evaluar la expre-sión que viene a continuacióny, en función del valor de la misma, se ejecutaráno no se ejecutarán las sentencias siguientes. Otras palabras reservadasson

p u b l i c , s t a t i c , p r i v a t e , que representan modificadores. Otro ejemplo esc l a s s , una palabra reservada muy utilizada, que significa que la palabra quviene a continuación es el nombre de la estructura clase. Las palabras reservadse resaltarán en los códigos fuente que aparecen en el libro escribiéndolas negrita.

Precaución: Javaes sensible a las mayúsculas, por consiguiente,w h i l e esuna palabra reservaday While no es palabra reservada,

SentenciasUna sentencia representa una accióno una secuencia de acciones. Cada sentenciatermina con un punto y coma(; ). Ejemplos de sentencias son:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 39/481

20 Java 2. Manual de programación

z = 15;

z = z+10u;

/ / est a sent enci a asi gna 15 l a/ / a var i abl e z/ / e s t a sent enci a añade 130/ / ai val or de z

p r i n t l r .( "Bi enveni do S r . Mackoy") ; / / sent enci a de vi sual i zaci ón

Bloques

Unbloquees una estructura que agrupa sentencias.Los bloques comienzan con unallave de apertura( { ) y terminan con una llave se cierre( }). Un bloque puede estardentro de otro bloquey se dice que el bloque interior está anidado dentro del ex-rior o que ambos bloques estánanidados:

z = 15;z = 2+100;if ( z > 225)

z = 2 - 5;

Clases

La clase es la construcción fundamental de Java y, como ya se ha comenconstituye una plantillao modelo para fabricar objetos. Un programa consta una o más clases y cada una de ellas puede contener declaraciones de datmétodos.

Métodos

Un métodoes una colección de sentencias que realizan una serie de operaciodeterminadas. Por ejemplo:

Sys t em out . pr i nt l n( "Bi enveni do a Car chel ej o") ;

es un método que visualiza un mensaje en el monitor o consola.

Métodoma i n I

Cada aplicación Java debe tener un métodom a i n declarado por el programadorque define dónde comienza el flujo del programa. El métodom a i ntendrá siempreuna sintaxis similar a ésta:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 40/481

Introducción a Java 21

public static void ma;? ( S t r - n q ; : a r a s )

1.9. HERRAMIENTAS DE DESARROLLO JAVA

El JDK viene con un conjunto de herramientas tal como se comentó anteriormentun compilador Javaíjavac),una Máquina Virtual Javaíjava),una herramienta paravisualizarapplets (applet Viewer),un depurador elementalí jdb)y una herramientade documentacióníjavadoc).Estas herramientas se utilizan para crear, depurar,

documentar y usar programas Java. Dependiendo desuentorno ysu plataforma, losdetalles reales de cómo instalar JDKo cualquier conjunto de herramientas Java,difieren de unos fabricantes a otrosy lo más recomendable será seguir lasinstnic-ciones que nos ofrezcan ellos.

Las herramientas de desarrollo más importantes se pueden encontrar en los sitiode Internet declarados en el apartado ((Especificaciones del lenguaje Java)). Estherramientas proporcionanun entorno integrado de desarrollo,EID (IDE, Integrated Development Environment)y sirven para proporcionarun desarrollorápido de programas de modo eficientey productivo.

1.9.1. El entorno de desarrollo JDK

La creación de un programa en Java, ya seanappletso aplicacionesconvenciona-les, necesita la instalación de las herramientas de desarrollo de Java. ElKit deDesarrollo de Java (JDK) es una donación de Sun Mycrosystem a la que podemoacceder visitando el sitio que posee Sun en la Red. Como JDK es gratuitoy las ver -siones que se pueden bajar de la Red están actualizadas, es muy frecuentesu uso por los programadores, no obstante la existencia de los entornos de desarrollo int-grados que pretenden facilitar las tareas de edición, compilación, ejecución y dep-ración, haciendo todas ellas directamente accesibles desdelosmismos.

Para trabajar con JDK en Windows95/98/NT,resulta cómodo y eficaz abrirvarias ventanas,y usarlas de la forma siguiente:

En una ventana abrirá un editor, comoEdito Notepad,donde se irá escribien-do el código.Otra ventana le será necesaria para tener acceso al indicador(prompt)del siste-may poder invocar desde allí al compilador y a las demás herramientas del JDKEn una tercera puede tener abierto un archivo con documentación sobre elAPIde Java.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 41/481

22 Java 2. Manual de programación

Puede usar una cuarta ventana para abrir un navegador con soporte Javejemplo2ilicrosoft Exploreren versión4.0o superior,o elappletviewer para laverificación del correcto funcionamiento delos applets.

1 . lo . UNA APLICACIÓNPRÁCTICADEJAVA

Inicialmentese expondrá la creación de programas convencionales, y para vestructura básica así como las fases a las que antes aludíamos, necesarias suejecución, seguiremos el siguiente ejemplo: Considere que trabaja con elJDKins-talado en unPC bajo Windows9xy cree la carpetalibroen el directorio raíz de su

disco de arranque. Después, situándose dentro delibro, cree otra denominadaT2ri7aOl.Abra una ventana DOS, trasládese a la carpetaTerna01y llame al editor(Edit):

' L .. I d i ~ . d c w s >c 0 C: \ ; i br o\ t emaOli : \ l i br o\ Tema31>e d i t

Una vez dentro deEditcopie el texto incluido en la Figura 1.5 fijándose ate-mente para no omitir en su copia ninguno de los caracteres ni signos de pun

que aparecen enél.AI terminar, guárdelo con el nombreE] empl ol . j ava y salgadel editor.

ipor t j a t J 3 . i 3 . < ;

' L u i s Joyaner &giJi1ar

Jl1a;s E j e r n p l c ifn u t i l i t s t a t i c w i d main ( s t r i n g [ ] a r g ] {

) a programar en J AVA ") ;

Figura 1.5.

El archivo creado es elarchivo fuente,al que en Java también se le llamaunidad

de cornpiltrcicín.Dicho archivo debe ser almacenado con el nombreE] empl ol , yaque en Java el código siempre ha de estar dentro de una clase y el nombre d-vo debe coincidir con el de la clase que tiene el métodom a i n ( ) . En el caso delejemplo no sería necesario considerar esta situación, ya que sólo hay una carchivo fuente debe escribirse dividido en secciones bien definidas, separa

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 42/481

Introducción a Java 23

líneas en blanco y precedidas por un comentario identificativo de lasmisinas.Esimportante guardar dicho archivo con laextensiónjava.Con estos pasos habrá ter-minado la fase de edición del programa.

A continuación, el programa debe ser compilado, es decir, traducido abytecode(código byte), quees el lenguaje que entiende el intérprete de Java. Para compilarun programa con el JDK hay que invocara j a v a cy especificar el nombre del pro-grama a compilar sin olvidar reflejar su extensióníjava). Ahora debe tener en cuen-ta que para efectuar la compilación y ejecución desus programas tal y como seindica a continuación debe modificar la variable de entorno p a t h , añadiendo al

p a t h anterior el subdirectorio o carpeta donde se encuentranlos programas paracompilar, ejecutar depurar y documentar las aplicaciones(javac, java,,jdh y ,jaw-doc respectivamente). Esta modificación deben introducirse enel archivoC: \a u t oexec. a t, para quelosnuevos valores se establezcan cada vez que searranque la computadora.

S E T PATH=%PATHL&; C: \ j dk l . 3. 1\ bi n

o bien

SET PATH=OEATHcc; C: \ ~dkl . 4 \ b i nparatrabajarCon la1.4Beta)

Así mismo, es conveniente adaptar el contenido dec l a s s p a t h para que .lava pueda localizar siemprelais claseis creadais.

SET CLASSEATH=. ; C: \

El valor asignado aCLASSPATHhace que Java busque las clases en la carpetaactual y el directorio raíz. Suponiendo establecidoslosanteriores valores para com- pilarEj e m p l o l . j a v a bastaría la siguiente orden:

C: \ l i br o \ TemaOl > j avac Ej er npl ol . j ava

Por último, será necesario llamar al intérprete de Java para que el programa cextensiónc l a s s surgido en la operación de compilación y que contiene el código byte pueda ser ejecutado. Para ello, cuando se dispone del JDK, en la línea de órneso ventana de mandatos del sistema se escribirá la palabra j a v a seguida por elnombre del programa a ejecutar, sin especificar la extensión del mismoy teniendoen cuenta que, si la clase pertenece a un paquete, el nombre de la misma debeir pre-cedido porel del paquete de la forma siguiente:

C: \ l i br o \ TemaOl > j ava l i br =. TemaOl . i j emF l ol

o bien.

C: \ W NDOWS> j a v a l i br o . TemaOl . Ej empl o1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 43/481

24 Java 2. Manual de programación

dadoel valor establecido para la variableCLASSPATH,que hace que el intér - prete de Java busque en el directorio raízy a partir de ahí en aquellos cuyo nom- bre coincida conlos elementos del paqueteC: \ l i br o \ TemaO1. Es decir, se pasa como paráinetroa j a v ael nombre de la clase especificando el paquete al q pertenece, sin incluir la extensióny distinguiendo entre mayúsculasy minúscu-las. La salida obtenida con la ejecución del programa es la impresión en pde la línea

C c r n i e n z oa pr ogr amar en J AVA

Una breve explicación del código fuente escrito es la siguiente:

La primera instrucción sirve para indicar el paquete al que pertenecerá laque está siendo definida. Los paquetes son un mecanismo para organizclases.y cuando se declara que una clase pertenece a un paquete, dicha deberá ser almacenada enun subdirectorioo carpeta cuyo nombre coincida conlo especificado como nombre del paquete.En nuestro caso, como el paquete sedenomina1 b r o . Tema O1, la claseEj emp1o1 deberá ser almacenada en lacarpeta1 br o\ TemaO1.La sentenciai mpor t va seguida por el nombre de un paquete y se utiliza p poder referirsemásadelante a clases pertenecientes a dicho paquete sin nesidad de cualificarlas con un nombre de jerarquía de paquetes.En el ejemplo,noexiste aplicación posterior.La tercera línea es un comentario (comentario de una línea)La palabra reservadacl as s permite especificar que se va a definir unclase, una palabra clave o reservada es una palabra especial con un si-cado preestablecido en el lenguaje Java. Para delimitar la clase, se emllaves,{ } .Para ejecutar el programa, el intérprete de Java comienza llamando al -

do mai n ( ) ; como este método se llama antes de la creación deun objeto,ha de declararse comos t at i c y así se le podrá llamar sin tener que refe-rirse a una instancia particular de la clase; como además se llama por cfuera desu clase también tiene que ser declarado comopubl i c, que es laforma de permitir que un miembro de una clase pueda ser utilizado por-go que está fuera de la misma. La palabra reservadavoi d indica quemai nno devuelve nada.St r i ng [ ] args es la declaración de un array de cade-nas, mediante el que la clase podría tomar un número variable de parámen la línea de comandos, aunque no se use es necesario incluir este patrocuando se define el métodomai n ( ) . Se emplean llaves,{ }, para delimi-t a r c I nietodo.

* I . >I\;I. la pantalla de la coinputadora es un objeto predefinido cuyareferen-1 . t . La claseSyst em pertenece al paquete j ava. l ang que%, : , .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 44/481

- -

se importa automáticamente y, por tanto, no necesita cualificación. El méto p r i n t n ( ) toma la cadena que se le pasa como argumento y la escribe en lasalida estándar. Todas las sentencias en Java deben terminar en; . Tenga en cuen-ta que Java es sensible a las mayúsculas, por lo que considera distintos losidenti-ficadores si se cambian mayúsculas por minúsculaso viceversa, es decir,s y s t e my S y s t e m son identificadores diferentes.

. Cir,5*’

I .I I . ESTRUCTURA DEUNPROGRAMAA P L I C A C I ~ NENJAVA

Para crear programas en Javahay que tener en cuenta que toda implementaciónque se realice se efectuará encapsulada en una clase. Un programa aplicación fu-te en Java se podría considerar formado por las siguientes partes:

Una sentencia de paquete(package) que también puede ser omitida.Una, ningunao varias sentencias de importación( i m p o r t ) .Una serie de comentarios opcionales colocados en diversos lugares del pr-

Declaraciones de las clases privadas deseadas; puede no haber ninguna.

Una declaración de clase pública.

grama.

A su vez una declaración de clase comenzará con la sentenciac l a s s y podrácontener:

Declaraciones de variables de la clase (estáticas).Declaraciones de variables de instancia.Definiciones de constructores.Definiciones de métodos.

Dado que una clase es un modelo y las instancias son los objetos de esa claselas variables de instancia se las denomina así porque cada objeto contendrá ucopia propia de dichas variables, de forma que los datos de un objeto se encont-rán separados delosde otro objeto, utilizándoselosmétodos para la modificaciónde los valores de las variables de instancia. En consecuencia, un programa muy s-cillo que se puede crear en Java es:

public class E ernplo2

public static void mai n ( Sz r i ng[ l ar gs )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 45/481

Java 2. Manual de programación

formado exclusivamente por una declaración de clase pública

Compilación; j avacEjecución: j ava Ej empl o2

Las clases de un programa contienen métodos, interactúan entresí y no necesi-tan contenerun métodomai n , pero éstesí será necesario en la clase que consti-tuya el punto de partida del programa. Tenga también en cuenta que lasappletsnoutilizan el métodomai n .

Ladeclaraciónde métodos en una clase se puede efectuar en cualquier orden cada una de ellas se compone por una cabecera y un cuerpo. La cabecera del m-do debe contenersu nombre, una lista de parámetrosy el tipo de resultado. Se espe-cificarávoi d cuando el método no devuelva resultados. En la implementación dmétodo, cuando éste no haya sido declaradovoi d, se utilizará la instrucciónreturn para devolverun valor al punto de llamada del método. La lista de pará-metros consistirá en cero o más parámetros formales cada uno de ellos prece por su tipo y separados por comas. Cuando se llama a un métodolos parámetrosactuales se asignan alos parámetros formales correspondientes. Entrelos paráme-tros actuales(losde la llamada)y formales(losde la declaración) debe existir con-cordancia en cuanto a número, tipo y orden. de métodos pueden serlossiguientes:

Ejemplo

nombre - funcion (lista de parámetros)

/ / decl ar aci ón de var i abl es

/ / sent enci as ej ecut abl es/ / sent enci a r et ur n con el val or a devol ver

Ejemplo

void nombre - procedimien to (tipo4 nombre - par3, t i p o 5

decl ar aci ón de var i abl es

/ / sent enci as ej ecut abl ec

En el primer ejemplo,t i p o 1 representa el tipo de dato devuelto por 'el méto-do; cuando el método no devuelve ningún valor se especificarávoi d como tipo

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 46/481

Introducción a Java 27

devuelto. La lista de parámetros es una secuencia de parejas tipo-identificador sepa-radas por comas. Observe el formato expuesto en el segundo ejemplo.

En Java es posible agrupar sentencias simples, encerrándolas entre una pareja

llaves para formarun bloqueo sentencia compuesta; las variables declaradas den-tro deun bloquesólo son válidas en dicho bloque y, si éste tuviera otros anidados,en los interiores aél. En un programa Java se podrán declarar variables tanto den-tro como fuera delos métodos. Las variables declaradas dentro del cuerpo de unmétodo se crean cuando se ejecuta el cuerpo del métodoy desaparecen después. Lasvariables que se declaran fuera del cuerpo de un método son globales a la clase. que se declaran comof i n a l y st at i c son, en realidad, constantes.

1.1 1 I Referencia a miembros de una claseEn los programas escritos en Java se hará referencia a los miembros de una clamétodos y variables de instancia, desde otras distintas de aquellas en las que fuedefinidos, paralo que generalmente será necesario declarar un objeto de la claseadecuaday a continuación escribirnombr eObje t o .nombr eComponent e.Noobstante, hay ocasiones en las que se utilizan métodosy variables de instancia sinnecesidad de efectuar la declaración de ningún tipo de objeto, especificando par

llamadanombr ecl as e. nombr eComponent e.Para que esto pueda ocurrir y aun miembro de una clase sea posible llamarlo con el nombre de la clase en la ha sido declarado, sin tener que referirse a una instancia particular de la mismdicho miembro debe haber sido declaradost at i c (estático).

1 I 2. ERRORES DE PROGRAMACIÓN

Los errores de programación son inevitables, incluso para programadores exp-mentados. El proceso de corregir un error(bugen inglés) se denomina depuración(debugging)del programa. Cuando se detectaunerror en Java, se visualiza un men-saje de error que devuelve la posible causa del error. Desgraciadamente los erroa veces no se detectany los mensajes de errorno son siempre fáciles de interpretar.Existen tres tipos de errores:errores de compilación(sintaxis),errores de ejecucióny errores lógicos.

1I

2.1. Errores de compilación (sintaxis)Los errores de sintaxis ocurren cuando el código viola unao más reglas gra-maticales de Java.Loserrores de sintaxis se detectan y visualizan por elcom-piladorcuando se intenta traducir el programa, por esta razón se denomina

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 47/481

28 Java 2. Manual de programación

también errores de compilación. Los errores de compilación provienen de-res en la construcción del código tales como escribir mal una palabra res-da, omitir algún signo de puntuacióno bien utilizar, por ejemplo, una llave de

apertura sinsu correspondiente llave de cierre. Estos errores suelen ser fácde detectar ya que el compilador suele indicar dónde se producen las poscausas.

Ejemplo

La compilación del siguiente programa produce errores de sintaxis:

/ / e s t e progra r ra cont i ene er r or es de s i nt axi s public class Demo

public static void mai n ( St r i ng[ ] args )

z=50;Cys t en. out . pr i nt l n( z +l O);

La ejecución de este programa produceun error detectado por el compilador delentornoJDK.

Figura 1.6. Elcompilador delJDKdetecta un error de sintaxis.

El error de sintaxis es la no declaración previa de la variablez, que se utiliza endos sentencias.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 48/481

Introducción a Java 29

Nota: Error de sintaxis: Es una violación de las reglas de gramática de Java,detectada durante la traducción del programa.

1 2.2. Errores de ejecución

Loserrores de ejecución son errores que producen una terminación anormal y quse detectan y visualizan durante la ejecución del programa. Unerror de ejecuciónse produce cuando el usuario instruye a la computadora para que ejecute una ope-ración no válida, tal como dividirun número por ceroo manipular datos indefini-doso no válidos en la entrada.

Un error ocurre cuando el usuario introduce un valor de entradaimprevisto que el programa no puede manejar. Por ejemplo, si el programa espeleer un número, pero el usuario introduce una cadena de caracteres. En Java,loserrores de entrada hay que declararlos en una cláusulat hr ows o bien capturarlosy tratarlos directamente dentro del método en el quese pueden producir (véase elCapítulo13,((Manejo de excepciones))).

Ejemplo

public class

private static intstatic void ,

public static void a r g s )

pru eb a ;

Figura 1.7. Errorde ejecución.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 49/481

30 Java 2. Manual de programación

AI invocar al métodopr ueba ( ) , se produceun error en tiempo de ejecución:

j ava. 1ang. Ar i t hmet i cEx cept i on:/ by zero

que indicaun intento de dividir por cero (valor dez),operación no válida.r I

Nota: Error de ejecución: Se intentó ejecutar una operaciónno válida que fuedetectada durante la ejecución del programa.

1.12.3. Errores lógicos

Loserrores lógicos ocurren cuandoun programa realizaun algoritmo incorrectoy no ejecuta la operación que estaba prevista. Existen muchos tipos de ra para que se produzcan errores lógicos. Normalmentelos errores lógicos son difí-ciles de detectar, ya que no producen errores en tiempo de ejecucióny no visua-

lizan mensajes de error.El único síntoma de que se ha producidoun error lógico puede ser la salida incorrecta del programa. Se pueden detectar errores lócomprobando el programa en su totalidady comparando su salida conlos resul-tados calculados. La prevención de errores lógicos se puede realizar verifiel algoritmoy el programa correspondiente antes de comenzar el proceso de-cución.

Nota: Error lógico: Es un error producido por un algoritmo incorrecto.

Por ejemplo, la instrucción

Sys t em out . pr i nt l n( " Si e de Cazor l a" ) ;

no muestra la frase que se deseaba, pues no se ha escrito bien:

Sys t em out . pr i nt l n( "Si er r a de Cazor l a ") ;

pero el compilador no puede encontrar el error ya que la primera sentencia -tácticamente correcta.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 50/481

CAPI T U

Característicasdellenguaje JavCONTENIDO

2.1. Palabras reservadas.2.2. Identificadores.2.3. Tipos de datos.2.4. Tipos simples (primitivos).2.5. Variables.2.6. Constantes.2.7. La biblioteca de clases de Java.2.8. Conceptos básicos sobre excepciones.2.9. La claseNumber y sus subclases.

2.10. Las ClasesChar act er y Bool ean.2.1 Entraday salida básicas.2.1 2. Operadores.2.13. La sentencia de asignación.2.1 4. Expresiones.2.15. Class Mat h.2.16. Paquete j ava. mat h.2.1 7. Conversiones de tipos. Operadores molde.2.1 8. Operadores aritméticos.2.1 9. Operadores relacionales.2.20. Operadores lógicos.2.21. Operadores de manipulación de bits.2.22. Operadores de asignación adicionales.2.23. Operador condicional.2.24. Prioridad delos operadores

31

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 51/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 52/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 53/481

34 Java 2. Manual de programación

2.3. TIPOS DE DATOS

Java es un lenguaje fuertementetipeado;esto implica que constantes, variables y

expresiones tienen un tipo asociado y toda variable que interviene enun programadebe ser declarada antes de poder ser utilizada. Además, Java comprueba la-raciones de asignación, el paso de parámetros y las expresiones para asegusobre la compatibilidad entrelos tipos de datos que intervienen en ellas.

Una primera clasificación delos tipos de datos en Java nos obligaría a distinguientretipos simplesy definidos por el usuario,debido a que tienen característicasmuy diferentes, constituyendolos tipos simples la base sobre la que se crearánlostipos definidos por el usuario.

2.4. TIPOS SIMPLES (PRIMITIVOS)

Lostipos simples@/*irnitivos)no están orientados a objetos y pueden subdividiren enteros, reales, datos de tipo carácter y lógicos o booleanos, caracterizácada uno de estos grupos por el conjunto de valores que pueden tomar y las -ciones que se pueden realizar sobre ellos. Cada tipo de dato tiene un do(rango) de valores.El compilador asigna espacio de memoria para almacenar cavariableo constante con arreglo asu tipo.

Enteros

Java ofrece cuatro tipos de enteros:byt e, shor t , i nt y l ong. Todos ellos ad-miten valores tanto positivos como negativos, y cada uno permite almacenar-res en un determinado rango,definiéndosecomo valores con signo de8, 16, 32 y64 bits.

Tabla 2.2. Tiposprimitivos enteros

Nombre. Tamaño Rango de valoresen bits

Declaración

byt e 8 - 128 a 127 b y t e var l ;short 1 6 - 32768 a 32767 s h o r t var2 ;

i n t 32 - 2141483648 a 2147483647 i n t v ar 3;l ong 64 - 9223372036854715808 a l o n g var 4;

9223372036a54175801

Es posible escribir constantes enteros en otras bases distintas a la decioctal, hexadecimal. Una constante octal es cualquier número que comienz

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 54/481

Caracteristicasdel lenguaje Java 35

un O y contiene dígitos en el rango1 a 7 ( O1234 ) . Una constante hexadeci-mal comienza conOx y va seguida delos dígitosO a 9 o las letrasA a F( OxF10) .

Reales

Lostipos de datos de coma flotante permiten almacenar números muy grandes, mu pequeños o que contienen coma decimal. Java soportados formatos de coma flo-tantef l oat y doubl e. El tipo f l oat utiliza32 bits para el almacenamiento yguardalosvalores con precisión simple(6 Ó 7 dígitos).El tipodoubl e utiliza64 bits para el almacenamientoy guardalosvalores con mucha mayor precisión(14ó 15

dígitos); suele ser el tipo devuelto por muchas funciones matemáticasy suele ser elmás empleado.

Tabla 2.3. Tipos primitivos de coma flotante~ ~~

Nombre Tamañoen bits

~~ ~~ ~~ -

Rango de valores Declaracióne inicialización

f l o a t 32 (precisión simple)3, 4E- 38 a 3 , 4 E3 8 f l o a t num =2. 7182f ;doubl e 64 (precisióndoble) 1, 7E- 308 a 1, 7E308 double num2=2. 7182d;

Carácter

El tipo de datoschar de Java se utiliza para representar un carácter, éste tipoemplea16 bits para el almacenamiento de un caráctery lo efectúa en formatoUnicode. Unicode presenta dos ventajas:(1) permite a Java trabajar conloscarac-teres de todoslos idiomas;(2) sus primeros127caracteres coinciden conlosdel

códigoASCII.Tabla 2.4. Tipo primitivo para representar un carácter

Nombre Tamaño Rango de valores Declaraciónen bits e inicialización

c h a r 1 6 caracteres alfanuméricos char l e t r a = ’ a ’ ;

Un literal carácter representaun caráctero una secuencia de escape encerradaentre comillas simples. Por ejemplo,‘ c ’ , ‘ D‘.Una cadena de caracteres(string),es un conjunto de ceroo más caracteres (incluyendo las secuencias de escape) ence-rrados entre dobles comillas.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 55/481

36 Java 2. Manual de programación

Ejemplo

Ejemplos de cadenas

"Cr,a caaena"" C i e r r a U e Aracena""C; er r a de C a z o r l a "

" Pr i mer a l i nea \ r \ n Segunda l i nea"" P r i r ? e r a pági na \ f Segunda pági na "

,,P,ol>;mna ; \ t Col umna 2"

,,1

Regla:En Java, el tipo char representa un carácter.

En Java, para representar una cadena de caracteres se utiliza una estructudatos denominadaS t r i n g . El concepto destring se explica con detenimiento enel Capítulo8, ((Cadenas y fechas)).

Regla:Una cadena se debe encerrar entre dobles comillas. Un tipo carácteresun Único carácter encerrado entre simples comillas.

Loscaracteres Java utilizanUnicode,que esun esquema universal paracodifíca-ción de caracteres en16 bits establecido por el consorcio Unicode para soportarintercambio, procesoy presentación delos textos escritos enlosdiferentes idiomasdel mundo (véase el sitio Web de Unicode enwww .Uni code. o rg ) . Unicode tomados bytes, expresados en cuatro números hexadecimales que corren de' uOOOO' a' \ uFFFF' .La mayoría de las computadoras utilizan el código ASCII (Uniincluyelos códigosASCI1de ' \ uOOOO'a ' \ uOOFF' ) .En Java se utiliza el códi-go ASCII, así como Unicode ylassecuencias de escape como caracteres especiales

Tabla 2.5. Secuencias de escape~ ~ ~ ~ ~~~~~

Secuencia Significado

\ b\ t\ n\ f\ r\\ '\ \\ uxxxx

RetrocesoTabu lac ih Nueva líneaAvance de páginaRetorno de carro sin avance de línea

Dobles comillasComillas simplesBarra inclinada inversaCarácter U n i co d e

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 56/481

Características del lenguaje Java 37

Ejemplo

Ejemplos de secuencias de escape:

' \ k '' \ n '' \ t '' \ u015Ef

Tabla 2.6. Ejemplos de caracteres especiales

Carácter ASCII Unicode

Retroceso de espacioTabulaciónAvancede líneaRetorno decarro

\ b\ t\ n\ r

\ u008\ u009\ uOOA\uOOD

Precaución: \Una cadena debe encerrarse entre dobles comillas.Un carácter es un Único carácter encerrado entre simples comillas.Un carácterUnicodese debe representar mediante el código' \ uXXXX' .

Para almacenarun carácter, se almacena el código numérico quelo representa; por tanto, internamentelos caracteres son númerosy esto capacita a Java para rea-lizar algunas operaciones numéricas con datos de tipoc h a r .

Ejemplo

class CocMayuccu; aci

public static void mai n ( St r i ng ar gc i ] )

char c ;

c=' a' - 32;Cys t e m out . pr i nt( "El carácter es " ) ;

Cys t ex. out . pr i nt l n( c )c t t ;Syst em. cut . p r i n t( "Si gui ent e car áct er " ) ;

Syc t en. out . p r i n t l n ( c );

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 57/481

38 Java 2. Manual de programación

Lógico (boolean)

Un dato de tipo lógico puede tomar exclusivamente uno entrelos dos siguientes

posibles valores:t r u e , f a l s e (verdadero falso).Tabla 2.7. Tipo primitivo para representar datos lógicos

Nombre Rango de valores Declaración e inicialización

boolean t r u e , f a l s e boolean bandera = f a l s e ;

Las variables booleanas almacenan el resultado de una expresión lógica, t-do en cuenta que ésta puede estar formada por una Única constanteo variable de tipológico. Su contenido puede ser directamente mostrado por pantalla mediamétodo p r i n t l n ( ) .

Ejemplo

package l i br o. Tema02;

c la ss Ej empl o2t

publ ic s ta t ic vo id mai n ( St r i ng[ ] arg){ byte di a;

boolean cor r ecto ;

di a = - 3;correcto = di a > O;Sys tern. out .pr i nt ( Di a ) ;

Sys t em out . pr i nt ( di a) ;Sys t em out . pr i nt ( " correcto = " ) ;

Cys t em out . pr i nt l n( c or r ec t o) ;

2.5. VARIABLES

Las variables almacenan datos cuyo valor puede verse modificado durante l-cución de un programa. Las variables se utilizan para representar tipos de datodiferentes. En Java hay que distinguir entre variables por valory objetoso variables por referencia; las variables de tipo simple son variables por valor.

Declaración de variables.Para utilizar una variable se necesitadeclararlaeindicar al compilador el nombres de la variable, así como el tipo de dato querepre-

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 58/481

Características del lenguaje Java

senta. Esta operación se denominadeclaración de variables.Toda variable debe serdeclarada antes de poder ser utilizada. Para declarar variables de tipo simpleespecifica su nombrey su tipo, que define tantolosdatos que la variable va a poderalmacenar como las operaciones que tendrá permitidas. La sintaxis es, por tanto

nombr evar i abl e;

Ejemplo

Declaraciónint z ; / / decl ar a como una var i abl e ent er adouble base; / / decl ar a base como var i abl e doubl echar b; / / decl ar a b como var i abl e char

Nota:Las variables permiten almacenar datos, de entrada, salidao datos inter -medios.

Consejo:Losidentificadores se utilizan para nombrar variables, constantes,métodos, clases y paquetes.Losidentificadores descriptivos son losmásutili-

zados, ya que hacenlos programas más fáciles de leer. Java es sensible a lasmayúsculas, por consiguientey z son identificadores diferentes.

Sentencias de asignación.Después que una variable se declara, se puede asignarun valor a esa variable utilizando una sentencia de asignación. La sintaxis de asignación tiene el siguiente formato:

var i abl e = expr esi ón;

Es preciso tener en cuenta que una expresión es un conjunto de operadoresoperandos, pero una única constanteo variable también constituye una expresión.

Ejemplo

= 5; / / asi gna al ongi t ud = 1.0 / / asi gna a l ongi t ud

/ / asi gna a b

Regla:El nombre de la variable debe estara la izquierda5 = z; es ilegal.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 59/481

40 Java 2. Manual d e programación

Como ya se indicó anteriormente, una expresión representa un cálculoimplica valores, variablesy operadores.

super f i ci e = 3. 141592 * r adi o * r adi o;z = z t i ; / / e l val or de z t 1 s e d s i y n d a l a var i abl e z

Precaución: La sentencia de asignación utiliza el signo igual(=). Tenga cui-dado, no utilizar: = que se utiliza con frecuencia en otros lenguajes de pro-gramación.

t i poDat o nombr evar i abl e = val or - i n i c i a l ;

Declaración einicializucióride variables enunsolo puso.Se puede declarar einicializar una variable enun solo paso en lugar de endos pasos como se hamos-trado en las operaciones.

Ejemplo

Declaración con asignación del valor inicial Declaración y asignación deunvalorchar r espuest a = ‘ S ‘

i n t cont ador = 1;

f l o a t peso = 156. 45f ;

char r espuest a;r espuest a=’ C ’ ;

i n t cont ador ;cont ador =l ;

f l o a t peco ;

peso=156. 45f ;

Precaución: Una variablesedebe declarar antes de que se le pueda asignar unvalor.Auna variable se le debe asignar un valor antes de que se pueda leer un método.

Consejo:Siempre que sea posible, es conveniente declarar una variableyasignarle su valor inicial enun solo paso, ya que esta acción facilitala inter - pretación del programa.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 60/481

Características de/ lenguaje Java 41

Ámbito.Es importante el lugar donde se efectúa la declaración de las variables pues éste determina su ámbito. En Java es posible agrupar sentencias simples, en-rrándolas entre una pareja de llaves para formar bloqueso sentencias compuestas yefectuar declaraciones de variables dentro de dichos bloques, al principio de lmétodoso fuera de ellos. Una sentencia compuesta nula es aquella que no contienninguna sentencia entre las llaves{ }.

Ejemplo

i n t i =25;double j =Mat h. sqr t (20);

i + + ; j += 5;

Sys t em out . pr i nt l n( i +" " t j );

{ i n t aux = i;i = ( i n t ) ( j ) ;j = aux;

/ / A cont i nuaci ón comi enza un bl oque

1 / / Fi n del bl oqueSys t em out . pr i nt l n( i + t j ) ; / / aux aquí no est á def i ni da

Es decir, en Java es posible declarar variables en el punto de utilización de la

mismas dentro del programa, pero habrá de tener en cuenta que su ámbito será bloque en el que han sido declaradas. Como ya se ha indicado, un bloque de se-tencias se delimita entre dos llaves y las variables declaradas dentro de un bloqsólo son válidas en dicho bloque. Si un bloque tuviera otros anidados, en los int-riores aél. Nose pueden declarar variables en bloques interiores con el nombre deotras de ámbito exterior.

Las variables declaradas dentro del cuerpo de un método sonvariables locales,y sólo existirány se podrá hacer referencia a ellas dentro del cuerpo del método. Lasvariables que se declaran fuera del cuerpo de un método son variables de instancy cada instancia de la clase tendrá una copia de dichas variables. Las variabldeclaradas fuera del cuerpo de los métodos y en cuya declaración se especifique palabrast at i c son variables de clase, esto quiere decir que no se hará una copiade ellas para cada uno de los objetos de la clase y, por tanto,suvalor será compar -tido por todas las instancias de la misma.

2.6. CONSTANTES

Lasconstantesson datos cuyo valor no puede variar durante la ejecución de un pro-grama. En un programa pueden aparecer constantes de dos tipos:literalesy simbó-licas.Lasconstantes simbólicaso con nombrerepresentan datos permanentes que

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 61/481

42 Java 2. Manual de programación

nunca cambiany se declaran como las variables, pero inicializándose enel momentode la declaración y comenzando dicha declaración con la palabra reservadaf i n a l ,que sirve para que el valor asignado no pueda ser modificado. Lasconstantes de clase

se declaran en el cuerpo de la clasey fuera de todoslos métodos, siendo necesariocomenzarsu declaración con las palabras reservadasf i na1 y c t at i c. La palabraclavef i n a l es obligatoria en la declaración de constantes, mientras quest at i cconsigue quesólo exista una copia de la constante para todoslosobjetos que se decla-ren de esa clase. La sintaxis para declarar una constante de clase es:

s t a t i c f i n a l t i poDat o NOMBRECONSTANTE= val or ;

Ejemplo

1 . s t a t i c f i n a l double PI = 3. 141592;super f i ci e = r adi o * r adi o * P I ;

2. c l a s s Pr uebai

s t a t i c f i n a l i n t MAX= 700;void Mét odo ( )

/ / . . .I

/ / .1

Precaución:El nombre de las constantes se suele escribiren mayúsculas.Antes de utilizar una constante debeserdeclarada. Una vez quese ha declara-do una constantenose puede modificar su valor.

Las constantes literalessonvalores de un determinado tipo escritos directame-te en un programa. Dichas constantes podrán ser enteras, reales, lógicas, cacadena de caracteres,o el valornul l .

Constantes enteras

Las constantes enteras representan números enterosy siempre tienen signo. Laescritura de constantes enteras en un programa debe seguir unas determireglas:

Noutilizar comas ni signos de puntuación en números enteros.123456 en lugar de1 2 3 . 4 5 6 .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 62/481

Características del lenguaje Java 43

Puede añadirse unaL o 1 a1,finaldel número para especificar que se trata de

Si se trata de un número en base decimal no podrá comenzar por cero.un l ong 123456L.

0123 es una const ant e ent er a en base oct al0x123 es una const ant e ent er a en hexadeci mal

cimal mediante la colocación deOx o bien OXdelante del número. La notación octalse indica poniendo un cero delante del número y la hexade-

Constantes reales

Una constante flotante representa un número real, siempre tiene signo y repr-

senta aproximaciones en lugar de valores exactos. Las constantes reales tienen tipodoubl e por defecto, aunque también pueden ir seguidas por unad o D queespecifique su pertenencia a dicho tipo. Cuando se les añade unaf o F se obli-ga a que sean de tipof l o a t . Para escribir una constante real se puede especifi-car su parte entera seguida por un punto y su parte fraccionaria,o bien utilizar lanotación científica, en cuyo caso se añade la letrae o E seguida por un expo-nente.

82. 341 equivale a 82. 347d 2. 5e4 equivalea 2 5O OOd4E- 3F equivaleaO. 004f 5. 435E- 3 equivaleaO. 005435d

Constantes íógicas

Las constantes literales de tipo lógico disponibles en Java sont rue y f al se, quesignificanver dader o y f al s o respectivamente.

Constantes de tipo carácter

Una constante de tipo carácter esun carácter válido encerrado entre comillas sim- ples.Loscaracteres que pueden considerarse válidos son:

Las letras mayúsculasy minúsculas, incluyendo en ambos casos las acentuadas y lañ.

Los dígitos.Los caracteres$, - y todosloscaracteresUnicode por encima delOOCO.

Existen, además, ciertas secuencias especiales, denominadas secuencias de esc- pe, que se usan para representar constantes de tipo carácter.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 63/481

44 Java 2. Manual de programación

Tabla 2.8. Ejemplosde constantesde tipo carácter representadasmediante secuenciasd eescape

~ ~ ~ ~~ ~~ ~~

Secuencia Significado Secuencia Significado

\ n ' Nueva línea I \ I I \

I \ t ' Tabulación I \ I l l I,

' \ b ' Retroceso I \ u0007' Pitido' \ r ' Retorno de carro sin avance de línea ' \ uOOI B1 EscI \ \ \

Constantes de tipo cadenaUna constante literal de tipo cadena en Java está constituida por una serie de-teres, entre los que pueden aparecer secuencias de escape, encerrados entr-llas dobles. Para cada constante literal de tipo carácter usada en un programcrea automáticamente un objeto de tipoSt r i ng con dicho valor.

Ejemplo

/ / Secuenci as de escape

class Tr esNumer os 11 La salidade estei p u b l i c s t a t i c v o i d mai n ( St r i ng a r g s [ ] )i

1

Syst em. out .pr i nt ( \ t 1\ n \ t 2\ n\ t 3 ) ;

2.7. LA BIBLIOTECADECLASESDEJAVA

La potencia del lenguaje Java radica en su biblioteca de clases. Java pos biblioteca de clases organizada en paquetes, que son un conjunto de clase-camente relacionado, y, por tanto, para referenciar una de estas clases en u-grama es necesario escribir su nombre completo, es decir, incluir en el mi paquete al que pertenece,o bien importar el paquete. Una excepción la consti-yen las clases pertenecientes al paquetej ava . l ang, que se importa automáti-camente.

Entre los paquetes de Java que más destacan se podrían mencionar siguientes:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 64/481

Características del lenguaje Java 45

1ar . g Funcionesdel lenguaje n e t Para redesut i 1 Utilidades adicionales' awt Gráficos2 interfaz gráfica de usuarioi o Entrada/Salidatex t Formateo especializado appl et Para crear programas queseejecuten enla Web

awt . e v e r. t Sucesos desde el teclado. ratón. etc.

La sentenciai mpor t sóloindica a Java dónde buscar las clases utilizadas en un programa.

2.8. C ~ N C E P T ~ SÁSICOSSOBRE EXCEPCIONES

Cuando en la ejecución de un programa se produce un error, Java lanza unexcepción ', que será necesario capturar para que el programano se detenga. LaclaseExcept i on, con sus subclasesI OExcept i ony Runt i meExcept i oncontiene las excepciones que una aplicación necesita manejar habitualmente.

En el paquetej ava . i o se define la excepción denominadaI OExcept i on para excepciones originadas por errores de entradaisalida. Estas excepciones han de manejar de forma que el método donde se puedan producir debe captur-las o bien declarar que se lanzan mediante una claúsulat hr ows, en cuyo caso elmétodo invocador está obligado a capturarlas. Para capturar una excepción en o-raciones deentrada/salidael programa deberá incluir la sentenciai mpor t j ava . i o y además habrá que poner a prueba el código capaz de lanzar la excep-ción en un bloquet r y y manejar la excepción en un bloquecat ch, el manejo laexcepción se puede reducir a la presentación de un mensaje de error.

/ / capt ur a de excepci ones de ent r ada y c a l i i at=Y

/ / oper aci ones de ent r ada y s al i daI

catch ( I OExcept i on e)!

Cys t e m out . pr i nt l n( "Error" );

Las operaciones aritméticas también pueden dar origen a excepciones; por ejempla división por cero. Estas excepciones pertenecen la claseRunt i meExcept i ondel paquete j ava . l ang y son lanzadas automáticamente por Java y el compiladorno

obliga asumanejo.

Una excepciónesun tipo especial de error(objetoerror) quesecrea cuando sucedealgoimpre\istoenun prtrgrama. En el Capítulo13se estudia con más detalle el conceptoy manipulación de excepciones.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 65/481

46 Java 2. Manual de programación

/ k a - t u r a gener i ca de excepci ones de l a cl ase Except i ont r y

/ / oper ac i ones de ent r ada y sal i da

catch ( Except i on e)i

C ys tern. out . pr i nt n ( "Er ro r t e j ;

2.9. LACLASE Number Y SUS SUBCLASES

Java utilizalostipos simplesbyt e, i nt , l ong, f l oat y doubl e, que no estánorientados a objetos, por razones de rendimiento. Silo que se necesita es un objetode alguno de estos tipos, será necesario recurrir a las clasesByt e, I nt eger ,Long, Fl oat y Doubl e, que son subclases deNumber . Number pertenece al paquete j ava .l ang y proporciona métodos que devuelven el valor del objcomo el correspondiente tipo simple. Métodos deNumber con dicha finalidadson:

p ub l i c p ub l i c p ub l i c p ub l i c p ub l i c

by te byt eval ue ( )a b s t r a c t d o u b l e doubl eval ue ( )

a b s t r a c t f l o a t f l oat val ue( )

a b s t r ac t i n t i nt Val ue( ja b s t r a c t long l o ngv al ue( j

Number es una clase abstracta, concepto que se explicara con detalle más -lante,y susmétodos abstractos han de ser definidos en cada una de las subcl

comentadas. Por otra parte, las clasesByt e, I nt eger , Long, Fl oat yDoubl e permiten construir objetos de la clase correspondiente mediantemétodos:

p u b l i c p u b l i c p u b l i c p u b l i c p ub l i c

p ub l i c p ub l i c p ub l i c p ub l i c p ub l i c p ub l i c

Byt e ( b y t e p l )Byz e( j ava. l ang. Ct r i ngpl)I nt eger ( i n t p 1 )I r , t eger j ava. l ang. St r i ngplLong(long p l )

L or L g( j ava. l ang. St r i ngp l )Fl oat (double p l )Fl oat ( f l o a t p l )Fl oat ( j ava. l ang .St r i ng plDoubl e (double p l )Doubl e ( j ava. l ang. St r i ngp l )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 66/481

Características del lenguaje Java 47

Es decir, se pueden construir objetos de estos tipos a partir delosvalores numé-ricos adecuadoso a partir de cadenas con valores válidos para el tipo. La construc-ción ha de efectuarse con la ayuda del operadornew, que también aparece

comentado con posterioridad.

Doubl e d = new Doubl e( " 2. 71828" ) ;double real = d. doubl eVal ue( ) ;

I nt eger ent = new I nt eger ( 34) ;int 1 = ent . i nt Val ue ) ;

Las clasesI nt eger y Long proporcionan dos métodos muy utilizados paraconvertir una cadena en un número,par s eI nt y par sel ong. Estos métodoslanzan unaNumber For mat Except i on, que es unaRunt i meExcept i on,cuando surge algún problema.

public static int par s eI nt ( j ava. l ang. St r i ngp i )

/ / e l segundo par ámet r o p e r mt e especi f i car l a base public static int par s eI nt ( l ava.l ang. St r i ng p:, int 0 2 )

public static long par seLong( l ava. a ng. St r i ng p i )

/ / el segundo par ámet r o per mi t e especi f i car l a base public static long p a r s e L o n g ( j a v a . 1 a n g . C t r i n g pi , int 0 2 )

Ejemplo

int 1 = 1nt eger . par s eI nt ( " 2 0 C 1 " );int j = 1nt eger . par s eI nt ( " 101" , 2);Sys t em out . pr i nt l n( " i = + 1 + j = " + 1 ) ;

La salida sería

1 = 2001 j = 5

Otros métodos interesantes de las clasesI nt eger y Longson:

class I n t e q e r

public static j ava. l ang. St r i ng toStr ing(in t p ) public static l ava. l ang. St r i ng toBi naryS: r: - , g ( i n t p ) public static j ava. l ang. St r i ng toHexStr ing(in t p ) public static j ava. l ang. St r i ng t o0c t al St r i pg( i nt p )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 67/481

48 Java 2. Manual de programación

c l a s s Long

publ i c s t at i c j ava. l ang. St r i ng t oSt r i ng( 1ongp )publ i c s t at i c j ava. l ang. St r i ng t oBi nar ySt r i ng( 1ongp)

publ i c st at i c j ava. l ang. St r i ng t oHexSt r i ng( 1ongp)

publ i c s t at i c j ava. l ang. St r i ng t oOc t al St r i ng( 1ongp )

Estos métodos permiten respectivamente convertir números( i n t o l ong) enuna cadena decimal, binaria, octal o hexadecimal.

2.10. LAS CLASESCharacter Y Boolean

La claseChar act er se utiliza para crear objetos a partir de un parametrochar .El constructor es:

publ i c C h a r a c t e r (char p)

y posee el método pub l ic char char val ue ( ) que devuelve el valorcharCorrespondiente.

Otros métodos interesantes de esta clase son:publ i c st at i c char t oupper case(char p )publ i c s t at i c char t oLower Case(char p )

que devuelven el carácter que reciben como argumento transformado a men el caso del primer método y a minúsculas en el caso del segundo.

La claseBool ean permite crear objetos a partir deun dato de tipobool ean.Sus constructores son:

publ i c Bocl ean( bool ean p )publ i c Bool ean( j ava. l ang. St r i ngp )

y para obtener el correspondiente valorbool ean se usa

publ i c bool ean bo ol ean va l ue0

Ejemplo

bool ean rnayor = 3 + 1 > 5;Sool ean ob = new Bool ean( mayor );bool ean b = ob, ool eai Val ue( ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 68/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 69/481

50 Java 2. Manual de programación

Sys; err. out . pr i nt l n( "Escr i ba un númer o nat ur al con" +

; =Cyst er r .i n . read ( ) ;Syst em. i n .ski p ( 2 )/ *

"un úni co dí gi t o y pul se RETURN" ) ;

s ai t a dos car act er es en el f l u j o de ent r ada:\ r \ nCar act er es or i gi nados al pul sar l a t ecl a RETURN

* /Cys t er , . out . pr i nt l n( i );

Syst em out . pr i nt l n( "Escr i ba un númer o nat ur al con" +"un Úni co dí gi t o y pul se RETURN" ) ;

c = ( c h a r ) ys te rn. i n. read( );

Cys t ern. out . pr i nt l n ( c );

catch I OExcept i on e)

Cyst em out . pr i nt l n( " E r r o r " );

La entrada de datos por consola se efectúa en Java leyendo bytes de un fluentraday almacenándolos en objetos de distinto tipo, como se hizo mediSyst em. i n. r ead ( ) en el ejemplo anterior. La instrucciónSyst em. i n .s k i p ( 2 ); que también aparece en dicho ejemplo puede sustituirse por eotra Sys t em. i n. s ki p( Sys t em. i n. avai l abl e( ) ) ;p a r a q u e e l p r o -grama determine automáticamente el número de caracteres que quedan flujo de entrada y se desean saltar.

No obstante, la entrada básica en Java suele realizarse mediante el mér eadLi ne( ) de la claseBuf f er edReader , que lee una secuencia de caracte-res de un flujo de entraday devuelve una cadenay, además, mejora el rendimientomediante la utilización de un búfer. Para efectuar este tipo de entrada debe -truirse un objeto de la claseBuf f er edReader sobre otro de la claseI nput St r eamReader asociado aSyst em. i n , que se encarga de convertir encaractereslos bytes leídos desde teclado. Según este planteamiento, la lecturvalores numéricos conllevaría dos fases:lecturade una cadenay conversión delacadena ennzímero.Cuandos i trata de valores de tipoi n t o l ong los métodosI nt eger . par sei nt e I nt eger . par s eLong proporcionanun mecanismode conversión adecuado, mientras que para valores de tipo real se recurre a-

tuar la construcción de objetos de tipoFl oat o Doubl e a partir de la representa-ción en forma de cadena del número en coma flotante, para después, medf l oat val ueo doubl eVal ue,obtener el valorf l oat o doubl e queencap-suladicho objeto. Como ya se ha visto,I nt eger , Long, Fl oat y Dobl e son

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 70/481

Características de/ lenguaje Java 51

clases pertenecientes al paquetej ava . l ang que representan como objetos lostipos simples de su mismo nombre.

Ejemplo

/ *El empl o 2" sobr e operaci ones de ent r ada y s al i da.Ej ecut e el si gui ent e pr ogr ama y anal i ce l os r es ul t ac cs

* /

import j ava . i o . *;

public class Ent r adasal i da2i

public static void mai n ( St r i ng[ ] ar gs)

I nput Ct r eamReader i s r = new I nput Ct r eamReader ( Syst em. i n ) ;

Buf f er edReader br = new Buf f er edReader ( ; s r ) ;St r i ng cadena;try

Cys t e m out . pr i nt l n( "Escr i ba su nombr e y pul se RETU; I N" );

cadena=br . r eadLi ne( ) ;

Syst em. out pr i nt l n( "Hol a" +cadena+" , escr i be un número ent ero y pul sa R E T C W " );int ent er o=I nt eger . par s eI nt ( br . r eadL i ne( );Cyst em out . pr i nt l n( "El númer o i nt r oduci do f ue el "+er . t er c);Cystem out . pr i nt l n "Am go/ a"+cadena+

", i nt r oduzca ahor a un r eal y p¿i l seXFTLJS>J");

Sys t em out . pr i nt l n " ( ut i l i ce el punt o corno separ ador " +

c adena=br . r eadl i ne( ) ;Doubl e d=new Doubl e ( cadena) ;

double r eal = d. doubl eval ue ( ) ;Sys t em out . pr i nt l n( " El r eal es "+r eal ) ;

"ej 3. 45) " ) ;

1

i

1

catch TOExcept i one)

Sys t em out . pr i nt l n( "Error" ) ;

1

AI realizar este tipo de operaciones deentrada/salidahay que tener en cuenta la posible generación de excepciones; por ejemplo, aquellas que son lanzadas pr eadLi neante un error de lectura, y estas excepciones deben ser recogidas o

bien listadas en una cláusulat h r o w s que las devuelva al método llamador.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 71/481

52 Java 2. Manual de programación

2.12. OPERADORES

Los operadores de un lenguaje se pueden utilizar para combinar o modifilos

valores deun programa. Java poseeun gran conjunto de operadores. La lista com- pleta delosoperadores Java se muestra en la Tabla2.9.

Tabla 2.9. Lista completa de operadores Java

> < !- __ <= >= I =

~ -? :& &-

+=

_ -++/ &

* = / =<< >>

t

>>>& =

>>>= ( t i po) new i ns t anceof or .1 1

2.12.1. Operadores sobre enteros

Los operadores que trabajan sobre enteros pueden serbinurioso unarios(unita-rios). Los operadores binarios son aquellos que requieren dos operandos (2.11) . Los operadores unarios son aquellos que requieren un único oper(Tabla2.10).En ambas tablas se proporciona un ejemplo de la utilización deoperador.

La Tabla2.12muestra un tipo especial de operadores de asignación que se ben los otros operadores. Estos operadores actúan sobre un operandoy almacenan elvalor resultante de nuevo en el mismo operando.

Ejemplo

z += 5; equivalea z = z + 5 ;

Tabla 2.1O. Operadores unitarios sobre enteros

Operador Operación Ejemplo

- Negación unitaria - a

++ Incremento + + a o bien a ++_ _ Decremento - - a o bien a- -- Negación lógica bit a bit - a

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 72/481

Características del lenguaje Java 53

Tabla 2.11. Operadores binarios sobre enteros~

Operador Operación Ejemplo

- Asignación_ __ IgualdadI = Desigualdad< Menor que

a = b

a ! = ba < b

a = = b

<= Menoro igual que a <= b>= Mayoro igual que a >= b> Mayor que a > b+ Suma a + b- Diferencia a - b

Producto a * b/ División a / b, Módulo a % b

<< Desplazamiento a izquierdas a << b

>> Desplazamiento a derechas a >> b>>> Desplazamiento a derechas con rellenado de cerosa >>> b& AND bit a bit a & bI OR bit a bit a l b

XOR bit a bit a ^ b

*

Tabla 2.12. Operadores de asignación enteros

t =

/=--

>>=

--

&=9 -

>>>=0 -

*=I =

<<=

2.12.2. Operadores sobre valores de coma flotante

Los operadores sobre valores de coma flotante son un subconjunto delosdisponi- bles para tipos enteros. La Tabla2.13muestra los operadores que pueden operarsobre operandos de tipof l o a t y d o u b l e .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 73/481

54 Java 2. Manual de programación

Tabla 2.13. Operadores sobre valores de coma flotante

Operador OperJ\ción Ejemplo

__ __I =

<<=>=>+

/,++_ _

AsignaciónIgualdadDesigualdadMenor queMenoro igual queMayoro igual queMayor queSumaResta

MultiplicaciónDivisiónMódulo Negación unitarialncrernentoDecremento

a = b b

a ! = ba < ba <= ba >= ba > ba + ba - b

a * ba / b

- a+ + a o bien a + +- - a o bien a - -

a = =

a % b

2.13. LA SENTENCIADE ASIGNACIÓN

La sentencia de asignación se usa para dar valor a una variableo a un objeto en elinterior deun programa, aunque hay que tener en cuenta que las variables deobjeto se comportan de forma diferente a comolo hacen las de tipo simple cuandose realiza una asignación.El operador deasignaciónes el signo de igualdad y eneste tipo de sentencias la variable se colocará siempre a la izquierda y la expa la derecha del operador.

Losobjetos de una determinada clase se crean utilizando el operadornew quedevuelve una referencia al objeto, la cual se almacenará en una variable dobjeto mediante una sentencia de asignación. Las sentencias de asignación- bién se podrán aplicar entre dos variables de tipo objeto.A las variables de tipoobjeto se las denomina variables por referencia, debido a que cuando se una variable de tipo objeto a otra (a diferencia de lo que ocurre con las varde tipo simple) nose efectúa una copia del objeto, sino quesólose hace unacopia de la referencia, es decir, de la dirección de memoria donde se encel objeto.

Doubl e d, d2;d = new Doubl e( " 3 " );d2 = d;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 74/481

Características del lenguaje Java 55

En cuanto a las variables de tipo simple, tras efectuar su declaración, podrá usa-se el operador de asignación, para adjudicarles el valor de una expresión.

int x, y;x=5 ;

y=x ;

Este operador es asociativo por la derecha, lo que permite realizar asignacionmúltiples.Así,

adjudica a las tres variables el valor5.

2.14. EXPRESIONES

En general, las expresiones se definen como un conjunto de operadores y opera-dos, pero hay que tener en cuenta que dicho conjunto puede estar formado exclu-vamente por un operando. Es decir, que las expresiones pueden ser una constanuna variableo una combinación de constantes, variablesy/o funciones con opera-dores, tanto binarios como unitarios.

Como ya se comentó, en Java las variables declaradass t at i c y f i na1 sonen realidad constantes y los métodos cuyo tipo de resultado no esvoi d y quese declaran comopubl i c y s t at i c pueden ser considerados funcionesglo- bales.

2.15. CLASEMath

La clasej ava . l ang .Mat h proporciona una serie de constantes y funciones deuso muy común en expresiones aritméticas.

Mat h es una clase en el paquete fundamentalj ava . l ang. Los métodos está-ticos de la claseMat h realizan cálculosmatemáticos básicos tales como máximo,mínimo, valor absoluto y operaciones numéricas que incluyen funcionesexponen-ciales, logarítmicas, raíz cuadraday trigonométricas.Loscálculos en coma flotan-te se realizan utilizandodoubl e y algoritmos estándar.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 75/481

56 Java 2. Manual de programación

Métodos sobre tipos numéricos

Invocación Significado Estructura dela cabecera dela declaración del miembro

Mat h. abs ( exp) valor absoluto p ub l i c s t a t i c double abs (double pl)de e.rp publ ic s t a t i c f l o a t abs ( f l o a t p i )

publ ic s t a t i c i n t abs ( i n t p l ) pub l i c s t a t i c long abs (long p l )

Mat h. max(expl , expZ)mayorentre public s t a t i c double max (double p l , double p2)e x p l y e x p 2 publ ic s t a t i c f l oa t max ( f loa t pi, f loa t p2)

pub l ic s t a t i c i n t rnax ( i n t p i , i n t p2) public s t a t i c long rnax (long p l , long p 2 )

Mat h. m n( expl , expZ)menorentre public s ta t i c double rnin (double pi, double p2)exp l . vexp2 publ ic s t a t i c f l oa t mi n ( f l o a t pi , f l o a t p2)

p ub l i c s t a t i c i n t mi n ( i n t p i , i n t p 2 ) pub lic s t a t i c long rnin (long pl, long p2)

Como se puede apreciar a través de las cabeceras delos métodos,éstosestánredefínidos para que puedan trabajar con diferentes tipos de datos.

Métodos de coma flotante~ ~

Invocación Significado Estructura de la cabecera dela declaración del miembro

Mat h. pow( a, b) ah p a l i c s t a t i c & a e p <*pi,chhlep?)Mat h. exp( a) ea publ ic s t a t i c double exp (double pi)

Mat h. cei 1( a ) r1 public s t a t i c double cei l (double pi )

Mat h. f l oor ( a) Lul public s t a t i c double f loor (-le pi )Mat h. l og( a) ' n (4 public s t a t i c double l ong (double pl)

Mat h. sqr t ( x) publ ic static double sqrt (double pi )Math. r ound ( n ) redondeo al entero pub l i c s t a t i c long r ound (double pi)

( l ongo int) pub l i c s t a t i c i n t r ound ( f l o a t pi)más cercano

log natural

Mat h. r andom( ) número aleatorio' pu bl ic s t a t i c synchronized double random( )

Constantes de coma flotante

Invocación Significado

Mat h . E base dellogaritmonatural publ ic s t a t i c f i n a l double E

Mat h. PI p pub l i c s t a t i c f i n a l double P I

Estructura dela cabecera de la declaración del miembro

La clase Random perteneciente al paquete j ava .uti 1 ofreceun mayor número de posibilidades para la gene-ración de números aleatonos. Puede generar número aleatonos incluso siguiendo diferentes tipos de dist

j

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 76/481

Características del lenguaje Java 57

Funciones trigonométricas

Invocación Significado Estructura de la cabecera de la declaración del miembro~

Math. si n (19) sen (19) public static double s i n (double pi )Mat h. cos 8) CUJ 8) public static double cos (double pi )Math. t an 8) tg 8) public static double tan (double pl)Mat h. asi n( x) -u <arcsen x)<u public static double asi n (double pi)

Mat h. acos( x) O < u r c m ( x ) < 8 public static double acoc (double pi)

Mat h. at an( x ) -yhrcfg(x)<D public static double atan (double pi)2

Mat h. at an2 ( a, b)-IIhrcrg(a)<Fl

2 - 2

public static double atan2 (double l, double p2) b

Ejemplo

. . ./ / Cal cul o del ár ea de un cí r cul o de r adi o 10int r = 10;double c = Mat h. pow( r , 2) *Mat h. PI ;Sys t em out . pr i nt l n( c );

. . .

2.16. PAQUETEjava.math

El paquetej ava. mat h tiene las clasesBi gDeci maly Bi gI nt egery sopor -ta operaciones de coma flotantey enteros de precisión ampliada.

2.17. CONVERSIONES DE TIPOS. OPERADORES MOLDE

Con frecuencia se necesita convertir un dato de un tipoa otro sin cambiar el valorque representa. Las conversiones de tipo pueden ser automáticaso explícitas, esdecir, solicitadas específicamente por el programador.

Conversiones automáticas

En las expresiones pueden intervenir operandos de diferentes tipos y, cuando estoocurre, para efectuar las operaciones Java intenta realizar conversiones automáticade tipo. Las conversiones automáticas que podrá efectuar son:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 77/481

58 Java 2. Manual de programación

char

in long float double

byte short

Figura 2.1. Conversiones automáticas.

En la operación de asignación convierte el valor a la derecha del signotipo de la variable, siempre quelostipos sean compatiblesy esta operación no oca-sione una pérdida de información, es decir, cuando se trate de conversion

las mostradas en la Figura2.1.Conversiones explícitas

Este tipo de conversiones utilizalosdenominados operadores de conversión, mo cast,y puede ser necesario cuando se precisaun estrechamiento de tipo, conve-sión en el sentido tipo más alto a tipo más bajo,o en casos como el siguiente pargenerar una entidad temporal de un nuevo tipo.

. . .i nt a = 5;byte b = 5;b = (byte) b * 2 ) ;/ * s i no se pone el mol de da er r or ya que el

2 es entero y avi sa que no se puedeconver t i r aut omát i cament e i nt a byt e * /

f l oat c = a / b;/ *di vi s i ón ent er a. El oper ador di vi si ón

f unci ona a dos ni vel es: ent er o y r eal * /

. . .i nt a = 5;byte b = 5;b (byte) ( b * 2) ;f l oat c = ( f l oat l a / b;/ / di vi s i ón r eal

S a l i d a :

@. O 5 10Sal da :

0. 5 5 10

El operador molde tiene la misma prioridad quelos operadores unarios.Mediantelosoperadores molde cualquier valor de un tipo entero o real puconvertido ao desde cualquier tipo numérico, pero no se pueden efectuar c-siones entrelostipos enteroso realesy el tipobool ean.

2.18. OPERADORESARITMÉTICOS

Los operadores aritméticos permiten realizar operaciones aritméticas actúan sobre operandos numéricosy devuelven un resultado de tipo numérico.Los

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 78/481

Características de/ lenguaje Java 59

operadores aritméticos en Java pueden también actuar sobre operandos de tipcha r, ya que Java considera este tipo prácticamente como un subconjunto de loi n t . Losoperadores aritméticos de Java se muestran en la Tabla2.14.

Tabla 2.14. Operadores aritméticos- -~

Operador Significado Operador Significado

+ Operador unario+ /o Suma

División enterasi los operandossondetipo entero

- Operador unario- / División real con operandos de tipo realo Resta

* Mu1ip1icación % Módúlo,es decir, resto dela divisiónentera. No es necesario quelosoperandos sean enteros

Ejercicio

Convertir un número de metros leídos desde teclado en un complejo de pies y pulgasabiendoque1 metro = 3 9 . 2 7 p u l g a d a s y 1 pie = 12 p u l g a d a s .

package l i br o. Tema02;import j ava. i o. * ;

public class Conver si oni

public static void mai n ( St r i ng[ ] ar gs)I

I nput St r eamReader i sr =new I nput St r eamReader ( Sys t em i n) ;Buf f er edReader br = new Buf f er edReader ( i s r ) ;St r i ng cadena;

tryI

Sys t em out . pr i nt l n( "I ndi que el númer o de met r os y " +

cadena = br . r eadLi ne( ) ;Doubl e d = new Doubl e( cadena) ;double met r os = d. doubl eVal ue( ) ;

double pul gadas = met r os * 39. 27;double pi es = pul gadas / 12;pul gadas = pul gadas % 12; / / es posi bl e apl i car % a r eal espi es = pi es - pul gadas / 12;Sys t em out . pr i nt l n( "Conver si ón de met r os en un compl ej o " +

Sys t em out . pr i nt l n( met r os+ met r os son + pi es +

pul se RETURN") ;

de pi es y pul gadas ") ;

pi es y + pul gadas + pul gadas ") ;i

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 79/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 80/481

Características de/ lenguaje Java 61

2.19. OPERADORESRELACIONALES

Los operadores relacionaleso de comparación permiten comparar valores paradeterminar su igualdadu ordenación y el resultado de las expresiones en las queintervienenes de tipo lógico. En cuanto alosoperandos hay que tener en cuenta quesólo los tipos numéricos se pueden comparar utilizando operadores de ordenaciómientras quelos de igualdad y desigualdad pueden actuar sobre cualquier tipo dedato. La Tabla2.15lista los operadores relacionales.

Tabla 2.15. Operadores relacionales

Operador Nombre Ejempio Respuesta

_ __ Igual (operador formado pordos signos= consecutivos)1 == 2 f a l s eI = Distinto 1 ! = 2 t r u e> Mayor que 1 > 2 f a l s e< Menor que 1 < 2 t r u e>= Mayoro igual 1 >= 2 f a l s e<= Menoro igual 1 <= 2 t r u e

2.20. OPERADORES LÓGICOS

Los operadores lógicoso booleanos actúan sobre operandos de tipo lógico paradevolver un resultado también de tipo lógico. La Tabla2.16contiene la lista de losoperadores lógicos existentes en Java.

Tabla 2.16. Operadores lógicos

Operador Significado Operador Significado

& AND lógico 1 1 ORen cortocircuito

I OR lógico XOR& & AND en cortocircuito I NOT unario lógico

Las reglas de funcionamiento son las siguientes:

Eloperador& da como resultadot r u e si al evaluar cada uno de los operandosel resultado est r u e . Si alguno de ellos esf a l s e , el resultado esf a l s e .& &es análogo a&, pero si el primer operando esf a l s e , el segundo no es eva-

luado. Esta propiedad se denomina evaluación en cortocircuito. Por ejemplola siguiente expresión evitaría calcular la raíz cuadrada de números negativo

( X >= O) & & ( Mat h. s qr t ( x) >= 2 )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 81/481

Java 2. Manual de programación

Tabla 2.17. Tabla de verdad del operador

Operandol Operando2 Operandol Operando2

f a l s e f a l s e f a l s ef a l s e t r u e f a l s et r u e f a l s e f a l s et r u e t r u e t r u e

El operador da como resultadof a l s e si al evaluar cada uno de los operan-dos el resultado esf a l s e . Si uno de ellos est r u e , el resultado est r u e .

es análogo a pero, cuando se usa, si el primer operando est r u e , elsegundo no se evalúa.

Por ejemplo, en la siguiente expresión:

(num ==

la sentencia num== nunca se ejecutará.

Tabla 2.18. Tabla de verdad del operador

Operando 1 Operando2 Operando1 II Operando2

f a l s e f a l s e f a l s ef a l s e t r u e t r u et r u e f a l s e t r u et r u e t r u e t r u e

El operador! da como resultadof a l s e si al evaluar su único operando el r-sultado est r u e , y devuelvet r u e en caso contrario.

Tabla 2.19. Tabla de verdad del operador!

Operando !Operando

f a l s et r u e

t r u ef a l s e

El operador da como resultadot r u e si al evaluar sus operandos uno dellos es true y el otrof a l s e , y devuelvef a l s e cuando ambos sont r u e ytambién cuando ambos sonf a l s e .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 82/481

Características del lenguaje Java 63

Tabla 2.20. Tabla de verdad del operadorA

Operando1 Operando2 Operando1 Operando2

f a l s e f a l s e f a l s ef a l s e t r u e t r u et r u e f a l s e t r u et r u e t r u e f a l s e

2.21. OPERADORES DE MANIPULACIÓN DE BITS

Actúan sobre operandos de tipo entero modificandolos bits de sus operandos

Tabla 2.21. Operadores de manipulación de bits

Operador Nombre

&I

-<< Desplazamiento a la izquierda>>>>> Desplazamiento a la derecha

AND a nivel de bitORa nivel de bit

NOTunario a nivel de bitXOR

Desplazamiento a la derecha rellenando con ceros

A

Para trabajar con estos operadores es necesario tener presente que:

Java:- Almacenalosenteros como números binarios.- Todossus enteros, excepto losc h a r, son enteros con signo, es decir,

- Los números negativos se almacenan en complemento a dos, es decir, pueden ser positivoso negativos.

cambiando por ceros los unos del númeroy viceversay sumando ununoal resultado.

La Tabla2.22,que describe las acciones que realizan los operadores& I A

y - sobrelos diversos patrones de bits de un dato de tipo entero.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 83/481

64 Java 2. Manual de programación

&sobre bits

A B A & B

O 0 Oo 1 O1 0 O1 1 1

Isobrebits * sobre bits - sobre bits

A B A I B A B A A B A - A

O 0 O O 0 O 1 Oo 1 1 o 1 1 O 1 1 0 1 1 0 1

1 1 1 1 1 O

El desplazamientoa la izquierda tiene el siguiente formatov a l o r << n ymueve a la izquierdan posicioneslos bits del operando, rellenando con cerolos bits de la derecha.

O O O 1 1 1 O 1 v a l o r e s 2 9

tras v a l o r= val or << 3, el v a l o res 2 3 2

o - 24si el primer1 por la izquierda es elsigno(complemento ados)1 1 1 0 1 0 O 0

. . . byte c = 29 ;

int d = c << 3;Sys t em out . pr i nt 1n( d );

byte e = (byte) ( c << 3 ) ;Syst er n. out . pr i nt 1n( e );

S a l i d a :232 - 24

El desplazamiento a la derecha,val or >> n, mueve a la derechan posi-cioneslos bits del operando, perdiéndoselos bits dela derechay rellenándoselos de la izquierda con el contenido del bit superior inicial, lo que perm-servar el signo.

I byte b = - 2;

int c = b >> 1;/ / equi val e a di vi di r por 2

int c = - 2;c = c >> 1;/ / equi val e a di vi di r p o r 2

Sys t er n. out . pr i nt l n ( c ); I s ys t er n. out . pr i nt l n( c) ;

IS a l i d a - 1 S a l i d a - 1

Para efectuar desplazamientos a la derecha en datos de tipoi n t sin conservar elsignoel operador adecuado es>>>,que rellena conun cero el bit superior.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 84/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 85/481

66 Java 2. Manual de programación

Ejemplopackage l i br o. Tema02;publ i c cl ass Oper ador esI

Publ i c s tat i c voi d mai n ( St r i ng[ ] a rg s )

bool ean a=t r ue;a &=t r ue ;

Sys t e m out . pr i nt l n( " t r ue& t rue = +a) ;

a&=f l s e ;Sys t e m out . pr i nt l na&=f al se;

Sys t e m out . pr i nt l na &=t r ue;Sys t e m out . pr i nt l n

Tabla 2.23.

" t rue & f al se = "+a) ;

" f al s e & f al se = "+a) ;

" f al s e & t rue = " +a) ;

Operadores de asignación

Operador Nombre Ejemplo-- Asignación simple i nt a = 5;

/ / a t oma el val or 5++ Incrementoy asignación a + +

/ / a val e 6- - Decrementoy asignación a- - ; / / equi va; e a a=a- 1

/ / a val e 5* = Multiplicacióny asignación a*=4; / / a = a"4

/ / a t oma el val or 20/ = Divisióny asignación a/ =2; / / a = a/ 2

/ / a torna el val or de 10* = Móduloy asignación a " - -- 6; / / a = a%6

/ / a val e 4T = Sumay asignación a+=8; / / a = a+8

/ / a val e 12

/ / a val e - 11<<= Desplazamiento ala, a<<=2; / / a = a<<2

izquierday asignacion / / a val e - 4 4

>>= Desplazamiento a la a>>=6; / / a = a>>6derechay asignación / / a val e - 1

>>>= Desplazamiento a la derecha a>>>=24; / / a = a>>>24y asignación rellenando con ceros/ / a val e 255

- _ Restay asignación a- =23; / / a = a- 23

&=

I =

a=3;Asignación ANDo a&=6; / / equi val en a a=3&6AND sobre bitsy asignación / / a val e 2

a=3;Asignación ORo a =6; / / equi val en a a=3l 6OR sobre bitsy asiganción / / a val e I

a=3;- Asignación XORo a^=6; / / equi val en a a= 3 - 6

XOR sobre bitsy asiganción / / a val e 5

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 86/481

Características d e / lenguaje Java 67

2.23. OPERADOR CONDICIONAL

El operador condicional,? : , es un operador ternario, es decir, requiere tres ope-randos, y se utiliza en expresiones condicionales, devolviendo un resultado cuyvalor depende de si la condición ha sidoo no aprobada. El formato del operadorcondicional es:

c o n d i c i o n ? o p e r a n d o l : o p e r a n d o 2 ;

y conlleva la ejecución de las siguientes operaciones: se evalúa la condición; sla condición est r u e , el resultado eso p e r a n d o l , y si esf a l s e , es o p eran d o 2 .

Por ejemplo:

double comi si ón = ( v e n t a s > 150000) ? 0. 10 : 0. 05;

si las ventas son superiores a15 OOOO, se adjudica el valorO .1 O a comisión; encaso contrario, se le adjudicaO . 05.

2.24. PRIORIDAD DE LOS OPERADORES

Las expresiones se evalúan siguiendo el orden de prioridad de los distintos opera-dores que intervienen en ellas, atendiendo primero a los de mayor prioridad.Aigualdad de prioridad se evalúan de izquierda a derecha.Los paréntesis se puedenutilizar con la finalidad de cambiar el orden preestablecido, ya que las operacioneencerradas entre paréntesis siempre se evalúan primero. Cuando hay varios parén-tesis anidados se calcula primero el resultado de las operaciones encerradas enlosmásinternos.

La prioridad, de mayor a menor, delos distintos operadores en Java aparecereflejada en la Tabla2.24,los operadores situados en la misma línea tienen igual prioridad. En Java todoslos operadores binarios, excepto los de asignación, se eva-lúan de izquierda a derecha(asociatividad).

Consejo: Sepuedenutilizarparéntesis paraforzarun ordende evaluación, asícomofacilitar la lectura de unprograma.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 87/481

68 Java 2. Manual de programación

Ejemplo

;Cuáles el valor de la siguiente expresión, teniendo en cuenta quei valel ?

5 + 4 * 4 > 5 * ( 5 + 4 ) - i t t

Recul a d 0

f al se

Ejercicio

Determinarsi un arioleído desde teclado es o no bisiesto, teniendo en cuenun año es bisiesto cuando es múltiplo de4 y no loes de 1 0 0 o si es múltiplode4 0 0 .

i mpor t j ava. i o. * ;publ i c cl ass Pr i or i dad

publ i c st at i c voi d mai n ( St r i ng[ ] args)I

I nput St r eamReader i sr =new I nput Ct r ear nReader ( Syster n. i n) ;Buf f er edReader br = new Buf f er edReader í -..) ;

St r i ng cadena;tryi

Sy s t em out . pr i nt ( "Escr i ba el año co' , 4 dí gi t os " ) ;

cadena = br . r eadLi ne( ) ;

i nt año = I nt eger . par s eI nt ( cadena) ;

bool ean bi s i es to = año % 400 == O

Sys t em out . pr i nt l n( bi s i es t o);Icat ch( Except i on e)i

año % 100 ! = O & & año % 4 == O;

Cystern. out . pr i nt l n( "Cual qui er t i po de er r or " ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 88/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 89/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 90/481

Java 2. Manual de programación

En todoslos lenguajes de programación existen construccioneque permiten tomar decisiones basadas en una condición. Paefectuar esta tarea Java dispone de las sentenciasi f , i f - el se y

swi t ch. Un bucle es una sección de código que se ejecutamuchas veces hasta que se cumple una condición de terminacióLas sentencias disponibles en Java para la creación de bucles sof o r ,whi l e y do- whi l e. Este capítulo pretende introducirle en emanejo de ambos tipos de sentencias.

Las sentencias selectivas controlanel flujo de ejecución enlosprogramas basándose en el valor de una expresiónsóloconocidaen tiempo de ejecución. En Java existen sólo dos tipos de sente-cias selectivas,i f y s wi t c h, en las que la primera se puede con-siderar a su vez dividida en dos clases,i f e i f - e l s e .

Las sentencias repetitivas permiten repetir una accióno grupode acciones mientraso hasta que se cumple una determinadacondición. Java dispone de tres sentencias de este tipo:f o r ,

3.1. LA SENTENCIAif

La sentenciai f permite en un programa tomar la decisión sobre la e-ción de una accióno de un grupo de acciones, mediante la evaluación de una explógica o booleana. La acción o grupo de acciones se ejecutan cuando la condici-ta y en caso contrario no se ejecutany se saltan. Los formatos para una sentenciai f son:

i f condi ci ón)s e n t enci a ;

if ( condi ci ón)/ / secuenci a de sent enci as

Ejemplo. . .double por cent aj e = 0;/ * Si l as vent as son i gual es o super i or es a 300000 pt s.

per ci be un 12% de comi si ón, en caso cont r ar i ono cobr a comi si ón

por cent aj e = 0. 12;i f ( vent as 300000)

i n t pr i ma = ( i n t ) (ventas * por cent aj e) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 91/481

Decisiones y bucles 73

Nota:La colocación de un signo de puntoy coma después de la condición deuna estructurai f constituye un error en la lógica del programa:

if ( c o n d i c i ó n ) ;

/ / si se cumpl e l a condi ci ón no se ej ecut a ni nguna acci óns e n t e n c i a ;

3.2. LA SENTENCIAif else

Esta clase de sentenciai f ofrece dos alternativas a seguir, basadas enla conipro- bación de la condición. La palabra reservadae l s e separa las sentenciasutili/adas para ejecutar cada alternativa. La sintaxis de la sentenciai f - el se es:

i f ( c o n d i c i o n )

el sesen t e n c i a 1 ;

se n t e n c i a 2 ;

i f ( c o n d i c i c n )

Si la evaluación de la condición es verdadera, se ejecuta lascnteilc.ic//o lasecuencia de sentenciasl,mientras que si la evaluación es falsa se ejecutala sew-tencia2o la secuenciade sentencias2.Es decir, que las sentenciasa realbartantocuando se cumple como cuando no se cumplela condición podrán ser simples ocompuestas. Posibles errores de sintaxis serían:

i f ( c ond i ci o n ) ;

s e n t e n c i a 1 ;

elses e n t e n c i a 2 ;

Nota:Esnecesario recordar que Java proporciona un operador, el condicional,capaz de reemplazar instruccionesi f - e 1 s e .

Ejercicio

Adivinar un número pensado por la computadora.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 92/481

74 Java 2. Manual de programación

i f más cer cana, es c i e r i rzor zepor . de a1 s e g . i n d o * /

import 4 a ~a . i o . ~; pu b l i c c l a s s J uego

/ * a pesar de l a sangr í a, estee l s e cor r esponde alpr i mer i f * /

p u b l i c s t a t i c vo id mai n ( St r i ng a r g s [ ] ){ I npdt St r ear r Reader i s r

=new I nput St r ear nReader ( Cys t em 1n) ;Bcf f er edReader br = new Buf f er edReader ( i s r ) ;

C z r - n g cadena;t r y .

Syste- ; . o~t . pr ; n: ( "I r . t roduzca un número ent er o ent r e 1 y 3 " ) ;cade r, a = i r . eaci l i ne( ) ;

i n t n = ( i n t ) Mat h . r andom( )3) +1;/ / Moz?. . r andrmOdevuel ve un cioubie al eat or i o ent r e O. C y 1. 0i n t I = I nt eger . par s eI nt ( c adec a) ;i f ( i = = n)

elseC y s t e m . o ¿ i t . p r i n t l n ( " Acer tó" );

Cys t em. out . pr i c t l n( "No acer t ó, el númer o er a " +n) ;

c a t c h ( E x c e p t i v n e)

C y s : e i . o z t . pr i nt ; n ( " C . ~ d l q u i e r t i po de er ror " ) ;

\

La estructurai f - e 1 s e anterior podría haber sido sustituida por:

C y s : e ? . c ' ~ t . pr - ~ni l ni == n ? " Acertó" : " No acer t ó, er a +n) ;

3.3. LAS SENTENCIASif E i f - e l s e ANIDADAS

Es posible que alguna de las sentencias a ejecutar especificadas en una insi f sea asu vez otra sentenciai f .

i f ( c o ~ d i z i ó c l )i f ( c o n d l c i 6 n 2 )

e l s ec e.? t e;: cl a : ;

seíi t E c i a 2 ;

i f ( c o n d i c i ó n l )t

i f ( c o n d i c i ó n 2 )s e n t e n c i a 1 ;

else

/ * l a c a l a b r a r eser vada el se secor r esponde cor l a sent enci a

sen t e n c i a 2 ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 93/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 94/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 95/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 96/481

78 Java 2. Manual de programación

Sys t e m out . pr i nt l n( " x2= " t - b/ ( 2* a) +" - f

Mat h. s qr t ( d) / ( 2* a) t " i " ) ;

Ii

cat ch( Except i on e)i

Sys t e m out . pr i nt l n( "Excepci ón " t e ) ;

/ / Except i on es super cl asel

II

3.4. LA SENTENCIAs w i t c h

Cuando se tienen muchas alternativas posibles a elegir, eluso de sentenciasi f -el se- i f puede resultar bastante complicado, siendo en generalmásadecuado enestos casos el empleo de la sentenciaswi t ch. La sintaxis de una sentenciswi t ch es la siguiente:

swi t ch ( e x p r e s i o n )

Icase c o n s t a n t e l :

s en t e n ci a 1 ;

/ / s i se t ra ta de múl t i pl es acci ones no es necesari o/ / encer r ar l as ent r e l l avesbr eak;

case c o n s t a n t e 2 :s e n t e n ci a 2;br eak;

. . .case c o n s t a n t e N :

' s e n t en c i a sN;br eak;

s en t e n c i asX;def aul t

i

Importante:En la sentencias w i t c h la expresión ha de devolver un resulta-do de tipo enteroo carácter. La sentencia break se utiliza con la sentencias w i t c h para abandonar dicha sentencia tras la ejecución de las sentenasociadas a una determinada cláusulacase,

El funcionamiento de la sentenciaswi t ch es el siguiente:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 97/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 98/481

80 Java 2. Manual de programación

defaul t :Sys t e m out . pr i nt l n( "Opci ón no vál i da") ;

11catch ( Except i on e)i )

En el programa anterior, cuando se pulsa la teclas, se visualiza el mensajeHasel ecci onado Sal i r de pr ogr ama, y si pulsa la teclaZ, aparece el deOpci ón no vál i da. Observe que se utilizan dos cláusulas case para peal usuario introducir letras mayúsculaso minúsculas. Es decir, los múltiples cse utilizan para permitir que una serie de condiciones proporcionen la m- puesta.

Nota:En una sentenciaswi t ch no pueden aparecer constantes case iguale pero las sentencias a ejecutar en una sentenciaswi t ch pueden sera su vezsentenciasswi t chy las sentenciasswi t chanidadassí pueden tenercons-tantescase iguales.

3.5. LA SENTENCIAfor

El buclefo r está diseñado para ejecutar una secuencia de sentencias un nfijo de veces. La sintaxis de la sentenciaf o r es:

for ( i n i c i a l i z a c i ó n ; c o n d ic i ón d e t e r m in a c ió n ; i n c r e me n to )s e n t e n c i a s ; / / desde O a un bl oque del i mi t ado por { I

Lass e n t e n c i a s podrán ser cero, una única sentenciao un bloque, y serán loque se repita durante el proceso del bucle.

La i n i c i a l i z a c i ó n fija los valores iniciales de la variableo variables decontrol antes de que el buclef o r se procese y ejecutesolouna vez. Si se deseaini-cializar más de un valor, se puede utilizar un operador especial de los bufo ren Java, el operador coma, para pegar sentencias. Cuando no se tiene quiniciali-

zar, se omite este apartado; sin embargo, nunca se debe omitir el puntoy coma queactúa como separador.La c o n d i c i ó n d e t e rmina ci ón se comprueba antes de cada iteración

bucley éste se repite mientras que dicha condición se evalúe a un valor veSi se omite no se realiza ninguna prueba y se ejecuta siempre la sentenciaf o r .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 99/481

Decisiones y bucles 81

El i n cremen t o se ejecuta después de que se ejecutenlass en t e n c i a s y antes deque se realice la siguiente prueba de lacondic ión d e terminación. Normalmenteesta parte se utiliza para incrementarodecrementar el valor deM a svariables de control

y, al igual que en la inicialización, se puede usar en ella el operador coma para pegar se-tencias. Cuando no se tienen valores a incrementar se puede suprimir este apartado.En esencia, el buclefo r comprueba si lacondic ión de te rminac ión es

verdadera. Si la condición esVerdadera,se ejecutan las sentencias del interior del bucle,y si la condiciónes,fulsa,se saltan todas las sentencias del interior del bucle, esdecir, no se ejecutan. Cuando la condición es verdadera, el bucle ejecuta una iteraci(todas sus sentencias)y a continuación la variable de control del bucle se incrementa.

Nota:Cada parte del buclef o r es opcional.Esfrecuente que14s variables de control de unf o r sólose necesiten en el

bucle,encuyo caso pueden declararse en la zona de inicialización.

Por ejemplo, para ejecutar una sentencia1 O veces se puede utilizar cualquierade los dos siguientes buclesf o r :

f o r ( i n t i =l ; i <=l O; i ++) i n t i ;

Sys t em out . pr i nt l n( i ); f or ( i =l ; i <=l O; i ++jSys t em out . pr i nt l n ( i );

/ / Syst er n. out . pr i nt l n( i j ; Sys t em out . pr i nt l n( i ) ;/ / i no est á def i ni da / / i val e 11

En estos ejemplos, la sentenciaf o r inicializai a 1, comprueba quei es menoro igual a1 Oy ejecuta la siguiente sentencia que muestra el valor dei . A continua-ción se incrementai y se compara conl O , como todavía es menor, se repite el bucle hasta que se cumpla la condición de terminación(i = 11).

Si en lugar de una sola sentencia se desea ejecutar un grupo de sentencias, éstaseencierran entre llaves.

f o r ( i =l ; i <=10; ++){

Sys t er n. out . pr i nt l n ( i );Sys t em out . pr i nt l n( " i * 10 = " +i * l Oj ;

\

El siguiente buclef o r , sin embargo, no ejecuta ninguna sentencia, sólo laini-cializacióny los sucesivos incrementos de la variable de control hasta alcanzar lacondición de terminación:

for ( i n t i =l ; i <=2000000000; i +t );

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 100/481

82 Java 2. Manual de programación

Los ejemplos anteriores muestranun incremento de la variable de control d bucle, con lo que la cuenta, realmente, era siempre ascendente. Un buclef o r puedetambién decrementarsu variable de control produciendoun bucle que cuente en

sentido descendente.f or ( i nt 1=10; i >=l ; i - )

Sys t em out . pr i nt l n( i );

Nota:La variable de control de una sentenciaf o r puede ser de cualquier tiposimple.

for dxble i =10; i >=; i -0. 5) for (&ar i='a' ; <= z ; i ++)System out . pr i nt l n( i ); System out . pr i nt ( i );

La expresión de incremento de un buclefo r no siempre serán sumaso restas sim- ples. Se puede utilizar cualquier expresión que tenga sentido en el problema qresolviendo.Así por ejemplo, para visualizarlosvalores1 2 I 4 8 16 32 64 1 28se puede utilizar la expresióni *2 para realizar el incremento.

f o r ( i =l ; i < 200; i *=2)Sys t em out . pr i nt l n ( i );

Es posible usar el operador coma en las cláusulas de inicialización e incr

f o r ( i =O, j =14; ( i +j >= O) ; i ++, j - = 2 )i

Sys t e m out . pr i nt ( i +" + " +j +" = " ) ;

Sys t em out . pr i nt l n( i +j ) ;1

Cada parte del buclef o r es opcional, de forma que se pueden omitir lassec-ciones de control si ese tratamiento es el adecuado para el problema a resoejemplo, el siguiente buclefo r incrementa la variable de control del bucle, independencia del mecanismo de iteración:

f or ( i = ; i < 10; ) i t +;

O bien se puede omitir la sección de inicialización:i nt i =O;f o r ( ; i < 10; i ++)

Sys t em out . pr i nt l n ( i );

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 101/481

Decisiones y bucles 83

Es posible poner como condición enun buclefo r cualquier expresión de tipobool ean, incluso expresiones no relacionadas con la variable de control.

Ejercicio

Determinar si un número entero leído desde teclado eso no primo.

i mpor t j a v a . i o . * ;publ i c cl ass NumPr i mo

publ i c s t at i c voi d mai n ( St r i ng ar gs I )

I nput St r eamReader i s r = new I nput St r eamReader ( Sy s t em i n) ;Buf f er edReader br = new Buf f er edReader ( i s r ) ;St r i ng cadena;tryi

Sys t em out . pr i nt ( "Deme un númer o ent er o " ) ;

cadena = br . r eadLi ne( ) ;

i nt i = 1nt eger . par s eI nt ( cadena) ;

bool ean pr i mo = t r ue;i n t r ai z 2 = ( i nt ) Mat h. s qr t ( i ) ;for ( i n t d=2; pr i mo & & d <= r a i z2; d++)

i f ( i % d == O)pr i mo = f al se;

i f ( i == O ! pr i mo)

el seSy s t em out . pr i nt ( " El " +i +" es compuest o ") ;

Sy s t em out . pr i nt ( " El " +i +" es pr i mo") ;

icat ch( Except i on e)i

1

Syst em. out . pr i nt l n( "Cual qui er t i po de er r or " ) ;

3.6. LA SENTENCIAbreak

En apartados anteriores seusó la sentenciabr eak con la sentenciaswi t ch paraabandonar dicha sentencia tras la ejecución de las sentencias asociadasa una deter -minada cláusulacase. La sentenciabreak se puede utilizar también con las sen-tencias repetitivas,whi l e, do- whi l e y fo r para rompero salir de un buclecuando se produce alguna situación especial.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 102/481

84 Java 2. Manual de programación

public c l a s s Brl

public s t a t i c void mai n ( St r i ng[ ] ar gs)1

i n t n;

for ( n=O; n<100; n++)t

Sys t em out . pr i nt ( n+" " ) ;

i f ( n == 5 0 ) bre ak;I

1I

Si hay bucles anidados, una sentencia b reak colocada en el bucle interno sus- pende únicamente la ejecución de dicho bucle interior.

public c l a s s Br 2

public s t a t i c void mai n ( St r i ng[ ] args)i

i n t n, m;

f o r ( m=O; m<10; m++)i

f o r ( n=O; n<100; n++)i

Sys t em out . pr i nt ( n+" " ) ;

i f ( n == 5 0 ) break;ISys t em out . pr i nt l n( ) ;

1

Para abandonar una serie de estructuras anidadas puede utilizarse b reak e t i -que t a ; , donde la etiqueta puede ser cualquier identificador válido. Cuando -cuta esta sentencia, el control se transfiere a la sentencia siguiente a un etiquetado con dicho nombre dee t i q u e t a seguido por el signo de dos puntosque, además, debe ser el que contenga la sentencia b reak e t i q u e t a .

public c l a s s Br 3I public s t a t i c void mai n ( St r i ng[ ] a r g s )

ii n t n, m;par ar :t

f o r ( m = O ; m < 10; mt t )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 103/481

Decisiones y bucles 85

f o r ( n = O; n < 1 3 3 ; n--1

if ( rn = y - 2 ) b r e a k p a r a r ;Syl i t e rn .o ; t . pr i nt ( n i " " ) ;i f ( n 53) b r e a k ;

S y s t e n i . o u : . p r i n t l n ) ;

} / / f ; n del bl oque c c n l a et i quet aSyc t e r n. out . pr i nt l n0;S y c t e r n . o u t . p r i n t l n ( " F I N" );

3.7. LA SENTENCIAcontinue

La sentenciacont i nue es similar abr eak, perosólose puede usar en bucles,y, además,cont i nue no salta fuera del bucle, simplemente salta sobrelas sen-tencias restantes del bucley transfiere el control al final del bucle ejecutándoselasiguiente iteración del mismo. En consecuencia, una sentenciacont i nue se uti-liza para comenzar inmediatamente la siguiente iteración de un bucle.Se puedeutilizarcont i nue con buclesf o r ,whi l e y do- whi l e. El formato deCCR-

t i nue es:

c o n t i n u e ;

Una sentenciacont i nue en cualquier buclef o r salta inmediatamente a laexpresión de control del bucle. En otras palabras, dado este bucle:

f o r ( s e n t e n c i a ; expresióni; expres ión2)i

i f ( e x p r e s i j n 3 ) c o n t i n u e ;sen tenc ia ;

i

si expr esi ón3 es verdadera, la sentenciacont i nue hace que seevalUeinme-diatamenteexpr es i ón2,saltándose todasla/s sentencia/sa ejecutar queviene/ndespués de ella. Java permite elusode etiquetas en la sentenciacont i nue

c o n t i n u e e ti que t a ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 104/481

86 Java 2. Manual de programación

con las que especificar el bloque al que se aplica.

p u b l i c class Ccr t i

pub l i c s t a t i c v o i d rna i r : ( c ; t : n c j [ 1 clrcq:;)

i n t n , rn;uno :f o r ( r n = O ; r r < l O ; m t t )

f o r ( n=O; n i l O C ; n++)

Sys t em out . pr i r . t ni " " ) ;

i f (r. == 59) c o n t i n u e uno;

Cys t er . oct . pr i nt . . n ) ;

Sys t en. oc t . pr i nt l n0;

C y s t e m . c ¿ i t . p r i n t l n ( " F I N" );

3.8. DIFERENCIAS ENTREcontinue Y break

La sentenciacont i nue fuerza una nueva iteración, mientrasquc b r e a k fuerza lasalida del bucle. En el siguiente ejemplo, se muestra la diferencia entre amb-tencias. Enel se observa como el mensaje" E l bucl e" nunca se visualiza, peroen cada bucle por una causa diferente(break en el primeroy cont i nue en elsegundo).

t b r e a k ;Sys:ern.out . p r i n~l n 21 buc l e" ) ;

f o r ( 1 =C; - < = ; o ; j t t )

c o n t i n u e ;

Cys t er n. out . pr l nt i n( " E l buc l e" ) ;

Otro ejemplo más completo para observar la diferencia de funcionamient b r e a k y cont i nue es el que se muestra a continuación:

i

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 105/481

Decisiones y bucles 87

p u b l i c c l a s s B r y Ci

p u b l i c s t a t i c v o i d mal - , ( Y t - i n j [ ] . ,LJL)

i f ( c u e n t a > 5 ) c o n t i n u e ;Cys t em. out . j r i nt( c i i e r. t , i . + " 1 ;

I

C y c t e m . o ? i t . p r ~ n t l r , ) ;

Sy s t e m out . pr i nt i n( " Después del b i c l e : c i e n t a = ' I - -"2cT. : <) ;

Cy s t e m. o ut . pr i nt 1n( " C o m i e r i z cb e l bucl e ' co?, r c k " ) ;

f o r ( c ; i e n t a ,7 1 ; c1uent.a 11 2 ; ( , L i e n t a t + )

{i f ( c u e n t a > 5) b rea k ;Cy s t e m out . pr i nt (cue::t.ci+" " ) ;

I

Syst em. out . p r ; r,t 1n ( ) ;

Sys t em out . p r i n t l n( " 3 e s p u é s del s u c l e : c u e n t a " ~ c u e r . : a ) ;

I

AI ejecutar el programa se observa quelos buclesf o r cuentan hasta5 y sedetienen. Después del primer bucle, sin embargo, el valor dec u e n t a es 11, ydespués del segundo es6 . La razón es que en el segundo bucle b r e a k fuerza laterminacióny salida del bucle. Sin embargo, la sentenciac o n t i n u e , al igualque b r e a k , sólodebe utilizarse cuando no existe otra alternativa. Porejeniplo.el listado

p u b l i c class Cont 2

p u b l i c s t a t i c v o i d mai n ( Ct r i nq: ; a r q c )i

f o r ( i n t 2 = O ; i < 10; i t +)t

if ( i ! = 2 ) c o n t i n u e ;

~ys t em. out . pr i nt l n( " ; = - 1 ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 106/481

88 Java 2. Manual de programación

muestrasólo una línea,i 2 . Si i es igual aO I 1 , 3 I 4, 5, 6, 7 8, 9,cont i nue salta sobre la sentenciaSyst em. o u t . p r i n t l n .Este caso es un malejemplo de aplicación decont i nue, ya que se puede evitar reescribiendo el cód

go de esta manera:

=

p u b l i c class Si nCont

p u b l i c s t a t i c void r a i n ( St r i ng[ ] a r T s )

f o r ( i n t : = O ; I < 13; ; t t )

if (: == 2 )C y s t em. o 1 t . pr i nt r i ( i = " t i ) ;

3.9. LA SENTENCIA while

El buclewhi l e ejecuta una sentenciao bloque de sentenciasmientrusse cumpleuna determinada condición;esdecir, la accióno accionesse repiten mientras la con-dición es verdadera. La sintaxis general de la sentenciawhi l e es:

w hi l e ( expresión) w h i l e (expres Ó n )sen ten i a ; {

/ / s e c u e n c i a de sent enci a - .\

Si expresión es verdad, la sentenciao grupode sentenciasse ejecutan.Cuando laexpresión es falsa, el buclewhi l e se terminay el programa reanu-da su qjecuciónen la primera sentencia después del bucle.

i n t i =l ;w hi l e ( 1 <= 100)

Cyc t em out . pr i nt l n( " i = +I ) ;

:++:

i i i i l c e jec t i tdla primera iteración ya que1 tieneu n valor menor que100.t incrementasu valor en1 a cada iteración, cuandoI sea igual a1 O1, la

I 1 ~ <=I OO será falsay el bucle seterinina.Unejeniplo de su aplicación esi 1 < . - ) I ogi aina:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 107/481

y bucles 89

i mpor tpubl i c cl ass

publ i c st at i c voi d mai n ( St r i ng ar gs

I nput St r eamReader = new Buf f er edReader br = newSt r i ng cadena;i nt n=O ;

( " Deme un númer o ent er o ;

cadena = br . ;

n = I nt eger ( cadena) ;

cat ch ( Except i on e )

i ntwhi l e

( " I t er aci ón:

La sentenciawhi l e es adecuada para muchas tareas. Un uso típico dewhi l een programación es asegurar entradas de usuario válidas.El programa solicita alusuario si deseao no continuar con el programa mediante mensajes adecuadosymientras el usuario no indica expresamente una respuesta negativa,no (por ejem- plo, mediante la pulsación de la letran o N), se sigue ejecutando el bucle.

i mpor t

publ i c c l ass Whi l e2publ i c s t at i c voi d mai n ( St r i ng[ ] ar gs)

. pr i nt cont i nuar ? ;

char respi nt num =

Syst em. i n. ski p ;

whi l e ( r esp ! = resp ! = num ! = 2)

( "Pul se n o N y par a s a l i r " ) ;

( S I " ) ;

resp

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 108/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 109/481

Decisiones y bucles 91

La sentenciawhi l e ejecuta el bloque de sentencias, mientras quenumno seaigual a cero. Cuando el usuario introduce un valor de entrada cero se termina e bucley se presenta en consola la suma resultante. Si el usuario comienza por intro-ducirun cero, el bucle no se ejecutaráy la suma será cero. Otro uso común de lasentenciawhi l e es procesar dalos desdeun archivo en disco.Estaoperación essimilara la entrada de datos por teclado con la diferencia de quelos valores deentrada se leen desdeel archivo.

Un problema frecuente en programacion se produce cuando aparecen buclesinfinitos.Un bucleinfinito es aquel que nunca termina.Los bucleswhi l e infinitosse producen debidoa que la condición que se comprueba nunca se hace falsa, demodo que el buclewhi l e ejecuta repetidamente sus sentencias unay otra vez. Sise entra en un bucle infinito se podrá salir deél mediante la pulsación conjunta de

las teclasGYRI, y B R FA K ( r x i , t r i i ? m i < )

3.10. LA SENTENCIAdo - while

La sentenciado- whi l ees similar a la sentenciawhi l e, excepto que lae x p r e -

sión se comprueba después de que el bloque de sentencias se ejecute (mientrasque la sentenciawhi l e realiza la prueba antes de que se ejecute el bloque de sen-tencias). La sintaxis de la sentenciado- whi l ees:

do

while (expresión) ;

sen t en ci a ;

do

sentencias;

while (expresión) ;

La/s s e n t e n c i a / s se ejecutany, a continuación, se evalúa lae x p r e s i ó n .Si la expresión se evalúa a un valor verdadero,las sentencias se ejecutan de nuevo.

Este proceso se repite hasta que expresión se evalúa a un valor falso, en cuyomomento se sale de la sentenciado- whi l e. Dado que el test condicional se rea-liza al final del bucle la sentenciao bloque de sentencias se ejecuta al menos unavez.

Ejemplo

public class DoWhi l e li

public static void mai n ( S t r i ng[ ] a r g s )iint i = 1;while ( i < 6)i

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 110/481

92 Java 2. Manual de programación

Cys t e m out . pr i nt l n( "Bucl e whi l e " t i ) ;

i t + ;

ii = 1;doiSys t e m out . pr i nt l n( " Bucl e d o - W~Lc + i ) ;

i t +;

while ( i < 6 ) ;

Cuando se ejecuta este programa, se visualiza:

Si se modifica el archivo anterior de modo que la expresión sea falsa la pvez que se ejecutan los bucles se puede observar la diferencia entre las senwhi l e y do- whi l e.

Ejemplo

public class DoWhi l e2

public static void mai n ( St r i ng/ ]a rgs )

int i = 6;while ( i < 6)tSys t em out . pr i nt l n( "Bucl e whi l e " t i ) ;i +t ;}i = 6;do

iSys t e m out . pr i nt l n( "Bucl e do- whi l e " t i ) ;i t +;

while ( i < 6) ;

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 111/481

Decisiones y bucles

Al ejecutar el programa anterior, se visualiza:

Bucl e do- whi l e 6

Ejemplo

Calcular el número de años que ha de estar invertido un capital para que se dup-que. Se proporcionarán desde teclado el tanto por ciento de interésy el capitalinicial.

import public class I nt er es

public static void mai n ( St r i ng[ ] ar gs)

= newBuf f er edReader br = newSt r i ng cadena;double = O;double = O;double

. pr i nt ( " I ndi que el capi t al i ni ci alcadena = br .Doubl e = new

=

=

( "I ndi que el de i nt er éscadena =

= newi nt er es = .doubl eval ue

años =

do

años = años 1;= +

while 2 * ;

( "El númer o de años que ha de"est ar i nver t i do par a poder"dupl i car se es años) ;

e)

En un bucledo -whi 1e sila expresión se evalúaa un valor ver -dadero,lassentencias se ejecutan de nuevo.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 112/481

4.3.4.4.4.5.4.6.4.7.4.8.4.9.

4.1O.4.14.12.4.13.

Acceso a Datosy Métodos.Utilización de métodos.Paso de parámetros.Paso de parámetros por valor.Paso de parámetros por referencia.Constructores.Modificadores de acceso.pr i vat e.pr ot ect ed.publ i c.Recursividad.

95

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 113/481

96 Java 2. Manual de programación

La programación en lenguajes procedimentales- tales comoBASIC, C, Pascal, Aday COBOL-implica estructura de datos,diseño de algoritmosy traducción de algoritmos en código. Lapro -

gramación orientada a objetos es un tipo de programación queintroduce construcciones específicas llamadasobjetos, que a suvez contienendatos y procedimientos. Los objetos hacen la pro-gramación más fácily menos propensa a errores. Un programa enJava implica un conjuntoo colección de objetos que cooperanentre sí. En este capítulo se introducenlos fundamentos de pro-gramación orientada a objetos:conceptos de clases y objetos,declaración de clases, creación de objetos, manipulación de obje-fosy cómo trabajan los objetos entre sí.

4.1. OBJETOSY CLASES

Un objetoes una colección de datosy las subrutinaso métodosque operan sobre ellos.Losobjetos representan cosas físicaso abstractas, pero que tienen unestadoy uncom-

portamiento.Por ejemplo, una mesa,un estudiante, un círculo, una cuenta corriente, préstamo, un automóvil,... se consideran objetos. Así, ciertas propiedades definen a unobjetoy ciertas propiedades definenlo que hace. Lasquedefinen el objeto se conocencomocamposde datosy el comportamiento delosobjetos se define comométodos.La Figura4.1muestra un diagrama deun objeto con sus campos de datosy métodos.

I campodato1 I

campo datoE L I

I método2Objeto

Figura 4.1. Un objeto contiene datosy métodos

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 114/481

Clases, objetosy métodos

Un objetoC i r c u l o contieneun campo de dator a d i o que es la propiedad quecaracterizaun círculo. El comportamiento deun círculo permite calcular su super -ficiey su longitud.Así,un objetoC i r c u l o se muestra en la Figura 4.2.

campo dato: r adi o

objeto C i r c u l o

método: cal r f i

Figura 4.2.

Las clases son estructuraso plantillas que sirven para definir un objeto. Enuna clase Java, se pueden utilizardatos para describir propiedades y métodosque definensu comportamiento. Una clase deun objeto contiene una colecciónde métodosy definiciones de datos. Si se diseña una clase que representa a uncliente, no se ha creado un objeto. Un objeto es unainstancia (ejemplar, caso) dela clase i e n t e y, por consiguiente, puede, naturalmente, haber muchos obje-

tos de la claseC l i e n t e . La creación de una variable específica de un tipo par -ticular de clase se conoce comoinstanciación (creación de instancias) de esaclase.

Una clase describe la constitución de un objetoy sirve como plantilla paraconstruir objetos, especificando la interfaz pública de un objeto. Una clase tieun nombrey especificalos miembros que pertenecen a la clase, que pueden sercampos (datos)y métodos (procedimientos). Una vez que se define una clase, elnombre de la clase se convierte en un nuevo tipo de datoy se utiliza para:

Declarar variables de ese tipo.Crear objetos de ese tipo.

El siguiente ejemplo representa una claseC i r c u l o que se utilizara para cons-truir objetos del tipoC i r c u l o :

class Ci r cul o

double r adi odouble

return

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 115/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 116/481

Clases, objetosy métodos 99

La variablemi ci r cul oes una instancia de la claseCi r cul o.La creación deun objeto de una clase se llamacreacirjnde una instancia dela clase.Un objeto essimilar a una variable que tieneun tipo clase. La creación de variables deun tipo de

dato primitivo se realiza simplemente declarándolas, esta operación crealavariabley le asigna espacio en memoria:

i n t j ;

I . Creuciónde la clase.2. Declarar los objetos.3. Crear los objetos.

Unavuriuhlede tipoc h s ees unavuriablereferencia,que puede contener la direc-ción de en memoria(o referencia) deun objeto de la claseo n u l l para una referen-cia no válida. La declaración deun objeto simplemente asocia el objeto con una clase,haciendo al objeto una instancia de esa clase.Lu declaración no crea el objeto.Paracrear realmentemi ci r cul o (objeto de la claseCi r cul o)se necesita utilizar el ope-radornew con el objeto de indicar a la computadora que creeun objetomi ci r cul oy asigne espacio de memoria para ella. La sintaxis para crear un objeto es:

nombr eobj et o = n e w Nombr ecl ase 0 ;

Ejemplo

La siguiente sentencia creaun objeto,m c i r c u l o ,y le asigna memoria:

mi ci r cul o = n e w Ci r cul oO ;

Declaración e Instanciación

Se pueden combinar ladeclaracióny la instanciacibnen una sola sentencia con lasiguiente sintaxis:

Nombr eCl ace nombr eobj et o = n e w Nombr eCl aseO;

Ejemplo

Creación e instanciación demi ci r cul o en una etapa:

Ci r cul o m i c i r c u l o = n e w Ci r cul o( ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 117/481

100 Java 2. Manual de programación

4.3. ACCESO A DATOSYMÉTODOS

Después de que se ha creadoun objeto, se puede acceder a sus datosy métodosuti-lizando la notación siguiente:

nombr e0bj et o. dat osnombr eObj et o. met odo( )

Referencia aun dato deun objetoReferenciaa un método deun objeto

Ejemplo

m Ci r c ul o. r adi o radio demi ci r cul om Ci r c ul o. cal cul ar Cuper f i c i e( ) devuelve la superficie demi ci r cul o

4.4. UTILIZACIÓN DEMÉTODOS

Los miembros deun objeto sonlos elementos dato, alos que también se puededenominarvariables de instancia,y losmétodos.Losmétodos sonaccioncsque serealizan porun objeto de una clase. Una invocación a un método es una peticialmétodo para que ejecutesu accióny lohaga con el objeto mencionado. La invoca-ción deun método se denominaría tambiénllamar a un métodoy pasar un mensa-

j e a unobjeto.Existen dos tipos de métodos, aquellos que devuelvenun valor Únicoy aquellos

que ejecutan alguna acción distinta de devolverun Único valor.El métodor e a d I n t es un ejemplo deun método que devuelveun Único valor de tipoi n t .El método p r i n t l n es un ejemplo de un método que realiza alguna acción dist-ta de devolverun valor único.

Nota:Existen dos tipos de métodos: aquellos que devuelven un Único valoyaquellos que realizan alguna acción distinta de devolver un valor.Losméto-dos que realizan alguna acción distinta de devolver un valor se denomimétodosvoid.

La implementación delosmétodos podría ser como ésta:

public class Cuent acor r i ent ei

private double sal do;

public void deposi t ar (double cant i dad)

sal do = sal do + cant i dad;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 118/481

sal do = sal do - cant i dad;

public double o t> t . c : r i e r S~ i 1do ( )

’.return cal do;

La ilumudu o invocucióna un métodose puede realizar de dos formas, depen-diendo de que el método devuelvao no un valor.

1 . Si el método devuelve un valor, la llamada al método se trata normalmentecomo un valor. Por ejemplo,

int mayor -- m x ( 3 , 4 ) ;

llama al métodomax ( 3 , 4 ) y asigna el resultado del método a la variablemayor . Otro ejemplo puede ser la llamada

Sys t em. out . pr i nt l n( max( 3, 4) ) ;

que imprimeel valor devuelto por la llamada al métodomax ( 3 , 4 ) .

2. Si el método devuelvev o i d , una llamada al método debe ser una sentencia.Por ejemplo,el métodopr i nt l n ( ) devuelvevoi d. La siguiente llamadaes una sentencia

Syst em. out . pr i nt l n( “ C i e r r a de Cazor l a”) ;

Si seconsidera ahora un objetom cuent a de la claseCuent acor r i ent e

Cuent acor r i ent e m c uent a;

una invocación al método depositar tendrá el formato

m Cuent a. depos i t ar ( 2400) ;

Cuando un programa llama a un método, el control del programa se trans-fiere al método llamado. Un método llamado devuelveel control al llamadorcuando se ejecute su sentenciare turn o cuando se alcance la llave de cie-rre0).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 119/481

102 Java 2. Manual de programación

4.5. PASO DE PARÁMETROS

La cabecera de un método especifica el número y tipo de parámetros formrequeridos. Java no soporta parámetros opcionaleso de longitud variable. En elinterior de una clase, un método se identifica nosOlo porSLInombre, sino también porsu lista de parámetros formales. Por consiguiente, el mismo nombre de mse puede definirmús de una vez con diferentes parámetros formales para consegla sobrecargade métodos.

Cuando se llama a un método, se deben proporcionar un númeroy tipocorrectos de argumentos. Los argumentos incluidos en la llamada a un méconocen como argumentos (parámetros) realeso simplemente argumentos. La

llamada a un método exige proporcionarle parámetros reales (actuales) deben dar en el mismo orden que la lista de parámetros formales en la e-cación del método. Esta regla se conoce comoasociocicíii tiel orden de 10s pur&metr'os.

Ejemplo

El métodoi mpr i m r Nimprime un mensajen veces:

void i r n p r i r n i r N ( S t r i n g mensaj e, int n)i

for (int =O; i <n; i + +S y s t e r n . o u t . p r i n t l n ( mensaj e) ;

1

1. Invocación correcta

Una invocacióni mpr i m r N( "Car chel ejo" , 4) imprime la palabraCar chel ejocuatro veces. El proceso es el siguiente.

La invocación ai mpr i m r N pasa el parametro real cadena" Car chel ejo , al parametro formalmensaj e y el parametro real4 a la variablen.

Se imprime4 veces la fraseCar chel ej o.

2. Invocación incorrecta

La sentenciai mpr i m r N( 4,"Car chel ej o") es incorrecta, yaque el tipo dedato 4 no coincide con el tipo del parámetromensaj e y, de igual modo, elsegundo parámetro"Car chel e o ' ' tampoco coincide con el tipo del segund parámetroformaln.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 120/481

Clases, objetos y métodos 103

La operación de enlazar(hitiding)los argumentos reales alos argumentos for -males se denominapuso de urgumetitos.Cuando se llama a un método con más deun argumento, dichos argumentos se evalúan de modo secuencial, de izquierda aderecha. Existen dos tipos de paso de parámetros: por valory por referencia.

4.6. PASO DE PARÁMETROSPOR VALOR

Todoslos tipos de datospriinitivos( i n t , l o n g , f l oat , bool ean) se pasan enlosmétodos por valor.En otras palabras,susvaloresse copianen nuevas posicio-nes, que se pasan a la subrutina (método); como consecuencia de esto,si un argu-mentose cambia dentro de un método, no se cambiará en el programa llamadororiginal.El siguiente método no producirá un cambio enx:

void cambi ar üni dades ( f l o a t x, f l o a t f a c t o r )

. . .t

x = x * f í . , c t o r ; / / x no se pUede mc di f i c ar e c e - --a;acior

El único método sencillo para obtenerun valor que se calcula dentro de una clasees utilizar un método cuyo tipo no seavoi d que específicamente devuelva un valor.

f l o a t c a y - o i a r ( f l o a t x, f l o a t f a c t o r )

r e t u r n ( x * f a c t - o r ) ; / / el nuevc x se a e v ; l e l v e ai Ll amaaorI

4.7. PASO DE PARÁMETROSPOR REFERENCIA

Los objetos, incluyendo arrays, se llamantipos referencia,ya que se pasan enlosmétodos por referencia en lugar de por valor. AI igual que se pueden pasar tipos pri-mitivos, se pueden también pasar objetos a métodos como parámetros reales.

Existe una diferencia importante entreel paso de un valor de variables de tiposde datos primitivos yel paso de objetos.El paso de una variable de un tipo primiti-vo significa, como ya se ha comentado, que el valor de la variable se pasa a un pará-metro formal. El cambio del valor del parámetro local en el interior del método noafecta al valor de la variable en el exterior del método.

El paso de un objeto significa que la referencia del objeto se pasa a un paráme-tro formal. Cualquier cambio al objeto local que suceda dentro del cuerpo del método afectará al objeto original que se pasa como argumento. Este tipo de paso de parámetros se denomina paso porrefkrencia.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 121/481

104 Java 2. Manual de programación

Ejemplo

El objetomi ci r cul o de la claseCi r cul ose pasa como argumento al métod

i mpr i m r c i r cul o( ) ;

C i r c u l o m i c i r c u l o = new C i r c u l o ( 1 0 .O ) ;

i r n p r i m i r C i r c u l o ( m i C i r c u 1 o ) ;

4.8. CONSTRUCTORES

Unconstructores un tipo especial de método que permite queun objeto seinicia-lice a valores definidos para sus datos.El constructor tiene exactamente el mismnombre que la clase a la cual pertenece; esun métodopubl i c, es decir,un méto-do al que puede accederse desde cualquier parte deun programa.

Ejemplo

class MiClase

int micampo ;

public MiClase ( int v a l o r ) / / cons t ruc to ri

1micampo = v a l o r ;

1

Elconstructor de una clase comienza con la palabra reservadapubl i c y después dela palabra reservadapub1i c viene el nombre del constructor seguido porsusargumen-tos entre paréntesis. Cuando se crea un objeto de la clase se deben proporcionlosargumentos requeridos por el constructor.Losconstructores se puedensobrecargar,loque permite construir objetos con diferentes tipos de valores iniciales de da

Ejemplo

En la claseCi r cul ose pueden añadirlossiguientes constructores:C i r c u l o (double r )i

r a d i o = r ;

C i r c u l o ( )

ir a d i o = 4 . 0

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 122/481

Clases,objetos y métodos 105

Para crearun nuevo objetoCi r cul ode radio6. O se puede utilizar la siguien-te sentencia que asignaun valor6 . O a m c i r c u l o .r adi o:

mi ci r cul o = new Ci r cul o ( 6. ) ;

Si se creaun círculo utilizando la sentencia siguiente, se utiliza el segundo cons-tructor que asigna el radio por defecto4 . O a m c i r c u l o .r adi o:

mi ci r cul o = new Ci r cul o( ) ;

Advertencia:Losconstructores son métodos especiales que no requierenuntipo de retorno, ni inclusovoid.

Si una clase no tiene constructores, se utiliza unconstructorpordefecto que noinicializarálos datos del objeto. Si no se utilizan constructores, todos los objetosseránel mismo.

Ejemplo

Dada la clase

c l a s s Mi Cl ace{

i n t mi campo;p u b l i c Mi c l as e( i n t val or )t

1mi campo = val or ;

1

Si se desea crear un objeto de una claseMi c l ase,se debe proporcionar unvalor entero que la clase utiliza para inicializar el campo datomi campo. Este ente-ro es el único argumento del constructor deMi Cl ase. Se creará un objetode laclase con una sentencia como ésta:

Esta línea de programa no sólo crea un objeto de la claseMi Cl ase,sino queinicializa el campomi campo al valor5.

Ejercicio

El siguiente programa crea dos objetosCi r cu1o,de radios1 O y 2, y visualiza sussuperficies.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 123/481

106 Java 2. Manual de programación

class T e s t C o n s t r u c t o r e s C i r - u l oi

public static void mai n ( St r i ng [ args)i

/ / Ci r cul o de r adi o 10. CCi r cul o mi c i r cul o new C i r c i i i l o(1:). t i ) ;

Cys t em out . pr i nt l n( " L as uper f i c i e del r i r c ul o de r adi o ' ' Am Ci r c ul o. r ddi ot "es t

m Ci r c ul o. cal c , J l ar Super f i c i e) ) ;

/ / Ci r cul o con r adi o por def ec t oCi r cul o s uCi r c ul o = new C i r c i i l o ( ) ;

Sys t e m out . pr i nt l n( " L a s uper f i c i e del ci r cul o de r adi o f

s uCi r c ul o.r adi o+" es " +s uCi r c ul o. c al c ul ar Cuper f i c i e( ) ) ;

1

1

class Ci r cul oI

double r adi o;

Ci r cul o (double r )

r adi o = r ;1

Ci r c ul o ( )

r adi o = 2. 0;i

double c al c ul ar s uper f i c i e0

return r adi o* r adi o* 3. 14? 592;I

S a l i d aLa super f i c i e del c í r cul o de radi o 10. 0 es 314. 1592La super f i c i e del c í r cul o de r adi o 2. 0 es 12. 566368

Notas: La clase C i r c u l o tiene dos constructores. Se puede especificaradioo utilizar el radio por defecto para crear un objeto C i r c u l o .Así:

1. ElconstmctorCirculo( 1 0 .O )seutilizaparacrearuncírculoconunradio10.0.2. El constructor Circulo( ) se utiliza para crearun círculo conun radio por

defecto de2.0.Losdos objetos creados m i c i r c u l oy s u c i r c u l ocomparten losmismosmétodosy por consiguiente se pueden calcular sus superficies utilizandmétodoc a l c u l a r s u p e r fi c i e .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 124/481

Clases, objetos y métodos 107

4.9. MODIFICADORES DE ACCESO

Java proporciona modificadores para controlar el acceso a datos, métodosy cla-ses,con lo que se consigue proteger a las variablesy los métodos del acceso deotros objetos.En Java, se pueden utilizar especificadores de acceso para prote-ger a variablesy métodos de una clase cuando ésta se declara. Existen cuatrodiferentes niveles de acceso: p r i v a t e , p r o t e c t e d , publ i c y, si se deja sinespecificar, package. La Tabla 4.1 proporciona un resumen de los modifica-dores.

Tabla 4.1. Modificadores de acceso_ _ ~~ ~

Modificador Clase Método Datos Comentario

(pordefecto) -\I 4 4 Una clase, métodoo dato es visible en este paquete p u b l i c < v’ v’ Una clase, métodoo dato es visiblea todoslos programas

de cualquier paquete p r i v a t e \ t Un método o dato es sólo visible en esta clase p r o t e c t e d v \ Un métodoo datosesvisible en este paquete y en las

subclases de estaclaseen cualquier paquete

Nota:Un modificador que se puede aplicar a una clase se llamamodificadorde clase.Un modificador que se aplica a un método se llamamodificador demétodo. Un modificador quese puede aplicar a un campo dato se llamamodi-

ficador de datos.

Nota: El modificador p r i v a t e sólo se aplica a variableso a métodos.Si public o p r i v a t e no se utilizan, por defecto, las clases, métodosy datosson accesibles por cualquier clase del mismo paquete.

Precaución:Las variables asociadas conlos modificadores son los miembrosde la clase, no variables locales interiores a los métodos. Utilizandomodífica-dores en el interior del cuerpo de un método producirá un error de compila-ción.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 125/481

1O8 Java 2. Manual de programación

4.10. private

El nivel de acceso más restrictivo espr i vat e. U n miembro privado sólo es acce-sibleen la clase en que está definido. Se utiliza este nivel de acceso para dlosmiembros que se deben utilizarsóloen la clase. En realidad definelos métodosy losdatos alosquesólose puede acceder dentro de la clase en que están de-dos, pero no por las subclases.

El objetivo depr i vat e es proteger la información contenida en variables evitar que al ser accedido porun ((extraño)) pongan al objeto en estado inconsiste-te o bien para proteger a métodos que si se invocan desde el exterior pued- biar el estado del objetoo el programa en que se está ejecutando. De hecho

miembros privados son como secretos que no se difunden a ((extraños)).Para declarar unmiembro privado, se utiliza la palabra reservadapr i vat e ensu declaración. La claseDemoPr i vado contiene dos miembros privados: uvariabley un método.

p u b l i c c l a s s DemoPr i vado

p r i v a t e i n t dat opr i vado;private void met odoPr i vado ( 1

i

Syc t em out . pr i nt l n( "Es un mét odo pr i vado") ;

Funcionamiento

1. Elcódigo del interior de la claseDemoPr i vado puede inspeccionaro modi-ficar la variabledat opr i v ado y puede invocar al método

met odoPr i vado, pero nolo puede hacer ningún código pertenecientotra clase.

2. Otra clase externa,Ext er naDemo, no puede acceder alos miembros deDemoPri vado.

c l a s s Ext er naDemoi

void r net odoAcceco( )

i DemoPr i vado d = new DemoPr i vado ( ) ;

d. dat opr i vado =l o o; / / n o l egald. met odoPr i vado( 1 ; / / no l egal

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 126/481

Clases, objetos y métodos

3. Cuando una clase intenta acceder a una variable a la que no tiene acceso elcompilador imprimeun mensaje de error similar al mostrado en la Figura4.4y no compila el programa.

Figura 4.4. Error.

4. Sucede igual acciónsi se trata de acceder a un método privado.

4.11. protected

El especificador p r o t e c t e d permite que la propia clase, las subclasesy las cla-ses del mismo paquete, accedan alos miembros.Los miembros soncomolos ((secretos familiares)) compartidos por familiares, e incluso por amigos, pero no por ((extraños)).Losmiembros protegidos se declaran con la palabra re-servada p r o t e c t e d . Consideremos la claseDemoProtegido que se declaradentro de un paquete denominadoDemoy que tiene una variabley un método pro-tegidos.

packagep u b l i c c l a s sI

p r o t e c t e d i n tp ro tec t ed vo id

u n ;

Compilación

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 127/481

110 Java 2. Manual de programación

Funcionamiento

1 .La claseOt r aDemo es del paqueteDemo, pero no es subclase deDemoPr ot egi do. La claseOt r aDemo puede acceder legalmente a lavariabledat opr ot egi doe invocaral métodomet odoPr ot egi do:

package l i br o . Tema04. Demo;c l a s s OCr aDemo

void Vet odoAcc eso( )

DemoPr ot egi do d = new DemoPr ot egi do ( ) ;

d. dat oF r ot egi do = 100; / / l egald. met odoPr ot egi do( ) ; / / l egal

N o produce problemas enla compilación

¿ : \ ~~b r o ~~e ma C 4 \ De mo >~a v a cOt r aDemo. ava

2. SiOt r aDemo fuera una subclase deDemoPr ot egi doeste código sería tam- bién legal, ya que la clase esta en el mismo paquete queDemoPr ot egi do.

3. Las subclases externas del paquete de la superclase también tienen aclos miembros protegidos pero a través de una referencia al objeto:

package l i br o. Ter na34. DemoBi c;import l i br o . Tema04. Demo. " ;c l a s s NLeva extends CemoPr ot egi do

void ?, et odoAcceco ( DemoPr ot egi do d, Nueva n )t

d. dat opr o t egi do = 100; / / n o l egalnAa t c F r o t e gi do = 100; / / l egald. met odoPr ot eqi do( ) ; / / n o l egaln. met ouoPr ot eg; do( ) ; / / l egal

1

Se puede acceder alos miembros protegidos a través de un objeto de la cNueva, pero no a través de un objeto de la claseDemoPr ot egi do que no seriaválido.

AI compilar el programa se producen errores (Fig.4.5).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 128/481

Clases, objetosy métodos 111

Figura 4.5. Errores

Aunque en algunos ejercicios ya se han usado paquetes y se ha visto de forma práctica como trabajar con ellos,losconceptos sobre paquetes se explican con deta-lle en el Capítulo6.

4.12. public

El especificador de accesopubl i c es aquel que define las clases, métodos y datosde modo tal que todos los programas pueden acceder a ellos. Los miembros sedeclaran públicossólo si este acceso no puede producir resultados no deseables siun ((extraño))a elloslosutiliza. Se declara aun miembro público utilizando la pala- bra reservadapubl i c. Por ejemplo:

package NegocLos; public class EBusi nesc

pub l ic - i n t cant i dad;void operar 0

Sy s t e m out . pr i nt l n( “ E s .n mét odo púbi l c r ” );

4.1 3. RECURSIVIDAD

Un método esrecur.sivocuando directao indirectamente se llama así mismo. Lautilización de la recursividad es apropiada cuando el problema a resolvero losdatosa tratar han sido definidos de forma recursiva, aunque esto no garantiza que la mejoforma de resolver el problema sea la recursiva. La recursión es una alternativa a laiteración y las soluciones iterativas están más cercanas a la estructura de la compu-tadora. La definición de factorial de un número( n ! = n * (n - 1) ! para todonúmeron mayor queO, teniendo en cuenta que0 ! = 2 , es recursiva. La imple-

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 129/481

Java 2. Manual de programación

mentación se realiza de forma recursiva medianteun métodof a c t o r i a 1 que sellama sucesivamente así mismo.

p u b l i c class Funci on

/ / f act or i al r ecur s i vo p u b l i c s t a t i c l o n g f act or i al ( i n t

!i f ( n O )

r e t u r n - 1;i f == O )

r e t u r n 1;else

r e t u r n n * f act or i al

p u b l i c class Pr ueba

p u b l i c s t a t i c v o i d ( St r i ng' ] a rg s )

Funci on f = new Funci on ;

La funciónf act or i al también podría haber sido resuelta de forma itede la siguiente forma:

p u b l i c c l a s s Funci or . 2

/ / f act or i al i t er at i vo

p u b l i c s t a t i c l ong f act or i ali f O )

r e t u r n - 1;l ong f a c t = 1;whi le

f a c t = f a c t *n- - ;

r e t u r n f a c t ;

Todo algoritmo recursivo puede ser transformado en iterativo, para e-formación, en ocasiones, resulta necesario utilizar una pila. En el diseunaalgoritmo recursivo es preciso tener en cuenta que:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 130/481

Clases,objetos y métodos 1 13

La recursividad puede ser directao indirecta.El instrumento necesario para expresarlos algoritmos recursivamente es elmétodo.

Un método presenta recursividad directa cuando se llama así mismo dentrode su definición.La recursividad indirecta consiste en que un método llame a otro que, asuvez,contenga una referencia directao indirecta al primero.Un método recursivo debe disponer de unao varias instrucciones selectivasdonde establecer la condicióno condiciones de salida.Cada llamada recursiva debe aproximar haciael cumplimiento de lao las con-diciones de salida.

Cada vez que se llame al método los valores delos parámetrosy variableslocales serán almacenados en una pila.Durante la ejecución de dicho método, parámetros y variables tomarán nuevosvalores, conlosque trabajará el procedimientoo función.Cuando termine de ejecutarse el método, se retornará al nivel anterior, recupe-rándose de la pilalos valores tanto de parámetros por valor como de variableslocalesy continuándose la ejecución con la instrucción siguiente a la llamadarecursiva. Hay que tener en cuenta quela recuperación delosdatos almacena-dos en una pila se efectúa siempre en orden inverso a como se introdujeron.Los algoritmos recursivos enlos que distintas llamadas recursivas producenlos mismos cálculos es conveniente convertirlos en iterativos.Unejemplo deesta situación es el cálculo delosnúmeros deFi bonacci ,quesedefinen porla relación de recurrencia f i b o n a c c i . . = f i b o n a c c i - i i b o n a c -ci?.:, es decir,cadatérmino se obtiene sumandolos dos anteriores excepto

f i b o n a c c i = O y f i b o n a c c i = 1. La definición dada es recursivaysu implementación se muestra a continuación tanto de forma recursiva comoiterativa. Obsérvenselosdiferentes tiempos de ejecución según se utilice uno

u otro algoritmo. public class F i b c r i a c c i

/ / F i b o n a c c i r e c u r s i v o pub l i c s t a t i c l o n g f i b o r . a c ¿ i r ( i n t n)

i f ( n < O )

i f ( n == O )

else

r e t u r n - 1;

r e t u r n ( O ) ;

i f (I : := 1 )

elser e t u r n ( 1 ;

r e t u r n ( f b T n a c c i r ( r i - 1 ) - f i bonac c; r ( r i - 2 )) ;

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 131/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 132/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 133/481

116 Java 2. Manual de programación

Hayun gran número de problemas cuya solución requiere la aplicacióndos de tanteo de forma sistemática, es decir, ir probando todas las opc- bles. La técnica debacktrackingdivide la solución del problema en pasosy definela solución del pasoi-L;simoen función de la solución del pasoi-&.sirno+ 1 . Si noes posible llegar a una solución se retrocede para probar con otra posib

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 134/481

I 5

Herencia

CONTENIDO5.1. Descripción de herencia.5.2. La clase baseObj ect .5.3. Elmétodocl one.5.4. El métodoequal s.5.5. El métodof i nal i ze.5.6. Elmétodot os t r i ng.5.7. El métodoget cl ass .5.8. Ventajas de la herencia.5.9. Superclasesy subclases.

5.1O. Modificadoresy herencia.5.1 Clases abstractas.5.12. Métodos abstractos.5.13. Interfaces.5.14. Definición de una interfaz.

117

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 135/481

1 18 Java 2. Manual de programación

~~~~~

Una de las propiedades más sobresalientes de laprogramaciónorientada a objetos es la herencia, un mecanismo que sirve paradefinir objetos basados enotrosexistentes. Java soporta herencia

con extensión de clases, que permite definir una nueva clasebasada en otra clase ya existente sin modificarla. Tal nueva clasllamadasubclase o clase extendida, hereda los miembros de unasuperclase existente y añadeotrosmiembros propios.

Java soportaherencia simple a través deextensión de clases.En herencia simple una clase se extiende a partir de una únicasuperclase. Por ejemplo, una subclaseC u e n t a c o r r i e n t e sepuede extender (ampliar) de una superclaseCuenta o bienGerente de Empleado. Algunos lenguajes orientados a objetos,comoC++,soportanherencia múltiple, que es aquella en que una

subclase puede tener varias superclases. Java, por el contrario, nsoporta herencia múltiple aunque su funcionalidad puede ser co-seguida medianteinterfaces.

Este capítulo introduce al concepto deherencia. Específica-mente examinasuperclases y subclases, el uso de palabras reser -vadas, super y t h i s , 10s modificadores p r o t e c t e d , f i n a l ya b s t r a c t , diferentes clases Útilesy el diseño deinterfaces.

5.1. DESCRIPCIÓN DE HERENCIA

En terminología Java, la clase existente se denominasuperclase.La clase derivada dela superclase se denomina lasubclase.También se conoce a la superclase comoclase

padrey una subclase se conoce comoclase hija, clase extendidao clase derivada.La Figura5.1 contiene la definición de una clase para estudiantes. Un estu-

te es una persona, por lo que se puede definir la claseE st udi ant e que se derivade la clasePer sona. Una clase derivada es una clase que se define añadievariables de instanciay métodos a una clase existente. En el ejemplo de la Fig5.1,la clasePer sona es la clase basey la claseEst udi ant e es la clase deriva-da, Las clases derivadas tienen todas las variables de instanciay losmétodos de laclase base, más las variables de instanciay métodos que se necesiten añadir.

Persona

Figura 5.1. Jerarquía de clases.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 136/481

Herencia 119

La definición de una subclase tiene la sintaxis siguiente:

public class nombrecldre extends C l a c e B a c e

Un ejemplo puede ser: public class Estu=- ant e extends P e r c o z a

Nota: La herencia es siempretrunsitiva,de modo que una clase puede here-dar características de superclases de muchos niveles.

Si la clasePerro es una subclase de la claseMamí f er o y la claseMamí f er o es una subclase de la claseAni mal , entoncesPerro heredará atri- butos tanto deMamí f er o como deAni mal . Se pueden reutilizaro cambiarlosmétodos de las superclasesy se pueden añadir nuevos datos y nuevos métodos delas subclases. Las subclases pueden anular (redefinir) el comportamiento hered-do de la clase padre. Por ejemplo, la claseOr ni t or r i nco redefine el compor -tamiento heredado de la claseMami f er o, ya que los ornitorrincos ponenhuevos.

/, -- -

Animal y--.+

- Mamífero

I

Perro yA----- .

_I’ i.Ornitorrinco~~ ~

-_\

Figura 5.2. Herencia y redefinición de comportamientos.

5.2. LA CLASE BASEObject

En Java todas las clases utilizan herencia. A menos que se especifique lo contraritodas las clases se derivan de una clase raíz, denominadaOb] ect . Si no se pro- porciona explícitamente ninguna clase padre, se supone implícitamente la claObj ect . Así, la definición de la claseMi Pr i mer Pr ogr ama:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 137/481

120 Java 2. Manual de programación

public class Mi Pr i mer Pr ogr ama!

public static void mai n ( St r i ng [ I ar gs j!

i Syst em. out . pr i nt l n( "Mi pr i mer pr ogr ama J ava" j ;

es igual que la siguiente declaración:

import j ava. l ang. * ; public class Mi Pr i mer Pr ogr ama extends Obj ect

t public static void mai n ( St r i ng [ I ar gsj

I

Cys t em out . pr i nt l n( " Mipr i mer pr ogr ama J ava ") ;

1i

La claseOb] ect ' proporciona la funcionalidad mínima garantizada qcomún a todos los objetos (Fig.5.3).

Figura 5.3. Todas las clases son descendientes de la claseObj ect

http://java sun com/products/jd k/I .3/docs/api/java/lanE/Object.htrnl

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 138/481

Herencia 121

La claseOb e c t define e implementa el comportamiento que cada clase del sis-tema necesita. La claseObj ect esta en el nivel mas alto de la jerarquía y seencuentra definida en la bibliotecaj ava .l a n g . Cada clase del sistema Javaes undescendiente, directoo indirecto de la claseO b ec t . Esta clase define el estado básicoy el comportamiento que todoslosobjetos deben tener, tal como compararun objeto con otro objeto, convertir a una cadena, esperar una variable condiciónotificar a otros objetos que ha cambiado una variable condicióno devolver la clasedel objeto. La claseOb ect proporciona una funcionalidad mínima que garantizaun comportamiento común a todoslos objetos. Estos objetos incluyenlosmétodossiguientes:

publ i c bool ean equal s ( J ava . l ang .Obj ect ob Determinasi el objeto del

argumento es el mismo que elreceptor. Este método se puedeanular para cambiar el test deigualdad de clases diferentes.Devuelve la clase del receptor,un objeto de tipoCl ass .Devuelve unkaloraleatorio

para este objeto. Este métododebe también ser anulado cuando

publ i c f i nal j ava. l ang. Cl as sget Cl a c s 0

publ i c i nt hashcode ( )

publ i c 1ava. l ang. St r i ng t o s t r i ng0el métodoequal s se cambia.Convierte el objeto aun valorde cadena. Este métodoseanula también con frecuencia.

Regla: Losmétodos de la clase O b ect que se pueden anular o redefinir son:cl oneequal sf i nal i zet ost r i ng

Regla: Losmétodos que no se pueden anular en la clase O b j e c , ya que sonfinal, son:

get cl assnot i f y2

not i f yAl lwai t

Losmétodoswa; t y not i f y se tratarán en el capítulo destinadoa la programación multihilo.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 139/481

122 Java 2. Manual de programación

5.3. EL MÉTODOclone

Se puede utilizar el métodocl one para crear objetos de otros objetos del mismo ti

Por defecto,los objetos no son clónicos, de modo que la implementación demétodo del objeto lanza una excepciónCl oneNot Cuppor t edExcept i on. Si sedesea que la clase sea clónica, se debe impleinentar la interfazCl oneabl e y anulareste método.

p r o t e c t e d C' bj er t c l o r . e ( ) throws Cl oneKot Cuppor t edYxcept l on;

5.4. EL MÉTODOequals

Se utiliza paradeterminarla igualdad de dos objetos. Este método devuelvet ruesi los objetos son igualesy f al s e en caso contrario. El siguiente código com- prueba la igualdad de dos enteros( I nt eger ) :

I ni eger Pr i mer o = new I nt eger ( i ) ;I ni eger C e g u E d c = new I nt e ger ( i ) ;i f ( i r i ~er o. eqL al s ( Cegunas ) )

Cys t em ouz . pr i nZl n( "L o s O b j e t o s son i gual es ") ;

Este programa indicaría quelos objetos son iguales aunque referencian a obtos distintos.

5.5. ELMÉTODOfinalize

El métodof i n a l i ze no hace nada. Se redefinef i nal i ze para ejecutar opera-ciones especiales de limpieza antes de que se recoleccione la basura cordiente al objetoo cuando el programa termina.

p r o t e c t e d vo id f i nal i ze ( )

La llamada

Sys t er . r xnFi nal i z er c OnExi t ( t r ue);

solicita la ejecución de los métodosf i nal i ze cuando un programa termina. Sinla peticiónlosmétodosf i nal i ze no se invocan cuando termina un programa.

I En el Capítulo13 \e estudia el concepto de excepciones.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 140/481

Herencia 123

Nota:Cuandose utiliza el operadornew se reserva memoria, esta memoria noes necesario liberarla, pues Java realiza una recolección de basura automáticamediante un hilo de baja prioridad, en realidad undemonio, proporcionado porla máquina virtual de Java.

5.6. EL MÉTODOt o s t r i n g

El métodot os t r i ng deObj ect devuelve una representaciónSt r i ng del obje-to. Se puede utilizart os t r i ng junto conSyst em. out . pr i nt l n paravisuali-zar una representación de texto deun objeto, tal como el hilothread actual.

S y c t e r n . o u t . pr i nt l n( Thr ead. c ur r ent - hr ead( ). tol t r : ng ( ) ) ;

La representaciónSt r i ng de un objeto depende totalmente del objeto. LarepresentaciónSt r i ng deun objetoI nt eger es el valor entero visualizado comotexto. La representaciónSt r i ng de un objeto Thr ead contiene diversos atribu-tos sobre el hilo tal como su nombrey prioridad. Por ejemplo la salida de la ins-

trucción anterior podría ser:Thr ead[ ma i n, 5, mai nl

5.7. EL MÉTODOgetclass

Elmétodoget Cl a s s es un método final que devuelve una representación en tiem-

po de ejecución de la clase del objeto. Este método devuelveun objetoCl ass. Se puede consultar el objetoCl ass para obtener diversas informaciones sobre laclase, tal como su nombre, su superclasey los nombres delos interfaces queim- plementa.

public final j ava. l ang. Cl ac s get c l as s 0

Ejemplo

void i mpr i m r No mbr e Ob~e t o ( 0b J e c tb])

Cys t em out . pr i nt l n( "La cl ase del o b j e t o e s " +obj .get c l ass ( ) .get Name ( ) ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 141/481

124 Java 2. Manual de programación

Si el objetoob) pasado como parámetro fuera de tipoI nt eger , la llamada aeste método devolvería:

La cl ase del obl et o es j ava. l ang. I nt eger

5.8. VENTAJASDE LA HERENCIA

El mecanismo de herencia presenta importantes ventajas:

Facilidad en la modificación de clases.Evita la modificación del código ex-tente al utilizar la herencia para añadir nuevas característicaso cambiar carac-terísticas existentes.Extracción decommalidadde clasesdifirentes.Evita la duplicación deestructuras/códigoidénticoo similar en clases diferentes. Sencillamenteextraen las partes comunes para formar otra clasey se permite que ésta seaheredada por las demás.Organización de objetos en jerarquía.Se forman grupos de objetos que co-servan entresí una relación((esun tipo de))(isu king oJ>.Por ejemplo, uncoche (carro)es un tipo de automóvil, un deportivoes un tipo de coche(carro), una cuenta corrientees untipo de cuenta, un ingeniero de sistemes untipo de empleado, una matriz cuadradaes untipo de matriz, manzanareinetaes untipo de manzana.

9 Adaptación de programaspara trabajur en situaciones similares pero dife-rentes.Evita la escritura de grandes programas, si la aplicación, sinformático,formato de datoso modo de operación essólo ligeramentediferente, pues se debe utilizar la herencia para modificar el códig-tente.

5.9. SUPERCLASESY SUBCLASES

Una clase extendida hereda todoslos miembros de sus superclases, excepconstructoresy f i nal i ze,y afiadenuevos miembros específicos. En esencuna subclase hereda las variablesy métodos de su superclasey de todos susascendientes. La subclase puede utilizar estos miembros, puede ocultar l- bles miembroo anular (redefinir)losmétodos. La palabra reservadat h i s . per -mite hacer referencia a la propia clase, mientras quesuper se utiliza parareferenciar a la superclasey poder llamar a métodos de la misma (aunqueestenredefinidos).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 142/481

Herencia 125

Regla: Una subclase hereda todos los miembros de su superclase, que sonaccesibles en esa subclase a menos que la subclase oculte explícitamente unavariable miembroo anule un método.

Regla:Losconstructores no se heredan por la subclase.

Una clase extendidaes una clase compuesta con miembros de la superclase(miembros heredados)y miembros adicionales definidos en las subclases(miem-

, bros añadidos).Los miembros que se heredan por una subclase son:

Las subclases heredan de las superclaseslos miembros declarados como p u b l i c o p r o t e c t e d .Las subclases heredan aquellos miembros declarados sin especificador dacceso mientras que la subclase está en el mismo paquete que la superclase.Las subclases no heredanun miembro de la superclase si la subclase declara unmiembro con el mismo nombre. En el caso de las variables miembros, la vari- ble miembro de la subclase oculta(hides)la correspondiente de la superclase.

En el caso de métodos, el método de la subclase anula el de la superclase.Las subclases no heredan los miembros privados de la superclase.

Nota:El términosubclasese refiere simplemente a los mecanismos de cons-trucción de una clase utilizandoherenciay, es fácil de reconocer, a partir de ladescripción del código fuente por la presencia de la palabra clave extends.

5.1O. MODIFICADORESY HERENCIA

El lenguaje Java proporciona diversos modificadores que se pueden utilizar pamodificar aspectos del proceso de herencia. Los modificadores que controlan accesoo visibilidad en la clase son: p u b l i c , p r o t e c t e d y p r i v a t e .

A m acaracterística p u b l i c , métodoo campo (dato público) puedeacceder-se desde el exterior de la definición de la clase.A una clase pública se puedeacceder fuera del paquete en el que está declarada.Auna característica p r o t e c t e d sólo se puede acceder dentro de la definiciónde la clase en la que aparece, dentro de otras clases del mismo paqueteo den-tro de la definición de subclases.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 143/481

126 Java 2. Manual de programación

A una característicapr i vat e se puede accedersólodentro de la definicióde la clase en que aparece.

Otros componentes posibles de una declaración de clase sons t at i c, abs -t r ac t y f i n a l .Loscampos datoy métodos se pueden declarar comost at i c.Un campo estático se comparte por todas las instancias de una clase.Un métodoestático se puede invocar incluso aunque no se haya creado ninguna instclase.Loscampos de datosy métodos estáticos se heredan de igual modo qlosno estáticos, excepto quelos métodos estáticos no se pueden anular (redefini

Regla:

st at i c Define datosy métodos. Representa amplia información declase que se comparte por todas las instancias de las clases.publ i c Define clases, métodosy datos de tal modo que todos los pro-

gramas puedan acceder a ellos.pr i vat e Define métodosy datos de tal modo que se puede acceder a ell

por la declaración de la clase, pero no por sus subclases.

Nota: Los modificadoresst at i c y pr i vat e se aplican aisladamente avariableso a métodos. Si los modificadorespubl i c o pr i vat e no se utili-zan, por defecto las clases, métodosy datos son accesibles por cualquier clasdel mismo paquete.

Precaución: Las variables asociadas con modificadores son los miembrla clase, no variables locales dentro de los métodos. Utilizando modifidentro del cuerpo de un método se producirá un error de compilación.

Losmétodosy las clases se pueden declarar abstractas( abstr act ) . Una claseabstractano puede ser((instanciada)).Es decir no se puede crear una instanciauna clase abstracta utilizando el operadornew.Tal clasesólose puede utilizar comuna clase padre para crearun nuevo tipo de objeto. De modo similarun métodoabstract debe ser anulado (redefinido) por una subclase.

Un modificador alternativo,f i n a l ,es el opuesto deabs t r act . Cuando seaplica a una clase, la palabra reservada indica que la clasenose puedea t ende r :esdecir, que no puede ser una clase padre. De modo similar, cuando se apunmétodo la palabra reservada indica que el método no se puede anulary, en conse-cuencia, el usuario tiene garantizado que el comportamiento de una claseser modificado por una clase posterior.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 144/481

Herencia 127

Nota: Se puede utilizar el modificadorf i n a l para indicar queUT clase esf i n a l y no puede ser una clase padre.

Regla:abstractf i n a lst at i c

La clase no puede ser instanciada.Las clases no pueden ser subclasificadas.Los campos static son compartidos por todas las instancias deuna clase.

Nota: Los modificadores se utilizan en clasesy miembros de la clase (datosymétodos).Elmodificadorf i n a l puede utilizarse también en variables localesen un método. Una variable localf i nal es una constante interna al método.

5.11. CLASES ABSTRACTAS

En ocasiones, una clase definida puede representarun concepto abstractoy comotal no se puedeinstanciar.Consideremos, por ejemplo, la comida en el mundo real.;Se puede tener una instancia(un ejemplar) de comida? No,aunquesí se puedentener instancias de manzanas, chocolates, naranjaso peras. La comida representa elconcepto abstracto de cosas que se pueden comery no tiene sentido que tenga ins-tancias ya que no esun objeto concreto. Otro ejemplo puede ser la clase abstractaFi gur aTr esDi mensi ones;de ella se pueden definir clases concretas (especí-ficas), tales comoEsf er a, Ci l i ndr o, Cono,...

Las clases abstractasson Útiles para definir otras clases que sirvan para instan-ciar objetos, pero de ellas no se pueden crear instancias utilizando el operadornew.El propósito de una clase abstracta es proporcionar una superclase a partir de la cuotras clases pueden heredar interfaces e implementaciones. Las clases a partir de lcuales se pueden crear instancias (objetos), se denominanclases concretas.Todaslas clases vistas hasta este momento sonclases concretas,significando que es posi- ble crear instancias de la clase.

Importante: Una clase abstracta es una clase que contiene los nombres deloscomportamientos sin las implementaciones que ejecutan esos comportamien-tos. Los objetos nosepuedeninstanciar de una clase abstracta.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 145/481

128 Java 2. Manual de programación

Uno delosobjetivos de la programación orientada a objetos es reconocerlosele-mentos que son comunesy agrupar esos elementos en abstracciones generales. ejemplo, sise desea construir un marco de trabajoíJi-ameti?ork)de clases para figu-

ras geométricas, se puede comenzar con la noción general de«unafiguran comoclase base.A partir de esta clase base se pueden derivar las clases de figuras -cíficas,talescomoCí r cul oo Rect ángul o.

- -

Figura >--

c,/ ------ - -/ -.

/Rectángulo’

- -

/’ Círculoi t _ _

Figura 5.4. Herenciay jerarquíade clases.

Una clase se declara abstracta con la palabra reservadaabst r act . Una jerarquíade clases no necesita contener clases abstractas, sin embargo, muchos sistema-tados a objetos tienen jerarquías de clases encabezadas por superclases abstraFigura5.5 representa una jerarquía de figura de la que asu vez se derivan otras dosclases abstractas,Fi gur aDos Di mens ones y Fi guraTr esDi mens ones .

_ - -

Figura--* -~~,,’

-/ - ~ - - .Figura2 Dimensiones 3-----I \

__’Figura3 Dimension&- * - %

Figura 5.5. Jerarquía de herencia de clasesFi gur a.

Las clases abstractas son como las clases ordinarias con datosy métodos, perono se pueden crear instancias de clases abstractas usando el operadornew. Las cla-ses abstractas normalmente contienen métodos abstractos. Unmétodo abstractoesuna signatura de un método sin implementación. Su implementaciónse proporcio-na ensussubclases. Para declarar una clase abstracta tal comoFi gur a se puedehacer con la siguiente sintaxis:

abstract class Fi gur aI

Si se trata de instanciar una clase abstracta, el compilador visualiza unsimilar al mostrado en la Figura5.6y rechaza compilar el programa.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 146/481

Herencia 129

Figura 5.6.

5.12. ABSTRACTOS

Una clase abstracta es una clase definida con el modificadorabstract que puedecontener métodos abstractos (métodos sin implementación)y definir una interfazcompleta de programación. Los métodos abstractos se implementan en las subcla

Regla: No todoslos métodos se pueden declarar abstractos.Lossiguientes métodosno se pueden declarar como abstractos:

Métodos privados.Métodos estáticos.

Ejemplo

Definir una clase abstractaOb Esta clase debe contener entreotros métodos,losde cálculo del áreay perímetro de objetos geométricos. Dado queno se conoce cómo calcular áreasy perímetros de objetos geométricos abstractos,los métodos y se definen como méto-dos abstractos. Estos métodos deben implementarse en subclases. Suponienduna clase concretaCi r cul ocomo subclase deObj

La posible implementación de la claseCi r cul oes como sigue:p u b l i c c l a s s e xt en ds

private double r a d i o ;

publ ic (double St r i ng nom)

super ;

r adi o =

I

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 147/481

130 Java 2. Manual de programación

p u b l i c Ci r c sl c( )/

t h i s ( 1 .O, "Bl anco") ;

p u b l i c double devo l ver Radi o( )

tr e t u r n r adi o;

I

p u b l i c double c al c ul ar Ar ea( )

r e t u r n r adi o * r adi c * Mat h. F I ;

p u b l i c double c ai c ul ar Per i met r o( )

r e t u r n 2 * Mat h. PI * r adi o;I

p u b l i c St r i ng t os t r i ng ( )

r e t u r n "Nombr e = t c uper. t cSt r i nq( ) t r adi o = " t r adi o;i

y la definición de la clase abstractaObj et oGeomet r i co es:

a b s t r a c t c l a s s Obj et oGeomet r i co

p r i v a t e St r i ng nombr e; p u b l i c Obj et o Geo met r i c o( St r i nqnom)

r . ombre = r om;

a b s t r a c t p u b l i c d ou bl e c al c ul ar k r ea( ) ;a b s t r a c t p u b l i c d o ub le c al c ul ar Per i met r o( ) ;

p u b l i c St r i ng t os t r i ng ( )

r e t u r n nor br e;I

Comoclase de prueba, se puede utilizar la siguiente clasePr ueba:

import ] ava. i o. * ;

p u b l i c c l a s s Pr ueua

p u b l i c s t a t i c vo id mai r ( St r i ng' ] ar gc )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 148/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 149/481

132 Java 2. Manual de programación

Consejo:Utilice clases abstractas para generalizar propiedades comuneymétodos de subclasesy utilice métodos abstractos para definirlos métodoscomunes que deben ser implementados en subclases.

Precaución:Un método abstracto no puede estar contenido en una claseabstracta. En una subclase no abstracta extendida de una clase abstracta losmétodos abstractos deben ser implementados, incluso si no se utilizala subclase.

Ejemplo

, Rectangulo- _ .

ObjetoGráfico

Línea Círculo Cuadrado

Figura 5.8. Las clases heredan cierto estadoy comportamiento

de su clase padre comúnO b ~ e t o ~ < r a f i c o .

a b s t r a c t c l a s s Sbj e t o Gr df i x

i n t x , y ;/ / . . .void moveTo ( i n t nuevaX, i n t r i i ~ c ~ w Y )

t

1/ / . . .

a b s t r a c t v o i d d i b c j a r 1 ;

c l a s s C i r c u l o ex tends Obj et os r af i c o

void d; bu j a r )

i/ / . . .

c l a s s R e e r a n g u l c ex tends C b j e t o ( ; r , i f i c c

void di buj ár ( )i

}/ / . . .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 150/481

Herencia 133

Advertencia: Java vs.C++Una diferencia fundamental entre métodos C++y métodos Javaes que losmétodos Java son virtuales por defecto. En otras palabras, Java proporciona elmecanismo de envío virtual con cada jerarquía de clases, de modo que unobjeto, basado en su tipoy posición en la jerarquía, podrá invocar la imple-mentación correcta de un método.

Cuando una clase derivada anula un método abstractoy proporciona unaimplementación, debe hacerlo con el mismo nombre de método, lista de argu-mentosy tipo de retorno.

Reglas:Java utiliza la palabra reservadaabstract

abstract public double

que sirve como un modificador al método . Cuando unaclase contiene al menos un método abstracto, el modificadorabstract debeaplicarse también a la declaración de clases

abstract class Obj et oGeomet r i co

No se pueden crear instancias de clases abstractas. Por ejemplo, la senten-cia siguiente es ilegal:

Obj et oGeomet r i co = new ( "Bl anco") ;

/ /Er ro r

Ejemplo

Definamos la superclaseE st udi ant e y sus dos subclases, clases derivadas,y En principio no parece

que tenga sentido crear instancias de la claseEst udi ant e, ya que un estudiante puede ser de pregrado, de postgradoo puede ser otro tipo de estudiante (de forma-ción profesional, idiomas, bachiller, etc.), por tanto, declararemos la clase estudia-te como abstracta.

a b s t r a c t c l a s s Est udi ant e

p r o t e c t e d f i n a l s t a t i c = 3 ;p r o t e c t e d St r i ng nombr e;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 151/481

134 Java 2. Manual de programación

/ / vea el capí t ul o sobr e ar r ays p r o t e c t e d i n t ] pr ueba; p r o t e c t e d St r i ng cal i f i caci on; p u b l i c Est udi ant e ( )

t h i s ( " Ni ngunnombr e ") ;1

publ ic Ss t udi ant e ( Ct r l ny nor nbr eEs t udi ant e)

nombr e = nombr eEs t udi ant e ;pr ueba = new i n t [ NUM DE- PRUEBAS];cal i f i c- ci on= " * * * * * " .

I

/ / r r e t odo abstractoabstract p u b l i c vo i d ~al c ul a r Cdl i f i c dc i on( ) ;

p u b l i c St r i ng 1eer Nombr e( )

ir e t u r n nombr e;

I

p u b l i c i n t 1eer Not acPr uebas( i n t r i u m P r i i c h a )

r e t u r n pr neba [numPr ueba - 1 ;

1

p u b l i c v o i d poner Nombr e( St r i ng ni i evoNombr e)t

1

nombr e = nuevoNombr e;

p u b l i c v o i d f i ar Not acPr uebas( i n t numPr ueba, i n t no t apr ueba)t

1

pr ueba [ numPr ueba - 11 = no t apr ueba ;

\

5.1 3. INTERFACES

El lenguajeJavasoporta interfaces que se utilizan para definirun protocolo de com- portamiento que se puede implementar por cualquier clase en cualquier parla jerarquía de clases.

Definición:Una interfaz(intersace)en Java es una descripción de comporta-miento.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 152/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 153/481

136 Java 2. Manual de programación

declaraciónde interfaz + public interface Compar ar obj et os

i

public static final int MENOR ~ 1;de public static final int I CIJA1 O ;

public static final int MAYOR - 1;cuerpo de constantesla interíaz

public int comparar ( Compar ar Ob et os ot r oOb1et o) ;

1de métodos

Figura 5.9. Definición de una interfaz.

La declaración de la interfaz declara diversos atributos acerca de la intcomo su nombre y si se extiende a otra interfaz. El cuerpo de la interfazlas declaraciones de métodosy constantes dentro de la interfaz.

Consejo: Las clases abstractasy los interfaces se pueden utilizar para conse-guir programación genérica. Se deben utilizar interfaces si se necesita -cia múltiple.Si la herencia que se necesitaes simple, es suficiente el uso declases abstractas. Normalmente el uso de una clase abstracta es mayor

uso de una interfaz.

Ejemplo

Diseñarun método de ordenación genérico para ordenar elementos.Loselemen-tos pueden serun array de objetos tales como estudiantes, círculosy cilindros.En este caso se necesitaun método genéricocomparar para definir el orden delosobjetos. Este método deberá adaptarse para que pueda comparar estucírculoso cilindros. Por ejemplo, se puede hacer uso del número de expcomo clave para la comparación de estudiantes, del radio como clave par- paración de círculos y del volumen como clave para la comparación de Se puede utilizar una interfaz para definir el método genérico comparar dsiguiente:

public interface Compar ar Obl et o

public static final int MENOS= - 1; public static final int I GUAL= O; public static final int MAYOR= 1;

public int compar ar ( Compar ar 0bj et o unobj et o) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 154/481

Herencia 137

El métodocompar ar determina el orden delos objetosa y b del tipoCompar ar Obj et o. La instruccióna. compar ar ( b )devuelve un valor- 1 si aes menor queb, un valor deO si a es igual a b o un valor de1 si a es mayor que

b. Un método genérico de ordenación para un array de objetosCompar ar Ob e t ose puede declarar en una clase denominadaOr denar :

public class Or denar

public void or denar ( Compar ar Obj et o [ ] x)t

/ / vea el capí t ul o sobr e ar r aysCompar ar Obj et o maxAct ual ;int i ndi ceMaxAct ua1;f o r (int i = x. l engt h- 1; i >= 1; i - - )i

maxAct ua1 = x [ 11;i ndi ceMaxAct ua1= i ;for (int 7 = i - 1 ; j >= O; I - - )

if ( maxAct ua1.compar ar ( x[ 7 ] j ==- 1)í

r naxAct ua1 = x [ ] I ;i ndi ceMaxAct ua1= 1 ;

/ * i nt er cambi ar x [ i ] r on x[ i ndi ceMaxActua: ;s i f uer a necesar i o * /

if ( i ndi ceMaxAct ua1! = i

x [ i ndi ceMaxAct ua1 = x [ i l ;

x [ i ] = maxAct ual ;

II

Nota: La claseOrdenar contiene el métodoordena r. Este método se basaen algoritmos de ordenación.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 155/481

138 Java 2. Manual de programación

Precaución:La definición de una interfaz es similar a la definición de unclase abstracta. Existen, sin embargo, unas pocas diferencias:

En una interfazlos datos deben ser constantes; una clase abstracta puedetener todo tipo de datos.Cada método de una interfaz tiene sólo una signatura sin implementacuna clase abstracta puede tener métodos concretos. Ningún modificador abstracto aparece en una interfaz; se debe ponemodificadorabstract antes de un método abstracto en una clase abstracta

Un método genérico de búsqueda deun determinado objeto en un array de obje-tosCompar ar Ob e t o ordenado ascendentemente se puede declarar en una cldenominadaBuscar como la que se expone a continuación.Losmétodos de orde-nacióny búsqueda se explican en el capítulo destinado a arrays,

publ i c class Bcscar

pr i vat e i nt Busquej a- bi nar i a ( Compar ar Obj et o 1 x, i nt i z ,i nt de, Compar ar Cbj et o unobj et o)

i nt cent r al = ( i z +de) / 2;i f ( de < i z )

í / devuel ve un r . ú . e r o Regat i vo cuando no encuent r a el el ement oif ( i n O b J e t o . compar ar ( x[ cent r al ] == Compar ar Obj et o. MEN0S)

el se if ( ur . 3bj et o. cor npar arx[ cent r al ] == Compar ar Obj et o. MAYOR)

el se

r e t ur n( - i z );

r et ur n ( Busqceda- bi nar i a( x , z , cent r al - 1, unobj et o) ;

return ( E. J squeda- Di nar i a( x ,cent r ai t 1, de, dnOb j e t o ) ;

/ / devuel ve l a posi ci ón donde se encuent r a el el ement or e t u r n ( c e n t r a 1 );

i

publ i c i nt bbi n ( Compar ar Cb] et c[ ] x, Compar ar Obj et o unobj et o)

r et ur n( BL s qJ eda i nar i a( x , O, x. , engt h, un0bj et o) ;

Regla:Una vez que se ha definido una interfaz, el nombre de la interfazconvierte en el nombre de un tipo. Cualquier clase que implemente la intese convierte en un subtipo de ella. Una interfazes un contrato entre proveedo-resy clientes de un servicio particular.El diseño de una interfaz afecta a lasfuncionalidadesy capacidad en el lado proveedory las complejidadesy con-veniencias en el lado cliente.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 156/481

Herencia 139

Ejemplo

Consideraruna interfazOr denabl e.

public interface Or denabl e

/ * Compar ar el ement os i ypar a el el ement o i == , el ement o devuel ve>O, O, <O si l a di r ecci ón est a CRECI ENDO<O, O, >O s i l a di r ecci ón es t a

* /int i , int

I nt er cambi a el ement os yvoid i nt er cambi o( int int

I ndi ce del pr i mer el ement oint pr i mer oI ndi ce del Úl t i mo el ement o

int ul t i moBander a par a i ndi car di r ecci ón de

boolean or denadovoid or denado (boolean/ * I ndi cador de di r ecci ón par a

CRECI ENDOo DECRECI ENDO* /void di r ecci on (intint di r ecci on

Val or es de i ndi cador es de di r ecci ones posi bl esstatic final int CRECI ENTE=

static final int DECRECI ENTE - 1;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 157/481

6

Encapsulamienty poiimortism

CONTENIDO6.1. Encapsulamiento.6.2. Modificadores de clases.

6.3. Modificadores de variables.6.4. Modificadores de métodos.6.5. Clases internas.6.6. Paquetes.6.7. Declaración de un paquete.6.8. Paquetes incorporados.6.9. Acceso alos elementos de un paquete.

6.10. Importación de paquetes.6.1 Control de acceso a paquetes.

6.12. Polimorfismo.6.13. Ligadura.6.14. Ligadura dinámica.

141

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 158/481

142 Java 2. Manual de programación

Este capítulo examina las importantes propiedades de Javaen-capsulamiento ypolimorfismo. La programación orientada a objetosencapsula datos (atributos) y métodos (comportamientos)

paquetes denominados objetos. Laocultación de la información yabstracción, como términos sinónimos, gestiona la visibilidad deloselementos de un programa.

Encapsulamiento es un término muy utilizado para significque losdatos y las acciones se combinan en un Único elemento (objeto de las clases) y quelosdetalles de la implementación seocultan. El términopolimorfismo significa<<múltiplesformas,,(poly= muchos,morphos = forma). En lenguajes orientados a objetos, epolimorfismo es un resultado natural de la relaciónes-un y losmecanismos del paso de mensajes, herencia y el concepto de su-titución. El polimorfismo es una de las propiedades clave de unde programación conocida Comoprogramación orientada a objetos.Elpolimorfismo permite alosprogramadores enviar el mismo men-saje a objetos de diferentes clases. Existen muchas formas de p-morfismo en Java. Por ejemplo, dos clases diferentes pueden temétodos con el mismo nombre.

6.1. ENCAPSULAMIENTOEncapsulamientoes un término que se utiliza en las modernas técnicas de prog-ción.Encapsulamientosignifica que los datos y las acciones se combinan en unentidad (es decir, un objeto de la clase) yse ocultan los detalles de la implement-ción. La programaciónorientadaa objetos(POO) encapsula datos(atributos)ymétodos(comportamientos)en objetos.Losobjetostienen la propiedad deocultaciónde la información.Esta propiedad significa que aunque los objetos pueden cocómo comunicarse unos con otros a través de interfaces bien definidas, nconocer cómo están implementados otros objetos (los detalles de la implemestán ocultos dentro delos propios objetos). Éstaesuna situación muy frecuente demundo real. Es posible conducir con eficacia un automóvilsin conocer los detallesinternos de cómo funciona el motor, el tren de engranajeso el sistema de frenos.

En Javasetiene un gran control sobre el encapsulamiento de una clase y unSe consigue aplicando modificadores a clases, variables de instancia y de clase-dos. Algunos de éstos modificadores se refieren al concepto de paquete, queconsiderar básicamente como un grupo de clases asociadas.

6.2. MODIFICADORES DE CLASES

Se puede cambiar la visibilidad de una clase utilizando una palabra reservada-cador, antes de la palabra reservadac l a s s en la definición de la clase, por ejempl

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 159/481

Encapsulamiento y polimorfismo 143

publ ic c l a s s P e r s o n aI

. . .i

Una clase pública se define dentro de su propio archivoy es visible en cualquier parte. Una clase que es local a un paquete específico no tiene modificadory se puede definir dentro de un archivo que contiene otras clases. Como máximo, una las clases de un archivo puede ser una clase pública.

6.3. MODIFICADORES DE VARIABLES

La cantidad de encapsulamiento impuesta por una clase se establece a discreción d programador. Puede permitirse el acceso completo a todo el interior dentro de claseo se pueden imponer diversos niveles de restricciones. En particular, se puedecontrolar cuánto es el acceso a otra clase que tiene la instanciay las variables declase de una clase. Se consigue esta acción utilizando un modificador, palabra rese-vada, antes del tipo de la variable.Porejemplo:

publ ic s t a t i c i n t VALOR - MAX =65;

p ro tec ted S t r i n g n o mb r e= " Pepe Mackoy" ; p r iv a t e i n t c u e n t a = O ;

La Tabla6.1 lista los modificadores y sus significados. Normalmente es una buena idea imponer tanto encapsulamiento como sea posible. En consecuenciadebe ocultarse todolo que se pueda, exceptolo que se desea hacer visible a otrasclases, en cuyo caso se debe permitir la cantidad mínima de visibilidad.

Tabla 6.1. Elefectode un modificador de método o variable

Modificador Significado

publ i cningún modificador Visible en el paquete actualprotectedpr i vat e

Visible en cualquier parte (la clase también debe ser pública)

Visible en el paquete actual y en las subclases de estac aseenotros paquetesVisiblesólo en la clase actual

Observación: Elmodificador p r o t e c t e d es más débil que el uso de ningúnmodificador. No se debe utilizar ningún modificador con preferencia a

p r o t e c t e d .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 160/481

144 Java 2. Manual de programación

6.4. MODIFICADORES DEMÉTODOS

Se puede limitar también el acceso de otras clases a métodos. Esta acción s-

za utilizando una palabra reservada(modificador),antes del tipo de retorno delmétodo.Los modificadores son los mismos que para las variables.

public void l eer Nombr e( St r i ng nombr e)i

1

. . .

p r iv a te s t a t i c i n t c o nt a r Obj et o s 0i

1

p ro tected f i n a l Obj ect enc ont r ar l l ave0t

1

* . .

. . .

6.5. CLASES INTERNAS

Java permite definir clases e interfaces dentro de otras clases e interfaces. Uqueno se anida dentro de otra se denominaclase de nivel superior.Esto significaque prácticamente todas las clasesiitilizadashasta ahora son clases de nivel supe-rior. Lasclases internasse definen dentro del ámbito de una clase externa(o denivel superior). Estas clases internas se pueden definir dentro de un bloque -tenciaso (anónimamente) dentro de una expresión. La claseEmpl eado tiene dosclases internas que representan una direccióny un sueldo (Fig.6.I ) , Elcódigo fuen-

te de la claseEmpl eado y sus dos clases internasD i r e c c i o n y Suel do es:

Ejemplo

public c l a s s Empl eadot

i n t edad = 0 ; pu b l ic St r i ng nombre = "Mackoy" ;double tasa = 1 6 . 0 0 ;Di r ecci on di r ecci on;

Suel do suel do; pu b l ic Empl eado ( St r i ng unNombr e, i n t numer o,

St r i ng unac al l e, St r i ng unaci udad,double t a saHor a, i n t horas)

t

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 161/481

Encapsulamiento y polimorfismo 145

nombr e = unNombr e;tasa = t asaHora ;di r ecci on = new Di r ecci on ( numer o, unal al l e, unaci udad) ;

suel do = new Suel do ( hor as) ;

I

/ / cl ase i nt er nacl ass Di r ecci oni

i nt numero = O;St r i ng c al l e = ;St r i ng ci udad = "" ;

Di r ecc i on( i nt num, St r i ng unal al l e, St r i ng unaci udad)I

numer o = nun;cal l e = unac al l e;ci udad = unaci udad;

I

voi d vi s ual i z ar Det a1i

Cys t em out . pr i nt l nI

1

es 0

numer o+" "+cal l e+", t ci udad) ;

/ / c l ase i nt er na

cl ass Suel doti nt hor asTr abaj adas = O;

Suel do ( i n t horas)I

hor asTr abaj adas = hor as;1

voi d Vi s ual i z ar Det al l es( )i

1Cys t e m out . pr i nt l n( "Sal ar i o = t hor asTr abaj adas * tasa) ;

publ i c s t at i c voi d mai n ( St r i ng a r g s [ ] )i

Empl eado e = new Empl eado ( "Mackoy" , 45, "Cal l e Real " ,

e. mpr i m r Dat os( ) ;"Cazor l a" , 15. 25, 35) ;

publ i c voi d i r npr i m r Dat os)

i Sys t em out . pr i nt l n ( " \ nFi c haEmpl eado: " t nombr e) ;

di r e cc i on. vi s ual i z ar Det al l es ( ) ;s uel do. vi s ual i z ar Det al l es0 ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 162/481

Java 2. Manual de programación

El resultado de la ejecución de esta aplicación es:

Fi cha Empl eado: Mackoy

45 Cal l e Real , Cazor l aSal ar i o = 533. 75

Empleado

Variables de instanciaedad, nombre, dirección, tasa, sueldo.

I

I

Clase interna Dirección IClase interna Sueldo I

I

Imprimir Datos( )

Figura6.1. Estructura de la clase Empl eado.

Las clases internas no se pueden utilizar fuera delámbito.Por consiguiente, lasclases externas de la claseEmpl eado no pueden acceder a la clase internamenos que sean subclaseso estén en el mismo paquete, dependiendo de la vis-dad en la definición de la clase).

En la práctica, la clase de nivel superior actúa como un paquete deque contienen ceroo más clases internas. Esto es particularmente útil en -rrollo de software orientado a objetos. Por otra parte, la capacidad parun código determinado que se puede creary pasar donde se necesite es muimportante.

Sintaxis: C posee punteros a funciones.El lenguaje Smalltalk utiliza objetosque representan código (objetos bloque). Java posee clases internas.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 163/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 164/481

148 Java 2. Manual de programación

utiliza una clase anónima; es decir, coloca, dondees necesario, directamente la defi-nición.

Así,en lugar de

addW ndowLi s t ener ( new Ci er r e0) ;

se utiliza

addW ndowLi st ener ( new W ndowAdapt er OI

publ i c voi d w i n d o w C l o s i n g ( Wi n c i o w E v e n z e)i

11 ;

Sys t e m exi t ( O) ;

La implementación del ejemplo propuesto es:

i mpor t j ava. awt . * ;i mpor t j ava. awt . event . * ;

publ i c cl as s Ej Anoni maext ends Fr ame i mpl ement s I t emLi st eneripr i vat e Choi ce sel ecci ón;St r i ng el ement o = ' I ;

publ i c E] Anoni ma ( )

t/ / empl eo de una cl ase anóni ma para ef ectuar el ci err e de l a vent anaaddW ndowLi st ener ( new W ndowAdapt er O

ipubl i c voi d wi ndowCl osi ng( W ndowEvente)i

Sys t e m exi t ( O );

} ) ;sel ecci ón = new Choi ce ( ) ;

sel ecci ón. addI t em( "Wi ndows 95" ) ;

sel ecci ón. addI t em( "Wi ndows 98" ) ;

sel ecci ón. addI t em( "Wi ndows NT" ) ;

/ / Opci ón pr esel ecci onadasel ecci ón. sel ect ( 1 );

s el ec ci ón. addI t emL i s t ener ( t hi s ) ;add ( sel ecci ón) ;I

publ i c s t at i c voi d mai n ( St r i ng ar gs [ ] )I

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 165/481

Encapsu/arniento y poiirnorfismo 149

Ej Anoni maver i t ana = new Ej Anoni ma( );vent ana . ce t Layout ( newFl ow; ayqL t ( ) ) ;vent ai i a. c et Ti t l e( "El AWT" ) ;

v ent a na. c et Ci z e( 400, 150 ) ;

vent ana. s et Vi s i bl e( t r ue) ;

public void p a i r , t ( Gr aphi cs g)I

el ement o = s el ec ci ón. get Sel ec t edI t em( ) ;g. dr awst r i ng ( "El ement o sei ecci onado "+el ement o, 20, 30) ;

public void i t emCt at eChanged( 1t emEvent e)

i

1r epai nt ( ) ;

Compilación

C: l i br o \ TemaO6> avac E] Anoni ma . ava

EjecuciónC: \ l i br o \ TemaOG>j avaEj Anoni ma

ElementoseleccionadoWindows98

Figura 6.2. Resultado de la ejecución del ejemplo de clase anónima.

6.6. PAQUETES

Un paquetees una colección de clases que se compilan en unaunidad de compila-ción.Los paquetes proporcionan un medio adecuado para organizar dichas claseSe pueden poner las clases que se desarrollan en paquetesy distribuirlos paquetesa otras personas, por tanto, se puede pensar enlos paquetes como bibliotecas que se pueden compartir por muchos usuarios.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 166/481

Java 2. Manual de programación

Es posible llevar un conjunto de clases relacionadas juntas a una única ude compilación definiéndolas todas dentro de un archivo. Por defecto, se c paquete implícito (sin nombre); las clases pueden acceder a variables y méto

sólo son visibles en el paquete actual ysólouna de las clases puede ser visible públicamente (la clase con el mismo nombre queel archivo). Un enfoque mejorsería agrupar las clases en un paquete explícito con nombre.

El lenguaje Java viene con un conjunto rico de paquetes que se pueden u para construir aplicaciones. Por ejemplo, el paquete j ava . i o agrega las clases deentraday salida de datos en un programa. Un paquete puede contener a otros p-tes. Los paquetes sirven para organizar las clases en grupos para facilitar el a las mismas cuando sean necesarias en un programa.

La referencia a una clase de un paquete se hace utilizando un nombre comexcepto cuando el paquete haya sido importado implícitao explícitamente. Porejemplo ava. awt .But t on indica queBut t on es una clase del paqueteawt yqueawt es un paquete dentro del paqueteava.

Los paquetes son unidades encapsuladas que pueden poseer clases, interfsubpaquetes. Los paquetes son muy útiles:

Permiten asociar clases relacionadas e interfaces.Resuelven conflictos de nombres que pueden producir confusión.

Permiten privacidad para clases, métodos y variables que no serán vifuera del paquete. Se puede poner un nivel de encapsulamiento tal qusóloaquellos elementos que están concebidos para ser públicos puedan ser ados desde el exterior del paquete.

6.7. DECLARACIÓN DE UN PAQUETE

Cada clase de Java pertenece a un paquete. La clase se añade al paquete cua pi la.Un paquete explícito se define por la palabra reservadapackage en el comien-

zo del archivo en el que se definen unao más claseso interfaces. Para poner unaclase en un paquete específico se necesita añadir la siguiente línea como la -ra sentencia no comentario:

package nombr epaqcet e;

Por ejemplo:

package di buj os ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 167/481

i ncapsu iamien to y poiimorfismo 151

Losnombres delos paquetes deben ser Únicos para asegurar queno hay con-flictos de nombres. Java imponeun convenio de nombres por el queun nombre de paquete se construye porun número de componentes separados porun punto (sepa-rador . ). Estoscomponentes corresponden a la posición de los archivos. En el casosiguiente,los archivos del paquete

package pr uebac . di buj os ;

están enun directorio llamadodi buj os dentro de un directorio llamado p r u e - b a s . Por otra parte,si los archivos deun paquete específico están en un directoriollamadoconcur so, dentro de un directorio llamadopr uebas, el nombre del

paquete es

package pr uebas . concur so ;

Observe que esto supone que todoslosarchivos asociados con un único paque-te están en el mismo directorio. Cualquier número de archivos se puede converten parte de un paquete, sin embargo, un archivosólo se puede especificar en unúnico paquete.

Nota:Unpaquetp,es una colección de clases relacionadase interfaces quepro- porcionan protección de accesoy gestión de espacio de nombres. - 16.8. PAQUETES INCORPORADOS

Java proporcionamiichos paquetes útiles:Paquete j ava . appl et : permite la creación deupp1rt.sa traves de la claseAppl et , propor-ciona interfaces pars conectar un applet a un documento Weby para audición de audio.Paquete j ava. awt : proporciona unAbst r act Wi ndowT o o i k i t para programaciónCUIindependiente de la plataforma, gráficosy manipulación de imágenes.Paquete j ava. i o: soportaflujosde entraday salida Java.Paquete j ava .l ang: contiene clases esenciales para el lenguaje Java.- Para programación:St r i ng, Obj ect , Mat h, Cl ass, Thr ead, Sys t em, t ype

Wr apper cl asses y los interfacesCopi abl e ( Cl oneabl e)y

Ej ecut abl e( Runnab1e) .- Para operaciones de lenguaje:Compi l er , Runt i me y Sec~J r i t yManager .- Para erroresy excepciones:Except i on, Thr owabl e y muchas otras clases.El paquete j ava .l ang es el único que se importa automáticamente en cada programa Java.Paquete j ava . mat h: proporciona cálculos en entero grandey real grande(big,flout).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 168/481

152 Java 2. Manual de programación

Paquete j ava. net : soporta facilidades de red(URL,sockets TCP, sockets UDP, direccionesIP,

Paquetel av a. r mi : soporta invocación de métodos remotos para programas Java.Paquete j ava. u t i l :contiene diversas clases de utilidad (conjuntos de bits, enumeración-

tenedores genéricos.Vect or y Hasht abl e, fecha, hora, separación de«token)),generación denúmeros aleatorios, propiedades del sistema).

conversión binario a texto).

6.9. ACCESO A LOS ELEMENTOS DEUNPAQUETE

Existen dos medios para acceder a un elemento de un paquete: 1)nombrartotal-menteill elemento,inchyelidoelpaquete,2)utilizarsentenciasi mpor t . Por ejem- plo, cuando se elige nombrar totalmente al elemento, se puede especificarPanel proporcionando su definición completa

1 ava. awt . Panel

como ocurre en la siguiente cabecera:

publ ic a b s t r a c t c l a s s Bot on ext ends j ava . awt . Pane1I

Esta sentencia indica al compilador dónde buscar exactamente la definila clasePanel . Sin embargo, este sistema es un poco complicado para referla clasePanel un número dado de veces, la alternativa es importar la j ava .awt . Panel :

import j ava. awt . Pane1; publ ic a b s t r a c t c l a s s Bot on ext ends Panel

(. . .

Hay ocasiones en que se desea importar un número grande de elementos paquete. En este caso, en lugar de colocar una larga lista de sentencias de -ción( i mpor t ) , se pueden importar todos los elementos de un paquete en un

acción utilizando el carácter(comodín))

* .Por ejemplo:import 221;s. awt .*;

i i i ipoi tntodoslos elementos del paquetej ava .awt al paquete actual.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 169/481

Encapsu/arniento y poiirnorfisrno 153

6.10. IMPORTACIÓNDE PAQUETES

Como se acaba de comentar, para utilizar una clase de un paquete enun programa, se

puede recurrir a añadir una sentenciai mpor t en la cabecera del mismo. Por ejemplo,import r ni paquet e. Mi Prueba;

Las declaracionesi mpor t indican ai compilador Java dónde buscar ciertas cla-ses ynombres de interfaces, de forma que, una vez importado, el nombre de la classe puede utilizar directamente sin el prefijo del nombre del paquete.

Si se tienen muchas clases para utilizar del mismo paquete, se puede emplear ecaracter asterisco(*) para indicar el uso de todas las clases del paquete. Por ejemplo,

import m paquet e. * ;

importa todas las clases del paquetemi paquet e.Existen dos formatos dei mpor t

1. i mpor t paquet eDes t i no .UnTi po; importala claseo interfaz2. i mpor t paquet eDes t i no . * ; Importa todas las clases e interfaces del paquete

6.11. CONTROL DE ACCESO A PAQUETES

Java proporciona dos niveles de control de acceso:nivel de clasey nivel de paque-te.Las reglas de acceso a nivel de clase se resumen en la Figura6.3.

Figura 6.3. Controlde acceso anivelde clase.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 170/481

154 Java 2. Manual de programación

Un paquete consta de tipos(clasese inlerjuces)definidos en todos sus archivosEl acceso a nivel de paquete para un tipo espubl i c o package. Sólolos tipos públicos son accesibles desde otros paquetes (Fig.6.4). Por consiguiente, la colec-ción de todos los formatos de tipos públicos de las interfaces externas de u-te a los restantes paquetes. En otras palabras, una clase puede acceder públicosy sus miembros públicos en otro paquete. Una subclase puede taacceder a los miembros públicosy protegidos desussuperclases en otro paquete.Los códigos interiores de un paquete pueden acceder a todoslos nombres de tipo ytodoslosmétodos, campos no declarados p r i v a t e , en el mismo paquete.

\n paquetetipos públicos

~

,/’ Tipos ‘

\, package i’_ - /

/,_ - - -

Figura 6.4. Controld eaccesoa nivel d e paquete

6.12. POLIMORFISMO

Polimorfismoes una palabra que significa ((múltiples formas)) y es una de las-terísticas más importantes de la programación orientada a objetos. En realid-morfismo es la propiedad por la que ala misma palabra se le asignan múltipledefiniciones. Existen muchas formas de polimorfismo en Java. Por ejempclases diferentes pueden tener doso mas métodos con el mismo nombre.

En esencia,polimorfismoes la capacidad para enviar el mismo mensaje a ob-tos totalmente diferentes, cada uno de los cuales responde a ese mensajeunmodo específico. Las aptitudes polimórficas de Java se derivan de su uso co-dura dinámica. Además, el mismo nombre de método se puede utilizar co-metros diferentes y se permite que áparentemente el mismo método sea deun cierto número de veces dentro de la misma clase.

Polimorfismo puro‘,se produce cuando una única función se puede aplicar -gumentos de una variedad de tipos. En polimorfismo puro hay una función -

po del código) y un número de interpretaciones (significados diferentes).

’ Ésteesel término utilizadopotTimoty Budd enla segunda edición desu libroUnderstanding Ohject-Oriented Programmingwith Java,Addison-Wesley,2000, p. 195.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 171/481

Encapsulamiento y polimorfismo 155

enfoque se produce cuando se dispone de un número de funciones diferentes (cue- po del código) todas representadas por el mismo nombre. Esta propiedad tambiése conoce comosobrecargay, en ocasiones,polimor-smoad hoc.El polimorfismo permite a los programadores enviar el mismo mensaje a objetos de clases diferen-tes. Considérese la sentencia

c uent a. c al c ul ar I nt er es es Mens ual 0;

dondecuent a se puede referir a un objetoCuent acor r i ent e o a unoCuent aAhor r os. Si cuent a es un objeto deCuent acor r i ent e, enton-ces se ejecuta el métodoc al c ul ar I nt er es e s Mens ua1definido enCuent acor r i ent e. De igual modo, sicuent a es un objetoCuent aAhor r os,entonces se ejecuta el métodocal cul ar I nt er esesMensualdefinido enCuent aAhor r os. Esto quiere decir que enviando el mismo mensaje se puedenejecutar dos métodos diferentes. El mensajecal cul ar I nt er ese s Mens ual sedenomina un mensaje polimórfico, ya que dependiendo del objeto receptor se ej-cutan métodos diferentes.El polimorfismo ayuda al programador a escribir códigomás fácil de modificar y ampliar.

Polimor -smoes, pues, la capacidad de un objeto para responder a un mensa- je basado en su tipo y posición en la jerarquía de clases. Una respuesta apropiadimplica la capacidad del objeto para elegir la implementación del método que mejse adapte a sus características. EnC++el polimorfismo se debe diseñar en las cla-ses, mientras que en Java el polimorfismo es una característica por omisión de laclases. El términopolimorfismose utiliza para describir como objetos de clasesdiferentes se pueden manipular de modo diferente. Mediante técnicas polimórficaes posible escribir código que manipule objetos de muchas clases diferentes de umodo uniforme y consistente con independencia de su tipo exacto. La flexibiliday generalidad de las estructuras polimórficas es una de las ventajas más significat-vas de la programación orientada a objetos.

La estrategia para desarrollar una estructura polimórfica comienza con la ident-ficación de los métodos comunes a través de un grupo de tipos de objetos similar pero no idénticos y organizando una jerarquía de clases donde los métodos comu-nes se sitúan en la clase base, mientras que los restantes se organizan en clases der-vadas, deducidas de esta clase base. La interfaz de la clase base define una interfaa travésde la cual un objeto de cualquiera de las subclases especificadas se puedemanipular. Es importante considerar que los métodos de la interfaz compartida sdebendeclararen la clase base.

Unmétodo abstractoes aquel que se declara en laclase baseutilizando la pala-ra reservadaabstract y termina con un punto y coma en lugar del cuerpo delmétodo. Como ya se indicó en el capítulo anterior, una clase esabstractasi contie-ne unoo más métodos abstractoso no proporciona una implementación de un méto-do abstracto heredado. Un método se consideraimplementadosi tiene el cuerpo de

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 172/481

156 Java 2. Manual de programación

un método. Si una clase derivada no implementa todos los métodos abstrahereda de una clase abstracta, entonces esta clase se considera también unabstracta. En contraste, el términoclase concretase utiliza para referirse a una clas

en la que no se definen métodos abstractosy tiene implementaciones para todos lométodos abstractos heredados. Una clase concreta representaun tipo de objeto espe-cífico, prefijado. Dado que una clase abstracta no está totalmente especificsusmétodos abstractos están definidos pero no implementados, no es posibobjetos de las clases abstractas. En consecuencia, si la claseAni mal es una claseabstracta:

publ ic a b s t r a c t c l a s s Ani malI

publ ic a b s t r a c t void mover 0 ;I

el siguiente código no es válido:

Ani mal = new Ani mal ( . . . ;

Regla: Noes posible crear un objeto de una clase abstracta, perosí es posibletener una referenciaaclases bases abstractas que se refieren a un objeto de uclase concreta, derivada.

6.13. LIGADURA

El términoligadurase refiere al acto de seleccionar cuál es el método que se-cutará en respuesta a una invocación específica. En algunos lenguajes, talC,la ligadura se realiza totalmente en tiempo de compilación, incluso si está-cados métodos sobrecargados. La ligadura que se realiza en tiempo de comse denominaligadura estáticaya que una vez que se establece la ligadura, éstacambia durante la ejecución del programa. Sin embargo, cuando la convetipos(casting)y la herencia están implicadas, la ligadura no se puede hacer-mente en tiempo de compilación ya que el cuerpo real del código que se

cuando se invoca un método puede depender de la clase real del objeto, alg puede ser conocido en tiempo de compilación. Laligaduradinúmicase refiere a laligadura que se lleva a cabo en tiempo de ejecución. El caso de ligadura dse produce cuando se combinan la conversión de tipos, herencia y anulamétodos.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 173/481

Encapsulamiento y polimorfismo

6.1 4. LIGADURA

La ligadura dinámica se ilustra mediante los siguientes dos ejemplos, que utiliza

la jerarquía de clases.p u b l i c c l a s s Base

pub l ic vo id operaci on

p u b l i c c l a s s Der i vadal extends Base

no se ancl a el mét odo operaci on

p u b l i c c l a s s Der i vada2 extends Base

pub l ic vo id operaci on

En esta jerarquía de clases, se derivan dos clases de la misma clase base. LaclaseBase y la claseDer i vada2 contienen una definición de un método llama-dooper aci ón. La claseDer i vadal no anula la definición deoper aci on. Elsiguiente segmento de código ilustra la propiedad de ligadura dinámica.

Der i vadal pr i mer o = new Der i vadal . . ;

Der i vada2 segundo = new Der i vada2 . . . ;

Base gener i ca;gener i ca = ( Base) pr i mer o;

gener i ca = ( Base) segundo;

En la primera invocación deoper aci on el objeto real es de la claseDer i vadal . Ya que la claseDer i vadal no anula el métodooper aci on, lainvocación producirá la ejecución del métodooper aci on de la claseBase. Enla segunda invocación deoper aci on el objeto real es de la claseDer i vada2que anula el métodooper aci on definido enBase. La pregunta que podemoshacer es: de los dos métodos se invoca? Es decir, en el caso delmétodo anulado (sustituido)oper aci ón, cual de los dos métodos se ejecuta bajolas diferentes condiciones que implica conversión de tipos. En Java, la ligadurdinámica ejecuta siempre un método basado en el tipo real del objeto. Por cons-guiente, en el segmento de código anterior la segunda invocación del métodoope -r aci ón se enlaza al métodooper aci ón de la clase Ya que el tiporeal del objeto puede no ser conocido hasta el tiempo de ejecución, la ligadura

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 174/481

158 Java 2. Manual de programación

conoce como dinámica para diferenciarlo de las ligaduras que pueden deteren tiempo de compilación. Por ejemplo, considere las clases siguientes:

pub l i c c l a s s Aut omovi lI

public void conduci r ( )I

Sys t em out . pr i nt l n( "Conduci r un aut omóvi l ") ;

1I

pub l i c c l a s s Carro extends Aut omovi li

public void conduci r ( )

i

1Syst em. out . pr i nt l n( "Conduci r un car r o") ;

Estas dos clases se pueden utilizar en otra clase:

pub l i c c l a s s Ej empl oi

p ubl i c s t a t i c vo id mai n ( St r i ng ar gc [ ] )(

Aut omovi l a = new Aut omovi l ( ) ;

Carro c = new C a r r o ( );a. conduci r ( ) ;

c . conduci r ( ) ;

a = c;a. conduci r ( ) ;

1I

Compilación

C: \ l i br o \ TemaGG>j avac Aut omovi l . j avaC: \ l i br o \ TemaGG>j avac Car r o . j avaC: \ l i br o \ TemaGG>j avac Ej empl o . j ava

Cuando se ejecuta esta aplicación, la versiónconduci r se define en la claseCarro dos veces, mientras que la versión de la superclase se llama sólo unAsí,la ejecución producirá:

C: \ l i br o\ TemaGG>j avaEj empl oConduci r un aut omóvi lConduci r un car r oConduci r un carro

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 175/481

Encapsu/amienío y po/imorfismo 159

La variablea se declaró de tipoAut omovi 1. Cuando se asignó a la instancia deCarro y se recibió el mensajeconduci r , se responde con la versiónconduci rdeCar r o, que se eligió en tiempo de ejecución. La ligadura dinámicao posterga-

da se refiere, pues, al modo en el que Java decide cuál es el método que debe eje-cutarse. En lugar de determinar el método en tiempo de compilación (como suceden un lenguaje procedimental), se determina en tiempo de ejecución. Es decir, s busca cuál es la clase del objeto que ha recibido el mensajey entonces decide cuáles el método que se ejecuta. Ya que esta decisión se realiza en tiempo de ejecucióse consume un tiempo de ejecución suplementario, pero, por el contrario, presenflexibilidad. Cuando Java selecciona un método en respuesta a un mensaje, lo hautilizando tres cosas:

La clase del objeto receptor.El nombre del método.El tipoy orden delos parámetros.

Es decir, se pueden definir varios métodos en la misma con el mismo nombr pero con parámetros diferentes. El sistema selecciona el método que desea llamen tiempo de ejecución examinando los parámetros.

publ i c cl ass Gol f ext ends Aut omovi li

publ i c voi d c ar gar ( i nt i )i

iSys t em out . pr i nt l n( "Car gando dat os "+ i ) ;

publ i c voi d car gar ( St r i ng s )I

1Syst em. out . p r i n t l n( "Car gando cadenas " + s ) ;

\

La claseG o l f tiene dos métodos denominadoscar gar , cada uno con un pará-metro de tipo diferente. Este código significa que Java puede diferenciar entre lodosmétodosy no se producen conflictos.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 176/481

A 7

Arrays

CONTENIDO7.1. Concepto de array.7.2. Proceso de arrays.

7.3. Arrays de objetos.7.4. Copia de arrays.Arrays muItidime nsion al es.

7.6. Ordenación de arrays.7.7. Selección.7.8. Burbuja.7.9. Inserción.

7.10. Shel l .7.1 Ordenación rápida.7.1 2. Búsqueda.7.1 3. Implementación genérica delos métodos

de ordenación.

161

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 177/481

162 Java 2. Manual de programación

7.1.

En capítulos anteriores se han utilizado variables para hacer loprogramas más flexibles. Gracias a las variables se pueden alm-cenar, convenientemente, datos enlos programas y recuperarlos

por su nombre. Se pueden también obtener entradas del usuario dprograma. Las variables pueden cambiar constantementesu valor.Sin embargo, en algunos casos se han de almacenar un grannúmero de valores en memoria durante la ejecución de un progr-ma. Por ejemplo, suponga que desea ordenar un grupo de núme-ros, éstos se deben almacenar en memoria ya que se han de utilizaposteriormente para comparar cada número conlos restantes.Almacenarlos números requiere declarar variables en el programay es prácticamente imposible declarar variables para miembrindividuales, se necesita un enfoque organizado y eficiente.

Todoslos lenguajes de programación, incluyendo Java, propor-cionan una estructura de datos,array (<matriz,vector,,) capaz dealmacenar una colección de datos del mismo tipo. Java trataestosarrays como objetos.

CONCEPTODE ARRAYUna rmy(((matriz, vector, lista))) esun tipo especial de objeto compuesto por uncolección de elementos del mismo tipo de datos que se almacenan conse-mente en memoria.I,aFigura7.1es un array de10 elementos de tipod o u b l e y serepresenta por un nombre,1 i s t a, con índiceso subíndices.

l i s t a [O]

l i s t a [ l ]l i s t a [ Z ]

l i s t a [3]

l i s t a [4]

l i s t a [51

l i s t a [ 6 ]l i s t a [ 7 1

l i s t a [81l i s t a [ 9 1

I I

l i s t a - nombre

[ i ] - índice

Figura 7.1. El arrayl i s t a de 10 elementos, con índices deO a 9.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 178/481

Arrays 163

Otra forma de representar gráficamente un array es en forma de lista horizontal

l i s t a [ O ] l i s t a [ l ] l i s t a [ 2 ] l i s t a [31 l i s t a [4] . . .

Figura 7.2. Arrayl i s t a de 10 elementos.

Losarrays pueden serunidimensionales(Figs.7.1 y 7.2),conocidos tambiéncomolistas o vectores, ymultidimensionales,conocidos también comotablas omatrices,que pueden tener doso másdimensiones.

Ejemplo

Elarrayt emper at ur as de ocho elementos consta de los siguientes componentes:

t emperatur ast emperaturast emperatur as

t emperatur as

t emperatur ast emperatur ast emperatur ast emperatur as

Regla:Un arraytiene un nombreo identificador, un índice que es un entero

encerrado entre corchetes,untamaño o longitud, que es Úmerode elemen-tos que se pueden almacenar enelarray cuando se le asigna espacio en memo-ria. Un array se representa por una variablearrayy se debe declarar, crear,iniciar y utilizar.

7.2. PROCESO DE ARRAYS

El proceso que se puede realizar con arrays abarca las siguientes operacionesdeclaración, creación, inicializacióny utilización.Las operaciones de declaración,creación e inicialización son necesarias para poder utilizar un array.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 179/481

164 Java 2. Manual de programación

7.2.1. Declaración

La declaración de un array es la operación mediante la cual se define su nomun identificador válido y el tipo de los elementos del array. La sintaxis par-rar un array puede adoptar dos formatos:

tipoDato 1 n o m b r e A r r a y

zipo3ato n o m b r e A r r a y [

Ejemplo

double [ j m L i s t a ;double m L i s t a [ ] ; }

Se declaraun arrayr r i l i s t a de tipodoubl e

f l o a t t emper at ur a[ j ;f l o a t [ ] t emper at ur a; }Se declaraun arrayt emper at ur a de tipof l oat

Las declaraciones no especifican el tamaño del array que se especificaráse cree el mismo.

7.2.2. CreaciónUnarray Java es un objeto y la declaración no asigna espacio en memoria parray. Nose pueden asignar elementos al array a menos queel array esté ya creado.Después que se ha declarado un array se puede utilizar el operadornew para crearel array con la sintaxis siguiente:

n o m b r e A r r a y = new tipoDato t a r na f i o ];

n o mb reArray es el nombre del array declarado previamente,t i p o D a to es eltipo de dato deloselementos del array y tamaño es la longitudo tamaño del arrayy es una expresión entera cuyo valores el número de elementos del array.

Ejemplo

m L i s t a = new doubl e [ 8 ; / / array m L i s t a de 8 el ement ost emper at ur a = new f l oat 1301; / / ar r ay t emperat ur a de 30 el ement os

Consejo:El formatomásconveniente estipoDato[] nornbreArray.El forma-to tipoDato nornbreArray[] se suele utilizarsi se desea seguir el estilodeescrituraC/C++.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 180/481

Arrays 165

Regla:Se pueden combinar la declaración y la creación de un array con unasola sentencia.

t i p o D a to ] nombreArray = new t i p o D a to [ tamaño] ;

tipoDa to nombreArray[ = new t i p o D a t o [ t a m a ñ o ];-

Ejemplo

doubl e; ] m L i c t a = new aoub; e[ 8] ;f l oat t emper at ur al j = new f l oat . 3CI ;

Precaución:Una vez que un array se ha creado su tamaño no se puede modi-ficar.

7.2.3. Inicializacióny utilización

Cuando se creaun array, alos elementos se les asigna por defecto el valor cero paralas variables numéricas de tipos de datos primitivos,’ uO OO para variables detipo carácter,char , f al s e para variables lógicas,bool ean, y nul l para varia- bles objetos.A loselementos del array se accede a través del índice. Los índices delarray están en el rango deO a t amaño - l .Así,m L i s t a contiene8 elementos ysus índices sonO ,1, 2 , . . . , 7.

Cada elemento del array se representa con la siguiente sintaxis:nombr eAr r ay [ í ndi ce] ;

Ejemplo

m l i s t a [ 7 ; representa el último elemento del array

Regla:En Java, un índice del array es siempre un entero que comienza en ceroy termina entamaño-i .

Precaución:Al contrarioqueen otros lenguajes de programación, los índicessiempre se encierran entre corchetes:

temperaturas i s ];

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 181/481

166 Java 2. Manual de programación

Un array completo se puede inicializar con una sintaxis similar a

doubl e[ ] m L i s t a = { 1. 5, 2. 45, 3. 15, 7. 25, 8. 4 } ;

esta sentencia crea el arraymi Lis t a que consta de cinco elementos.

Cálculo del tamaño

El tamaño de un array se obtiene con una variable instancial engt h. Así, por ejem- plo, si se crea un arraym l i s t a , la sentenciam L i s t a .l engt h devuelve eltamaño del arraym L i s t a (10, por ejemplo).

Utilización de los elementos del array

Las variables que reperesentan elementos deun array se utilizan de igual forma quecualquier otra variable. Por ejemplo:

int[l = new i n t [ 5 0 ] ;int 1 = O, j = O;/ / . . .

j = n [ l ] + n[ 10] ;

Algunas sentencias permitidas en Java:

1. t emper a t ur a[ 5] = 45;t emper at ur a [ 8 ] = t emper at ur a [ 5] + 10;Sys t em out . pr i nt l n( t emper at ur a[ 8] ) ;

2. int punt o = 5;t emper at ur a [ punt o+31 = 55;Sys t em out . pr i nt l n( "La t emper at ur a 8 es 'I +

t emper at ur a[ punt o+3] ) ;

3. Sys t em out . pr i nt 1n( "La segunda ent r ada es ' I +ent r ada[ 2] ) ;

Reglas:

temperatura í n+3 I = 45;

valor de la variable de índiceíndice - (elemento del array)

+nombre del array

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 182/481

Arrays 167

Se pueden procesar elementos deun array mediante bucles (por ejemplo,f o r ) por las siguientes razones:

Todoslos elementos del array son del mismo tipo y tienen las mismas propie-dades; por esta razón, se procesan de igual forma y repetidamente' utilizandoun bucle.El tamaño deun array se conoce, porlo que el bucle mas idóneo esf o r .

Ejemplo

1 . El buclef o r siguiente introduce valores en los elementos del array.El tama-ñodel array se obtiene enm l i s t a . l engt h.

for ( i n t i = O; i < m Li s t a. i engt h; i + + )

m L i s t a [ i l = ( doubl e) i ;

2. i nt [ l cuent a = new ~ ~ ~ [ I o c I ;i nt i ;for ( 1 = O; i < cuent a. l engt h; i ++)a [ i ] = O;

7.3. ARRAYS DE OBJETOS

Los ejemplos anteriores han creado arrays de elementos de tipos primitivos.Es posible también crear arrays de cualquier tipo de objeto, aunque el proceso es u poco más complicado. Por ejemplo, la siguiente sentencia declara un array de10objetosCi r cul o( C i r c u l o es una clase definida previamente):

Ci r cul o[ ] ar r ayc i r c ul o = new Ci r c ul o[ I O];

El array de objetos se inicializa de modo similar a un array ordinario:

for ( i n t i = O; i < ar r ayCi r c ul o. 1engt h; i + t )

ar r ayc i r c ul o [ i ]= new Ci r c ul o( ) ;

Representación gráfica

Crear un array de objetosPer sona (clasePersona) .

P er s o n a [ ] p = new Per sonaL51;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 183/481

168 Java 2. Manual de programación

2 def : ne L X array de obl e tosde t i po Per sona , q u e puede conrener 5 o~: e t os

Se crea U array de o o j e t o s

Persoza~

I new Persona( )i

Se neceSAt a crear l osob-et os d e . array

.- - - A

Figura 7.3. Creación de un array de objetos.

1 Persona\

Figura 7.4. Estructura completa del array.

Crear un array de50objetos pertenecientes a la claseRaci onal .

La claseRaci onal representalosnúmerosracionales.Unnúmero racional esun número conun numerador y un denominador de la forman / d ; por ejemplo,1/ 5, 2/ 7 y 3 / 4 . Un número racional no puede tenerun denominador de valorO.Los enteros son equivalentes a números racionales de denominador1, es decir,n / l . El siguiente programa crea unar r ayRac i ona1,que se compone de50objetosRaci onal , lo inicializa con valores aleatoriosy a continuación invoca almétodosuma ( ) para sumar todoslosnúmeros racionales de la lista.

publ ic c l a s s Pr uebaAr r ayDeObj et os

publ ic s t a t i c void mai n ( St r i ng[ ] ar gs)

/ / cr ear e i ni ci al i z ar ar r ayRaci ona1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 184/481

Ar rays 169

Raci onal [ = new Raci onal [ ;

( "Los númer os r aci onal es son ;

for = O;

[ = new Raci onal ( Mat h.r andom( ) ,

;

;

cal cul ar y vi sual i zar el r esul t ado( " La suma de l os númer os r aci onal es es

suma ;

p u b l i c s t a t i c Raci onal

Raci onal suma = new Raci onal ( O,1) ;

for = O;

return suma;suma = add ;

Observaciones

1.El programa crea un array de 50 objetosRaci onal y pasa el array al méto-do suma ( ) , que suma todoslosnúmeros racionales del array y devuelvesuma.

2. Los números racionales se generan aleatoriamente utilizando el métodoMat h. r andom .

3. Precaución. Se ha de evitar un denominadorO ; para ello se puede añadir aldenominador un

7.4. COPIA DE ARRAYS

Con frecuencia se necesita duplicar un arrayo bien una parte de un array. Existendos métodos para copiar arrays: copiar elementos individuales utilizando un bucy utilizar el métodoar r aycopy.

Método 1

Un método para copiar arrays es escribir un bucle que copia cada elemento desel array origen al elemento correspondiente del array destino.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 185/481

170 Java 2 . Manualde programación

Ejemplo

El siguiente código copiaarrayFuente en ar r ayDes t i no:

for ( i n t i = O; i < ar r ay Fuent e. l engt n; l i t )

ar r ayDec t i no[ i l = ar r ayFuent e[ i ] ;

Este método plantea problemas siloselementos del arraysonobjetos.

Método 2

Los inconvenientes anteriores se resuelven usando el métodoSyctern. array -copy ( ) que copia arrays en lugar de utilizarun bucley que tiene el siguiente for -mato:

publ i c s t at i c voi d ar r ayc opy( j ava. i ang. 0bj ec ta r r a y r u e n t e , i nt p o s - n;, l ava. ang. 0bj ec t a r r a y C e s t i , ? o ,

i nt p o s - f i n , i nt l e n g t h )

, .

La sintaxis del métodoar r aycopy ( ) es:

ar r aycopy ( ar r ay Fuent e, pos- i ni , a r r a y D e s t . i n o , 90s- f I-., l o n g i t , ~ d )

i nt l ] ar r ayF uent e = {4, 5, 1, 25, i C0) ;i nt [ l ar r ayDes t i r o = new i nt [ ar r ayF uent e. l engt h] ;Sycter n. arr aycopy(ar r ayFuent e,0, ar r ayDect i no, 3, ar r ayFuent e. l engt h) ;

~ ~ ~

Notas:1.El métodoarraycopy ( ) puede copiar cualquier tipo (tipo primitivoo

tipoOb] e c t ) de elementos del array.2. EnJava,se pueden copiar tipos de datos primitivos utilizando sentenciasasignación, pero no objetos ni arrays completos. La asignación de un o-

to a otro objeto hace que ambos objetos apunten a la misma posiciómemoria.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 186/481

Arrays 171

7.5. A RRAYSMULTIDIMENSION ALES

Las tablaso matrices se representan mediante arraysbidimensionales.Un arrayhidimensionalen Java se declara comoun array de objetos array.

tipo nombre [ ] [3 ;

Las tablas de valores constan de información dispuestaenfilasy columnas.Paraidentificar un elemento de una tabla concreta se deben especificarlosdossubíndi-ces (por convenio, el primero identifica la fila del elemento y el segundo identificla columna del elemento).

o 1 2 3 4 5

(a) Array de una dimensión

(b) Array bidimensional

Figura 7.5. Arrays: (a) Una dimensión; (b) Dosdimensiones (bidimensional).

La Figura7.6ilustra un array de doble subíndice,a, que contiene tres filas y cua-tro columnas (un array de3 x 4). Un array conrnfilas yn columnasse denominaarra-t’mgor-n .

Columna O Columna 1 Columna 2 Columna 3

- + Subíndice columna

-* Nombre del array-- - - -- Subíndice fila

~ _ _ ~

Figura 7.6. Un array de dos dimensiones con tres filas y cuatro columnas.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 187/481

172 Java 2. Manual de programación

Cada elemento del arraya se identifica como tal elemento mediante el formaa [ i 3 a es el nombre del array, ei, j son subíndices que identifican uní-vocamente la fila y la columna de cada elemento dea , observése que todos los ele-mentos de la primera fila comienzan por un primer subíndice deO y los de lacolumna cuarta tienen un segundo subíndice de3 (4 -1).

Declaración de arrays multidimensionales

Los arrays multidimensionales se declaran de la misma forma que bidim-nales, es decir, con un par de corchetes para cada dimensión del array.

t i p o nombre . . . ;

Ejemplo

Un array b de 2x2 dimensiones se puede declarar e inicializar con:

2. La declaración

crea un array de dos filas y tres columnas, en el que la primera con6.

Los arrays con múltiples subíndices con el mismo número de columnas efila se pueden asignar dinámicamente. Por ejemplo, un array de3x3 se asignacomo sigue:

intb = new

arrays con subíndices múltiples en los que cada fila contiene un núdiferente de columnas se pueden asignar dinámicamente, como sigue:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 188/481

int b [ ] [ ; ;b = new i n t [ 3 ] j ; / / asi gna f i l a sb [ O ] = new i n t [ 5 ] ; / / as i gna 5 col umnas a l a f ; la Ob [ l ] = new i n t [ 4 ] ; / / as i gna 4 col umnas a :a f i l a 1b [ 2 ] = new i n t [ 3 ] ; / / as i gna 3 col umnas a

;af i l a

2La expresión b . l engt h devuelveel número de filas del array, mientras

b [ 1 .l engt h devuelve el número de columnas de la fila1 del array.

Ejemplo

Declarary crear una matriz de5x5

in t r ; I m:riz = new i n t [ 5 ] 5 1 ;

O bien

int mat r i z [ ] [ I = new in t [5 : 5 ] ;

Se puede utilizar también una notación abreviada para declarar e inicializar unarray de dos dimensiones:

i n t [ ] I mat r i z =

I

I

La asignación de valoresa un elemento específico se puede hacer con sentenciassimilares a:

mat r i z [ 2][ O ] = 3;

Un medio rápido para inicializar un array de dos dimensiones es utilizar buclesf o r :

t abl a[ x] [ y ] = 5;1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 189/481

174 Java 2. Manual de programación

Loshiiclescrnidudosfuncionan del modo siguiente.El bucle externo, el buclex,arranca estableciendox a O .Comoel cuerpo del buclex es otro bucle, a continua-ción arrancadicho bucle interior, bucley, fijandoy a O . Todo esto lleva al progra-

ma a la línea que inicializa el elemento del arrayt a b l a [ O ] [ O ] al valor5. Acontinuación el bucle interior establecey a 1, y con ellot a b l a [ OI [ 1 toma elvalor5. Cuando termina el bucle interno el programa bifurca de nuevo al externo y establecex a 1. El bucle interno se repite de nuevo, pero esta vez coxigual a1, y tomandoy valores que van deOa 2. Por Último, cuando ambos buclesterminan el array completo se habrá inicializado.

Ejemplo

1. Inicialización deloselementos del array.

O

OO

1 42 ' 83 12

~~

t

1 2 3

5 ~ 6 1 7

1 13 14 15

~~ 1 1 2 3

9 10 1'

Tras crear y declarar el arrayt a b l a

i n t ¿ a b - a r ; [ = new i n t [ ? 131 ;

El listado siguiente inicializa el array:

f o r ( i n t x = 9; x < 3 ; I - x )f o r ( i n t y = C ; y < 3; i + y )

: aul s [x] :y1 xx4 + y ;

2. Declarar. crear e inicializar un array de8 filas y10 columnas con80enterosde ~ a l o rcero

i n t ?uneras I I 1 ; / / d e c l a r a r e l a r r a y- , uner as = new i n t [ 8 1 : l o ] ; / / c r e a r e l a r r a y e n memoriaf o r ( i n t x = 3 ; x < 8 ; t + x )

r i r r e r c c [ x I [ y 1 = U;

f o r ( i n t y = C ; y < 13; - + y )

Normalmente, la asignación de valoresa arrays bidimensionales se realiza media-te bucles anidados, por ejemplo anidando buclesf o r . Esdecir que,supuestoun arraya de dosdimensimes,mediante dos buclesf o r , uno externo y otro interno, es posible leer y asignar valores a cada uno deloselementos del array.El recorrido de

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 190/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 191/481

176 Java 2. Manual de programación

s t a t i c i n t t abl a [ 3 [ I ;

s t a t i c v o i d l l enar ( )

t abl a = new i n t [ l 5 1 [ l o ] ;f o r ( i n t x = O ; x < 15; x++)

f o r ( i n t y = O ; y < 10; y++)t abl a[ x] [ y ] = x * 10 t y;

s t a t i c vo id most r ar 0

f o r ( i n t x = O ; x < 15; x++)I

f o r ( i n t y = O ; y < 10; y++)

Sys t em. out . pr i nt l n0;Sys t em out . pr i nt ( t abl a[ x] y ]+" \ t " );

p u b l i c s t a t i c v o i d mai n ( St r i ng[ ] args )

l l enar ( ) ;

most r ar ( ) ;

Ejercicio (applet)

El Appl et Tabl al ,se comporta de forma similar a la aplicación anterior, tambcrea e inicializa un array de dos dimensionescon1 O columnasy 15 filas.Acontinua-ción imprime el contenido del array en el área de visualización delupplet, de modo quese puede ver que el array contiene realmente los valores alosque se ha inicializado.

pa cka ge l i br o . Tema 07;import j ava. awt . * ;import j ava. appl et . * ;

p u b l i c class Appl et Tabl al ex tends Appl ett

i n t t abl a [ ] [ ] ;

p u b l i c voi d i n i t ( )

t abl a = new i n t [ l 5 1 [ i o ] ;f o r ( i n t x = O ; x < 15; x++)

f o r ( i n t y = O ; y < 10; y++)t abl a[ x] [ y ] = x * 10 + y;

1 p u b l i c vo id pai nt ( Gr aphi cs g)

f o r ( i n t x = 3 ; x < 15; x t +)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 192/481

for (int y = O; y < 10; y++)i

St r i ng c = St r i ng. val ueOf( t abl a XI [ y] ;

g. dr awSt r i ng( s , 50+y*25, 50+x*15);

I

Para ejecutar elapplet(vea el Capítulo11, ((Appletw),será necesario:

1. Sucompilación

Mediante una instrucción como la siguiente:

C: \ l i br o\ Tema07>] avac Appl e t Tabl a1. j ava

cuando se trabaja con eljdkl.3

Usando el modificadortarget durante la compilación para generar un archivoclass específico para una determinada máquina virtual, ya que no siempre esseguro que el navegador utilizado para ejecutar el código HTML con la marcaAPPLET soporte todas las características incorporadas a la versión delJDKcon la que elappletha sido compilado. Así, con eljdkl.4 se emplea

C: \ l i br o \ Tema07>j avac- target 1. 1 Appl et Tabl al . j av a

con la finalidad de que elapplet pueda ser ejecutado por los navegadores(browsers)habituales.Otra formamásadecuada para queun appletcomplilado en la versión1.4 deljdk pueda ser ejecutado por losbrowsershabituales consiste en utilizarPlug-in(veáse el ApéndiceF, ((Contenido delCDD)

2 . Crearun archivoA t1 . h t m l con el siguiente contenido: Archivo H T ML ( At l .ht ml )

<HTML><APPLET

W DTH=350HEI GHT=300code=l i br o. Tema07. Appl e t Tabl a l . c l as s>

</ APPLES>

</ FI TML>Al abrir la página, usando por ejemplo Microsoft Internet Explorer, elapplctse

cargay ejecuta automáticamente. La salida obtenida se muestra en la Figura7.7.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 193/481

178 Java 2. Manual de programación

O 1 2 3 4 5 6 7 8 910 11 12 13 14 15 16 17 18 1920 21 22 23 24 25 26 27 28 2930 31 32 33 34 35 36 37 38 3940 41 42 43 44 45 46 47 48 4950 51 52 53 54 55 56 57 58 5960 61 62 63 64 65 66 67 68 6970 71 72 73 74 75 76 77 78 7980 81 82 83 84 85 86 87 88 8990 91 92 93 94 95 96 97 98 99100 101 102 103 104 105 106 107 108 109110 111 112 113 114 115 116 117 118 119

120 121 122 123 124 125 126 127 128 129130 131 132 133 134 135 136 137 138 139140 141 142 143 144 145 146 147 148 149

Figura 7.7. Ejecución delapplet en Microsoft Internet Explorer

7.6. ORDENACIÓN DE ARRAYS

La clasificación de datos es una de las operaciones más usuales en program podrá considerarse de dos tipos:

Interna, es decir, conlos datos almacenados en memoria.Externa, con la mayor parte delos datos situados en un dispositivo de almace-namiento externo.

Dentro de la ordenación interna habría que considerar la ordenación taarrays como delistas(veael capítulo sobre estructuras de datos), pero para explicamétodos de ordenación se estudiará exclusivamente laordencrcidnde arrays.Además,los métodos de ordenación interna se aplicarán a arrays unidimensionales, auuso puede extenderse a otro tipo de arrays, bidimensionales, tridimensionaleconsiderando el proceso de ordenación con respectoa filas, columnas, páginas, etc.

El concepto de ordenación se puede definir de la siguienteh r m a :dado un arrayunidimensionalXy dos índicesi y j que permiten recorrerlo, se dirá que está ord-

nado ascendentemente si para todoi

< j

se cumple siempre queX[ i

<= X[j .El array estará ordenado en orden descendente si cuandoi < j se cumple siempre, para todossuselementos, queX[ i >= X[ j .

Los métodos de clasificación interna más usuales son:Selección, Burbuja, Inserción, Inserción binaria,Shell,Ordenaciónrúpida(QuickSort).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 194/481

Arrays 179

7.7. S E L E C C I ~ N

El algoritmo de ordenación por selección de un array conn elementos tienelos

siguientes pasos:1 . Encontrar el elemento menor del array.2. Intercambiar el elemento menor conel elemento de subíndice1.3.A continuación, buscar el elemento menor en la sublista de subíndices2 . . n,

e intercambiarlo con el elemento de subíndice2 . Situándose, por tanto, elsegundo elemento menor en la posición2.

4. Después, buscar el elemento menor en la sublista3 . .n, y así sucesivamente.

Por ejemplo, dada la siguiente lista7 4 8 1 1 2 .Se comparaa [ i ] con lossiguientes elementos:-7 4 8 1 12-4 I 8 1 12-4 7 8 12-1 I 8 4 12

conlo que el elemento menor queda seleccionado ena [ i ]

Se comparaa [ 2 j con los siguientes elementos:- 8 4 12- 8 4 12-4 8 7 12

conlosque el elemento menorqueda.seleccionadoen a [ 2 ] .Se compara el elementoa 13 con los siguientes:

-8 7 i 2-7 8 12

con lo que el elemento menor queda ena[3].Se compara el elementoa[4]con los siguientes:

-8 1 2con lo queel arrayquedaría1 4 l a 12.

También se podría buscar el elemento mayor y efectuarla clasificación en orden descendente.

Codificación

p u b l i c class P r u e b a s

p u b l i c s t a t i c void mai n ( St r i ng 1 a rgs )r

i n t a [ ] = {7, 4, 8, 1, 12};

i n t menor ;f o r ( i n t i = O; i < a. l engt h- 1; I ++)I

menor = 1 ;

f o r ( i n t j = i + l ; 1 < a. l er g t h; j ++)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 195/481

180 Java 2. Manual de programación

if ( a [ : ] < a[ r nenor J )menor = 7;

i n t auxi = a [ i J ;a ; i J =a[ menor ] ;a [ menor ]=a ux i ;

1

/ / Pr esent aci ón de l os r esul t adosf o r ( i n t i = O ; i < 5 ; i ++)

Cys t em out . pr i nt l n( a[ i ] ) ;1

7.8. BURBUJALa ordenación por burbuja(bublesort)se basa en comparar elementos adyacendel array e intercambiarsusvaloressiestán desordenados. De este modo se dice los valores más pequeñosburbujeanhacia la parte superior de la lista (hacia el mer elemento), mientras quelosvalores más grandes sehundenhacia el fondo dela lista.

Si se parte de la misma lista que enel método anterior,7 4 8 1 12:7 4 8 1 124 7 a 1 124 7 8 1 124 7 i 8 12

4 I 1 8 -124 7 1 84 1 7 8

4 1 7 -

1 4 7quedando el7 en tercera posición:

1 4 -

quedando el cuatro en la segunda posición:

quedando el12 al final de la lista:

quedando el8 en penúltima posición:

7

1 -4

con lo que la lista resultante sería1 4 7 8 12.

Codificación

p u b l i c c l a s s Pr uebaBt

p u b l i c s t a t i c v o i d mai n ( St r i ng ] args)

i n t a [ ; = {7, 4, 8, 1, 12};f o r ( i n t i = 1; 1 < a. l engt h; i ++)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 196/481

Arrays 181

f o r ( i n t j = O; j < a. l engt h- i ; j ++)i f ( a[ j +i l < a [ j l )t

i n t auxi = a[ j ;

a [ j ]=

a[ j +l ] ;a[ j +l ] = auxi ;

/ / Pr esent aci ón de l os r esul t adosf o r ( i n t i = O; i < 5; I ++)

Sys t em out . pr i nt l n( a [ i ] ;

I

Una optimización del método anterior que aprovecha posibles ordenaciones -ciales en el array es:

p u b l i c c l a s s Pr uebaBOpt

p ub li c s t a t i c v o i d mai n ( St r i ng[ ] args)I

i n t a [ ] = {7, 4, 8, 1, 12};i n t i = 1;boolean or denado;doi

or denado = true;f o r ( i n t j = O; j < a. l engt h- i ; j ++)

if ( a[ j +l l < a [ j l )t

or denado = false;i n t auxi = a [ j l ;a [ j l = a[ j +l l ;a[ j +l ] = auxi ;

1i ++;

1while ( or denado == false)/ / Pr esent aci ón de l os r esul t adosfor ( i = O; i < 5; i ++)

Sys t em out . pr i nt l n( a[ i ]) ;

7.9. I N S E R C I ~ N

El método está basado en la técnica utilizada por los jugadores de cartas para cl-ficar sus cartas, donde el jugador va colocando, insertando cada carta ensu posicióncorrecta. Por tanto, el método se basa en considerar una parte del array yaordena-

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 197/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 198/481

Arrays 183

auxi = a [ i : ;

er . c ont r ados i t i o = false;while ( 2 >= C & & ec cont r ados i t i o)

j = 1 - 1 ;

if ( a [ ] ] > a . J x i )

elseencont r ados: t i o = t r ü e ;

a [ j 1] = a u x i ;i/ / Pr es e- t ar i óc de l os r esul t adosfor ( i = O; i < 5; i t +)

Sys t en. out . pr ; nt l n( a[ i ] ) ;I

7.10. Shell

Este método se basa en realizar comparaciones entre elementos no consecutivosseparados por saltoso intervalos mayores que1. Estos saltos sufrirán sucesivosdecrementos.Es un método elaborado que resulta más eficiente cuando las listasson grandes.

Considere el siguiente array:6 1 4 7 2 ( 5 elementos). En una primera pasa-da, las comparaciones se realizarán entre elementos separados por un intervalo d5 / 2 .

El primer intercambio se produce entrea [ O1 y a [ 2 ] y luego entrea [ 2 ] y a [ 4 .

Puesto que ha habido intercambio entrea [21 y a [ 4 I hay que comprobar quedicho intercambio no ha estropeado la ordenación efectuada anteriormente, portanto, se retrocede y se comparan de nuevoa [ O] con a [2 3 . Como resultado seobtendrá ahora2 1 4 7 6. Los elementosa [ O] , a [2 ] y a [ 4 ] se encuentranahora ordenadosy por otra parte tambiéna [ 1 y a [ 3 3 . Se repite el proceso consaltoo intervalo la mitad del anterior.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 199/481

184 Java 2. Manual de programación

Como hay intercambio entrea [ 3 ] y a [ 4 se retrocede para comprobar que no se ha estropeado la o-nación entrea [23 y a [3 y como esté bien no se retrocede más.

1 1 2 4 ; 6 ( 7 (

Resultado final

El proceso termina, pues se han comparado todosloselementos con un saltoo intervalo de unoy el saltoya no puede ser menor.

Codificaciónp u b l i c c l a s s Pr uebaCh

p u bl ic s t a t i c v o i d mai n ( St r i ng ] args)i

i n t a [ ] = ( 7, 4, 8, 1, 12};i n t i , j , k , sal t o;s al t o = a. l engt h / 2;whi le ( s al t o > O)t

f o r ( i = s al t o; i < a. l engt h; i ++)i

j = i - sal t o;whi le ( j >= O)i

k = jt

s al t o;i f ( a [ j ] <= a[ k l )

elseI

j = - 1 ;

i n t auxi = a [ j l ;a [ j l = a[ k l ;a [k ] = auxi ; j - = sal t o ;

}

s al t o /= 2;1

/ / Pr esent aci ón de l os r esul t adosfor ( i = O; i < 5; i ++)

Cys t em out . pr i nt l n( a[ i l );

!

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 200/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 201/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 202/481

Arrays 187

el ser e t u r n ( c e c t r a 1 );

i

publ i c i nt bús q üedaB( i nt [ ] a, i n t c )

r et ur n( b~squecaB1: i ar; a( a , , a . l eng~h , ) ;

i1

publ i c cl ass Cl ass1i

publ i c st at i c voi d mai r . ( S t r - n . g [ ] a r g s )

/ / er. el ar r ay a l os el emenLos est án col ocados ae f or ma or denadai n t [ ] a = ? , 2, 5, 7, 8, 9, 11, 123;/ / muest r a el ar r ayfor ( i n t I = O; I < a. l engt h; : -+)

Cys t em o' dt . pr i nt l n( a[ i : ) ;Sys t em out . pr i nt l n( ) ;Bbi n b u s c a d o r = new Bbi n ( ) ;

/ / Bus c a el 1

i nt p = buscador . búsqaedaB( a , 1 ) ;/ * I nt er pr et a l a i n f o r m a c i j n devuel t a por e l

i f (p >= O)pr oceso de búsqueda I

Cy s t en. o ut p r : n t ( " El el ement o 1 est a en " ) ;

Sys t e m out . pr i nt l n( " l a posi c i ón " + pj ;

el se

Cy s t e m out . p r i n t ( " El ei ement o no es z a. " ) ;

Sys t em out . pr i nt ( " Su l u g a r deber i a ser " j ;

Cys t em out . pr i nt l n( " l aposi c i ón + Mat h. abs ( p ) ) ;

Importante:La búsqueda binaria es mucho más eficiente que la lineal, perorequiere queloselementos se encuentren colocados enel array de forma orde-nada.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 203/481

188 Java 2. Manual de programación

7.13. IMPLEMENTACIÓNGENÉRICADE LOSMÉTODOSDE ORDENACIÓN

Antes de presentar una implementación genérica delos distintos métodos de orde-nación hay que tener en cuenta que cuandolos elementos de un array se declaraa partir de la superclaseObj ect , dicho array se podrá utilizar para almacenobjetos de distinta clase.Losmétodos de ordenación y búsqueda deben imp-mentarsede forma que respectivamente puedan ordenar y buscar informacarrays con cualquier tipo de contenido; para ello, se define una inCompar abl e y se declara la información almacenada en el array, en lugObj ect , comoCompar abl e. La interfazCompar abl e tendrá la siguienteestructura:

/ * I nt er f az bási co est ándar de compar aci ón, concebi do par a admi t i rvar i os cr i t er i os de or denaci ón en est e caso el campo cr i t er i ono ser á usado*/

i n t e r f a c e Compar abl e

boolean menor que( Compar ab1e c, i n t cr i t er i o) throws Except i on;\

El objeto a almacenar en el array implementará la interfazCompar abl e; porejemplo:

/ / o b j e t o Compar abl ep u b l i c c l a s s Ent er o implements Compar abl e

i n t val or ;

Ent er o ( i n t val or )t hi s . val or = val or ;

pub l ic boo lean menor que ( Compar abl e c , i n t cr i t er i o) throwsExcept i on

i f ( ! ( c i n s t a n c e o f Entero)/ / Lanza una excepci ón ( vea el capí t ul o sobr e excepci ones)throw new Except i on ( " Ti po de compar aci ón i nvál i do") ;

Ent er o e = ( E n t e r o ) c ;re tu rn ( val or < e . val or ) ;

1I

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 204/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 205/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 206/481

Arrays 191

El programade prueba podríaser:

p u b l i c c l a s s Pr uebaTI

p u bl i c s t a t i c v oi d r i d i n ( St r i ng I args ) throws Ex cept i c ri

Enc er o[ : a = new Znt er o[ 7] ;a [ u ] = new Ent er o( 6) ;a[:] = new Ent er o( 1) ;a [ 2 ] = new Ent er o( 4) ;a [ 3 ] = new Ent er o( 7) ;a [ 4 ] = new E n t e r o ( ? ) ;a [ 5 ] = new Ent er o( [ >) ;a[ 61 = new E r t e r o ( 3 ) ;

Met cr d o rd en ad c r=

new Ye t o r d o;

or der ador . s el ec ci or ( a , ) ;

fo r ( i n t 1 = O; 1 < a. , ~qgt h; I ++)Sys t em. out . pr i nt l ní a[ i ]. val or ) ;

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 207/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 208/481

194 Java 2. Manual de programación

Unacadena (string) es una secuencia de caracteres.Losarrays ylas cadenas se basan en conceptos similares. En la mayoría deloslenguajes de programación, las cadenas se tratan como arrays d

caracteres, pero en Java, una cadena(string) se utiliza de mododiferente a partir de un objeto array.Java proporciona la clase incorporadas t r i ng para manejar

cadenas de caracteres. En el caso de que se desee modificar con fr-cuencia estas cadenas, es conveniente usar la claseSt r i ngBuf f eren lugar deSt r i ng con objeto de consumir menos memoria.

En algunas ocasiones es, necesario efectuar un análisis gra-matical básico de una cadenay, para ello, se emplea la claseCt r i ngTokeni z er ,que permite dividir una cadena ensubcade-nas en aquellos lugares donde aparezcan en la cadena inici

unos determinados símbolos denominados delimitadores.Losprogramas también necesitan manejar frecuentemente fecha del sistema. Para trabajar con fechas enlos programas seutiliza la claseGr egor i anCal endar , mientras que la claseDat ese puede utilizar para medir el tiempo que una determinada tatarda en ejecutarse.

En este capítulo se comentan las características de cada unde las clases, de uso frecuente, anteriormente citadas.

8.1. C R E A C I ~ NDE CADENAS

Una de las clases más frecuentemente utilizadas en los programas Java esS t r i n g perteneciente al paquete J ava. l a n g . Las cadenasS t r i n g de Java noson, simplemente, un conjunto de caracteres contiguos en memoria, como o

otros lenguajes, sino que son objetos con propiedadesy comportamientos. La claseS t r i n g se declara en Java como clasef i n a l como medida de seguridad y, potanto, no puede tener subclasec.

public final class St r i nq extends Obl ect implements Cer i al i zabl e,Cci i par abl e

Existen dos formas de crear una cadena en Java, mediante un literaly medianteel empleo de un constructor explícito. Cada vez que en un programa Java suna constante de cadena, automáticamente se crea un objeto de la claseS t r i n g .Para crear una cadena con un literaly asignarle una referencia, puede emplearse usentencia como la siguiente:

St r i ng sal udo = “ Hc l a” ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 209/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 210/481

196 Java 2. Manual de programación

Nota:La sentenciacad2 = new St r i ng( cad1) ; permite efectuar la copiade la cadena, en este casocadl , que se pasa como argumento.

La sentenciacad2 = cadl ; copia la referenciacadl encad2 y consigueque ambas variables permitan acceder al mismo objeto.

La sentenciacad2 = cadl .t os t r i ng ( ) produce unos resultadosanálogosa la anterior, puesto quecadl .t os t r i ng ( ) devuelve el propioobjetoSt r i ng.

Ejemplo

Tras la siguiente sentencia:

St r i ng c i u d a d 2 = new St r i ng ( “Madr i d”);

ci udad2 no tieneun valor literal colocado en el espacio reservado para el alm-namiento de literalesSt r i ng, sino que es parte deun objeto separadoSt r i ng.

ci udad2- Madrid

ci udad - Madridmi c i udad

Figura 8.2. Diferencias entre la creación de cadenas con el mismo literaly mediante el uso deun constructor explícito.

AI elegir entre unou otro método es importante recordar posteriormente cuseha usado, pues esto afecta a la forma en la que las cadenasSt r i ngs se puedencomparar.

Las cadenas de caracteres también se pueden leer desde tecladoy el métodohabitualmente utilizado para ello esr eadL i nede la claseBuf f er edReaderque lee una secuencia de caracteres deun flujo de entraday crea un objeto detipoSt r i ng devolviendo una referencia al mismo. Se ha de tener en cuentque para efectuar este tipo de entrada debe construirse previamenteun objeto delaclaseB u f f er edReader sobre otro de la claseI nput St r eamReader aso-ciado aSyst em. i n.

Otro aspecto importante delosobjetos de tipoSt r i ng es que no puedensermodificados en memoria. En realidad,lo que esto quiere decir es que para modif-car una cadena existente Java creaun nuevo objetoSt r i ng con las modificacio-nesy deja la cadena inicial, sin utilidad, disponible para la recolección de b

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 211/481

Cadenas y fechas 197

Por tanto, un programa que necesite efectuar muchas manipulaciones de cadenasSt r i ng puede consumir grandes cantidades de memoria y, para evitarlo, en dichoscasos deben reemplazarse los objetosS t r i n g por objetos de la claseS t r i ngBuff er.

8.2. COMPARACIÓN DE CADENAS

La comparación de cadenas se basa en el orden numérico del código de caractereses decir, que, al comparar cadenas, Java va comparando sucesivamente los códigoUnicode delos caracteres correspondientes en ambas cadenas y si encuentra uncarácter diferenteo una de las cadenas termina detiene la comparación. Para quedos cadenas sean iguales, han de tener el mismo número de caracteres y cada carác-ter de una ser igual al correspondiente carácter de la otra. Al comparar cadenas la

presencia de un carácter, aunque sea el blanco, se considera mayor quesu ausencia.Además, la comparación de cadenas distingue entre mayúsculas y minúsculas pues-to que su código no es el mismo, las letras mayúsculas tienen un número de códigomenor que las minúsculas.

A la hora de comparar cadenas hay que tener en cuenta que el operador== com- para solamente las referencias de objeto, mientras que el métodoequal s compa-

ra los contenidos de los objetos. public boolean equal s ( j ava. l ang. Obj ec t u n 0 b j e c t )

Así, cuando se crean cadenas mediante literales, éstas podrán ser comparadastanto con el operador== como con el métodoequal s.

Ejemplo

Comparar dos cadenas usando primero el métodoequal s y a continuación el ope-rador==.

import j ava. i o. * ;

public class Cornpararcadenasi

public static void mai n ( St r i ng[ ] ar gs)t

St r i ng nornbrel , ci udadl , nor nbr e2, ci udad2;

nombr e1 = "Ana" ;ci udadl = " Madr i d" ;nombr e2 = "Pedr o" ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 212/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 213/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 214/481

200 Java 2. Manual de programación

el resultado obtenido al comparar con el operador== será diferente, ya que el méto-do i nt er n ( ) obliga a las cadenas a colocarse en el espacio reservado po para el almacenamiento de literalesSt r i ng.

emplearse el métodoCuando se desean ignorar las diferencias entre mayúsculas y minúscula

public boolean equal sI gnor eCase( j ava.1ang. St r i ng o t r a c a d )

y, por tanto, la ejecución de las siguientes líneas de programa

if ( "ANA".equal sI gnor eCase( "Ana" )Sys t e m out . pr i nt l n( "son i gual es " ) ;

mostraría que las cadenas son iguales.

Nota:compar eTo y compar eToI gnor eCaseson métodos habitualmen -te utilizados en los programas que necesitan ordenar arrays de cadenas.

Otra forma de comparar cadenas es utilizar el métodocompar eTo, cuyo for -mato es el siguiente:

public int compar eTo ( j ava. l ang. St r i ngo t r a C a d )

Este método devuelveOcuando las cadenassoniguales, un número negativosi elobjetoSt r i ngque invoca acompar eTo es menor que el objetoSt r i ng que se le pasa como argumento y un número positivo cuando es el argumento el que e

Ejemplos

I . St r i ng cadl = new St r i ng( " Ana" ) ;St r i ng cad2 = new St r i ng ( "Anast asi a" ) ;

Sys t em out . pr i nt ( " L a cadena " ) ;

if ( cadl .compar eTo ( cad2 < O)

else if ( cadl .compar eTo ( cad2 == O)

else

Sys t em out . pr i nt l n( c ad1t es menor que + c ad2) ;

Cys t em out . pr i nt l n( c ad1t es i gual que t c ad2) ;

Sys t em out . pr i nt l n( c ad1+ es mayor que + cad2) ;

el resultadoes

La cadena Ana es menor que Anast asi a

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 215/481

Cadenas y fechas 201

2 . if ( "Ana" . CGmpar eTG( "ANASTASI A" )< O)Sys t er n. out pr i nt l n( "es menor " ) ;

Sys t ern. out . pr i nt l n( "no es menor " ) ;

else

el resultadoes

no es menor

3. Sys t e m out . pr i nt l n( " J uan" cornpareTo( " J avi er" ) o ) ;

el re.sultadoes

f al se

Para no diferenciar entre mayúsculasy minúsculas,en lugar decompar eTo seempleacompar e T oI gno r eCac e.

8.3. coNCATEN ACIóN

Concatenarcadenas significa unir varias cadenas enuna sola conservando el

orden delos caracteres en cada una de ellas. En Java es posible concatenarcadenas usando tanto el operador+ como el métodoconcat .El operadort en Java tiene un significado especial de concatenación de cadenas

y se puede utilizar con objetos de la claseSt r i ng.

Ejemplo

St r i ng c a d l = n e w St r i ng( " 4 + 2") ;

St r i ng cad2 = n e w St r i ng( " = " ) ;

St r i ng oper aci on = c a d l + cad2;

/ / i mpr i me 4 + 2 =

Cys t er n. out . pr i nt l n( oper ac i on) ;

En el caso de que uno de los operandos que intervienen en una expresión sea dcadena, el operadort convierte a cadenalosvalores de otros tipos que intervienenen la expresión y efectúa concatenación.

Ejemplo

S y S t e m . o u t . p r i n t l n ( o p e r a c i o n t

4t 2 ) ; / / Sal i da 4

+2 = 42

En el estudio de la concatenación de cadenas y teniendo en cuenta la imposib-lidad de modificar los objetosSt r i ng, es importante comprender el funciona-miento de las siguientes instrucciones:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 216/481

202 Java 2. Manual de programación

S:r:.ig av; co = new S t r i n g ( " U r a c a d e r a " ) ;avi so = o b - c o - " p u e d e z c n t e n e r c a r a c t e r e s n u m é r i c o s " ;

Estas sentencias no cambian el objetoSt r i ng original, sino que Java adquieruna nueva zona de memoria paraun nuevo objetoSt r i ng, donde quepa la nuevacadena, copia el antiguo en el nuevo objetoy añade la nueva parte. La referenciavi so apunta ahora hacia la nueva cadena. La vieja versión delSt r i ng quedadisponible para la recolección de basura.

Estas sentencias se podrían haber escrito de la siguiente forma:

S t r i n g a v i s o = new S t r i n g ( " J n a c a d e n a " ) ;aT~7:r.o t = 1 p u e d e c o n z e n e r c a r a c t e r e s n , m e r 1 c oc ;

es decir, es posible también usar el operador+=en operaciones de concatena-ción.

Otra forma de efectuar la concatenación de cadenas es utilizar el métodcon-ca t . Este inétodo devuelve un nuevo objeto, resultado de añadirloscaracteres delobjetoSt r i ng especificado como parámetroa continuación delos del objetoSt r i ng que invocaconcat .

Ejemplo

S t r i r . g r a d 1 = new S t r i n g ( " 4 t 2 " ) ;

S t r i 7 . g c a e 2 = new C:rinq ( " = " ) ;

S r r : n g o p e r a c i o r . = c a c i l . c o n c a t ( cad21;

//i:1,prime 4 2 =

C ~ s t e ~ . c ; t . p r : n t l i ( o p e r a r i o n ) ;

8.4. OTROS MÉTODOSDE LA CLASEString

Entre los restantes métodos de la claseSt r i ng se pueden destacar:

I . , public i n t l e n g t h ( ) )

El métodol engt h devuelve la longitud de la cadena

EjemploC - r i r i g c a d 1 = new C t r i n q ( " A N A" ) ;

Cys: em out .p r : r . t l n ( cad : . l e r , g t h ( ) ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 217/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 218/481

204 Java 2. Manual de programación

p ub l i c s t a t i c void mai n ( St r i ng[ ] ar gs)i

St r i ng cadl = new St r i ng ( " A N A" ) ;

for ( i n t i = O ; i < cadl . l engt h( ) ; I ++)Cys t em out . pr i nt l n( c adl . s ubs t r i ng( i , i t l ) ) ;

- ri me en pantal l aANA

4. l p u b l i c c n a r [ ] t oCharArray( )

Devuelveun array de caracteres creado a partir del objetoS t r i n g .

Ejemplo

pu b l i c c l a s s Ej t oChar Ar r ay

p ub l i c s t a t i c vo id mai n ( St r i ng[ ] a r g s )

Ct r i nq sa l >J do= new St r i ng ( "hol a" ) ;

/ / Cr ea un ar r ay de car act er es a par t i r de l a cadenac h a r [ ; a r r = s a l u c i o . t o C k a r A r r a y ( ) ;

/ / Eodi f i c a e l ar r ay de car act er es pasando cada

for ( i n t i =O; i <ar r . l engt h; i t t )

Cys cer r . out . pr i nt l n( a r r ) ;

/ / La cader a no s e ha modi f i cadoSyst en. o' ; t . pr i nt l n( sal udo) ;

' J no de sus car act er es a mayúscul as

a r r [ i ] = ( c h a r ) ar r [ i ] - ( ' a' - ' A' ) ) ;

iinprimeen pantallaHOLAhol a

Observación:El métodol ength() devuelve la longitud de una cadena

mientras que la variablel engt h de un array informa sobre la longitud delmismo:

c a d l . l engt h ( ) ;

ar r . l engt h;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 219/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 220/481

206 Java 2. Manual de programación

/ / Cadena con el conj unt o de opci ones vál i dasSt r i ng opci ones = "ABCS" ;char opci on;i nt n;

tryiSys t e m out . pr i nt l n( "MENÚ") ;

Sys t e m out . pr i nt l n( "A. Al t as") ;

Sys t em out . pr i nt l n ( " B.Baj as") ;

Sys t e m out . pr i nt l n( " C . Consul t as ") ;

Sys t e m out . pr i nt l n( " S . Sal i r") ;

dot

Sys t e m out . pr i nt( "El i j a opci ón (A , B, C, S) " ) ;

opci on =( c har ) Sys t em i n. r ead( );

n = Sys t em i n. avai l abl e( ) ;Syst em. i n. ski p ( n) ;

) whi l e ( opc i ones . i ndex0f( opci on) == - 1 I n =2) ;swi t ch ( opci on)i

case ' A' :/ / Al t asbreak ;

case ' B' :

br eak;case ' C' :

/ / Consul t asbreak:

case S I :/ / S a l i r

/ / Baj as

11cat ch ( Except i on e)t }

9. l publ i c j ava. l anq. St r i nqr epl ace ( char ol dc har , char newChar ) l

Devuelve una nueva cadena resultante de reemplazar todas las apardelol dchar con elnewchar .

1O. I pubi i c j ava. l ang. s t r i ng t r i m0I

Elimina los espacios en blanco que pudieran existir al principioo final de

una cadena.11. l pubi i c j ava. i ang. s t r i ng t oLower Case0

Convierte a minúsculas las mayúsculas de la cadena.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 221/481

Cadenas y fechas 207

13d.

12. / publ i c j ava. l ang. s t r i ng t oupper c as e0

publ i c stat i c j ava. l ang. St r i ng val ueof (char ] d a t o s ,i nt desplazamiento, i n t co n t )

Convierte a mayúsculas las minúsculas de la cadena.

13a. l publ i c s t at i c j ava. l ang. St r i ng val ueOf ( boo1eanb)l

~~

13b. I publ i c s t at i c j ava. l ang. St r i ng val ueOf ( char .>I

1 3~. ubl i c st at i c j ava . l ang.St r i ng val ueof (char ] da o s ) ]

13e.\ publ i c st at i c j ava. l ang. St r i ng val ueof (double d ) l

13f. l pubi i c st at i c j ava. 1ang. St r i ng val ueof ( f i oat f ) ;

13g. l p~bi i c st at i c j ava. l ang. St r i ng val ueOf ( i nti ) ]

13h. l pubi i c st at i c j ava. ang. St r i ng val ueof ( l ong

13i . l publ i c st at i c j ava. l ang. St r i ngval ueof ( j ava. l ang. Obj ec t obj)1

Todos estos métodos crean cadenas a partir del correspondiente parámetroydevuelven dichas cadenas.

~

Recuerde:Para convertir una cadena de caracteres que representa un númeroal valor correspondientese utilizan métodosde lasclasesDoubl e, F l o a t ,I nt eger , comodoubl eval ue, f oat val ueo par sei nt . En el casode doubl e y f l oat el primer pasoseráconstruirunobjetoDoubl eo Fl oat ,mientras que en el caso delostipos enteros no es necesario.

int ent er o = I nt eger . par seI nt ( cadena) ;

Doubl e d = n e w Doubl e( cadena) ;double r eal = d. doubl eVal ue( ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 222/481

208 Java 2. Manual de programación

8.5. LACLASEStringTokenizer

St r i ngTokeni zer pertenece al paquete j av a . ut i 1y actúa sobreSt r i ng.

Proporciona capacidades para efectuar un análisis gramatical básico de caden-tuando su división en subcadenas por aquellos lugares donde aparecen en lainicial unos determinados símbolos denominados delimitadores. El primer paefectuar el análisis consiste en la creación de un objetoSt r i ngTokeni zermediante alguno de los siguientes métodos:

la. public St r i ngTokeni zer ( j ava. l ang. St r i ngc a d )

lb . public St r i ngTok eni z er ( j ava. 1ang. St r i ngcad, j ava. l ang. Ct r i ng

delim)

IC . public St r i ngTokeni zer ( j ava. 1ang. St r i ngc a d , j ava. l ang. St r i ngdelim, boolean d e v o l verTokens)

El parámetrocad representa la cadena que se desea analizary el parámetro,del i m representa los delimitadores;si no se especifica ningún parámetro se con-sideran delimitadores por defecto, el espacio en blanco, tabulador, avance dy retorno de carro( I ' \ t \ n\ r ) , El parámetro que aparece enel tercer construc-tordevol ver Tokens,de tipobooleano, permite establecer si se deben devolveo no los delimitadores cuando se analiza una cadena. Otros métodos interesala clase en estudio son los siguientes:

public j ava. l ang. St r i ng nex t Token0Devuelve el siguientet oken (unidadlexicográfica)y cuando nolo encuentra lanzauna excepción,NoSuchEl ement Except i on

public j ava. l ang. St r i ng next Tok en( j av a. l ang. St r i ngdelim)Devuelve el siguientet oken y permite cambiar la cadena delimitadora.

public bool ean hasMor eTokens( )Devuelvetrue o f al se según quedeno no t okens en la cadena.

public int count Tokens( )

Devuelve el número det okens que aun no se han analizado.

Ejemplo

El siguiente ejemplo muestra el funcionamiento deS t r i ngTokeni zer a travesdel métododi vi de que recibe como parámetro una cadena con una expresióydevuelve en un array de cadenas los operandosy operadores de la misma.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 223/481

Cadenas y fechas 209

Cadena a analizar en el ejemplo( 31. 4+5 2̂) 7 . 3

Cadena delimitadora queseestableceI l + - * / A ( ) 1

Salida en pantalla(31. 4

52

+ A

I*7 . 3

import j a v a . u t i l . * ;

pu b l i c c l a s s Ej St r i ngTok eni z ert

p r i v a t e s t a t i c St r i ng[ ] expr es i onDi vi di da;pr iva te s ta t ic

St r i ng[ ]

di vi de ( St r i ng cad)tSt r i ngTokeni zer s t2 = new St r i ngTokeni zer ( cad,

i n t cont = O;while ( s t 2 . asMor eTokens( ) )i

"+- * / " ( ) ' I , true) ;

cont ++;

s t 2. ne xt Tok enO;1St r i ngTokeni zer s t = new St r i ngTokeni zer ( cad,

St r i ng[ ] aux = new St r i ng[ c ont ] ;f o r ( i n t i =O; i <aux. l engt h; i ++)

return dux ;

" + - * / ( ) , t r u e ) ;

aux[ i ] = s t . next Token( ) ;

1

p ub l ic s t a t i c void mai n ( St r i ng[ ] args){

St r i ng cad = ( 31. 4+5 2̂) 7 . 3 ;expr es i onDi v i di da= di vi de ( cad) ;

f o r ( i n t i =O; i < expr es i onDi vi di da.l engt h; i t +)Sys t e m out . pr i nt l n( expr es i onDi vi di da[ i ] ) ;

8.6. LA CLASEStringBuffer

AI igual queS t r i n g , la claseSt r i ngBuf f e r también pertenece al paquete j a v a. l a n g y ha sido declarada comof i n a l ; pero a diferencia delos objetos

S t r i n g , con los que se necesita reservar una nueva área en memoria para crear unanueva versión, los objetosS t r ingBu f f e r son modificables, tanto en contenidocomoen tamaño.

public f i n a i class St r i ngBuf f er extends Obj ect i q l e m e n t s Ser i al i zabl e

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 224/481

210 Java 2. Manual de programación

A la hora de elegir entre usar objetosSt r i ng o St r i ngBuf f er hay quetener en cuenta que losSt r i ng mejoran el rendimiento cuando el objetono semodifica, mientrasSt r i ngBuf f er es la clase recomendada si el objeto va

sufrir muchas modificaciones. Los objetosSt r i ngBuf fer tienen una determi-nada capacidad y, cuando ésta se excede por la adición de caracteres, crece-máticamente. En realidad Java utiliza objetos de la claseS t r i ngBuf fe r por sucuenta cuando se utilizanlosoperadores+ o += para concatenar cadenas.

Constructores

public St r i ngBuf f er O

public St r i ngBuf f er ( in t longitud)

Construye unCt r i ngBuf f ersin caracteres, con capacidadinicial para16.

Construye unCt r i ngBuf f ersin caracteres, con capacidadinicial paral ongi t ud carac-teres.

public St r i ngBuf f er ( j ava. l ang. Ct r i ngcad) Construye unSt r i ngBuf f ercon la misma secuencia de ca-racteres quela cadena recibida

como parámetro. La capacidadinicial delSt r i ngBuf f er es para 16 caracteres más delosalmacenados en dicha cadena.

8.7. MÉTODOSDE LA CLASEStringBuffer

Los métodos importantes de la claseS t r i ngBuff e r son:

public int l engt h( )Devuelve el número de caracteres actuales.

public int capaci t yDevuelvela capacidad.

public synchronized void encur ecapaci t y( in t minimacapacidad)Establece una capacidad minima.

public synchronized void se t Lengt h( in t n u e v a L o n g i tud)Establece la longitud,si es menor que el número de caracteres actuales se truncaa lalongitud especificada.

public synchronized j ava. 1ang. Ct r i ngBuf f erappend(boo1ean b)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 225/481

Cadenas y fechas 211

publ i c synchr oni zed j ava. 1ang. St r i ngBuf f er append( charc)

publ i c synchr oni zed j ava. 1ang. St r i ngBuf f er append( char [ ]cad)

publ i c synchr oni zed j ava. 1ang. St r i ngBuf f er append( char [ ]cad, i nt desplazamiento, i n t longitud)

publ i c j ava. 1ang. St r i ngBuf f er append( doub1ed)

publ i c j ava. 1ang. St r i ngBuf f er append( f 1oatf)

publ i c j ava. 1ang. Ct r i ngBuf f er append( i nti )

publ i c synchr oni zed j ava. 1ang. Ct r i ngBuf f er append( 1ong1 )

publ i c j ava. l ang. St r i ngBuf f er append( j ava. l ang. 0bj ec to b j )

publ i c j ava. 1ang. St r i ngBuf f er append( j ava. l ang. St r i ngcad)Los métodosappend añaden al final delSt r i ngBuf f er la cadena resultante de latransformación del correspondiente argumento.

publ i c j ava. 1ang. St r i ngBuf f er i ns er t ( i ntdesplazamiento,bool ean b )

publ i c synchr oni zed j ava. l ang. St r i ngBuf f er i ns er t ( i ntdesplazamiento,

charc

publ i c synchr oni zed j ava. l ang. St r i ngBuf f er i ns er t ( i ntdesplazamiento, char [ ] cad)

publ i c synchr oni zed j ava. 1ang. St r i ngBuf f er i ns er t ( i nt i ndex,c h a r [ ] cad, i nt desplazamiento, i nt longitud)

publ i c j ava. l ang. St r i ngBuf f eri nsert ( i n t desplazamiento, doubl e d)

publ i c j ava. 1ang. St r i ngBuf f er i nser t ( i ntdesplazamiento, f l oat f)

publ i c j ava. 1ang. St r i ngBuf f er i ns er t ( i ntdesplazamiento, i nt i)

publ i c j ava. 1ang. St r i ngBuf f eri nser t ( i n t desplazamiento, l ong 1)

publ i c synchr oni zed j ava. l ang. St r i ngBuf f er i ns er t ( i ntdesplazamien to, j ava. l ang .Obj ect o b j )

publ i c synchr oni zed j ava. 1ang. St r i ngBuf f er i ns er t ( i ntdesplazamiento, j ava. 1ang. St r i ng cad)

Los métodosi nser t colocan distintostipos de datos, previamente transformados acadena, en una determinada posición delSt r i ngBuf f er.

publ i c synchr oni zed j ava. 1ang. St r i ngBuf f er del et e( i nt inicio,i nt fin)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 226/481

212 Java 2. Manual de programación

Elimina del objetoSt r i ngBuf f er loscaracteres exitentes entre las posicionesi ni ci oy f i n- 1.

public synchronized j ava. l ang. St r i ngBuf f er r epl ace (int i n i c i o ,

Sustituyeloscaracteres existentes entre las posicionesi ni ci oy f i n - i por losespecifi-cados mediantecad.

int f i n , St r i ng c a d )

public synchronized j ava. 1ang. St r i ngBuf f er r e v er s e 0Invierte la cadena almacenada en elSt r i ngBuf f er .

public j ava. l ang. St r i ng s ubs t r i ng( i nti n i c i o )

public j ava. l ang. St r i ng subst r i ng ( int i n i c i o , int f i n )

Permite extraerun St r i ng de unSt r i ngBuf f er y puede ser invocado pasándole doso bien un único parámetro. Cuandosólose le especifica un parámetro el método devuelveuna nueva cadenaque comienza donde indica inicioy se extiende hasta el final de la mis-ma,si los parámetrossondos la nueva cadena estará formada porlos caracteres existentesen la original entre la posicióni ni ci o y la f i n - 1 ,ambos inclusive.

public j ava. l ang. St r i ng t os t r i ng( )Copia elSt r i ngBuf f er en unSt r i ng y devuelve dicha copia.

public synchronized char c har At ( i nt i n d i c e )Devuelve el carácter existente en una determinada posición.

public synchronized void se tCharAt(int i n d i c e , char c a r )Coloca el caráctercar en una determinada posición, sobreescibiendo el allí existente cel nuevo.

public synchronized void getchars (int f u e n t e I n i c i o , int f u e n t e F i n ,

char I d e s t , int d e s t l n i c i o )

Copia en un arrayloscaracteres delSt r i ngBuf f er ,devolviendo dicho array.

8.8. LA CLASEDate

En Java2 la claseDate representa fechasy horasy tienedosconstructores:

public Da t e 0

public Dat e (long n u m )

Crea un nuevo objetoDat e y coloca ene1la fecha y hora actuales

Crea un nuevo objetoDat e y coloca enella fecha obtenida al interpretarel paráme-tro como el número de milisegundos enque debeincrementarseuna fecha arbitra-ria,] de enero de1970.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 227/481

Cadenas y fechas 213

Entre los métodos de esta clase destacan:

public j ava. l ang. S t r i n g t os t r i ng ( ) Convierte el objetoDat e en una cadenade caracteres.

pub lic lo ng get Ti r ne( ) Devuelve el número de milisegundostranscurridos desde una fecha arbitraria.1de enero de1970.

import j a v a . u t i l . * ;

Dat e actual = new Date( ) ;S y s t e r n . o u t . p r i n t l n ( a c t u a l ) ;

8.9. LOS FORMATOSDE FECHAS

Losformatos especiales para las fechas se establecen mediante la claseDat eFor matdel paquete j ava . text y se crea unobjeto,formateador.For mat es la clase baseen elformate0de información sensible a la localidad, como fechasy números.

pub lic a b s t r a c t c l a s s For mat extends Obj ect implementsSer i al i zabl e, Cl oneabl e

y Dat eFor mat extiendeFor mat .

publ ic a b s t r a c t c l a s s Dat eFor mat extends For mat

Losmétodos

publ ic s t a t i c f i n a l j av a. t ex t . Dat eF or mat ge t Da t e I ns t ance0

Y

publ ic s t a t i c f i n a l j ava. t ext . Dat eFor r nat get Ti r neI ns t ance0

sin parámetros permiten crearunformateadorcon el estilo de formato local.

Ejemplo

import j a v a . u t i l . * ;import 1ava. t ex t . Dat eFor r nat ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 228/481

214 Java 2. Manual de programación

. . .Dat e act i al = new Dat e 0 ;

Dai eFor mat f o r r a t eador = Da t e Fo r ma t . ge t Da t e I ns t a nc e 0;C y s t e r . o ü t . p r i n t l n ( f o r n a t e a d o r . f o r . f o r m a c ( a c t u a 1 ) ) ;

También es posible establecer un estilo específico, utilizando el método

p u b l i c s t a t i c f i n a l j ava. t ext . 3at eFor r at get 3at eI nc t anc e( i nte s t i l o )

y pasándole alguno delossiguientes valores como parámetro:

p u b l i c s t a t i c f i n a l i n t D E FA U LT p u b l i c s t a t i c f i n a l i n t FULL p u b l i c s t a t i c f i n a l i n t LONG p u b l i c s t a t i c f i n a l i n t M E D I U M

e incluso establecer la localidad

p u b l i c s t a t i c f i n a l j av a. t ex t . Dat eFor mat get Dat eI nc t anc( i n t e s t i l o , j ava. ut i l . Local eunalocalidad)

Observe que el segundo parámetro es de la claseLocal e, algunas de cuyasconstantes son:

p u b l i c s t a t i c f i n a l j ava. ut ; l . Loc al e ENGLI SH p u b l i c s t a t i c f i n a l j ava. ut : l . Loc al e GERMAN

Ejemplo

import l a v a . u t i l . * ;import l ava. t ext . * ;. . .DaLe act ual = new Dat e 0 ;

Dat eFor mat f ormat eadcr = Cat eLor mat . get Dat e1nst ance

Cyc t e I - . oc t . pr i ? t l n( f or mat eador . f or mat ( ac t ual ) ) ;( >at eFcr nat . LC dG, Local e . ENGLI SH);

8.10. LA CLASE Calendar

La claseCal endar y susubciaseGr egor i anCal endar representan datos detipo calendario. La claseCal endar permite crear fechas específicas, establecido el día, mes y año, incluyendo la zona y los ajustes horarios y tambiénobtener todos ellos, asícdmoel día de la semana.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 229/481

Cadenas y fechas 215

p u b l i c a b s t r a c t c l a s s Calendar e x t e nd s Object imple mentsC e r i a l i z a b l e , C l o n e a b l e

p u b l i c c l a s s GregorianCalendar e x t e n ds Cal ezdar

Entrelosmétodos de la claseCalenciar se pueden citar:

p u b l i c s t a t i c synchronized j a v a . u t i l . C a l e n d a r g e t I n s t a n c e 0Devuelveun objeto de tipoGregor ia r Ca lendar inicializado con la fechay horaactualesy huso horarioy sitio por omisión.

p u b l i c f i n a l i n t g e t ( i n t campo)Devuelve parte de una fecha.

p u b l i c f i n a l Date g e t T i m e 0Devuelve el tiempo actual del calendario.

p u b l i c f i n a l v o i d s e t ( i n t año, i n t mes , i n t d i a )

p u b l i c f i n a l v o i d s e t ( i n t a ñ o , i n t mes , i n t d i a , i n t h o r a , i n tminutos)

p u b l i c f i n a l vo id s e t ( i n t a ñ o , i n t mes, i n t d i a , i n t h o r a , i n tminutos, i n t segundos )

Establecen partes de una fecha. p u b l i c f i n a l v o i d cetTime (Date unDatej

Establece el tiempo para el calendario con la fecha dada.

Constantes

p u b l i c s t a t i c f i n a l i n t JANUARY p u b l i c s t a t i c f i n a l i n t FEBRUARY

p u b l i c s t a t i c f i n a l i n t MON3AY p u b l i c s t a t i c f i n a l i n t T U E S D AY

. . .

Campos

p u b l i c s t a t i c f i n a l i n t DAYP OF WEZK p u b l i c s t a t i c f i n a l i n t DAY OF- YEAR p u b l i c s t a t i c f i n a l i n t HOUE- OF ~~AY

Ejercicio

El programaFechaCumpl determina cuantos días faltan paraun cumpleaños.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 230/481

216 Java 2. Manual de programación

import j ava. i o. * ;import j a v a . u t i l . * ;

public class FechaCumpl

public static void mai n ( St r i ng[ ] ar gc)I

I nput St r eamReader i s r = new I nput St r eamReader ( Sys t em i n) ;Baf f er edReader br = new Buf f er edReader ( i s r ) ;St r i ng nombr e;try

Sys t em out . pr i nt l n( "Escri ba su nombr e y pul se RETURN") ;

nombr e = br . r eadLi ne( ) ;

Syst em. out . pr i nt 111( "i ndi que el dí a de su cumpl eaños " +

int di a = I nt eger . par s eI nt ( br . r eadL i ne0) ;Sys t em out . pr i nt l n( " i ndi que el númer o de mes en que "+

int mes = I nt eger . par s eI nt ( b r . eadLi ne( ) ) ;

Cal endar cal l = Cal endar . get i ns t ance( ) ;Cal endar c al 2 = Cal endar . get I ns t ance( ) ;ca12. set ( c a l l .get ( Cal endar . YEAR) , mes -int di f er enci a = ca12. get ( Cal endar . DAY- OF- YEAR)-

if ( di f er enc i a > O)

else

"y pul se RETURN") ;

"naci ó y pul se RETURN") ;

1, di a) ;

cal l . get ( Cal endar . DAY- OF- YEAR) ;

Syst em. out . pr i nt l n( "Fal t an "+di f er enci a+ " di as ") ;

if ( di f er enc i a == O)

elseSys t em out . pr i nt l n( "FELI CI DADES" ) ;

Sys t e m out . pr i nt l n( "Su cumpl eaños f ué hace t

Mat h. abs( di f er enci a) " di as ") ;

1catch ( I OExcept i on e)I

Sys t e m out . pr i nt l n( "Error") ;

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 231/481

9

InterfacesI gráficasI

usuarioCONTENIDO

AWT.9.2.9.3. La claseComponent .9.4. La claseCont ai ner .

9.5. Ventanas.9.6. ClasePanel .9.7. Label .9.8. ClaseBut t on.9.9. Clase Text component .

9.10. ClaseCanvas.9.1 ClaseChoi ce.9.12. ClaseCheckbox.9.1 3. Listas.9.14. Scrol l bar.9.15. Menús.9.1 6. Administradores de diseño.9.17. Swi ng.

Realización de dibujos: claseGr aphi cs.

217

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 232/481

218 Java 2. Manual de programación

~~

Las interfaces Gráficas de Usuario (IGU)'ofrecen objetos visualessobreloscuales puedenlosusuarios actuar y de esta forma comu-nicarse con un programa. En la versión2 de Java, la bibliotecadenominada Java Foundation Classes proporciona un conjunto dclases destinadas al diseño de interfaces gráficas, entre las queconjuntamente con las de j ava .awt , destacan las pertenecientesal paquete j avax. s w i n g . Los componentes Swing se ejecutanuniformemente en cualquier plataforma y constituyen una mejosobre losdel awt aunque no siemprelos reemplazan. Los compo-nentes delas IGU(botones, campos de texto, etc.) esperan a queel usuario ejecute alguna acción sobre ellos; es decir, esperan uevento (o suceso). Por eso se dice que la programación conIGUes una programación dirigida por eventos. La gestión de eventos

se verá con mayor profundidad en el capítulo diez.

AWT(AbstractWindow>Toolkit)es un paquete en el que se encuentran clases cap-ces de crear componentes de la IGU (GUI); es decir, clases capaces de crea-tos visuales sobre los cuales puedenlos usuarios actuar, mediante el empleo deratóno el teclado, para comunicarse con el programa, sustituyendo, por dichos objetos laentradahalidaclásicas.El aspecto de estos componentes puedevariar de una plataforma a otra, ya que existe una vinculación con la IGU l

Loscomponentes de la IGU (botones, campos de texto, etc.) se organizcontenedores y esperan hasta que el usuario ejecute alguna acción sobre edecir, esperanun evento(suceso).Por eso se dice que la programación IGU es u programación dirigida por eventos. Para el diseño de este tipo de progranecesario considerar, como se acaba de indicar, que las interfaces gráficaconstruidas por elementos gráficos denominadoscomponentesagrupados dentro deotros que se denominancontenedores, pero además hay que tener en cuenta queloscontenedores son a su vez componentes y pueden volver a ser agrupados econtenedores. Habitualmente en un contenedor habrá varios componentes situarlos de forma conveniente pueden usarselos administradores de diseño.

En ingles,GrupíziculU.yerInrerfuceC UI)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 233/481

Interfaces gráficas de usuario 219

p u b l i c abs t r ac t v o i d c o p y A r e a ( i n t pl, i n t p2, i n t p 3 , i n t p4,i n t p 5 , i n t p6)

Copiaun área rectangular de la pantalla y la coloca en otro lugar;p1,p2 representan laesquina superior izquierda del área a copiar;p3 y p4 la anchura y altura de la mismay p5y p6 un desplazamiento relativo con respecto alosdos primeros valores, a través del cualse obtiene el lugar donde se situarála esquina superior izquierda de la copia.

p u b l i c abstract j a v a . a w t .G r a p h i c s c r e a t e 0Crea una nueva referencia para un contexto gráfico.

Es interesante también conocer quelos métodos gráficos de Java se encuentran enla claseGr aphi cs, que permite dibujar rectángulos, arcos, polígonos, etc.,y,median-te el métododr awst r i ng ( ), puede mostrar cadenas en una determinada posición.

En resumen, las clasesdel paqueteAWT puedenclasificarseen: gráficos, com- ponentes, administradores de diseño, manipuladores de sucesosy manipuladores deimágenesy, para poder hacerusode las mismasy gestionarloseventos que se pro-duzcan, los programas deben incluir las siguientes sentencias:

i m p o r t j a v a . a w t . * ;

i m p o r t j a v a . a w t . e v e n t . * ;

9.2. REALIZACIÓNDE DIBUJOS:CLASEGraphicsGr aphi cs es una clase abstracta que proporciona un conjunto de métodos para dib-

jar en pantalla- incluido uno para el dibujo de cadenas- y permite escribir programasque usan gráficos independientemente de la plataforma sobre la que van a ser ejec-dos. Para efectuar dichos dibujos se necesita un objetoGr aphi cs que no puede serinstunciado, pero se puede obtener a través delos métodospai nt y updat e queloreciben como parámetro; por tanto, para dibujar, se redefinenlosmétodospai nt yupdat e de componentes que soportan el dibujo (pintura)o visualización de imáge-

nes.Losmétodospai nt y updat e se explicarán al hablar de la claseComponent ; por ahora sólo diremos que reciben como parámetro un objetoGr aphi cs, que repre-senta el contexto gráfico del objeto al que pertenecen,y no hacen nada por omisión.

Dentro de los métodos pertenecientes a la claseGr aphi cs mencionaremoslossiguientes:

p u b l i c abstract v o i d c l e a r R e c t ( i n t pl, i n t p2, i n t p3, i n t p4)Dibujaun rectángulo cuya esquina superior izquierda esp l , p 2 y cuyas dimensiones sonp 3y p4 (anchoy alto respectivamente) en el color actual del segundo plano.

publ ic a b s t r a c t v o i d c i i p R e c t ( i n t pl , i n t p2 , i n t p3, i n t p4)Establece una subzona en el contexto gráfico donde se van a realizar las modificaciones clas siguientes operaciones de dibujo; esta subzona será la intersección entre el rectánguformado porlos parámetros pasados al procedimientoy el rectángulo anteriormente consi-derado.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 234/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 235/481

Interfaces gráficas de usuario 221

public abstract void s et Col or ( j ava. awt . Col orpl)Establece el color actual para dibujar en el contexto gráfico. Las constantesy métodos decolor se definen en la claseCol or .Constantes de color predefinidas son:Col or . bl ac k,Col or . whi t e, Col or . gr ay, Col or . l i ght Gr ay,

Col or . dar k Gr ay, Col or . r ed,Col or . pi nk, Col or . or ange,Col or . yel l ow, Col or . gr een,Col or . bl ue, Col or . c yan,Col or . magent a.

public abstract void ce tFont ( j ava.awt . Font pl)Establece como fuente actual la especificada en el objetoFont . Para crear un objetoFont con una determinada fuente, estiloy tamaño se utiliza:

public Font ( j ava. l ang. St r i ng pl, int p2, int p3)El primer parámetro esel nombre de la fuente, el segundo el estiloy el tercero el tamaño

en puntos. La fuente puede ser cualquiera de las reconocidas por el sistema; si la elegidano está disponible en el sistema donde luegoseejecuta el programa será sustituida porlafuente por omisión en dicho sistema. Constantes predefinidas en cuanto al estilo de fuente sonFont . PLAIN (normal),Font . I TALI C(cursiva),Font . BOLD(negrita).

Otra herramienta muy útil de la claseFont es

public int get s i z e ( )que devuelve el tamaño de la fuente actual en puntos.

public j ava. awt . Font Met r i c s get F ont Met r i c s 0Devuelvelos siguientes datos sobre la fuente actual: línea de base (posición del renglónsobre el quese escribe), parte ascendente, parte descendente, anchura delos caracteres,interlineado, altura de la fuente. Se utiliza en combinación con otros métodos:

public int get Ascent 0 public int get Descent 0 public int get Hei ght ( )

public int ge t l ea di ngo public int ] get wi dt hs ( )

para obtener información sobre una determinada característica de la fuente. Un ejemplo e

int al t o = g .get Font Met r i cs( ) .get Hei ght ( 1 ;

public abstract void set XORMode( j ava. awt . Col orp l )Estableceel modo de pinturaXOR,que consigue que las figuras se transparenteny permitanver la que está debajo cuando se dibujan una encima de otra.

En los métodos descritos se observa que para dibujar la primera acción que realiza es un posicionamiento; por tanto, es necesario conocer que la posición0,Ocorrespondea la esquina superior izquierda de la superficie de dibujo,y además,

como se verá más adelante, que algunos contenedores tienen bordes,y el área ocu- pada por estos bordes se considera como parte integrante de la zona de dibujo, modo que, en estos casos, la posición0,O queda oculta por los bordes.

Otro aspecto interesante a tener en cuenta es que el modo de pintura por omisies el de sobrescrituray, así, cuando una figura se dibuja sobre otra la tapa, es posible

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 236/481

222 Java 2. Manual de programación

modificar esta situacióny permitir que se vean ambas figuras estableciendomodo de pinturaXOR.Para volver al modo sobrescritura se utiliza publicabstract void s e t P ai nt Mode0.

Las aplicaciones que se diseñan pueden crearun gran número de objetosGraphi cs, perolosrecursos consumidos porlos objetosGr aphi cs obtenidos a través de losmétodospai nt y updat e son liberados automáticamente por el sistema cuanfinaliza la ejecución del método; por esta razón, en estos casos, no es necesallamada adi spose.

Recuerde: Gr aphi cs proporciona, entreotros,el métododr awst r i ngque permite el dibujo de cadenasy constituye una forma muy fácil de presen-tar mensajes.

Nota: Para efectuar dibujos se redefinenlos métodospai nt y updat e decomponentes que soportan la pinturao visualización de imágenes; ésta es unaforma de obtener el objetoGr aphi cs necesario.

9.3. LA CLASEComponent

Component es una clase abstracta situada en la parte superior de la jerarquclases del paqueteAWTy que representa todo aquello que tiene una posición,tamaño, puede dibujarse en pantallay además recibir eventos. En esta clase sdefinen métodos para la gestión de los eventos producidos por el ratóno el tecla-do, otros destinados a especificar el tamaño, el coloro tipo de fuentey otros que permiten obtener el contexto gráfico. Entre todos esos métodos, de momedestacaránlossiguientes:

public void pai nt ( j ava. awt . Gr aphi cc p l )El métodopai nt proporcionado porel componente debe ser redefinido porel progra-mador; este método recibe como parámetro el contexto gráfico del objeto al que-nece el métodoy no tiene que ser invocado. La llamada a un métodopai nt se efectúade dosformas:

Directamente por el sistema, porejemplo cuando el componente se muestra por pr-mera vez en pantalla, deja de estar tapado por otroo cambia de tamaño.En este tipode llamadas elAWTdeterminasi el componente debe ser repintado en su totalidadosóloen parte.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 237/481

Interfaces gráficas de usuario 223

Porla aplicación, que invoca al métodor epai nt , considerando que éste, indirecta-mente,a través deupdat e llamaa pai nt .

public void r epai ntEs el método que permitea lasaplicaciones, mediante invocacionesa dicho método sobreloscomponentes, ordenar la repintura delosmismos. Este método hace que el intérprete eje-cute una llamada al métodoupdat e, que ensu implementación por defecto llamaal méto-dopai nt . El formato mostrado es el básico.

Figura 9.1. Jerarquía de clases.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 238/481

224 Java 2. Manual de programación

public void r epai nt ( i nt pl, int p2, int p3, int p4)Formato del método comentado anteriormente en el que se especifica la región a r para que el proceso sea más rápido cuandono se necesita vover a pintar todoel área.

public void r epai nt (long p l )El parámetro especifica el máximo de milisegundos que pueden pasar antes de llmétodoupdate.

public void r epai nt (long pl, int p2, int p3 , int p4, int p5)Formato der epai nt en el quese especifica tanto el tiempo como las dimensiones del áa repintar;pi y p2 son las coordenadas de la esquina superior izquierda,p3 la anchurayp4 la altura.

public void updat e( j ava. awt . Gr aphi cs pl )Este método posibilita repinturas incrementales. AI igual quepai nt recibe como paráme-

tro el contexto gráfico del objeto al que pertenecey se invoca automáticamente cuando unaaplicación llama al métodor epai nt . Cuando no se sobreescribe,el métodoupdat e borra el contexto gráfico rellenando el fondo conel color de fondo por defectoy llama acontinuación apai nt para que dibuje de nuevo; estas operaciones hacen que se origin parpadeo. Una forma de evitar esto essobrescribirupdat e para que no borre el contextográfico; por ejemplo, escribiendo enél una simple llamada apai nt .

Todos los elementos de la interfaz de usuario que aparecen en pantalla -ractúan con el usuariosonsubclases deComponent (Fig.9.1).

9.4. LACLASEContainer

Cont ai ner es una subclase abstracta deComponent que contiene métodos adi-cionales que van a permitir a los contenedores almacenar objetosComponent .

Nota:Losobjetos Cont ai ner también son Component y, porconsiguiente,resulta posible anidar Cont ai ner .

Los componentes se colocan en los contenedores empleando el métodoadd dela claseCont ai ner y los administradores de diseño acomodan los componeen el contenedor e intentan reajustarlos cuando el usuario redimensiona dic-tenedor. Los administradores de diseño se asocian al contenedor mediante e-do set Layout .El formato de los métodos citados es:

public j ava. awt . Component add( j ava. awt . Cor nponentp l ) public void add( j ava. awt . Cor nponentp l , j ava. l ang. 0bj ec t p 2 )

public j ava. awt . Component add( j ava . l ang. Ct r i ng pl,

public void se t Layout ( j ava . awt . Layout Managerp l )j ava. awt . Component p 2 )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 239/481

Interfaces gráficas de usuario 225

Los principales administradores de diseño son:Fl owLayout, BorderLayouty Gr i dLayout .

9.5. VENTANAS

La claseWi ndowhereda deCont ai ner y contiene métodos para manejar venta-nas. Fr ame y Di al og extiendenWi ndowy Fi l eDi al ogextiendeDi al og, pudiéndose obtener así cuatro tipos básicos de ventanas:

Wi ndowFr ameDi al ogFi l eDi al og

Ventana de nivel superior, sin barra de título ni borde.

Marco, es decir, ventana con borde, títuloy una barra de menús asociada.Ventana de diálogo con bordey título.Ventana de diálogo especializada en mostrar la lista de archivos deun directorio.

9.5.1. Clase Frame

En las aplicacionesIGUse empleaFr ame como contenedor más externo, siendoBor der Layout su administrador de diseño por defecto. La claseFr ame tiene lossiguientes constructores:

public Fr ame Crea una ventana estándar sin titulo. public Fr ame ( j ava. l ang .St r i ng p i ) Crea una ventana conel titulo especificado.

El método St r i ngpl ) permite cambiar el título de un marco.

Figura 9.2. Marcossin y con barrade menús.

Las dimensiones de una ventana tienen que ser establecidas después de que ésha sido creada,y para ello se utiliza el método public void set i ze

int de j ava .awt . Component . Además, las ventanasFr amenecesitan que se las haga visibles, para lo que se emplea el método public voidset vi si bl e (boolean de ava. awt .Component .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 240/481

226 Java 2. Manual de programación

Cierre de la ventana de una aplicación

Para cerrar una ventana, el método usualmente aceptado es que el usuarioclic sobre el botón de cierre de la mismam.La pulsación de este botón generaunsuceso que puede ser detectado por el oyenteWi ndowLi st ener del paquete j ava .awt .event , para ello se instanciay registraun objeto receptor de even-tos de ventana.

addW ndowLi st ener ( new Recept or Event oO)

y luego se define el receptor de eventos de forma que suplantey redefinael méto-

do wi ndowCl osi ngde Wi ndowAdapt er realizando la acción adecuada, qu para el contenedor más externo,essalir al sistema.

cl ass Recept orEvent o ext ends Wi ndowAdapt er

publ i c voi d wi ndowCl osi ng( W ndowEvente)

Syst em exi t O) ;

Wi ndowAdapt er es una clase que proporciona implementacionesvacíasdelos métodos presentes enWi ndowLi st ener y que resulta conveniente utiliza pues evita tener que codificar los muchos métodos que requiere el uso interfaz.

Wi n d o w L i s t e n e r

publ i c abst r act voi d wi ndowAct i vat ed( j ava. awt . event . W ndowEventpl)

publ i c abst r act voi d wi ndowCl osed( ] ava. awt . event . W ndowEventp l )

publ i c abst r act voi d wi ndowCl osi ng( ~ava. awt . event . W ndowEventpi )

publ i c abst r act voi d wi ndowDeact i vat ed( j ava. awt . event . W ndowEventpl)

publ i c abst r act voi d wi ndowDei coni f i ed( j ava. awt . event . W ndowEventpl)

publ i c abst r act voi d wi ndowI coni f i ed( j ava. awt . event . W ndowEventpl)

publ i c abst r act voi d wi ndowOpened( j ava. awt . event . W ndowEventp l )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 241/481

lnterfaces gráficas de usuario 227

LostiposWi ndowEvent se generan cuando una ventana cambia de estadoy se procesan porlosobjetos que implementa la interfazWi ndowLi st ener .

Ejemplo

Un ejemplo deFr ame que utilizaGr aphi cs y permite el cierre de la ventana dela aplicación usandoWi ndowAdapt er es Ej Mar co.

IBienvenido ai A WT

Figura 9.3. Escribiren un marco.

import j ava. awt . * ;import j ava. awt . event . * ;

p u b l i c c l a s s Ej Mar co extends Fr amei

p ub l ic s t a t i c v o id mai n( St r i ng a rg s [ ] )

t new Ej Mar co( ) ;

public Ej Mar co( )

taddW ndowLi st ener(new Ci er r e ( ) ) ;

s et Ti t l e( "Mar co") ;

set s i ze ( 200, 100) ;

set vi s i bl e ( t rue) ;

1public void pai nt ( Gr aphi cs g)t

Font l et r er o = new Font ( " Canc Cer i f " , Font . I TAL I C,14) ;

g. s et Font ( l et r er o) ;

g. dr awSt r i ng( " Bi enveni doal AWT" , 42, 60) ;

1

c l a s s Ci er r e extends Wi ndowAdapt erI

public void wi ndowCl osi ng( Wi ndowEvent e)

i

ICys t em exi t( O );

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 242/481

228 Java 2. Manual de programación

El ejemplo anteriorsin la utilizacióndeWi ndowAdapt er es:

import j ava. awt . * ;import j ava. awt . event . * ;

public class Ej Mar co2extends Fr ame implements Wi ndowLi st enert

public static void mai n( St r i ng a r g s [ ] )

Inew Ej Mar co2( ) ;

i

public Ej Mar co2( )

addW ndowLi s t ene r(this) ;

s et Ti t l e( " Mar co");set si ze ( 200, 100)set vi s i bl e (true)

public void pai nt ( Gr aphi cs g)i

Font l et r er o = new Font ( " Sans Ser i f " , Font . I TALI C,14) ;

g. s et Font ( l et r er o) ;

g. dr awSt r i ng( " Bi enveni do al AWT" , 42,60) ;

public void wi ndowCl osi ng( W ndowEvente)i

Sys t e m exi t ( 0)i

public void wi ndowAct i vat edi W ndowEvente)i }

public void wi ndowCl osed( W ndowEvente )t i

public void wi ndowDeact i vat ed( W1ndowEvente)I !

public void wi ndowDei coni f i ed( W nd0wEvente )

t i

public void wi ndowI coni f i ed( W ndowEvente)

i

public void wi ndowOpened( W ndowEvente)t i

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 243/481

hter faces gráficas de usuario 229

9.5.2. Clase Dialog

Loscuadros de diálogoson parecidos a las ventanasFrame, excepto porque no sonel contenedor más externo, sino ventanas hijas de otras de nivel superior, y además ntienen barra deineiiús.Estos objetos pueden ser redimensionados, desplazadosycolocados en cualquier lugar de la pantalla,noestando su posición restringida al inte-rior de la ventana padre, perono pueden ser maximizados ni minimizados.

Figura 9.4. Cuadrode diálogo.

A veces, cuando se muestraun cuadro de diálogo,lo que se persigue es que elusuario introduzcao tome alguna informacióny cierre dicho cuadro de diálogoantes de continuar,no se debe permitir el acceso a ninguna otra parte de la aplica-ción mientras tanto. Para conseguir esto, habrá que utilizar un cuadro de diálogomodal.En contraposición,los cuadros de diálogo sin modo dejan acceder a otrasventanas mientras se exhibe el cuadro de diálogo.Losconstructores son:

public Di al og ( 1av a. awt . Fr ame p l )El paráinetropl es la ventana de nivel superior padre del cuadro de diálogo.

public Di al og ( j ava. awt . Fr ame p i , boolean pZ)El priiner paráinetro sigue siendo la ventana de nivel superior, mientras quep2 permiteespecificar si va a sero no un cuadro de diálogo modal.

public Di al og( ] ava. awt . Fr ame pl, j ava. l ang. Ct r i ngp2)Este formato permite especificar el titulo del cuadro de diálogo quese está creando

public Di al og( : ava. awt . Fraxe pl , j ava. l ang. St r i ngp2, boolean p 3 )

Incluye el títuloy si es modalo no.

Después de la creación, se puede establecer el tipo de cuadro de diálogo (modao no modal) mediante el método

public void set Modal (boolean p l )

Ejemplo

Muestra el funcionamiento deDi al og.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 244/481

230 Java 2. Manual de programación

import j ava. awt . * ;import j ava. awt . event . * ;

public class Di al ogos

public static void mai n( St r i ng a r g s [ ] )t

Mar co e l Mar c0 = new Ma r c o ( );el Mar c o. s et Ti t l e( "Mar co" ) ;

el Mar c o. s et Ci z e( 400, 200 ) ;el Mar c o. s et Vi s i bl e(true ) ;el Mar co. addW ndowLi st ener ( newC e r r a r ( ) ) ;

Di al ogo di al ogoNoModa1= new Di al ogo( el Mar c o,

di al ogoNoModa l . s e t Backgr ound( Co l or . yel 10~) ;di a l ogoNoModa l . ge t Gr aphi c s0 ;/ * set Bounds col oca l a esqui na super i or de: di ál ogo en l a

posi ci ón 100, 100 conr espect o a su cont enedor y est abl ece su anchur a en 300pi xel s y su al t ur a en 100 * /

"Di al ogo no modal " , false) ;

di a l ogoNoModa l . se t Bounds( 100, 100, 300, 100) ;di al ogoNoModal . addW ndowLi st ener ( newCer r ar ( di al ogoNoModa1) ) ;di al ogoNoModal . s et Vi s i bl e( t r ue) ;

Di al ogo di al ogoModa1= new ai al ogo( e l k l a r c o ,

di ai ogoModal . s et Si z e( 300, i OO) ;di al ogoModal . addW ndowLi st ener ( newCer r ar ( di al ogoModa1) ) ;di al ogoModal . s et Vi s i bl e( t r ue) ;

"Di al ogo modal " , true) ;

1

class Mar co extends Fr amei

public void pai nt ( Gr aphi cs g )

Font l et r er o = new Font ( "Cour i er" , Font . BOLD, 12) ;

g. set Font ( l et r er o) ;

g. dr awSt r i ng( "Bi enveni d0ai AWT" , 24, 70);

!

class Di al ogo extends Di al og

Di al ogo ( Fr ame vent ana, St r i ng t i t u l o , boolean modo)

super ( vent ana, t i t ul o, modo) ;

1 public void pai nt ( Gr aphi cs g)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 245/481

interfaces gráficas de usuario 231

i f ( super . cModal ( ) )g. dr awst r i ng ( "Ci ér r eme par a poder acceder " +

"a ot r as vent anas" , 10, 40) ;

else

g. dr awCt r i ng( "Desde est e cuadr o puede acceder " +"a ot r as Vent anas" , 10, 40) ;

}J

c l a s s Cerrar extends Wi ndowAdapt erI

Di al ogo ot r oDi al ogo;

Cer r ar ( Di al ogo unDi a l ogo )

i

ot r oDi al ogo = unDi a l ogo ;I

Cerrar ( )

ot r oDi ai ogo = nul l ;i

p u b l i c v o id wi ndowcl os i ng(Wi ndowEvent evt )

ti f ( ot r o3i ai ogo ! = n u l l )

ot r oDi al ogo. di s pos e( ) ;e l se

Sys t e m exi t ( O );

Llr;S@0'1n íu m u

1 i ~ d 8 c c e ú ~ i 01t.35irF<nlarid:

J

Figura 9.5. Cuadros de diálogo modales y no modales.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 246/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 247/481

Interfaces gráficas de usuario 233

import j ava .awt .*;

import j ava. awt . event . * ;

public class Di al ogoA

{ public static void mai n ( St r i ng ar gs [ ] )

i

}Vent ana vent anas = new Vent ana ( ) ;

1

class Vent anai

St r i ng msg=" " ;

public Vent ana ( )t

Fr ame el Mar co = new Fr ame ( ) ;

Fi l eDi al og di al ogoAr chi vos= new Fi l eDi al og( el Mar co,

di al ogoAr c hi vos . s et Vi s i bl e( t r ue) ;St r i ng nombre = di al ogoAr c hi vos . get Fi l e( ) ;St r i ng di r ec tor i o = di al ogoAr c hi vos . get Di r ec t or y0;if ( nombr e ! = null){

"El i j a archi vo", Fi l eDi al og.LOAD);

msg ="Ar chi vo sel ecci onado: t di r ect or i o t nombr e;Di al ogo2 di al ogoModa1= new Di al ogo2( el Mar co,di a l ogoModal . set Si ze( msg. l engt h( ) *5+24, l OO) ;di al ogoModal . addW ndowLi st ener ( newCer r ar 2( di al ogoModal ) ) ;di al ogoModal . s et Vi s i bl e( t r ue) ;

"Di ál ogo modal " , true, msg) ;

Sys t em exi t ( O );1

class Di al ogo2 extends Di al ogI

St r i ng mensaj e;

Di al ogo2 ( Fr ame vent ana, St r i ng t i t ul o, boolean modo, St r i ng msg){

super ( vent ana, t i t ul o, modo) ;

mensaj e = msg;1

public void pai nt ( Gr aphi cs g)I

Font l et r er o = new Font ( " Hel vet i c a" , Font . PL AI N,10) ;

g. se tFont ( l et r er o) ;

g. dr awSt r i ng( mensaj e, 12, 4O);

}

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 248/481

234 Java 2. Manual de programación

class Cerrar2 extends Wi ndowAdapt er{

Di al ogo2 ot r oDi al ogo;

Cer r a r2 ( Di al ogo2 unDi al ogo )

ot r oDi al ogo= unDi al ogo;i

public void wi ndowCl osi ng(Wi ndowEvent evt )I

)ot r oDi al ogo. di s pos e0;

9.6. CLASEPanel

Losobjetos de la clasePanel carecen de barra de título, barra de menúsy borde,se emplean para almacenar una colección de objetos a los que de esta forganiza en unidades, no generan eventosy adquieren el tamaño necesario paque quepan los componentes que contienen. Esta clase es la superclase deAppl ety su administrador de diseño por defecto esFl owLayout .

Constructores

public Panel ( ) Crea un nuevo panel.

public Panel ( j ava .awt .Layout Manager pi ) Crea un nuevo panelyestablece un determinadoadministrador de diseño paraél.Por ejemplo:Panel pX = new Panel(new Gr i dLayout ( ) ) ;

Para destacar un panel se establece un determinado color de fondo para élse coloca en un contenedor mediante el métodoadd y, como él también es un conte-nedor, se le pueden agregar componentes, incluidos otros paneles, medmétodoadd.

9.7. CLASELabel

Label extiende la claseComponent y permite mostrar texto estático, es dectexto que no puede ser modificado por el usuario, en unaIGU.Para crear un rótulocon la claseLabel es necesario declarar una referenciay llamar al constructor.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 249/481

interfaces gráficas de usuario 235

Constructores

public Label ( ) Crea una etiqueta sin texto.

public Label ( j ava. l ang. St r i ng p i ) Creaunaetiquetacuyotextoeslacadena pasada como parámetro.

La cadena de caracteres que presenta la etiqueta puede modificarse con elmétodo

public synchronized void set Text ( j ava. l ang. St r i ng p l

y se devuelve mediante public j ava. l ang. St r i ng get Text ( )

El procedimiento

public synchronized void set Al i gnment(int p i

permite establecer la alineación del texto. El parámetrop l puede ser cualquiera delas siguientes constantes predefinidas:

public static final int CENTER public static final ant LEFT public static final int RI GHT

Como todos los componentes, las etiquetas se colocan en los contenedores median-te el métodoadd de la claseCont ai ner .

add (referencia - etiqueta)

I

Figura 9.8. Etiquetas, paneles. Empleo de colores de fondopara destacar lospaneles.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 250/481

236 Java 2. Manual de programación

El siguiente ejemplo muestra cómo crear etiquetasy panelesy establecer colores de

fondo.i mpor t j ava. awt . * ;i mpor t j ava. awt . event . * ;

publ i c cl ass Panel es ext ends Fr amei

publ i c Panel es ( )

taddW ndowLi st ener ( newCi er r e30 ) ;Panel pX = new Panel ( ) ;pX. set Backgr ound( Col or . bl ack) ;Panel pY =new Panel ( ) ;

pY. set Backgr ound( Co1or. r ed) ;Label et i quet a1 = new Label ( "Los panel es se adapt an " ;

Label et i quet a2 = new Label ("a nuest r o t amaño ") ;

et i quet al . set Backgr ound( Co1or . whi t e) ;pY. add( et i quet a1);

pY. add( et i quet a2);pX. add( pY) ;add (pX);

publ i c st at i c voi d mai n( St r i ng args[ l )i

Panel es vent ana = new Panel es 0 ;

vent ana. set Layout ( new Fl owLayout O) ;vent ana. s et Ti t l e( "El AWT" ) ;

vent ana. set Si ze( 300, 120 ) ;vent ana. s et Vi s i bl e( t r ue) ;

I1cl ass Ci er r e3 ext ends Wi ndowAdapt ertpubl i c voi d wi ndowCl osi ng( W ndowEvente)t

ISys t em exi t ( O) ;

1

9.8. CLASEButton

Esta clase produce botones con etiqueta que provocan la ejecución de uncuando se efectúaclicen ellos con el ratón. La claseBut t on define los siguientesconstructores:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 251/481

Interfaces gráficas de usuario 237

publ i c But t on ( ) Crea un botón sin etiqueta.

publ i c But t on ( j ava. l ang . St r i ng p i ) Crea un botón cuya etiqueta es la cadena pasada como parámetro.

y pone a disposición del programador una colección de métodos entrelosque des-tacan

publ i c synchroni zed voi daddAct i onLi s t ener ( j ava. awt . event . Ac t i onLi s t ener pi)

Añade un receptor de eventos semánticos

publ i c synchr oni zed voi d

r emoveAct i onLi s t ener ( ] ava. awt . event . Act i onLi s t enerp i )Elimina el receptor de eventos

publ i c j ava. l ang. St r i ng get l abel ( )Devuelve la etiqueta del botón

publ i c synchr oni zed voi d s et Label ( j av a. 1ang. St r i ng pi)Establece la etiqueta del botón

Ejemplo

Colocación de botones en un contenedor (Fig.9.9).Los botones de este ejemplonoejecutan ninguna acción.

i mpor t j ava .awt .*;

i mpor t j ava. awt . event . * ;

publ i c cl ass Pr ueba ext ends Fr amei

publ i c Pr ueba ( )I

addW ndowLi s t ener ( new Ci e r r e30) ;Panel panel Bot ones = new Panel ( ) ;

for ( i nt i = 1; i < 8 ; i ++)panel Bot ones.add ( new But t on ( "Bot ón "+i ) ) ;

/ * Se ut i l i za el admi ni st r ador de di seño por def ect o en l acl ase Fr ame para col ocar el panel en el área Sur * /add ( "Sout h" , panel Bot ones ) ;

publ i c st at i c voi d mai n( St r i ng ar gs [ J )i

Pr ueba vent ana = new Pr ueba ( ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 252/481

238 Java 2 . Manual de programación

vent ana. s et Ti t l e( "El AWT" ) ;

vent ana. s et Si z e( 400, 250 ) ;vent ana. s et Vi s i bl e( t r ue) ;

1

La claseCi er r e3 ya fue implementada en el Apartado9.7.

Figura 9.9. Botones.Aunque la gestión de eventos se tratará en el Capítulo10, es necesario advertir

que, cuando se colocan botones en un contenedor, tienen como objetivo reaante su pulsación. Para que se pueda reaccionar ante la pulsación de un boque enlazarlo aAct i onLi st ener , interfaz definida enawt . event con unúnico método a implementar denominadoact i onper f or med, por lo que nonecesita adaptadores. Este método tiene un parámetro del tipoAct i onEvent ,que puede informar a través del métodogetsource sobre el botón que ha sido pulsa-do, y deberá ser redefinido para establecer la reacción adecuada ante la pude un determinado botón. El marco en uso será el responsable de la redefinimétodoact i onper f or med.

9.9. CLASETextcomponent

La clase Text component dispone deinagran colección de métodos para faili-tar la presentación de texto en un programa IGU, pero no dispone de const públicos, por lo que no puede ser instanciada. Posee dos subclases, Text Fi el d y Text Ar ea. Text Fi el d permite mostraral usuario un area de una Única líneamientras que Text Ar ea presenta varias líneas. El texto mostrado, tanto en como en otro caso, puede sereditableo no.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 253/481

Interfaces gráficas de usuario 239

Losconstructores de Text Fi el d son:

public Text Fi el d ( )

Creauncampo de texto por defecto. public Text Fi el d (int p l )

Crea un campo de texto con p 1 caracteres de ancho, este número de caracteresnodefine laanchura del campo, pues esto depende del tipo de letray del administrador de diseño que seempleen.

public Text F i el d( j ava. 1ang. St r i ngpi)Crea un campo de textoy lo inicializa con la cadenap l

public Text Fi el d ( j ava,l ang. St r i ng pi, int p2)

Crea un campo de texto, inicializándolo con la cadena p i y estableciendo su ancho ap2caracteres.

Otros métodos interesantes en el trabajo con campos de texto son:

public synchronized j ava. l ang. St r i ng g et Tex t 0Método de lectura. Obtiene la cadena contenida enun campo de texto.

public synchronized void set Text ( j ava. l ang. Ct r i ng p i )

Método de escritura. Establece el contenido de un campo de texto.

public synchronized void s el ect ( i nt pl, int p 2 )Selecciona una serie de caracteres comenzando enpi y terminando enp2.

public synchronized void s el ec t Al 1( )

Método para seleccionartodos los caracteres pertenecientes a Text component .

public synchronized j ava. l ang. St r i ng get Sel ec t edTex t 0Obtiene el texto previamente seleccionado. La selección previa pudo realizarse por la orden

sel ect o directamente por el usuario. public synchronized void s et Edi t abl e(boolean p l )

Controla la editabilidad del campo.

public void set EchoChar(char p l )Sirve para introducir contraseñas, pues inhabilita el eco deloscaracteres, exhibiendo en sulugar el carácter especificado como parámetro.

En los cuadros de texto será necesario tratar el evento que se produce al pulsarla teclaRETURN. Este tratamiento consistirá en enlazar el campo de texto a la inter -fazAct i onLi st ener , y redefinir su métodoact i onper f or med, que tieneun parámetro capaz de informar sobre el campo de texto en el que ha sido pulsadala teclaRETURN(INTR O).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 254/481

240 Java 2. Manual de programación

Ejemplo

Solicita el nombrey la edad del usuario mediante cuadros de texto. La edad se -

cita con un cuadro eco)), de forma que no se vea lo que se está tecleandla pulsación deR ETUR N en el cuadro edad, el programa transforma la cadena leen un número, muestra dicha edad,y se disculpa por su falta de confidencialidamediante la adición al mensaje de la palabra J oven" . El ejemplo pretende resal-tar quelos cuadros de texto no permiten la lectura directa de números. Ur epai nt y responde a eventos.

Intoduzcasu nombre

lntoduzca la edad en añosy pulse a continuación

Figura9.10. Cuadros de texto.

lntoduzca la edad en añosy pulse a continuación

Joven de86años

Figura 9.11. Salida mostrada porel programa

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 255/481

lnterfaces gráficas de usuario 241

i mpor t j ava. awt . * ;i mpor t j ava. awt . event . * ;

publ i c cl ass CText o ext ends Fr ame i mpl ement s Act i onLi st ener

t i nt edad = 0; Text Fi el d t e x t o 2 ;

publ i c CText o ( )t

addW ndowLi s t ener ( new Ci e r r e30) ;Label et i quet a1 = new Label ( "I nt r oduzca su nombr e ") ;

add( et i quet a1) ;

Text Fi el d tex to1 = new Text Fi el d ( " " , 35) ;

add( tex to1);

Label et i quet a2 = new Label ("I nt r oduzca l a edad en años " +

add ( et i quet a2);texto2 = new Text Fi el d( " " ,2) ;

t ext oZ. s et Ec hoChar ( ' * ' ) ;add ( t e x t o 2 );t ext oZ. addAc t i onL i s t ener ( t hi s ) ;

"y pul se <RETURN> a cont i nuaci ón") ;

1

publ i c voi d pai nt ( Gr aphi cs g)i

tryi

edad = I nt eger . par s eI nt (texto2 getText ) ) ;

g. dr awCt r i ng( " J oven de "+edad+ " años " , 24, 150) ;

1cat ch ( Except i on ex)t }

1

publ i c voi d act i onper f or med ( Act i onEvent e)ii f ( e . e tsource ( ) ==t ext o2)

r epai nt ( ) ;

i

publ i c st at i c voi d mai n( St r i ng a rg s [ ] )

ICText o vt = new CText o ( ) ;

vt . set Layout ( new Fl owLayout 0 ;

vt . s et Ti t l e( "El AWT" ) ;vt . s et Si z e( 400, 250 1 ;vt . s et Vi s i bl e( t r ue) ;

Ii

La clase Text Ar ea efectúa la presentación de areas de texto en pantalla.Susconstructoresy algunos otros métodos destacablesson:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 256/481

242 Java 2 . Manual de programación

public Text Ar eaCrea un área de texto por defecto.

public Text Ar ea pl,

Crea un área de texto con p i filasy columnas. public

Crea un área de textoy la inicializa con la cadena p i .

public Text Ar ea ( l ava. l ang. St r i ng int intCrea un área de textoy la inicializa con la cadena p estableciendo como número de filas

y como número de columnas

public synchronizedMétodo de lectura. Obtiene el texto.

public synchronized void pi)Método de escritura. Establece el contenido del área.

public synchronized void pi)Añade cadenas a un área de texto.

public synchronized void (booleanControla la editabilidad del campo.

public synchronizedObtiene el texto seleccionado. Pertenece a j ava .awt .

Siel texto a mostrar no cabe en el número de filaso columnas visibles aparecenautomáticamente barras de desplazamiento en la dirección adecuada para pueda acceder cómoday rápidamente a toda la información.

Figura 9.12. Text Ar ea, el textoa mostrarno cabe en el númerode filas ni de columnas visibles.

Para capturarsus eventos, objeto Text Ar ea se enlaza a la interfazy se sobrescibe el método

9.10. CLASECanvas

La claseCanvas hereda deComponent , encapsulando una ventana vacíao lien-zo,sobre el que se puede dibujary que es capaz de recibir información por par

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 257/481

lnterfaces gráficas de usuario 243

del usuario en forma de eventos producidos por el ratóno el teclado.Loslienzosno generan eventos,sólolos reconocen. El constructor deCanvas no tiene pará-metros

publ i c Canvas ( )

Loslienzos no tienen un tamaño por omisióny es necesario adjudicárselo; si nose le adjudica, éste dependerá del administrador de diseño que se esté utilizandoy podría llegar a ser demasiado pequeñoo incluso invisible. El método empleado conesta finalidad pertenece a la claseComponent y es

publ i c voi d s et Si z e( i nt pl , i nt p 2 )

i mpor t j ava. awt . * ;i mpor t j ava. awt . event . * ;

publ i c cl ass VLi enzo ext ends Fr amei

publ i c VLi enzo( )

i

addW ndowLi st ener( new Ci er r e3 ( ) ) ;Canvas 1 = new Canvas ( 1 ;

1. set si ze ( 300, 150)

l . s et Bac kgr ound( Col or . y el 1ow) ;add( 1) ;

/ / se est abl ece un col or de f ondo par a hacer r esal t ar el l i enzo

1

publ i c st at i c voi d mai n ( St r i ng ar gs [ ] )

VLi enzovent ana = new VLi enzo( ) ;

vent ana. set Layout ( new Fl owLayout O1 ;vent ana. s et Ti t l e( "El AWT" ) ;

vent ana. s et Si z e( 400, 250 ) ;vent ana. s et Vi s i bl e( t r ue) ;

Se puede observar tras la ejecución del ejemplo que en el lienzo creado no apa-rece ningún dibujo, sóloun fondo amarillo.LosCanvas heredan deComponentel métodopai nt , pero como ya se comentó anteriormente, para que este métodohaga algo es preciso redefinirloy para ello es necesario crear una subclase deCanvas. Un ejemplo más completo sobreCanvas aparece en el apartado dedica-do a los administradores de diseño.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 258/481

244 Java 2. Manual de programación

9.1 CLASEChoice

Este tipo de componentes permite seleccionar una Única opción de entre una l-

plegable de ellas (Fig.9.13).Cuando se agregan a un contenedor, sólo muestran udeterminada opcióny una flecha que será la que permita escoger las restantes op-nes al efectuar clic sobre ella. El ancho que ocupan se establece automáticacomo el suficiente para mostrar las opciones incluidas en la lista. El construtiene parámetrosy crea una lista vacía:

public Choi ce

Las opciones son cadenas de caracteresy aparecen en el orden en que se añade

mediante el método public synchronized void pi)

Acada una de estas opciones le corresponderá un índice, de forma que el elemento añadido tiene índiceO, el siguiente1 y así sucesivamente. Los índices se pueden obtener con el método

public

y estos números se utilizan frecuentemente como subíndices de vectores qu-,tienen información relativa a cada una de las opciones.

Figura 9.13. La clase Choi ce antes y después de desplegar sus opciones.

Otros métodos destacables son:

public synchronizedDevuelve una cadena con el nombre del elemento seleccionado.

public synchronized void sel ect (int pi )

Permite especificar la elección por defecto.

El evento de selección de una opción se tratará de la forma siguiente: se el objetoChoi ce a la interfazI t emLi st ener y se redefine su método

que tiene un parametro de tipoI t emEvent .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 259/481

lnterfaces gráficas de usuario 245

Ejemplo

Construir un menú de opciones con el componenteChoice , a continuación elusuario selecciona una opcióny se presenta en la pantalla la opción seleccionada.

i

Elemento seleccionadoDos

Figura 9.14. Presentación de la opción seleccionada.

import j ava. awt . * ;import j ava. awt . event . * ;

publ ic c lass Ej Choi ce ext ends Fr ame implements I t emLi st ener{

private Choi ce sel ecci ón;St r i ng el ement o = ;

public E Choi ce ( )IaddW ndowLi s t ener ( new Ci e r r e30) ;sel ecci ón = new Choi ce ( ) ;

sel ecci ón. addI t em( "Uno" ) ;

sel ecci ón. addI t em( " DO S " ) ;/ * La Úl t i ma opci ón se denomi na Ter cer o en vez de Tres,par a que se vea con mayor f aci l i dad l a anchur a queadqui er en l os obj et os Choi ce aut omát i cament e * /

sel ecci ón. addI t em( "Tercero" ) ;

/ / Opci ón pr esel ecci onadasel ecci ón. sel ect (1 );sel ecci ón. add1t emLi st ener( t h i s ) ;add ( sel ecci ón) ;

}

publ ic s t a t i c void mai n ( St r i ng ar gs [ ] )t

Ej Choi ce vent ana = new Ej Choi ce0 ;

vent ana. set Layout ( new Fl owLayout O) ;vent ana. s et Ti t l e( " El AWT" ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 260/481

246 Java 2. Manual de programación

vent ana. set Si ze( 400, 250 ) ;vent ana. s et Vi c i bl e( t r ue) ;

1

public void pai nt ( Gr aphi cs g)I

el ement o = s e l e c c i ó n . g e t S e l e c t e d I t e r n ( ) ;g. dr awSt r i ng( " El ement o sel ecci onado + el ement o, 20, 230) ;

public void i t er nSt at eChanged( 1t emEvent e)i

1r epai nt ( ) ;

9.12. CLASECheckbox

Las casillas de verificación son componentesIGUcon dos estados posibles: activa-do (true) y desactivado(f al se). Están formadas por un pequeño cuadro qu puede presentaro no una marca de verificación y una etiqueta descriptora dopción (Fig.9.15).

r CasillaVerificación

Figura 9.1 5. Casilla de verificación desactivada.

Las casillas de verificación pueden utilizarse individualmentey también puedenagruparse en unCheckboxGr oup. Los CheckboxGr oup agrupan de1 a ncasillas de verificación de forma que no podrá haber varias activadas al tiempo. El constructor de un grupoCheckboxGr oup crea un grupo vacío y laforma de conseguir que las distintas casillas de verificación se añadan al gru

especificar el nombre del grupo cuando se creen las casillas de verificaciclaseCheckboxGr oup hereda deObj ect y no es unComponent , porlo quelos objetosCheckboxGr oupno pueden agregarse a un contenedor, lo que se haes añadir individualmente cada una de las casillas que constituyen el grupo.de los métodos para manejar este tipo de objetos citaremos.

Constructor deun conjunto deun CheckboxGr oup. public CheckboxGr oup( )

public Checkbox( j ava. l ang. St r i ngp l , j ava. awt . CheckboxGr oupp2,

boolean p 3 )Construyeun Checkboxcuya etiqueta será la cadena especificada como pnmer parámetrosuestado (activadoo desactivado) el tercer parámetro yloagrega alCheckboxGr oupespecifica-do como segundo parámetro, que debe haber sido previamente creado.El formato de las casi-llas de verificación cambia y se convierten en circulares.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 261/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 262/481

248 Java 2. Manual de programación

i mpor t j ava. awt . * ;i mpor t j ava. awt . event . * ;

publ i c cl ass Ej CheckboxGr oup ext ends Fr ame i mpl ement s I t emLi st ener

i pr i vat e Checkbox opl , op2, Op3, Op4;pr i vat e CheckboxGr oup menu;

publ i c Ej CheckboxGr oup( )i

addW ndowLi s t ener ( new Ci e r r e30) ;menu = new CheckboxGr oup ( ) ;

opl = new Checkbox ( "Pr i mer a opci ón" , menu, f al se) ;

op2 = new Checkbox ( "Segunda opci ón " , menu, f al se) ;

op3 = new Checkbox ( " Ter cer a opci ón " , menu, f al se) ;

op4 = new Checkbox ( "Cuar t a opci ón" , menu, f al se) ;add( op1) ;add (op2);add ( Op3);add( op4) ;opl . addI t emL i s t ener ( t hi s ) ;op2. addI t emLi s t ener ( t hi s ) ;op3. addI t emLi s t ener ( t hi s ) ;op4. addI t emLi s t ener ( t hi s ) ;

I

publ i c s t at i c voi d mai n( St r i ng a rg s [ ] )I

Ej CheckboxGr oup vent ana = new Ej CheckboxGr oup( ) ;

vent ana. set Layout ( new Gr i dLayout ( 3 , 2 ) ;

vent ana. s et Ti t l e( "El AWT" ) ;

vent ana. set Si ze( 400, 250 ) ;v e n t a n a . s e t R e s i z a b l e ( f a 1 s e ) ;ventana.setVisible(true);

/ * Redef i ni r el mét odo get I ns et s de l a cl ase Cont ai ner es unaf orma de consegui r que l os component es que si t uemos en uncont enedor queden l i gerament e separados del borde del mi smo.Los val or es que especi f i quemos en get i nset s l os ut i l i zar ánl os admi ni st r ador es de di seño a l a hora de col ocar compo -nent es en el cont enedor * /

publ i c i nset s get I ns et s ( )i

1return new I ns et s ( 20, 20, 20, 20) ;

publ i c voi d pai nt ( Gr aphi cs g )

Ii f ( menu. et Sel ect edCheckbox( ) != nul l )

g. dr awst r i ng ( "El ement o sel ecci onado ' I +

menu. get Sel ect edCheckbox( ) . get Label ( ) , 20, 230);

\

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 263/481

Interfaces gráficas de usuario 249

publ i c voi d i t emSt at eChanged( 1t emEvent e)I

1

r epai nt ( ) ;

1

Compilación

C: \ l i br o\ Tema09>j avac Ej CheckboxGr oup. j ava

Ejecución

C: \ l i br o\ Tema09>j avaEj CheckboxGr oup

9.13. LISTAS

La claseL i s t proporciona listas donde se pueden realizar selecciones múltiples. Sitodos los elementos de una lista no caben en el número de filas visibles, apareceautomáticamente una barra de desplazamiento para que se pueda acceder alos res-tantes elementos de la lista; sucede, de modo análogo, si el número de caracterede alguna de las opciones supera el número de columnas visibles.

Enero1Febrero

Agosto

OctubreINoviembre

Figura 9.17. Lista cuyos elementosno caben en el número de filas visiblesy con varias opciones seleccionadas: Marzo,Abril,Julio.

Los constructores de una lista son:publ i c Li st ( )

Crea una lista que no permite selecciones múltiples.publ i c L i s t ( i n t p i )Crea una lista con tantas filas visibles como especifique el parámetropl y que no admiteselecciones múltiples.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 264/481

250 Java 2. Manual de programación

public Li st ( int pl, boolean p2 )Crea una lista con tantas filas visibles como indique el parámetro p i y que admitiráo noselecciones múltiples según seat rue o f al seel valor que le pasemos como parámetrop2.

Para añadir nuevas opciones a una lista se emplea: public void add( j ava. l ang. St r i ngp l )

Otros métodos útiles son:

public synchronized j ava. l ang. St r i ng get Sel ec t edI t em( )Devuelve una cadena con el nombre del elemento seleccionado, si no se seleccionelernentoo se seleccionamásdeunodevuelvenu11 .

public synchronized int ge t Se l ec t edI ndex0Devuelve el índice del elemento seleccionado.AI primer elemento de la lista le correspondun cero, al siguiente un unoy así sucesivamente. Si haymásde un elemento seleccionadooaún no se ha seleccionado ninguno, devuelve- 1.

public synchronized void sel ect ( int p lPermite especificar la elección por defecto.

public synchronized j ava. l ang. St r i ng[ ] get Sel ec t edI t ems 0Se emplea para tratar selecciones múltiples, devolviendo un vector de cadenas qulosnombres deloselementos seleccionados.

public synchronized i n t [ ] ge t Se l ec t edI ndexes0Se utiliza para tratar selecciones múltiples, devolviendoun vector de enteros conlosíndicesde loselementos seleccionados.

En una lista se han de considerar dos tipos de eventos; si se efectúa docon el ratón sobre un elemento de la lista se produce unAct i onEvent ; si se efec-túa un único clic sobreloselementos de la lista, se produce unI t emEvent . Para

tratar el sucesoAct i onEvent se necesita enlazar el ,objetoLi st a la interfazAct i onLi st ener y sobreescribiract i onper f or med, y para tratar el sucesoI t emEvent es necesarioenlazarloa I t emL i c t ener y sobreescribiri t emSt at eChanged.

Ejemplo

Este programa permite efectuar selecciones múltiples en una lista con las-

tes características:Efectuando clic con el botón izquierdo del ratón sobre elementos no s-

Si efectúa clic sobre un elemento seleccionado,lo elimina de la selección.nados, los selecciona.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 265/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 266/481

252 Java 2. Manual de programación

public void pai nt ( Gr aphi cs g)I

St r i ng ar r I = 1i s t a. get Sel ec tedI t er ns ) ;

int al t o = g. get Font Met r i cs( ) . get Hei ght ) ;

if ( ar r . l engt h ! = O){ g. dr awSt r i ng( "Sel ecci ón: ' I , 20, 250- al t o*8);

for (int i = O; i < ar r . l engt h; i ++)g. dr awSt r i ng( ar r [ i ] , 20, 250- al t o*( 7- i )) ;

11

public void act i onPer f or med( Act i onEvente){

if ( e . ge t Sour ce0 == l i s t a )r epai nt ( ) ;

1

public void i t e r n S t a t e C h a n g e d ( 1 t e r n E v e n t e)t 1

9.14. CLASEScrollbar

Las barras de desplazamiento son componentes que recorren valores enterosy pue-den estar orientadas horizontalo verticalmente (Fig.9.19).

Figura 9.19. Barra de desplazamiento.

Constructores

public Scrol l bar ( )

Crea una barra de desplazamiento vertical. public Scrol l bar (int p i )

Crea una barradedesplazamiento en la dirección indicada por el parámetrop1:Scr ol l bar . HORI ZONTALoScr ol l bar . VERT1CAL.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 267/481

Interfaces gráficas de usuario 253

public Scrol l bar ( in t pl , int p2, int p 3 , int p 4 , int p5)Crea una barra de desplazamiento en la dirección que se le indique mediante el parámetro

p l , con el valor inicial especificado enp2 (el cuadro de desplazamiento aparecerá inicial-mente en esta posición), cuyo tamaño para el cuadro de desplazamiento es el tercer paráme-

tro y conlosvalores mínimo y máximo que contenganlos parámetrosp 4 y p5. Si el valorinicial es menor que el mínimoomayor que el máximo, el valor inicial se hará igual al míni-moo máximo respectivamente.

Otros métodos necesarios para trabajar con barras de desplazamiento son: public synchronized void set val ues (int pl, int p2, int p 3 , int p 4 )

Establecelos parámetros para una barra de desplazamiento.

public int get Maxi mum( )Devuelve el valor máximo.

public int get Mi ni mum( )Devuelve el valor mínimo.

public int get val ue ( )Obtiene el valor actual de la barra.

public synchronized void set val ue (int pl)

Establece el valor actual.

Ejemplo

Crea una barra de desplazamiento horizontal (Fig.9.20).import j ava. awt . * ;import j ava. awt . event . * ;

class Ej Bar r a extends Fr ame{

public Ej Bar r a( ) '

( Scrol l bar bar r a = new Scr ol l bar í Sc r ol l bar . HORI ZONTAL,100, o ,o, 200) ;

Fr ame v = new Fr ame( "El AWT" ) ;v. add ( "North" , bar r a ) ;

v. s et Si z e( 200, 200 ) ;v. s et Vi s i bl e( true ) ;v. addW ndowLi s t ener (new Ci er r e3 (

1

public static void mai n( St r i ng ar gs(

}new E] Barra ( ) ;

1 '

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 268/481

254 Java 2. Manual de programación

La salida del programa anterior es la mostrada en la Figura9.20.

I

Figura 9.20. Resultado de la ejecución del ejemplo.

Cada vez que se mueve el cuadro de desplazamiento se genera un eventipo Adj us ment E vent , que debe ser recogido por el receptorAdj us t ment L i s t ener , por lo que se enlazará el objeto a la interfaz corre- pondiente y se sobreescibirá el métodoad ust r nent val uechanged.

9.15. MENÚS

Menucomponent es la superclase de todos los elementos relacionados con menús, siendo subclases suyas tantoMenuIt em comoMenuBar . MenuIterncontiene los métodos para crear los elementos de un menú. La claseMenuBar con-tiene el constructor de barras de menú. Las barras de menú actúan como co-dores de menús. La claseMenu es una subclase deMenuI t emy proporciona

métodos para la administracción de los menús. Los menús contienen elemenmenú y se agregan a barras de menú.Cuando se selecciona un elemento de un menú se genera un evento de

Act i onEvent , que se tratará de forma análoga a como se ha explicado en oocasiones.

Los elementos se añaden al menú mediante el métodoadd y los menús a la barra de menús de la misma forma, pero la adición del menú a un marco se efec

public synchronized void set MenuBar ( j ava. awt . MenuBar pl )

Constructores

public MenuBar ( )Construyela barra de menús.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 269/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 270/481

Java 2. Manual de programación

public static void main St r i ng args [

new ;

9.16. ADMINISTRADORES DE

Java tiene cinco administradores de diseño que controlan la ubicación dcomponentes añadidos a un contenedor y, cuando el usuario redimensiocontenedor, estos administradores intentan reajustar dichos component

nueva área. Los más importantes son:Fl owLayout , Bor der Layout yGr i dLayout .Para incorporar un administrador de diseño se utiliza la siguisentencia:

setLayout (new ;

y cuando se desee no usar un administrador se pasanull al métodoen este caso habrá que colocar y dimensionar los componentes de forma m para lo que se puede utilizar el método

public void p l , int int

en el que los parámetros y representan la posición, en pixels, del extsuperior izquierdo del componente con respecto a su contenedor, mientras p 3 y pson la anchura y altura del objeto respectivamente.

Cuando se quiere dejar un pequeño borde entre un contenedor y los comp-tes que situamos en él se puede recurrir a redefinir el métodoget nse t s de laclaseCont ai ner , especificando enél la cantidad de espacio que se desea reser -

var para dicho borde. Estos valores serán tenidos en cuenta por el administradiseño correspondiente cuando vaya a colocar los componentes en el conteUn ejemplo deget i nset s aparece en el apartado que comenta la claseCheckbox.

Las características de los administradores de diseño fundamentales se detcontinuación.

9.16.1. FlowLayout

Utiliza la interfazLayout Manager y es el administrador de diseño que usan poromisión los paneles y lasapplets.Cuando se utilizaFl owLayout los componentesse colocan en el contenedor de izquierda a derecha en el orden en el que van agregadosy, cuando no caben más en una fila, continúan colocándose en la sigui

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 271/481

lnterfaces gráficas de usuario 257

Losconstructores son:

p u b l i c Fl owLayout

public Fl owLayout pi)

Construye unFl owLayout por defecto, que centralos

componentes, dejando5

pixelesde espacio entre cada uno deellos.

Construye unFl owLayout ymediante el parámetro permiteespecificar el alineamiento. Sonvalores válidos para dichorámetro.

p u b l i c Fl owLayout pl, i n t ConstruyeunFl owLayout deforma que se pueden especifi-car tanto el alineamiento comoel espacio horizontaly verticala dejar entre los componentes.

El diseño se establece mediantes e t l a y o u t . Por ejemplo:

set Layout (new Fl owLayoutLa adición de componentes se efectúa empleando el métodoadd.

9.1 6.2. BorderLayout

Es el administrador de diseños por defecto para los cuadros de diálogoy los mar -cos y se caracteriza por acomodar a los componentes en cinco areas: No r t h ,S o ut h , E a s t , West y C e n t e r , especificadas en el orden en el que dichas áreas

son dimensionadas.

South

Figura 9.22. BorderLayou t : áreas.

Es posible usar, por tanto, de uno a cinco componentes conB o r d e r L a y o u t ,uno para cada posición,y, excepto en el caso deC e n t e r , cuando alguna posiciónno es usada la zona correspondiente será ocupada por los otros componentes.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 272/481

258 Java 2. Manual de programación

Si no se usaNor t h nisout h, quedaría así. Si no se usaNor t h, ni sout h, ni East .

Figura 9.23. Bor der Layout cuando nose usan algunas posiciones.

Sus constructoresson: public Bor der Layout ( ) Construye unBor der Layout .

public Border Layout (int pl, int p2) Construye unBorder Layoutseparando cada área horizontaly verticalmente el número depi-xelesindicados como argumento.

Estableciéndose el diseño de la siguiente forma:set Layout (new Border Layout ( ) 1

setLayout (new Bor der Layout ( p i , p 2 ) )

para situar un componente en una determinada posición se incluye la posico

área en el métodoadd : public j ava . awt . Component add( j ava . l ang. St r i ng pl,

j ava. awt . Component p 2 )

el primer parámetro es la posición, cuyo nombre( Nor t h, Sout h, East ,West o Cent er debe comenzar siempre por mayúscula y, puesto que el área de especificarse,los componentes podrán agregarse en cualquier orden.

9.1 6.3. GridLayout

Divide el contenedor en una cuadrícula que permite colocarloscomponentes en filasy columnas, concediendo el mismo tamaño a todos ellos. Dichos componentagregan a la cuadrícula ocupando la primera fila de izquierda a derecha y pasacontinuación a ocupar, en el mismo sentido, la fila siguiente y así sucesivamen

Losconstructores deGr i dLayout son: public Gr i dLayout ( i ntpi, int p2)

Construyeun Gr i dLayout con el número de filas especificado como primer parámetroyel número de columnas especificado como segundo parámetro.

public Gr i dLayout ( int pl, int p2, int p3, int p4)Construye unGr i dLayout con el número de filas especificado como primer parámetro el número de columnas especificado como segundo parámetro y cada componente sehorizontalmente por p 3 pixelesy verticalmente porp4.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 273/481

Interfaces gráficas de usuario 259

El diseño se establece mediante:se tLayout (new Gr i dLayout ( p l , p2) )set Layout (new Gr i dLayout ( p l , p2, p3, p4) )

y la adición de componentes se realiza conadd:

public j ava. awt . Cor nponent add( j ava. awt . Cor nponentp l

Nota: Redeñnircl =¿todo getinsets de la claseContainer sirveparaes quese cdoquen ea uncontenedor queden lige-íi8l misrrns.

€jemplo

En este ejemplo se muestra el comportamiento de los administradores de diseñoy dis-tintos componentes delAWT.Pero no incluye la gestión de eventos, excepto la deleven-to de cierre que se produce cuando se hace clic en el icono de salida de la ventana.

Figura 9.24. Ejemplo sobre el comportamiento de los administradores de diseño.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 274/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 275/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 276/481

262 Java 2. Manual de programación

j ava . awt .

9.17. swing

Component

El paqueteswi ng extiende elawt , añade nuevos componentes e incorpora dadministradores de diseño más. La superclase delos componentesswi ng es laclase que deriva de la clase estándarCont ai ner y, por tanto, des-ciende también de la claseComponent delawt , de esta jerarquía se deduce qutodos los componentesswi ng son contenedores (Fig.9.25).Entre las novedadesaportadas por j avax .swi ng destacan las ventanas con pestañas, el hecho poder añadir bordes así como asociar un texto de ayuda a cualquier comAdemás, los componentesswi ng se ejecutan uniformemente en cualquier pla-forma. Hay que tener en cuenta que, en muchas ocasiones, los nombres de -

ponentes en ambos paquetes casi coinciden, diferenciándose únicamente ede swi nganteponen una y la forma de trabajo también, facilitándose así de awt a swi ng.

Figura 9.25. Jerarquía de clases: la clase J Component .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 277/481

10

Gestióndeeventos

CONTENIDO10.1. Tipos de eventos.

Loscomponentes delAWTcomo fuentede eventos.10.3. Receptores de eventos.10.4. Procesamiento de eventos.10.5. Clases adaptadoras.10.6. Clases receptoras anónimas.10.7. Problemas comunes en el tratamiento de eventos.

263

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 278/481

264 Java 2. Manual de programación

Los usuarios pueden comunicarse conlos programas a través delosobjetos visuales que ofrecen lasInterfaces Gráficas de Usuario(IGU).Cuando se tratadel paqueteawt la comunicación se pro-

duce de la siguiente forma,losdistintos componentes delAW T soncapaces de detectar eventos de una determinada clasey notificaresta acción a un objeto receptor. Si el receptor recibe el aviso dque ha ocurrido determinado suceso, llama a un método,redefini-do por el programador, que ejecuta las acciones deseadas. Porotra parte,Swi ngproporciona nuevos tipos de eventos pero el pro-cesamiento delosmismos es análogo al comentado anteriormen-te. En este capítulo se comentanlos diferentes tipos de eventosdelAWT, así comolosproblemas que se presentan en el procesa-miento delos mismos.

10.1. TIPOS DE EVENTOS

La programaciónGUIes una programación dirigida por eventos que implicanecesidad de procesar los mismosy, por tanto, la utilización de las clases propor-cionadas por el paquete j ava .awt .event que definen los tipos de eventos delAWT.

Jerarquía de clases

Figura 10.1. Clases proporcionadas porel paquete j ava .awt . event

La jerarquía de clases conduce a una división de los eventos en dos categorí-damentales, de bajo nivel, subclase deComponent Event ,y semánticos, colegas de

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 279/481

Gestión de eventos 265

Component Event . No obstante, la programación de los eventos de ambas cate-gorías es similary su principal diferencia reside en la naturaleza del objeto eventoyla información que es capaz de proporcionar.

Loseventos de bajo nivel ofrecen acceso al componente que ha generado eleventoy, con él, acceso alos métodos de la claseComponent mediante elmétodo:

public j ava. awt . Component get Component 0

Loseventos semánticos proporcionan diferentes métodos para obtener una refe-rencia al objeto que ha generado el evento. Por ejemplo, enAct i onEvent se puede obtener la etiqueta identificativa del objeto fuente mediante

public j ava. l ang. Ct r i ngget Act i onCommand0

mientras que enI t emEvent debiera utilizarse

public j av a. awt . I t emCel ec t abl e get I t emSe l ec t abl e0

Nota: Si no se desea recordar métodos específicoses posible recurrir almétodo

public j ava . lang .0b jec t ge t sou rce0

pertenecientea la clase j ava. ut i 1 . Event obj ect , situada muy arribaen la jerarquía; comoconsecuencia,este método puede ser utilizado con todotipode eventos,

10.2. LOS COMPONENTES DELAWTCOMO FUENTEDE EVENTOS

Losdistintos componentes delAWTson capaces de actuar como fuente de even-tos, es decir, como objetos capaces de detectar eventos de una determinadaclasey, para conocer los eventos que pueden ser detectados por cada uno deellos, hay que tener en cuenta tantola siguiente tabla como la jerarquía de cla-ses delAWT.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 280/481

266 Java 2. Manual de programación

Tabla 10.1. Fuentes de eventos

Fuente Clase de evento

B u t t o nL l S tY er.u I t e nT e x t F i e l d

A c t i o n E v e n tA c t i o n E v e n tA c t i o n E v e n tA c t i o n E v e n t

S c r o l l B a r A d j us t rn e n t E v e n t

Cornpor.e n t C o r n p o n e n t E v e n t

C o n z a i n e r C o n t a i n e r E v e n t

C o n p o n e n t F o c u c E v e n t

Che c kboxC h e c k b o x M e n ~ d I ternChoi ceL ; c t

I t e r n E v e n tI t e rnEven tI t e r n E v e n tI t e r n E v e n t

Cor rponenr K ey 0 ver, t

C u n p o n e n t Mouse E ve n t

Te x t A r e aT e x t F i e l d

Te x t E v e n tTe x t E v e n t

D; al og WindowEventFrame WindowEvent

10.3. RECEPTORES DE EVENTOSLas clases de nivel más bajo dentro delos distintos subárboles a considerar ela jerarquía de eventos tienen una interfaz((oyente))asociada, exceptoMouseEven tque tiene dos, con un único métodoo bien un conjunto de métodos declarados en e para tratar los eventos de las mismasy los receptores de eventos son clases que imp-mentan interfaces oyentes específicas.

Clase de evento InterfazI A r t i o n E v e n t I A c t 1 o n L i s t e n e r

~c t i o n L i s t e n e r , métodos: publ ic abstract void ac t i onPer f or med( j ava. awt . event . Ac t i onEventpl)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 281/481

Gestión de eventos 267

I emEvent

Clase de evento Interfaz

I t emLi st ener 1

Adj ust ment Event Ad] ust ment l i s t ener

A d j usmen t Li st ener , métodos: p u b l ic a b s t r a c t void

ad j us t ment ~a : ueChanged( ~ava . awt . even t . Adj us t me~~t Eventpl )

Clase de evento InterfazComponent Event Component Li st ener

Component Li st ener , métodos:

p u b l i c a b s t r a c t void

c o m p o n e n t H i d d e n ( ~ a v a . a w t . e v e n t . C o m p o n e n t E v e n t pl ) p u b l ic a b s t r a c t voidcomponent Moved( j ava. awt . event . Component Eventpl

p u b l i c a b s t r a c t voidc o m p o n e n t R e s i z e d ( ] a v a . a w t . e v e n t . C o m p o n e n t E Ve n t p i )

p u b l i c a b s t r a c t voidcomponent Shown( ] ava. awt . event . Component Event pZ)

Clase de evento Interfaz

Cont ai nerEvent Cont ai ner L i s t ener

Cont ai ner L i s t ener , rne'todos: p u b l ic a b s t r a c t voidcor nponent Added( j ava. awt . event . Cont ai ner Event pl )

p u b l ic a b s t r a c t voidcomponent Removed( j ava. awt . event . Cont ai ner Evencp l )

Clase de evento Interfaz1 FocusEvent FocusLi s t ener I

Focus i s t ener , p u b l i c a b s t r a c t void f o c us Ga i ne d( j a va . a wt . e ve nt . F oc ds E ve ~tpi )

p u b l i c a b s t r a c t void f o c u s L o s t ( ~ a v a . a w t . e v e n t . F o c ; s E v e n t pl )

métodos:

I t emLis t ener , métodos: pub lic a b s t r a c t void i t emCt at eChanged( j ava. awt . event . 1t emEventpl )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 282/481

268 Java 2. Manual de programación

MoxseEvenci

Clase de evento Interfaz

MouceLi c t enerMouceMot i onLi c t ener

KeyEvenr . KeyLi st ener I

Text Event

Key Lis t e n e r , métoclos: p u b l i c a b s t r a c t vo id k ey Pr es s e d( j a va . a wt . e vent . Key Ev entp l )

pu b l i c abstract void keyRel eased( ; ava . awt . event . KeyEventp l )

pu b l i c abstract void keyTyped( j ava . awt . event . KeyEventpl

Text L i s t ener

~

Mo ceLi t e n e r , métodos: publ i c a b s t r a c t vo id

publ i c a b s t r a c t vo id

publ i c abstract void

publ i c a b s t r a c t vo id

p ub l i c abstract void

Mo L s eMo t i oI: Li s t en e r , p ub l i c abstract void

p ub l i c abstract void

Clase de evento

mouseCl i cked( j ava . awt . event . MouseEventp l )mouseEnt er ed( j ava. awt . event . MouseEventp l )mouseExi t ed( j ava . awt . event . MouseEventp l )mousePr essed( ~ava. awt . event . MouseEventp l )mouseRel eased( j ava. awt . event . MouseEventpl )

métodos:mOuSeDr agged( 1ava. awt . event Mous eEventp i )mouceMoved( j ava. awt . event . MouseEventpl

Interfaz

Text Li s t e n e r ,

publ ic abstract void t ext Val ueChanged( j ava. awt . event . Text Eventp l )

WlétOdOS:

Clase de evento InterfazW ndowEve n I Wi ndowLi st ener

Win c io w Lis t e n e r , métodos: public abs t r ac t vo id wi ndowAct i vat ed( j ava . awt . event . W ndowEventpl) publ ic ab s t r ac t voi d wi ndowCl osed( j ava . awt . event . W ndowEventp l ) publ ic a b s t r a c t voi d wi ndowCl os i ng( j ava . awt . event . W ndowEventpl )

pub lic abs t rac t void wi ndcwDeact i vat ed( j ava. awt . event . W ndowEventp l

pub lic abs t rac t void wi ndowDei coni f i ed( ~ava. awt . event . W ndowEventpl) publ ic a b s t r a c t void wi ndowI coni f i ed( j ava. awt . event . W ndowEventpl) p u b l i c a b s t r a c t void wi ndowCpened( j ava. awt . event . W ndowEventp l )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 283/481

Gestión de eventos 269

10.4. PROCESAMIENTO DE EVENTOS

Para el procesamiento de eventos, hace falta que unobjeto fuentecapaz de detectareventos de una determinada clase, notifique aun objeto receptorque se ha produ-cido un evento de la clase que dicho receptor es capaz de interpretary, para ello,dicho receptor debe implementar una interfaz «oyente», asociada a un determinadotipo de suceso, sobreescribiendo cada uno desusmétodos,y registrarse con la fuen-te. Cuando el receptor recibe el aviso de que ha ocurrido un suceso llama al méto-do correspondiente al evento particular generado, sobreescrito por el programador,que ejecuta las acciones deseadas.

Ejemplo

Presentar las coordenadas de la posición donde se pulse el ratón dentro del área deun marco.El programa termina cuando se cierra la ventana.

Pnsicidndelr a td n :6 0 , 4

Figura 10.2. Mouss eEvent .-import j ava. awt . * ;import j ava. awt . event . * ;

public class Mar co extends Fr ame{ int x = O, y = O;

public static void mai n( St r i ng a rg s [ ] )

tMar co f uent e = new Mar cof uent e. s et Ti t l e( "Mar co") ;

f uent e. s et Ci z e( 250, l OO) ;f uent e. s et Vi s i bl e( t r ue) ;

/ / s e i nst anci an y r egi s t .

1 ;

i n l os r ecept or esf uent e. addW ndowLi s t ener ( new Recept o r Ci e r r eO) ;f uent e . addMouseLi st ener ( newRecept or Rat on( f uent e) ) ;

public void pai nt ( Gr aphi cs g)t

g. dr awSt r i ng( "Posi ci ón del r at ón: ixt , " +y, 60, 40) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 284/481

270 Java 2. Manual de programación

/ * Las cl ases r ecept or as i mpl ement an oyent es y sobr eescr i ben

* / sus mét odosclass Recept or c i er r e implements Wi ndowLi st ener

public void wi ndowCl osi ng( W ndowEvente)i

i

1

Sys t em exi t ( O ) ;

public void wi ndowAct i vat ed( W ndowEvente)t i

public void wi ndowCl osed( W ndowEvente)0 public void wi ndowDeact i vat ed( W ndowEvente)

i 1 public void wi ndowDei coni f i ed( W ndowEvente)

i } public void wi ndowI coni f i ed( W nd0wEvente)

i 1 public void wi ndowOpened( W ndowEvente)

i }

class Recept or Rat on implements MouseLi st ener1

Marco l avent ana;

Recept or Rat on( Mar cof uent e)il avent ana = f uent e;

1

public void mousepr essed ( MouseEvent e)l avent ana. x = e. get X( ) ;

l avent ana. y = e. get Y( ) ;

l avent ana. r epai nt 0;1

public void r n o u s e R e l e a s e d ( M o u s e E v e n t e)o

public void r n o u s e E n t e r e d ( M 0 u s e E v e n t e)i 1

public void mouseExi t ed( MouseEvent e)t ) public void mouseCl i cked( MouseEvente)

i }1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 285/481

Gestión de eventos 271

Otra forma de implernentación podría habersido:

import

import

public class Mar co2 extends Fr ame implements Wi ndowLi st ener ,MouseLi st ener{ int x = O, y = O;

Mar co2

( "Mar co")( 250, 100) ;

set vi s i bl e (true) ;

/ / se r egi s t r a el r ecept or

;

public static void mai n St r i ng args )

Mar co2 f uent e = new Mar co2

public void pai nt ( Gr aphi cs

( "Posi ci ón del r at ón: ;

public void ( Wi ndowEvent e)

( O) ;

public void ( Wi ndowEvent e)

public void e)

public void e)

public void e)

public void e)

public void e)

public void e)

x =

y =

r epai nt

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 286/481

272 Java 2. Manual de programación

public void mouseRel eased( MouseEvent e)

public void mouseEnt er ed( MouseEvent e)

public void mouseExi t ed( MouseEvente) public void mouseCl i cked( Mous eEvente)

i }

{ I

i }

1

En cuanto aswi ng,hay que destacar que aunque proporciona nuevos tiposeventos el procesamiento de los mismos es análogo al estudiado.Los programasque utilicenswi ng deberán incorporar las siguientes sentencias:

import j ava. awt . * ;import j ava. awt . event . * ;import j avax. s wi ng. * ;import j avax. s wi nq. event . * ;

En versiones anteriores,swi ng ha usado otros nombres de paquetes:cor n. sun. j ava. swi ngj ava. awt . swi ng +

10.5. CLASES ADAPTADORAS

Dado que existen interfaces((oyentes))con un gran número de métodos y que unreceptor que implementa una de estas clases se ve obligado a sobreescribirellos, cuando se requiere una interfaz de este tipo se utilizan clases adaptadorimplementan las interfaces oyentes con métodos vacíos y se definen las receptoras para que extiendan las adaptadoras.

Ejemplo

Implementación de un programa que presenta las coordenadas de la posiciónse pulsa el ratón dentro del área de un marco usando clases adaptadoras.

import j ava. awt . * ;import j ava. awt . event . * ;

public class Mar co3 extends Fr amei

int x = 0 , y = O;

public static void mai n( St r i ng a r g s [ ] )

i

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 287/481

Gestión de eventos 273

Mar co3 f uent e = new Mar co3 0 ;

f uent e. s et Ti t l e( "Mar co") ;

f uent e. s et Si ze( 250, l OO);f uent e. s et Vi s i bl e( t r ue) ;

/ / s e i nst anci an y r egi st r an l os receptoresf uent e . addW ndowLi st ener ( newRec ept or Ci er r e20) ;f uent e. addMouseLi st ener ( newRecept orRat on2( f uent e) ) ;

1 public void pai nt ( Gr aphi cs g)

ig. dr awSt r i ng( "Posi ci ón del r at ón: txt , " +y, 60, 4O);

/ / Las cl ases r ecept or as ext i enden adapt ador as

class Recept or Ci er r e2 extends Wi ndowAdapt er

public void wi ndowCl osi ng( Wi ndowEvent e)t

ISys t e m exi t ( O) ;

1

class Recept or Rat on2 extends MouseAdapt ert

Marco3 l avent ana;

Recept or Rat on2( Mar co3f uent e)t

l avent ana = f uent e;1

public void mousePr ess ed ( MouseEvent e)I

l avent ana. x = e. get X( )

l avent ana. y = e. get Y( ) ;

l av ent ana. r epai nt 0;I

1

Nota:Las clases adaptadoras hacen innecesario redefinir aquellosmétodos,declarados enla interfaz, no Útiles para el programa que se está diseñando.

Las clases adaptadoras disponibles en j ava .awt .event son:Class Cor nponent Adapt er Class Cont ai ner Adapt erClass FocucAdapt er Class KeyAdapt er

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 288/481

274 Java 2. Manual de programación

Cl ass MouseAdapt er Cl ass MouseMot i onAdapt erCl ass Wi ndowAdapt er

10.6. CLASES RECEPTORAS ANÓNIMAS

Unaclaseanónimaes aquella que no tiene nombrey, cuando se va a crear un obje-to de la misma, en lugar del nombre se coloca directamente la definición.-ses receptoras pueden ser definidas como clases anónimas.

Ejemplo

Construir un menú de opciones con el componenteChoi ce,elegir una opción, pre-sentarla en pantallay realizar el cierre de la ventana mediante una clase anó(Fig. 10.3).

Elemento seleccionado Tercero

Figura 10.3. Ejemplo deChoi ce y clase anónima para el cierre de ventana.

i mpor t j ava. awt . * ;i mpor t j ava. awt . event . * ;

publ i c cl ass Ej Anoni maext ends Fr ame i mpl ement s I t emLi st eneri

pr i vat e Choi ce sel ecci ón;St r i ng el ement o = ;

publ i c EjAnoni ma ( )

t/ *empl eo de una cl ase anóni ma par a ef ect uar el ci er r e de l a

* /addW ndowLi st ener ( new W ndowLi st ener O

vent ana

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 289/481

Gestión de eventos 275

public void wi ndowcl osi ng ( Wi ndowEvent e)I

I public void ( Wi ndowEvent e)

public void e)

public void e)

public void e)

public void e)

public void ( Wi ndowEvent e)

( O) ;

sel ecci ón = new Choi ce ;

sel ecci ón. addI t em "Uno" ;

sel ecci ón. addI t em " Do s " ;

sel ecci ón. addI t em " Ter cer o" ;

/ / Opci ón pr esel ecci onadasel ecci ón. sel ec t ;

add ( sel ecci ón) ;

public static void mai n( St r i ng

vent ana = new Ej Anoni ma ;

vent ana. "El AWT" ;

400, 250

public void pai nt ( Gr aphi csI

el ement o =

g. dr awst r i ng ( "El ement o20, 230) ;

public void e)

r epai nt ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 290/481

276 Java 2. Manual de programación

Resulta práctico definir como anónimas las clases receptoras que extieadaptadoras. Por ejemplo, en el caso anterior se podría definir la siguienteanónima:

/ / empl eo de una cl ase anóni maaddW ndowLi st ener ( newWi ndowAdapt er

I

publ i c voi d wi ndowCl osi ngi

Sys t e m exi t ( O) ;

)

Wi ndowEvent e)

10.7. PROBLEMAS COMUNES EN EL TRATAMIENTO DE EVENTOS

Un problema frecuente en el tratamiento de eventos se origina por los «titubeousuario ante la realización de una determinada eleccióny la medida a tomar sueleser ignorar las selecciones realizadas por el mismo hasta que éste confirmesudeci-sión; para ello se añade un botón de confirmacióny se ignoran los eventos genera-dos hasta que el usuario pulse dicho botón.

Ejemplo

Crear unCheckboxGr oup que agrupe4 casillas de verificación.Sólose aceptala selección de la opción cuando se pulsa el botón de confirmación (Fig.10.4).

i mpor t j ava. awt . * ;i mpor t j ava. awt . event . * ;

publ i c cl ass Ej CheckboxGr oupext ends Fr ame i mpl ement s Act i onLi c t eneri

pr i vat e Checkbox opl , op2, op3, op4;pr i vat e CheckboxGr oup menu;pr i vat e But t on conf i r maci on;pr i vat e Label 1;St r i ng el ement o = "El i j a opci ón y pul se Acept ar ";

publ i c Ej CheckboxGr oup( )i

addW ndowLi st ener( new Ci er r e ( ) ) ;

menu = new CheckboxGr oup ( ) ;opl = new Checkbox ( "Pr i mer a opci ón" , menu, f al seop2 = new Checkbox ( "Segunda opci ón" , menu, f al seop3 = new Checkbox ( " Ter cer a opci ón " , menu, f al seop4 = new Checkbox ( "Cuar t a opci ón" , menu, f al se)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 291/481

Gestión de eventos 277

add( op1) ;aci d( op2) ;add( op3) ;add( op4) ;Panel p = new Panel ( ) ;

p. set Layout (new Gr i dLayout ( 2 , l ) ;

1 = new Label ( el ement o) ;

conf i r maci on = new But t on ( "Acept ar " ) ;

p. add( conf i r mac i on); .c onf i r mac i on. addAc t i onL i s t ener ( t hi s ) ;p. add( 1) ;add(p);

public static void mai n( St r i ng a r g s [ ] )

iEj CheckboxGr oup vent ana = new Ej CheckboxGr oup( );vent ana. set Layout (new Gr i dLayout ( 3 , 2 ) ;

vent ana. s et Ti t l e( "El AWT" ) ;

vent ana. set Si ze( 500, 250) ;vent ana. s et Vi s i bl e( t r ue) ;

public void pai nt ( Gr aphi cs g)I

if ( menu. et Sel ect edCheckbox( ) !=

null)el ement o = "El ement o sel ecci onado: t

menu. get Cel ect edCheckbox( ). get Label ( ) ;1. se tTex t ( el ement o) ;

1

public I nset s get I ns et s ( )

i

1return new i nset s ( 20, 20, 20, 20);

public void act i onPer f or med( Act i onEvente)i

1r epai nt ( ) ;

1

class Ci er r e extends Wi ndowAdapt erI

public void wi ndowCl osi ng( Wi ndowEvent e)

Sys t em exi t ( 0) ;1

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 292/481

278 Java 2. Manual de programación

~r Ptimeraopción C Sewndaaotión

r Tercera opcl6n @ Cualtaopcldn

, ___.. ___Aceptar

L..--..........<..I ~ .............---,.,.._I_<._ _._._._._,_,..__;

Elementoseleccionada: Cuarta opclón

Figura 10.4. Confirmación de la selección de una opción.

Por otra parte, en algunos programas las acciones a realizar ante un determievento deben depender de eventos anterioresy, en estos casos,lohabitual es recu-rrir a variables booleanas que reflejenlo que ha sucedido antesy programar lasacciones a realizar en relación con el valor de dichas variables.

Ejercicio

Diseño de una calculadora sencilla (Fig.10.5).

Figura 10.5. Calculadora.

Enun programa que efectúe la creación de una calculadora será preciso en -mer lugar distinguir entre la parte correspondiente al diseño de la pantallay la de

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 293/481

Gestión de eventos 279

manejo delossucesos; dentro de esta última, es necesario resaltar que las accionesa realizar ante la pulsación deun botón van a depender sobre todo de si dicho botónes un dígitoo un operador. Considerando operadores binariosy las operacionescomo series deoperando operador operando operador para evaluar según el ordende introducción, cuando el botón pulsado sea un operador marcará el fin de la ope-ración anterior, pero la actual no se podrá realizar hasta que no se introduzca unsegundo operandoy se marque su fin con un nuevo operador. Cuando el botón pul-sado sea un dígito la acción dependerá de la selección anteriory de si esta fueundígito, la coma decimalo un operador. Por tanto, la ejecución de unas accionesuotras requerirá la consulta delos valores de variables booleanas( o t oNumer o,esDeci mal )que informen sobre dicha selección anterior.

import j ava. awt . * ;import j ava. awt . event . * ;

public class Cal cul ador a ext ends Fr ame

Text Fi el d r esul t ado; boolean ot r oNumer o = t r ue, esDeci r nal = f al se;

doubl e t ot al =O. O;char oper ador =' x ' ; / / s i n oper ador

/ * Di seña l a pant al l a ut i l i zando 2 panel es auxi l i ar es que secol ocan con Border Layout .Uno de est os panel es auxi l i ar es cont i ene a s u vez ot r os dos,uno de oper andos y otro de operador es, q u e se col ocan . , t - l i -zando Gr i dLayout . Los panel es de oper andos y oper ador es con -t i enen l os bot ones y vuel ven a hacer uso de Gr i aLayout * /

public Cal cul ador a ( j

Bot ones cer o, uno, dos , t r es , cuat ro, ci nco, s e i s , s ~e t e ,ocho, nueve, coma;Bot ones suma, r es t a, mul t i pl i ca, di vi de, obt i ene, bor r a;se tFon t ( new Font ( "Ar i al" ,Font . PLAI N,14) ) ;

set Backgr ound( Col or . 1i ght Gr ay ) ;s et Ti t l e( "Cal cul ador a" j ;

set s i ze ( 200, 140);addW ndowLi s t ener ( new Ci e r r e0) ;

Panel panel oper andos = new Panel ( ) ;

panel Oper andos. set Layout ( newGr i dLayout ( 3, 4)) ;

cero = new Bot ones ( " O" , 'x ' , ' O , this);/ * el segundo par amet r o que se pasa al const r uct or i ndi ca

panel Operandos. add( cer oj ;c er o. addAc t i onL i s t ener ( c er o) ;

que no es un oper ador , el t er cer par ámet r o es el val or * /

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 294/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 295/481

Gestión de eventos 281

panel Oper ador es . add( di v i de) ;di vi de. addAc t i onL i s t ener ( di vi de) ;obt i ene = new Bot ones ( " = " , = I , ' O' , t hi s ) ;

panel Oper ador es . add( obt i ene) ;

obt i ene. addAc t i onL i s t ener ( obt i ene) ;Panel panel cent r al = new Panel ( ) ;panel cent r al . set Layout ( new Gr i dLayout ( 1, 2, 10, 10) ;

panel Cent r a l . add( panel 0per andos) ;panel Cent r al . add( panel 0per ador es ) ;

Panel panel Resul t ado = new Panel ( ) ;panel Resul t ado. set Layout ( newFl owLayout0 ) ;r esul t ado = new Text Fi el d( " O" , 15) ;

r es ul t ado. s et Edi t abl e( f al s e) ;panel Resul t ado. add( r esul t ad0) ;add ( "Nor t h" , panel Resul t ado);

add ( "cent er " , panel cent r al ) ;

s et Vi s i bl e( t r ue) ;1

publ i c st at i c voi d mai n ( St r i ng ar gs I )

i

1 new Cal cul ador a ( );

/ / no se t r at a de un oper adorvoi d col oca( char val or )

ISt r i ng . di gi t 0= ;

i f ( val or == I . )

i f ( esDeci r nal ){

I i f ( ot r oNumer o )

ir esul t ado. se tText ( " O" ) ;

ot r oNumer o = f al se;1esDeci r na1 = t rue ;di gi t o = . ;

1I

el sei f ( otroNurnero )

di gi t o = " "t val or ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 296/481

282 Java 2. Manual de programación

r es ul t ado. s et Text ( di gi t o ) ;

if val or ! = ' O' )

ot r oNumer o = false;

else

r epai nt ( ) ;

r es ul t ado. s et Text ( r es ul t ado. get Text ( ) + di gi t o ) ;

/ / es un oper adorvoid calcula(char otrooperador)

idouble numer o;ncmer o = (new Doubl e ( r esul t ado. e t Te x t ( ) ) ) .doubl eval ue ( ) ;

if ( ( ot r oNumer o oper ador == '=' ) & & otrooperador ! = ' ' 1t

switch( operador )

icase '+ ' :

t ot al += numer o; break;

case I - :

t ot al - = numer o; break;

case * I :

t ot al *= numer o; break;

case ' / ' :

t ot al / = numer o; break;

case ' x ' :

case ' ' :

t ot al = numer o; break;

r esul t ado. se tTex t ( ( new Doubl e ( t ot al ) ) . t os t r i ng ( ) ) ;

1oper ador = ot r ooper ador ;ot r oNumer o = true;es Deci ma1 = false;if (otrooperador == ' ' )t

r es ul t ado. s et Text ( " O" ) ;

oper ador = ' ';t ot al = 0. 0;

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 297/481

Gestión de eventos 283

c l a s s Bot ones extends But t on implements Act i onLi st enerI

char unoper ador , unval or ;Cal cul ador a cal c;

t ext o, char oper , char val or , Cal cul ador a c

super( textounoper ador = oper ;u n v a l o r = v a l o r ;cal c = c;

public void e)i f ( unoper ador ==

no es un oper adorcal c . col oca ( unval or )

else

c l a s s Ci er r e extends Wi ndowAdapt er

public void wi ndowcl osi ng ( Wi ndowEvent e)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 298/481

I 11

Applets

CONTENIDO11.1. Introducción aHTML.11.2. Incorporación deapplets a páginas Web.11.3. Estructura deun applet.11.4. Transformación de aplicaciones enapplets.11.5. Incorporación de sonido.11.6. Incorporación de imágenes.

285

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 299/481

286 Java 2. Manual de programación

~~ ~ ~~ ~ ~~~ ~~ ~

Los applets son pequeños programas Java que se incluyen enpáginas Web y cuyo código se descarga desde el sevidor para serejecutado localmente por un navegador. Por tanto, para trabajar con

applets es necesario conocer algunas de las características de laspáginas Web y del lenguaje en que éstas están escritas, y el capí-tulo comienza exponiendo conocimientos básicos sobre HTMLTambién se explicará la estructura fundamental de un applet. Te-niendo en cuenta que las applets trabajan con IGU y están guia-das por eventos, el capítulo se apoya enlos conocimientosaportados por otros anteriores para la creación de las primerasapplets.

11.1. INTRODUCCIÓN A HTML

Internet esútil para el intercambio de información y la comunicaciónmultiperso-nal gracias a su organización en servidores, que disponen de la informacióny losrecursos,y clientes, que accedena ellos. Dentro de los servicios proporcionados por Internet, la Web ocupa un lugar destacado, constituyendo las páginas archivos guardados en servidores repartidos por todo el mundo y losnavegadores programas cuya misión es conectarse aun servidor Web para recibir sus datos y presentar las páginas en pantalla. Las paginas Web se escriben en lenguajeHTML(lenguaje de marcas de hipertexto). En un documento HTML existe texto nory

marcasencerradas entre llaves angulares que indican al navegador cómo mostcontenido del documento en pantalla.

Existenmarcas básicas que necesitan otra de cierre, como las mostradas enTabla 11.1.

Tabla 11.I. Marcas básicas de un documento HTML~~ ~ _ _

Marca Significado

<HTML> . . . </ HTML> Comienzoy fin del documentoHTML<H E A D > . .. </HEAD> Comienzoy fin de cabecera<BODY> . . . </ BODY> Comienzoy fin del cuerpo

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 300/481

Ap plets 287

Las marcas y señalan el principioy fin del documentoy</ HEAD>y </ BODY> dividen el documento ensusdos par -

tes fundamentales: cabeceray cuerpo.

PARTES EN UN DOCUMENTO HTML

Comienzo del documento<HEAD>

</HEAD><BODY>

</ BODY>

Cabezera

Cuerpo

. . .

. . .

Fin del documento

Otrasmarcasque necesitan cierrese muestran en la Tabla11.2.

Tabla 11.2. Marcas en las que se exige cierre

Marca Significado

<T IT L E >título- de- fagágina

. . .

. . .. . .

< I >. . .

entradas- de- la- lista

entradas- de- la- lista

Irá dentro de la cabecera y permitirá poner títuloal documento.Cabeceras cuyo nivel viene representado por elnúmeron que las acompaña. El tamaño de textomás grande es para las de nivel

Comienzo y fin de una lista no numerada

Comienzo y fin de una lista numeradaEntrada de la lista

NegritaCursiva

Existen también enHTMLotras marcas que no necesitan cierre (Tabla11.3).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 301/481

288 Java 2. Manual de programación

Tabla 11.3. Marcas en las que se requiere cierre

Marca Significado

<BR>

<P>

<HR>

Salto al principio de la siguiente línea sin introducir una línea en blanco para separar el texto anterior. Nuevo párrafo, introduciendo una línea en blanco para separarelsiguiente texto del anterior.Línea horizontal gráfica como separador de bloques de texto.

Es preciso tener presente que la escritura de saltos de línea en una página H

Así mismo, existe otra clase de marcas que requieren atributos con espec-se trata como si fuera una escritura de espacios en blanco.

ción de la información adicional necesaria para completar la acción.

Tabla 11.4. Marcas que requierenatributos

Marca Significado~ ~ ~~~ ~~~~

<FONT SIZE=nÚmero> Cambia el tamaño de las fuentes.<IMG SRC=nombre-imagen> Permite incluir en una página

Web la imagen con el nombre

especificado.La marca para la inclusión de unaimagen se puede complementarcon el atributoALT que permitela sustitución de la imagen poruna descripción de la mismacuando dicha página se visite conel navegador en modo texto.

<I MGSRC=nombre-imagen ALT=descripción>

Losenlacesen las páginas Web se indican a traves de la marca<A>. . . </ A>,que se denomina ((ancla))(anchors)y que necesita como atributola referencia aldocumento con el cual se enlaza (URL), de la siguiente forma:

<A HREF= ref - a 1- doc urnen t - con - e - c ua 1- se - en 1 a a

t e x t - que- s e-rno s t ra a- en - pa n t a 1 1 a </ A>

Además de las marcas citadas, existen caracteres que tienen un significado -cial en lenguaje HTML. Estos caracteres especiales sirven para representar

dispositivo de salida (pantalla, impresora,...) a otros caracteres normales de escritu-ra queno pueden escribirse directamente, dado que tienen un significado espeen HTML.Esdecir, por ejemplo, para representar en pantalla el símbolo es p-ciso escribir en el documento HTML el carácter(( &1 t ; .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 302/481

Ap pl ets 289

Tabla 11.5. Representación de caracteres especiales

Carácter que se desea presentar

< &I t ;> &gt ;

11 & q u o t ;

Carácter por el que debe sustituirse

& &amp;

. . . . . .

HTML también tiene códigos especiales para los caracteres que no forman parde conjunto ASCII estándar (Tabla 11.6).

Tabla 11.6. Códigos especiales para representar caracteres no ASCII

Carácter que se desea presentar Carácter por el que debe sustituirse

óñÑ. . .

&oacut e;&nt i l de;&Nt i l de;. . .

11.2. INCORPORACIÓNDE APPLETS A PÁGINASWEB

Los applets permiten vincular código Java con páginas Web. Esta acción permiconstruirpáginas Web dinámicas. Además, hay que tener en cuenta que el código Jase ((descarga))desde el servidor para ser ejecutado en el navegador, de forma que seaprovecha la potencia del sistema localy se evita la sobrecarga del servidor. Un appletse incorpora en una página Web usando las siguientes órdenes (comandos) html:

< A P P L E TC O D E B A S E = U R L - d e - l a - c l a s eCODE= n omb e- de - 1 a- c 1 a seN A M E = n o r n b r eW I D T H = n ú r n e r o H E I G H T = n Ú m e r oALT=t e x t o

ALIGN=?’us i f i c a c i ó nV S PA C E = e s p a c i o -ver t i c a l

<PARAM

H S PA C E = e s p a c i o - h o r izon t a l>

N A ME =n o m b r e - argurnent o VALUE=va 1 r-a rg um e nt o >

. . .(parametros, puede haber varios)

(códigos HTMLalternativos para clientes queno soportan Java)

< / A P P L E T >

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 303/481

290 Java 2. Manual de programación

Losdistintos elementosy su responsabiiicLdse describen a continuación:

CODEBASE: Necesario cuando eluppletno se encuentra enel mismo lugar quela página Weby representa el directorio, relativo al directorio en donde encuentra la página Web, que contiene la clase delupplet.CODE:Obligatorio; nombre del archivo que contiene el código byte de la cya compilada.NAME:Opcional. Nombre de la instancia delapplet.Este nombre permite a losuppletsde una misma página encontrarsey comunicarseentresí.WI DTHy HEI GHT:Obligatorios; representan el tamaño del rectángulo quocupará elappleten la página Web.ALT: Opcional; sirve para especificarel texto alternativo que presentará unnavegador cuando comprenda la etiqueta APPLET, pero no pueda ejecuapplet.ALI GN:Opcional; establece la alineación deluppletcon respecto alosotroselementos de la pagina. Como justificación, se podrá indicarLEFT, RI GHT,TOP, TEXTTOP,MI DDLE, ABSMI DDLE, BASELI NE,BOTTOMy ABSBOT- TOM.

tal que separará aluppletdel texto que le rodea.VSPACEy HSPACE:Opcionales, permiten fijarel espacio verticaly horizon-

Entre las órdenesAPPLETy / APPLETse pueden colocar parámetros paraeluppletcon la sintaxis:

<PARAM N A M E = n o r n b r e - a r g u m e n t o VA L U E = v a l o r - a r g u m e n t o >

- NAME: Nombre del parametro que se desea pasar alapplet. El nom -bre a r g u m e n t o puede escribirse encerradoo no entre comillasy no se

hacedistinciónentre mayúsculas y minúsculas.- VALUE:Valor que se desea enviar aluppletmediante el parametro.Elvalor que se envía también puede escribirse encerradoo no entre comillas.

Es importante tener presente que los parámetros pasados a unupplet pueden servarios, resultando necesario especificar para cada uno de ellos un nom( NAME)y un valor(VALUE).Otro factor a considerar es quesi se desea que lasappletsque trabajan con parámetros puedan ejecutarse siempre, conviene que emismas se proporcionen valores por omisión para dichos parámetros. Por údiremos que los parámetros se reciben en eluppletsiempre como cadenas median-te el métodoget par amet er :

public j ava. l ang. Ct r i ng get Par a met er ( j av a. 1ang. St r i ngpl )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 304/481

Applefs 291

La sentencia necesaria sería, pues:

St r i ng argument o= get Par amet er ( " nombre-argumento" ) ;

donde las comillas son obligatorias. Esta sentencia devuelve elvalor -argumentodel parámetro cuyo nombre( NAME) es nombre- argumento;si no lo encuentra,devuelvenu1 1.

11.2.1. Edición de un documentoHTMLy-ejecución de applefs

La edición de una página HTML se realiza con un editor de texto. Una vez escritoel código en el editor, se debe almacenar con la extensión HTML.

La visualización de la página Web que incorpora unappletse podrá efectuarusando un navegadoro el visor deapplets, appletviewer;de ambas formas elappletse carga y ejecuta automáticamente.

FORMATO BÁSICO DE UNAPÁGINAWEB QUE INCORPORA UN AP PL ET

<HTML><HEAD></ HEAD><BODY>

<APPLETCODE= nombr e- de- l a- cl aseWI DTH= númer ohei ght = númer o >

</ APPLET></ BODY></ HTML>

Ejemplo

Una página HTML que incorpora unappletal que se le pasan parámetros podría serla mostrada en la Figura11.1.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 305/481

292 Java 2. Manual de programación

<HEAD>

;/HEAD,

<RODY><H I .EjernpIo</Hl><UL>

~TlTLE>T&iacute,iulocírlTLE>

< Ll > Lino<LI>Dos </Liz

</UL><I-- Colocaciondel codiaaHTML auei n t e re se- - >4 P F L E T

CODE= libroTenia11 El4ppletclassWIDTH=220HEIGHT= ion>

~ PA R A MNAME= " C o l a r "VALJE = 'w5,1nn,inn":cPARAMNAME= "Nombre"VALUE= "Cadena">

aAPFLET></BODY,

:/HTML>

Figura 11.1. PáginaT. ht ml .

Es conveniente observar el códigoHTMLy, sobre todo, cómo se especifica enCODEel nombre del archivo que contiene el código byte(bytecode)de la clase com- pilada.

CODE=l i br o. Temal l . Ej Appl et . c l as s

El applet de la Figura11.2recibe como cadenaslos parámetros Nombre yCol or. Dichouppletno adjudica valores por omisión paralos parámetros, ya queel ejemplo pretende ser una demostración sobre el paso delosmismosy, si se pro-dujeran errores basta con que éstos sevisualicen.Es importante destacar trata-miento del parámetroCol or que en el mencionadouppletse efectúa. Es necesariotener en cuenta que en Java el color está encapsulado en la claseCol or ,que defi-ne algunas constantes para especificar un conjunto de colores comunes, pero-

más es posible definir colores utilizando constructores de color. De esta form posible especificar cualquier colory después Java busca el más cercano al solici-tado en función de las limitaciones del sistema donde se esté ejecutando el -gramao applet.El tratamiento efectuado es debido a queapplet exige recibircadenas como parámetros y el constructor de color empleado requiere tres nú-ros enteros.

public Col or (int p l , int p 2 , int p3) Los parámetrossonvalores delO al 255 que se correspondencon la cantidad de colores puros,rojo, verdey azul, utilizados enla mezcla para obtener el colordeseado.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 306/481

App lets 293

package libroTema11 ,import javaawt*,

importJava applet*,

public class EjApplet extends Applet

String nombre,Stringcolor,

public voidinit0

i

nombre = getPa rame e r(1' Nombre" ),coIot = y etPa ramete r("CoIoI ) ,

int cl = Integerparselnt(co1or substring(0,3)),

int c2 = Integerparselnt(co1or subctring(4,6)),int c3 = Integerparselnt(co1or sub stri ngp ,lO)) ,setBackgro und(new Color(c1,c2,c3)),

I

1

ipublic voidpaint(Graphicsg)

g setFont(new Font("Arial",FontBOLD,14)),y drawString(nombre,20,2O),

Figura 11.2. Applet: Ej Appl et . j ava.

El métodoi ni t ( )es proporcionado por la claseAppl et e inicializa eluppletcada vez que se carga (posteriormente se ampliará el concepto dei ni t ) . El upplet puede hacer uso depai nt debido a que la claseAppl et hereda dePanel , que asuvezlo hace deCont ai ner y ésta deComponent .

Tanto la página como eluppletse almacenan enC : \ 1 i br o\ Tema 11 .Una vez creados elapplety lapagina,la única operación necesaria será compi-

lar elupplet, para lo que se utiliza la siguiente instrucción:

C: \ l i br o\ Temal l >j avacEj Appl et . J av a

Al abrir la página, usando por ejemplo Microsoft Internet Explorer, eluppletse

Otra forma de ejecutar unuppletes utilizandouppletviewer;éste simula uncargay ejecuta automáticamente. El resultado se muestra en la Figura11.3.

navegador elementaly necesita que se le pase como parámetro el nombre del archi-vo HTML donde se incorpora elupplet.Es decir, ejecutar la orden:

C: \ l i br o\ Temal l >appl et v i ewerT. h t m

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 307/481

294 Java 2. Manual de programación

. ti0

m Dos \ \

Par ámet r o: Par ámet r o:rn el GI Nombr e yl ugar

donde seencuent r al a pági na

Figura 11.3. Resultado de la ejecución delapplet E] Appl et . cl as s.

El uso deuppletviewerrequiere añadir al archivoHTMLla orden:

CODECASE= . . \ . . \

11.3. ESTRUCTURA DE UN APPLET

La claseAppl et extiende la clasePanel del AWTy Panel extiendeCont ai ner que, a su vez, extiendeComponent , proporcionándose así a lasuppletstodas las herramientas necesarias en la programación IGU(ZnterfuzGráfica de Usuario)y, al igual que todoslos programas que trabajan con IGU, lasuppletsestán guiadas por eventos.

Lasuppletsdisponen de cinco métodos que pueden sobreescribir, aunque nobligatorio que lo hagan, pues tienen implementaciones por defecto que se i-rán automáticamente durante la ejecución de la misma. Cuatro de estos méto proporcionados por la claseApp1et :

public void i n i t ( ) Inicializa el applet y es invocado por elAppletviexlevo el navegador cuandose carga elapplet.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 308/481

Ap pl ets 295

public void s t a r t Se ejecuta a continuación dei ni t y también cadavez que el usuario del navegador regresa a la página HTML donde reside elupplet y debe contenerlas tareas que deban llevarse a cabo en estas

ocasiones.

public void Se ejecuta cuando el usuario abandona la páginaHTML en la que reside elapplet.

public void destroy Libera todoslos recursos queel appletestá utilizandoy se ejecuta antes de que elapplet se descarguecuando el usuario sale de la sesión de navegación.

El quinto método espai nt perteneciente a la claseCont ai ner , que se invo-ca para dibujar en elappletal iniciarsu ejecución, así como cada vez que el mismonecesita redibujarse.Un ejemplo se presenta cuando elappletse oculta por una ven-tanay luego esta ventana se mueveo se cierra.

ESTRUCTURA DE UN APPLET

importimport

public class Nombr eAppl et extends Appl et

mét odos que se pueden sobr eescr i bi r public void i n i t

. public void s t a r t O

. I

public void

. public void destroy O

. public void pai nt ( Gr aphi cs

.

Otros métodos de interés cuandose trabaja conuppletsson: public void int

Redimensionar elapplet.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 309/481

296 Java 2. Manual de programación

public void r epai nt ( )Repintarel upplet a petición del programa.

public void updat e( j ava. awt . Gr aphi cs pl )Es llamado porr epai nt y, comopai nt , se utiliza para dibujar en elupplet, ofreciendo la posibilidad de efectuar repintados incrementales.

public void s hows t at us ( j av a. l ang. Ct r i ngpiMuestra un mensaje en la barra de estado del navegadoro visor de applets.

public j ava . awt . I mage get I mage ( j ava . ne t . URL pl, j ava. l ang. St r i ng p 2 ) .

Devuelve un objetoi mage que encapsula la imagen encontrada en la dirección especificda mediante el parámetrop l y cuyo nombre esel especificado como segundo parámetro.

public j ava. appl et . Audi oCl i p get Audi oCl i p ( j ava. net . URLp l ,

j ava. l ang. St r i ng p 2 ) .

Devuelve un objetoAudi ocl i pque encapsulael fragmento de audio encontrado en ladirección especificada mediante el parámetropl y cuyo nombre esp2.

public j ava. appl et . App1et Cont ex t ge t Appl e t Cont ext 0Obtiene el contexto delupplet.

public j ava. net . URL get CodeBase0Obtiene el URL delupplet.

public j ava. net . URL get Document Base0Devuelve el URL del archivo HTML que inicióel upplet.

public abstract void showDocument ( j ava. net . URLp i

Muestra, desde el contexto de unupplet, el documento especificado mediante el parámetrop l .Esun método definido en la interfazj ava . app1et . Appl et Cont ext

public abstract j ava. ut i l . Enumer at i on get Appl et s( )Método que permite obtener las applets que se encuentran en el contexto de la actual.Definido en la interfazj ava. appl et . App1et Cont ex t

public abstract j ava. appl et . Appl et get Appl et ( j ava. l ang. St r i ngpl)

Devuelve elupplet de nombrep l ,si dichaupplet se encuentra en el contexto actual, en otrocaso devuelvenul l Definido en la interfazj ava. appl et . App1et Cont ex t

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 310/481

Appl ets 297

Además deAppl et Cont extque permite acceder al entorno de ejecución delapplet,la claseAppl et dispone de otras dos interfaces mas:1) Appl et St ub, proporciona mecanismos para la comunicación entre elapplety el navegador; 2)

Audi ocl i p,reproduce archivos de sonido. La incorporación de imágenesy soni-do a unappletse verá más adelante.

Ejemplo

Appletque calcula el volumen de una esferay lo muestra en la barra de estado.

package l i br o . Ter nal 1;import j ava. awt . * ;import j ava. awt . event . * ;import j ava. appl et . * ;

public class Esf er avol extends Appl et implements Act i onLi st eneri

Label mensaj e; Text Fi el d val or ;

public void i n i t ( )

imensaj e = new Label ("I nt r oduzca el r adi o y pul se <RTM>: " ) ;

val or=

new Text F i el d( l 0) ;add ( mensaj e) ;

add ( val or ) ;

val or . addAc t i onL i s t ener ( t hi s ) ;

public void act i onPer f or med( Act i onEvente)i

Coubl e val = new D o u b l e ( val or getText 1 ) ;

double r adi o = val . doubl eval ue ( ) ;

showst at us ( "El vol umen es+ Doubl e. t oSt r i ng( vol umenEs f er a( r adi o) ) ) ;

public double vol umenEsf er a( doubl e r adi o)

double vol umen;vol umen = (double) / 3*Mat h. PI *Mat h. pow( r adi o,3) ;

return vol umen;

I

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 311/481

298 Java 2. Manual de programación

Figura 11.4. Resultado dela ejecución delapplet Esf er avol . cl as s.

Archivo HTML ( Pagi na. HTML)

<HTML>< H E A C ></ HEAD><BODY>

<APPLETCODE=l i br o. Temal l . Es f er aVol . c l as sNAME=Es f er aVolW DTH=32OHE; GHT=l OO>

< / A P P ¿ E T ></ BODY></ HTML>

11.4. TRANSFORMACIÓNDE APLICACIONES EN APPLETSLas técnicas generales a seguir para transformar enuppletslas aplicaciones conIGU desarrolladas en Java son:

Añadir a las importaciones del programa la del paquetej ava . appl et . *.Hacer que la clase que define elappletextiendaAppl et . La sustitución deFr ame porAppl et obliga a eliminar las posibles llamadas as et Ti t l ey acambiardi spose pordest oy.Reemplazar el constructor de la clase por el métodoi ni t .Eliminar el métodomai n.Eliminar las llamadas aSyst em. exi t .Hacer que la entraday salida de datos se efectúe siempre a través del AWT.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 312/481

Appleis 299

Tener en cuenta que el administrador de diseño por defecto para lasappletses

Crear un archivo HTML que incorpore elapplet.Fl owLayout .

Se requiere, además, tener presente las siguientes consideraciones:

Losapplets, por razones de seguridad, no pueden efectuar todos los trabajosque realizan las aplicaciones. Por ejemplo, no pueden ejecutar un programa dela computadora del usuario, ni listar directorios, ni borrar, ni leer, ni escribir,nirenombrar archivos en el sistema local.Cuando se efectúa programación multihilo,deben detenerse los hilos de unappletcuando se sale de la página Web en la que el mismo reside. Para ello, se

sobreescribe el métodos t o p delapplet.Los hilos se reinician en el métodos t a r t delappletque se invoca automáticamente cuando el usuario retorna ala página Web.Losappletssólo pueden crear conexiones por red con la computadora de la que

proceden.

Ejemplo

Transformar enappletla aplicación de la calculadora vista en el capítulo anterior.package l i br o. Temal 1;i mpor t j ava. awt . * ;i mpor t j ava. awt . event . * ;

/ / se añade l a i mpor t aci ón del paquet e appl et

i mpor t j ava. appl et . * ;

/ / En l a apl i caci ón l a cl ase Cal cul ador a ext endí a Fr ame

publ i c class Cal cul adora ext ends Appl eti Text Fi el d r esul t ado;bool ean ot r oNumer o = true, es Deci ma1 = f al se;doubl e t ot al = 0. 0;char oper ador = ' x ' ;

/ / i ni t r eempl aza al const r uct or de l a cl ase, Ca l c ul a do r a 0publ i c voi d i ni t 0

t hi s . s et L ayout( new Border Layout ( ) ) ;Bot ones cer o, uno, dos , t r es , cuat r o, c i nco, sei s ,si et e, ocho, nueve, coma;Bot ones suma, r es t a, mul t i pl i ca, di vi de, obt i ene, bor r a;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 313/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 314/481

nul t i pl i c a. addAc t i onL i s t ener ( mul t i p1i c aj ;di vi de = new Bot ones ( / ' I , ' / ' , ' O' , this) ;

panel Oper adores . add( di v i de) ;ai vi de. addAc t i onL i s t ener ( di vi dej ;

obt i ene=

new Bot ones( = ' I , I =

, ' O' , this j ;pane l Oper ador es . add( obt i ene) ;obt i ene. addAc t i onL i s t ener ( obt i enej ;

Applet s

Panel panel cent r al = new Panel ( ) ;

p a n e l C e n t r a l . s e t L a y o U t ( n e w Gr i dL ayout ( l , 2,0 , 1 3 ) ) ;p a n e l C e n t r a i . a d d ( p a n e l C p e r a n d o s ) ;panel Cent r al . add( panel 0per adcr e. s ) ;

Panel panel Resul t ado = new Panel ( ) ;panel Resu l t ado .set Layout (new Fl owLayout ( j j ;

r esul t ado = new Text Fi el d( " O" , 15) ;

r es ul t ado. s et Edi t abl e( f al s e) ;panel Res ul t ado. add( r es ul t adoj ;

add ( "North" , panel Res ui t adoj ;

add( " Cent er " , panel cent r al ) ;

/ / Desapar ece el mét odo mai n( )

void col oca (char val or )i

St r i ng di gi t o = ' I ;

if( val or == ' )'I

if ecDeci mal )

if ot r oNumer o )i

r es ul t ado. s et Tex t ( O ) ;

ot r oNumer o = false;IesDeci mal = true;di gi t 0 f . Il .

IIelse

if ot r oNumer o )

i

d i g i t o = " "+val or ;

r es ul t ado. s et Text ( di gi t o 1 ;if val or ! = ' O' )

ot r oNumer o = false;1else

r epai nt ( ) ;

r es ul t ado. s et Text ( r es ul t ado. get Text ( ) + di gi t 0 1;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 315/481

302 Java 2. Manual de programación

void cal cul a (char otrooperador)i

double numer o;numer o = (new Doubl e ( r esul t ado. e tTex t ( ) ) ) .doubl eval ue ( ) ;

i f ( ( ot r oNumer o operador == '=' ) & & otrocperador ! = ' ' )

switch( operador )

icase I t ' :

t ot al t = numer o;break;

case I - :t ot al - = numer o;break;

case * I :

t ot al *= numer o;break ;

case / I :t ot al /= numer o;break;

case 'x' :case ' ' :

t ot al = numer o;break:

1

r esul t ado. set Text ( ( new Doubl e ( t ot al ) ) . t os t r i ng( ) ) ;1oper ador = Gt r oOper adGr ;ot r oNumer o = true;esDeci mal = f a l s e ;i f (o t rocperador == ' ' 1i

r esul t ado. set Text ( 0 ) ;

oper ador = ' ';t ot al = 0. 0;

1

c la ss Bot ones extends But t on implements Act i onLi st eneri

char unoperador ;char unval or ;Cal cul ador a cal c;

Bot ones( St r 1ng t ext o, char oper , char val or , Cal cul ador a c )

i super( texto ) ;unoper ador = oper ;unval or = val or ;

cal c = c;I

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 316/481

Apple ts 303

p u b l i c v o i d ac t i onPer f or med( Act i onEvent e )

if ( . ; noper ador == ‘ x ’ )

else

c ai c .col oca ( unval or ) ;

cal c . cal cul a( unoper ado=) ;

/ / No es necesar i a l a c l ase Ci er r e

Arch ivo HTML ( PagCal c . HFML)

<HTML><HEAD>

< T I T T E , C a l c u i a d o r a < / T I T = E ></ HEAC><BODY>

< A P P L E ,C0 3Y =l i b r o . Tei a ; l . Ca ~c u i ~d ~~a . c l a s sNAME=Ca1cui ado r aW DTH=2OCHEI GHT=14@>

</ APPLET></ B03Y></ HTML>

Cuando un programa no trabaja con interfaz gráfica de usuario,su transforma-ción enappletconlleva modificaciones más profundas, ya que se requiere pasar auna programación dirigida por eventos.

Ejemplo

Transformar enappletuna aplicación que rellena un vector con1Onúmeros enterosaleatorios, muestralosnúmeros generados y la media delosmismos.

/ / Apl i cac i ón

class LLenaArr

p u b l i c s t a t i c void mai n ( St r i ng[ j args)

f i n a l i n t n5i ems=l G;i n t a r r [ ] = new i n t [ n E l e r n s ] ;

i n t j ;i n t suma = O ;for( j = 0; j < nEl ems; j + + )i

a r r [ j ] = 1 + ( i n t ) ( M a t h . r a n d o r n ( ) * 1 0 ) ;suma += a r r [ j l ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 317/481

304 Java 2. Manual de programación

doubl e medi a = ( doubl e) ( suma) / nEl ems;f o r ( j = O; 1 < nEl ems; j ++)

Syst em. out . pr i nt l n ( " ' I ) ;

Sys t em out . pr i nt l n( "La medi a es "+ medi a) ;

s ys t em out . pr i nt ( a r r [ j ] + ' I ) ;

i

Compilación

C: \ l i br o\ Temal : >] avac LLenaAr r . j ava

Ejecución y resultado de la misma

C: \ l i br o\ Temal l >] ava LLenaAr r8 9 3 4 9 10 7 7 3 6La nec i a es 6. 6

/ / applet

i mpor t ] ava. awt . * ;i mpor t ] ava. appl et . * ;

publ i c c l ass LLenaArr2ext ends Appl et

f i nal i nt nEl ems = 10;i nt a r r [ ] = new i nt [ nEl ems l ;doubl e medi a = 0. 0;

publ i c voi d i n i t ( )

i nt suma=

O;t

f or ( i nt j = O; j < nEl ems; 1 ++)

a r r [ j ] = 1 + ( i nt ) ( Ma t h. r a ndo m0* 10) ;suma += a r r [ j ];

medi a = ( doubl e) ( suma) nE1ern. s;

publ i c voi d pai nt ( Gr aphi cs g )

i n t x = O;f or ( i nt j = O; j < nEl ems; j ++)I

x += 35;g. dr awSt r i ng( St r i ng. val ueOf( a r r [ j ] ) , x, 35) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 318/481

Applets 305

g. dr awSt r i ng( " Lamedi a es "+ medi a , 35, 70) ;1

Compilación

C: \ l i br o\ t ema l l >j avac L L enaAr r 2. j av a

Archivo HT ML ( Numer os.ht ml )

I HTMLZ<HEAD></ HEAD><BODY>

<APPLETCODE= LLenaAr r 2. cl assWI DTH=400HEI GHT=l oo>

< / A P P L E T ></ BODY></ HTML>

Ejecución

C: \ l i br o\ Temal l >appl et v i ewernumer os . ht m1

El resultado semuestraen la Figura11.5.

7 2 9 6 8 6 1 8 1 3

Lamediaes51

Figura 11.5. Resultado de la ejecucióndel applet LLenaArr.c l as s

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 319/481

306 Java 2. Manual de programación

11.5. INCORPORACIÓN DE SONIDO

Para reproducir sonidos desdeun applet,se comienza por cargar el archivo de son-

do mediante publ ic j av a. appl et . Audi oC1i pget Audi oCl ; p( ; ava. net . URL pi,

l ava. ang. St r i ng p 2 )

y posteriormente se controla la reproducción mediante los métodos proporci porAudi ocl i p.Ejemplo

Audi ocl i p audi oc l ;

audi ocl = get Audi oCl i p ( get CodeBase) , "Soni do. a u " );

audi oc l . pl ay ) ;

. . .

. . .

De esta forma los datos de audio se cargan cuando se construye el audio

La interfaz Audi ocl i p del paquetej ava .appl et define los siguientesmétodos:

publ ic a b s t r a c t void l o o p ( ) Reproduce el archivo de forma continua.

publ ic a b s t r a c t void pl ay( ) Reproduce el archivo.

pub l i c a b s t r a c t void s t o p ( ) Detienela reproducción.

La versión1.3 de la Plataforma 2 de Java incluye una nueva y poderA P I ( j avax .sound) que permite capturar, procesar y reproducir audioy MIDI.EsteA P I permite una flexible configuración del audio y del sistemaM I D I , inclu-yendo métodos para que las aplicaciones puedan preguntar al sistema cuáleslosrecursos que están instalados y disponibles. Los archivos de audio pueden seformatos AIF,AUy WAVy losde músicaM I D I Ti po O, M I D I Ti po 1 y RMF.

11.6. INCORPORACIÓN DEIMÁGENES

El método a seguir para la incorporación de imágenes a unappletes similar al anterior -mente descrito para la incorporación de sonido. La imagen se carga mediante el

publ ic j ava . awt . I mage ge t I mage( j ava . net . URLpi ,j ava. l ang. St r i ng p2 )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 320/481

Applets 307

en el quepi representa el lugar de ubicación de la imagen, mientras quep2 es elnombre del archivo que la contiene, que puede ser de tipo j pg o gi f ,y se puedemostrar utilizando

p u b l i c abstract boolean dr awI mage( j ava. awt . 1mage p l , i n t p 2 ,

i n t p3, j ava . awt . i mage. I mageObser verp 4 )

El primer parámetrop l es la imagen, el segundo,p2, y tercero,p3, representanel lugar donde debe situarse la imagen en elapplet(en realidad son las coordena-das para la esquina superior izquierda de la misma) y el cuarto,p4, es una refe-renciaa un objetoI mageobser ver , que puede ser cualquiera que implemente lainterfazI mageobser ver y normalmente es el objeto en el que se muestra la ima-

gen. También se puede utilizar para mostrar la imagen p u b l i c abstract boolean dr awI mage( j ava. awt . 1mage p l , i n t p2 ,

i n t p 3 , i n t p4, i n t p 5 , j ava . awt . i mage. I r nage0bserverp 6 )

Este segundo método permite establecer una anchuray altura determinadas para

I mageobser ver es una interfaz implementada por la claseComponent quela misma mediantelos parámetrosp5 y p6.

define el método

public abstract boolean i mageupdat e ( java. awt . I mage p l , i n t p2 ,i n t p3, i n t p4, i n t p5, i n t p6)

el cual puede redefinirse para cambiar su comportamiento por defecto, que es pin-tar las imágenes mientras se cargan. El métodoi mageupdat e devolveráf al s e cuando se haya completado la carga de una imageny t rue en caso con-trario.

Ejemplo

Modificación del ejercicio que calcula el volumen de una esfera y lo presenta en la barra de estado, para que muestre la imagen de un altavozy haga sonar un pitidoespecial tras la introducción de los datos.

pa cka ge l i br o . Ter nal 1;import j ava. awt . * ;import j ava. awt . event . * ;import j ava. appl et . * ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 321/481

308 Java 2. Manual de programación

public class Esf er aVol 2extends Appl et implements Act i onLi st ener

l abel mensa l e; Text Fi el d val or ;

Audi ocl i p pi t a;I mage audi o;

public void i n i t ( )

/ * Se supone qae l os ar chi vos , tanto de i magen como desoni do, se encuent r an al macenados en el mi smo l ugarque el appl et , por eso se obt i ene su di r ecci ón conget CodeBas e " /

audi o = get I mage ( get CodeBace) , " Audi o. gi f " );

pi =a=

get Audi oCl i p ( get CodeBase)

,"

Soni do. a u " );

mensaj e = new Label ( " 1nt r oduzcael r adi o y pul se <RTM>: " ) ;val or = new TexL Fi el d( l 0);add( mensaj e1;

a d a ( val or ) ;

val or . addAc t i onl i s t ener ( t hi s ) ;

public void act i onPer f ormed( Act i 0nEvente)t

Coubl e val = new Doubl e ( val or . e tTex t ( ) ) ;

double r adi o = val . doubl eval ue ( ) ;

showCt at us ( "El vol umen es +

pi t a. pl ay( ) ;

Doubl e. t oSt r i ng( vol umenEs f er a( r adi o) ) ) ;

1

public double vol umenFsf er a( double r adi o)i

double vol umen;vol umen = (double) / 3* Mat h. PI * Mat h. pow( r adi o, 3) ;return vol umen;

public void pai nt ( Gr aphi cs g)i

g. dr awI mage( audi o, O, O, this) ;

Archivo HTML ( Pagi na2.HTML)

<HTML><HEAD></ HEAD><BODY>

<APPLET

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 322/481

CGDE=i i br o. Temal l . Es f er aVol 2. c l as sNAME=Esf er aVol 2W DTH=320HEI GHT=100>

</ APPLES>.< / B O D Y>

</ HTML>

I I

Figura 11.6. Resultado de la ejecución deEs f er aVol 2.cl as s.

Si se requiere cargar varias imágenes simultáneamente en lugar de la interfI mageobser ver y su métodoi mageupdat e, es mejor utilizar la claseMedi aTr acker de j ava. awt , con la cual se puede comprobar el estado dediversas imágenes en paralelo.

Métodospubl i c Medi aTr acker ( j ava. wt . .Component p l )

Permite crear la instancia.

publ i c voi d addI mage ( j ava. awt . I magep l , i nt p 2 )

Añade una nueva imagen sobre la que controlar el estado de carga.El primer parámetro es lareferencia a la imagen que está siendo cargada y el segundo es un número identificativo dmisma.

publ i c bool ean I mage checkI D ( i n t pl )Verifica el estado de la imagen.

publ i c voi d wai t For I D( i ntpiObliga al programa a esperar hasta que la imagen cuyo identificador se especifica como par-metro se haya cargado por completo.

publ i c voi d wai t For Al l( )

Obliga al programa a esperar hasta que todas las imágenes registradas se hayan terminado cargar.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 323/481

A 12

concurrenteHilosde ejecuciónCONTENIDO

12.1. La programación multihilo en Java.12.2. Estados de un hilo.12.3. Creación de hilos.12.4. Planificacióny prioridades.12.5. Hilos de tipo demonio.12.6. Grupos de hilos.12.7.12.8. Animaciones.12.9. Doblebuffer.

311

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 324/481

312 Java 2. Manual de programación

Java permite la creación de programas con múltiples hilos de eje-cución (multithreading); es decir, programas con varias partes,denominadas hilos, que realizan sus actividades en paralelo. Hayque tener en cuenta que la mayor parte de las computadoras per -sonales disponibles hoy día cuentan con un Único procesador, loque hace imposible la ejecución simultánea delosdiferentes hilos,dado Io cual se utiliza un sistema de planificación que permitecompartir el uso del procesador según unas prioridades previa-mente establecidas.

La creación de programas con varios hilos de ejecución resul-ta muy útil en algunas ocasiones; por ejemplo, para imprimir undocumento largo mientras el usuario continúa con el uso de laIGU,o para conseguir una eficiente implementación de las anima-

ciones. No obstante, también puede dar origen a multitud de pro-

blemas y, en la mayor parte delos casos, los hilos habrá quecoordinarlos, por ejemplo, para impedir que uno lea datos de unaestructura antes de que otrolosescriba en ella.

12.1. LA PROGRAMACIÓNMULTlHlLOENJAVA

Los hilos de ejecución en Java están implementados en la claseT h r e a d , que forma parte del paquete j ava . l a n g . Cada hilo (thread) tiene un principio,unflujodeejecucióny un,findefinidos, pero no es una entidad independiente sino que deejecutarse en el contexto de un programa. La claseT h r e a d implementa el con-cepto de ejecuciónmultihilode una forma independiente de la plataforma donde s

va a producir dicha ejecución.El intérprete de la máquina virtual específica dondese rueda (se ejecuta) el programa es el encargado de conseguir queloshilos se eje-cuten de forma concurrente, esto es, alternada en el tiempo, dando la aparienuna ejecución simultánea. Por esta razón, la alternancia de código se efectforma muy diferente en distintas computadoras.

Imp~rtante:Los sistemas operativos tienen diferentesformasde planificar laconcreta de la concurrencia de ope-

.Cuando varios hilos con la mismaede predecirse durante cuánto tiempo seidoen unsistema específico.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 325/481

Programación concurrente: Hilos de ejecución 31 3

12.2. ESTADOS DEUNHILO

Losobjetos hilo de Java tienen cuatro posibles estados:nuevo,ejecutable, bloqueado,

muerto(Tabla12.1.

Tabla 12.1 Estadosde objetoshilo~~~ ~ ~ ~ ~ ~ ~~ ~~

Nuevo A este estado se accede mediante la llamada a un constructor de la clase hilo,ydurante el mismo el hilo aún no tiene asignados recursos.

EjecutableSe accede con una llamada al métodos t a r t . éste método asignalos recursosnecesarios para ejecutar el hilo, planificasu ejecución y realiza una llamada asumétodor u n , que es el que contiene el código con las acciones que debe realizarel hiloy habitualmente es unbucle.Comoloshilos se alternan, un hilo en estadoejecutable no tiene porquéser el que, en un determinado momento, se encuentraejecutándose.

BloqueadoUn hilo puede estar bloqueado como consecuencia de:Una llamada al métodos l eep, se tendrá así un hilo dormido que, al cabo deun cierto tiempo, despertará y pasará al estadoEjecutable.El métodoi n t e r r u p tconsigue que un hilo dormido se despierte inmediatamente, producién-dose una excepción.Esperando la terminación de una operación de entradaisalida.Llamadas a otros métodos comowai t , y i e l d o j o i n .

Muerto A este estado se llega tanto tras completar el método r u n . El métodos t o p deversiones anteriores ya no se usa enJava2,debido a que ocasionaba problemas porejemplo por no limpiar, antes de finalizar la ejecución de un hilo, el estado delosobjetos conlos queel mismo se encontraba trabajando.

Es preciso tener en cuenta que un hilo puede pasar fácilmente del estado Bloqueadoal estadoEjecutable,y la forma de paso estará estrechamente relaciona-da con la causa que provocó la detención del hilo.

Para obtener información sobre el estado de un hilo, se puede recurrir al méto-do i sAli ve, que devuelvet rue siempre que el hilonose encuentre en los esta-dos Nuevo,ni Muerto.Otro método que indirectamente proporciona tambiéninformación sobre el estado de un hiloes j o i n , que obliga al hilo llamador a espe-rar hasta que finalice el hilo al quese llama. El método j oi n permite, además,especificar el límite de tiempo que se esperará a que el otro hilo terminesu trabajo.

Un hilo Muertono puede volver al estadoEjecutable.

Importante:Los métodosst op, suspended y r esume pertenecena ver -siones anterioresy yano se usanen Java2.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 326/481

31 Java 2. Manual de programación

12.3. CREACIÓNDE HILOS

La creación de hilos en Java se puede efectuar de dos formas:

Usando una instancia de una clase que implemente la interfazRunnabl e.Esta interfazsólotieneel métodor un, que es el método donde habrá qucolocar el código que debe ejecutar el hilo ysu implementación constituye lmejor elección desde una perspectiva orientada a objetos.

2. Creando una subclase de la claseT h r e a d para obtener un objeto que here dde ella. Hay que tener en cuenta que Java no admite la herencia múltlo que cuando se utiliza este método y se hereda deT h r e a d , dicha

se ya no podrá de ninguna otra.En ambos casos, para que el hilo comiencesu ejecución es necesario: crear e

El siguientees un ejemplo de creación de un hilo implementando la inthilo, 2) llamar al métodos t a r t .

Runn ab1e:

public class Pr i nci pal

public static void mai n ( St r i ng[ ] ar gs)I

Encuent r a = new Encuent r a ;

public class Encuent r a implements Runnabl e I

Thr ead t ;St r i ng c l aveb;

public Encuent r a ( St r i ng cl ave)

cl aveb = c l ave;= new Thr ead (this) ;

public void run

es l a t ar ea a r eal i zar por el h i l o" ) ;

catch ( I nt er r upt edExcept i on e)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 327/481

Programación concurrente: Hilos de ejecución 31 5

tISys t em out . pr i nt l n( "Fi n" ) ;

I

Después de compilar el programa, ejecuteC : \ l i br o\ Temal 2>javaPr i nci pal . En este ejemplo, una clase llamadaEncuent r a implementa lainterfazRunnabl e, lo que obliga aEncuent r a a implementar el métodor un.A continuación se construye un hilo con el constructor

public Thr ead ( l ava. i ang. Runnabi e PI)

cuyoparámetrues una instanciade la claseque implementa la interfazRunnabl e,y despuésse llama al métodos t a r t , cuyo formato es

public synchronized void s t a r t ( )

para que comience la ejecución del hilo.El código a ejecutar por el hilo será el definido en el métodor un, aunque éste

3uedellamar a otros métodos. Para que se pueda observar mejor el funcionamientoi e r un,

se han colocado en él las instruccionesSyst em. out . pr i nt l n

y elmétodos l eep.El métodosl eep se utiliza cuandose pretende retrasar la ejecución de un hilo;

-ecibecomo parámetro un número de milisegundos y hace dormir al hilo dichoiúmerode milisegundos como mínimo.Debe colocarse en un bloque: r y / c a t c h ,ya que puede lanzar una excepción si algún otro hilo intenta inte-rumpirlomientras está dormido. Cuando el hilo completa el métodorun se con-iierteen muertoy finaliza. El hilo actual puede obtenerse mediante el métodoChr ead. curren tThread( ) .

La creación de hilos podría efectuarse también de la siguiente forma: public class Pr i nci pal 2

I public static void mai n ( S t r i n g [ ] argc)

tEncuent r a2 bc l = new Encuent r a2 ( " @@12R" );

bc l . s t a r t ( ) ;

1

public class Encuent r a2 extends Thr eadi

St r i ng c l aveb;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 328/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 329/481

Programación concurrente: Hilos de ejecución 317

mayor prioridad que el que está en ese momento ejecutándose pasa al estadoEjecutable,<<arrebataránla UCP al que se encuentra en ejecución. El problemaexige tener cuidado con los algoritmos para que resulten independientes de la pla-

taformay sólose presenta ante hilos de idéntica prioridad,y métodos que puedenayudar a resolverlo sonsl eep y y i e l d .El métodosl eep quita el control de laUCPa un hilo con cualquier prioridad,

ofreciendo oportunidad para que otros se ejecuten. Además, un hilo puede cedersuderecho de ejecución efectuando una llamada al métodoyi el d, pero sólo a hilosadecuadosy disponibles; es decir, a hilos ejecutables con igual prioridad que elmismo, porlo que éste método no asegura que el hilo actual detengasu ejecución.Es redundante enlos sistemas con repartición de tiempo por turno circular.Losmétodossuspend y r esume pertenecen a versiones anterioresy ya no se usan en

En Java la prioridad deloshilos por omisión es5 y, cuando se crea uno nuevo,hereda la prioridad del que lo creó. La prioridad podrá ser modificada mediante elmétodo

'

Java2.

publ ic final void s ecpr i c r i t y(int pl )

al que se le pasa como parámetro valores numéricos enteros comprendidos entreM I N PRI ORI TY(constante quevale i ) y MAX P R I O R I T Y(constante que valeIO),

definidas en la clase Thr ead. Cuanto mayor sea el valor entero, mayor seráel nivel de prioridad que indica. Para obtener la prioridad de un hilo se utiliza elmétodo

publ ic final int get P r i or i t y ( )

12.5. HILOSDETIPO DEMONIO

Un demonioes un hilo cuyo propósito es ofrecer servicios a otros hilos de ejecu-

ción existentes dentro del mismo proceso. El intérprete de Java permanece en eje-cución hasta que todos los hilos de un programa finalizan su ejecución, pero noespera a que terminen cuando éstos han sido establecidos comodemonios.Paraespecificar que un hilo de ejecución es de tipodemonio, se deberá realizar una lla-mada al método

publ ic final void setDaernon (boolean pl )

pasándole como argumentot rue. Para determinar si un hilo es de este tipo, sedeberá llamar al método

publ ic final boolean isDaernon ( )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 330/481

31 8 Java 2. Manual de programación

12.6. GRUPOS DE HILOS

Loshilos en Java siempre pertenecen a un grupo,lo cual va a permitir que se pue-

dan manipular y gestionar de forma colectiva. Cuando se crea un hilo Java lo-ca por defecto en el grupo del hilo bajo el cual se crea y para colocarlo en otque especificarlo en el constructor, no siendo posible cambiar a un hilo de trassu creación. Los constructores proporcionados por Thr ead que permiten aso-ciar un nuevo hilo a un grupo específico son:

public Thr ead( j ava. 1ang. Thr eadGr ouppl , j ava. l ang. Runnabl ep 2 )

public Thr ead( j ava . l ang. Thr eadGr oup pl, j av a. l ang. Runnabl e

p2, j ava. l ang. St r i ng p 3 )

El grupo de un hilo actual puede obtenersemedi ant e el método

public final j ava . 1ang. Thr eadGr oup get Thr eadGr oup0

y el del hilo actual lo podría proporcionar la siguiente instrucción:

T hr e ad. c ur r e nt T hr ea d0 . get T hr e adGr o up( ) ;

Es necesario tener en cuenta que los grupos no sólo pueden contener hilos d-cución, sino también otros grupos. La clase Thr eadGr oup implementa las carac-terísticasy posibilidades delosgrupos de hilosy dentro de ellaes posible destacarlos siguientes métodos:

public Thr eadGr oup ( j ava. l ang. St r i ng p i )Crea un grupo de hilos, el parámetropl es el nombre para el grupo.

public Thr eadGr oup j ava. 1ang. Thr eadGr oup pl , j ava. l ang. St r i ng p2 )Crea un grupo hijo del grupo pasado como argumento, el parámetrop2 es el nombre para elgrupo hijo.

public int ac t i v ec ount ( ) Número de hilosEjecutahlesde un grupo de hilos

public final void d e s t r o y ( )Destruye un grupo dehilosy sussubgrupos.

public int enumer at e ( j ava. i ang. Thr eadp 1 [ 1Devuelve en el array una referencia a todosloshilos activos del grupo.

public int enumer aze ( j ava. 1ang. Thr eadGr oupp i [ 1 )Devuelve en el array una referencia a todoslosgrupos activos del grupo.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 331/481

Programación concurrente: Hilos de ejecución 31 9

public final int ';'.' ','../ I , ' , ' I

Devuelbela prioridadmáximaq u epuedc tcricrtin hi lod c u n grupo

public final - J - . J . ' , ,

Devuelveel nombre del grupo

public final j avc . l anq. Thr e, ~J r 2r&L ~ J C I 0Devuelve el grupo padre deun grupo dehilos

public final Boolean i s üaemon ( )

Indicasi el grupo esun demonio.

public final void s et Maxpr i or i t y ( int p l )Establece la prioridad máxima para un grupo.

public final void s et Daemon (booleanpl )

Establece si el grupo actuales o no un demonio.

12.7 . SINCRONIZACI~N

Cuando hay muchos hilos rodando en una máquina virtual de Java, es posible quevarios de ellos deseen modificar la misma fuente al mismo tiempo; en estas cir -

cunstancias, se hace necesario sincronizarlos de algunaformay que cada uno deellos conozca de algún modo el estado y las actividades de los demás. La forma mássencilla de explicar la sincronización es recurrir al clásico problema deproduc-tor/consumidor,en el que existe un productorque genera datos y los almacena enuna estructura de tamaño limitado, por ejemplo un array, desde donde se extraen porun consumidor.El productorseráun hilo que añade los datos a la estructura tanrápido como puede, mientras que elconsumidorva a ser otro hilo que extrae esosmismos datos también tan rápido como puede. En esta situación es evidente queserá necesario un contador para saber el número de elementos almacenados en elarray en un instante determinado e impedir que, de momento, siga trabajando el productor cuando el array esté llenoo el consumidor si se queda vacío, como semuestra en el siguiente programa.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 332/481

320 Java 2. Manual de programación

publ i c cl ass Pr i nci pal st

publ i c s t at i c voi d mai n ( St r i ng[ ] a rg s )

Dat os d = new Dat os ( ) ;

Productor p = new Productor ( d )Consumi dor c = new Consumi dor ( d );

I

i

publ i c cl ass Dat os

doubl e[ ad;i nt cont ador = - 1;

publ i c Dat os ( )

ad = new doubl e [ 41 ;

1

publ i c voi d poner ( doub1e d)

whi l e ( cont ador < ad. l engt h - 1)cont ador ++;ad[con tador ] = d * 1000 + cont ador ;

publ i c voi d qui t a r 0

whi l e ( conEador >= O)

doubl e d = ad[con tador ];

a d [ c o n t a d o r ] = O;cont ador - - ;Syst em. out . pr i nt l n( " Consume " +d) ;

publ i c cl ass Productor i mpl ement s Runnabl e

Thr ead hi l ol ;Dat os dt os;i nt num = 0;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 333/481

Programación concurrente: Hilos de ejecución 321

public Pr oduct or ( Dat os d)t

dtos = d;h i l o l = new Thr ead( t h1. s ) ;hi l ol . s t ar t ( ) ;

public void r u n 0i

for (int i = O ; i < 5; i ++)

dtos .poner ( i );

t=Y

T hr e ad. c ur r e nt T hr e ad0. s l eep( 100);

1catch ( I nt er r upt edExcept i on e)t }

public class Consumi dor implements Runnabl e

i Thr ead h i l o 2 ;

Dat os dt os; public Consumi dor ( Dat os d)

dtos = d;h i 1 0 2 = new Thr ead( t hi s );

hi l o2.s t a r t ( 1 ;

\

public void r u n ( )t

for (int i = O; 1 < 5; i ++)

dt os . qui t ar ( ) ;

tryi

Thr ead. cu r r en tThread( ) . s l eep ( 100) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 334/481

322 Java 2. Manual de programación

El problema que surge ahora es debido a que puede ocurrir que, tras un in-mento del contador por parte delh i l o l , y antes de que éste coloque un nuevodato en la estructura, el planificador decida dejar de ejecutar el productory comen-

zar a ejecutarconsirmidory pase a ejecutarse elh i 1 0 2 , que quita un dato dela posición indicada por el contador, donde aún no hayun dato válido, ydecrementael contador; si ahora vuelve a ejecutarse elh i l o l como ya tenía efectuado suincremento de contadorno lo realiza de nuevo y coloca el dato actualsobrescri-biendouno anterior. Java soluciona este tipo de problemas mediante lasincroniza-ción, usando variables de condición y monitores.. Losmonitores son objetos especiales asociadosa datos que controlan el acceso a

los mismos. Por otra parte, se denominan secciones críticas a aquellos bloquecódigo de un programa que acceden a datos compartidos por hilos de ejecución-

tintos y concurrentes. Cuando, en Java, se marcan secciones críticas con la pareservadasynchr oni zed se asocia un Único monitor alos datos contenidos enellas; de esta forma, durante el tiempo que un hilo permanece dentro de uno de bloques sincronizado,los demás hilos que quieran acceder ai mismoo a cualquierotro sincronizado sobre la misma instancia tienen que esperar hasta queel monitoresté libre, puessólo un hilo puede obtener el monitor sobrelos datos en un instantedado y los hilos que no poseen el monitor no pueden tener ningún tipo de accelos datos con él asociados. Para aplicar todo esto al ejemplo anterior bastaría mconsynchr oni zed losmétodosponer y qui t ar , impidiendo su interrupción:

public synchronized void poner (double d)i

while (contador < a d . l enqt h- 1){

cont ador ++;ad [con tado r ] = d * 1030 + cont ador ;

public synchronized void q u ; t a r í )I

while ( cont ador >= O)i

double d = ad[ c ont ador ] ;ad [con tado r ] = 3;c o n t a d o r - - ;Cyc t em out . pr i nt l n( "Consume " +d) ;

Para que la sincronización sea efectiva, todoslos bloques que acceden alosrecursos compartidos deben estar sincronizados. También hay que tener en cuque, aunquelos bloques sincronizados pueden no ser métodos completos, engene-

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 335/481

Programación concurrente: Hilos de ejecución 323

ral, la mejor opción es que lo sean. Nohay problema en que un hilo llame a unmétodo que accede a datos paralos que ya tiene el monitor.

La sincronización es necesaria en programas donde hay varios hilos que de-sean modificar las mismas fuentes al mismo tiempo; no obstante, puede dar ori-gen a algunos problemas. Imagine que dos hilos de ejecución necesitan el mo-nitor sobre dos estructuras y cada uno coge el monitor para una de ellas, perocomo cada hilo necesita los dos monitores y ninguno puede obtener el que tienecogido el otro, ambos se paran. La solución consiste en que alguno de estos hiloceda voluntariamente el monitor al otro, estas cesiones voluntarias se efec-túan a través de los métodoswai t , not i f y y not i f yAl l de la claseOb] ec t .

En el problemaproductor/consumidoKcitado como ejemplo, si uno de los pro-

cedimientos de monitor descubre que no puede continuar, situación que correspon-dería a los casosarray lleno para productory vacío paraconsumidor,mejor quedormirse por un cierto periodo de tiempo es que dicho procedimiento se bloquee( wai t hasta que el otro le indique que se debe despertary volver a competir porel monitor( not i f y) .

Métodos

public final void wai t ( ) Cuando un hilo en ejecución invoca el métodowai t pasa a una cola asociada al objetoy suejecución se detiene hasta queotrohilo activeel métodonot i f y de ese mismo objeto.

public final void not i f y( ) Es el método por el que un hilo que está ejecu-tandoun método sincronizado puede despertaral primero de la cola asociada ai objeto.

public final void n o t i f y A l l ( ) Convierte enEjecutablestodos los hilos queesperaban en la cola del objeto, aunque sólouno de ellos podrá obtener el monitor.

Resumen:Se denominan secciones críticas a aquellos bloquesde código de un programa que acceden a datos compartidos por hilosde ejecución distintosy con-currentes;si las secciones criticas se marcan con la palabras y n c h r o n i z e dse asocia un único monitor alosdatos contenidos en ellas.

Losmonitores son objetos especiales asociados a datos que controlan el acce-

soa los mismos, ya quesólo unhilo puede obtener el monitor sobrelosdatos enuninstante dado. Un hilo puede ceder voluntariamente el monitor al otro a tra-vésdelosmétodosw a i t , n o t i f y y n o t i f y A l 1 d e l a c l a s e O b j e c t .

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 336/481

324 Java 2. Manual de programación

Ejemplo

public class Pr i nc i pal s 2L

public static void pai n ( St r i ng[ ] a r g s )

Dat os2 d = new Da t o s 2 0;Proauc to r2 p = new Pr oduc t or 2( d) ;Consumi dor 2 c = new Consumi dor 2 ( d );

1

public class Dat os2

double[: ad;int conzador = - 1; public Dat os2 ( )

tad = new doubl e [ 4; ;

public synchronized void poner ( double d)

while ( cor . t ador >= ad. l engt h- 1)

/ * debe est ar en un bucl e w h i l e , no en un i f ,por si en l a ci gui enze l l amada se r epi t e el pr obl ema,por ej expl o a causa de un n o t i f y A l l ( )* /

W a l t ( ) ;

catch ( I nt er r upt edExcept i on e)t }

while (contador < aa. 1eng: h- 1)cont ador +*;ad[ cont ador l = d*1000 cont ador ;

i

not i f y ( ) ;

public synchronized void qui t ar ( )!

while ( cont ador < O)t

t=Yt

wai t ( ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 337/481

Programación concurrente: Hilos de ejecución 325

icat ch I nt er r upt edCx cept i one)t i

i

whi l e (contaacr >= 3)

doubl e d=ad [ cont ador j ;

cont ador - - ;Cys t em o, t . pr i ?, t l n “ C c ~c - me+d) ;

not i f y ( ) ;

I

publ i c cl ass Productor2 i mpl ement s Runnabl eI

Thr ead h i l o l ;Dat os2 dt os ;i nt Rum = O;publ i c P r o d uc ~o r 2( Dat os2 d)t

dtos = d;h i l o l = new Thr ead( t hi s );h i l o l .s t a r t ( ) ;

publ i c voi d r u n 0t

for ( i nt : = O ; i < 3 ; i t + )

dt cc . po ner ( i );

publ i c cl ass Consumi dor 2 i mpl ement s Runnabl ei

Thr ead hi l o2;Dat os2 dt c s;publ i c Consum dor 2( Dat os2 d)

dtos = d;hi l o2 = new Thr ead( t hi s );

hi l o2.star: ( 1 ;

publ i c voi d r u n ( )

for ( i n t i = O; 1 < 3 ; i ++)I

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 338/481

326 Java 2. Manual de programación

ci t os . qui t ar ( );1

12.8. ANIMAClONES

Un upplettrabaja con animaciones cuando efectúa unapresentaciónsucesiva deimágenes, cada una con pequeñas diferencias con respecto a la anterior, danla apariencia de movimiento. Estasapplets,además de dibujar las imágenes,deben poder responder a las acciones del usuario, por lo que las animac

deben ejecutarse como hilos independientes que no obstaculicen otras tareahilos deben detenerse cuando se sale de la página Web en la que reside elapplet.Para todas estas tareas:

El uppletimplementará la interfazRunnabl e, que se encargara de reali-zar las tareas de dibujo. Por ejemplo:

public class Rebot a extends Appl et implements Runnabl e,MouseLi st ener

public void run ( )i

. . .

. . .r epai nt ( ) ;

. . .

Se sobreescribirán los métodoss t a r t y s t o p delappletcon el código ade-cuado para convertir enEjecutablesy Muertoslos hilos que hayan podidocrearse. Por ejemplo:

public void s t a r t 0{

if ( hi l o == null)i

hi l o = new Thr ead( this ) ;

hi l o. s t ar t 0 ;

En s t o p se asignan u l l al/los hilo/s para que se puedan recolectar susrecursos cuando se abandone la página Web en la que elappletreside.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 339/481

Programación concurrente: Hilos de ejecución 327

Por ejemplo: public void s t o p ( )

hi l oc top ( ) ;

public void hi l oc top ( )

ej ecut abl e = false;hi l o = null;

Lógicamente, las animaciones pueden ser efectuadas por cualquier programaJava conGUI,no es necesario que se trate de unapplet.

Nota: Noconfunda los métodoss t a r t y st op de los hilosy de lasupplets.El métodostop para hilos está obsoleto.

Recuerde: Las animaciones deben ejecutarse como hilos independientes paraque no obstaculicen la simultánea realización de otras tareas.

12.9. DOBLEBUFFER

Una técnica muy empleada en las animaciones con la finalidad de reducir el parpa-deo es el doblebuffer. Esta técnica permite que, mientras se presenta un imagen en pantalla (primerbqfler),también puede tratarse de textoo gráficos, se pueda ir ela- borando en memoria la imagen siguiente (segundobqffer).Eldoblebufferrequiere:

La creación de un objetoImage vacío, que actúa como buffer. El método aemplear pertenece a la clasej a v a .awt .Component :

public j av a, awt . I mage cr eat eI mage ( in t pl , int p 2 )

dondepi y p2 sonla anchura y altura de la misma. Por ejemplo

i magen = c r ea t ehage ( ANCH0, ALTO) ;

Obtener un contexto gráfico para dibujar la imagen en segundo plano, con elsiguiente método de la clasej ava .awt . Image:

public abstract j av a. awt . Gr aphi c e g et Gr a ph i c s 0

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 340/481

328 Java 2. Manual de programación

Por ejemplo,

cont ext oGr af = i ma ge n. ge t Gr a phi c c 0 ;

Mostrar el contenido del buffer mediantedr awI magede j ava .awt . Gr aphi cs

p u b l i c abstract boolean dr awI mage( ~ava. awt . I magep l , i n t p 2 ,i n t p3, j ava . awt . i mage. I mage0bser ver p 4 )

en donde el primer parámetro es la imagen a dibujar,los dos siguientes son lascoordenadas para la esquina superior izquierda de la mismay el cuarto es elobservador. Por ejemplo,

g .ar awi mage ( i magen, O, O, t h i s ) ;

Pero tenga presente quedr aw I mage tiene otros muchos formatos medianlos cuales puede ser invocado.

Ejercicio

Pelota que rebota enlos bordes de unupplet;su movimiento se puede detenery

reactivar efectuando clics con el ratón sobre en cualquier posición del(Fig.12.1).

/ / Ej empl o de ani maci ón y dobl e buf f er .

impor t ; ava. awt . * ;impor t j ava. awt . event . * ;impor t j ava. appi et . * ;

p u b l i c class Rebot a e x t e n d s Appl et implements Runnabl e,MouceLi s t ener{

p u b l i c f i n a l i n t ANCHO= 2 0 0 ; p u b l i c f i n a l i n t ALTO = 100;f i n a l i n t TMI N= 2 5 ;i n t act ual = TMI N;i n t px = O ;i n t p y = O ;i n t dx = 1;i n t dy = 1;

boolean e2ecut abl e = t r u e ;Ts r ead hi i o = n u l l ;I mage i magen;Gr aphi cs cont ex t oGr af ;

p u b l i c v o i d i n i t ( )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 341/481

Programación concurrente: Hilosde ejecución 329

Ir es i z e ( ANCH0, ALTO) ;

/ * La pel ot a sal e de una posi ci ón al eat or i a e?. ;a p a r z esuperior del applet * /

i n t r ango = ANCHO- TMI N;px = ( i n t ) ( Mat h . r andom0 * r ango) ;tryi

i magen = cr eat eI mage ( ANCH0, ALTO) ;

cont ext oGr af = i ma ge n. ge t Sr a phi c s 0;Icat ch ( Except i on e)t

cont ext oGr af = nul l ;1addMouseL i s t ener ( t hi s ) ;

\

publ i c voi d st ar t ( )i

i f ( hi l o == nul l )i

hi l o = new Thr ead( t hi s ) ;

hi l o. st ar t ( ) ;

publ i c voi d s t o p ( )I

hi l ost op ( ) ;

Ipubl i c voi d r u n ( )i

whi l e ( hi l o ! = nul l )I

i f ( ej ecut abl e)t

i f ( px + act ual > ANCHO I I px < 0)

i f ( py + act ual > ALTO 1 1 py < O)dx *= - 1;

dy *= - 1;px = px + dx;P Y = PY + dy ;t =Y

hi l o. s l eep( 10 ) ;

1cat ch( Except i on e )

i }

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 342/481

330 Java 2. Manual de programación

r egai nt ( 1 ;

ni i c = null;

public void hi l oct . op( )

ej ecut abl e = false;h i l c = null;

public void hi l os us pend( )

el ec ut abl e=

false;

public void hi l or esume ( )

e ec ur a bl e = true;

public void upda t e ( Gr agh i cs g )

pai r t ( g ) ;

public void pai nt ( Gr aphi c s g )

if c c p t e x t o s r a f ! = null )

t

di buj a ( c ont ex t c Gr af ) ;

g. ci r aw rnage( i magen, O, O, this ) ;

elsed i b u j a ( g ) ;

public void diCu 1 a ( Gr aphi cs g )

y. s et Col or ( Col or.gray) ;

g. f i l LRect( O, O, ANCEG, ALTG) ;

g. s et c oi or ( C o l o r . r e d ) ;

y. f i l , Oval ( px, py, acz, al , ac t ua- );

public void mousePr ecced ( YouseEvente)

if ej ecut abl e )

else

e ~e c u ~a b l e= ! ej ecut abl e;

hi l or esume( ) ;

hi l os l s pend( 1;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 343/481

Programación concurrente: Hilos de ejecución 331

1

public void r n o u c e R e l e a c e d ( M o u c e E v e n t e){ I

public void mouseEnt er ed ( MonseEvente)1 1

public void r nouseExi t ed ( MouceEvente)t i

public void mousecl i cked( MouseEvent e)I }

Unas Últimas aclaraciones: enel ejemplo expuesto, el métodorun se encarga deobtener la posición donde la pelota ha de ser dibujada,de forma que se consigasurebote en los bordes del apple t, y manda que se redibuje. Cuando se presiona elratón,mousepr es s ed detieneo activa alternativamente la ejecución del hilo.

El archivoRebot a. h t m creado es el siguiente:

Ar ch ivo HTML (Rebota.htm)

<HTML><HEAD></ HEAD><BODY>

<appl etcode=Rebot a. cl ascname=Rebot awi dt h=200hei ght =100 >

</ appl et ></ BODY></ HTML>

Applet started 1 Applet started IAppletstarted I~~ _ _ _ _

Figura 12.1. Applet ViewermuestraRebot a, cl as s.

Compilación

C: l i br o\ Temal 2>j avacRebot a. 3ava

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 344/481

332 Java 2. Manual de programación

Ejecucion con appietviewer

C: \ i i br o \ Te~a 12>a ppl et v i ewe rRebo t a . ht m

EjercicioEl siguienteappletque muestra el funcionamiento del método de ordenación de-minadométodode la burbuja.Esteapplet presenta dos botones; uno permite lageneración de un nuevo array aleatorio de números enterosy el otro lanza unhiloque efectúa la ordenación del mismo (Fig. 12.2). Cada número entero contenel array se representa ensucorrespondiente posición mediante un gráfico de barrdonde la altura de la barra se corresponde con el valor del número. El procordenación aparece paso a paso, pudiéndose apreciar en cada momentolos inter -

cambios que se van efectuando(Figs.12.3 y 12.4).

Figura 12.2. Situación inicial

El appletdiseñado es:import j ava. awt . * ;import l ava. awt . event . * ;import j ava. appl et . * ;import j a v a . u t i l . * ;/ * Se ut i l i za l a cl ase Random, per t eneci ent e a j ava. ut i 1, par a

l a gener aci ón de númer os al eat or i os * /

/ * Cl ase que per mi t e l a or denaci ón gr áf i ca de un ar r ay de

enteros por el mét odo de Bur buj a * / public class Or denaci onGr af i caextends Appl et implements

Act : onL s t en e r , RLIn nab1e

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 345/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 346/481

Java 2. Manual de programación

i magen =

cont ext oGr af =

= null;

public void s t o p ( )

hi l os t op ( ) ;

public void g

if( cont ext oGr af ! = null )

di buj a ;

g . ( i magen, O O,this ) ;

else. di buj a( g

public void g

public void di buj a ( Gr aphi cs

g. ( Col or .gray) ;

for (int = O;;

/ * Cont r ol de Event os.Al pul sar el bot ón se gener a un nuevo ar r ay y sei nt er r umpe cual qui er or denaci ón que se est uvi er a l l evandoa cabo.Al pul sar el bot ón comi enza el pr oceso de ordena -ci ón t r as l a cr eaci ón de un nuevo ar r ay y no ocur r e nada

el ar r ay ya se est aba or denando.Una vez empezado el pr oceso de or denaci ón o se gener a unnuevo ar r ay o hay que esperar a que di cho proceso t ermi ne

public void e)

if ==

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 347/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 348/481

336 Java 2. Manual de programación

r e t u r n ( a );

I/ / Mét odo para l a r epr esent aci ón de un entero en su posi ci ón i

p u b l i c v o i d di buj aEnt ( Gr aphi csg , i n t h, i n t i )i n t x = xI ni + i * xSep;i n t y = yI ni - h;i n t w = Anchur adeBar r a;g. set Col or ( co1or deBar r a) ;g. f i l l Rect ( x, y, w, h) ;

AOOletstarfeu I

Figura 12.3. Fase intermedia del proceso de ordenación, se observa cada intercambio

Figura 12.4. Array ordenado.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 349/481

Programación concurrente: Hilos de ejecución 337

El archivoOrd .h t m tiene el siguiente contenido:

Archivo HTML ( Or d.ht m)

<HTML><HEAD><TI TLE>Pr oces ode or denaci ón en el mét odo de l a Bur buj a</ TI TLE></ HEAD><BODY>

<appl etcode=Or denaci onGr af i ca . c l assname=Or denaci onGr af i cawi dt h=640hei ght =400 >

</ appl e t ></ BODY></ HTML>

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 350/481

II

Maneio

deexcepcionesCONTENIDO

13.1. Conceptos generales.13.2. Manejo de excepciones.13.3. Capturay tratamiento de excepciones.13.4. Lanzar la excepción.13.5. Declarar la excepción.13.6. Elbloquef i n a l l y.13.7. Creación de excepciones.13.8. Métodos de la clase Thr owabl e.

339

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 351/481

340 Java 2. Manual de programación

Las excepciones son objetos que describen y permiten controlarerrores y problemas inesperados en el funcionamiento de un pro -grama sin oscurecer el diseño del mismo, y se manejan por un

código especial que no sigue el flujo normal de ejecución de dichoprograma. Elcompilador obliga al manejo de algunas excepciones,mientras que para otras esto será potestativo del programa. Java,además de proporcionar múltiples clases de excepciones, permitecrear nuevos tipos para que respondan a una anomalía en el fun -cionamiento de un programa sobre la que los usuarios deban serinformados. En este capítulo se explica la captura, tratamiento,declaración, creación y lanzamiento de excepciones y se comen -tará su importancia e inexcusable uso en algunas ocasiones, porejemplo en operaciones con archivos.

13.1. CONCEPTOS GENERALES

Todos los tipos de excepción son subclases de Thr owabl e y, como se puedeobservar en el esquema de la jerarquía de clases (Fig.13.1), por debajo de Thr owabl e hay dos clases,Error y Except i on, que dividen las excepcio-nes en dos ramas distintas.

Las excepciones de la claseError abarcan fallos graves de los que los pro-gramas no pueden recuperarse y, por tanto, no suelen ser capturadas mismos.La claseExcept i on abarca las excepciones que los programas suelen ca-rar; tiene varias subclases, entre las que destacanRunt meExcepti on,I OExcept i on e I nt er r upt edExcept i on.

- Runt meExc epti on comprende errores en tiempo de ejecución que producen al efectuar operaciones sobre datos que se encuentran en la-ria de la computadora, se subdivide en diversas subclases entre ladestacanAr i t hmet i cEx cept i ony Nul l Poi nt er Exc ept i on,ambas pertenecientes al paquete j ava .l ang, como casi todas lasRunt i meExcept i on, y disponibles en todos los programas ya que e paquete se importa automáticamente.

- I OExcept i oncomprende los errores deentrada/saliday pertenece al paquete j ava . i o .

- I nt er r upt edExcept i on, de cuyo tipo son los errores debidos a linterrupción de un hilo de ejecución porotro, pertenece también a j ava .l ang.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 352/481

Manejo de excepciones 341

Además de disponer de todas estas clases, es posible extender la claExcept i on o sussubclases y crear nuevos tipos de excepciones que respondanauna anomalía en el funcionamiento de un programa sobre la cual deben ser in-mados los usuarios, aunque hay que tener en cuenta que no es conveniente utillas excepciones como un método alternativo para especificarflujode control.

Importante:Todos los errores que se pueden originar en un método, excepto losde tipoError y Runt i meExcept i on, hay que declararlos en una cláusulat hr ows o bien capturarlos y tratarlos dentro de ese mismo método.Losproga-mas no están obligados a capturar ni declarar las excepciones del tipoRunt i meExcept i on.

Throwable

Error

Exception

Interrupted ExceptionRuntimeException

ArithmeticExceptionIlLegalArgumentExceptionr NumberFormatException

1~~ IndexOutOfBoundsException

I

StringlndexOutOfBoundsException ArraylndexOutOfBoundsException...NullPointerExceptionILegalMonitorStateException

...- IOException

FileNotFoundException

, ...EOFException- AWTException

Figura 13. . Excepciones,

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 353/481

342 Java 2. Manual de programación

Dada la obligatoriedad impuesta por el compilador con respecto a la cade algunas excepciones, hace ya tiempo que se viene utilizando código para la de las mismasy se ha visto ya que para capturar excepciones basta con escribir el c-

go que se quiere controlar en un bloquet r y y especificar la excepción que se deseacapturar en una cláusulacat ch. Así,si escribe el siguiente programa, el compiladole obligará a modificarlo y capturar, de la forma especificada, la excepI OExcept i on que por la operación de lectura pudiera haber sido genera

Ejemplo

El programa siguiente pide la introducción por teclado de un número enten,comprendido entre1 y 2O ; a continuación, muestra las sucesivas potencias de2

desde2 elevado a hasta2 elevado an .

import p u b l i c c l a s s

p u b l i c s t a t i c vo id mai n ( St r i ng ar gs

I nput St r eamReader = newBuf f er edReader br = newSt r i ng cadena;i n t n = O ;

un numer o ent er o ent r e 1 y 20cadena =

n = I nt eger ( cadena)i n t = 1;while

= ) ;

Si lo modifica de la siguienteforma, el compiladorlo aceptará y funcionarácorrectamente cuando introduzca números enteros en el rango indicado, peruna excepción si teclea una letra en lugar de un númeroo pulsaR ETUR N (I NTR O) sinintroducir nada.

Ejemploimport . *

p u b l i c c l a s s

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 354/481

Manejo de excepciones 343

public static void r a i n ( C r r L r gargs [ ] )

!I nput St r eamReader i s r = new I n p u t S t r e a m R e a s e r ( C y s = e m . ; n ) ;Buf f er edReader br = new Buf f er edReader ( i c r ) ;/ * se hace necesar i a l a i ni c i al i z aci ón de l a cadena,

debi do a que l as i nst r ucci ones en el CLoque t r y pasr i a?.no ser ej ecut adas , per o ser i a i gual i n2ci al i z ar l a a I '

* /St r i ng cadena = " C" ;int n;Sys t em out . pr i nt ( "Deme un númer o ent er o ent r e 1 y 2C " ) ;

t=YI

cadena = br .r eadLi ne( ) ;

1

catch ( I OExcept i on e)t }n = 1nt eger . par seI nt ( cadena) ;

int i = 1;while ( i <= n)

Sys t em out . pr i nt l n ( " 2 "̂ +i +" = " +Mat h. pow( 2 , ) ;

I f f ;

II

I

importante: Nose puede garantizar que las sentencias siguientes a un deter -minadoca tch vayana ser ejecutadas.

13.2. MANEJO DE EXCEPCIONES

Las operaciones que se pueden realizar con excepciones son: capturay tratamiento(manejo), lanzamientoy declaración.

13.3. CAPTURAY TRATAMIENTO DE EXCEPCIONES

Para capturar una excepción, se escribe el código que se quiere controlar en un b-quet r y ; se especifica la excepción que se desea capturar en una cláusulac a t c h yse coloca el tratamiento para la misma en el bloquec a t c h . La cláusulac a t c h con-siste en la palabra reservadac a t c h , seguida por el tipo de excepción que se deseacapturary un nombre de parámetro encerrados entre paréntesis. El conjuntot r y / c a t c h no se puede separar con sentencias intermedias.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 355/481

344 Java 2. Manual de programación

Nose debe colocar una estructurat r y / c a t c h para cada una de las instruccio-nes deun programa que pueda lanzar una excepción, sino agrupar las que estén-cionadas enun único bloquet r y. En estos casos, es decir, cuando las sentenciaencerradas enun bloquet r y pueden producirmásde una excepción, es posible poner varias cláusulascat ch consecutivas; permite efectuar un tratamiento distin-to para cada una de las excepciones. La búsqueda de la excepción originada s-tuará secuencialmente en cada una de lasclaúsulascat ch, por tanto no se debecolocar una claúsulacat ch que capture excepciones de una superclase antes dotra que capture las de una desussubclases.

Ejemplo

Modificar el ejercicio de las potencias de modo que no se produzca una interrsi se teclea una letra en lugar deun númeroo se pulsaR ETUR N (INTRO) sin introdu-cir nada.

import j a v a . i o . * ; publ ic c l a s s E j empl o3

publ ic s t a t i c void mai n ( St r i ng a r g s [ ] )

I nput Ct r eamReader i c r = new I nput St r eamReader ( Sy s t em i n) ;

Bcf f er edReader b r = new Buf f er edReader ( i s r );i n t n = O ;Sy s t em out . pr i nt ( " Demeun númer o ent er o ent r e 1 y 20 " ) ;

t r yi

St r i ng cadena = b r. r eadLi ne( ) ;

n = I nt eger . par s eI nt ( cadena) ;

catch ( I OExcept i on e){/ / t r at ami ent o 11catch ( Nur nber For mat Except i one){/ / t r at ami ent o 2

i n t i = 1;while ( i <= n)

Sys t em out . pr i nt l n( " 2 ^ " + 1 + " = " t Mat h . pow( 2 , ) ) ;

i t +;

Otra posibilidad para resolver este problema de las múltiples excepciones -radas en un bloquet r y, es utilizar una claúsulacat ch que capture excepciones de

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 356/481

Manejo de excepciones 345

una superclase que englobe todos los tipos de excepciones que, por las instruccio-nes incluidas ent r y, pueden ser generadas y utilizari nst anceof para determi-nar el tipo de excepción.

Ejemplo

Dado que la claseExcept i on engloba las excepciones a considerar enlosejem- plos I a 3 ya explicados, para capturar las citadas excepcionesI OExcept i onyNumber For mat Except i on podría escribirseel código de la siguiente manera:

import j ava. i o. * ;p u b l i c c l a s s Ej empl o4t

p ub l ic s t a t i c v oi d mai n ( St r i ng ar gs I )

I nput St r eamReader i s r = new I nput St r eamReader ( Sys t em i n) ;Buf f er edReader br = new Buf f er edReader ( i s r );

St r i ng cadena;i n t n = O;Sys t e m out . pr i nt( "Deme un númer o ent er o ent r e 1 y 20 " ) ;

t=Yt

cadena = br .r eadLi ne( ) ;

n = I nt eger . par s eI nt( cadena) ;

1catch ( Except i on e)i

if ( e instanceof I OExcept i on)

e l se i f ( e instanceof Number For mat Except i on)Syst em. out . pr i nt i n( "Er r or de ent r ada/ c al i da" ) ;

Sys t e m out . pr i nt l n( "No t ecl eó un númer o ent er o ") ;

1i n t i = 1;while ( i <= n)i

Sys t em out pr i nt i n ( "2 "̂ +i +"= " +Mat h. pow( 2, ) ;

i ++;1

13.4. LANZAR LA EXCEPCIÓN

Una claúsulacat ch puede recibir una excepcióny, en lugar de tratarlao despuésde hacerlo, volver a lanzarla mediante una instrucciónt hr ow.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 357/481

346 Java 2. Manual de programación

Ejemplo

Modificando levemente el ejemplo anterior, puede utilizarse también en el p-te caso. La modificación consiste en la creación de un método de lectura qu- pues de su tratamiento, lanzala excepciónNumber For mat Except i on.

import j ava. i o. * ; public class Ej empl o5

t

public static int l eer ( )

iI nput St r eamReader i s r = new I nput St r eamReader ( Sys t em i n) ;Buf f eredReader br = new Buf f er edReader ( 1s r ) ;St r i ng cadena = I ' ;

int n = O;tryi

cadena = br. r eadLi ne( ) ;

n = 1nt eger . par seI nt ( cadena) ;

1catch ( I OExcept i on e){ )cat ch( Number For mat Except i one)i

Sys t e m out . pr i nt l n( " 1) ¿Tecl eó sol o return? " ) ;

throw ( e );

1return n;

1

public static void mai n ( St r i ng ar gs [ ] )

iint n = O;Sys t em out . pr i nt ( "Demeun númer o ent er o ent r e 1 y 20 ' I ) ;

try

{ n = l eer ( ) ;

cat ch( Number For mat Except i one)

Sys t e m out . pr i nt l n( " 2 )¿Tecl eó una l et r a o un r eal ? ") ;

1int i = 1;while ( i <= n)i

Sys t em out . pr i nt l n ( " 2A" +i t "= " +Mat h. pow( 2 , ) ;

i ++;1

1

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 358/481

Manejo de excepciones 347

13.5. DECLARAR LAEXCEPCIÓN

Las excepciones pueden no ser tratadas (manejadas), posponiendo su tratamiento para que sea efectuado por el método llamador, pero cuando no pertenecen a la claseRunt i meExcept i o n , es necesario listar los tipos de excepciones que se pasan enla cabecera del método. En general las excepcionesR u n t i m e E x c e p t i on debencapturarse en el método donde se han producido; en caso contrario serán tratadas por el bloquet r y del método invocadormás próximo que capture dicha excepcióny sin necesidad de ser listadas en la cabecera del método.

Ejemplo

En este casol e e r no efectúa ningún tratamientoy, como se puede observar, sehace necesario listar laI OExcept i on en la cabecera del método.

import j ava. i o. * ; public class Ej empl o6

public static int l eer ( ) throws I OExcept i onI

I nput St r eamReader i s r = new I nput St r eamReader ( Syst em i n) ;Buf f er edReader br = new Buf f er edReader ( i s r ) ;St r i ng cadena = ;

tryt

cadena = br . r eadLi ne( ) ;

return I nt eger . par seI nt ( cadena);1

finallyt i

1

public static void mai n ( St r i ng ar gs t l )i

int n = O;Syst em out . pr i nt ( " Demeun númer o ent er o ent r e 1 y 20 ' I ) ;

Itry

n = l eer ( ) ;

1catch ( I OExcept i on e)i }catch ( NumberFor ma Excep t on e)i

1int i =l ;

while ( i <= n)

Syst em. out . pr i nt l n " ¿Tec l eósol o ret ur n? ") ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 359/481

348 Java 2. Manual de programación

SySt em out . pr i nt l n ( " 2" " +i +"= " +Mat h. pow( 2, ) ) ;

i ++;

Hay que tener en cuenta que el bloquet r y no puede aparecersólo, porlo que,al no ser necesario ninguna claúsulacat ch, se ha de colocar una cláusula y bloquf i n a l l y .

f i n a l l y

I }

13.6. EL BLOQUEfinally

Cuando no se produce ninguna excepción en un método y también cuando -duce pero es capturada, la ejecución continúa en la sentencia siguiente acat ch,excepto si se fuerza a otro tipo de abandono mediante instrucciones comor et ur n,br eak o cont i nue. Cuando la excepción no se captura, la búsqueda de laclaúsu-la cat ch adecuada para la captura dela excepción lanzada continúa porlosrestan-tes métodos en orden inverso a como fueron efectuadas las llamadas. Por tase puede garantizar que las sentencias siguientes a un determinadocat ch vayan aser ejecutadas.

Ejemplo

Comparelossiguientes códigos. En el primer caso, las instrucciones Siguienteloscatch se ejecutan Únicamentesiocurre una excepción.En el segundo caso, por las

instrucciones siguientes alos catch en el método leer no pasa ni cuando todo ecorrectoni cuando se produce unaNumber For mat Except i on.import j ava. i o. * ;p u b l i c c l a s s Ej empl o7t

p ub li c s t a t i c i n t l eer ( )

iI nput St r eamReader i s r = new I nput Ct r eamReader ( Sys t em i n) ;Buf f er edReader br = new Buf f er edReader ( 1s r ) ;St r i ng cadena = " ' I ;

t ry

cadena = br . r eadLi ne( ) ;

return I nt eger . par s eI nt ( c adena) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 360/481

Manejo de excepciones 349

/ / cuando t odo es cor r ect o sal e1ca tch ( I OExcept i on e)oc a t c h ( NumberFor mat Excep t i on e )i i

/ / I nst r ucci ón si gui ent e a cat chSyst em. out . pr i nt l n( "Pasa sol o cuando ocur r e excepci ón " ) ;

re tu rn O;

p u bl i c s t a t i c v o i d mai n ( St r i ng ar gs [ I )i

i n t n = 0;Sys t e m out . pr i nt ( "Deme un númer o ent er o ent r e 1 y 20 ' I ) ;

n = l eer ( ) ;

i n t i =l ;whi le ( i <= n)

fSys t em out . pr i nt l n ( " 2" " +i +"= " +Mat h. pow( 2, i ) );i t + ;

1

import j ava. i o. * ;p u b l i c c l a s s Ej empl o8t

p ub li c s t a t i c i n t l eer ( )i

I nput St r eamReader i s r = new I nput St r eamReader ( Sys t em i n) ;Buf f er edReader br = new Buf f er edReader ( i s r );

St r i ng cadena=

;t ryI

cadena = b r. r eadLi ne ( ) ;

re tu rn I nt eger . par seI nt ( cadena) ;1ca tch ( I OExcept i on e)I 1/ / I nst r ucci ón si gui ent e a cat chSys tem out . pr i nt l n( "No pasa cuando no hay er r or ni " +

re tu rn O;"cuando sepr oduceunNumber For mat Except i on" ) ;

p ub li c s t a t i c v o i d mai n ( St r i ng a r g s [ ] )I

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 361/481

350 Java 2. Manual de programación

i nt n = O;Sys t em out . pr i nt ( " Demeun númer o ent er o ent r e 1 y 20 " ) ;

t =Yi

1cat ch( Number For mat Except i one)I }i nt i = 1;whi l e ( i <= n)i

n = l eer ( ) ;

S y s t e m . o u t . p r i n t l n ( 2 ^ + i + = " +Mat h. pow( 2, i )) ;

i ++;1

1I

Nota:El bloquefinally sirve para colocar en él instrucciones que se desese realicen siempre que se sale de un bloquet r y y es opcional, pero pasa aser obligatorio cuandoun bloquet r y no va seguido por ninguna claúsulacatch ya que, como sedijo,el bloquet r y no puede aparecersolo.

El formato general es:

try1

}cat ch( Ti po- de- excepci oni dent i f i cador )

i1/ / ot r os cat ch s i l os hubi er af i nal l y{

1

. . .

. . .

. . .

Las instrucciones colocadas en el bloquef i n a l l y se realizan siempre quese

sale del bloquet r y : tantosi se ha producido una excepcióny se ha capturado,como si no se ha capturado, comosi no se ha producido la excepción, comosi seha salido del bloquet r y con r e t u r n , b r e a k o c o n t i n u e . No resulta, pues,adecuado poner en un bloquef i n a l l y sentencias que asu vez puedan produ-cir nuevas excepciones.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 362/481

Manejo de excepciones 351

Ejemplo

Aunque el tratamiento de archivos se verá en el capítulo siguiente, dado que eltnanejo de excepciones es muy importante en el trabajo con archivos,semuestra acontinuación el control de excepciones enun programa diseñado para comparar dosarchivos especificados mediante la línea de órdenes. Para comprender la imple-mentación efectuada se necesita conocer quelosargumentos pasados en la línea deórdenes a un programa se reciben por el métodomain y se almacenan en el arrayunidimensional de tipos t r i ng que dicho método especifica siemprecomo pará-metro.

public static void mai n ( St r i ng ar gs [ I )

Los argumentos escritos a continuación del nombredel programa se separanunos de otros por un espacio en blanco y Java almacenará el primero de ellos ena r g s [ O] , el segundo ena r g s [ 1 , y así sucesivamente.El programa compara losarchivos, efectuando una lectura secuencia1 de ambos y comprobando la igualdadentrelo que va leyendo de cada uno de ellos. Se detiene cuando encuentra algunadiferenciao uno delosarchivos termina.

La claúsulat r y inicial prueba de forma agrupada diversas excepciones que se pueden producir en el programa. No obstante, en el caso de que la excepción seagenerada por no encontrarse el archivo, conviene identificar cuál delosdos archi-vos pasados como parámetros es el que no ha sido encontrado, por tanto se colo-can dentro delt r y anterior otros dos bloquest r y que permitan identificar cuálde ellos ha sido la causa. La instrucción de cierre de archivo debe aparecer en el boquef i nal l y para que siempre sea ejecutaday como lanza unaI OExcept i onésta vuelve a ser capturada. La llamada al programa debe efectuarse de la siguien-te forma:

C: \ l i br o\ Temal 3>j av aCompAr ch a . t x t b . t x t

Una llamada sin parámetros produce la salida siguiente:

C: \ l i br o\ Temal 3>j av aCompAr chLa l l amada debe ser : j ava CompAr ch ar chi vo1 ar chi vo2

Otros casos considerados son aquellos en los que algunoo ambos archivos noexisten.

import j a v a . i o . * ;class CompAr chI

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 363/481

352 Java 2. Manual de programación

public stat ic void mai n ( St r i ng ar gs [ ] )l

int i = O, j = O;Fi l eI nput St r eam f l = nuii;

Fi l eI nput Ct r eam f 2 = null;

tryt

/ / Abr e el pr i mer ar chi vo

tryi

/ / Exc epc i ónpor apertura del ar chi vof l = new Fi l eI nput Ct r eam( args[ O ] ;

1c a t c h ( F i 1 e N o t F o u n d E x c e p t i o n e)t

1Cys t em out . pr i nt l n(args [ O] + 'I Ar chi vo no encont r ado") ;

/ / Abr e el segundo ar chi vo

tryI

f 2 = new F i l eI nput Ct r eam( ar gc [ 11);

cat ch( Fi 1eNot FoundExcept i one)I

Sys t em out . pr i nt l n(args l ] + Ar chi vo no encont r ado" ) ;

i

/ / Compar a l os ar chi vos

dot

/ *Las excepci ones gener adas en l a l ect ur a se capt ur an

i = f l . r e a d0; j = f 2 . r ea dO;if ( i ! = j ) break;

por el t r y ext er no * /

Iwhile(i ! = - 1 & & j ! = - 1 ) ; / / f i n de ar chi vo

i f ( i ! = j )

elseSys t em out . pr i nt 1n( "Los ar chi vos son di f er ent es. ") ;

Sys t em out . pr i nt l n( "Los ar chi vos son i gual es. I ) ;icatch ( I OExcept i on e)t

Sys t em out . pr i nt l n( "Error") ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 364/481

Manejo de excepciones 353

Ic a t c h ( A r r a y I n d e x O u t 0 f B o u n d s E x c e p t i o n e)i

Cys t em out . pr i nt l n( "La l l amada debe ser : "+" j ava CompAr ch ar chi vo1 ar c hi vo2" );

1cat ch( Except i on e)I

}f i n a l l yi

/ / ] ava. l ang. Nul l Poi nt er Except i on

tryi

/ * el ci er r e de a r c h i v o no debe col ocar se en elant er i or bl oque t r y pues pudi er a no ej ecut ar se.La oper aci ón de ci er r e l anza una excepci ón que hayque tratar * /

i f ( f l ! = nul l )f l . cl os e0 ;

cat ch ( I OExcept i on e)i1

tryt

i f ( f 2 ! = nul l )f 2. c l os eO;

1cat ch ( I OExcept i on e)t }

I

Nota: Losargumentos pasados en línea de comandos a un programa se reci- ben porel método main y se almacenan en el array unidimensional de tipoString que dicho método especifica siempre como parámetro. Cuando sellamaal programa sin parámetros, la posterior referenciaa los mismos originauna excepción del tipo Array I nde Out Of Bounds Ex cep t i on.

13.7. CREACIÓN DE EXCEPCIONES

En Java es posible definir nuevas excepciones específicas para una determinada situ-ción, que se usarán para detectar anomalías en el funcionamiento de una aplicació

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 365/481

Java 2. Manual de programación

Para crear una excepción se define una subclase deExcept i on que implementeun constructor conun parámetro de tipoSt r i ng y sobreescriba el método

de clase Thr owabl e. Hay que tener en cuenta que la clase

Except i on nodefine ningún método,sóloheredalos definidos por Thr owabl e.

Ejemplo

Creación de una nueva excepción.

c l a s s NuevaExcp extends Except i on!

St r i ng mensaj e;

public NuevaExcp ( St r i ng

mensaj e = causa;

public St r i ng

return mensaj e;

Para usar la nueva excepción la aplicación crearáy lanzaráun objeto de ese tipocuando se cumpla una determinada condición. Como en cualquier otro caexcepción deberá ser capturadao declarada escribiendosu tipo en la cabecera delmétodo que la lanza precedido por la palabra reservadat hr ows. Si se lanza desdemai n el tratamientono se podrá posponery habrá que capturarla.

Ejemplo

Esta aplicación que usa nueva excepción( NuevaExcp) .La excepción se lanzay captura enmai n. El ejemplo lanza la excepción siempre, aunquelonormal seríaque ésta sólo se lanzara cuando ocurriera algún motivo.

p ub l i c c l a s s Ej empl o9

pu b l i c s t a t i c vo id mai n ( St r i ng ar gc)

/ / se l anza si empr ethrow new motivo " ) ;

catch ( NuevaExcp e)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 366/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 367/481

356 Java 2. Manual de programación

Ejemplo

El problema de las Torres de Hanoi es un problema clásico de recursión. Se tien

torresy un conjunto de discos de diferentes tamaños. Cada disco tiene una pe-ción en el centro que le permite ensartarse en cualquiera de las torres.Losdiscoshan de encontrarse siempre situados en alguna de las torres. Inicialmenteestán en la misma torre, ordenados de mayor a menor, como se muestra en e-

jo. Se debe averiguar los movimientos necesarios para pasar todoslosdiscos a otratorre, utilizando la tercera como auxiliary cumpliendo las siguientes reglas:

En cada movimiento sólopuede intervenir un disco. Origen Destino Auxiliar2 3No puede quedar un disco sobre otro de menor tamaño. ’

El problema se puede resolver considerando que para pasar, por ejemplodiscos del pivote origen al destino, han de pasar dos discos al pivote auxiliar,uno al destinoy mover dos discos del auxiliar al destino.

Paso 7

Orinen Destino AuxiliarPaso 3

-~Paso 2

-~

Oriqen Destino A u x G r - T Oriqen Destino Auxiliar

El paso1, vulnera la primera regla, pero para solucionarlo, podemos recurla misma mecánica: movemosun disco de origen a destino, movemos el siguienal auxiliar y, por último movemos el disco de destino a auxiliar.Fases del Paso 1

Origen Destino Auxiliar Origen Destino Auxiliar ~ Origen Destino Auxiliar

Lomismo ocurriría con el paso3 y se solucionaría de la misma forma.

Se creara la claseHanoi para resolver el problema. En esta clase el métodmovsTor r elanza unaNuevaExcp si el número de discos es negativo. El método

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 368/481

Manejo de excepciones 357

m a i n de la clasePr uebaHcapturay trata las excepciones; vuelve a pedir el núme-ro de discos cuando éste fue negativoy ante cualquier otro tipo de excepción, comointroducir una letra en lugar deun número, el programa termina.

publ i c cl ass Hanoi

p ri va te s t a t i c v o i d movs Tor r e ( i n t ndi scos , i n t or i gen, i n tdes t i no, i n t auxi l i ar ) throws NuevaExcpi

/ / Cont r ol Excepci onesi f ( ndi scos < O)

i f ( ndi scos == O)

i f ( ndi scos == 1)

e lse

throw new NuevaExcp ( "Numer o de di scos i ncor r ect o ") ;

re turn ;

Syst em. out . pr i nt l n( "Paso di sco de " +or i gen+" a " t ues t i no);

mo vs Tor r e( ndi s c o s - 1, or i gen, auxi l i ar , des t i no) ;Cys t em out . pr i nt l n( " Pas odi sco de + or i gen t a 'I +

dest i no) ;

movsTor r e( ndi scos - 1, auxi l i ar , des t i no, or i gen) ;

publ i c Hanoi ( i n t n) throws NuevaExcpi

Sys t em out . pr i nt l n( "Bi enveni doa l as tor r es del f i n del munao") ;Cys t em out . pr i nt l n( "Movi mi ent os: "+ ( i n t ) Mat h. pow( 2, ) - 1) ;

Cys t em out . pr i nt l n( "L i s t ado: " ) ;

movsTor r e( n, 1, 2, 3 ) ;

/ / est a cl ase ya ha si do coment adac l a s s NuevaExcp extends Except i oni

St r i ng mensaj e;

publ i c NuevaExcp ( St r i ng causa)I

mensaj e = causa;i

publ i c St r i ng get Mecs age( )I

return mensaj e;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 369/481

358 Java 2. Manual de programación

import j a v a . i o . * ;

public class Pr uebaHI

public static void mai n ( St r i ng[ ] ar gs)iint n = O;

boolean repet i r = false;dot

tryI

r epet i r = false;Sys t e m out . pr i nt l n( "I nt r oduzca númer o de di scos: ") ;

I nput St r eamReader i s r = newI nput Ct r eamReader ( Sys t em i n) ;Buf f eredReader br = new Buf f eredReader ( i s r );

n = I nt eger . par s eI nt ( br. r eadLi ne ( ) ) ;

Hanoi h = new Hanoi ( n) ;1catch ( NuevaExcp el )t

Sys t em out . pr i nt l n ( " \ t Elnúmer o de di scos no puede " +" ser negat i vo ") ;

repet i r = true;1catch ( I OExcept i on e2){

1catch ( Except i on e3)i

1

Sys t em er r . pr i nt l n( "Er r or de l ect ur a " ) ;

Sys t em er r . pr i nt l n(e3);

1while ( r epet i r ) ;

1

13.8. MÉTODOSDE LA CLASEThrowable

public j ava. l ang. Thr owabl e f i l l I nCt ac kTr ac e( )Devuelveun objeto conlosmétodosen ejecución en el momento de lanzarse la excepción.

public j ava. l ang. St r i ng get Mess age0Devuelve el mensaje descriptivo almacenado en una excepción.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 370/481

Manejo de excepciones

public voidMuestra por consola un mensaje con la clase de excepción, el mensaje descriptivo de lamismay una lista con los métodos en ejecución en el momento de lanzarse la excepción.

public voidEnvía el mensaje anteriormente especificado al flujo que se le especifique como parámetro.

publicDevuelve una cadena descriptora de la excepción.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 371/481

I I I

II

ArchCONTENIDO

14.1. La claseF i l e .14.2. Flujos.14.3. Apertura de archivos.14.4. Encadenamiento deflujos14.5. Excepciones en archivos.14.6. Métodos deI nput st r eam.14.7. Métodos deOut put st r eam.14.8. Métodos deReader .14.9. Métodosde Wr i t er .

14.10.14.114.12.14.13.14.14.14.15.

14.16.14.17.14.18.

Métodos deDat a t r eam.Métodos deMétodos deRandomAccess Fi l e.Serialización de objetos.St r i ngTokeni zer St r eamTokeni zer .Operaciones con archivosy mantenimientode los mismos.Archivos secuenciales.Archivos directos.Funciones de transformación de clavey tratamiento de colisiones.

361

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 372/481

362 Java 2. Manual de programación

Como estructura de datos,los archivos permitenel almacena-miento permanente y la manipulación de un gran número dedatos.Losarchivos de datos son un conjunto de datosestructura-dos que se tratan como una unidady se encuentran almacenadosen un dispositivo de almacenamiento externo. Unarchivo se con-sidera formado por una colección de datos lógicamente relaciona-dos, a los que denominaremosregistros, cada registro agrupadatos también con una relación lógica entresí a losque se deno-mina campos y es el programador el encargado de estructurarlosarchivos de tal forma que se adapten a las necesidades del pro-grama ya que, en realidad, Java consideralos archivos simple-mente como flujos secuenciales de bytes.

En losarchivos de datos se pueden destacar dos organizacionesfundamentales:secuencia/ y ladirecta o aleatoria, siendo posibletrabajar en Java con ambos tipos de organizaciones. Laorgani -zación secuencia/ implica quelosdatos se almacenan consecu-tivamente en el soporte externo, no siendo posible accederdirectamente a un determinado dato si nose recorren todoslosanteriores. Laorganización directa permite el posicionamientodirecto en un determinado lugar de un archivo para leer la informa-ción allí almacenada y no obliga al almacenamiento de la misma enforma secuencial. Además,a diferencia de la secuencial, la organi-zación directa permite modificar un dato previamente almacenadoeliminarloo insertar uno nuevo en cualquier posición del archivo sinque sea necesario efectuar una copia de todo el archivo cada vezque se realiza una de estas operaciones. En el presente capítulo, seexplicará el concepto defh jo y se mostrará cómo estructurarlosdatos e implementar en Java ambos tipos de organizaciones.

14.1. LA CLASEF i l e

Losobjetos de la claseFi l enoespecificancómose almacenao recupera la infor -mación enun archivo, sólo describen las propiedades del mismoy permiten obte-ner información sobreél.

Nota:Un objeto de la claseFile posibilita la obtención de información sobrelas propiedades tanto de un archivo como de un subdirectorioy permite lamodificación de algunos de sus atributos.Los métodosdel et e yr enameTo de la claseFi l e permiten borrary renombrar archivos.

LosobjetosFi l ese crean mediante los siguientes constructores:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 373/481

Archivos 363

public Fi l e( j ava. i o. F i i edir, j ava. l ang. Ct r i ng nombre)Donde el primer parámetro es un objetoFi l eque referencia un directorio y el segundo elnombre del archivo.

public Fi l e( 7ava . l ang .St r i ng pa th )El parámetro esel nombre de un directorioo bien el nombre completo, incluyendo ruta deacceso, de un archivo.

public Fi i e( j ava. l ang. St r i ng path, j ava. 1ang. Ct r i ng nombre)Donde el primer parámetro es el nombre del directorioy el segundo el nombre del archivo.

Ejemplos

/ / r ut a r el at i va, el di r ect or i o act ual

Fi l e ar ch = new Fi l e( " ej empl o. dat " );

/ * r ut a absol ut a, en ei s i gui ent e caso espec i f i ca el di r ec to -r i o r ai z en Wi ndows que ut i l i za un separ ador ( \ ) d i s t i r . -t o de üni x ( / ) * /

Fi l e ar ch = new Fi l e " \ \ ' I , " e j empl o. dat " );

/ * es posi bl e ut i l i zar en una ver si ón Wi ndows de J ava el ca -

Fi l e ar ch = new Fi l e(" / " , "e] empl o. dat ") ;

r á c t e r / como separador * /

Métodosy campos a destacar dentro de la clase son:

public static final char sepa ra to rcha r

public j ava. l ang. St r i ng g e t Na me 0

public 1ava. l ang. Ct r i ng ge t pa r e nt o

public j ava. l ang. St r i ng get Abs ol ut ePat h( )

public j ava. l ang. St r i ng get pat h( )

public boolean canwr i t e0

Variable inicializadaco'n elseparador indicado en el archi-vo de propiedades del sistemaque permite especificarrutasindependientes de la plataforma.

Devuelve el nombre del archivoreferenciado por el objeto.

Devuelve el nombre del direc-torio padre.

Devuelve la ruta absoluta delarchivo.

Devuelve la ruta relativa.

Devuelvet rue si se puede

escribir en el archivoo directo-rio.

public boolean canRead( ) Devuelvet rue si se puede leerdesde el archivoo directorio.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 374/481

364 Java 2. Manual de Programación

public boolean i s F i l e 1

public boolean : s D i r e c t o r y ( )

public ; ava. l ang. St r i ng[ ] l i s t ( )

public boolean m k d i r( )

public boolean d e l e r e ( )

I>e\uclvet rue siel archivo re- presentado por el objetoF i l e esun archivo normal.

Devuelvet r u e si el archiborepresentado por el objeto?i 1 0

es un directorio.

Devuelve un array conlosnom- bres delos archivosy directo-rios existentes en el directorioespecificado porel objetoF i l e .Esta listano incluyeel directo-rio actualni el padre del actual.

Crea el directorio especificado porel objeto F i l e .

Borrael objeto0 1 ~ e specifica-do, cuandose trate deun direc-toriocsteha de estar vacio

public boolean renar?eTo ( j ava.i o . F i l e d e c t ) lienombrael archivo especifi-cado porel objctoF i l e con elnombre del archivoFi l e pasadocomo parámctro y devuelvet r u e cuando la operación seefectúa conéxitoy f a l c e si seintenta renoinbrarun archivocambiándolode directorio.

public boolean e x i s t s )

Ejercicio

Mostrar el contenido de un subdirectorio.

De\tielbet r u e si existe elob.jeto F i l e especificadoyf a l c e en caso contrario.

Figura 14.1. Listado del contenido de un subdirectorio

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 375/481

Archivos 365

i mpor t j ava. i o. * ;

publ i c cl ass Li s t adot

publ i c st at i c St r i ng l e e r ( )

I nput St r ear nReader i s r = new I n p u t C t r e a m R e a d e r ( S y 3 t e - . - n ) ;Buf f er edReader br = new Euf f er edReader ( 1s r ) ;try

r et ur n br . r eadL i ne0;ic at c h( Ex c ept i c n e)t ir et urn I " ' ;

1

publ i c st at i c voi d mai n ( S t r i n , - [ ]a r g s j

Sys t er n. out . pr i nt l n( " I ndi que nombr e de c ubdi r ec Eor i s " );Sys t e m out . pr i nt l n( "Trayect or i a absol ut a, ej : C: \ : . i c r c j " ) ;

St r i ng nomdi r = l e e r ( ) ;Fi l e ar c h = new Fi l e( nor ndi r ) ;i f ( ar c h. exi c t c 1 j

i f ( ar c h. s ni r ec t o r y ( ) )

{

Sys t er n. out . pr i nt l n ( " i ont eni bode "Tnom5: r );

St r i ng a r r [ j = a r c h. l i s t 0 ;f or ( i nt J = 3; j < ar r . l engt h; I ++)I

Fi l e ot r o = new F i l e( nomdi r + " \ \ " +ar r [ ] ] ) ;i f ( o t r o . s Di r ec t o r y( 1 )

el seSys t em out . pr i nt l n ( ar r j + < f i R > " j;

Sys t en. out . pr i nt i c ( a r r [ j l ) ;

el seSy s t e m out . pr i nt l n ( r ~omdi r A"no es un di r ec to r i o" ) ;

el seCys t er. . out pr i nt l n( " No exi s t e" ) ;

1

Ejercicio

I

UtiliceAWT para efectuar la misma tarea que el ejercicio anteriory defina una claseanónima para el cierre de la ventana.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 376/481

366 Java 2. Mar ual de Programación

-i i

LEr LE

Figura 14.2. Listado del contenido de un subdirectorio. Pantalla inicial.

Contenidcide c \libro A

TemaülqCilR5Tema11 <[)IR-

_.

1Figura 14.3. Listado del contenido de un subdirectorio.

import j ava. awt . * ;import j ava. awt . even: . *;import j ava. i o. * ;

public class Ej Fi l e extends Fr ame implements Act i onLi s t ener

Text Fi el d t ext oi ; Text Area t ext o2;

public Ej Fi l e( )

cet¿ayoct (new Bor der Layout ( ) ) ;

/ / empl eo de Ena cl ase anóni ma

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 377/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 378/481

368 Java 2. Manual de Programación

14.2. FLUJOS

Los programas en Java realizan las operaciones deentrada/salidaa travésde,flu-

j o s ;así se consigue gestionar de forma similar laentrada/salidasobre dispositi-vos muy diferentes, como teclado, pantalla, impresora, una conexión a rebz@r en memoriao un archivo en el disco. A diferencia de la pantalla, la impre-sora no tiene definido en Java un flujo de salida estándar y para sacar por -soralosresultados de un programa hay que asociar un flujo al puerto( LPT1, . ..)donde esté conectada. Las diferentes clases de flujos se encuentran agrupael paquetej ava . i o y en la parte superior de esta jerarquía destacan las clasI nput st r eam, Out put st r eam, Reader , Wr i t er yRandomAccessFi l e.

Figura 14.4. Clases deflujosque heredan deO b j ec t .

i nput s t r eam es una clase abstracta, superclase de otras concretas que tracon flujos de entrada de bytes, mientras queOut put st r eam es la clase abstractasuperclase de otras que representan un flujo de salida de bytes. Estas clases d pues, la funcionalidad básica común a todas las clases de flujo de bytes. Figura14.5.Wr i t er es una clase abstracta para escribir caracteres en flujoyReader la clase abstracta cuyas subclases podrán leerlos (Fig.14.6.).

Cuando se trabaja conReader o Wr i t er el flujo se orienta aUnicode(16 bits)y conStreama bytes(8 bits). Las clasesSt r eam, en gran parte,se consideranobsoletas, ya que Java usaUnicodey tiene más sentido usarReader / Wr t e r quetrabajar conbyres,donde Java tiene que traducirlos bytesen Unicode para impri-mirlos y de vuelta enUnicodecuandolos lee.

Por otra parte, en adición aSt r eam, Reader y Wr i t er , el paquete j ava. i o

define la claseRandomAccessFi l eque permite implementar archivos de acce-so directo.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 379/481

Archivos 369

Figura 14.5. I nput st r eam y Out put st r eam, jerarquía de clases.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 380/481

370 Java 2. Manual de Programación

Reader

Figura 14.6. Reader y Writer, jerarquíade clases.

14.3. APERTURADE ARCHIVOS

Para crear, escribiro leer un archivo se requiere establecer un flujoa/desdeél; lasclases capaces de crear un flujoaidesdeun archivo requieren una referencia a unobjetoFi l eo un nombre de archivo como argumento. Estas clases son:

La subclaseF i l eOut put Ct r eamhereda deOut put Ct r eamy permitecrearun flujode salida para escribir bytes enun archivo. Los constructoresson:

public F i l eOur put Ct r eam( j av a. l ang. St r i ngnombre). public F i l eOc t put Ct r eam( j ava. i o .Fi l e file)

/ / f i l e es un obj et o F i l e public Fi LeCut put Ct r eam( j ava. l ang. Ct r ; ng nombre, bool ean

a ñ a d i r ).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 381/481

Archivos 371

Los tres constructores lanzan excepción. Conlos dos primeros si el archivoexiste y se abre de esta forma, se destruye. El último constructor permite aña-dir datos a un archivo existente, cuyo nombre viene especificado pornombr e.

Ejemplo

Fi l eout put s t r eam f 1 = n e w ( " i nf o.t xt ") ;

o bien

Fi l e ar ch = n e w ;

Fi l eout put s t r eam f 2 = n e w ( a r c h );

Un flujo debe cerrarse cuando ya no vaya a utilizarse con las sentenciassufi-cientes:

f 2 . cl ose ;

La subclaseFi l eI nput St r eamhereda deI nput s t r eamy permite crearun flujo para lectura de bytes desde un archivo. La lectura comienza desde e principio del archivo y cuando se leen datos del mismo, para que se puedanvolver a leer los datos del principio es necesario cerrar el flujoy volverloaabrir.Losconstructores son:

public f i l e )

public nombre)

Ambos constructores lanzan unaFi l eNot FoundExcept i on

Ejemplo

Fi l eI nput St r eam = n e w t xt " ) ;

o bien

Fi l e ar ch = n e w Fi l e empl o. t xt " j ;

Fi l eI nput St r eam f 2 = n e w

El flujo se cierra de modo similar al caso anterior.

Fi l ewr i t er hereda deWr i t er y proporcionala posibilidad de crear unflujo para escritura de caracteres en un archivo.Losconstructores son:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 382/481

372 Java 2. Manual de Programación

public Fi i eWr i t er ( j ava. 1o. F public F i l eWr i t er ( ] ava. l ang public F - l eWr - t er ( 7ava. l ar . g

l e f i l e )St r i ng nombre)St r i ng nombre , boolean añad i r )

y lanzan unaI OExcept i on.Losdos primeros constructores destruyen unaarchivo existente; el último permite añadir datos al final del mismo.

Ejemplo

Fl i eWr l t er f e new Fi l eWr i t er( " i nf o. x t " ) ;

f e . l o s e ( ) ;

. . .

Fi l eReader permite crearun flujo para la lectura de caracteres desdeunarchivo. Análogamente alo que ocurre conFi l eI nput St r eam, la lecturacomienza desde el principio del archivo y cuando se leen datos del mismouna nueva lectura desde el principio es necesario cerrar elflujoy volverlo aabrir. Los constructores son:

public Fi l eReader ( l ava. i o . F i i e f i l e )

public F i l eReader ( j ava. l ang. St r i ngnombre)

y lanzan una excepciónFi l eNot FoundExcept i on.Ejemplo

Fi l eReader f l = new Fi l eReader ( " i n f o . t x t " );

f l . cl ose ( ) ;

. . .

La claseRandomAcces s Fi l e permite el acceso directo (también llamado

uccesoaleatorio)a una determinada posición dentro de un archivo, así cola lecturay escritura de datos en dicho archivo. Esta clase no deriva I nput st r eam ni deOut put st r eam, sino que implementa las interfacesDat aI nput y Dat aout put que definenlosmétodos deentradahalida bási-cos.El flujose crea mediante:

public RandcmAccessF i l e( j av a. i o. F i l e f i l e , j ava. l ang. Ct r i ngm )throws Fi l eNot FoundExcept i on

public R a n d o r r S i c c e s s F i l e ( j a v a . l a n g . C t r i n g nombr e, ] ava. i ang. St r i ng m )throws I OExcept i on

El parámetromrepresenta el modo en el que se creará elflujoy en la llamadase le podrá pasar:r (lectura)o r w(lectura/escritura).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 383/481

Archivos 373

Ejemplo

RanaomAcceccF i l e:le = new Rai domAcceccFi l e("datos =a- " , " r w" );

f l e . cl ose ( 1 ;

Nota:En JavaRandomAccessFi l ees la clase que permite el acceso directoy F i l e R e a d e r , F i l e I n p u t S t r e a m , Fi l eWr i t er yFi l eOut put St r eamofrecen tratamiento secuencial.

14.4. ENCADENAMIENTODE FLUJOS

Para conseguir flujos personalizados, que se adapten alosrequisitos de transferencia dedatos en Java se utiliza la composición de flujos. Este sistema sirve nosólo para archi-vos,si no que se aplica también alos flujos de redy deconector(socket). Existen unaserie de flujos que efectúan tratamientos especiales de la información; son, por ejemplo

I nput St r eamReaderOut put Ct r eamWr i t er

Buf f er edReaderBuf f er edWr i t er

Buf f er edI nput St r eamBuf f er edOut put St r eam

Pr i nt s t r eam

Pr i z t Wr L t e r

Dat aI nput Ct r eamDat aout put Ct ream

Convierten bytes a caracteres.

Establecen un buffer para caracteresIEstablecen un buffer para bytes

Escribe valoresy objetos enun flujo de bytes.

Escribe valores y objetos en un flujo de caracteres.

Permiten leery escribir tipos de datos primitivos,efectuando conversiones desde un flujo de bytes adichos tipos de datos primitivos.

Estos flujos pueden asociarseunoscon otrosy con los de apertura de archivos paraobtenerel flujo deseado ai escribiro leer de un archivo. Por ejemplo, la claseFi l eOut put St r eamconsidera el flujo como una colección de bytes, pero no como

unidades más grandes; cuando se desea imprimir unidadesmásgrandes, se le puedeasociar un objetoPr i nt st r eam. LosobjetosPr i nSt r eamadmitenlosmétodospr i nt y pr i nt l n para valoresy objetos. Cuando se trata de objetos, estos métodos

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 384/481

374 Java 2. Manual de Programación

llaman al métodot ost r i ng del objeto e imprimen el resultado.Pr i ns t r eamalmacena los datos a imprimir en unbufercon la finalidad de trabajar de la forma máeficiente posible y disminuir el número de operaciones de transferencia, así lo

sólo se escriben cuando se llena elbuffer o termina el programa. Esto resulta muy con-veniente para los archivos, pero no para la pantalla.Systern. out es una instancia dePr i nSt r eamy por esopr i nt y pr i nt 1n sonlosmétodos que se vienen utilizan-do para mostrar información por pantalla. La clase posee el método

public void f l ush ( )

que se utiliza para asegurar que los buffers de datos se escriben físicamenteflujo de salida.

Ejemplos

1. Sys t e m out . pr i nt( " Deme una cadena " ) ;

Sys t e m out . pr i nt l n( "y a cont i nuaci ón pul se RETURN") ;

/ * Habi t ual ment e J ava vací a el buf f er cuando, est e sel l ena, cuando t er mi na el pr ogr ama y c uando se ef ect úauna l ect ur a desde t ecl ado, por l o que l a s i gui ent ei nst r ucci ón no suel e ser necesar i a * /

Sy s t em. out . f l us h0;

2. F i l e f = n e w Fi l e ( " t ext o. x t " ) ;

/ / l a s i gui ent e i ns t r ucci ón abr e el ar chi vo par a escr i t ur aFi l eout put s t r eam f e = n e w F i l eOut put St r eam( f );Pr i nt s t r eam s al i da = n e w Pr i nSt r eam ( f e) ;

/ * Después se ut i l i zar í an l os mét odos pr i nt l n o pr i nt de

s al i da. pr i nt l n( "Los f l u j o s pr opor ci onan canal es " +Pr i nt s t r eam * /

"de comuni caci ón") ;

/ * P o r úl t i mo ser i a conveni ent e cer r ar l os f l u j o s con elmét odo cl ose * /

Otro encadenamiento se puede utilizar para leer cadenas desde un archivo conFi l eI nput St r eam. El programa que lee llama a unBuf f er Reader queutiliza unI nput St r eamReader , que asu vez utiliza unFi l eI nput St r eam para leer delF i l e .

Ejemplo

/ / Obj et o Fi l eFi l e f = n e w Fi l e ( " t ext o. x t " ) ;

/ / Aper t ur a del ar chi vo par a l ec t ur a. F l u l o de byt esFi l eI nput St r eam f l = n e w Fi l eI nput St r eam( f ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 385/481

Archivos 375

/ / Conver si ón a f l u j o de car act er esI nput Ct r eamReader ent r ada = n e w I nput St r eamReader ( f 1j ;/ * Buf f er par a car act er es y obj et o que per mi t e l eer una l í nea

Buf f er edReader l ect or cad = n e w Buf f er edReader ( ent r ada) ;/ / LecturaSt r i ng cadena = l ec t or Cad. r eadL i ne0;/ / l anza una I OExcept i on

compl et a * /

El métodor eadLi ne( ) de la claseBuf f er edReader permite leer unasecuencia de caracteres deun flujo de entraday devuelve una cadena; además, uti-liza unbyffeer para mejorar el rendimiento. Para efectuar lectura desde teclado, seutilizasyst em. i n, que es una instancia dej ava. i o . I nput st r eam; por estarazón, las lecturas de una cadena desde teclado se han efectuado con un métod

análogo ai anteriormente expuesto.Ejemplo

I nput Ct r eamReader ent r ada = n e w I nput Ct r eamReader ( Sy s t em i n) ;Buf f er edReader l ect or cad = n e w Buf f er edReader ( ent r adaj ;St r i ng cadena = l ec t o r c ad.r eadLi ne ( ) ;

Dat a I nput St reamy Da aOut putSt reamse utilizan respectivamente paraleero escribir en un flujoFi l eOut put St r eamo Fi l eOut put St r eamdatosde tipos primitivosy recuperarlos como talesy también en este caso se aplica enca-denamiento.

Ejemplo

Fi l eI nput Ct r eam f e = n e w F i l eI nput Ct r eamDat aI nput Ct r eam de = n e w Dat aI nput St r eamcad = de. r eadUTF( j ;de. cl ose ( ) ; / / mét odo her edado de Fi l t er

" dat os . d a t " ) ;

f e ) ;

npu t s t ream

14.5. EXCEPCIONES EN ARCHIVOS

Cuando se trabaja con archivos se pueden producir errores deentrada/saliday Javaobliga a prever este tipo de erroresy recoger las excepciones que pueda lanzar elsistema. Las excepciones del paquetej ava . i o se muestran en la Figura14.7.Cuando el programador diseña un método tiene dos opciones con este tipo dexcepciones:listaríasen la cabecera del mismoo bien recogerlasy tratarlas. Si está

sobrescribiendo un método del que no puede modificar la interfaz, se verá obligada recoger estas excepcionesy tratarlas en el propio método.Las excepciones en el trabajo con archivos pueden ser lanzadas por los método

de escrituray lectura, pero además hay que tener en cuenta que la apertura de un

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 386/481

376 Java 2. Manual de Programación

archivo puede producir una excepciónI OExcept i oncuando falla la operación; porejemplo, si se intenta abrir para lectura un archivo que no existe,y el cierre de unarchivo con el métodocl ose también puede producir unaI OExcept i on.Por otra

parte,losarchivos en Java terminan con una marca de fin de archivoy cuando en lalectura de un archivo se llega a dicha marca se puede lanzar unaEOFExcept i on.

Capturary tratar las excepciones en la aperturay cierre de un archivo.

publ i c cl ass Cont r o l Excepc i onest

publ i c s t at i c voi d mai n ( St r i ng[ ] args)i

Abr eYCi er r a ar ch = new Abr eYCi er r a( ) ;

ar ch. l eer ( ) ;

i mpor t j ava. i o. * ;publ i c cl ass Abr eYCi er r aI

Fi l eI nput St r eam f l = null;

publ i cvoi d

l e e r 0

F i l e f = new Fi l e( " t ext o . t x t " );f l = new F i l eI nput Ct r eam( f );

1c at c h( I 0Ex cept i one)I

Cys t em out . pr i nt l n( e ) ;

1

f i nal l yt

tryi

/ * no debe col ocar se en el pr i mer bl oque t r y ya que

i f ( f l ! = null)f l . c l o s e0 ;

1c at c h( I 0Ex cept i one)

pudi er a no ej ecut ar se * /

Cyctern. o. dt p r i n t l n( e ) ;

Syst er r. . out pr i nt l n( " F i n" );:

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 387/481

Archivos

Figura 14.7. Excepciones del paquetea v a .

Nota: Al trabajar con archivos, las excepciones pueden ser lanzadas porlosmétodos de lecturay escrituray también por las operaciones de aperturay cie-rre del archivo.El compilador obliga a tratar dichas excepciones.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 388/481

378 Java 2. Manual de Programación

Nota:Cuandose detecta el fin de flujo:.El métodor ead de i nput st r eam devuelve- 1 .

El métodor eadLi nedevuelven u l l .Los métodos que se exponen enDat aI nput St r eam generan unaEOFExcepti on.

14.6. MÉTODOSDE inputstream

public int available )

De\uelveel número de bytes actualmente disponibles parasu lectura en el flujo de entrada.

public void cl ose 0Cierra el flujo de entrada. Genera unaI OExcept i onsi se produce un error.

public synchronized void mark(int n u m )Coloca una marca en elflujo de entrada, válida hasta que se lea el número de bytes espec-

ficado como parámetro.

public boolean marksuppor ted0Comprueba si elflujode entrada soportalosmétodos ma r k y reset.

public abstract int r ead 0Devuelve como entero el siguiente byte disponible dela entrada.

public int read(byte b [ )

Intenta leer desde el flujo de entrada el número de bytes necesarios para llenar el a b pasado como parámetro y devuelve el número real leído.

public int read(byte b [ 1 , int d e s d e , int c u a n t o s )Intenta leer desde el flujo de entrada el número de bytes especificadoscornotercer paráme-tro ylos introduce en el array b empezando en b [de cde .

public synchronized void reset )

Coloca el puntero de entrada en la marca establecida conm a r k .

public long skip(1ong n )Salta y descartan bytes del flujo de entrada, devolviendo el número realde bytes saltados.

Exceptom a r k ,todoslosmétodos restantes lanzan unaI OExcept i on.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 389/481

Archivos 379

14.7. MÉTODOSDEOutputstream

publ i c voi d cl ose( )Cierra el flujo de salida. Genera unaI OExcept i on si se produceun error

publ i c voi d f l us h( )Vacía y limpia el buffer.

publ i c voi d wr i t -e ( byt e b [ I )

Escribe b . l engt h bytes del array b en el flujo de salida.

publ i c voi d wr i t e( byt e b [ 3 , i nt d e s d e , i nt cuantos)Escribe b . cuant os bytes del arrayb en el flujo de salida comenzando desde b [ doczel .

publ i c abst r act voi d wr i t eí i nt 5 )Escribeun Único byte en elflujode salida.

Todos estos métodos lanzan una excepciónI OExcept i on.

14.8. MÉTODOSDE Reader

La claseReader es una clase abstracta, superclase de todoslos flujos de entradaorientados a carácter que proporciona un conjunto de métodos similar al que la clai nput S t r eam proporciona paralos flujos de entrada orientados a byte. Todos susmétodos lanzan una excepciónI OExcept i on.

publ i cpubl i cpubl i cpubl i c

publ i cpubl i cpubl i cpubl i cpubl i c

abst r act voi d cl ose ( )

voi d mark ( i nt n u m l a r a c t e r e s )bool ean mar kSuppor t ed( )i nt r ead( )

i nt r ead ( char c [ )abst r act i nt r eadí char c[ I i nt d e s d e , i nt cuantos)bool ean r eady ( )

voi d r eset 0

l ong ski p( 1ong n )

14.9. MÉTODOSDE Writer

La claseWr i t er es una clase abstracta superclase de todos los flujos de salidaorientados a carácter que proporciona un conjunto de métodos similar al que la claOutputstream proporciona para los flujos de entrada orientados a byte. Todossusmétodos lanzan unaI OExcept i on.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 390/481

380 Java 2. Manual de Programación

publ i c abst r act voi d cl ose ( )

publ i c abst r act voi d f l ush ( )publ i c voi d wr i t e ( char c [ )

publ i c abst r act voi d wr i t e ( char c[ 1 , i nt d e s d e , i nt

publ i c voi d wr i t e ( i nt c)publ i c voi d wr i t e ( l ava. l ang. Ct r i ngc a d e n a )publ i c voi d wr i t e ( j ava. l ang. Ct r i ngc a d e n a , i nt d e s d e , i nt

c u a ntos)

c u a nt o s )

14.10. MÉTODOSDEDataInputStream

Esta clase actúa como filtro envolviendoun flujode entrada paraasí permitir lalectura desde un archivo de datos de tipos primitivos. Métodos Dat a I r ip u t S t r eam son:

publ i cpubl i cpubl i cpubl i cpubl i cpubl i cpubl i cpubl i cpubl i cpubl i c

publ i cpubl i cpubl i cpubl i cpubl i cpubl i c

publ i c

f i nal i nt r ead ( byt e b u f f e r ] )f i nal i nt r ead( byt e b u f f e r [ 1 , i nt d e s d e , i nt c u a n t o s )f i nal bool ean r eadBool ean0f i nal byt e r eadByt e )f i nal char r eadchar )f i nal doubl e r eadDoubi e )f i nal f l oat r eadFl oat )

f i nal voi d r eadFul l y( byt e b u f f e r [ 1f i nal i nt ski pByt es ( i nt n )f i nal voi d r eadFul l y( byt e b u f f e r [ 1 , i nt d e s d e , i ntc u a ntos)f i nal i nt r eadI nt ( )f i nal l ong r eadLong ( )f i nal shor t r eadshor t )

f i nal i nt r eadUnsi gnedByt e )f i nal i nt r eadUnsi gnedChor t )f i nal j ava. l ang. Ct r i ngr eadUTF( )

stat i c f i nal j ava. l ang. Ct r i ng r eadUTF ( j av a. i o. Dat aI npute n t r a d a )

Todos estos métodos lanzan unaI OExcept i ony casi todos ellos están defini-dos en la interfazDat aI nput implementada por la misma.Losmétodosr eadUTFdevuelven una cadena de caracteresUnicodey generan una excepción del tipoUTFDat aFor mat Except i onsi los bytes no representan una codificaciónUTF-8 válida de una cadena Unicode. En el formatoUTF-8' los dos primeros bytes indi-can el número de bytes que han de ser leídos a continuación para formar la c

El nombre de los restantes métodos realizan las tareas que dicho nombre sugiLas siglas UTF-8 significan FormatodeTransformaciónUniversal 8;es un formatode transmisión para

Unicode válido paralosarchivos de sistemas Unix.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 391/481

Archivos 381

14.11. MÉTODOSDEDataOutputStream

Esta clase actúa como filtro envolviendo un flujo de salida para así permitir laescritura enun archivo de datos de tipos primitivos. Todos los métodos deDat aOut put St r eam, exceptos i ze ( ) lanzan unaI OExcept i on. Métodosde Dat aOut put St r eam son:

publ i c voi d f l us h( )publ i c f i nal i nt s i z e( )publ i c synchroni zed voi d wr i t e (byte b u f f e r [ i , i nt d e s d e , i nt c u a c t s c )publ i c synchr oni zed voi d wr i t e ( i nt v a l o r )publ i c f i nal voi d wr i t eBool ean( boo1ean b o o l e a n o )publ i c f i nal voi d wr i t eBy t e( i nt v a l o r )publ i c f i nal voi d wr i t eBy t ec( ] ava. l ang. Ct r i ng c a d e n a )publ i c f i nal voi d wr i t ec har ( i n t c a r á c t e r )publ i c f i nal voi d wr i t ec har s ( j ava. l ang. St r i ng c a d e n a )publ i c f i nal voi d wr i t eDoubi e( doubl e v a l o r )publ i c f i nal voi d wr i t eFl oat : ( f l oat v a l o r )publ i c f i nal voi d wr i t eI nt ( i nt v )publ i c f i nal voi d wr i t eLong ( l ong v )publ i c f i nal voi d wr i t es hor t ( i nt v )publ i c f i nal voi d wr i t eUTF( ] ava. l ang. St r i ngc a d e n a )

El métodos i z e ) devuelve el número de bytes escritos y, por su nombrey locomentado en otras ocasiones, puede deducirse el significado de los restantes. Castodos los métodos de esta clase están definidos en la interfazDat aout put imple-mentada por la misma.

Nota: Dat aI nput St r eam y Dat aOut put St r eam se utilizan respec-tivamente para leero escribir en un flujoFi l eOut put Ct r eamoFi eOut put St reamdatos de tipos primitivosy recuperarlos como talesaplicando encadenamiento.

14.12. MÉTODOSDERandomAccessFile

Esta clase implementa las interfacesDat aI nput y Dat aout put y además de losmétodos de ambas interfaces ofrece tambiénlossiguientes:

publ i c l ong get F i l ePoi nt er( ) Devuelve, en bytes, la posiciónactual en el archivo.

publ i c l ong l e ng t h0 Devuelve, expresada en bytes,la longitud del archivo.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 392/481

382 Java 2. Manual de Programación

publice void ceek(1ong pl ) Coloca en una posición especí-fica relativa al principio delarchivo, de forma que las ope-raciones de lecturao escritura

puedan realizarse directamenteen dicha posición.

14.13. SERIALIZACIÓNDE OBJETOS

En Javaun registro deun archivo se puede corresponder con una clase y los ca- pos del registro coincidirían con las variables de instancia; por consiguienlugar de leery escribir series de datos agrupadas enlosarchivos, puede resultar másadecuado leer y escribir objetos. Laserializaciónde objetos es la forma de guardarobjetos en archivoso enviarlos a través de la red, ya que permite escribiro leer obje-tos en flujos. El mecanismo deserializaciónmantiene el control sobre los tipos deobjetosy las relaciones entre ellos.

Para que se puedaserializarun objeto, basta con establecer queimplemen-te la interfaz S e r i a l i z a b l e . Esta interfaz no tiene métodos, por lo que noque añadir implementaciones a la clase, pero obliga a que todos los campos ddel objeto seanserializables;como los tipospredefinidosson todos serializables,

en realidadlo único que habrá que considerar es que si desde ese objeto serefe-rencian otros, estos también hayan sido declaradosserializables.La clase que permite escribirlos objetos en el flujo de salida esO b j e c t O u t p u t S t r e a myC b j e c t I n p u t C t r e a mla que permite leerlos.

O b j e c t O u t p u t S t r e a mimplementa la interfazO b j e c t c u t p u tque a suvez implementaD a t a c u t p u tque le añade la capacidad de escribir, además objetos, tipos básicos de datos. Las operaciones con archivos se harán e-nando unO b j e c t c u t p u t s t r e a ma un F i l e C u t p u t C t r e a my el métodow r i t e o b j e c t ( o b j e t o ) es el que se utiliza para escribir objetos en el fabierto hacia el archivo:

public final void wr i t eObj ec t ( j ava. i ang. 0bj ec t o b j )

Los métodosf l u s h( ) y c l o s e( ) se emplearán para obligar a volcar el con-tenido delbgfery cerrar el flujo respectivamente.

C b j e c t I n p u t C t r e a m implementa la interfazC b j e c t I n p u tque asu vezimplementa D a t a I n p u t que le añade la capacidad de leer, además de objeto básicos de datos. Las operaciones con archivos se harán encadenand

C b j e c t I n p u t S t r e a m aunF i l e I n p u t S t r e a m y elmétodor e a d o b j e c t ( ) .

public final j ava. l ang. Obj ec t r e ad obj e c t 0

es el método que se utiliza para leer objetos en el flujo abierto hacia el arch

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 393/481

Archivos 383

I I

Nota: La serialización de objetos permite guardar en archivos objetos queimplementan la interfazS e r i a1 z ab1e.

14.14. StringTokenizer Y StreamTokenizer

St r i ngTokeni zer pertenece al paquetej a v a . ut i l ; trabaja sobre cadenasyse puede utilizar como herramienta para efectuar el análisis de las líneas leídas dun archivo de texto. La claseSt r eamTokeni zer es miembro del paquete

j a v a . i o y realiza un trabajo muy similar aSt r i ngTokeni zer , permitiendodividir un flujo de entrada en fragmentos significativos mediante el empleo de undelimitadores.El constructor es:

public St r eamTok eni ze r ( j av a. i o. Reade rr )

La constante TT EOFindica que se ha leído el final del flujo; de modo análogo TT EOLy TT WORDindican el fin de línea y elfinde palabra. Para inicializarlosdel&itadores,seemplear e se t syn tax ( ) y después con el métodowor dchar s

se puede establecer la serie de caracteres que pueden constituir una palabra.Elmétodoeol I s Si gni fi cant determina quelos caracteres de línea nueva seantratados comotokens, de forma quenext Tokendevuelva TT EOLcuando se leael fin de línea.

14.15. OPERACIONES CON ARCHIVOSY MANTENIMIENTODE LOS MISMOS

Las operaciones con archivos son aquellas que tratan con su propia estructura, talcomo la creación, aperturao cierre delosmismosy queson proporcionadas por ellenguaje, en este caso Java. Además de utilizar este tipo de operaciones al trabajcon archivos, será necesario diseñar métodos que efectúen tareas de mantenimie-to. El mantenimiento de un archivo incluye las siguientes operaciones:

9 ActualizaciónAltas. Operación de incorporar al archivo un nuevo registro.

Bajas.Acción de eliminar un registro de un archivo. Las bajas pueden serde dos tipos:Ldgicu.Se efectúa colocando en el registro que se desea borrar una banderaoindicador quelo marque como borrado. Admite la posterior recuperación de lainformación.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 394/481

Java 2. Manual de Programación

implica la desaparición de esa información del archivo de forma queno pueda ser recuperada por operaciones posteriores. Puede efectuarse mediantsobreescritura del registroo bien creandoun nuevo archivo queno incluya dichoregistro.

Modificaciones.Proceso de modificar la información almacenada enundeterminado registro deun archivo.

ConsultaDe un Único registro.De todoslosregistros del archivo.

14.16. ARCHIVOSEn losarchivos secuencialeslos registros se almacenan unos al lado de otros sobrel soporte externoy se pueden designar por números enteros consecutivos; sembargo, estos números de orden nose pueden utilizar como funciones de accesoy para realizar el acceso a un registro resulta obligatorio pasar porlos que le prece-den. Además, este tipo de archivos no pueden abrirse simultáneamente para ly escrituray terminan con una marca de final de archivo.

Los archivos secuenciales en Java se puedenabrir para lectura con1e I nput St reamo 1 r ypara escrituracon 1 tput St r eamo Fi l ewr i t er.

Cuando un archivo secuencial se abre para lectura,un puntero de datos imagi-nario se coloca al principio del archivo, de forma que la lectura siempre co-zará por el principio. Cuando un archivo secuencial se abre para escritur puntero de datos imaginario puede colocarse al principio del archivo, con lsi éste existía se perderá cualquier información almacenada en el mismo,o bienal final:

public nombre, boolean a ñ a d i r )

public Fi l ewr i t er ( J ava. nombre, boolean

para así poder añadirle nueva información por el final.Un caso particular de archivos secuenciales son los archivos de texto, que

formados por una serie de líneas cada una de las cuales se encuentra constituiuna serie de caracteresy separadas por una marca de final de línea.

Ejercicio

Diseñar programa con interfaz gráfica que muestre el contenido delosarchivosde texto que se le indiquen a través deun campo de texto (Fig.14.8).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 395/481

Archivos 305

mode con codepageprepate=((850)C iWINDüWS\COMMAND\egaI

modeconcodepageselect=850keybsp,,CiWINDOWSiCOMMAND\keyboardSYSset path=%path% ,C h i pFin

f

Figura 14.8. Ejecución: muestra el contenido del archivoc : \ aut oexec .bak.

import j ava. i o. * ;import j ava. awt . * ;import j ava. awt . event . * ;

public class LeeText o extends Fr ame implements Ac t i oni i s t ener

Text Ar ea cont eni do;T e x t F i e l d nombr e;

Fi l e ar ch = null;

public LeeText o ( )

cetLayout(new Bor der Layout ( ) ) ;

addW ndowLi st ener( new Wi ndowAdapt er( )

public void wi ndowCl osi ng( Wi ndowEvent e)

Cys t em exi t ( O );1

1 ) ;nombr e = new Text Fi el d( );nombr e. addAc t i onL i c t ener ( t hi s ) ;add ( "Nor t h" ,nombr e) ;

cont eni do = new TextArec3) ;

add ( "Cent er " ,cont eni do) ;

1

public void act i onPer f or med( Act i onEvent e)

nombr e. s el ec t Al l ( ) ;

arch = new Fi l e ( nombr e.qetText ( 1) ;Cargar Ar chi vo( ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 396/481

386 Java 2. Manual de Programación

public static void mai n( St r i ng a r g s [ ] )I

LeeText o v e n t a n a = new LeeText o ( ) ;

vent ana. c et Ci z e( 400, 250 ) ;

v e n t a n a . cet - i t - e( " Zl empl ode Lect ur a desde Ar chi vo" ) ;ver . t ana. c et V- s i bl e( t r ue);

void Car gar Ar c?. i vo( 1

iFi l e3eader f = null;Suf f e r edReader br = null;St r i ng cadena = null;

try

f = new F i i eReader( a r ch );

br = new S u f f e r edReader ( f );

do

cadena = br . r ea s L i ne0;if ( r ader , a ! = null)

cor . t eni do. append( cadena + " \ n " ) ;

iwhile ( cadena ! = null)

catch ( F i l eNo z Fo undEx c ept i s ne)!

cont eni do . apFend( " Ei arch; vono exi s t e \ n" ) ;I

catch ( I OExcept i on e)

c c nt eni do. append ( " E r r o r \ n " );

finally

t=Yt

if ( b r ! = null){

Dr. cl os e( ) ; / / bas t a con cer r ar e l oDj et o nac ext er i ori

catch ( I OExcept i on e)

cont eni do. append ( " E r r o r \ n " );icoxt eni do . appexd ( "F: n\ n\ n");

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 397/481

Archivos 387

Ejercicio

Un ejemplo de serialización.El programa debe permitir efectuar altas y bajas y con-

sultas delos datos delosempleados de una empresa.

En la implementación expuesta a continuación, las operaciones se efectúan enun array en memoria; este array esel campo de datos de un objeto de tipoPer sonal . El objetoPer sonal se recupera y escribedesdeienun archivo en eldisco empleando serialización. Comolos elementos del array son objetos de tipoEmpl eado, la claseEmpl eado también ha de ser serializable.El métodomai nde la claseEjempl o llama a:1) l eer , método que cuando el archivo existe lee el

objeto,2) oper aci ones, que a través de un menú de opciones permite elegir laoperación a realizar,3) escr i bi r , que escribe el objeto en el archivo cuandodicho objeto ha sufrido cambios.

La claseEmpl eado representalos registros y sus camposson: códi go,edad, nombr e, domi ci l i o y t el Sf ono.El códi go es el campo clave queidentifica al empleadoy se supone que no se van a introducir en ningún momentocódigos repetidos.

Las altas se efectúan simplemente añadiendo nuevos elementos al final del arrayEl array se crea de nuevo, para aumentar su tamaño, en cada adición y se utiliza otrarray auxiliarcopi aDeL i st a para conservar la información anterior. Tras crearel nuevo arrayar r Empl eados , se copian ene1 los elementos del arraycopi aDeLi s t ay se coloca al final el nuevo empleado( unEmpl eado) .Estaforma de trabajar imita el funcionamiento de la claseVector del paquete j ava .ut i l , que inicialmente creaun array de objetos de un tamaño determinadoy, si más adelante se necesita, crea otro de mayor tamaño, mueve todoslosobjetosal nuevo y borra el antiguo; la claseVector proporciona así arrays dinámicos, queaumentano disminuyen detamaiioen tiempo de ejecución.

La baja de un empleado (métodoel i Lm nar

de la clasePer sonal ) disminu-ye el tamaño del array.

La consulta pideun códi go y efectúaun recorrido secuencia1 del array hastaque éste se acabao encuentraun empleado cuyocódi go sea igual al introducidodesde teclado. En el caso de que encuentre a dicho empleado, muestrala informa-ción almacenada sobre dicho empleado.

import j a v a . i o . * ;

pub l i c c l a s sEj empl o

s t a t i c Per sonal l i s t a = n u l l ;/ / s i ?a l i s t a s - i f r e cambi os s e escr i be en el di s cos t a t i c b o o l e a n car cbi os;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 398/481

388 Java 2. Manual de Programación

p u b l i c s t a t i c vo id mai p( St r i ng[ ] args)

l eer ( ) ;

oper aci ones ( ) ;

escr i bi r ( ) ;

p u b l i c s t a t i c vo id l eer ( )

/ * Cr eaci ón consi der a dos casos s i el ar chi vo exi s t e

Li l e f i c her o = new F i l e( " e mpr es a. dat " );

i fi

pr evi ament e o no * /

( ! f i cher o. exi s t s ( ) )

l i s t a = new Per sonal ( 1 ;

Sys t em out . pr i nt l r ( "Nuevo ar chi vo") ;

el se

oi s = new Obj ec t i cput St r eam( new F i l ei nput s t r eam

l i s t a = ( Per sonal )oi s . r eadobl ec t 0 ;

Sys t e m out . pr i nt i n( "Ar chi vo exi st ent e") ;

( " e mpr es a. dat " ) );

1

c a t c h ( Cl assNot FoundExcept i sne)

Syst em. out . p r i n t i r .( " E r r o r : + e. os t r i ng ( ) ) ;

c a t c h ( I OExcept i on e)I

Syst em. out . pr i nt l n( "E r r o r : + e. t os t r i ng ( ) ) ;

1f i n a l l yI

i f ( o i s ! = nul l )oi s .cl ose ( ) ;

1c a t c h ( I OExcept i on e)t j

p u b l i c s t a t i c vo id oper aci ones ( )t

s h o r t opci ón = O ;I npuZCt r eamReader i sr = new : nput St r eamRea der ( Sy s t em i n) ;Buf f er edReader br = new BLf f er edReader ( 1s r ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 399/481

Archivos 389

int posi = - 1;short c ó d i g o = 3;short edac = O;Ct r i nq Rornbre , dor ni ci i i o, t el éf ono;

boolean el i mi nado = false; boolean e r r o r ;

/ / Mant eni mi ent otryt

do

Sys t er n. out pr i nt l n ( " MENC" );

Sys t er n. out . pr i nt i n( " ? .Al t as " ) ;

Sys t er n. oUt . pr i nt l n( " 2.Baj as" ) ;

Sys t er n. out . pr i nt l n( " 3. Consul t as " ) ;

Sys t er n. out . pr i nt l n( "4. Fi n" );

Sys t er n. out . pr i nt i n( ) ;Sys t er n. c Gt . pr i nt( " E l i j a opci ón: " ) ;

doopci ón = Short . par s eShor t (new Buf f er edReacer(new

i nput Ct r e ar nReader ( Sys t em i n) ) . r e a dL i n eO) ;while ( opcL6n< 1 1 opci ón > 4 ) ;switch ( o pci ór. )

/ * Con el f i n de si mpl i f i car el ej empl o, se s u p o n e

case 1: / / al t asq u e no se i nt i - od~c encódi gos r epet i dos * /

/ * s e t r a t a l a excepci hn par a que vr el va a pedi rel dat o en el caso de que se ; nt r oduzca unval or no n, xi ér i co* /

do

error = false;

try

Syst em. out . pr i nt ( "códi go: 1 ;c ó d i g o = Short . par s es hor t ( br. r eadLi ne( ) ) ;

catch ( Numcer For mat Excepti o n ne)

Sys t em out . pr i nt l n ( " Vai or no vál ; do +

e r r o r = true;"( ha de ser un númer o) " ) ;

I

while ( e r r o r ) ;

Syst em. out .pr ini: ( nombr e :nombr e = br . r eai L i ne( ) ;

do{

" ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 400/481

390 Java 2. Manual de Programación

error = false;

try

Syst em. out . pr i nt ( "edad: ' I ) ;

edad = Shor t . par s eShor t ( br . r eadL l ne0) ;catch ( Number For mat Except i on ne)t

Sys t e m out . pr i nt l n( " Val orno vái l do f

error = true;" ( ha de ser UI númer o) ") ;

while ( e r r o r );

S y s t e m . o u t . pr i nt ( "domi c i l i o: ) ;

domi c i l i o = b r. r eadLi ne( ) ;

Sy st em out . pr i nt ( " t el éf ono: ' I ) ;

t el éf ono = br . r eadLi ne ( ) ;

1i s t a. añadi r (new Empl eado ( códi go, nombr e, edad,d o m c i l l o , t el éf ono) ) ;cambi os = true;

break;

docase 2: / / baj as

t

e r ro r=

false;tryt

Sy s t em out . pr i nt ( "Códi go a borra::: " ) ;

códi go = Short . par s es hor t ( b r . eat l Li ne( ) ) ;

1

i

catch ( Number For mat Except i on ne)

Sys t em out . pr i nt l n( " Vai orno vál i do f

error = true;" ( ha de ser un númer o) " ) ;

!iwhile ( e r r o r ) ;

el i mi nado = l i c t a . el i m nar ( códi go) ;if ( el i mi nado)

Sys t em. out .p r 1 n t 1 n ( "Reg c t r o e 1 i mi i ado ) ;

cambi os = true;1else

if ( l i c t a . l ongi t ud( ) ! = O)

else

break;

Sys t e m out . pr i nt l n( " No esta " ) ;

Sys t em out . pr i nt l n( " Li s t a vací a" ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 401/481

Archivos 391

case 3: / / consul t asdo

e r ro r = false;

try I

Sy st em out . pr i nt ( " C ó d i g o a buscar : " ) ;

códi go = L h o r t . p a r s e C h o r t ( b r . r e a d l i n e 0 ) ;

catch ( Number For mat Yxcept i onr e )t

Cys t em out . p r i ~t l n( "Val or no vál i do +

e r ro r = true;"(ha de ser UT. n , h e r o ) " ) ;

while ( e r r o r )posi = l i s t a . bi i scar ( códi go) ;

if ( pos i == - 1 )if ( l i s t a . l o . i g i t u d 0 ! = O)

elseCyst em out . pr i nt 13( "Regi st r o no encoctzado");

Cys t e m out . pr i nt l n( "L i s t a vac i a" ) ;

elsel i s t a. e: ement o( pos i ) . most r ar 0 ;

break ;case 4:

while ( o pc i 6n ! = 4) ;

catch I OExcept i on e)

public static void es cr i b; r ( )

tObj ect Out put St r eam ous =: null;/ / s i hubo cambi os l o s i ' : ; c r i b e en el a r c h i v o

try

if ( cambi os)t

out = new Obj ect Out put Ct r eam( new

ous . wr i t e0bj ec t ( l i s t a ) ;

Fi l eOnt put Ct zean( " empr esa. da t " )) ;

il i s t a = null;

catch ( I OExcept i on e)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 402/481

392 Java 2. Manual de Programación

tCys t em out . pr i nt i n( " Er r or : + e. t oSt r i ng( ) ;

finally

tif (ous ! = null)

ous. cl ose ( ) ;

catch I OExcept i on e)t i

/ * Cl ase Per sonal de l a empr esa. Obj et o que r epr esent a unar r ay de Empl eado * /

import l ava. i o. * ; public class Per sonal implements Ser i al i z abl e

private Empl eado[ ] ar r Empl eados ; private int nEl ement os;

public Per sonal ( )

/ / Cr ea' el arraynEl ement os = O;ar r Empl eados = i ni c i al i z ar ( nE1ement os ) ;

private Empl eado[ ] in icial izar( in t nEl ement os)

treturn new Empl eado [ nEl ement os];

catch ( Ou Of Memory E r r o r eI

Sys t em out . pr i nt l n( e. t oSt r i ng( ) ) ;return ar r Empl eados ;

public Empl eado el ement o( i nt i )

if ( i >= O & & i < nEl ement os)

elsereturn ar r Empl eados[ i 1 ;

I

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 403/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 404/481

394 Java 2. Manual de Programación

i f ( pos1 < nEl ement oc)for ( i n t 1 = pos i ; I < nEl ement os ; I ++)

i f ( ar r Empl eadcc i ] .dev ol v er codi go( ) == cc d)re turn 1 ;

return - 1 ;

/ / Cl ase Empl eado. Obj et o que r epr esent a un r egi s t r o.

i mpor t ; a v a . _ o . * ;publ i c cl ass E n p l e a d o i mpl ement s Ser l ai i z abl e

pr i vat e short codi go;

pr i vat e shor t edad:pr i vat e St r i r g nombr e, domi ci l i o, t el ef ono;

publ i c Empl eado ( )

publ i c nmpl eado( shor t cod, St r i nq z om shor t annos, St r i ng=om St r i ng t f no)I

códi go = c od;noxbre = corn;edad = annos;domi c i l i o = dcm;t el éf or o = t f n o ;

publ i c voi d es t abl ec er Códi go( s hor t cod)i

cóc i go = cod;i

publ i c shor t dev ol v er códi go( )

return códi go;i

publ i c voi d est abi ecer Nombr e( St r i ng nom)I

nombr e = nori;

publ i c St r i ng devol ver Nombr e0

r et ur n nombr e;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 405/481

Archivos

public void ( s h o r t annos)

edad annos;

public s h o r t

r e t u r n edad;

public void dom)

domi ci l i o = dom;

public St r i ngI

r e t u r n c i 1 i o

public void ( St r i ng t f no)

t el éf ono = t f no ;

public St r i ng ( )

re t u r n t ei é f ono

public void most r ar

) ;

Syst em. out )) ;

) ;

;I

14.17. ARCHIVOSDIRECTOS

Los registros en un archivo de acceso directo han de ser de longitud fija. En unarchivo directo, el orden físico delosregistros no tiene por qué corresponderse conaquel en el que han sido introducidos,y los registros son accesibles directamentemediante la especificación de un número que indica la posición del registro con res- pecto al origen del archivo. Los archivos directos, también denominados aleatorios

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 406/481

396 Java 2. Manual de Programación

se abren para lecturay escritura al mismo tiempo. En JavaR a n d o m l l c c e s s F i l ees la clase que permite la apertura de archivos de acceso directoy ofrece el métodos ee k ( p o s i c i ó n ) para el posicionamiento sobre un determinado registro

srchivo.

Nota: A diferenciade los secuenciales:Losarchivos directosseabren para lecturay escritura al mismo tiempo.Permiten el posicionamiento sobre un determinado registro, sin que necesario recorrerlosanteriores.

14.18. FUNCIONESDETRANSFORMACIÓNDE CLAVEY TRATAMIENTO DE COLISIONES

Aunque la información en un archivo directo puede colocarse simplemeforma secuencial, normalmente esto no se hace así, dado que la utilidad fun-

tal delosarchivos directos es proporcionar un rápido acceso a la informaciónesta finalidadlos datos deben situarse de tal manera que puedan ser localizarápidamentey, como éste tipo de archivos permite el posicionamiento directo edeterminado lugar del archivoy el acceso a la información enlos archivos se sueleefectuar utilizando unaclave,la solución consiste en crear una relación perfect-mente definida entre la clave identificativa de cada registroy la posición donde secolocan dichos datos. Laclavees un campo del propio registro quelo identifica demodo único, por ejemplo el número de matrícula de un alumno en el casoarchivo que almacenara datos de alumnoso el NIF, número de identificación fiscal,en el caso de querer guardar información sobrelos clientes de una empresa. Es pre-ciso tener en cuenta que, aunque en ocasiones la clave( x ) podrá ser utilizada paraobtener la posición empleando simplemente la fórmula mostrada en la Tabl14.1,otras veces esto no es posible.

Tabla 14.1. Fórmula queen algunas ocasionesse puedeaplicar para transformar la claveen una posición

Fórmula Clave Posición relativa alcomienzo del Archivo

O5*t amaño r egi s t r oo s i c i o r . = (long) ( x - 1 )* t amaño r egi s t r o;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 407/481

Archivos 397

La citada fórmula no se puedeutilizarcuando el porcentaje de claves a almace-nar en el archivo es reducido en comparación al rango en el que pueden oscilar losvalores de las mismaso cuando las claves son alfanuméricas. La solución en estos

casos es aplicar funciones que transformen las claves a números en el rango conve-niente, a estas funciones se las denomina funciones de conversión(hash),y luegousar dichos números en la fórmula expuesta.El resultado de dicha fórmula hay queconvertirlo a un tipol o n g dado que el argumento des e e k es de tipol o n g .

Cuando se aplica una función de conversión puede ocurrir que dos registros conclaves diferentes produzcan la misma dirección física en el soporte. Se dice enton-ces queseha producido unacolisióny habrá que situar ese registro en una posicióndiferente a la indicada por el algoritmo de conversión. Si esto ocurre, el acceso sehace más lento, por lo que resulta importante encontrar una función de conversiónque produzca pocas colisiones.

Ejemplo

Imagine que las claves identificativas de los registros que desea almacenar oscilanentre los valores1 a 1 O OOO OO, pero la cantidad de registros sobre los cuales se vatener que guardar información sólo es5 O. Según la fórmula de la Tabla14.1,habríaque disponer de un archivo de tamaño

( 1000000- 1) * t amañoRegi st r o

para así poder situar en la posición adecuada cualquier registro que fuera necesarioalmacenar. Este archivo sería demasiado grandey estaría en su mayor parte deso-cupado. Puesto que se sabe que no va a ser necesario guardar más de50 registros,se podría aplicar una función de conversión como la siguiente:

x = cl ave % 50; / * di vi di r por un númer o pr i mo da or i gena un menor número de col i si ones, es

deci r de r est os r epet i dos * /

que convertiría cualquier clave entre1 y 1 0 0 0 0 0 0en números entreO y 49 .Lógicamente con esta función a registros con diferentes claves les puede corres- ponder el mismox y, por tanto, la misma posición.

posi ci ón = x * t amañoRegi st r o; / * l a f unci ón hash apl i cadahace i nnecesar i o r est arl a x * /

Existen muchos tipos de funciones de conversión. La eficiencia de la funciónhushy el método de resolución de colisiones se mide por el número de comparacionesde claves necesarias para determinar la posición en la que se encuentra porfinun

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 408/481

398 Java 2. Manual de Programación

determinado registro. El tratamiento de las colisiones también se puede efecmuy diferentes formas:

Creando una zona especial, denominada zona de excedentes, a la cual -van exclusivamente esos registros. La zona de desbordamiento, excedeosinónimos podría encontrarse a continuación de la zona de datoso ser inclusootro archivo.Buscando una nueva dirección libre en el mismo espacio donde se están-duciendo todos los registros, zona de datos, para el registro colisionado.Loquese puede hacer mediante diferentes técnicas, por ejemplo, direccionamabierto y encadenamiento.

- Eldireccionamiento abiertoresuelve las colisiones mediantela búsqueda, enel mismo espacio donde se están introduciendo todoslos registros (zona dedatos) de la primera posición libre que siga a aquella donde debiera sido colocado el registro y en la que no se pudo situar por encontrarocupada. El archivo se considera circular y cuando se busca sitio paregistro las primeras posiciones siguen a las últimas.

- El encadenamientose basa en la utilización detablas hash que permitanlocalizar rápidamente por la clave la posición donde se ha escrito el aren el disco. Los registros se colocan en el archivo de forma secueexcepto cuando se deseen aprovecharloshuecos dejados por las operacionesde baja.

Ejercicio

Presentar un menú de opciones que permita efectuar altas, bajas y consultasarchivo directo mediante el método de transformación de claves. El arot r osempl eados. dat , almacenarácódi go, nombr e, edad, domi ci -l i o y t el éf ono de los empleados de una empresa.Elcampo clave es elcódi go.

Elmétodo de transformación de claves consiste en introducir los registrossoporte que los va a contener en la dirección que proporciona el algoritmo d-versión. Su utilización obliga al almacenamiento delcódi go en el propio registro,ya que éste no se podrá deducir de la posición, y hace conveniente la incluel registro de un campo auxiliar,ocupado, en que se marque si el registro está ocu- padoo no. Se requiere tener en cuenta que códigos distintos, sometidos al al-

mo de conversión pueden proporcionar una misma dirección, porlo que se tendrá previsto un espacio en el disco para el almacenamiento de los registros qucolisionado. Aunque se puede hacer de diferentes maneras, en este caso se-vará espacio para las colisiones en el propio archivo a continuación de la zdatos. Se supondrá que la dirección más alta capaz de proporcionar el algori

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 409/481

Archivos 399

conversión esFINDATOSy se colocaran las colisiones que se produzcan a partir deallí en posiciones consecutivas del archivo. La zona de colisiones será la compren-dida entreFINDATOSy MAX; siendoMAXuna constante establecida por el progra-

mador que determina el tamaño total del archivo y cuyo valor, lógicamente, serámayor queFINDATOS.

Creación.Cuando se abre el archivo por primera vez se debe realizar un reco-rrido de todo el archivo inicializando el campoocupado a un valor vacío, porejemplo, a espacio en blanco. La inicialización a espacio en blanco del campoocupado se realiza hastaMAX.

Altas.Para introducir un nuevo registro se aplica al campoc ó d i g o de dichonuevo registro el algoritmo de conversión, obteniendo así la posición dondedebe situarse. Se lee la información almacenada en el archivo en dicha posi-ción y si el campoocupado indica que dicho lugar está libre el nuevo registrose sitúa allí; cuando la mencionada posición no esta libre el nuevo registro se sitúen la primera posición libre existente en la zona de colisiones.Consultus.Para localizar un registro se aplicará alcódi go a buscar la funciónde transformación de claves y, si no se encuentra en la dirección devuelta porla función, se examinará registro a registro la zona de colisiones. Para decidirque se ha encontrado habrá que comprobar que el registro no está de bajay que

su c ó d i g o coincide con el que se está buscando, en cuyo caso se interrumpi-rá la búsqueda y se mostrará el registro por pantalla.Bajas.La eliminación de un registro se efectuará mediante baja lógica y con-sistirá en:

- Localizar el registro buscándolo porsu código, primero en la zona direc-ta y, si allí no se encuentra, en la zona de colisiones.

- Una vez localizado eliminar la marca existente en su campoocupado,asignando a dicho campo el valor que se interpreta como vacío, y escribir

nuevamente la información en el archivo en la posición donde se encontró.impor t j a v a . i o . * ;

p u b l i c class Ej empl o2i

p u b l i c s t a t i c f i n a l i n t MAX= 1 0 0 ;/ / Númer o máxi mo de r egi st r os

p u b l i c s t a t i c f i n a l i n t FI NDATOS= 1 5 ;/ / Fi n de l a zona de dat os

s t a t i c I nput Ct r ear nReader i sr = new I nput Ct r eamReader

s t a t i c Buf f er edReader br = new Buf f er edReader ( i s r );

s t a t i c Per sonal 2 ar chi vo = n u l l ;

( Sys t em i n);

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 410/481

400 Java 2. Manual de Programación

p u b l i c s t a t i c v o i d mai n ( St r i ng[ ] args)i

tryI

abr i r ( ) ;operaci ones ( ) ;

1catch ( I OExcept i on e)i:

1f i n a l l yi

t r y

i ar chi vo. cerrar ( ) ;

1catch ( I OExcept i on e)i }

Sys t em out . pr i nt l n( " Er r or : t e. t oSt r i ng( ) ;

}

p ub li c s t a t i c vo i d abr i r ( ) throws I OExcept i on1

Empl eado2 unEmpl eado = n u l l ;

ar chi vo = new Per sonal 2 ( ) ;

i f ( ar chi vo. l ongi t ud( ) ==O)I

Sys t em out . pr i nt l n( "Oper aci ón de i ni ci al i zaci ón") ;

unEmpl eado = new Empl eado2 ( ) ;

unEmpl eado. est abl ecer Ocupado( ' I ) ;

f o r ( i n t i = O; i < MAX; i t +)ar chi vo. añadi r ( unEmpl eado) ;

1else

Sys t em out . pr i nt l n( "Ar chi vo ya exi st e") ;

p ub l ic s t a t i c v oi d oper aci ones( ) throws I OExcept i oni:

short opci ón = O;boolean e r ro r ;

do

i Sys t e m out . pr i nt l n" M E N Ú " );Sys t em out . pr i nt l n ( " 1.Al t as") ;

Sys t e m out . pr i nt l n( "2. Baj as") ;

Sys t e m out . pr i nt l n( " 3. Consul t as") ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 411/481

Sys t em out . pr i nt 1n( "4. Fin " );Sys t em out . pr i nt l n( ) ;Syst em out . pr i nt ( " E L j aopci ón: " ) ;

do

{error = f al se;tryi

opci ón = Shor t . par seShor t ( new Buf f er edReader ( newI nput St r eamReader ( Syst er n. i n) ) r eadLi ne( ) ) ;

1cat ch ( Number Format Except i on ne){

Syst em. out . pr i nt l n( "Val or no vál i do " +

error = t rue ; "( ha de ser un númer o) ") ;)

)whi l e ( opci ón < 1 1 1 opci ón > 4 1 I e r r o r ) ;swi t ch ( opci ón)I

case 1: / / al t asal t as ( ) ;

break ;

baj as ( ) ;

break ;

consul t as ( ) ;

br eak;

case 2: / / baj as

case 3: / / consul t as

case 4:1

1whi l e( opc i ón ! = 4 ) ;

)

publ i c st at i c i n t hash( i nt códi go){

}return códi go % FI NDATOS;

publ i c st at i c voi d al t as ( ) t hr ows I OExcept i on{

Empl eado2 unEmpl eado = nul l ;i nt posi = - 1;

shor t códi go = O;shor t edad = O;St r i ng nombr e, domi ci l i o, t el éf ono;bool ean er r or , encont r adoHueco;char ocupado;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 412/481

402 Java 2. Manual de Programación

/ * se t r at a l a excepci ón par a que vuel va a peci r el dat o

doi

en caso de er r or * /

error = false;try

Sys t e m out . pr i nt( "códi go: ' I ) ;

códi go = Short . par seshor t ( b r .r eadLi ne ( ) ) ;

I

catch ( Number For mat Except i on ne)i

Sys t em out . pr i nt l n( "Val or no vál i do "+

error = true;

"( ha de ser un númer o) " ) ;

1while ( e r ro r ) ;

/ * se compr ueba si est á l i br e l a posi ci ón cor r espondi ent e

posi = hash ( códi go) ;unEmpl eado = ar chi vo. el ement o( pos i ) ;encont r adoHueco = false;/ / si no est á l i br e se busca hueco en l a zona dc? col i s i onesif ( unEmpl eado. evol ver Ocupado( ) == ' *' )

en l a zona de dat os * /

tposi = FI NDATOS- 1;while ( pos i < MAX- 1 & & encont r adoHueco)I

posi = posi + 1;unEmpl eado = ar chi vo. el ement o( pos i );

if ( unEmpl eado.devol ver Ocupado( ) != ' * ' )

encont r adoHueco = true;1

i

else

if ( encont r adoHueco)i

encont r adoHueco = true;

/ / Leer ot r os camposSys t e m out . pr i nt( "nombr e: ' I ) ;

nombr e = br . r eadLi ne ( ) ;

doi

error = false;

tryI

Sys t em out . pr i nt ( "edad: ' I ) ;

edad = Shor t . par s eShor t ( br . r eadL i ne( ) ) ;1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 413/481

Archivos 403

catch ( Number For mzl t Except i onne)!

Syst em. out . p r in t : ln( "Val or no vál i do "+

error = true;(ha de ser un númer o) ) ;

1

i

while ( e r r o r ) ;

Sys t em out . pr i nt ( "domi ci l i o: " ) ;

domi ci l i o = br . r ead1, i ne ) ;

Sys t em out . pr i nt ( " t el éf ono: " ) ;

t el éf ono = br . r eadL i ne0 ;

ocupado = I * ' ; / / s e mar ca como ocupado/ * se escr i be en l a posi ci ón posi que puede per t enecer

ar chi vo . poner el ement o( posi , new Empl eado2 ( códi go, nombre,edad, domi ci l i o, t el éf ono, ocupado) ;

a l a zona de dat ' 3. s o a l a de col i si ones * /

11

public static voi d baj as ( ) throws I OExcept i on

Empl eado2 unEmpl eado = null;int posi = - 1;short códi go = O;

boolean er r or , el i mi nado, encont r ado;

doi

error = false;try

Sys t e m out . pr i nt ( "Códi go a bor r ar : " ) ;

códi go = Short . par seshor t ( b r . eadLi ne( ) ) ;

icatch ( Number F0r mat E: xcepti on ne)i

Sys t em out . pr i nt l r i( "Val or no vál i do "+

error = true;" ( ha de ser un númer o) ) ;

1i

while ( e r r o r ) ;

/ / se busca en l a zona de dat osposi = hash ( códi go) ;

unEmpl eado = ar chi vo. el ement o( pos i );

encont r ado = false;

if ( unEmpl eado. devol ver Ocupado( ) ==' *'& & unEmpl eado. devol ver CÓdi go( ) == códi go)

elsei

encont r ado = true;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 414/481

404 Java 2. Manual de Programación

/ * si no se encont r ó en l a zona de dat os se r ecor r esecuenci al ment e l a de col i si ones par a i nt ent arencont r ar l o * /

posi = FI NDATOC- 1 ;

while ( pos i < MAX- 1 & & ! encont r ado)t

posi = posi + 1;unEmpl eado = archi vo. el ement o( pos i ) ;

if ( unEmpl eado. evol ver Ocupado( ) == *'& & unEmpl eado . devol ver CÓdi go) == códi go)

encont r ado = true;1

1if ( ! encont r ado)

elsei

Sys t e m out . pr i nt l n( "No esta ") ;

/ / se marca como l i br eunEmpl eado. est abl ecer Ocupado( ' I ) ;

/ / se escr i be en l a posi ci ón adecuadaar chi vo. poner el ement o( posi , unEmpl eado) ;

1

public static void consul t as ( ) throws I OExcept i on{

Empl eado2 unEmpl eado = null;int posi = - 1;short códi go = O ;

boolean encont r ado, er r or ;

do(

error = false;try(

Cyst em out . pr i nt ( "I nt r oduzca el códi go a buscar " ) ;códi go = Shor t . par s eShor t ( br . r eadL i ne( ) ) ;}catch ( Number For mat Except i on ne)I

Cys t em out . pr i nt l n( "Val or no vál i do t

error = true;"( ha de ser un númer o) ") ;

11while ( e r ro r ) ;

/ / se busca el códi go en l a zona de dat osposi = hash ( códi go) ;

unEmpl eado = ar chi vo. el ement o ( posi ) ;

encont r ado = false;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 415/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 416/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 417/481

Archivos 407

p u b l i c i n t l ongi t ud ( ) throws I OExcept i on

r e t u r n ( i n t ) Mat h. c e i l ( (doub le) r a f . l engt h ( ) / 1or gReg);

p u b l i c vo id cer rar ( ) throws I OExcept i onif ( r a f ! = n u l l )

r a f .cl ose ( ) ;I

i

/ / Cl ase Empl eado2. Obj et o q u e r epr esent a un r egi st r o

import j ava. i o. * ;

p u b l i c c l a s s Empl eado2i/ / campo cl ave

p r i v a t e shor t códi go; p r i v a t e shor t edad; p r i v a t e St r i ng nombr e, dom c 1 i o, t el éf ono ;

/ / campo par a ef ect uar b31as l ógi cas, por mar ca p r i v a t e ch a r ocupado;

p u b l i c Empl eado2 ( )i

códi go = O;edad = O;nombr e = ;

domi ci l i o = ;

t el éf ono = " ' I ;

oc; i pado = ' ' ;

/ / cadena nul a

/ *espaci o en bl anco mar ca e-r egi st r o como vaci o * /

p u b l i c Empl eado2( s h o r t cod, St r i ng nom, s h o r t annos, Str1r.gdom, St r i ng t f no, ch a r m3r ca)I

códi go = cod;nombr e = nom;edad = annos;domi ci l i o = dom;t el éf ono = t f n o ;ocupado = mar ca;

i

p u b l i c long t amaño ( )

i/ * t amaño q u e ocupan l os campos de dat os. Un shor t ocspa 2

byt es.Se ut i l i za par a ver s i el t amaño es per mi t i do y no seexcede l a 1ongReg est abl eci da * /

r e t u rn 2 + nombr e. l engt h( ) * 2 + 2 + dom ci l i o. l engt h( ) * Z+ t el éf ono. l engt k, ( )* 2 + 2;

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 418/481

408 Java 2. Manual de Programación

publ i c voi d est abl ecer Ocupado( char marca)

ocupado = mar ca;

publ i c char devol ver ocupado( )

r et ur n ocupado;

publ i c voi d es t abl ecer Códi go( shor t cod)

códi go = cod;

publ i c shor t devol ver códi go( )

return códi go;I

publ i c voi d est abl ecer Nombr e( St r 1ng nom)

nombr e = nom;1

publ i c St r i ng devol ver Nombr e( )

r et ur n nombr e;1

publ i c voi d es t abl ec er Edad( s h0r t annos)I

edad = annos;

publ i c shor t devo l ve r Edad0

return edad;

publ i c voi d es t ab? ec er Dom c i l i o( St r i ngdorn)1

domi ci l i o = dom;1

publ i c St r i ng devol ver Dom c i l i o( )i

re turn dorn; ci l l o;

publ i c voi d es t abl ec er Tel ef ono( Ct r i ngt f n o )

t el kf onc = t f n o ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 419/481

Archivos 409

public St r i ng I

return t el éf ono;

public void most r ar

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 420/481

CA 15

Estructuras de datdefinidasporprogramado

CONTENIDO15.1. Listas.15.2. Implementación de una lista.15.3. Lista ordenada.15.4. Listas genéricasy uso de interfaces.15.5. Listas doblemente enlazadas.15.6. Pilas.15.7. Colas.15.8. Colas circulares.

411

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 421/481

412 Java 2. Manual de programación

Java, comolos restantes lenguajes de programación, suministrauna serie deti’posde datos básicos y una serie de operacionespara su manipulación. En ocasiones, estos tipos de datos no son

los adecuados para resolver un problema y es necesario crearnuevos tipos de datos, que será preciso definir especificando tantosus datos componentes como las operaciones quelos manipulan.Estos tipos de datos se definen mediante clases y proporcionanuna de las características más importantes de laP O 0 (Pro-gramación Orientada a Objetos), lareutilización de componentes.Las colecciones de datos organizados y a las que se accede deforma perfectamente definida constituyen unaestructura de datos.Existe un cierto número de estructuras de datos de reconocida uti-lidad, cuyo uso se repite frecuentemente en los programas, y que

pueden llegar a considerarse como una extensión delos tiposbásicos del lenguaje; estas estructuras tienen un nombre y unascaracterísticas establecidas y entre ellas destacan:listas, pilas,colas, árboles y grabs. Las tres primeras sonestructuras de datoslineales, puesto que en ellas cada elemento tiene un único prede-cesory un Único sucesor, mientras que las dos Últimas sonestruc -turas no lineales. En este capítulo se describen estructuras dedatos lineales, ya quelas estructuras de datos no lineales quedanfuera de los objetivos de este libro.

Dada la importancia de las estructuras de datos, Java ofrece

clases que implementan algunas de ellas: j ava. u t i 1 . vect or ,j ava. ut i l . St ack, j ava. ut i l . Has t abl e, j ava. ut i l . Bi t Set .

15.1. LISTAS

Unalistaes una secuencia de elementos del mismo tipoo clase almacenados en me-

moria. Las listas son estructuras lineales, donde cada elemento de la lista, exc primero, tiene un único predecesor y cada elemento de la lista, excepto el últimun único sucesor.Elnúmero de elementos de una lista se denominalongitud.En unalista es posible añadir nuevos elementoso suprimirlos en cualquier posición.

Existen dos tipos de listas:contiguasy enlazadas.En unalista contigualos ele-mentos son adyacentes en la memoria de la computadoray tienen unos límites,izquierdo y derecho, que no pueden ser rebasados cuando se añade un nuev-mento. Se implementan a través dearrays.En este tipo de listas la insercióno eli-minación de un elemento, excepto en la cabecerao final de la lista necesitará unatraslación de parte de los elementos de la misma (Fig. 15.1). Unalista enlazadasecaracteriza porque los elementos se almacenan en posiciones de memoria qson contiguas (adyacentes), por lo que cada elemento necesita almacenar l-rencia al siguiente elemento de la lista.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 422/481

Estructuras d e datos definidas por el programador 41 3

Las listas enlazadas son mucho más flexibles y potentes que las listas contiguasy, en ellas, la inserciónoeliminación (supresión) de un elemento no requiere el des- plazamiento de otros elementos de la misma.

Las listas enlazadas (Fig.15.3)se suelen construir vinculandonodos (objetosque contienen al menos un miembro que es una referencia a otro objeto de su mismotipo, Fig.15.2).Esta forma de organización resulta la más adecuada si el número deelementos a almacenar en un momento dado es impredecible. Si se utiliza un array para almacenar una serieo colección de elementos; en el caso de que el número deelementos exceda el tamaño establecido para el citado array en el momento de sucreación, los nuevos elementos no se podrán almacenar en dicho array y la posiblesolución será la creación de un nuevo array de las dimensiones adecuadasy el tras- paso de la información del viejo al nuevo array. Se ha de tener en cuenta que la claseVector de Java permite crear estructuras de datos de tipo array de objetosredi-mensionables durante la ejecución de un programa. En el caso de utilizar nodos vin-culados para almacenar la información,éstosse crean y destruyen conforme serequieran, de esta manera la lista aumentaodisminuye de tamaño dinámicamente ysólose llena cuando se agotala memoria disponible. El acceso a la lista se realizamediante una referencia al primer nodo de la mismay, para marcar sufin,se esta- blece la referencia de enlace del último nodo an u l l .

L L o n g i t u d Vacíos Límitede la lista superior

Límiteinferior

Figura 15.1. Lista contigua.

public clas NodoI

Obj ect i nf o;Nodo si g;

Nodo ( Obj ect i nf or maci ón, Nodo si gui ent e)(

1

i nf o = i nf or maci ón;s i g = si gui ent e;

I

Figura 15.2. Nodo.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 423/481

41 Java 2. Manual de programación

i nf o s i g

I

i nf o s i g

I

Figura 15.3. Lista enlazada.

Las listas enlazadas se clasifican a su vez en tres tipos: circulares, dobleenlazadasy doblemente enlazadas circulares.

Circulares. ElÚltimo elemento referencia al primero de la lista (Fig.15.4).

f i n

Figura 15.4. Lista enlazada circular.

Doblemente enlazadas. Su recorrido puede realizarse tanto desdef rente af i nal como desdef i n a l a f r en te . Cada nodo de dichas listas consta de unmiembro con informacióny otros dos que referencian objetos de su mismo ti( a n t y s i g ) , uno para referenciar al nodo sucesory otro al predecesor (Fig.15.5).

f r ent e

Figura 15.5. Lista doblemente enlazada.

Listas doblemente enlazadas circulares. En este tipo de listas el miembroa n tdel primer nodo de la lista referencia,o apunta, al último nodoy el miembros i gdel último nodo al primero (Fig.15.6).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 424/481

Estructuras de datos definidas por programador 41

i ni ci o

Figura 15.6. Lista doblemente enlazada circular.

Resumen:Una lista enlazada se caracteriza porque los elementos se almace-nan en posiciones de memoria que no son contiguaso adyacentes. Cada ele-mento necesita almacenar al menos una referencia al siguiente elemento de lalista. En una lista enlazada la insercióno eliminación (supresión) de un ele-mento no requiere el desplazamiento de otros elementosde la misma.

Importante:Una lista enlazada que se implementa vinculando nodos aumen-ta y disminuye de tamaño dinámicamente.

I

15.2. IMPLEMENTACIÓNDE UNA LISTA

Losmétodos básicos que necesitaría implementar una lista sonlosespecificados enla claseLi st a:

El constructorLi sta crea una lista vacía asignando el valorn u l 1 al miem- bro privado inicio que contiene la referencia al primer nodo de la lista.El métodovaci a determina sila lista esta vacía comprobando si la referen-cia al primer nodo de la lista esnul l . Devuelvet rue cuando la lista estávacíay f a s e en caso contrario.El método crea un nuevo nodo donde almacena unareferencia al objeto que recibe como parámetroy otra ali ni ci ode la lista, por último asigna ai ni ci oel nuevonodo y convirtiéndolo así en el primerelemento de la lista.El método guarda en auxi la referencia al primer nodode la lista,y quita éste nodo de la lista, asignando ai ni ci o la referencia alsiguiente nodo de la lista, contenida eni ni ci o. si g; por Último, devuelvela referencia al nodo que se ha quitado(auxi ).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 425/481

416 Java 2. Manual de programación

public class Li s t ai

private Nodo i ni ci o;

Li s t a ( )i

i ni ci o = null;

public boolean vací a ( )

(

1return ( i n i c i o == null) ;

public void i ns er t ar Pr i nc i pi o( 0bj ectel ement o)

Nodo nuevoNodo = new Nodo ( el ement o, i ni ci o) ;

i ni ci o = nuevoNodo;}

public Nodo bor r ar Pr i nc i pi o0(

if ( vací a ) )

treturn null;1elseI

Nodo auxi = i n i c i o ;i ni ci o = i n i c i o .si g;return ( auxi );

I1

public void most r ar L i s t a( )i

Nodo act ual = i n i c i o ;while ( actual ! = null)(

ac t ual . r nos t r ar Nodo0;act ual = act ual . s i g;

1I

public class Nodoi

public Obj ect i nf o; public Nodo si g;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 426/481

Estructuras de datos definidas por el programador 417

public Nodo ( Obj ect i nf or maci ón, Nodo si gui ent e)I

i nf o = i nf or maci ón;s i g = s i gui ent e;

1 public void most r ar Nodo( )

t

1

Sys t em out . pr i nt l n( i nf o) ;

}

public class Pr uebaI

public static void mai n ( St r i ng[ ar gs)

t Li s ta unaLi s t a = new Li s t a ( ) ;

unaL i s t a. i nser t ar Pr i nc i pi o( newI nt eger ( 1) ) ;unaL i s t a. i nser t ar Pr i nc i pi o( newI nt eger ( 2) ) ;unaL i s t a. mos t r ar L i s t a( ) ;while ( unaL i s t a . vac í a( ) )I

Nodo unNodo = unaL i s t a. bor r ar Pr i nc i pi o0;unNodo. most r ar Nodo0;

1unaLi s t a. mos t r ar L i s t a( ) ;

1

En la implementación expuesta, la inserción de un nuevo elemento se efectúasiempre por el principio de la lista y la supresión también. En muchas ocasionesesta situación no es la deseada,y lo que se desea es buscaro suprimir un ele-mento determinado. Estas acciones requieren añadir métodos que permitan la búsqueday el borrado de elementos con un determinado valor en un campo dedatos clave.

15.3. LISTA ORDENADA

Unalista está ordenada cuando sus elementosestán organizados, en orden cre -

ciente o decreciente, por el contenido de uno de sus campos de datos. Para queuna lista resulte ordenada es probable que la inserción de nuevos elementosrequiera colocarlos en posiciones intermedias de la misma (Fig.15.7).Las listas

enlazadas realizan este tipo de inserciones más eficientemente que las contiguas,al no ser necesario para insertar un nuevo elemento desplazar ningún otro de lalista. También resultanmásrápidas las operaciones de supresión de elementos en posiciones intermedias mediante el empleo de este tipo de listas (Fig.15.8).

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 427/481

418 Java 2. Manual de programación

i n f o s i g

I

i n i c i o

...... *........--c i n f o s i g --+ i n f o s i g -+

I I

x

I

i n f o s i g

i

L t

........

I I

-+ i n f o s i g -+ i n f o s i g --+

I x2 I

xi X i X3

nul lI xn I

Figura 15.7. Inserción de un nuevo elemento en una posición intermedia de la lista.

i n i c i o ............................................

Figura 15.8. Supresión de un elemento en una posición intermedia de la lista.

< . ,l n l C l O .................. ~

I- 1 I / I r I

Figura 15.9. Supresión del primer elemento de la lista en una listacon varios elementos.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 428/481

Estructuras de datos definidas por programador 41

.........................

Figura 15.10. Supresión del primer elemento de la listaen una lista con un único elemento.

La claseLi s muestra las operaciones básicas para necesarias paratrabajar con una lista encadenada ordenada construida mediante vinculación denodos. Estas operaciones san:

El constructorLi st aor denada crea una lista vacía, asignando el valornul l al miembro privadoi ni ci o que contiene la referencia al primernodo dela lista.El métodovaci a comprueba el valor dei ni ci o y devuelvetrue cuandola lista está vacía, es decir, cuando la referencia al primer nodo esnul l . y

f al se en caso contrario.El métodoi nser t ar crea un nuevo nodo de la clase capaz de alma-cenar un entero, una cadenay la referencia a otro objeto de su misma clase,yalmacena en dicho nodo lacl ave y el nombre ai nser t ar . El métodoutili-za una variable de la claseNodo2 para recorrer la lista hasta que esta se acabeo encontrarun elemento concl ave menoro igual al que se desea insertar. Enotra variable,ant er i or , de la clase Nodo2 guarda en todo momento la refe-rencia al elemento anterior alqueen ese momento está siendo visitado. Cuandotermina el recorrido inserta el nuevo nodo a contiuación delant er i or . Si elant er i or es nul l , puede significar que la lista está vacíao que la clave del

primer elemento de la misma es menoro igual a la del nuevo y, en ambos casos,dicho nuevo elemento ha de situarse al comienzo de la lista.El métodoborrar intenta suprimir de la lista un elemento cuyo campocl ave almacena un determinado valor. Para ello, recorre la lista buscando elelemento, de forma análoga a la indicada para lai nser ci ón, empleandotambién las variablesact ual y ant er i or . Si encuentra el elementoy es el primero, hace quei ni ci o referencie al siguiente nodo de la lista, mientras

que si lo encuentra en cualquier otra posición,lo que hacees que el camposi g del elementoant er i or referencie al elemento siguiente( act ual . c ig ) .El método utiliza la variableact ual para efectuarun recorri-do de la lista y presentar la información almacenada en cada uno de sus nodos

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 429/481

420 Java 2. Manual de programación

/ / l i st a or denada descendent ement e public class Li st aor denada

i private Nodo2 i ni ci o;

Li st aor denada ( )

i

1

i ni ci o = null;

public boolean vací a ( )

return ( i ni ci o == null) ;

1

public void i nser t ar ( in t cl ave, St r i ng nombr e)i

Nodo2 nuevoNodo = new Nodo2 ( cl ave, nombre) ;

Nodo2 ant er i or = null;Nodo2 act ual = i n i c i o ;

boolean pasado = false;/ * r ecor r e l a l i st a hast a encont r ar un el ement o con cl ave menor

while ( actual ! = null & & ! pasado)i

o i gual al que se desea i nser t ar * /

if ( cl ave < act ual . cl ave)i

ant er i or = actual ;act ual = act ual . s i g;

1else

pasado = true;I/ * i nser t a el nuevo el ement o a cont i nuaci ón de ant er i or ,

s i el ant er i or era nul l s i gni f i ca que ha de i nser t ar seal comi enzo de l a l i st a * /

if ( ant er i or == null)i ni ci o = nuevoNodo;

elseant er i or. s i g = nuevoNodo;

nuevoNodo. si g = act ual ;i

public Nodo2 bor r ar ( in t cl ave)i

Nodo2 ant er i or = null;

Nodo2 act ual = i n i c i o ; boolean encont r ado = false;

/ / se r ecor r e l a l i st a buscando el el ement owhile ( actual ! = null & & !encontrado)i

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 430/481

Estructuras de datos definidas por el programador 421

if ( c l ave == ac t ual . c l ave)

elseencont r ado = true;

I

ant er i or=

ac tual ;act ual = act ual . s i g;I

/ / si se encuent r a s e bor r aif ( encont r ado)

/ * si es el pr i mer o se hace que i ni ci o r ef er enci e als i gui ent e el ement o de l a l i s t a, s i no l o que sehace es que el campo si g del el ement o ant er i orr ef er enci e al el ement o si gui ent e * /

if ( ant er i or = = null)

else

return ( ac tual ) ;

i ni ci o = ac t ual . s i g;

ant er i or. s i g = act ual . s i g;

ireturn null;

public void buscar ( in t c l ave)1

Nodo2 ant er i or = null;Nodo2 act ual = i n i c i o ;

boolean er . cont r ado = false;/ / se r ecor r e l awhile ( ac tual !i

if ( c l ave ==

encont r adoelse!

ant er i or =

l i st a buscando el el ement o con di cha cl ave= nuii & & !encontrado)

ac t ual . c l ave)= true;

ac tual ;act ual = act ual . s i g;

1/ / si se encuent r a s e muest r aif ( encont r ado)

elseac t ua l . mo s t r a r No do 0;

Sys t em out . pr i nt l n( “No es t a” ) ;

1

public void mos t r ar l i s t a 0i

Nodo2 ac t ual = i ni Ci 0;while ( ac tual ! = null)

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 431/481

422 Java 2. Manual de programación

ac t ual . mos t r ar Noao( ) ;ac t ual = ac t ual . s i g;

public class Nodo2

public int c l ave; public St r i ng nomsre; public n'odo2 s i g ;

public Nodo2( in t cl , St r i ng n)

cl ave = c l ;nombr e = n;s l g = null;

public void most r ar Nodo( )

Cys t er . out . pr i nt l n( " Cl ave: "- cl ave+" Nombr e " +nombr e) ;

I

public class P r ~e b a 2i

public static void mai n ( Ct r i nq a rg s )

Li st aordenada u n a i i s t a = new L i s t a Or de na da O;ur. aLi s t a.i nser t ar ( 4 , "Pedro" ) ;

unaUi c t a. i nser t ar ( 1 , "Lui s" ) ;

unaL i s t a. i ns er t ar ( 8 , " Tomas " ) ;

; naLi s t a. mos t r ar Li s t a( ) ;/ / . * .

15.4. LISTASGENÉRICASY USO DE INTERFACES

A diferencia de la claseLi st a, la claseLi st aor denada creada en el apartadoanterior es demasiado específica, ya quesólo puede almacenar un tipo enteroy unacadena. Para arreglar situaciones como éstay que una lista pueda almacenar datosde cualquier clase,los métodos de la lista deberán trabajar con la superclOb] ec t . Esta estructura permitirá, siempre que se efectúenlas conversiones ade-cuadas, utilizar la lista para almacenar objetos de distinta clase. Se ha de tepre-

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 432/481

Estructuras de datos definidas por el programador 423

sente que Java convierte implícitamente una referencia a un objeto de una subclaseen una referencia asu superclase y también que es conveniente que en un objetolistu sólose almacenen datos homogéneos, de una misma clase.

En la claseL i s aor denada,se requiere en ocasiones efectuar comparaciones; por ejemplo, para encontrar un determinado elemento en una lista, dado que las lis-tas genéricas pueden almacenar toda clase de objetos, debe dejarse a los tipos dedatos laiinpleinentaciónde los métodos de comparación. Como ya se ha comenta-do en ocasiones anteriores, esta característica se consigue definiendo una interfaz,Compar abl e y declarando la información almacenada en el nodo, en lugar de per -teneciente a la claseObj ect , como perteneciente a la interfazCompar abl e. Así, para construir unaL i s aOdenadaGener i cay utilizarla para almacenar enellauna serie de libros ordenados por elISBNse requiere:

Definir la interfaz de comparación; en este caso, concebida para admitir varioscriterios de ordenación.

interface ComFar abLe{

boolean mencr que ( Co- , par abl ec , in t cr : te r ic ) throws Ex cept i un;

DeclararCompar abl e el campo de datos del nodo,i n f .

/ / Ncdo compar abl e public class Nodo3

private Compar abl e i nf ; private Ku'ado3 s i g;

Nodo3 ( compar abl e i nf or maci ón, Ncdo3 s i gu- ent e)

i n f = i nf or mac i c n;c i g = s i gui ent e;

. . .1

Diseñar la lista de forma que susinétodoctrabajen conCompar abl e.

/ / L i s t a enl azada or denada es tandar par a Coppar abl es public class L- st aCdeoadaSener i caI

private int c r i t e r i o ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 433/481

424 Java 2. Manual de programación

private Nod03 pr i mer o;

Li st aOdenadaGeneri ca( i ntcr i t er i o)i

pr i mero = null;

t h i s . c r i t e r i o = cr i t er i o;i

/ / . . .

public void i nser t ar ( Compar ab1eel ement o) throws Except i oni

1

/ / . . .

public Comparabl e obt ener ( Compar ab1eel ement o) throws Except i ont

/ / . . .1

/ / . . .

Hacer que los tipos de datos a colocar en la lista implementen los métodcomparación.Así, para construir una lista de libros ordenada porISBN,laclaseLi br odebe implementar el métodomenor que.

class Li br o implements Compar abl ei

private St r i ng aut or ; private St r i ng t i t ul o; private long I SBN;

public L i br o( St r i nga, St r i ng t , long i )t

autor = a;t i t u l o = t ;I SBN= i ;

1

public booiean menor que( Compar ab1ec, int cr i ter i o) throws Except i on{

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 434/481

Estructuras de datos definidas por el programador 425

if ( ! ( c instanceof Libro)

tthrow new Exception ( " Error de comparación " ) ;

i

return( (Libro) ) .ISBN < ISBN) ;

1

public String devo lverAu to r )

t

return (autor) ;

I

public String devo lverTi tu lo 1

(

r e tu rn ( t i tu1o ) ;

i

publ ic l ong devo lver ISBN )

I

1return (ISBN) ;

íjercicio

Diseñar una claseListadeLibros, que permitaefectuarla gestión de una biblioteca.

La claseLis adeLibros representa un array unidimensional cuyos elemen-

tos son listas enlazadas ordenadas de la claseListaOrdenadaGenerica y ten-drá métodos para efectuar el almacenamiento, recuperación y eliminación de loslibros.Los libros se almacenan por inicial de título eISBN.La inicial del título( a - z ) determina la posición en el array unidimensional donde será colocadoel libro. Como cada elemento del array es unaListaOrdenadaGenerica, loslibros que comiencen por la misma inicial serán situados en la correspondiente listaenlazada ordenados porISBN.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 435/481

426 Java 2. Manual de programación

z

Figura 15.11. La claseLi sta enl azada.

Los aspectos más importantes en cuanto a genericidad de la clLi st aOrdenadaGener i ca acaban de ser comentados, ya que esta clase ha si

puesta como ejemplo para exponer las características de las listas genéricas. P parte, Li st aOr denadaGener i ca es una lista ordenada y los métodosest al i aci a, i nser t ar y el i mi na funcionan de manera similar a los ya expli-cados( vaci a, i nser t ar y borrar) de la claseLi st aor denada, excepto porel empleo del métodomenorque, en lugar de un operadorrelacional, para efectuarlas comparaciones entre los elementos de la listay el elementoa insertaro eliminar.Otros detalles se especifican en el código como comentarios.

ComoLi st adeLi br os representa un array cuyos elementos pertenecen alaclaseLi st aOr denadaGener i ca, su constructor crea e inicializael array, cre-ando cada uno de sus objetos, de la claseLi st aOr denadaGener i ca. El méto-do guar dar : 1) llama al método1 i s t a y le pasa como parámetro el título dellibro, para que lista determine por la inicial del título la posición en el arralista donde el libro debe ser insertado; 2) invoca al métodoi nser t ar deLi s t aOr denadaGener i ca para queefectúela inserción.Losmétodosr ecuper ary el i mi nar también recurren al i st a para determinar la posición en el array dla lista donde el libro a consultaro suprimir debe encontrarse situado; la diferen-cia entre ambos es quer ecuper ar una vez localizada la lista llama aobt ener paraque encuentre el elemento dentro de la misma, mientrasel i mi nar llama ael i -mi na para que suprima dicho elemento de la lista.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 436/481

Estructuras de datos definidas por programador 427

Otras clases e interfaces implementadas son:

Clase delos nodos de laLi st aOr denadaGener i ca.

Li br o.Clase que implementa la interfazCompar abl e.Compar abl e. Interfaz de comparación.NoEst a. Excepción general de búsqueda.Pr uebaL. Clase de prueba para comprobar el buen funcionamiento delejercicio.

p u b l i c class Li st adeLi br os

Tamaño del ar r ay de i ndexaci ón

f i n a l s t a t i c i n t 1 =

Decl ar aci ón del ar r ay de I ndexaci ón

p u b l i c l i br os;

/ * Const r uct or : I ni ci al i zaci ón del ar r ay de i ndexaci ón asicomo de sus el ement os l i st a.

La ordenaci ón en cada una de l as l i st as se ef ect úaascendent ement e por el I SBNy car ece de val or elpar ámet r o pasado a Li st aOr denadaGener i ca * /

p u b l i c Li st adeLi br osI

l i br os = newf o r l engt h; i t +)

l i br os = new Li st aOr denadaGener i ca ( O ) ;

Si mpl e conver si ón de cl ave de l i s t a

i n t l i s t a ( St r i ng t i t ul o)

r e t u r n ( ) ( O) ;

de l i br os

i n t!

i n t c = O ;f o r ( i n t i =

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 437/481

420 Java 2. Manual de programación

c += l i br os [ i ] nel ems ) ;

r e t u r n ( c ) ;

1

/ / Mét odo par a el al macenami ent o

publ i c voi d guar dar ( Li br o l i br o){

tryI

1ca t ch( Except i one) )

l i br os [ l i s t a( l i br o. devol ver Ti t ul o( ) ) ] . i ns er t ar ( l i br o) ;

/ / Se i nt er cept a l a posi bl e excepci ón de i nser t ar

/ / Mét odo par a l a r ecuper aci ón ( vea cl ass NoEst a)

publ i c Li br o r ecuper ar ( St r i ng t i t ul o, l ong I SBN) throws NoEst a{

Li br o nuevo = n u l l ;try{

nuevo = ( Li bro)l i br os [ l i s t a ( t i t u l o ) . obt ener ( newLi br o( " " , t i t ul o, I SBN) ;

}cat ch ( Except i on e) )

/ * Nót ese l a necesi dad de ' downcast i ng' Dado que l a l i st aes est ándar par a obj et os ' compar abl es' ( vea i nt er f aceCompar abl e) hay que r eal i zar una i nevi t abl e conver si óna Li br o.Nót ese t ambi én que puest o que en est e mét odo se conocel a i nt egr i dad de l a l i st a que se manej a( t odos sus obj e -t os son L i br onose r eal i za compr obaci ón de s egur i dadpar a est e downcast i ng ( al cont r ar i o que en l a cl aseLi br o) * /

if ( nuevo == nul l )

return(nuev0) ;

t hr ow new NoEst a ( ) ;

\

/ / Met odo par a l a el i r ni nac i Ón( veacl ass NoEst a)

publ i c voi d el i mi nar (St r i ng t i t ul o, l ong I SBN

(try{

1l i br os [ l i st a ( t i t ul o) . el i mi na( new Li br o( " " t i t u l o , I SBN) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 438/481

Estructuras d e datos definidas por el programador 429

cat ch( Except i on e) }

pr i vat e i nt cr i t er i o;pr i vat e Nodo3 pr i mer o;

L i s t aOr dena daGener i c a( i ntcr i t er i o)t

pr i r , er o = nul l ;t h i s . c r i t e r i o = cr i t er i o;

1

/ / I nf or ma sobr e si l a l i s t a es t á o no vaci a

publ i c bool ean es t av ac i a ( )

tr et ur n ( pr i mer o == nul l ) ;

/ / No de el ement cspubl i c i nt nel emc ( )

i nt n = C;~ o d o 3aux = pr i mer o;whi l e ( aux ! = nul l )I

aux = aux. devol ver si gui ent e ( ) ;

ni +;

return ( n );

/ * Mét odo par a i nser ci ón. Ei hecho de que se per mi t a ar r oj aruna excepci ón es debi do a que se puede Lnt ent ar i ncrod> c: rcompar abl es de mét odos menor que i ncompat i bl es l o qi ; e dar i aun pr i mer avi so aquí * /

publ i c voi d i nser t ar ( Compar ab1e el er nent c) t hr ows Except Lon

Nodo3 nuevo = new No d o3 ( e l eme~t o ,n u l l ) ;Nodo3 a7J xl = nul l ;Nodo3 aux2 = pr i mer o;whi l e ( aux2 ! = nul l & & aux2 . ?~enor q~. e( nuevo, r : t e r io ) )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 439/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 440/481

Estructuras de datos definidas por el programador 431

whi le ( aux2 ! = n u l l & & aux2. menor que( ael i mi nar , cr i t er : ~) )

auxl = aux2;acx2 = aux2. devol ver Si gui ent e( ) ;

i f ( aux2 ! = n u l l & & ael i m nar . menor que( aux 2, c r i t e r i o ) )

i f ( a u x 1 == n u l l )

elsepr i mer o = n u l l ;

auxl .as i gnar s i gui ent e( a u x 2 . devol ver si gui ent e ( 1) ;1

/ * Nodo3 compar abl e que i mpl ement a l a f ac i l i dad adi c i c i alde del ar ce compar ar por el mi smo s i n- pl i f , r andc l a s i nt axi s * /

p u b l i c class Nodo3

p r i v a t e Compar abLe i n f ; p r i v a t e n’odo3 c i g ;

Nodo3 ( Compar abl e i nf or maci ón, Nodo3 s i g, ; i ent e)i

:nf = i nf or maci ón;s i g = s i g¿ i i ent e;

p u b l i c Compar abl e devol ver val or ( )i

r e t u r n ( i n f );

p u b l i c Nodo3 dev ol v er Ci gai ent e( 1

r e t u r n ( c i g);

1

p u b l i c v o i d as i gnar v al or ( Compar abl e i r . f or mac i o~. )

i n f = i nf or nac i ón;

p u b l i c v o i d as i gnarS i gui ent e ( Nodo3s i gui ent e)is;g = c i gui er t e;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 441/481

432 Java 2. Manual de programación

boolean menor que ( Nodo3 c , int cr i t er i o) throws Except i ont

r et ur n( i nf . menor que( c . i nf , O) ) ;

/ / Obj et o compar abl e Li br o

class Li br o implements Compar abl e

private St r i ng aut or ; private St r i ng t i t ul o; private long I SBN;

public Li br o( Ct r i nga, St r i ng t , long i )I

autor = a;t i t ul o = t ;I SBN= i ;

public St r i ng devol ver Aut or( )

return (autor ) ;

public St r i ng devol ver Ti t ul o( )I

return(titu1o) ;

1

public long devol ver I CBN( )t

return ( I SBN);

/ * Mét odo obl i gado par a compar abl es, como se i ndi ca en l ai nt er f az el campo cr i t er i o no ser a ut i l i zado en est e caso * /

public boolean menor que( Compar ab1e c, int cr i t er i o) throwsExcept i on

if ( ! ( c i ns t anceof Li br o) )

return ( ( Li br o) ) . SBN<I SBN);throw new Except i on ( " E r r o r de compar aci ón " ) ;

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 442/481

Estructuras de datos definidas por el programador 433

/ * I nt er f az bási co est ándar de compar aci ón. Es l a base sobr e l aque se i mpl ement a cual qui er or denaci ón o bús qJ eda. A r n q u een

pr i nci pi o está concebi do par a admi t i r var i os cr ; t er i c s deor denaci ón en est e caso el campo cr i t er i o no ser á usado * /

in te r face Compar abl e

boolean menor que( Compar ab1e c, i n t cr i t er i o) throws Excepzi on;1

/ / Excepci ón est ándar general de bj squedac l a s s NoEst a extends Except i oni

public NoEst a ( )

super ( "No se encuent r a el l i br o " ) ;

/ / Una pr ueba s i mpl e par a l a bi bl i ot eca Li s t adeLi br os

p u b l i c c l a s s Pr uebaLi

p ub li c s t a t i c v o i d mai n ( St r i ng[ ] args)i

/ / I ni c i al i za un obj et o Li s t adeLi br os

Li st adeLi br os 1 = new Li st adeLi br os 0 ;

/ / Cr ea dos obj et os Li br o ai macenándol os después

Li br o l i b r o l = new Li br o ("Chesterton " ,"El padr e Br own" , 471193089) ;

Li br o l i br o2 = new Li br o ("Fr oi d" ,"Di e Traumdeut ung" , 15716 90956) ;

1. guardar ( l i b r o l );1. guardar ( l i br o2);

/ / ?rr ; i eba su r ecuper aci ón

t = Y!

Li br o nuevo: = i . r ec uper ar ( Si padr e Rrcw: : ", 6711333E9);L i br c r.uevo2 = 1 . r ecuper ar ( " Di e : r a un de ut ~~y " , 5? 1CYV93%);

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 443/481

434 Java 2. Manual de programación

.............................. a n t i n f s i g ......................

Syc rer r. out . pr i nt( " En St ock: " ) ;

Sycr em out . pr i nt l r ( 1. nl i br os O) ;

Sys : em out . pr i nt l n( nuevol . devol ver Ti t ul o( ) +" : " +nuevol .devol ver Aut o r( ) ) ;

Sys t em ouz . pr L nt l n( nuev o2. devol v er Ti t ul o( ) +: " +nuevo2.devol ver Aut o r( ) ) ;

Cycr emi n . read ( ) ;

a n t i n f s i gI

c a t c h ( Except i on e ) 1

/ / 3 o r r a ; no de l os l i br as

1. el i ai nar( "El padr e Br own" , 471193089) ;

Sys t em ol i t. pr i nt ( "En St ock: " ) ;

Systern. c; l t p r i n t l n ( 1 nl i br o s ) ) ;

c a t c h ( Except i on e) I

15.5. LISTAS DOBLEMENTE ENLAZADAS

Se caracterizan porquesu recorrido puede realizarse tanto desdef r ent e a f i nalcomo desdef r ent e a f i nal . Este tipo de listas se suele construir vinculandnodos. Cada nodo de dichas listas consta de un campo con informacióny otros doscampos(ant y s i g ) que referencian el nodo antecesory el sucesor respectiva-mente. Además en una lista doblemente enlazada, cada nodo, excepto el priyel último, se encuentra referenciado por otros dos,su sucesory su antecesor.

Figura 15.12. Inserción de un nuevo elemento al principio de una lista doblementeenlazada.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 444/481

Estructuras de datos definidas por el programador 435

En la operación de inserción será necesario tener en cuenta si se trata del primelemento de la lista; en caso contrario, el nuevo elemento ha de colocarse por dela-te del primero, en una posición intermediao al final. La supresión debe contemplarsi se desea eliminarun elemento al principio de la lista, en el medioo ai final,y ade-más la posibilidad de que la lista conste de un único elementoy quede vacía trassueliminación.

15.6. PILAS

Una pila es una lista que tiene establecidas ciertas restricciones en cuanto a la formde extraero colocar en ella nuevos elementos. La pila se utiliza siempre que sedesea recuperar una serie de elementos en orden inverso a como se introdujeron. extracciónde un elemento de una pila se realiza por la parte superior, de igual formque lainserción.Esta propiedad implica que el único elemento accesible de una pilaes el último. Estas estructuras se denominan LIFO(LastInputFirst Output),((último elemento que se pone en la pila es el primero que se puede extraer)).

Las pilas se pueden implementar vinculandonodocy también mediante arrays,utilizando una variable auxiliar,ci ma, que apunte al Último elemento de lapi l a.En realidad, en Java no es necesario definir la clasePi l a, ya que en el paquetej ava. ut i 1 viene la claseSt ack (pila). La claseSt ack hereda deVect or , yaque una pila se puede implementar con eficiencia mediante una tabla que no tientamaño fijo. Los métodos proporcionados porSt ack son:

public boolean empt y ( )

Compruebasi la pila está vacía

public synchronized j ava. l ang. Cbj ec t peek ( )Consulta el elemento situado en la cima de la pila, sin quitarlo de ésta.Si la pila está vacía,devuelve una excepciónEmpt ySt ackExcept i on.

public synchronized j ava. l ang. Obj ect pop ( )

Quita elobjetosituado en la cima de la pilay lo devuelvecomoresultado de la función.Sila pila está vacía, devuelve la excepción anteriormente mencionada.

public j ava. l ang. Obj ec t p us h( j ava. l ang. 0bj ec tobj )Coloca un nuevo elemento en la cima de la pila.

public synchronized int s ear c h( j ava. l ang. 0bj ec t obj )Devuelve la distancia existente desde la cima de la pila hastala posición donde el objeto,

obj ,se encuentra situadoo - 1 si el objeto no está en la pila.

public St ack ( )

Constructor.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 445/481

436 Java 2. Manual de programación

vacía se coloca un elemento se coloca otro elemento se quita un elemento

ci ma = 2.

ci ma = 1

...

......

3

2

1

Figura 15.13. Pila implementada con vector

La implementación de una pila utilizando nodos vinculados requiere el dde los métodos:

.

.

Se

P i l a ,el constructor. Crea una pila vacía asignandonul l al miembro pri-vadoci ma que contiene la referencia a la cima(tope)de la pila.vaci a. Determina si la pila estáo no vacía comprobando el valor deci ma;devuelvetrue cuando el valor deci ma es nul l y f al s e en caso contra-rio.api l ar. Añadeun nuevo elemento en la cima de la pila, es decir, crea unuevo nodo cuyo campos i g referencia laci ma de la pila y acontinuacitnasigna aci ma el nuevo nodo.de sapi l ar . Comprueba que la pila no está vacía, suprime el nodo de la chaciendo queci ma pase a referenciar al siguiente nodo,o a nul l si la pila seha quedado vacía,y devuelve el objeto perteneciente al nodo eliminado.obt ener ci ma.Devuelve el objeto almacenado en la cima de la pila.

podría efectuar de la siguiente forma: public class Pi l a

private Nodo4 ci ma;

P i l a ( )

Ici ma = null;

1

public boolean vací a ( )

return ( ci ma == null) ;

I

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 446/481

Estructuras de datos definidas por el programador 437

publ ic void api l ar ( 0bj ec t el ement o){

ci ma = new Nodo4( el ement o, ci ma) ;

publ ic Obj ect desapi l ar ( ) throws Except i on{

i f ( vací a ) )

Obj ect aux = c i ma. i nf ;ci ma = c i ma. s i g;return aux) ;

throw new Except i on ("Pi l a Vaci a" ) ;

1

public OLj ect obt ener ci ma( ) throws Except i on

i i f ( vací a( ) )

return ( ci ma. n f ) ;throw new Except i on ( "Pi l a Vaci a") ;

1

pub l ic c las s Nodo4i

Obj ec t i nf ;Nod04 si g;

Nodo4 ( Obj ect i nf or maci ón, Nod04 si gui ent e)i

i n f = i nf or maci ón;s i g = s i gui ent e;

1

/ / L a i nf or maci ón se muest r a en or den i nver so al de i nt r oducci ón

import j ava. i o. * ;

pub l ic c las s Pr uebaPI

publ ic s t a t i c vo id mai n ( St r i ng ar gs ] )i

St r i ng cadenai , cadenaf ;Pi l a p = new P i l a ( ) ;Sys t em out . pr i nt l n( "Pr ueba") ;

Sys t em out . pr i nt l n( "Escr i ba una pal abr a: " ) ;

t r yI

I nput St r eamReader i s = new I nput St r eamReader ( Syst em i n) ;Buf f er edReader bf = new Buf f er edReader ( i s) ;

cadenai = bf . r eadLi ne ( ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 447/481

438 Java 2. Manual de programación

f o r ( i nt i = O; i < c adenai . l engt h( ) ; i +t )

cadenaf = ;

for ( i nt i = O; i ¿ cadenai . l engt h 0 ; i t +)

p. api l ar (new Char act er ( c adenai . c har At( i ) ) ;

cadenaf = cadenaf + ( (Character)p. des api l ar ( ) ) .char val ue ( ) ;

Sys t em out . pr i nt l n( cadenaf ) ;

1cat ch( Except i on e )i 1

Cuando un programa llama a un subprograma, se utilizan internamente para guardar el lugar desde donde se hizo la llamada y el estado de las variabese momento.

Entre las aplicaciones de las pilas destacan:1) Su uso en la transformación deexpresiones aritméticas de notacióninjijaapostfija' y en la posterior evaluación dela expresión.2) Su utilización para la transformación de algoritmos recursivoiterativos.

15.7. COLAS

Una cola es una estructura de datos lineal en donde las eliminaciones se realizuno de sus extremos, denominadofrente,y las inserciones por el otro, denominadofinal. Se las conoce como estructurasFIFO(First InputFirst Output). La cola deunautobúso de un cine son ejemplos de colas que aparecen en la vida diaria. Lase podrá implementar mediante un array unidimensional, usando la claseVect oro utilizando nodos vinculados.

Cuando se implementa con un array (Fig. 15.14) se utilizan dos variabl-

méricas,pr i mer o y úl t i mo, para marcar el principioy f i n a lde la cola; comolos elementos se añaden por el final y se quitan por el principio, puede ocurla variableúl t i mo llegue al valor máximo del array, aun cuando queden po-ciones libres a la izquierda de la posiciónpr i mer o (Fig. 15.15). Existen diver -sas soluciones:

Una de las tareas que realizaun compilador es la evaluación de expresiones aritméticas. En la ma-ría delos lenguajes de programación las expresiones aritméticas se escriben en notacióninfiju,que son aque-

llas en las cuales el símbolo de cada operación binaria se sitúa entrelos operandos:4 * (3+5).Muchoscompiladores transforman estas expresionesirzfijasen notaciónpo.s?fi j~~,en la cual el operador sigue alosoperandos(o prefija,en la cual el operador procede alosoperandos)y a continuación generan instruccionesmáquina para evaluar esta expresión postfija:4 3 5 +*. Nunca se necesitan paréntesis para escribir expre-siones en las notacionesposífijay prefija.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 448/481

Estructuras de datos definidas por el programador 439

Retroceso Consiste en mantenerfijo a 1 el valor de primero, realizando undesplazamiento de una posición para todas las componentes ocu- padas cada vez que se efectúa una supresión.

ReestructuraciónCuando último llega al máximo de elementos se desplazan lascomponentes ocupadas hacia atrás las posiciones necesarias paraqueel principio coincida con el principio dela tabla.

Un array circular es aquel en el que se considera que la compo-nente primera sigue a la componente última.

Medianteun array circular

pr i mer o úl t i mo MAXFigura 15.14. Cola implementada con array.

pr i mer o úl t i mo IMAX

Figura 15.15. Cola implementada con un array tras una serie de operacionesde adición y sustracción de elementos.

La claseVect or de Java, así como la creación de una cola utilizando nodosvinculados evitan los problemas originados porMAXen las implementaciones conarrays.

Las operaciones típicas en una cola son: crear la cola, comprobar si la cola eso no vacía, poner elementos en la cola porel,final,quitar elementos porelfrenteyobtener el objeto situado ene1,frentede la misma. En la implementación de unacola utilizando nodos vinculados que se efectúa a continuación los métodos qurealizan las mencionadas tareas se denominan respectivamente:Col a, vací a,poner , qui t ar y obt ener pr i mer o. Los miembros privadospr i mer o yúl t i mo guardan la información sobreelfrente yJinalde la cola; inicialmente, elconstructor asignanul l a ambos.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 449/481

440 Java 2. Manual de programación

El métodovaci a compruebasi queda algún elemento que se pueda extraer dla cola consultandopr i mer o y si el valor depr i mer o es nul l devuelvetrue para indicar que la cola está vacía, en caso contrario devuelvef al se.El métodoponer se encarga de añadir nuevos elementos a la cola por final; para ello, comienza por comprobar si la cola está vacía,si esto ocurre,será necesario quepr i mer o referencie al nuevo elemento, en caso contra-rio será el elemento referenciado poru1t i mo, a través de su campos i g ,quien establezca un vínculo con el nuevo elemento, el métodoponer termi-na asignando au1t i mo el nuevo elemento.El métodoqui t ar , si la cola no está vacía, asigna a una variableaux elobjeto alamacenado en el campoi nf del primer elemento, después hace quepr i mer o referencie al nodo referenciado por el campos i g de dicho primer

elemento,si la cola se ha quedado vacíay pr i mer o es nul l asigna tam- biénnul l a ul t i mo, en cualquier caso, cuando la cola no está vacíadevuelveaux.El métodoobt enerpr i mer o devuelve el objeto referenciado porel campoi nf odel elemento referenciado porpr i mer o.

publ ic c lass Col at

private Nodo4 pr i mer o;private Nodo4 ul t i mo;Col a ( ){

pr i mero = n u l l ;ul t i mo = n u l l ;

1

public boolean vací a ( ){

\return ( pr i mer o == n u l l ) ;

public void poner ( Obj ect el ement o)t

Nod04 aux = new NOdO4( el ement o, n u l l ) ;i f ( vací a ) )

else

ul t i mo = aux;

pr i mer o = aux;

u1t i mo. si . g = aux;

1

public Obj ect qui t ar ( ) throws Except i on{

i f ( vací a( ) )

Obj ect aux = pr i mer o. i nf ;throw new Except i on ( "Col a vací a" ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 450/481

Estructuras de datos definidas por el programador 441

pr i mer o = pr i mer o. s i g;if ( pr i mer o = = n u l l )

ul t i mo = n u l l ;return (dux);

)

public Obj ect obt ene r pr i mer o0 throws Except i on I

if ( vaci a ) )

return ( pr i mer o. n f ) ;

throw new Except i on ( "Col a vací a") ;

1

public class Nodo4i Obj ect i nf ;

Nodo4 si g;

Nodo4 ( Obj ect i nf or maci ón, Nodo4 s i gui ent e)i

i n f = i nf or maci ón;s i g = s i gui ent e;

11

Una aplicación de las colas es una cola de impresión. En un sistema de tiempocompartido suele haber un procesador centraly una serie de periféricos comparti-dos: discos, impresoras, etc.Losrecursos se comparten porlos diferentes usuariosy se utiliza una cola para almacenar los programaso peticiones de los diferentesusuarios que esperansu turno de ejecución.El procesador central atiende, normal-mente, por riguroso orden de llamada del usuario; por tanto, todas las llamadas sealmacenan en una cola. Existe otra aplicación de las colas muy utilizada, lacola de

prioridad;en ella el procesador central no atiende por riguroso orden de llamada,sino por las prioridades asignadas por el sistemao bien por el usuario,y sóloden-tro de las peticiones de igual prioridad se producirá una cola.

Resumen:En realidad las pilasy las colas sonlistasque tienen establecidasciertas restricciones encuanto a la formadeextraero colocar en ellas nuevoselementos:

La extracción deunelementode una pilase reaIiza por la parte superior, lomismo que la inserción. EstructuraLIFO.

En una cola las eliminaciones se realizan siempre por uno de sus extre-mos, denominado frente,y las inserciones porel otro, denominado final.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 451/481

442 Java 2. Manual de programación

15.8. COLAS CIRCULARES

Una cola circular es una variante de las listas circulares. Una cola necesita do-rencias, una al primer elementoy otra al último; por consiguiente, una cola circulse toma como referencia de acceso la del Último nodo, de esta forma se tiene-citamente la del primero puesto que en una cola circular el primer elementoal Último (Fig.15.16).

último

I

pr i mer o

Figura 15.16. Cola circular.

Teniendo en cuenta las consideraciones anterioresy utilizando nodos vincula-dos,losmétodos a implementar tendrán las siguientes características:

El constructor,Col aci r cul ar . Crea la cola, asignandonul l al miembro privado t i mo.vaci a. Devuelvetrue si la cola está vacía( ul t i mo es nul l ) y f al s e encaso contrario.

poner . Crea un nuevo nodoy comprueba si la cola está vacía; si está vacíaal campos i g del nuevo nodo le asigna el nuevo nodo; si no está vacía, a-na al camposig del nuevo nodo el primero( ul t i mo. si g) y a ul t i mo. s i gel nuevo. Al terminar, en ambos casos, asigna at i mo el nuevo.qui t ar . Tras verificar que la lista no está vacía, el método consideracasos:1) que la lista tenga un único elemento( ul t i mo. s i g será igual aul t i mo) , por lo que, al quitarlo, ultimo debe pasar a tomar el valornul l ;2) que la lista tenga más de un elementoy, para eliminar el primero, este primero (que es t i mo. si g) deberá pasar a referenciar a su siguiente( ul t i mo. si g. si g).obt ener pr i mer o devuelve el objeto referenciado por el campoi nf o del

primer elemento.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 452/481

Estructuras de datos definidas por el programador 443

La implementación de la cola circular es:

public class Col ac i r cul ari

private Nodo4 ul t i mo;Col aci r cul ar ( )

iul t i mo = null;

public boolean vací a ( )

ire turn(u1t imo == null)

1

public void poner ( Obj ect el ement o)I

Nodo4 aux = new N o d o 4 ( e l e r n e n t o , null);if ( vaci a ) )

elsei

aux . s i g = aux;

aux. s i g = ul t i moul t i mo. s i g = aux

1ul t i mo = aux;

1

public Obj ect qui t ari

if ( vaci a ) )

s i g;

) throws Except i on

throw new Except i on ( "Col a vací a") ;

Obj ect aux = ul t i mo. s i g. i nf ;if ( ul t i mo. s i g == ul t i mo)

else

return aux);

ul t i mo = null;

ul t i mo. s i g = ul t i mo. s i g. s i g;

public Obj ect obt ener pr i mer o ( ) throws Except i on

if ( vací a ) )

return u1t i mo. s i g . i nf ) ;

throw new Except i on ( "Col a vací a" ) ;

1

/ /La cl ase Nodo no cambi a public class Nodo4

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 453/481

444 Java 2. Manual de programación

Obj ect i nf ;Nodo4 si g;

Nodo4 ( Obl ec t i nf or maci ón, Nodo4 si gui ent e)I

i n f = i nf or maci ón;s i g = s i gui ent e;

/ * C na pr ueba si mi l ar a l a que se ef ect uó con l a pi l a se puedeut i l i zar ahor a par a ver el f unci onami ent o de l a col aci r cul ar . La i nf or maci ón se muest r a en el mi smo or den en elque f ue i nt r oduci da * /

i mpor t j a v a . i o . * ;

publ i c cl ass Pr uebaCC

publ i c st at i c voi d mai n ( St r i ng ar gs [ ] )t

St r i ng cadenai , cadenaf ;Col aci r cul ar cc = new Col aci r cul ar ( ) ;

Sys t em out . pr i nt l n( "Pr ueba") ;

Sys t em out . pr i nt l n( "Escr i ba una pal abr a: " ) ;

try

I nput Ct r eamReader i s = new I nput St r eamReader ( Syst ern. i n) ;Buf f er edReader bf = new Buf f er edReader ( i s ) ;cadenai = bf . r eadLi ne( ) ;

for ( i n t i = O; i < c adenai . l engt h( ) ; i t + )

cadenaf = ;

whi l e ( ! cc. vací a ( ) )

Sys t em out . pr i nt l n( c adenaf ) ;

cc . poner ( new Char act er ( cadenai charAt( i ) ) ;

cadenaf = cadenaf t ( (Character)cc. qui t ar ( ) ) .char val ue ( ) ;

!cat ch( Except i on e) }

1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 454/481

A A

PalabrasreservadasJava

445

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 455/481

446 Java 2. Manual de programación

Las siguientes palabras no se pueden utilizar como identificadores:

aDst rac t

bool eaibr eakbyt ecasecatchcharc l assconstc ont i r uedef au- t

aoubl ee - see x t e r. d sf al cef i nal

13

f i nal l y

f l oatf o rgot ol fi mpl ement si mpor ti ns t anceofin:i nt er f ac el ongr.a t T, er ewn, l lpackagepr i vat epr ot ect ed

publ i c

r e t urnshor ts zat i csupers wi t c hsynchr oni zedt hi st h r o w

z r owst r ar.s i en tt ruet r yvoi dvol at i i e* . . i l e.h

Las siguientes palabras reservadas pueden no tener significado en alg-

siones actuales, pero están reservadas para uso futuro:byval uecastC0.T s t

f u t u r eg e n e r i cgot0

i n n e ropera t o router

r e s tva r

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 456/481

B

Prioridadde operadores

447

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 457/481

448 Java 2. Manual de programación

B.1. PRIORIDAD DE OPERACIONES

Losoperadores se muestran en orden decreciente de prioridad de arriba a abaLosoperadores del mismo grupo tienen la misma prioridad (precedencia)y se ejecutande izquierda a derecha (asociatividad).

Operador Tipo Asociatividad

o Par ént esi so Ll amada a f unci ón[ I Subí ndi ce

Acc eso a mi embr os de un obj et o

Dcha- I zdaDcha- I zdaDcha- I zdaDcha- I zda

+ +_ - Pr ef i o i ncr emect oPr ef i j o aecr emer . t o Dcha- I zdaDcha- I zda

Más uni t ar i oMei . os uni t ar i oKega c i on 1ógi ca un 1 t a r 1 aCompl ement o bi t a bi t Lni t ar i o

( t i po) Model o uni t ar i onew Cr eacci on de obl et os

Dcha- I zdaDcha- I zda

Dcha- I zda

Dcha- I zda

Dcha- I zda

Dcha- I zda

+-

Pr oduct o

Di vi s i onRest o ent er oSurnaRest a

I z da- Dcha

I z da- DchaI z da- DchaI z da- DchaI z da- Dcha

< < Despl azami ent o bi t a bi t a l a i zqui er da Dcha - I zda>> Despl azami ent o bi t a bi t a l a der echa

>>> Despl azami ent o bi t a bi t a l a der echacon ext ensi ón de si gno Dcha - I zda

r el l enando con cer os Dcha - I zda

< Menor que I zda- Dcha> Mayor que I zda- Dcha<= Menor o i g; i al qUe I z da- Dcha

>= Mayor o i g i i a l que I zda- Dchai nst anceof Ver i f i cac i ón t i po de obj et o I zda- Dcha

I zda- DchaI 9.J a1dad__I = Desi gual dad I zda- Dcha

& AND bi t a bi t I zda- Dcha

OR exc l c s i ve Si t a bi z I ZCa- DChaOR i nc l Ls ; ve bi t a b i r I z da- Dcha

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 458/481

Prioridad de operadores 449

Operador Tipo Asociatividad~

& & AND l ógi co I z da- Dcha~~~ ~~

I 1 OR l ógi c o I zd a- 3cha

? : Condi ci ona: t er nar i o 3ck a- I d a

--+=- =

* =/=~ ,c -

& =-

I =<<=

>>=

>>>=

Asi gnaci ónAsi gnaci ónAsi gnaci ónAsi gnaci ónAsi gnaci ónAsi gnaci ónAsi gnac- ónAsi gnaci ónAsi gnaci ónAsi gnaci ón

de sumade restade pr oduct ode di vi s i ónde módul oAND bi t a b i tOR exc l us i ve bi t a bi tOR i nc l us i ve bi t a bi cde despl azami ent o

3 ck a - I z daEcha- I zdaDcha- I zdaDcna- I zdaEcha- I zdaDcna- I zdaDcha- I zs aDcha- : zdaCcha- I zci o

a i zqui er da bi t a bi t Echa - I zaaDespl azami ent o der echo bi t a bi t conasi gnaci ón de ext ens i ór . de si gno Echa- I zdaDespl azami ent o der echo b i t a bi t c o nasi gnaci ón de ext ensi ón a cer o Dcha- I zda

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 459/481

Guía desintaxis

451

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 460/481

452 Java 2. Manual de programación

Este apéndice describe las reglas básicas de sintaxis de Java que cumplen la-rentes versiones existentes en la fecha de publicación de este libro: 1.2y 1.3,con el compilador Java2.0.Gran parte de la sintaxis de Java se basa enC

C.1. ESTRUCTURADE PROGRAMAS JAVA

Un programa Java consta de una colección de archivoso unidades de compilación.Cada archivo puede contener un nombre opcional de paquete, una serie de d-cionesi m p o r t y por último una secuencia de declaraciones de interfaceso clases.Una unidad de compilación puede identificar sus paquetes, importar cualqui

número de otros paquetes, claseso interfacesy declarar cualquier número de clasese interfaces.

Declaración de importaciones

Una declaración de importación( i mpor t ) nombra un elemento de otro paqueteque se utilizará en las declaraciones posteriores de interfaceso clases. Se puede uti-lizar un asterisco para incluir todosloselementos deun paquete.

i mpor t

Así, i mpor t j ava . i o . *; indica al compilador que importe cualquier cladel paquete ava . i o proporcionado por Javaa medida que se necesite.Es una buena idea incluir esta líneaal principio de cualquier archivo j ava que realiceoperaciones de entradaisalida. Otros ejemplos:

C.1.2. Definición de clases

Una definición deunaclase consta de una declaracióny un cuerpo.El cuerpo con-tiene campos de datosy declaraciones de métodos. La declaración de una clase co-

ta de palabras reservadas e identificadores: una secuencia opcional (en el msintáctico para indicar que es opcional se encierra entre) de modificadores, la palabra reservadacl as s, el nombre de la clase, un nombre opcional de la cla padre,unasecuencia opcional de interfacesy el cuerpo delaclase consusmiembros.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 461/481

Guía de sintaxis 453

[modificadoresDeClase] class Nombre [extends P a d r e ][implements In te r f a z I

[ , I n t e r f a z 2 [ , . . . : ]{

I/ / c u e r p o de l a cl ase ( mi embr os)

Los modi fi cador esDeCl ase pueden ser:abst r act , f i n a l , publ i c.Una clase abstracta es aquella que tiene unoo más métodos abstractosy de la

que el programador no piensa instanciar objetos.Su fin es servir comosupercla-se de la que otras puedan heredar. Las clases que heredan de una clase abstractdeben implementar los métodos abstractos de su superclaseo seguirán siendo abs-tractas. Una clasef i nal no puede ser superclasey todossus métodos son implí-

citamentef i n a l .Una clase pública debe estar ensu propio archivo, denominado Nombre. j ava. Los miembros de una clase pueden ser métodosy variables de ins-tancia (pertenecientes a un tipo baseo una clase).

/ / For mat o más si mpl e de una def i ni ci ón de cl aseclass Cl aseünoI

} I / Cl aseüno/ / campos de dat os y decl ar aci ones de mét odos

/ / Una cl ase que ext i ende ot r a cl asepublic class Cl aseDos extends Ot r ac l aseI

/ / campos de dat os y decl ar aci ones de mét odos} / / Cl aseDos

/ / Cl ase compl ej apublic abstract class Mi obj et o extends Ot r acl aseiniplaments I nt er f azUno, I nt er f azDost

} / / Mi Obj et o/ / campos de dat os y decl araci ones de mét odos

Ejemplos

1. public class Pr i mer pr ogr ama

p u b l i c s t a t i c void mai n ( St r i ng[ ] args)I

1Sys t em out . pr i nt l n( " Si er r aMagi na- Car c hel ej o" ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 462/481

454 Java 2. Manual de programación

2. publ i c a b s t r a c t c l a s s Numer ot

. . .1

C.1.3. Declaración de variables

En Java, las variables se pueden declarar:1)como campos de datos de una clase,2)como argumentos de un método,o 3)como variables locales dentro de un bloque.

C.1.4. Declaraciones de campos de datos y variables de métodos

Una variable se declara proporcionando su tipoy su identificador. El tipo puede seruno de los tipos primitivoso puede ser una clase. Las declaraciones de las variabllocalesy campos de datos pueden incluir la asignación de un valor inicial.Losargu-mentos obtienen su valor inicial cuando se llama al método.

/ / El empi os de decl araci ones de var i abl es de mét odo o campos de dat osi n t z ; / / i dent i f i cador z es de t i po i ntchar i n; c i al Nonbr e = ' M ' ; / / i ni c i al Nombr ees de t i po char

/ / y de val or i ni ci al ' M'St r i r, g sal udo = "HolaMackoy"; / / sal udo es de t i po St r i ng

/ / y de val or i ni c i al "HolaMackoy" boolean i nt er r upt or = fa lse ; / / i nt er r upt or es de t i po bool ean

/ / y val or i ni ci al f al s e

Una declaración de variables de instanciao campos de datos tiene una partede modificador opcional, un tipo, un nombre de variabley una inicializaciónopcional.

[ modi f i cador esDeVar i abl e]t i po nombre [ = val or ] ;

Los modi f i cador esDeVar i abl e pueden ser:publ i c, pr ot ect ed,st at i c, f i nal .

Ejemplos

1 . publ ic c l ass

protec ted protec ted protec ted/ / . . .

i

Fi gur a

Rect angul o pos i t i on;double dx, dy;Col or col or ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 463/481

Guía de sintaxis 455

2. c l a s s Empl eado extends Per sonai

protected St r i ng nombr e = ;

p r o t e c t e d i n t edad;protected Empi eado unEmpl eado;11.. .

C.1.5. Visibilidad de campos de datos

Los campos de datos son accesibles desde cualquier método dentro de la clase.Dependiendo de la visibilidad declarada, otros objetos pueden acceder también aloscampos de datos.A los campos de datos que no se les proporciona un valor inicialexplícito se les asignaun valor por defecto.

C.1.6. Declaración de constantes de clase

Las constantes de una clase se decíaran como variables, siendo necesario comenzarsu declaración con las palabras reservadasf i n a l y s t a t i c y se les asigna un

valor en la declaración. Este valor yano se podw modificar.Ejemplo

c l a s s Empl eado extends Per sonat

p ub li c s t a t i c f i n a l cant i daa = 50;/ / dec l ar ac i ón de var i abi es

/ / dec l ar ac i ones de mét odos

C.l .7. Conversión explícita de tipos

(nombre - t i p o ) expresibn

C.1.8. Creación de objetos

Unainstanciación(creación) deobjetoscrea una instancia de una clasey declarauna variable de ese tipo. Los objetos se crean a partir de una clase utilizando el ope-radornew. La sintaxis adecuada es:

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 464/481

456 Java 2. Manual de programación

[ tipo] nombrevariable = new tipo [parámetrol , parámetroZ[, . . . I I ] ;

Repuesto unapi eza = new Repuest o ( ) ;

Aut omovi l m car r o = new Aut omovi l ( 5 , " Gol f ") ;

La creación de una instancia (un objeto):

Le asigna memoria dinámicamente.Crea un objeto con el nombrenombr evar i abl e.

inicializa sus variables de instancia a los valores por defecto:n u l 1 para losobjetos,f al s e para variables booleanas,O para los otros tipos base.Llama al constructor con los parámetros especificados.Por último, devuelve una referencia al objeto creado, es decir, la direcci

memoria donde se encuentra dicho objeto.

C.1.9. Declaraciónde métodos

Las declaraciones de métodos simples, denominadas tambiénsignuturus,constande un tipo de retorno, un identificador,y una lista de argumentos (parámetros). Eltipo de retorno puede ser cualquier tipo válido (incluyendo una clase)o el tipovoi d si no se devuelve nada. La lista de argumentos consta de declaraciontipo (sin valores iniciales) separados por comas. La lista de argumentos puedvacía. Los métodos pueden también tener una visibilidad explícita.

[ m o d if a doresDeMe t odos t poDeRes u1 t a do n mbreMé t odo( [ tipoparámetrol parámetrol[ , t ipoParámetroZ parámetroZ[, . . . ] ] )[throws Excepci Ón [ , Excepci n2 , . . .I I I

t/ / cuer po del método

i

Losmodi f i cador esDeMet odos pueden ser:publ i c, pr ot ected, pr i vat e,abst r act, f i n a l ,st at i c, synchr oni zed. Comot i poDeResul t adose espe-cificarávoi d cuando el método no devuelva resultados. En la implementaciónmétodo, cuando éste no haya sido declaradovoi d, se utilizará la instrucciónreturn para devolver un valor al punto de llamada del método. Es decir, en c-to que se ejecutar et ur n, el método termina devolviendo un Único valor comresultado. Para devolver múltiples valores mediante una función en Java debe-

binarse todos los ellos en un objetoy devolver la referencia al objeto.A continua-ción del nombre del métodoy entre paréntesis se especificará la lista de parámetroque constará de ceroo más parámetros formales cada uno de ellos precedido portipo y separados por comas.

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 465/481

Guía de sintaxis 457

Cuando se llama a un método, íos parámetros actuales se asignan a los paráme-tros formales correspondientes. Entre los parámetros actuales, los de la llamada,ylos formales, los de la declaración, debe existir concordancia en cuanto a número

tipo y orden.La palabra reservadat hr ows permite listar tipos de excepciones lanzadas por elmétodo cuyo tratamiento se pospone para que sea efectuado por el método llamador

Los métodos de una clase están asociados con una instancia específica de lamisma, excepto si son estáticos.

publ i c cl ass Ej empl oi {

/ / campos de dat os decl ar ados, ni nguno/ * Decl ar aci ón si mpl e: no se devuel ve nada, no se pasa ni ngún

pr i vat e voi d cal cul ar I mpues t os ( ) {

1

ar gument o * /

/ / cuer po del mét odo

/ * Un mét odo con un ar gument o de t i po doubl e que devuel ve us

publ i c i nt Cal CUl ar Tot al (double x) [ent er o * /

/ / cuer po del mét odo1/ * Un mét odo que devuel ve un obj et o de t i po Mi obj et o con un

pr ot ect ed Mi Obj et o c onver t i r ( i nt z ,St r i ng s) {

}

ent er o y una cadena de ent r ada * /

/ / cuer po del mét odo1 / / cl ase Ej empl o1

C.l I O. Llamadas de métodos

Cuando se llama a un método, se deben proporcionar los argumentos del tipo ade-cuado:

/ / i nt er i or de un mét odoic al c ul ar Z( ) ;

i nt z = c al c ul ar Z ( 16, 25);Mi obj et o ob] = c onver t i r ( 25, Hol a Mackoy" ) ;

C.l I 1. El método main

Cada aplicación Java (no losappkts )debe tener un métodom a i n que es dondecomienza la ejecución de la misma.Esdecir, para ejecutar un programa el intérpretede Java comienza llamando al métodom a i n( ) . Este método se llama antes de la

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 466/481

458 Java 2. Manual de programación

creación deun objeto yha de declararse comost at i c para que se pueda llamarsin tener que referirse a una instancia particular de la clase. Como además Ila-mado por código fuera de su clase, también tiene que ser declarado comopub1i c ,que esla forma de permitir queun miembro de una clase pueda ser utilizado porcódigo que está fuera delamisma. La palabra reservadav o i d indica quemai n nodevuelve nada.

p u b l i c s t a t i c v o i d ma;?. ( St r i ng I a rgs )

St r i ng [ ] args es la declaración deun array deSt r i ng, mediante el cualla clase podría tomarun número variable de parámetros enla línea de órdenes;aunqueno se use, es necesario incluir este parámetro cuando se define el mémai n().

C.1.12. Extensión de clases

[acceso] [ f i n a l : c l a s s Nombreclase extends S u p e r c l a s e

/ / cLer po de l a cl ase ampl i aaa

Constructor dela subclase

2Tbr eCl ase( a r q l l , . . )

. . . ;

publ ici

super. . .

1

C.1.I3. Constructores

Lasintaxis deun constructor es similara la de un método, sint i poDeResu l t adoy cuyo nombre debe coincidir con el dela clase.El constructor se invoca automáti-camente cuando se creaunainstancia dela clase.

~ n o d i i i e a c o r e ~ D e C o n s ~ r t i c t o r ] o m b r e C o n s t r u c t o r

( [ t ipoParánetrol parámetrol[ , t i p o P a r á m e t r o 2 parámetro2 , . . I 1 1)

/ / cuer po ael constructor1

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 467/481

Guía de sintaxis 459

Losmodi f i cador esDeConst r uct orsiguen las mismas reglas que en los

Un constructor debe ser invocado con el operadornew.

Una clase puede tener múltiples métodos constructores, siempre que éstos sdiferencienunosde otros en el númeroy/otipo de parámetros.

métodos normales, peroun constructor abstracto estático finalno está permitido.

c l a s s Per sona

protected Ct r i r g nombr e = ;

pro tec ted in t edad = O;public Per sona ( St r i ng nom, i nt años)t

nombr e = nom;

edad=

años;p ub l ic s t a t i c v o id mai n ( St r i ng ar gs [ 3 )

Per sona p = new Per sona ( " L ui s i t oMackoy" , 13) ;

Sy s t e m out . pr i nt l n( " Nombr e: 'I + p. nombr e + + " Eaa d: "

t p. edad) ;

1\

C.1.14. Los constructores en la extensión de clases

Elcuerpo de un constructorcomienza con una llamada heredada al constructor dela superclase de la clase. Esta llamada debe ser la primera sentencia del cuerpo dun constructory no puede aparecer en ningún otro lugar. En Javasuper ( . . .es usado en vez del nombre del constructor de la superclase. Sino se usasuperentonces se supone implícitamente que el cuerpo del constructor comienza con lllamadasuper ( ) sin parámetros. El resto del cuerpo es comoun método normal.

c l a s s Empl eado extends Per sona

protected St r i ng cat egor i a = ' I ;

pro tec ted in t s al ar i o = O;

public Empl eado ( St r i ng nom, i n t años, Ct r i z g n:vel, i n t suel do)

super ( nom, años) ;

cat egor i a = ni vel ;s al ar i o = suel do;

p u bl i c s t a t i c v o id mai n ( St r i nq ar gs [ ] )

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 468/481

460 Java 2. Manual de programación

Empl eado e = new Empi eado ( " Ar z ur i t oMackoy", 13, "medi o" ,

Sys t em out . pr i nt l n( " Nombr e: + e. nombr e + '' + "Eaad: I'

+ e. edad) ;

Sys t em out . pr i nt l n( " Ni ve1: t e. c at egor i a ++ "Sal ar i o: " + e. s al ar i o) ;

200000) ;

C.1.15. Definición e implementación de interfaces

Definición de una interfaz

public interface Nornbrein t e r f a zt

public abstract t i p o D e R e s u 1 tado nombreMétodo ( ) ;

/ / ot r as decl ar aci ones de mét odos vaci os.

Se ha de tener en cuenta que:Todoslosmiembros de una interfaz son públicos automáticamente.Todoslosmétodos son abstractos automáticamente.Todosloscampos deben ser declaradosst at i c y f i n a l .

La clase que implementa la interfaz debe implementar todoslosmétodos decla-rados en ella.

public class Irnplementa [extends Padr e] implements Nombr eI nt er f az

public t i poDeResEl t ado nombr eKét odo0t/ / . . .

/ / s e i npl ement an t odos l os mét odos de l a i nt er f az Nombr eI nt er f az1

Es posible que una clase implemente más de una interfaz.

[m o d i f i c a d o r e s D e C l a s e ] class Nombre [extends Padre]

[implements I n t e r f a c e ]i I n t e r f a c e 2 [, . . . 1 1

/ / I mpl ement aci ónde t odos l os mét odos de l as di st i nt as i nt er f aces

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 469/481

Guía de sintaxis 461

Es posible definir clases que tengan objetos del tipoNombr eI nt er f az, comosi la interfaz fiera una clase, pudiendo así usarse en ellas, las diversas implementa-ciones de ésta. La claseE j empl o puede usar, entre otras que hubiera definidas, la

que ofrece la claseI mpl ement a. public class Ejemplo

{ public Ejemplo )

(

1 public tipoDeResul t a d o unMetodo (NombreInterfaz elemento)

{

/ / . . .

/ / . . .

C.l I6. Clases anónimas

Una clase anónimaes aquella que no tiene nombrey, cuando se va a crear un obje-

to de la misma, en lugar del nombre se coloca directamente la definición.n e w SuperNombreO { cuerpo clase ]

Por ejemplo, considerando declarada una claseI mpl ement a que implementaNombr e I nt er f az, a siguiente instrucción

e. unMet odo( n e w I mpl ement a ( ) ) ;

pasa ae. unMet odouna nueva instancia de dicha claseI mpl ement a como pará-metro. Si se quisiera emplear una clase anónima no se efectuaría la declaración di mpl ement a y la instrucción anterior se sustituiría por:

e. unMét odo( n e w Nombr eI nt er f az ( )I

public t i poDeResul t ado nombr eMét odo( )(/ / . . .1/ * se i mpl ement an t odos l os mét odos de l a i nt er f azNombr eI nt erf az * /

1) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 470/481

462 Java 2. Manual de programación

C.2. SENTENCIAS

C.2.1. Sentencias de declaraciónt ipo n omb r e Va r ab 1 e ;

Ejemplos

int l ongi t ud;double e;Ci r cul o ci r c ul o;

C.2.2. Sentencias de asignación

Una sentencia se asignación asigna el valor de la expresión en el lado derecvariable del lado izquierdo.

nombre =

Ejemplos

l ongi t ud = 5 +i += 5;

C.2.3. Sentencias re turn

Las sentenciasreturn proporcionan una salida de un método con un valorretorno nov o i d . Las sentencias de retorno pueden no aparecer en un métodoun tipo de retornov o i d . Las sentenciasreturn pueden aparecer en cualquier parte de una estructura de control; producen un retorno inmediato del métvalor de la expresión a continuación del retorno debe coincidir con el tipo d-no del método.

Ejemplo

public x, int y)return x- y;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 471/481

Guía de sintaxis 463

C.2.4. Sentencias compuestas

Las sentencias compuestas se encierran entre llaves{ }y se ejecutan secuencial-mente dentro del bloque.Ejemplo

ii n t m = 25;i n t n = 3 0 ;i n t p = m + n;

/ / asi gna el val or 25 a m/ / asi gna el val or 30 a n/ / asi gna el val or 55 ( m+ n) a p

C.2.5. Sentencia if

Las sentencias de selección proporcionan control sobredosalternativas basadas enel valor lógico de una expresión.

i f ( e x p r e s i ó n l ó g i c a )bl oqueCen t e n c i a s l/ / s i son var i as sent enci as se enci er r an ent r e { }

b l oq u eC e n t e n c i a s 2 1[else i f ( e x p r e s i ó n l ó g i c a )

[elsebl oqueSen tenc iash r ]

Ejemplo

i f ( i < O )

elset

Syst em. out . pr i nt l n( "Númer o negat i vo ") ;

Sys t e m out . pr i nt( "Número vál i do, I ) ;

Syst em. out . pr i nt l n( "es pos i t i vo") ;

1

C.2.6. Sentencia s w i t c h

La sentenciaswi t ch es la bifurcación múltiple.swi t c h ( e x p r e s i o n - i n t )f

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 472/481

464 Java 2. Manual de programación

case constante - expl:sentenciasl;

ent r e l l aves * /[break;

sen ncias2;[break; ]

/ *si se t r at a de múl t i pl es acci ones no es necesar i o encer r ar l as

[case cons tan e-exp2 :

[case constante-expN:sent en i a N;[break; ]

sen enciasX;[break; ]

[default

Ejemplos

1. switch ( y / 50){

case 2: el ement o = new Demo2( O, O); break;case 3: el ement o = new Demo3( 0, O, 100) ; break;case 4: el ement o = new Demo4( 0, O, 200) ; break;case 5: el ement o = new Demo5( O, O); break;

1

2. switch ( n )

case 1:case 2:

i

vi sual i zar Resul t adobreak;

case 3:case 4:

case 5:case 6 :

vi sual i zar Resul t ado

vi sual i zar Resul t adobreak;

default:vi sual i zar Resul t ado

} / / f i n de swi t ch

C.2.7. EtiquetasnombreE ti que ta :

break [nombreEtiquetal ;

continue [nombreEtiqueta] ;

" 1 , 2, Si er r a de Cazor l a ") ;

"3, 4, Si er r a Magi na") ;

"3, 6, Si er r a de J aen" ) ;

n + f uera de r ango " ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 473/481

Guía de sintaxis 465

s a l i r :i

for ( i = O; i < 10; i ++){

for ( j = O; j < 20; j ++)

Iif ( i == 1) break s a l i r ;Syst em out . pr i nt ( j + " ) ;

Sys t e m out . pr i nt l n0;1

} / / f i n del bl oque con l a et i quet a

C.2.8. Sentencia while

La sentenciawhi l e se utiliza para crear repeticiones de sentencias en el flujo del programa.

while (expresiónlógica)bl oqueSen tencias/ / e l bl oquesent enci as puede ej ecut ar se de O a n veces

Ejemplo

while ( cuent a <= numer o){

Syst em out . pr i nt ( cuent a + ' I , " ) ;

cuent a++;

1

C.2.9. Sentenciado-while

La sentenciado- whi l ese utiliza para repetir la ejecución de sentenciasy se eje-cuta al menos una vez.

do

while (expresiónLÓgica) ;

bloquesentencias / / e l bl oquesent enci as se ej ecut a al menos una vez

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 474/481

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 475/481

Guía de sintaxis 467

[catch ( t i poEx cepc i on2 i dent i f i c adoz - 2)boqueSent en ci a s 2 ]

. . .[ f i n a l l y

boqueSent enci ashr ]o bien

t ry

f i n a l l ybl oqueAi nt en t a r

boquesen t nci asN

ya que el bloquet r y no puede aparecersólo.

import j ava. i o. * ;public class Ret ur nTr yEj{

p ub li c s t a t i c i n t l eer ( )

iI nput St r eamReader i s r = new I nput St r eamReader ( Sys t em i n) ;Buf f eredReader br = new Buf f er edReader ( i s r );

St r i ng cadena = ' I ;

t ry{

cadena = br .r eadLi ne( ) ;

return I nt eger . par s eI nt ( cadena) ;

1catch ( Except i on e){

i f ( e instanceof I OExcept i on)

else i f ( e instanceof Number For mat Except i on)Syst em. out . pr i nt 111( "Error de ent r ada/ s al i da" ) ;

Sys t e m out . pr i nt l n( "No t ecl eó un númer o ent er o ") ;

1/ / I nst r ucci ón si gui ent e a cat chSys t em out . pr i nt 111( "Se devuel ve O" ) ;

return O;

p ub li c s t a t i c vo id mai n ( St r i ng ar gs [ ] )

ti n t n;do{

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 476/481

468 Java 2. Manual de programación

Sys t em out . pr i nt ( "Demeun númer o ent er o ent r e 1 y 20 ' I ) ;

n = l eer ( ) ;

1while ( ( n <= O) I 1 ( n > 20) ;Sys t em out . pr i nt l n( " 2A' '+ n + = + Mat h. pow( 2, n) ) ;

1

C.2.13. Sentencia throw

Una sentenciat hr owlanza una excepción, que puede ser una excepción recibo bien una nueva excepción. Una cláusulacatch puede recibir una excepcióny, en

lugar de tratarlao después de hacerlo, volver a lanzarla mediante una instruct hr ow.

t ryb l o q u e A I n t e n t a rcatch ( NumberForma t E x c e p t ion i d e n t i f i c a d o r ){

/ / . . .throw ( i d e n t i f i c a d o r ) ;

1

Para lanzar una nueva excepción, se crea un objeto de una subclaExcept i on que implemente un constructory se lanza cont hr owcuando ocurrael hecho que debe provocar la excepción:

if ( e x p r e s i ó n l ó g i c a )throw new ConstuctorSublclaseException [ p a r á m e t r o i , p a r á m e t r o 2

[ , . . . l l ) ;

Ejemplo

if ( edad < 18 I I edad > 65)throw new Fuer aDeRango ( "Excepci ón: val or f uer a de r ango " ) ;

c l a s s Fuer aDeRango extends Except i on{

St r i ng mensaj e;

public FueraDeRango ( St r i ng causa)i

mensaj e = causa;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 477/481

Guía de sintaxis 469

p u b l i c St r i ng get Mess age ( )

i

1

re tu rn mensaj e;

C.2.14. Sentencia throws

Lista las excepciones no tratadasy pertenecientes a clases distintas deRunt i meExcept i on. Así, su tratamiento será pospuestoy deberá ser efectuado por el método llamadoro tendrán que volver a ser listadas en la cabecera de éste con

otra cláusulat hr ows.[ r n o d i f i c a d o r e s D e M é todos] t i poDeResul t ado nombr eMét odo

( [ i p o p a r á m e trol paráme t r o l[ , t i p o P a rá rn e t ro 2 p a r á r n e t r o 2 [ , . . I , ] )[throws Excepción1 [,

Excepci ó n 2 [, . . . I I

/ / cuerpo del mét odo que no t r at a l a excepci ón

C.2.15. Sentenciapackage

Cada clase pública definida en Java debe ser almacenada en un archivo separay si hay varias relacionadas todas ellas se almacenan en el mismo subdirectorioUn conjunto de clases relacionadas definidas en un subdirectorio común puedconstituir un paquete Java. Los archivos del paquete deben comenzar con lsiguiente sentencia:

package nombrepaquete;

donde el nombre del paquete refleja el subdirectorio que contiene dichas clases. utiliza el carácter punto( . como separador entre nombres de directorios, cuandoes necesario especificar varios para referenciar al que contiene las clases.

Ejemplo

package l i br o. Tema03;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 478/481

470 Java 2. Manual de programación

Se puede usar una clase definida en otro paquete especificando, para refa ella, la estructura de directorios del otro paquete seguida por el nombreclase que se desea usary empleando el carácter punto como separadorReferenciar clases de esta forma puede resultar molestoy la solución consiste enutilizari m p o r t , que permite incluir clases externaso paquetes enteros en elarchivo actual.

c.3. MISCELÁNEA

C.3.1. Referencia a miembros de una claser: arnkre0bj e t o. ?omOreComponen te

Sies st at i c no es necesario referirse a una instancia en particular de la cly puede referenciarse como

n o m b reC lase . nombreComponente

Losmiembros de una clase están asociados con una instancia específica misma, excepto si son estáticos.

C.3.2. Conversión explícita de tipos

Existen dos tipos fundamentales de conversiones de tipos que pueden ser realen Java, con respecto a tipos numéricosy con respecto a objetos. El formato a apli-car para efectuar una conversión explícita de tipos es:

( t j p o A ' o m b r e ) expresión;

Ejemplo

double r esul t aao = (double) ( 4 / 8 ) ; / / as i gna 0. 0 al r esul t adodouble r esul t ado = ( d o u b l e ) 4 / ( d o u b l e ) 8 ; / / as i gna 0. 5 al r esul t adodouble r es l J l t ado = (double) / 8 ; / / as i gna O. 5 al r esul t adodouble r es i i l t aao = 4 / 5 ; / *conver s i ón i mpl í c i t a, as i gna 0. 0 alr esul t ado * /

A1 c m r. o unAl umno = ( Al uy no)KnaPer sona;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 479/481

Guía de sintaxis 471

C.4. ARRAYS

Un array es un objeto que contiene un número de posiciones de memoria consecu

tivas, celdas de memoria, cada una de las cuales contiene datos del mismo tipo. Loarrays en Java pueden se unidimensionales o multidimensionales

C.4.1. Declaración de un array

int arrEnt ] ; / / ar r ay uni di mensi onal capaz ae al nace- ar enterosfloat ] ar r Fl oat ; / / ar r ay uni di mensi onal capaz de al macenar f l oa :double[] j ar r Codbl e; / / ar r ay bi di mensi onal para al macenar da t os cioLble

int a [ ] I ; / /a r ray bi di mens- ona- capaz de al r r acenar enteros

C.4.2. Creación de un array

arrEnt = new i n t [ 100 ] ; / *necesar i a su pr evi a dec1araz: ón:i nt ar r Ent [ ] ; * /

Es posible crear arrays enlos que cada fila contiene un número diferente decolumnas:

a = new in t [3 ] I ; / / as i gna f i l a s ( supuest a l a pr evi a aec l ar ac i ón)a [ O ] = new i n t [ 7 ] ; / / as i gna 7 col umnas a l a f ; i a Oa [ i ] = new i n t [ 5 ] ; / / as i gna 5 col umnas a l a f i l a 1a [ 2 ] = new i n t [ 9 ] ; / / as i gna 9 col umnas a l a f i l a 2

C.4.3. Combinar declaracióny creaciónLa declaración y la creación se pueden combinar.

i n t [ ] arrEnt = new intiloo];double[] I ar r Doubl e = new doubie[8j l o ] ;Pel ot a [ ] ar r ay Pel ot as = new Pel ot a; l C];

C.4.4. Com binar declaración creación e inicialización

i n t [ ] arrEnt = 119, 2, 3 , 5, 7, 6, 8, 15, 9, 1 2 ) ;

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 480/481

472 Java 2. Manual de programación

C.4.5. Recorrido de los elementos de un array

Se suele efectuar con ayuda de estructuras repetitivas.

for (int i = O; i < ar r ay Pel ot as . 1engt h; i ++)ar r ay Pel ot as [ i ] = new Pel ot a ( ) ;

C.4.6. Acceso a un elemento de un array

Se accede a un elemento de un array mediante un índice que debe ser un valor-ro mayoro igual que cero y menor que el número de elementos del array (alma-nado en la variable de instancial engt h) y que especifica la posición del elementoen el array

ar r ayPel ot as [ 5 ]. mover A( 24, 15);a [ O ] [ 5 ] = 2 + a [ O l [ 4 ] ;

C.5. CADENAS

Una cadena(string)es una secuencia de caracteres. Java proporciona una claincorporadaSt r i ng para manejar cadenas de caracteres:

St r i ng msg = "Si er r a de Cazor l a" ;

Si c a d l y cad2 son variables de tipo cadena

cadl == cad2

comprueba si las dos variables se refieren al mismo objeto. Mientras que

cadl . compar eTo( cad2)

devuelve positivo, ceroo negativosegúnc a d l sea mayor, igualo menor quecad 2 .

C.5.1. Concatenación de cadenas

El operador+ en Java tiene un significado especial de concatenación de cadeny se puede utilizar con objetos de la claseSt r i ng, que pertenece al paquete

8/11/2019 Luis Joyanes Aguilar - Java 2

http://slidepdf.com/reader/full/luis-joyanes-aguilar-java-2 481/481

Guía de sintaxis 473

j ava . l ang. Al contrario queC++,Java no soporta sobrecarga de operadores, elcaso del operador+ para concatenación de cadenas es una excepción a esta regla deJava. En cuanto uno delosoperandos que intervienen en una expresión es de cade-na, el operador

+convierte a cadena los valores de otros tipos que intervienen en la

expresión y efectúa concatenación:

a + b / / al menos a o b han de ser una cadena

Ejemplos

Sys t em out . pr i nt l n ( 5+1); / / Sal i da 6Sys t e m out . pr i nt l n( t 5 i i ) ; / / Sal i da 51

g. dr awSt r i ng( 5+1, 100, 100) ; / / Er r or de si nt axi sg. dr awCt r i ng( "5 + 1 = " +5+1, 100, 100); / / Sal i da 5 + 1 = 51

St r i ng h = new St r i ng ( "Fel i ci dades") ;

St r i ng pm = new St r i ng( "par a Mackoy") ;

St r i ng t i t ul o = h + + pm/ / i mpr i me Fel i ci dades par a Mackoy;Cys t em out . pr i nt l n( t i t u1o) ;

C 6 APPLETS