Java 2 Manual de Programaci

482
7/23/2019 Java 2 Manual de Programaci http://slidepdf.com/reader/full/java-2-manual-de-programaci 1/482 Id Java 2, incluyena

Transcript of Java 2 Manual de Programaci

Page 1: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 1/482

Id

Java 2, incluyena

Page 2: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 2/482

JAVA 2

MANUAL DE PROGRAMACIÓN

Page 3: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 3/482

JAVA 2MANUAL DE PROGRAMACIÓN

Luis Joyanes Aguilar

Mat i lde Fernandez Azuela

Departamento de Lenguajes y SistemasInformáticos

e Ingeniería del SoftwareFacultad de Informática / Escuela Universitaria de informática

Universidad Pontificia de Salamanca. Campus Madrid

Osborne

McGraw-Hill

MADRID BUENOS AIRES CARACAS GUATEMALA LISBOA MÉXICO

NUEVA YORK PANAMA SAN JUAN SANTAFÉ DE BOGOTÁ SANTIAGO SA0

PAUL0

SAN FRANCISCO*

SIDNEY SINGAPUR ST. LOUIS TOKIO*

TORONTO AUCKLAND HAMBURG0 LONDRES

*

MILÁN MONTREAL NUEVA DELHI PARiS

Page 4: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 4/482

Page 5: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 5/482

v i Contenido

I,

11. Estructura de un programa aplicación en Java ................................................1 . 1 I .

1 .

Referencia a miembros de una clase .........................................................

I , 17. Errores de compi laci ...............................................I ,

12.2. Errores de e-iecución

I . 12.3. Errores Ibgicos .......................................................

25 27 

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

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

Capítulo 2. 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  biblioteca d c clases de Java ....................................................7.8. Coiiceptos bis icos sobre e x c e p ...................................................

2.9.

7.10. Las clases Char act er y Bool ean . . . . . . . . . . . . . . . . . . . . . . . .La clase Nxmber y sus subclases ....................................

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

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

2 .13 . La sentencia d c asignación .......2.14. Expresiones .................. ..................................................

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

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

...............................2.18. Operado res aritméticos ......................... .....................................7.19. Operadores relacionales ................. .........................................2

Operadores lb&'ICOS ............... .........................................................................................................

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

32 33 34 34

3841 44 45  46 48 49525253

54  55 55 575758  61 

61 

63

656767

71 

3..

La sentencia i f ........... 72 3 . 3 .

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

80.5 . La sentencia f o r ....................3.6. La sen t enc i a break 83 3.7. La sentencia cont i nue . . . . . . 85  

Capítulo 3. Decisiones y  bucles ................. ............................................

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

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

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

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

Page 6: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 6/482

Page 7: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 7/482

Page 8: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 8/482

Page 9: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 9/482

Page 10: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 10/482

Contenido x i

A P É N D I C E S

Palabras reservadas Java ...................................................................................... 445 

Prioridad de operadores 447

Guía de sintax is ..............................................................................

Paquetes de la plat aforma Java 2.Versiones 1 .3 y1 .4 Beta ...............................

Recursos: libros, revistas y WEB ........................................................................

índice

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

Page 11: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 11/482

P R Ó L O G O

Cinco años después desu

lanzamiento, Java se ha convertido enu n estándar de la industria, en un lenguaje de programación paradesarrollo de aplicaciones tanto de propósito general como deInternet, y también en un lenguaje para comenzar la formación en

 programación, al tener características excelentes para el aprendi-

zaje.Java, desarrollado por Sun Microsystems en 1995, es un mag-nífico y completo lenguaje de programación orientado a objetosdiseñado para distribuir contenidos a través de una red. Una de sus principales características es que permite operar de forma inde7

 pendiente de la plataforma y del sistema operativo que se esté uti-lizando. Esto quiere decir que permite crear una aplicación que

 podrá descargarse de la red y funcionar posteriormente en cual-quier tipo de plataforma de hardware o software. Generalmente, y

al contrario, todo programa o aplicación queda atado a dos cosas:al hardware y al sistema operativo. Así,  por ejemplo, una aplica-ción Windows sólo funcionará en plataforma

Wintel

(equipadacon procesadores Intel y sistema operativo Windows) igual queuna versión creada para Mac sólo funciona sobre Power PC o

Imac y Mac OS o la misma aplicación desarrollada para Unix, sólolo hace sobre plataformas Unix y no hay forma de que funcionesobre otra máquina.

La idea de Java, por el contrario, es poner una capa sobre

cualquier plataforma de hardware y sobre cualquier sistema ope-rativo que permite que cualquier aplicación desarrollada en Javaquede ligada únicamente a Java, independizada por lo tanto de la

xi i i

Page 12: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 12/482

xiv Prólogo

 plataforma. Esta concepción queda recogida en el concepto de máquina virtualJVM (Java

V

Machine), un software que interpreta instrucciones para cual-quier máquina sobre la que esté corriendo y que permite, una vez instalado, que unamisma aplicación pueda funcionar en un PC o en un Mac sin tener que tocarla. Hoyen día. cualquier sistema operativo moderno (Windows, Macintosh, Linux, Unix,Solaris. etc.) cuenta con una JVM. Así, lo que hace Java en combinación con esta«máquina» es funcionar como hardware y como sistema operativo virtual, emulan-do en software una CPU universal. Al instalar Java, éste actuará como una capa deabstracción entre un programa y el sistema operativo. otorgando una total indepen-dencia de lo que haya por debajo; es decir, cualquier aplicación funcionará en cual-quier máquina e incluso en cualquier dispositivo.

Otra gran ventaja es que los  programadores no tendrán que desarrollar varias

versiones de la misma aplicación, puesto que el modelo de desarrollo es el mismose trate del dispositivo más pequeño o del más grande de los servidores. Otra granventaja es que permite que todas las máquinas. plataformas y aplicaciones se comu-niquen entre sí accediendo desde cualquier equipo, dondequiera que esté situado, alas aplicaciones que residan en una red, ya sea Internet o una intranet o extranet.

En definitiva, se puede decir que Java es lo más cercano que existe hoy día a unlenguaje de computación universal, lo que significa que puede correr en cualquier

 plataforma siempre y cuando una máquina virtual haya sido escrita para ella.

LA GENEALOGíA DE JAVA

Java es un descendiente de C++ que a su vez es descendiente directo de C . Muchascaracterísticas de Java se han heredado de estos dos lenguajes. De C , Java ha here-dado su sintaxis y de C++, las características fundamentales de programación orien-tada a objetos.

El diseño original de Java fue concebido por James Gosling, Patrick Naughton,Chris Warth, Ed Frank y Mike Sheridan, ingenieros y desarrolladores de Sun Mi-

crosystems en 1991, que tardaron 18 meses 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» no eraInternet. En realidad, se buscaba un lenguaje independiente de la plataforma (esdecir, de arquitectura neutra) que se pudiera utilizar para crear software que seincrustara en dispositivos electrónicos diversos tales como controles remotos, auto-móviles u hornos de microondas. Aunque el modelo de lenguaje elegido fue C++,

se encontraron con que, si bien se podía compilar un  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 convertía encompiladores caros y en gran consumo de tiempo para crear los programas. Sobre

Page 13: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 13/482

Prólogo XV

esas premisas, Gosling y sus colegas comenzaron a pensar en un lenguaje portable,independiente de la plataforma que se pudiera utilizar para producir código que seejecutara en una amplia variedad de CPU y  bajo diferentes entornos. Entoncescoinenz6 a aparecer el nuevo proyecto y se decidió llamarle Java.

¿Por qué Java es importante para Internet?

Internet ha ayudado considerablemente a «catapultar» a Java al cenit del mundo dela programación de computadoras. y Java.

a su vez, ha tenido un  profundo impactoen Internet. La razón es muy simple: Java extiende el universo de los objetos que semueven libremente en el ciberespacio que forma la red Internet. En una red existendos grandes categorías de ob-jetosque se transmiten entre las computadoras conec-tadas (el servidor y la computadora personal): información pasiva y dinámica, pro-gramas activos. U n ejemplo fácil de datos pasivos son los correos electrónicos queusted recibe en su computadora o una página web que se baja de la red. Incluso sidescarga un  programa, está recibiendo datos pasivos hasta tanto no ejecute dicho programa. Sin embargo, existewotros tipos de objetos que se transmiten por la red: programas dinámicos autoejecutables que son agentes activos en la computadoracliente.

Estos  programas dinámicos en red presentan serios problemas de seguridad y

p Java ha resuelto gran cantidad de problemas con un nuevo modelo de programa: el uJava se puede utilizar para crear dos tipos de programas: aplicaciones y applets.

Una a es un  programa que se ejecuta en su computadora bajo el sistemaoperativo de su computadora; en esencia, es un  programa similar al creado utili-zando C, C++ o Pascal. Cuando se utiliza para crear aplicaciones, Java es un len-guaje de propósito general similar a cualquier otro y con características que lo hacenidóneo para programación orientada a objetos. Este libro dedica buena parte de sucontenido a enseñar a diseñar, escribir y ejecutar aplicaciones,

Pero Java tiene una característica notable que no tienen otros lenguajes: la posi- bilidad de crear applets. Un applet es una aplicación diseñada para ser transmitida por Internet y ejecutada por un navegador Web compatible con Java. Un applet esrealmente un  pequeño programa Java, descargado dinámicamente por la red, talcomo una imagen, un archivo de sonido, un archivo musical MP3 o divX, o unasecuencia de vídeo: pero con una notable propiedad, es un programa inteligente que puede reaccionar dinámicamente a entradas y cambios del usuario.

Java es un lenguaje idóneo para resolver los  problemas de seguridad y portabili-

dad inherentes a los sistemas que trabajan en red. La razón fundamental de este aser -

to reside en el hecho de que la salida de un compilador Java no es un código ejecutable,sino códigos de bytes (bytecode). Un h es un conjunto de instrucciones muyoptimizadas diseñadas para ser ejecutadas por un sistema en tiempo de ejecución

Page 14: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 14/482

x v i Prólogo

Java. denominado máquina virtual Java(JUVLI Vit+md M

JVM) que actúa comoun interprete para los bytecodes. La traducción de un programa en

código4

de bytesfacilita la ejecución del programa en una amplia variedad de e n t o r n a y 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 en 1991 con el nombre deProyecto

O («roble» en

inglés) que era -según cuentan sus inventores- el árbol que veían desde su despa-cho. Tras muchas peripecias, Java salió al mercado en 1995

y el cambio de nombre parece que se debía a que era uno de los tipos de café que servían en una cafeteríacercana al lugar en que

traba.jaban

los desarrolladores y ésa es la razón de que el

logotipo de Java sea una humeante taza de café.Una de las primeras aplicaciones que lo soportan con especificaciones

comunes

 para las que se comenzó a diseñar Java fue Internet; su objetivo era poder descar -gar en cualquier tipo de máquina aplicaciones residentes en 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ándose a Internet y a sus innovaciones tecnológicas; eso significa que Javasoporta XML de

modo

muy eficiente y las nuevas tecnologías inalámbricas, celula-

res o móviles. Dos grandes especificaciones existen actualmente en torno a Java:J2EE (Java 2 Enterprise Edition) y J2ME (Java 2 MicroEdition).

J2EE, está orientada al desarrollo de aplicaciones de propósito general y sonnumerosos 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 bolsillo o de mano

(handhrlds))

que requieren unaintegración en dispositivos con poco espacio físico y memoria de trabajo. J2EE esya un auténtico estándar así reconocido por la industria y J2EM va camino de con-vertirse en otro gran estándar. que en este caso está contribuyendo a la revolución

inalátnbrica que está haciendo que Internet llegue a dispositivos electrónicos detodo tipo, como teléfonos móviles (celulares), teléfonos de sobremesa, electrodo -mésticos, decodificadores de TV digital, etc.

La versión original de Java que comenzó a comercializarse y expandirse conrapidez fue la 1 .O, aunque pronto apareció la versión

I . I ,

que si bien sólo cambió elsegundo dígito del número, los cambios fueron más profundos de lo que el númerosuele indicar en la nomenclatura de los  programas de software (modificaciones y pequeñas actualizaciones). De hecho, añadió numerosos elementos a la biblioteca.redefinió los sucesos (eventos) y reconfiguró la citada biblioteca. Posteriormente

la

versión 2, con sus diferentes kits de desarrollo, ha servido para asentar la eficienciay calidad Java. Se puede considerar que Sun ha lanzado cinco versiones importan-tes del lenguaje Java:

Page 15: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 15/482

Prólogo xvii

Java 1.0. Una pequeña versión centrada en la Web disponible uniformemente para todos los navegadores Web populares y que se lanzó en

1995.

Jmu 1.1. Una versión lanzada en 1997 con mejoras de la interfaz de usuario,manipulación de sucesos (eventos) reescrita totalmente y una tecnología de

com

po nentes den oni nada Ju

v u

B

Juiw 2c o t SDK 1.2. Una versión ampliada significativamente y lanzada en

I Y98 con características de interfaces gráficas de usuario, conectividad de

 bases de datos y muchas otras mejoras.Juw 2 C O I ZSBK 1.3.

Una versión lanzada en el 2000 que añade característicasnotables. como multimedia mejorada,

más

accesibilidad y compilación másrápida.J 2 ~ 0 1 1SDK 1.3 h Una versión lanzada a primeros del mes de junio de2001 que, entre otras me.joras. introduce la posibilidad de trabajar con XML. Afinales del 200 1 está prevista la salida de la versión definitiva.

Además de los kits de desarrollo de Java, existen numerosas herramientascomerciales de desarrollo para los programadores de Java. Las más populares son:

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

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

gramas Java a medida que lea este libro, necesita asegurarse que sus herramientasde desarrollo están actualizadas para soportar Java 2.

Los programas de este libro fueron escritos y  probados con Java SDKv.

1.3.1, laversión

más

actual existente durante el proceso de escritura del libro. Sin embargo,durante la fase de pruebas de imprenta de la obra, Sun presentó oficialmente el 29de mayo de 2001 la versión Java SDK

v.

1.4 beta con la cual fueron compilados y

 probados todos los  programas de nuevo, por lo que usted no deberá tener ningún problema. Bueno, realmente, sí se le presentará un «problema» como a nosotros, pero que por fortuna nos resolvieron los ingenieros de Sun Microsystems (AndrewBennett y Bill Shannon), cuya ayuda y apoyo técnico destacamos de forma espe-cial. El «problema» es que al tratar de ejecutar los applets  bajo SDK

v.

1.4 en elnavegador Web no le funcionarán completamente a menos que utilice unos  progra-mas plug -in descargados del sitio de Sun.

Los navegadores existentes normalmente no soportan -como es lógico- la últimaversión de Java y sólo cuando ellos realizan la nueva versión es cuando tienen en

cuenta esta Última versión de Java. Sun ha resuelto esta situación proporcionandoun plug -in (añadido/actualización o «parche»).En realidad, cualquier clase añadidaa Java I .2 y  posteriores no se encuentra en la implementación de Java proporcionada

Page 16: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 16/482

xvi i i Prólogo

 por los navegadores. por lo que se originarán erroresal

usar las nuevas clases. perono debiera haber problemas cuando se está escribiendo código que no usa estas nue-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

(jrri~rc.)

existente en Java 1.3 que

iiutotiiáticliiiieiite dirigía el código a la versión I . 1 de la máquina virtual. Para solu-cionar

este <<probleman

se tienen dos posibilidades:Lisir

siempreJriiw

Plug -in, lo

cual le permitirá emplear lasúltiinas rne.joras

del producto. o dirigir específicamen-te SLI código a una máquina virtual determinada compatible con el navegador corres-

 pondiente. mediante elempleo

del modificador-

del cornpilador.

Las nuevas actualizaciones

Sun Microsystems es propietaria de Java; sin embargo, numerosos fabricantes con-tribuyen a la

me-jora y desarrollo de las especificaciones del ectándar. Sun propor -ciona las licencias de esta tecnología pero

e.jerce

siempre un cierto control sobre lasimplenientaciones que se hacen de la misma, con el ob.jetivo de mantener la inde-

 pendencia de la plataforma. Ese objetivo se trata de conseguir con procesos contro-lados por el programa JCP (Jmw

Coinmimit~ Procrss).

en los que se determina el

 proceso formal de estandarización y 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 JDK 1.2 y 1.3. Sin embargo, ya está disponible( j ava .sun. corn/ j 2 se/ 1. 4 ) la versión más reciente.

J2SE 1.4 (ki t de desarro-Ilo

JDK 1.4). para las plataformas Solaris. Linux y Windows.

JavaJ2SE

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 de la

 plataforma de la posibilidad de trabajar con XML. estableciendo así los fundamen-tos básicos para la creación y consumo de servicios Web. Existen mejoras en lasJFC

(JCIVCI

FoundationCln.w.7)

que afectan al rendimiento de las aplicacionescliente basadas en

S

y gráficos Java 2D. También contempla el uso de arqui-tecturas de 64  bits y se ha mejorado la seguridad con la integración de una nuevaAPI compatible Kerberos.

Direcciones Web de interés profesional

Internet está plagada de direcciones de interés y excelentes relativas a Java. No obs-tante. además de los recursos que incluimos en el Apéndice G (que aconsejamos

Page 17: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 17/482

Prólogo x ix

visite gradualmente) le daremos unas direcciones de gran interés sobre todo paradescargar software y documentación actualizada.

ht t p : / / ~a va . s u r ~. . 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 /

k t tp :

/ 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:il

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

P

Jnvtr

 2, S

 Edition I : I . 4

P

Jaiw  2  Micr o E

t

J2 ME .ri.rtemci.r. naldm

-

17rico.r)

Como motor de búsqueda le recomendamos Google

(www.oogle. corn) ,

Al t avi s t a (www.al avista. corn) o Ask (www.ask.corn), aunquesi está acostumbrado a otros buscadores (tales como los 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 HERRAMIENTA DIDÁCTICA

La obra Ja~m 2. Mutiid de p ha sido diseñada y escrita pensando en personas que desean iniciarse en el mundo de la programación de Java tanto paradesarrollo de aplicaciones como para desarrollo de upplets. Tiene como objetivo primordial enseñar a  programar en Java para entornos abiertos y entornos deInternet en niveles de iniciación y medios. Si bien es un libro pensado en el profe-sional y en el estudiante autodidacto, la experiencia docente de los autores se havolcado en el libro tratando de conseguir una obra didáctica que pueda servir nosólo  para su uso en cursos profesionales, sino en cursos de enseñanzas regladastales como los módulos formativos de ciclo superior de la formación profesional yen los primeros semestres de estudios universitarios de ingeniería y ciencias. Se ha buscado que el libro fuera autosuficiente, aunque el rendimiento mayor del libro se

Page 18: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 18/482

xx

Prólogo

conseguirá cuando el lector tenga una formación mínima de fundamentos de teoríade progranmación. Conocimientos de otros lengua.jes de programación. fundamen-talmente estilo C/C++. ayudará considerablemente al aprendizaje gradual no sólo

en el tiempo sino en el avance de contenidos.Por todo ello. pensamos que el libro puede servir. además de aprendimje auto-

didacto. para cursos de introducción a la programación/prograninción en Java de u nsemestre de duración o cursos profesionales de unas 30-40 horas que y a  poseanexperiencia en otros lengua-jesde programación.

CONTENIDO

Siempre que Sun lanza una nueva versión de Java hace un ki t de desarrollo gratisque pone disponible en su Web para soportar a dicha versión. Este libro se hacreado utilizando el kit que se denomina Java 2 Software Development Kit,Standard Edition, Versión 1.3 (JDK 1.3). Tras lanzar Sun la versión 1.4 beta, sehan probado todas las aplicaciones y applefs con esta nueva versión (JDK 1.4).

Así mismo, se han actualizado los  paquetes de la plataforma Java 2  para incluirambas versiones y el contenido del CD ad.junto al libro que incluye dichas versio-nes para los entornos Windows y Linux. El libro consta de quince capítiilos y sieteapéndices (A-G). Un breve contenido de los capítulos y apéndices se reseña a con-

tinuación:

Capítulo 1. Introducción CI

J 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 notables.Se describe el concepto de aplicación y de u y los métodos para crear u n

 programa Java. Sun tiene disponible en su página Web(www.sun.com)

el Kit deDesarrollo necesario para la compilación y ejecución de programas denominadoJDK ( Development Kif) 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 puesta a punto de programas por parte del usuario.

Capítulo 2. C del lenguaje J Todo lenguaje de programación.y Java no es una excepción, dispone de un conjunto de elementos básicos que cons-tituyen su núcleo fundamental para la escritura de programas. En el capítulo se des -criben: palabras reservadas. identificadores, tipos de datos. variables, constantes yoperadores. así como una breve introducción a las clases y  bibliotecas de clases deJava.

Capítulo 3. D y bucles. Los programas requieren siempre de sentencias

y estructuras de control para seguir la secuencia de e.jecución de sus instrucciones.La ejecución secuencia1 de un  programa requiere de modo continuo una toma dedecisiones e iteraciones o repeticiones: para ello, se utilizan sentencias de decisióny de iteración para realizar los bucles o repeticiones de acciones. Se describen

Page 19: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 19/482

Prólogo xx i

las sentencias básicas: i f , ef - el se, f o r , whi l e, do- whi l e, br eak ycont i nue.

Capí t ul o4.C ohjrro.s y inPtodos . El concepto de clase y de objeto comoinstancia o e.jemplar de una clase se analizan con el apoyo de la sintaxis utilizada

 para SLI escritura.Capítulo 5. H U n a de las propiedades fundamentales del concepto de

orientación a objetos es la herencia. Se explica el concepto, así como el método deimplementar en Java dicha propiedad y sus ventajas e inconvenientes.

Capítulo 6.E

y p Otras dos propiedades fundamen-tales de la orientación a objetos son el encapsulamiento de la información y el con-cepto de polimorfismo. Ambas propiedades. los métodos y sintaxis se describen eneste capítulo.

Capítulo 7. Arruys. La información básica manejada por los  programas se or -ganiza en estructuras de datos. Se describe el array como representante genuino delistas. tablas o vectores. así como métodos para ordenar estas estructuras de infor -mación y realizar búsqueda de información en las mismas.

Capítulo 8. C y El concepto de cadena como secuencia o lista decaracteres y las clases específicas necesarias para su manipulación se analizan en estecapítulo. También se considera el concepto casi siempre necesario en un programadel tratamiento de las fechas como elementos básicos de medición del tiempo.

Capítulo 9. i ,qrcíficn.sd usuario. Una de las grandes virtudes de los

lenguajes de programación actuales, y Java en particular, es la facilidad que ofreceal usuario para construir interfaces gráficas sencillas y adaptadas al entorno de tra-

 bajo.Capítulo 10. Gestión

cíc eventos. La  programación mediante eventos o sucesoses otra de las características sobresalientes que aporta Java al mundo de la progra-mación. El concepto y los tipos de eventos así como métodos para su gestión ymanipulación se describen en este capítulo.

Capítulo 11. A Los programas conocidos como applets son, sin género dedudas. el puente ideal para la conexión con el mundo Internet y una de las propie-dades de Java que lo han hecho tan popular. Una breve introducción al lenguajeHTML y el modo de realizar applrts son la base del capítulo.

Capítulo 12. P concurrente: Hilos de ejecución. Otra propiedadfundamental de Java como lenguaje de tiempo real es la posibilidad de manejar pro -cesos en paralelo. El concepto de hilo (thread), su manipulación e implementaciónse analizan en este capítulo.

Capítulo 13. Mdr excepciones. El concepto de excepciones es vital en la

 programación moderna. Lenguajes como Ada y C++ lo incorporaron a su sintaxis,

y Java, siguiendo los  pasos de estos dos potentes lenguajes, ha incluido el trata-miento de excepciones en sus compiladores.Capítulo 14. Archivos. Las estructuras de datos organizados en torno a archivos

o ficheros son pieza fundamental en el proceso de información de cualquier orga-

Page 20: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 20/482

xx i i Contenido

nización. Su organización. diseño y construcción constituyen el contenido funda-mental de este capítulo.

Capítulo 15. E d

c

defliiicíti.s

por

01

p Una vez que el programador sabe mane.jar estructuras de datos básicas como arrays y archivos, sen-tirá la necesidad con relativa frecuencia de utilizar estructuras de datos dinámicastales como listas, pilas y colas. Su concepto y métodos de iinplementación se expli-can en este último capítulo.

En los apéndices. se incluyen herramientas de trabajo complementarias para el

 programador tales como: L de p r J

( A ) ;f de p

r de operadores (B); G de sintaxis de JLILYI 2, que facilita la consulta al lec-

tor en la fase de escritura y depuración de prograinas (C); Paquetes de lap

Jain 3más utilizados e incluidos en las versiones de 1.3.1 y 1.4 de los kit de desa-rrollo JDK (0); Una c

e los 1 dep

orientadosci o

m r í s

popl~ires en la uctucilidd: C++ y Java (E); C del CD comoelemento de ayuda en el aprendizaje y formación en Java para el lector y herra-mienta de software complementaria para cursos y seminarios en laboratorios de

 programación (F); Recursos deJuiu:

libros, revistas y sitios Web de interés.

CD QUEACOMPAÑA AL LIBRO

El disco compacto que se adjunta en las tapas de este libro contiene la versiónJava 2 y el kit de desarrollo JDK de Sun versiones 1.3.1 y 1.4  para entornosWindows y Linux. Así mismo, se han incluido todas las aplicaciones y applets

sobresalientes incluidos en el libro con el ob-jetivo fundamental de ayudarle en el proceso de compilación y ejecución.

 AGRADECIMIENTOS

Como ya hemos indicado anteriormente, no podemos terminar este prólogo sinexpresar nuestra gratitud a todo el equipo de Sun Microsystems en Palo Alto (Ca-lifornia), su disponibilidad y efectividad a la hora de resolver cualquier consulta haresultado una inestimable ayuda en el desarrollo de esta obra. Evidentemente com-

 portamientos profesionales como &tos son algunos de los millones de razones parausar Java. Así pues, reiteramos nuestro agradecimiento a Sun Microsystems y en

 particular a los ingenieros:

Andrew BennettEngineering Manager. Sun Microsystems. Inc.

Page 21: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 21/482

CONTENIDO1

I .

La historia de Java.

1.2. ‘Qué es Java?1.3. Caracterís ticas de Java.1.4.

1.5. Especif icaciones del lengua je Java.1.6. Aplicaciones y applets.1.7. Creación de programas.1.8. Componentes de una aplicación.1.9. Herramientas de desarrollo Java.

1

I O. Una aplicación práctica de Java.1 . I

I .

Estructura de un programa aplicación en Java.1

. I

2. Errores de programación.

La programación orientada a objetos como basede Java.

m 1

Page 22: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 22/482

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 Java y 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 nuevas y eficientes.El futuro de la computación está influenciado por Internet y

Java 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 Red y preparada para multimedia. Desde sunacimiento real en 1995, Java se ha convertido en un .lenguaje

maduro para el desarrollo de aplicaciones críticas y eficientes.Este capítulo comienza con una breve historia de Java y sus carac-terísticas más sobresalientes, así como ejemplos sencillos de apli-caciones y el concepto de applefs Java.

1.1. LA HISTORIA DE JAVA

Java no fue creado originalmente para la red internet. Sun Microsystems comenzó adesarrollarlo con el objetivo de crear un lenguaje, independiente de la plataforma ydel sistema operativo, para el desarrollo de electrónica de consumo (dispositivoselectrónicos inteligentes, como televisores, vídeos, equipos de música, etc.).

El proyecto original, denominado Green comenzó apoyándose enC++,

 pero amedida que se progresaba en su desarrollo el equipo creador de

<<Green»

comenzóa encontrarse con dificultades, especialmente dep Para evitar estas difi-

cultades, decidieron desarrollar su  propio lenguaje y en agosto de 1991 nació unnuevo lenguaje orientado a objetos. Este lenguaje fue bautizado con el nombre deOak. En 1993, el proyecto Green se volvió a renombrar y pasó a llamarse FirstPenon

Juc. Sun invirtió un gran presupuesto y esfuerzo humano para intentar ven-der esta tecnología, hardware y software, sin gran éxito.

A mitad de 1993, se lanzó Mosaic, el primer navegador para la Web y comenzó acrecer el interés por Internet (y en particular por la World Wide Web). Entonces, serediseñó

el lenguaje para desarrollar aplicaciones para internet y, en enero de 1995,Oak se convirtió en Java. Sun lanzó el entorno JDK 1.O en 1996, primera versión delkit de desarrollo de dominio público, que se convirtió en la primera especificación for-mal de la plataforma Java. Desde entonces se han lanzado diferentes versiones, aun-que la primera comercial se denominó JDK

1 . 1

y se lanzó a principios de 1997.

Page 23: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 23/482

Introducción a Java 3

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

El paquete de Java que se utiliza en esta obra, incluye el compilador Java y otrasutilidades, se denomina oficialmente Java 2 JDK, versión 1.3.

Los programas Java se pueden incluir (((embeber))

o ((empotrar))) en páginasHTML y descargarse por navegadores Web para llevar animaciones e interaccionesa los clientes Web. Sin embargo, la potencia de Java no se limita a aplicacionesWeb, Java es un lenguaje de programación de propósito general que posee carac-terísticas completas para programación de aplicaciones independientes o 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 que

otros lenguajes, como C++ y Ada, que tienen propiedades de lenguajes procedi-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éc-nicas tradicionales de programación procedimental o estructurada.

La última versión lanzada por Sun es Java 2 JDK 1.4 Beta. En la direcciónwww . s u n .

corn se pueden encontrar todas las versiones para Windows9x,

Windows 2000/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 de un len-guaje de programación y un entorno para ejecución de programas escritos en ellenguaje 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 elcódigo fuente Java en instrucciones que son interpretadas por la Máquina VirtualJava (JVM, Java Virtual Machine). A diferencia de los lenguajes C y C++ en los

que está inspirado, Java es un lenguaje interpretado.Aunque hoy en día Java es por excelencia el lenguaje de programación para

Internet y la World Wide Web en particular, Java no comenzó como proyectoInternet y por esta circunstancia es idóneo para tareas de programación de pro-

 pósito general y, de hecho, muchas de las herramientas Java están escritas enJava.

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

Page 24: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 24/482

4

Java 2. Manual de programación

Computadora localSistema operativoNavegador Java

Máquina virtualJava

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

Computadora servidor(host)

Código

fuente JavaCódigo fuente

En el mundo de la Web, Java es una tecnología facilitadora que permite a los

desarrolladores crear páginas Web que se entregarán de modo consistente a todoslos usuarios con un navegador habilitado para Java y con independencia de la pla-

taforma hardware y el sistema operativo que se esté utilizando'. Dado que el códi-go fuente se interpreta, si existe un intérprete Java para una plataforma específicahardware o sistema operativo, se pueden escribir programas con el conocimiento deque serán útiles en esa plataforma.

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

la computadora servidor (host) se almacena el código fuente. Cuando un usuario deuna computadora local se conecta con el servidor a través de Internet mediante unnavegador habilitado para Java, el código fuente se transfiere de la computadoraservidor 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 como len-guaje de propósito general. Java es totalmente portable a gran variedad de platafor -mas hardware y sistemas operativos.

Java tiene muchos conceptos de sintaxis de C y C++,

especialmente deC++,

delque es un lenguaje derivado. Añade a C++ propiedades de gestión automática dememoria y soporte a nivel de lenguaje para aplicaciones multihilo. Por otra parte,Java, en principio a nivel medio, es más fácil de aprender y más fácil de utilizar queC++ ya que las características

más

complejas de C++ han sido eliminadas de Java:herencia múltiple, punteros (apuntadores) y sentencia go to entre otras.

En Cohn et al., Java.DeveloperS

 Reference, Indianapolis: Sams  Net. 1996. se describen las caracte-rísticas fundamentales del lenguaje Java original.

Page 25: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 25/482

Introducción a Java 5

Las iinpleinentaciones de la Máquina Virtual Java pueden ser muy eficaces y esohace posible que los programas Java se ejecuten tan rápidamente como los programasC++. Esta característica clave de Java, unida a sus fortalezas como lenguaje de Internet,lo hacen muy adecuado para desarrollos en sistemas clienteiservidor, soporte masivo

de los sistemas informá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 para

desarrollos cliente/servidor y  para desarrollos de Internet.

1.3. CARACTERISTICAS DE JAVA

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

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

1.3.1. Sencillo

Los lenguajes de programación orientados a objetos no son sencillos ni fáciles deutilizar, pero Java es un  poco más fácil que el popular C++*, 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 a C++ un len-guaje difícil y complicado.

Java es simple porque consta sólo de tres tipos de datos primitivos: números,boolean y arrays. Todo en Java es una clase. Por ejemplo, las cadenas son objetos

verdaderos y no arrays de caracteres. Otros conceptos que hacen la programaciónen C++ más complicada son los  punteros y la herencia múltiple. Java elimina los punteros y reemplaza la herencia múltiple de C++ con una estructura única deno-minada i ( i nterface).

Java utiliza asignación y recolección automática de basura (garbage collection),aunque C++ requiere al programador la asignación de memoria y recolección de

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

la escritura de programas.

En C++. I y R (McCraw-Hill , 1999).de Luis Joyanes y Héctor Castán, podrá encon-trar una guía de iniciación con enfoque similar a esta obra. si usted necesita iniciarse en C++.

Page 26: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 26/482

Page 27: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 27/482

Introducción a Java 7

La programación orientada a objetos proporciona mayor flexibilidad, modulari-dad y reusabilidad. En la actualidad está ya muy implantado este tipo de programa-ción y Java se convertirá en breve plazo en uno de los lenguajes más usados de

 propósito general.

1.3.3. Dist r ibu ido

La computación distribuida implica que varias computadoras trabajan juntas en lared. Java ha sido diseñado para facilitar la construcción de aplicaciones distribuidasmediante una colección de clases para uso en aplicaciones en red. La capacidad dered está incorporada a Java. La escritura de programas en red es similar a enviar y

recibir datos a y desde un archivo. La utilización de una URL (Uniform ResourceLocator) de Java puede hacer que una aplicación acceda fácilmente a un servidorremoto.

1.3.4. Interpretado

Java es interpretado y se necesita un intérprete  para ejecutar programas Java. Los

 programas se compilan en una Máquina Virtual Java generándose un código inter-medio denominado bytecode. El bytecode es independiente de la máquina y se

 puede ejecutar en cualquier máquina que tenga un intérprete Java. Normalmente, un cornpilador traduce un programa en un lenguaje de alto nivel

a código máquina. El código sólo se puede ejecutar en la máquina nativa. Si se eje-cuta el programa en otras máquinas, éste ha de ser recompilado. Así por ejemplo,cuando un programa escrito en C++ se compila en Windows, el código ejecutablegenerado por el compilador sólo se puede ejecutar en una plataforma Windows. Enel caso de Java, se compila el código fuente una sola vez y el bytecode generado 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,denominada máquina virtual.

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

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

Page 28: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 28/482

8

Java 2. Manual de programación

la ejecución traduzca la representación enb

en instrucciones de la máquinareal del sistema en el que el programa Java se está ejecutando. Dado que los progra-mas Java se ejecutan a continuación como instrucciones máquina, pueden ser casitan rápidos como programas compilados en lenguajes más convencionales para pla-

taformas de hardware específicas y mantener la p de la máquina virtual.

1.3.5.

Robusto

Robusto significa fiable. Ningún lenguaje puede asegurar fiabilidad completa. Java seha escrito pensando en la verificación de posibles errores y  por ello como un lenguajefuertemente tipificado (con tipos). Java ha eliminado ciertos tipos de construcciones de

 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 excepcio-

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 como C++ 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 distri- buido y en red. Se puede descargar un applet Java y ejecutarlo en su computadorasin que se produzcan daños en su sistema, ya que Java implementa diversos meca-nismos de seguridad para proteger su sistema de daños provocados por un progra -

ma stray. La seguridad se basa en la premisa de que nada debe ser trusted. Naturalmente la seguridad absoluta no existe, pero, aunque se encuentran pro-

 blemas de seguridad en Java, éstos no son lo suficientemente notables como para producir trastornos apreciables.

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

de la universidad de Princeton (allí impartió clase el f ísico universal Einstein)es excelente para estudiar problemas de seguridad informática, especialmente para Java,

ActiveX y JavaScript.

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

Page 29: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 29/482

Introducción a Java 9

1.3.7.  Arquitectura neutral

Una de las características más notables de Java es que es de arquitectura neutral,

lo que también se define como independiente de la plataforma. Se puede escribirun  programa que se ejecute en cualquier plataforma con una Máquina VirtualJava.

Se pueden ejecutar applets de Java en un navegador Web; pero Java es algo más

que escribir upplets de Java, ya que se pueden también ejecutar aplicaciones Javaautónomas (stand -alone) directamente en sistemas operativos que utilicen un intér - prete Java.

I I

Importante: Utilizando Java, los desarrolladores necesitan escribir una Únicaversión para ejecutarse en todas las plataformas, dado que los bytecodes no secorresponden a ninguna máquina específica y trabajan en todas las máquinas.

Comentario: Un programa Java es el mismo si se ejecuta en un PC, unMacintosh, o un sistema Unix. Es distinto de los lenguajes convencionalestales como C/C++

1.3.8. Portable

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

fundamental para los  programas que rueden en ella su independencia de la plata-forma en la que van a ser ejecutados. Dicha independencia se obtiene en Java gra-cias a que el compilador Java genera un código intermedio, bytecode (código byte),no ejecutable por sí mismo en ninguna plataforma, pero que puede ser ejecutado agran velocidad mediante un intérprete incorporado en la máquina virtual Java. Enlas diferentes plataformas existirán máquinas virtuales específicas, y cuando elcódigobyte llegue a esas máquinas virtuales será interpretado pasándolo al códigoadecuado para la computadora receptor de la aplicación. Las máquinas virtuales Javason programas capaces, entre otras cosas, de interpretar el código byte, que pueden

venir incluidos en los navegadores, proporcionados con el sistema operativo, con elentorno Java o  bien obtenerse a través de Internet (mediante descarga del corres-

 pondiente programa). Por tanto, los programas Java pueden ejecutarse en cualquier plataforma sin necesidad de ser recompilados; es decir, son muy portables.

Page 30: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 30/482

10

Java 2. Manual de programación

Pero la portabilidad de Java aún va más allá; Java fue diseñado de modo que pueda ser transferido a nuekas arquitecturas.

En Java todos los tipos de datos primitivos son de tamaños definidos con inde-

 pendencia de la máquina o sistema operativo en el que se ejecute el programa. Estacaracterística es distinta de C o C++, en los que el tamaño de los tipos dependerádel coinpilador y del sistema operativo.

 Nota: El tamaño fijo de los números hace el programa portable.

I I

Regla: El entorno Java es portable a nuevos sistemas operativos y hardware.

El compilador Java está escrito en Java.1 I

1.3.9.  Al to rendimiento

Los coinpiladores de Java han ido mejorando sus  prestaciones en las sucesivas

\ ersiones. Los nuevos compiladores conocidos como J l T

@  permitenque prograinas Java independientes de la plataforma se ejecuten con casi elmismo rendimiento en tiempo de ejecución que los lenguajes convencionalescoin pi 1ados .

1.3.10. Multíhilo

Java es uno de los primeros lenguajes que se han diseñado explícitamente para tenerla posibilidad de múltiples hilos de ejecución; es decir, Java es multihilo (

r Multihilo es la capacidad de un programa de ejecutar varias tareas simul-táneamente. Por ejemplo, la descarga de un archivo de vídeo mientras se graba elvídeo. La Programación multihilo está integrada en Java. En otros lenguajes se tieneque llamar a procedimientos específicos de sistemas operativos para permitir mul-

tihilo.

Los hilos sincronizados son muy Útiles en la creación de aplicaciones distribui-das y en red. Por ejemplo, una aplicación puede comunicarse con un servidor remo-

to en un hilo, mientras que interactúa con un usuario en otro hilo diferente. Esta propiedad es muy útil en programación de redes y de interfaces gráficas de usuario.Un usuario de Internet puede oír una emisora de música mientras navega por una

 página Web y un servidor puede servir a múltiples clientes al mismo tiempo.

Page 31: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 31/482

introducción a Java 11

1.3.11. 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 remotos o en una red (por ejemplo, Intranet/Intemet).

Es una gran ventaja sobre lenguajes tradicionales como C++ que enlaza clases antesdel momento de la ejecución.

Se pueden añadir libremente nuevos métodos y propiedades a una clase sin afec-tar a sus clientes. Por ejemplo, en la clase Cuadr ado se pueden añadir nuevosdatos que indiquen el color del polígono y un nuevo método que calcule el períme-tro del cuadrado. El  programa cliente original que utiliza la clase Cuadr 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 nuevaforma de organización del conocimiento en la que las entidades centrales son los objetos.En un objeto se unen una serie de datos con una relación lógica entre ellos, a los que sedenomina variables de instancia, con las rutinas necesarias para manipularlos, a las que

se denomina métodos. Los objetos se comunican unos con otros mediante interfaces biendefinidas a través depuso de mensajes; en P O 0 los mensajes están asociados con méto-dos, de forma que cuando un objeto recibe un mensaje, ejecuta el método asociado.

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

El encapsulamiento, que consiste en la combinación de los datos y las opera-ciones que se pueden ejecutar sobre esos datos en un objeto, impidiendo usosindebidos al forzar que el acceso a los datos se efectúe siempre a través de losmétodos del objeto. En Java, la base del encapsulamiento es la clase, donde sedefine la estructura y el comportamiento que serán compartidos por el grupode objetos pertenecientes a la misma. Para hacer referencia a los componentesaccesibles de un objeto será necesario especificar su sintaxis:

nombreobjeto. ombreComponente.

Page 32: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 32/482

1 2

Java 2. Manual de programación

La  herencia es la capacidad para crear nuevas clases (descendientes) que seconstruyen sobre otras existentes, permitiendo que éstas les transmitan sus pro-

 piedades. En programación orientada a objetos, la reutilización de código se

efectúa creando una subclase que constituye una restricción o extensión de laclase base, de la cual hereda sus propiedades.El

polimorjismo

consigue que un mismo mensaje pueda actuar sobre diferen-tes tipos de objetos y

comportarse

de modo distinto. El polimorfismo adquieresu máxima expresión en la derivación o extensión de clases; es decir, cuandose obtienen nuevas clases a partir de una ya existente mediante la propiedad dederivación de clases o herencia.

1.5. ESPECIFICACIONES DEL LENGUAJE JAVA

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

La especificación es una definición técnica del lenguaje que incluye sintaxis,estructura y la interfaz de programación de aplicaciones (API, application

p

gramming i que contiene clases predefinidas. El lenguaje evoluciona rápi-damente y elmejor

lugar para consultar las últimas versiones y actualizaciones delmismo se encuentra en el sitio Web de internet de Sun

Las versiones de Java de Sun se incluyen en JDK (JavaD

Kit), quees un conjunto de

tierramientas

que 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 con JDK

1.4 Beta, que es una mejora sustancial de las versiones anteriores JDK 1.O y JDK 1.1.La nueva versión JDK 1.3 incluye un compilador JIT

(

 para ejecutar el

código Java. El entorno JDK está disponible para Windows9Y98, Windows NT/2000

y Solaris, pero existen muchos entornos de desarrollo para Java:JBuilder

de Borland,Visual Age Windows de

IBM,

Visual J++ de Microsoft, Visual Café de Symantec, etc.

 Nota: Todos los programas de este libro se pueden compilar y ejecutar en losentornos JDK 1.2, JDK 1.3 y JDK 1.4 y deben poder trabajar con cualquierherramienta de desarrollo que soporte las citadas versiones.

Page 33: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 33/482

Page 34: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 34/482

14

Java 2. Manual de programación

siempre es fácil, pero ineludiblemente pasa por conocer las semejanzas y diferen-

cias que tienen ambos tipos de programas. Gran parte del código de las aplicacio -nes y los upplets es el mismo, presentándose las diferencias al considerar los

entornos de ejecución de los programas.

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

Los upplets deben ejecutarse en un navegador Web.de modo similar a cualquier otro lenguaje de alto nivel.

El desarrollo de las aplicaciones Java suele ser algo más rápido de desarrollarque los upplets, debido a que no necesita crear un archivo HTML y cargarlo en unnavegador Web para visualizar los resultados.

Sugerencia: Si su programa no necesita ejecutarse en un navegador Web, elijacrear aplicaciones.

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

Los applets no pueden leer o escribir en el sistema de archivos de la computa-dora, pues en caso contrario podrían producir daños en archivos y  propagarvirus.

Los upplets no pueden establecer conexiones entre la computadora de un usua-rio y otra computadora, excepto que sea el servidor donde están almacenadoslos applets'.Los applets no pueden ejecutar programas de la computadora donde reside elnavegador, dado que podrían originar daños al sistema.

Por el contrario, las aplicaciones pueden interactuar directamente con la compu-tadora sobre la que se ejecutan, sin las limitaciones anteriormente mencionadas.

Esta actividad comienza ya a desarrollarse con las tecnologías Napster creadas por Fanning, un estu-

diante norteamericano a  primeros del año 2000. Otras tecnologías similares con Gnutella, Scour, etc., y se

las conoce de modo genérico como tecnologías P2P p e e r - r o -p e e r ) .

Page 35: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 35/482

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, aunquetambién dedicaremos atención especial a desarrollar applets.

1.7. CREACIÓN DE PROGRAMAS

Antes de que una computadora pueda procesar un programa en un lenguaje de altonivel, el programador debe introducir el programa fuente en la computadora y lacomputadora a su vez debe almacenarlo en un formato ejecutable en memoria. Lasetapas clásicas en un lenguaje tradicional son: edición,compilación,enlace,ejecu -

ción y depuración de un programa.Las herramientas fundamentales empleadas en el proceso de creación de programas

son, por tanto:editor,compilador,depurador

y, naturalmente, elsistemaoperativo.

El editor es un programa utilizado para crear, guardar (salvar o almacenar) ycorregir archivos fuente (escritos en lenguaje Java). El compilador es un programaque traduce un programa escrito en un lenguaje de alto nivel a un lenguaje máqui-na. El depurador es un programa que ayuda a localizar errores en otros programas.El

s operativo es el programa con el que interactúa el usuario con el objetode especificar qué programas de aplicación y/u operaciones del sistema debe ejecu-tar la computadora (los sistemas operativos más utilizados son: 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 fuentecorrespondiente a la aplicación. Cada programa Java debe tener al menos una clase.Un ejemplo de una aplicación Java sencilla que sirva de modelo es el popular((Hol a mundo)) de Stroustrup (el autor de C++), modificado para que visualice unmensaje de bienvenida con el nombre de un pequeño pueblo andaluz.

' Microsoft ha anunciado el lanzamiento de la arquitectura .NET y el sistema operativo Windows XP parael segundo trimestre de 200

I .

Page 36: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 36/482

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

 pub l ic class Bi enveni doI

 pub l ic s t a t i c void mai n ( St r i ng[ ] ar gc)t

Cyc t em out . pr i nt l n( " Hol a

Car chel ej o. Bi enveni do a J ava" ) ;

Las etapas que preparan un programa para su ejecución son:

1. Crear una carpeta de proyecto en la que se recojan todos los archivos signi-

ficativos, incluyendo clases que se desean incluir.2. Utilizar un programa editor que introduzca cada línea del programafuente en memoria y lo guarde en la carpeta proyecto como un archivofuente.

3. Utilizar el programa compilador  para traducir el programa fuente enb

de (código en bytes). Si existen errores de sintaxis (un error gramatical de unalínea en un programa Java), el compilador visualiza esos errores en una ven-tana.

4. Utilizar el programa editor para corregir esos errores, modificando y vol-

viendo a guardar el programa fuente. Cuando el programa fuente estálibre de errores, el compilador guarda su traducción en bytecode como unarchivo.

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

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

Edición

Editar el programa Bi enveni do con un editor " escribiendo el texto correspon-

diente al programa fuente. Debe darle un nombre al archivo fuente que constituyeel 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 se han utilizado en la preparación de este libro son Edit.com y Notepad.exe (se tra-

 bajó  bajo Windows 98).

Page 37: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 37/482

Introducción a Java 17

Error típico:Palabras mal escritas: Java es sensible a las letras mayúsculas y

minúsculas y el siguiente programa daría error:

I

 public c lass Bi enveni doI

publ i cs t at i cvoi dMai 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");

 pues m a i n debe escribirse sólo en minúsculas.

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

Compilación

La orden siguiente compila Bi enveni do. ava:

j avac Bi enveni do. ] ava

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

Bi enveni do. c las s . El archivo no es un archivo objeto tal como se genera enotros compiladores de lenguajes de alto nivel. Este archivo se llama bytecode. Elbytecode es similar a las instrucciones máquina, pero su arquitectura es neutral y se

 puede ejecutar en cualquier plataforma que tenga el entorno en tiempo de ejecucióny el intérprete Java.

 Nota: Una gran ventaja de Java es que e l códigobykcode

 puede ejecutarse endiferentes plataformas hardware y sistemas operativos.

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

Page 38: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 38/482

18

Java 2. Manual de programación

 Archivofuente

Objetosimportados

Compilador

Figura 1.3. El códigofuente de un programase compila en bytecode.

Ejecución

Para ejecutar un programa Java, se debe ejecutar el bytecode del programa en cual-quier plataforma que soporte un interprete Java. La siguiente orden ejecuta el códi -go bytecode del programa aplicación Bi enveni do. j ava:

j ava Bi enveni do

La salida de este programa se muestra en la Figura 1.4.

Figura 1.4. La salida del programaBi enveni do.

1.8. COMPONENTES DE UNA APLICACIÓN

En un programa aplicación, destacan los siguientes elementos: Comentarios, 4

Palabrasreservadas, Sentencias, Bloques,Clases, Métodos, el método ma in.

Comentarios

La primera línea del programa Bi enveni do es un Comentario. LosComentarios sirven para documentar los programas y en ellos se escriben anota-

Page 39: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 39/482

Page 40: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 40/482

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

Un bloque es 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 bloque y se dice que el bloque interior está anidado dentro del exte-

rior o que ambos bloques están anidados:

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 comentado,constituye una plantilla o modelo para fabricar objetos. Un programa consta deuna o más clases y cada una de ellas puede contener declaraciones de datos ymétodos.

Métodos

Un método es una colección de sentencias que realizan una serie de operacionesdeterminadas. 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étodo ma in (I

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

Page 41: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 41/482

Page 42: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 42/482

22

Java 2. Manual de programación

Puede usar una cuarta ventana para abrir un navegador con soporte Java, porejemplo 2 E en versión 4.0 o superior, o el a  para laverificación del correcto funcionamiento de los applets.

1.lo.

UNA APLICACIÓNPRÁCTICA DE JAVA

Inicialmente se expondrá la creación de programas convencionales, y para ver suestructura básica así como las fases a las que antes aludíamos, necesarias para suejecución, seguiremos el siguiente ejemplo: Considere que trabaja con el JDK ins-talado en un PC  bajo Windows 9x y cree la carpeta libro en el directorio raíz de su

disco de arranque. Después, situándose dentro de libro, cree otra denominadaT

Abra una ventana DOS, trasládese a la carpeta T y llame al editor (Edit):

' L .. I d i ~ . d c w s > c 0 C: \ ; i br o\ t emaOl

i : \ l i br o\ Tema31> e d i t

Una vez dentro deE

copie el texto incluido en la Figura 1.5 fijándose atenta-

mente para no omitir en su copia ninguno de los caracteres ni signos de puntuación

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

ipor t  jatJ3. i3 .< ;

' L u i sJoyaner

& g i J i1ar

Jl

1a;s

E j e r n p l c i f

n u t i l i t s t a t i c w i d

main( s t r i n g [ ] ar g]

{

) a programar en JAVA " ) ;

Figura 1.5.

El archivo creado es el archivo fuente, al que en Java también se le llama unidad

de c 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 del archi-

vo debe coincidir con el de la clase que tiene el método m a i n(

) . En el caso delejemplo no sería necesario considerar esta situación, ya que sólo hay una clase. Elarchivo fuente debe escribirse dividido en secciones bien definidas, separadas por

Page 43: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 43/482

Introducción a Java 23

líneas en blanco y precedidas por un comentario identificativo de las misinas. Esimportante guardar dicho archivo con la extensió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 a bytecode

(código byte), que es el lenguaje que entiende el intérprete de Java. Para compilarun programa con el JDK hay que invocar a j a v a c y 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 de sus  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 encuentran los  programas paracompilar, ejecutar depurar y documentar las aplicaciones

(javac,

, ,jdhy,jaw-

doc respectivamente). Esta modificación deben introducirse en el archivo

C:

\au t oexec. a

t, para que los nuevos valores se establezcan cada vez que searranque la computadora.

S E T P ATH=%P ATHL&; C: \ j dk l . 3. 1\ bi n

o bien

SET PATH=OEATHcc ; C: \ ~dk l . 4 \ b i n para trabajar Con la 1.4 Beta)

Así mismo, es conveniente adaptar el contenido de c l a s s p a t h  para que .lava

 pueda localizar siempre lais claseis creadais.

SET CLASSEATH=. ; C: \

El valor asignado a CLASSPATH hace que Java busque las clases en la carpetaactual y el directorio raíz. Suponiendo establecidos los anteriores valores para com- pilar E j em p l o l . j av 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 conextensión c 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 órde-nes o 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 mismo y teniendoen cuenta que, si la clase pertenece a un paquete, el nombre de la misma debe ir pre-cedido por el 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 ava l i br o . TemaOl . Ej empl o1

Page 44: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 44/482

24 Java 2. Manual de programación

dado el valor establecido para la variable CLASSPATH, que hace que el intér - prete de Java busque en el directorio raíz y a partir de ahí en aquellos cuyo nom-

 bre coincida con los elementos del paqueteC

:\ i br o\ TemaO1. Es decir, se pasa como paráinetro a j a v a el nombre de la clase especificando el paquete al que pertenece, sin incluir la extensión y distinguiendo entre mayúsculas y minúscu-

las. La salida obtenida con la ejecución del programa es la impresión en pantallade la línea

C c r n i e n z o

a 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á la claseque está siendo definida. Los paquetes son un mecanismo para organizar lasclases. y cuando se declara que una clase pertenece a un paquete, dicha clasedeberá ser almacenada en un subdirectorio o carpeta cuyo nombre coincida conlo especificado como nombre del paquete. En nuestro caso, como el paquete sedenomina 1  b r o . TemaO

1, la clase Ej emp1o1 deberá ser almacenada en la

carpeta 1 br o\ TemaO

1.

La sentencia i mpor t va seguida por el nombre de un paquete y se utiliza para poder referirse más adelante a clases pertenecientes a dicho paquete sin nece-sidad de cualificarlas con un nombre de jerarquía de paquetes. En el ejemplo,no existe aplicación posterior.La tercera línea es un comentario (comentario de una línea)La palabra reservada cl as s  permite especificar que se va a definir unaclase, una palabra clave o reservada es una palabra especial con un signifi-cado preestablecido en el lenguaje Java. Para delimitar la clase, se empleanllaves, {

} .

Para ejecutar el programa, el intérprete de Java comienza llamando al méto-

do mai n ( )

; como este método se llama antes de la creación de un objeto,ha de declararse como st 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 códigofuera de su clase también tiene que ser declarado como publ i c, que es laforma de permitir que un miembro de una clase pueda ser utilizado por códi-go que está fuera de la misma. La palabra reservada voi d indica que mai 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ámetrosen la línea de comandos, aunque no se use es necesario incluir este paráme-tro cuando se define el método mai n (

) . Se emplean llaves, { } , para delimi-t a r

c I

nietodo.

*

I . >I \

;I.

la  pantalla de la coinputadora es un objeto predefinido cuya referen-

1 . t.

La clase Syst em pertenece al paquete  j ava. l ang que%, : ,

.

Page 45: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 45/482

se importa automáticamente y, por tanto, no necesita cualificación. El método 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 los identi-

ficadores si se cambian mayúsculas por minúsculas o viceversa, es decir, s y s t e my S y s t e m son identificadores diferentes.

. Cir,5*’

I .I I . ESTRUCTURA DE UN PROGRAMAA P L I C A C I ~ N

EN JAVA

Para crear programas en Java hay que tener en cuenta que toda implementación

que se realice se efectuará encapsulada en una clase. Un programa aplicación fuen-te en Java se podría considerar formado por las siguientes partes:

Una sentencia de paquete (package) que también puede ser omitida.Una, ninguna o varias sentencias de importación ( i m p o r t ) .

Una serie de comentarios opcionales colocados en diversos lugares del pro-

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 sentencia c 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 clase, alas variables de instancia se las denomina así porque cada objeto contendrá unacopia propia de dichas variables, de forma que los datos de un objeto se encontra -rán separados de los de otro objeto, utilizándose los métodos para la modificaciónde los valores de las variables de instancia. En consecuencia, un programa muy sen-cillo que se puede crear en Java es:

 public class Eernplo2

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

Page 46: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 46/482

Page 47: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 47/482

Page 48: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 48/482

28

Java 2. Manual de programación

también errores de compilación. Los errores de compilación provienen de er ro-

res en la construcción del código tales como escribir mal una palabra reserva -da, omitir algún signo de puntuación o  bien utilizar, por ejemplo, una llave de

apertura sin su correspondiente llave de cierre. Estos errores suelen ser fácilesde detectar ya que el compilador suele indicar dónde se producen las posiblescausas.

Ejemplo

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

/ / e s te prograrra 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 produce un error detectado por el compilador delentorno JDK.

Figura 1.6. El compiladordel JDK detecta un error de sintaxis.

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

Page 49: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 49/482

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 I 2.2. Errores de ejecución

Los errores de ejecución son errores que producen una terminación anormal y quese detectan y visualizan durante la ejecución del programa. Un error de ejecuciónse produce cuando el usuario instruye a la computadora para que ejecute una ope -

ración no válida, tal como dividir un número por cero o manipular datos indefini-dos o no válidos en la entrada.

Un error d

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

Ejemplo

 public classErro rDeE~ecuc ion

i

 private static int z ;

static voidp r u e b a 0

,

i

1

 public static voidr n a i n ( C t r i n g [ ]

args)

i

z =l O/ z ;

 prueba ( ) ;

Figura 1.7. Errorde ejecución.

Page 50: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 50/482

30

Java 2. Manual  de programación

AI invocar al método pr ueba( ),se produce un error en tiempo de ejecución:

j av a. 1ang. Ar i t hmet i c Ex cept i on:

/ by zero

que indica un intento de dividir por cero (valor dez),

operación no válida.

r I

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

1.12.3. Errores lógicos

Los errores lógicos ocurren cuando un  programa realiza un algoritmo incorrectoy no ejecuta la operación que estaba prevista. Existen muchos tipos de razones

 para que se produzcan errores lógicos. Normalmente los errores lógicos son difí-ciles de detectar, ya que no producen errores en tiempo de ejecución y no

visua-

lizan mensajes de error. El único síntoma de que se ha producido un error lógico puede ser la salida incorrecta del programa. Se pueden detectar er rores lógicoscomprobando el programa en su totalidad y comparando su salida con los resul-tados calculados. La prevención de errores lógicos se puede realizar verificandoel algoritmo y el programa correspondiente antes de comenzar el proceso de eje-

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 es sin-

tácticamente correcta.

Page 51: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 51/482

CAP I TU

Característicasdellenguaje Java

CONTENIDO2.1. Palabrasreservadas.

2.2. Identificadores.

2.3. Tiposde datos.

2.4. Tipossimples(primitivos).

2.5. Variables.2.6. Constantes.

2.7. La bibliotecade clasesde Java.

2.8. Conceptos básicossobreexcepciones.

2.9. La claseNumber y sus subcl ases.2.10.

Las Clases

Char act er y Bool ean.2.1 Entraday salida básicas.

2.12. Operadores.2.13. La sentenciade asignación.

2.1 4. Expresiones.

2.15.Class

Mat h.2.16. Paquete

ava. mat h.

2.1 7. Conversionesde tipos.Operadores molde.

2.18. Operadoresaritméticos.

2.1 9. Operadoresrelacionales.

2.20. Operadoreslógicos.

2.21. Operadoresde manipulaciónde bits.

2.22. Operadoresde asignaciónadicionales.

2.23. Operadorcondicional.

2.24. Prioridadde losoperadores

31

Page 52: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 52/482

Page 53: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 53/482

Page 54: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 54/482

Page 55: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 55/482

Page 56: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 56/482

36

Java 2. Manual de programación

Ejemplo

Ejemplos de cadenas

"Cr,a

caaena"

"Cier ra Ue 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"

, ,

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

, ,,

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

En Java, para representar una cadena de caracteres se utiliza una estructura dedatos denominada S t r i n g . El concepto de string se explica con detenimiento enel Capítulo 8, ((Cadenas y fechas)).

Regla: Una cadena se debe encerrar entre dobles comillas. Un tipo carácter es

un Único carácter encerrado entre simples comillas.

Los caracteres Java utilizan Unicode, que es un esquema universal para codifíca-

ción de caracteres en 16 bits establecido por el consorcio Unicode para soportar elintercambio, proceso y  presentación de los textos escritos en los diferentes idiomasdel mundo (véase el sitio Web de Unicode en www .Uni code. or g ) . Unicode tomados bytes, expresados en cuatro números hexadecimales que corren de ' uO OO O ' a' \ uFFFF' . La mayoría de las computadoras utilizan el código ASCII (Unicodeincluye los códigosASCI1 de ' \ uOOOO' a ' \ uOOFF' ) . En Java se utiliza el códi-go ASCII, así como Unicode y las secuencias de escape como caracteres especiales.

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

Secuencia Significado

\ b

\ t

\ n

\ f

\ r

\\ '

\ \\ uxxxx

RetrocesoT a b u l a c i h

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

Dobles comillasComillas simplesBarra inclinada inversaCarácter Unicode

Page 57: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 57/482

Page 58: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 58/482

Java 2. Manual  de programación

Lógico (boolean)

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

 posibles valores: t r u e , f a l s e (verdadero falso).

Tabla 2.7. Tipo primitivopara representardatos lógicos

Nombre Rangode valores Declaracióne 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, tenien-do en cuenta que ésta puede estar formada por una Única constante o variable de tipológico. Su contenido puede ser directamente mostrado por pantalla mediante elmétodo p r i n t l n

( )

.

Ejemplo

package l i br o. Tema02;

c l as sEj empl o2t

publ i cs t at i cvoi dmai n ( St r i ng[ ] arg){ byt edi a;

bool eancor 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 la eje-

cución de un programa. Las variables se utilizan para representar tipos de datos muydiferentes. En Java hay que distinguir entre variables por valor y objetos o variables por referencia; las variables de tipo simple son variables por valor.

Declaracióndevariables. Para utilizar una variable se necesitad

eindicar al compilador el nombres de la variable, así como el tipo de dato que repre-

Page 59: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 59/482

Características del lenguaje Java 39

senta. Esta operación se denomina declaración de variables. Toda variable debe serdeclarada antes de poder ser utilizada. Para declarar variables de tipo simple seespecifica su nombre y su tipo, que define tanto los datos que la variable va a poderalmacenar como las operaciones que tendrá permitidas. La sintaxis es, por tanto:

t i pol l ato nombr evar i abl e;

Ejemplo

Declaración

int z ; / / decl ar a z como una var i abl e ent er adouble base; / / decl ara base como var i abl e doubl e

char b; / / decl ar a b como var i abl e char

Not a:Las variables permiten almacenar datos, de entrada, salida o datos inter -medios.

Consejo: Los identificadores se utilizan para nombrar variables, constantes,métodos, clases y paquetes. Los identificadores descriptivos son los más utili-

zados, ya que hacen los programas más fáciles de leer. Java es sensible a lasmayúsculas, por consiguiente Z

y 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 laasignació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 operadores yoperandos, pero una única constante o variable también constituye una expresión.

Ejemplo

2 = 5; / / as i gna 5 a z

l ongi t ud = 1.0 / / as i gna 7. 0 a l ongi t udb

=

\ B f ; / / as i gna ' B a b

Regl a:El nombre de la variable debe estar a la izquierda 5 = z; es ilegal.

Page 60: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 60/482

40

Java 2. Manualde

programación

Como ya se indicó anteriormente, una expresión representa un cálculo queimplica valores, variables y 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 ei

de variables enu

solo puso. Se puede declarar einicializar una variable en un solo paso en lugar de en dos pasos como se ha mos-trado en las operaciones.

Ejemplo

Declaración con asignación del valor inicial Declaración yasignación de u valor

char r espuest a = ‘ S ‘

i n t cont ador = 1;

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

char r espuest a;r espues t a=’

C ’

 ;

i n t cont ador ;cont ador =l ;

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

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

Consejo: Siempre que sea posible, es conveniente declarar una variable yasignarle su valor inicial en un solo paso, ya que esta acción facilita la inter - pretación del programa.

Page 61: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 61/482

Page 62: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 62/482

42 Java 2. Manual  de programación

nunca cambian y se declaran como las variables, pero inicializándose en el momentode la declaración y comenzando dicha declaración con la palabra reservada f i n a l ,que sirve para que el valor asignado no pueda ser modificado. Las constantes de clase

se declaran en el cuerpo de la clase y fuera de todos los métodos, siendo necesariocomenzar su declaración con las palabras reservadas f i na1yc t at i c. La palabra

clave f i n a l es obligatoria en la declaración de constantes, mientras que st at i cconsigue que sólo exista una copia de la constante para todos los objetos que se decla-

ren de esa clase. La sintaxis para declarar una constante de clase es:

s t a t i c f i na 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 as sPr uebai

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

/ / . . .I

/ / .1

Pr ecauci ón:El nombre de las constantes se suele escribir en mayúsculas.Antes de utilizar una constante debe ser declarada. Una vez que se ha declara-

do una constante no se puede modificar su valor.

Las constantes literales son valores de un determinado tipo escritos directamen-

te en un programa. Dichas constantes podrán ser enteras, reales, lógicas, carácter,cadena de caracteres, o el valor nul l .

Constantes enteras

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

No utilizar comas ni signos de puntuación en números enteros.1 2 3 4 5 6 en lugar de

1 2 3 . 4 5 6 .

Page 63: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 63/482

Características del lenguaje Java 43

Puede añadirse una L o 1a del 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 de Ox o bienOX

delante del número.La notación octal se 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 repre-

senta aproximaciones en lugar de valores exactos. Las constantes reales tienen eltipo doubl e por defecto, aunque también pueden ir seguidas por una d o D queespecifique su pertenencia a dicho tipo. Cuando se les añade una f o F se obli-ga a que sean de tipo f 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 letra e o E seguida por un expo-nente.

82. 341 equivale a82. 347d 2 . 5e4

equivale a 2 5O OOd4E- 3F equivalea O. 004f5. 435E- 3

equivalea O.005435d

Constantes íógicas

Las constantes literales de tipo lógico disponibles en Java son t rue y f al se, quesignifican ver dader o y f al s o respectivamente.

Constantes de tipo carácter

Una constante de tipo carácter es un carácter válido encerrado entre comillas sim- ples. Los caracteres que pueden considerarse válidos son:

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

Los dígitos.Los caracteres $,

-

y todos los caracteres Unicode  por encima del OOCO .

Existen, además, ciertas secuencias especiales, denominadas secuencias de esca-

 pe, que se usan para representar constantes de tipo carácter.

Page 64: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 64/482

Page 65: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 65/482

Page 66: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 66/482

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 on

t 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 ntn

(

"E r ro r t e j ;

2.9. LA CLASE Number Y SUS SUBCLASES

Java utiliza los tipos simples byt e, i nt , l ong, f l oat y doubl e, que no estánorientados a objetos, por razones de rendimiento. Si lo que se necesita es un objetode alguno de estos tipos, será necesario recurrir a las clases Byt e, I nt eger ,Long, Fl oat y Doubl e, que son subclases de Number . Number  pertenece al

 paquete  j ava .l ang y  proporciona métodos que devuelven el valor del objetocomo el correspondiente tipo simple. Métodos de Number con dicha finalidad son:

 publ ic publ ic

 publ ic

 publ ic

 publ ic

 bytebyt eva l ue

( )

abst rac t double doubl eval ue( )

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

( )

a b st r ac t i n t i nt Val ue( j

abs t r ac t long l o ngv al ue (

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

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

 public

 public

 public

 public

 publ ic

 publ ic publ ic

 publ ic

 publ ic

 publ ic

 publ ic

Byt e (byte pl)

Byz e( j ava. l ang. Ct r i ng pl)

I nt eger ( i n t p 1 )

I r , t eger j ava. l ang. St r i ng

pl

Long (long p l )

L or L g( j ava. l ang. St r i ng

pl)

Fl oat (double pl)

Fl oat ( f l o a t pl)

Fl oat( j ava. l ang .St r i ng

pl

Doubl e (double p l )

Doubl e ( j ava. l ang. St r i ng

pl)

Page 67: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 67/482

Page 68: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 68/482

48 Java 2. Manual de programación

class Long

publ i c s t at i c j ava. l ang. St r i ng t oSt r i ng( 1ong p )

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

publ i c st at i cj ava. l ang. St r i ng t oHexSt r i ng( 1ong

p)

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

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

2.10. LAS CLASES Character Y Boolean

La clase Char act er se utiliza para crear objetos a partir de un parametro char .El constructor es:

publ i c Charac t e r (char p)

y  posee el método  public char char val ue ( ) que devuelve el valor charCorrespondiente.

Otros métodos interesantes de esta clase son:

publ i c stat 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 mayúsculasen el caso del primer método y a minúsculas en el caso del segundo.

La clase Bool ean permite crear objetos a partir de un dato de tipo bool ean.Sus constructores son:

publ i cBocl ean ( bool ean p )

publ i c Bool ean( j ava. l ang. St r i ng

p)

y para obtener el correspondiente valor bool ean se usa

publ i c bool ean bo ol eanv al ue0

Ejemplo

bool ean rnayor = 3 + 1 > 5;Sool ean

ob = new Bool ean( mayor )

;

bool ean b = ob, ool eai Val ue

( ) ;

Page 69: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 69/482

Características del lenguaje Java 49

2.11. ENTRADA Y SALIDA BÁSICAS

En Java la entrada y salida de información se realiza mediante flujos; es decir,

secuencias de datos que provienen de una fuente. Estos flujos son objetos queactúan de intermediarios entre el programa y el origen o destino de la información,de forma que éste lee o escribe en el flujo y  puede hacer abstracción sobre la natu-raleza de la fuente. Como las clases relacionadas con flujos pertenecen a un paque-te denominado  j ava .i o , los programas que utilizan flujos necesitan la inclusiónen los mismos de la instrucción

import j ava. i o. * ;

En Java existen unos flujos estándar, manipulados por la clase Syst emdel paquete j ava .l ang, que permiten realizar operaciones de entradaisalida:

' s ys t em in . representa la entrada estándar y es del tipo j ava. i o. npLt Szr eam

* Sys t em out , del tipo j ava. i o. Pr i nt St r eam referenciaia pantalla

* s ys t em er r , de tipo j ava. 10. Pr i nt st r eam, referencia la salida de errores

 publ ic s t a t i c f i n a l j ava. i o. I nput Ct r eam ;I:

 publ ic s t a t i c f i n a l l ava. i o. Pr i nt s t r eam out

 publ ic s t a t i c f i n a l j ava. i o. Pr i nt St r eam er r

La salida básica por pantalla se lleva a cabo mediante los métodos pr i nt ypr i nt l n,  pertenecientes a la clase Pr i nt st r eam. A estos métodos se les puedellamar mediante Syst em. out , que hace referencia a la salida estándar. El mecanis-mo básico para salida con formato utiliza el tipo St r i ng. En la salida, el signo + com-

 bina dos valores de tipo St r i ng y si el segundo argumento no es un valor de tipoSt r i ng, pero es un tipo primitivo, se crea un valor temporal para él de tipo St r i ng.Estas conversiones al tipo St r i ng se pueden definir también para objetos.

Ejemplo

/ *Ej empl o 1" sobr e oper aci ones bási cas 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 esul t ados

* /

import j ava. i o. * ;

 pub l ic c l a s s Er.t r adaCa1 aa 1

t

 pub l ic s t a t i c void mai n ( St r i ng[ ] args)

i n t 1;

char c;

Page 70: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 70/482

Page 71: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 71/482

Características de/ lenguaje Java 51

clases pertenecientes al paquete j 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 adasa l i da2

i

 public static voidmai 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 eadL i 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( ) ;

Cys t 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 real y p¿i l seXFTLJS>J") ;

Sys t em out . pr i nt l n

( " ( ut i l i ce el punt o cor no separ ador " +

c adena=br . r eadl i ne( ) ;

Doubl ed=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 on e)

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

1

AI realizar este tipo de operaciones de entrada/salida hay que tener en cuenta la posible generación de excepciones; por ejemplo, aquellas que son lanzadas porr eadL i ne ante un error de lectura, y estas excepciones deben ser recogidas o

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

Page 72: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 72/482

52

Java 2. Manual de programación

2.12. OPERADORES

Los operadores de un lenguaje se pueden utilizar para combinar o modificar los

valores de un  programa. Java posee un gran conjunto de operadores. La lista com- pleta de los operadores Java se muestra en la Tabla 2.9.

Tabla 2.9. Lista completade operadoresJava

> < !- _

_ <= >=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 ser b o unarios (unita -

rios). Los operadores binarios son aquellos que requieren dos operandos (Tabla2.1 1 ) . Los operadores unarios son aquellos que requieren un único operando(Tabla 2.10). En ambas tablas se proporciona un ejemplo de la utilización de cadaoperador.

La Tabla 2.12 muestra un tipo especial de operadores de asignación que se basanen los otros operadores. Estos operadores actúan sobre un operando y almacenan elvalor resultante de nuevo en el mismo operando.

Ejemplo

z

+= 5; equivale a z = z + 5 ;

Tabla 2.1O. Operadoresunitariossobre 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

Page 73: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 73/482

Características del lenguaje Java 53

Tabla 2.11. Operadoresbinariossobre enteros~

Operador Operación Ejemplo

- Asignación_ __

IgualdadI =

Desigualdad< Menor que

a = b

a ! =  b

a < b

a == b

<= Menor o igual que a<=

 b

>= Mayor o igual que a >=  b

> Mayor que a > b

+ Suma a + b

- Diferencia a -  b

Producto a * b

/ División a / b

, Móduloa % b

<< Desplazamiento a izquierdas a <<

 b

>> Desplazamiento a derechas a >>  b

>>> Desplazamiento a derechas con rellenado de ceros a >>>  b

& AND bit a bit a & b

I OR bit a bita l b

XOR  bit a bita ^ b

*

Tabla 2.12. Operadoresde asignaciónenteros

t=

/=-

-

>>=

-

-

& =

9-

>>>=

0 -

* =

I =

<<=

2.12.2. Operadores sobre valores de coma flotante

Los operadores sobre valores de coma flotante son un subconjunto de los disponi- bles para tipos enteros. La Tabla 2.13 muestra los operadores que pueden operarsobre operandos de tipo f l o a t y d o u b l e .

Page 74: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 74/482

54

Java 2. Manual  de programación

Tabla 2.13. Operadores sobre valores de coma flotante

Operador OperJ\ción Ejemplo

_

_ __

I =

<<=>=>+

/,

++_ _

AsignaciónIgualdadDesigualdadMenor queMenor o igual queMayor o igual queMayor queSumaResta

MultiplicaciónDivisiónMódulo

 Negación unitarialncrernento

Decremento

a = b

 b

a ! =  b

a < b

a <= ba >=  b

a > b

a + ba - b

a * ba / b

- a++a o bien a++

--ao bien a - -

a

==

a % b

2.13. LA SENTENCIA DE ASIGNACIÓN

La sentencia de asignación se usa para dar valor a una variable o a un objeto en elinterior de un  programa, aunque hay que tener en cuenta que las variables de tipoobjeto se comportan de forma diferente a como lo hacen las de tipo simple cuandose realiza una asignación. El operador de asignación es el signo de igualdad y eneste tipo de sentencias la variable se colocará siempre a la izquierda y la expresióna la derecha del operador.

Los objetos de una determinada clase se crean utilizando el operador new quedevuelve una referencia al objeto, la cual se almacenará en una variable del tipoobjeto mediante una sentencia de asignación. Las sentencias de asignación tam-

 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 asignauna variable de tipo objeto a otra (a diferencia de lo que ocurre con las variablesde tipo simple) no se efectúa una copia del objeto, sino que sólo se hace unacopia de la referencia, es decir, de la dirección de memoria donde se encuentrael objeto.

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

d2 = d;

Page 75: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 75/482

Características del lenguaje Java 55

En cuanto a las variables de tipo simple, tras efectuar su declaración, podrá usar -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 asignacionesmúltiples. Así,

adjudica a las tres variables el valor 5.

2.14. EXPRESIONES

En general, las expresiones se definen como un conjunto de operadores y operan-

dos, pero hay que tener en cuenta que dicho conjunto puede estar formado exclusi-vamente por un operando. Es decir, que las expresiones pueden ser una constante,

una variable o una combinación de constantes, variables y/o funciones con opera-dores, tanto binarios como unitarios.

Como ya se comentó, en Java las variables declaradas s t at i c y f i na1 sonen realidad constantes y los métodos cuyo tipo de resultado no es voi d y quese declaran como publ i c y s t at i c  pueden ser considerados funciones glo-

 bales.

2.15. CLASE Math

La clase j 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 fundamental j ava .l ang. Los métodos está-ticos de la clase Mat h realizan cálculos matemáticos  básicos tales como máximo,mínimo, valor absoluto y operaciones numéricas que incluyen funciones exponen-

ciales, logarítmicas, raíz cuadrada y trigonométricas. Los cálculos en coma flotan-

te se realizan utilizando doubl e y algoritmos estándar.

Page 76: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 76/482

56 Java 2. Manual de programación

Métodos sobre tipos numéricos

Invocación Significado Estructura de la cabecerade la declaración del miembro

Mat h. abs ( exp)

valor absoluto  public s t a t i c double abs (doublepl)

de e.rp  public s t a t i c f l o a t abs ( f l o a t pi)

 public s t a t i c i n t abs ( i n t

pl)

 public s t a t i c long abs (long pl)

Mat h. max( expl , expZ)

mayorentre  public static double max (doublep l , doublep2)

e x p l y e x p 2  public s ta t ic float max (float pi, float p2)

 public 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 p2)

Mat h. m n( expl , expZ)

menorentre  public static double rnin (double pi, double p2)

e x p l . v e x p 2

 public s ta t ic float mi n ( f loat pi , f loat p2)

 public s t a t i c i n t mi n ( i n t pi, i n t p2 )

 public s t a t i c long rnin (long pl, long p2)

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

Métodos de coma flotante~ ~

Invocación Significado Estructura de la cabeceradela declaración del miembro

Mat h. pow( a, b) ah p a l i c s t a t i c & a e p <

Mat h. exp( a)

ea  public s ta t ic double exp (double pi)

Mat h. cei 1 ( a )r.1  public s ta t ic double cei l (double pi)

Mat h. f l oor ( a) L  public sta t ic double floor (-le pi )Mat h. l og( a)

'n

(  public s ta t ic double l ong (double pl)

Mat h. sqr t ( x)

6

 public static double sqrt (double pi )Math. r ound ( n ) redondeo al entero  public s t a t i c long r ound (double pi)

( l ongo int)  public 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'  publ ic s t a t i c synchronized double random( )

Constantes de coma flotante

Invocación Significado

Mat h . E  base del logaritmo natural  public s t a t i c f i n a l double E

Mat h. PI

p  public s t a t i c f i n a l double P I

Estructura de la cabecera de la declaración del miembro

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

j

Page 77: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 77/482

Características del lenguaje Java 57

Funciones trigonométricas

Invocación Significado Estructura dela cabecerade la declaracióndel miembro~

Math. s i n(19) sen (  public static doubles 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. as i n( x)

-u <arcsen x)<u

 public static double asi n (doublepi)

Mat h. acos( x)

O <

u r c m ( x ) < 8

 public static doubleacoc

(doublepi)

Mat h. at an ( x )

- y hr c f g( x ) <D

 public static double atan (double pi)2

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

2 -

2

 public static double atan2 (doublel,

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. PAQUETE java.math

El paquetej ava. mat h tiene las clases

Bi gDeci mal y Bi gI nt eger y sopor -ta operaciones de coma flotante y enteros de precisión ampliada.

2.17. CONVERSIONES DE TIPOS. OPERADORES MOLDE

Con frecuencia se necesita convertir un dato de un tipo a otro sin cambiar el valorque representa. Las conversiones de tipo pueden ser automáticas o 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áticasde tipo. Las conversiones automáticas que podrá efectuar son:

Page 78: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 78/482

58

Java 2. Manual de programación

char

in

long float double

byte short

Figura 2.1. Conversionesautomáticas.

En la operación de asignación convierte el valor a la derecha del signo igual altipo de la variable, siempre que los tipos sean compatibles y esta operación no oca-

sione una pérdida de información, es decir, cuando se trate de conversiones como

las mostradas en la Figura 2.1.Conversiones explícitas

Este tipo de conversiones utiliza los denominados operadores de conversión, moldeo cast, y  puede ser necesario cuando se precisa un estrechamiento de tipo, conver -sión en el sentido tipo más alto a tipo más bajo, o en casos como el siguiente paragenerar 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

Salida:

@. O 5 10

Sal da:

0. 5 5 10

El operador molde tiene la misma prioridad que los operadores unarios.Mediante los operadores molde cualquier valor de un tipo entero o real puede serconvertido a o desde cualquier tipo numérico, pero no se pueden efectuar conver -siones entre los tipos enteros o reales y el tipo

bool ean.

2.18. OPERADORES ARITMÉTICOS

Los operadores aritméticos permiten realizar operaciones aritméticas básicas,actúan sobre operandos numéricos y devuelven un resultado de tipo numérico. Los

Page 79: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 79/482

Características de/ lenguaje Java 59

operadores aritméticos en Java pueden también actuar sobre operandos de tipochar, ya que Java considera este tipo prácticamente como un subconjunto de losi n t . Los operadores aritméticos de Java se muestran en la Tabla 2.14.

Tabla 2.14. Operadoresaritméticos- -~

Operador Significado Operador Significado

+ Operador unario +/

o SumaDivisión entera si los operandos son detipo entero

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

*

Mu1

ip1icación %

Módúlo, es decir, resto de la divisiónentera.  No es necesario que los

operandos sean enteros

Ejercicio

Convertir un número de metros leídos desde teclado en un complejo de pies y pulgadas

sabiendoque 1 metro = 39.27 pulgadas y 1 pie = 12 pulgadas.

 packagel 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 eadL i 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

Page 80: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 80/482

Page 81: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 81/482

Características de/ lenguaje Java 61

2.19. OPERADORES RELACIONALES

Los operadores relacionales o de comparación permiten comparar valores paradeterminar su igualdad u ordenación y el resultado de las expresiones en las queintervienen es de tipo lógico. En cuanto a los operandos hay que tener en cuenta quesólo los tipos numéricos se pueden comparar utilizando operadores de ordenación,mientras que los de igualdad y desigualdad pueden actuar sobre cualquier tipo dedato. La Tabla 2.15 lista los operadores relacionales.

Tabla 2.15. Operadores relacionales

Operador Nombre Ejempio Respuesta

_ __ Igual (operador formado por dos signos = consecutivos) 1 == 2 f a l s e

I =

Distinto 1 ! = 2 t r u e

> Mayor que 1>

2 f a l s e

< Menor que 1 < 2 t r u e

>= Mayor o igual 1 >= 2 f a l s e

<= Menor o igual 1 <= 2 t r u e

2.20. OPERADORES LÓGICOS

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

Tabla 2.16. Operadores lógicos

Operador Signi ficado Operador Signi ficado

& AND lógico 1 1 OR en cortocircuito

I OR lógico XOR

& & AND en cortocircuito I  NOT unario lógico

Las reglas de funcionamiento son las siguientes:

El operador & da como resultado t r ue si al evaluar cada uno de los operandosel resultado es t r u e . Si alguno de ellos es fa l se , el resultado es fa l se .

& & es análogo a &,  pero si el primer operando es f a l s e , el segundo no es eva-

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

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

Page 82: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 82/482

Page 83: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 83/482

Page 84: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 84/482

Page 85: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 85/482

Características de l lenguaje Java 65

Sys t em out . pr i nt 111

b)

;

. . . by te  b = - 2 ; b = (by te ) ( b

>>> 1 ) ;

Sys t em out . pr i nt l n( c )

;

I . . . b i t e  b = - 2 ;i n t c =  b

>>>

1;

i n t c = - 2 ;c = c >>> 1;

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

S a 1ida  2 147483647

2.22. OPERADORES DEA S I G N A C I ~ N

 ADICIONALES

Además del operador de asignación ya comentado, Java proporciona operadores deasignación adicionales (Tabla 2.23). Estos operadores actúan sobre variables detipos simples como una notación abreviada para expresiones utilizadas con fre -cuencia. Por ejemplo, el operador ++  permite la sustitución de la expresión a=a+l

 por a + t . Los operadores + + y -- necesitan una explicación adicional. Dichos

operadores se denominan de  autoincremento y  autodecremento respectivamente yadmiten su aplicación en dos formas, preJja y p o s G j a , que adquieren importanciacuando los mismos se usan dentro de una expresión mayor.

Prefija ++aPostfíja a++

Ejemplo

. . .i n t a, b , c;

a = b = 5 ;

c = a++ + + + b ;

/ * c es el r esul t ado de l a suma del val or or i gi nal de a

Sys t em out . pr i nt l n

( c+"

" +a+" " +b) ;

con el nuevo val or de b * /

. . .

La salida es

11 6 6

Los operadores &=, = y A = , cuando actúan sobre valores lógicos, son ope-

radores lógicos; si los operandos son enteros, son operadores de manipulación de bits.

Page 86: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 86/482

66 Java 2.Manual de programación

Ejemplo

packagel i br o. Tema02;

publ i c cl ass Oper ador es

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

bool ean a=t r ue;

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

& true = +a) ;

a&=f l s e ;

Sys t e m out . pr i nt l n

a&=f al se;

Sys t e m out . pr i nt l n

a &=t r ue;

Sys t e m out . pr i nt l n

Tabla 2.23.

" true & f al se = " +a) ;

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

" f al se & true =" +a) ;

Oper ador esde asi gnaci ón

Operador Nombre Ej empl o

-

- Asignación simple i nt a = 5;/ / a t oma el val or 5

++ Incremento y asignación a + +/ / a val e 6

- - Decremento y asignación a- - ; / /

qui va; e a a=a- 1

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

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

/ / a torna el val or de 10* = Módulo y asignación a " - -

-6; / / a = a%6

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

/ / a val e 12

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

/ / a = a<<2

izquierda y asignacion / / a val e - 4 4

>>= Desplazamiento a la a>>=6; / / a = a>>6

derecha y asignación / / a val e -1

>>>= Desplazamiento a la derecha a>>>=24; / / a =

a>>>24

y asignación rellenando con ceros / / a val e 255

- _

Resta y asignación a- =23; / / a = a- 23

&=

I =

a=3;

Asignación AND o a&=6; / / equi val en a a=3&6

AND sobre bits y asignación / / a val e 2

a=3;

Asignación OR o a =6; / / equi val en a a=3l 6

OR sobre bits y asiganción / / a val e I

a=3;

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

XOR sobre bits y asiganción / / a val e 5

Page 87: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 87/482

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 cuyovalor depende de si la condición ha sido o no aprobada. El formato del operadorcondicional es:

c o n d i c i o n ? operandol :operando2;

y conlleva la ejecución de las siguientes operaciones: se evalúa la condición; sila condición es t r u e , el resultado es o p e r a n d o l , y si es f a l s e , es operando2.

Por ejemplo:

double comi si ón = ( v e n t a s >

150000) ? 0. 10 : 0. 05;

si las ventas son superiores a 15O

O

OO , se adjudica el valor O .1O a comisión; encaso contrario, se le adjudica O . 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 operaciones

encerradas entre paréntesis siempre se evalúan primero. Cuando hay varios parén-tesis anidados se calcula primero el resultado de las operaciones encerradas en losmás internos.

La prioridad, de mayor a menor, de los distintos operadores en Java aparecereflejada en la Tabla 2.24, los operadores situados en la misma línea tienen igual

 prioridad. En Java todos los operadores binarios, excepto los de asignación, se eva-

lúan de izquierda a derecha (asociatividad).

Consejo:Se pueden utilizar paréntesis para forzar un orden de evaluación, asícomo facilitar la lectura de un  programa.

Page 88: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 88/482

68

Java 2. Manual de programación

Ejemplo

;Cuál

es el valor de la siguiente expresión, teniendo en cuenta que i valel ?

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

Recul a d 0

f al se

Ejercicio

Determinar si un ario leído desde teclado es o no bisiesto, teniendo en cuenta queun año es bisiesto cuando es múltiplo de

4

y no lo es de 1 0 0 o si es múltiplo de4 0 0 .

i mpor t j ava. i o. * ;

publ i c c l 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 ( Sys ter n. i n) ;

Buf f er edReader br = new Buf f er edReader í - . . ) ;

St r i ng cadena;try

i

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

" ) ;

cadena = br . 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) ;

I

cat ch( Except i on e)i

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

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

Page 89: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 89/482

Page 90: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 90/482

CONTENIDO3.1. La sentencia i f .3 .2 . La sent enci ai f - el se.3. 3.3. 4. La sent enci aswi t ch.3. 5. La sent enci af o r .3. 6. La sent enci abr eak.3. 7. La sent enci acont i nue.3. 8.3. 9. La sent enci awhi l e.

Las sent enci asi f e i f - el se ani dadas

Di f er enci asentrecont i nue y br eak.

3. 10. La Sent enc i ado- whi l e.

71

Page 91: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 91/482

72

Java 2. Manual de programación

En todos los lenguajes de programación existen construccionesque permiten tomar decisiones basadas en una condición. Paraefectuar esta tarea Java dispone de las sentencias i 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ón.Las sentencias disponibles en Java para la creación de bucles sonf o r ,whi l e y do- whi l e. Est e capí t ul o pr et ende i nt r oducimanej ode ambos t i posde sent enci as.

Lassentencias selectivascontrolan el flujo de ejecución en losprogramas basándose en el valor de una expresión sólo conocidaen tiempo de ejecución. En Java existen sólo dos tipos de senten -cias selectivas, i f y s wi t c h, en l as quel apr i mer a se puedecon-

si der ar a suvez di vi di da en dos cl ases,i f e i f - e l s e .

Las sentencias repetitivas permiten repetir una acción o grupode acciones mientras o hasta que se cumple una determinadacondición. Java dispone de tres sentencias de este tipo: f o r ,whi l ey do - whi l e .

3.1. LA SENTENCIA if

La sentencia i f  permite en un programa tomar la decisión sobre la ejecuciódno ejecu-ción de una acción o de un grupo de acciones, mediante la evaluación de una expresiónlógica o booleana. La acción o grupo de acciones se ejecutan cuando la condición es cier -ta y en caso contrario no se ejecutan y se saltan. Los formatos para una sentencia if son:

i f ( condi ci ón)sent enci a;

if ( condi ci ón)i

/ / 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 o

no cobr a comi si ón * /

por cent aj e = 0. 12;i f (ventas >= 300000)

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

Page 92: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 92/482

Decisiones y bucles 73

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

if (condición) ;

// si se cumpl e l a condi ci ón no se ej ecut a ni nguna acci ónsen ten cia;

3.2. LA SENTENCIA if else

Esta clase de sentencia i f ofrece dos alternativas a seguir, basadas en laconipro-

 bación de la condición. La palabra reservada e l s e separa las sentencias utili/adas

 para ejecutar cada alternativa. La sintaxis de la sentencia i f - el se es:

i f (condicion)

el sesen tencia

sen te n c i a2;

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

Si la evaluación de la condición es verdadera, se ejecuta la s o lasecuencia  de sentenciasl, mientras que si la evaluación es falsa se ejecuta la

sew-

t o la secuencia des Es decir, que las sentencias a

realbar tantocuando se cumple como cuando no se cumple la condición podrán ser simples ocompuestas. Posibles errores de sintaxis serían:

i f(

condici

on)

sent e n c i a1

;

else

sen tencia2;

Nota: Es necesario recordar que Java proporciona un operador, el condicional,capaz de reemplazar instrucciones if -e1se.

Ejercicio

Adivinar un número pensado por la computadora.

Page 93: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 93/482

74 Java 2. Manual de programación

i f más cer cana, es c i e r i r

zor zepor . de  a1 seg . indo * /

import 4 a ~a . i o . ~;

 publ ic c l a s s  J uego

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

 publ ic s t a t i c void mai n ( St r i ng a r g s [ ] )

{

I npdt St r ear r Reader i s r

= newI nput St r ear nReader ( Cys t em 1n) ;

Bc f f e r edReader br = new Buf f er edReader ( i s r ) ;

Cz r - ng cadena;t r y .

Syste- ; . o~t . pr ; n: ( "I r . t roduzca un número ent ero ent r e 1 y 3" ) ;

cader ,a = i r .

eaci l i ne

( ) ;

i n t

n

= ( i n t ) Mat h . r andom( ) 3) +1;

/ / oz?. . r andrmO devuel 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)

else

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

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 rt i po de error " ) ;\

La estructura i f -e1se anterior podría haber sido sustituida por:

Cys :e? . c '~ t . pr - ~n i l n

i == n ? " Acertó" : " No acer t ó, er a +n);

3. 3. LAS SENTENCIAS if E i f -e l s e ANIDADAS

Es  posible que alguna de las sentencias a ejecutar especificadas en una instruccióni f sea a su vez otra sentencia i 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 e

ce.?

t

e;: cla:;

s t

Eci

a2;

i f (condiciónl)

t

i f ( condi ción2)

sent encia 1;

else

/ * l a c a l a b r a r eser vada el se se

cor r esponde cor l a sent enci a

sentencia2;

Page 94: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 94/482

Page 95: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 95/482

Page 96: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 96/482

Page 97: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 97/482

Page 98: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 98/482

Decisiones y bucles 79

Cuando el valor de la expresión coincide con una constante de case, seejecutan el grupo de sentencias asociadas y si la Última sentencia de un grupoes break, tras llegar a ella, el programa sale de la estructura switch. Si lasentencia break se omite, la ejecución sigue en el siguiente grupo de senten-cias, con independencia del valor de la constante case. Generalmente la pala-

 bra reservada break se omite cuando se desea ejecutar la misma acción parados o más constantes de case.

La cláusula d e f a u l t es un caso especial de case . Las sentencias que vie-nen a continuación de ella se ejecutan si ninguna de las constantes que siguena las diferentes sentencias case coincide con el valor de la expresión deswitch.

Para comprender mejor cómo utilizar la sentencia switch consideremos un programa que muestra un menú de opciones (una de sus aplicaciones más típicas).

Ejemplo

Menú de opciones:

i mpor t j a v a . i o . * ;

publ i c cl ass Cel ec t Mul t

i

publ i c st at i c voi d mai n ( St r i ng[ ] ar gs)t

try

( Sys t e m out . pr i nt l n ( i i ~ ~ ~ ú i i )

Syst em. out . pr i nt l n

( " C . Car gar ar chi vo" ) ;Sys t e m out . pr i nt l n ( " G. Gr abar ar chi vo" ) ;Sys t e m out . pr i nt l n ( " I . I mpr i mi r ar chi vo" ) ;Sys t e m out . pr i nt l n ( S . Sal i r del pr ogr ama" ) ;Sys t e m out . pr i nt ( "El i j a opc i ón ( C , G, I , S)

" ) ;

char opci on=( c har ) Cy st em i n. r ead( ) ;

Sys t em i n. s ki p( Sys t em i n. avai l abl e( ) )

;

swi t ch ( opci on)t

case ' C' .. case ' c ' :

Cys t em out . pr i nt l n( " Ha sel ecci onado Car gar ar chi vo" ) ;br eak;

case ' G : case ' g ' :

Sys t em out . pr i nt l n( " Ha sel ecci onado Gr abar ar chi vo" ) ;br eak;

case ' 1 ' . . case' i '

:

Sys t em out . pr i nt l n( " Ha sel ecci onado I mpr i mi r ar chi vo" ) ;

br eak;

System out . pr i nt l n( "Ha sel ecci onado Sal i r de pr ogr ama") ;br eak;

case ' S I : case ' s ' :

Page 99: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 99/482

80

Java 2. Manual de programación

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

1

1

cat ch( Except i on e)i )

En el programa anterior, cuando se pulsa la tecla s, se visualiza el mensaje Hasel ecci onado Sal i r de pr ogr ama, y si pulsa la tecla Z, aparece el deOpci ón no vál i da. Observe que se utilizan dos cláusulas case para permitiral usuario introducir letras mayúsculas o minúsculas. Es decir, los múltiples case

se utilizan para permitir que una serie de condiciones proporcionen la misma res - puesta.

 Nota: En una sentencia swi t ch no pueden aparecer constantes case iguales, pero las sentencias a ejecutar en una sentencia swi t ch pueden ser a su vezsentencias swi t chy las sentencias swi t ch anidadas sí pueden tener cons-tantes case iguales.

3.5. LA SENTENCIA for

El bucle f o r está diseñado para ejecutar una secuencia de sentencias un númerofijo de veces. La sintaxis de la sentencia f o r es:

for (inicialización; condición de terminación; incremento)sentencias; / / desde O a un bl oque del i mi t ado por { I

Las sentencias  podrán ser cero, una única sentencia o un bloque, y serán loque se repita durante el proceso del bucle.

La inicialización fija los valores iniciales de la variable o variables decontrol antes de que el bucle f o r se procese y ejecute solo una vez. Si se desea ini-

cializar más de un valor, se puede utilizar un operador especial de los bucles f o ren Java, el operador coma, para pegar sentencias. Cuando no se tiene que iniciali-

zar, se omite este apartado; sin embargo, nunca se debe omitir el punto y coma queactúa como separador.

La condición de termina ción se comprueba antes de cada iteración del bucle y éste se repite mientras que dicha condición se evalúe a un valor verdadero.Si se omite no se realiza ninguna prueba y se ejecuta siempre la sentencia f o r .

Page 100: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 100/482

Decisiones y bucles 81

El in cremen t o se ejecuta después de que se ejecuten las sen ten ci asy antes deque se realice la siguiente prueba de la condición de terminación.  Normalmenteesta parte se utiliza para incrementar o decrementar el valor de M a s variables de control

y, al igual que en la inicialización, se puede usar en ella el operador coma para pegar sen-tencias. Cuando no se tienen valores a incrementar se puede suprimir este apartado.En esencia, el bucle fo r comprueba si la condición de terminación es

verdadera. Si la condición es Verdadera, se ejecutan las sentencias del interior del bucle, y si la condición es,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ón(todas sus sentencias) y a continuación la variable de control del bucle se incrementa.

 Nota:Cada parte del bucle f o r es opcional.Es frecuente que 14s variables de control de un f o r sólo se necesiten en el

 bucle, en cuyo caso pueden declararse en la zona de inicialización.

Por ejemplo, para ejecutar una sentencia 1O veces se puede utilizar cualquierade los dos siguientes bucles f 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 ++j

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

/ / Sys t 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 sentencia f o r inicializa i a 1,comprueba que i es menoro igual a 1O y ejecuta la siguiente sentencia que muestra el valor de i.A continua-ción se incrementa i y se compara con l 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, éstasse encierran entre llaves.

fo 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 bucle f o r , sin embargo, no ejecuta ninguna sentencia, sólo la ini-

cialización y 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 ) ;

Page 101: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 101/482

82 Java 2.Manual  de programación

Los ejemplos anteriores muestran un incremento de la variable de control del bucle, con lo que la cuenta, realmente, era siempre ascendente. Un bucle f o r  puedetambién decrementar su variable de control produciendo un  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 ) ;

Not a:La variable de control de una sentencia f o r puede ser de cualquier tiposimple.

for (dxble i =10; i >=; i -0. 5) for (&ar

i='a' ;i <=

z'

; i ++)

System out . pr i nt l n( i )

;System out . pr i nt ( i )

;

La expresión de incremento de un bucle f o r no siempre serán sumas o restas sim-

 ples. Se puede utilizar cualquier expresión que tenga sentido en el problema que se estáresolviendo.Así por ejemplo, para visualizar los valores 1 2 I 4 8 16 32 64 1 28

se puede utilizar la expresión i*

2  para realizar el incremento.

for (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 incremento

for (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 bucle f o r es opcional, de forma que se pueden omitir las sec-

ciones de control si ese tratamiento es el adecuado para el problema a resolver. Porejemplo, el siguiente bucle f o r incrementa la variable de control del bucle, conindependencia del mecanismo de iteración:

f or ( i = ; i < 10; ) i t +;

O bien se puede omitir la sección de inicialización:

i nti =O;

f o r ( ; i < 10; i ++)

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

Page 102: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 102/482

Page 103: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 103/482

84

Java 2. Manual  de programación

 public c lass Br l

 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 )  break;

I

1

I

Si hay bucles anidados, una sentencia break colocada en el bucle interno sus-

 pende únicamente la ejecución de dicho bucle interior.

 public c lass Br 2

 public s t a t i c void mai n( St r i ng[ ]

args)i

i n t n, m;

fo 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;

I

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

1

Para abandonar una serie de estructuras anidadas puede utilizarse break e t i -

queta; ,donde la etiqueta puede ser cualquier identificador válido. Cuando se eje-

cuta esta sentencia, el control se transfiere a la sentencia siguiente a un bloqueetiquetado con dicho nombre de e t i q u e t a seguido por el signo de dos puntos,que, además, debe ser el que contenga la sentencia break etique ta.

 public c lass Br 3I

 public s t a t i c void mai n( St r i ng[ ] a r g s )

i

i n t n, m;

par ar :t

for ( m = O ; m < 10;  mtt)

Page 104: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 104/482

Page 105: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 105/482

86

Java 2. Manual de programación

con las que especificar el bloque al que se aplica.

 p u b l i c classCcr t i

 public s ta t ic v o i dr n a 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 ENTRE continue Y break

La sentencia cont i nue fuerza una nueva iteración, mientras quc b reak fuerza lasalida del bucle. En el siguiente ejemplo, se muestra la diferencia entre ambas sen -

tencias. En el se observa como el mensaje " E l bucl e" nunca se visualiza, peroen cada bucle por una causa diferente (break en el primero y cont i nue en el

segundo).

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 funcionamiento entre b reak y cont i nue es el que se muestra a continuación:

i

Page 106: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 106/482

Decisiones y bucles 87

 p ub l i c c l a s s B r y C

i

 p ub l i c s ta t ic vo idmal - ,

( Y t - i n j [ ]

, L J L )

i f ( c u e n t a > 5 ) cont inue;

Cys t em. out . j r i nt

( c i i er . t , i . +1 ;

I

C y c t em . o ? i t

. p r ~ n t l r ,

) ;

Sy s t e m out . pr i nt i n ( " Después delb 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 c b e l bucl e ' co?, r c k " ) ;

f o r( c ; i e n t a , 7

1 ;

c1uent.a 1 1 2 ; ( , L i e n t a t + )

{

i f ( c u e n t a > 5)  break;

Cy s t e m out . pr i nt (cue::t.ci+" " )

;

I

Syst em. out . p r ; r,t 1 n ( );

Sys t em out . p r i n t l n

( " 3 e s p u é s dels u c l e : c u e n t a 1

" ~ c u e r . : a ) ;

I

AI ejecutar el programa se observa que los  bucles f o r cuentan hasta 5 y sedetienen. Después del primer bucle, sin embargo, el valor de c u e n t a es 11, ydespués del segundo e s 6 . La razón es que en el segundo bucle  b r e a k fuerza laterminación y salida del bucle. Sin embargo, la sentencia c o n t i n u e , al igualque  b r e a k , sólo debe utilizarse cuando no existe otra alternativa. Por ejeniplo.

el listado

 p u b l i c classCont 2

 p u b l i c s ta t ic void 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 ) cont inue;

~ys t em. out . pr i nt l n( " ;

= " - 1)

;

Page 107: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 107/482

88

Java 2. Manual de programación

muestra sólo una línea, i 2 . Si i es igual a O I

1, 3 I 4, 5, 6, 7 8, 9,cont i nue salta sobre la sentencia Syst em. o u t . p r i n t l n .Este caso es un malejemplo de aplicación de cont i nue, ya que se puede evitar reescribiendo el códi-

go de esta manera:

=

 publ ic classSi nCont

 publ ic s ta t ic voidr 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. o1t . pr i nt r i ( i = "ti);

3.9. LA SENTENCIA while

El  bucle whi l e ejecuta una sentencia o  bloque de sentencias m se cumple

una determinada condición; es decir, la acción o acciones se repiten mientras la con-dición es verdadera. La sintaxis general de la sentencia whi l e es:

while ( expresión) while (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 sentencia o grupo de sentencias se ejecutan.

Cuando la expresión es falsa, el bucle whi l e se termina y el programa reanu-da su qjecución en la primera sentencia después del bucle.

i n t i =l ;

while ( 1 <= 100)

Cyc t em out . pr i nt l n ( " i = +I ) ;

: ++:

i i i i l c e j e c t i t d

la primera iteración ya que1

tiene u n valor menor que100.

t incrementa su valor en 1a cada iteración, cuando I sea igual a 1O 1,la

I

1

~

<=I O O

será falsa y el bucle seterinina.Un

ejeniplo de su aplicación esi 1 < .

- ) I

ogi

aina:

Page 108: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 108/482

Page 109: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 109/482

Page 110: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 110/482

Page 111: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 111/482

92

Java 2. Manual de programación

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

it+;

i

i = 1;

doi

Sys t e m out . pr i nt l n ( " Bucl e d o - W~L

c

+ 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 primeravez que se ejecutan los bucles se puede observar la diferencia entre las sentenciaswhi l e y do- whi l e.

Ejemplo

 public class DoWhi l e2

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

int i = 6;while ( i < 6)t

Sys t em out . pr i nt l n ( " Bucl e whi l e " t i ) ;

i +t ;

}

i

= 6;do

i

Sys t e m out . pr i nt l n ( " Bucl e do- whi l e " t i ) ;i t +;

while ( i

< 6);1

Page 112: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 112/482

Decisiones y bucles 93

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 dupli-que. Se proporcionarán desde teclado el tanto por ciento de interés y el capitalinicial.

import j ava. i o. * ;

 public class I nt er esi

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

t

I nput Ct r eamRedder i sr = new I nput St r eamReader ( Sy s t e m i nj ;

Buf f er edReader br = newBuf f er edReader ( i s r j ;

St r i ng cadena;double

c api t al I ni c i a1 = O;double c api t al F i na1 = O;double i nt er es=O;

try

(

Cyst er n. out

. pr i nt ( " I ndi que el capi t al i ni ci al " ) ;

cadena = br .eadLi ne

( )

;

Doubl e dl = new Doubl e( cadena) ;

capi t al I ni c i a1

=dl . doubl eVal ue( ) ;

c api t al F i na1 = Capi t a l I ni c i al ;

Sys t e m out . pr i nt ( " I ndi que el % de i nt er és " )

;

cadena = br . r eadLi ne( ) ;

dl = newDoubl e( cadena) ;

i nt er es = dl .doubl eval ue ( )

;

int años = 0;

doI

años = años + 1;

c api t al Fi na1

=c api t al Fi na1

+c api t al F i nal * i nt er es / l GO;

1

while ( c api t al Fi na1

< 2 * c a p i t a l I n i c i a l ) ;

Sys t em out . pr i nt l n( "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) ;I

cat ch( Except i on

e)(

1

1

1

Importante:En un bucle do-whi1e si la expresión se evalúa a un valor ver -dadero, las sentencias se ejecutan de nuevo.

Page 113: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 113/482

Page 114: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 114/482

96

Java 2. Manual de programación

La programación en lenguajes procedimentales -tales comoBASIC, C, Pascal, Ada y

COBOL- implica estructura de datos,diseño de algoritmos y traducción de algoritmos en código. La pro-

gramación orientada a objetos es un tipo de programación queintroduce construcciones específicas llamadas objetos, que a suvez contienen datos y procedimientos. Los objetos hacen la pro -gramación más fácil y menos propensa a errores. Un programa enJava implica un conjunto o colección de objetos que cooperanentre sí. En este capítulo se introducen los 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-

fos y cómo trabajan los objetos entre sí.

4.1. OBJETOS Y CLASES

Un objeto es una colección de datos y las subrutinas o métodos que operan sobre ellos.Los objetos representan cosas físicas o abstractas, pero que tienen un estado y un com -portamiento. Por ejemplo, una mesa, un estudiante, un círculo, una cuenta corriente, un préstamo, un automóvil,... se consideran objetos. Así, ciertas propiedades definen a unobjeto y ciertas propiedades definen lo que hace. Las que definen el objeto se conocencomo campos de datos y

el comportamiento de los objetos se define como métodos.La Figura 4.1 muestra un diagrama de un objeto con sus campos de datos y métodos.

I

campodato1 I

campo datoE L I

I

método2Objeto

Figura 4.1. Un objeto contiene datosy métodos

Page 115: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 115/482

Page 116: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 116/482

Page 117: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 117/482

Page 118: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 118/482

100 Java 2. Manual de programación

4.3.  ACCESO A DATOSY MÉTODOS

Después de que se ha creado un objeto, se puede acceder a sus datos y métodos uti-

lizando la notación siguiente:

nombr e0bj et o. dat os

nombr eObj et o. met odo( )

Referencia a u n dato de un objetoReferencia a un método de un objeto

Ejemplo

m Ci r c ul o. r adi o radio de mi c i r cul om Ci r c ul o. cal cul ar Cuper f i c i e( ) devuelve la superficie de mi c i r cul o

4.4. UTILIZACIÓN DE MÉTODOS

Los miembros de un objeto son los elementos dato, a los que también se puededenominar variablesde instancia, y los métodos. Los métodos son accioncs que serealizan por un objeto de una clase. Una invocación a un método es una petición al

método para que ejecute su acción y lo haga con el objeto mencionado. La invoca-

ción de un método se denominaría también llamar a un método y pasar un mensa -je a u objeto.

Existen dos tipos de métodos, aquellos que devuelven un valor Único y aquellosque ejecutan alguna acción distinta de devolver un Único valor. El métodor e a d I n t es un ejemplo de un método que devuelve un Único valor de tipo i n t .

El método  p r i n t l n es un ejemplo de un método que realiza alguna acción distin-

ta de devolver un valor único.

 Nota: Existen dos tipos de métodos: aquellos que devuelven un Único valor yaquellos que realizan alguna acción distinta de devolver un valor. Los méto-

dos que realizan alguna acción distinta de devolver un valor se denominanmétodos void.

La implementación de los métodos podría ser como ésta:

 public class Cuent acor r i ent e

i

 private double sal do;

 public void deposi t ar (double cant i dad)

sal do = sal do + cant i dad;

Page 119: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 119/482

sal do = sal do - cant i dad;

 public double ot>t .c: r ierS~i1 do( )

’ .

r et ur ncal do;

La i o invocución a un método se puede realizar de dos formas, depen-diendo de que el método devuelva o 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étodo max ( 3 , 4) y asigna el resultado del método a la variable

mayor . Otro ejemplo puede ser la llamada

Sys t em. out . pr i nt l n( max( 3, 4) ) ;

que imprime el valor devuelto por la llamada al método max ( 3 ,4 ) .

2. Siel

método devuelve vo id , una llamada al método debe ser una sentencia.Por ejemplo, el método pr i nt l n ( )

devuelve voi 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 se considera ahora un objeto m cuent a de la clase Cuent 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 devuelve el control al llamadorcuando se ejecute su sentencia return o cuando se alcance la llave de cie-rre 0).

Page 120: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 120/482

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 formales

requeridos. Java no soporta parámetros opcionales o de longitud variable. En elinterior de una clase, un método se identifica no

sOlo

 porSLI

nombre, sino también por su lista de parámetros formales. Por consiguiente, el mismo nombre de métodose puede definir

m

de u

vez

con diferentes parámetros formales para conseguirla sobrecarga de métodos.

Cuando se llama a un método, se deben proporcionar un número y tipocorrectos de argumentos. Los argumentos incluidos en la llamada a un método seconocen como argumentos (parámetros) reales o simplemente argumentos. La

llamada a un método exige proporcionarle parámetros reales (actuales) que sedeben dar en el mismo orden que la lista de parámetros formales en la especifi -cación del método. Esta regla se conoce como a tiel o

d 10s pur&

m

e .

Ejemplo

El métodoi mpr i m r N

imprime un mensaje n veces:

void i r n p r i r n i r N ( S t r i n g mensaj e, intn)

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óncorrecta

Una invocacióni mpr i m r N

(

"Car chel ejo" , 4) imprime la palabraCar chel ej

o

cuatro veces. El proceso es el siguiente.

La invocación ai mpr i m r N

 pasa el parametro real cadena," Car c hel ej o ,

al parametro formal mensaj e y el parametro real4 a la variable n.

Se imprime 4 veces la frase Car chel ej o.

2. Invocaciónincorrecta

La sentencia i mpr i m r N( 4, "Car chel ej o") es incorrecta, ya que el tipo dedato 4 no coincide con el tipo del parámetro mensaj e y, de igual modo, elsegundo parámetro "Car chel e o ' ' tampoco coincide con el tipo del segundo

 parámetro formal n.

Page 121: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 121/482

Clases, objetos y métodos 103

La operación de enlazar ( los argumentos reales a los argumentos for -males se denomina p d

u 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 valor y por referencia.

4.6. PASO DE PARÁMETROS POR VALOR

Todos los tipos de datos priinitivos ( i n t , l o n g , f l oat , bool ean) se pasan enlos métodos por valor. En otras palabras, sus valores se copian en nuevas posicio-nes, que se pasan a la subrutina (método); como consecuencia de esto, si un argu-mento se cambia dentro de un método, no se cambiará en el programa llamadororiginal. El siguiente método no producirá un cambio en x:

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

ec e- --a;acior

El único método sencillo para obtener un valor que se calcula dentro de una clasees utilizar un método cuyo tipo no sea voi d que específicamente devuelva un valor.

f l o a t cay-oiar ( 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 amaaor

I

4.7. PASO DE PARÁMETROS POR REFERENCIA

Los objetos, incluyendo arrays, se llaman tiposreferencia, ya que se pasan en losmé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 entre el paso de un valor de variables de tiposde datos primitivos y el 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éto-do afectará al objeto original que se pasa como argumento. Este tipo de paso de

 parámetros se denomina paso por r

Page 122: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 122/482

Page 123: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 123/482

Page 124: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 124/482

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 o

i

 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 a s uper f i c i e del r i r c ul o de r adi o ' ' A

m Ci r c ul o. r ddi ot " es t

m Ci r c ul o. c al c , J l ar Super f i c i e

) ;

/ / Ci r cul o con r adi o por def ect 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 (doubler )

r adi o = r ;1

Ci r cul 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

SalidaLa 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

Not as:La clase C i r c u l o tiene dos constructores. Se puede especificar unradio o utilizar el radio por defecto para crear un objeto C i r c u l o . Así:

1.ElconstmctorCirculo

( 1 0 . O ) seutilizaparacrearuncírculoconunradio 10.0.

2. El constructor Circulo ( ) se utiliza para crear un círculo con un radio por

defecto de 2.0.Los dos objetos creados m i c i r c u l o y s u c i r c u l o comparten los mismosmétodos y  por consiguiente se pueden calcular sus superficies utilizando elmétodo c a l c u l a r s u p e r f i c i e .

Page 125: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 125/482

Page 126: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 126/482

Page 127: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 127/482

Clases, objetos y métodos 109

3. Cuando una clase intenta acceder a una variable a la que no tiene acceso elcompilador imprime un mensaje de error similar al mostrado en la Figura 4.4

y no compila el programa.

Figura 4.4. Error.

4. Sucede igual acción si 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 subclases y las cla-ses del mismo paquete, accedan a los miembros. Los miembros protegidos soncomo los ((secretos familiares)) compart idos por familiares, e incluso por amigos, pero no por ((extraños)).Los miembros protegidos se declaran con la palabra re-servada  p r o t e c t e d . Consideremos la clase DemoProtegido que se declaradentro de un paquete denominado Demoy que tiene una variable y un método pro-tegidos.

 package : ~cr o. Ter nzC4. Üeno;

publ i cc l as s e m s P r o t e g i d o

I

pr ot ect edi nta t c P r o t e q x i o ;

pr ot ec t edvoi dm e t a d c 2 r o t e g i c i c O

S y c t e m . o ' i t . p r i n t ; n ( " E s u n Tét odo p r o t e g i u a " ) ;

1

Compilación

C : \ l i b r o \ T e r n a G4 \ De r n o >j a v a c DemoFr ozeg; do. ] ava

Page 128: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 128/482

10 Java 2. Manual de programación

Funcionamiento

1 . La clase Ot r aDemo es del paquete Demo,  pero no es subclase de

DemoPr ot egi do. La clase Ot r aDemo  puede acceder legalmente a lavariable dat opr ot egi do e invocar al método met odoPr ot egi do :

packagei b r o . Tema04. Demo;

c l as s Cr aDemo

voidVet 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 en la compilación

¿ :

\ ~~b r o ~~e ma C 4 \ De mo >~a v a cOt r aDemo. ava

2. Si Ot r aDemo fuera una subclase de DemoPr ot egi doeste código sería tam- bién legal, ya que la clase esta en el mismo paquete que DemoPr ot egi do.

3. Las subclases externas del paquete de la superclase también tienen acceso alos miembros protegidos pero a través de una referencia al objeto:

 package l i br o. Ter na34. DemoBi c ;

importl i br o . Tema04. Demo . " ;

c l as sLeva

ext endsemoPr 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 o t eqi do

( ); / / n o l egaln. met ouoPr ot eg; do( ) ; / / l e gal

1

Se puede acceder a los miembros protegidos a través de un objeto de la claseNueva, pero no a través de un objeto de la clase DemoPr ot egi do que no seriaválido.

AI compilar el programa se producen errores (Fig. 4.5).

Page 129: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 129/482

Clases, objetos y 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, los conceptos sobre paquetes se explican con deta-lle en el Capítulo 6.

4.12.  public

El especificador de acceso publ i c es aquel que define las clases, métodos y datosde modo tal que todos los programas pueden acceder a ellos. Los miembros se

declaran públicos sólo si este acceso no puede producir resultados no deseables siun ((extraño))a ellos los utiliza. Se declara a un miembro público utilizando la pala- bra reservada publ i c. Por ejemplo:

 package NegocLos ;

 public class EBus i nesc

 public - 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.13.RECURSIVIDAD

Un método es r cuando directa o indirectamente se llama a sí mismo. Lautilización de la recursividad es apropiada cuando el problema a resolver o los datosa tratar han sido definidos de forma recursiva, aunque esto no garantiza que la mejorforma 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 - )! para todonúmero n mayor que O, teniendo en cuenta que 0

!=2 , es recursiva. La imple-

Page 130: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 130/482

1

12

Java 2. Manual de programación

mentación se realiza de forma recursiva mediante un método f a c to r ia1que sellama sucesivamente a sí mismo.

 pub l i c class Funci on

/ / f act or i al r ecur s i vo pub l i c stat ic long f act or i al ( i n t

n)

!i f ( n < O )

r e t u r n -1;

i f( n == O )

r e t u r n 1;

else

r e t u r n n * f act or i al ( n - 1 ) ;

 pub l i c class Pr uebat

 pub l i c s t a t i c void mai c ( St r i ng' ] a r g s )

Funci on f = new Funci on( )

;

Cys t er k . out . pr i nt l n( f . f ac t or i al ( 4) ) ;

La función f act or i al también podría haber sido resuelta de forma iterativade la siguiente forma:

 pub l i c c l a s s Funci or . 2

/ / f act or i al i t er at i vo

 pub l i c s t a t i c long f act or i al ( i ;n t

n)

i f7.

< O )

r e t u r n -1;

long f a c t = 1;

while( n >

O)

f a c t = f a c t * n;

n- - ;

r e t u r n f a c t ;

Todo algoritmo recursivo puede ser transformado en iterativo, para esta trans-formación, en ocasiones, resulta necesario utilizar una pila. En el diseño de unaalgoritmo recursivo es preciso tener en cuenta que:

Page 131: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 131/482

Clases, objetos y métodos 113

La recursividad puede ser directa o indirecta.El

instrumento necesario para expresar los algoritmos recursivamente es elmétodo.

Un método presenta recursividad directa cuando se llama a sí mismo dentrode su definición.La recursividad indirecta consiste en que un método llame a otro que, a su vez,contenga una referencia directa o indirecta al primero.Un método recursivo debe disponer de una o varias instrucciones selectivasdonde establecer la condición o condiciones de salida.Cada llamada recursiva debe aproximar hacia el cumplimiento de la o las con-diciones de salida.

Cada vez que se llame al método los valores de los  parámetros y variableslocales serán almacenados en una pila.Durante la ejecución de dicho método, parámetros y variables tomarán nuevosvalores, con los que trabajará el procedimiento o función.Cuando termine de ejecutarse el método, se retornará al nivel anterior, recupe-rándose de la pila los valores tanto de parámetros por valor como de variableslocales y continuándose la ejecución con la instrucción siguiente a la llamadarecursiva. Hay que tener en cuenta que la recuperación de los datos almacena-dos en una pila se efectúa siempre en orden inverso a como se introdujeron.

Los algoritmos recursivos en los que distintas llamadas recursivas producenlos mismos cálculos es conveniente convertirlos en iterativos. Un ejemplo deesta situación es el cálculo de los números de Fi bonacci , que se definen porla relación de recurrencia fibonacci.. = fibonacci - ibonac-

ci?.:,es decir, cada término se obtiene sumando los dos anteriores exceptofibonacci = Oy fibonacci = 1.La definición dada es recursiva ysu implementación se muestra a continuación tanto de forma recursiva comoiterativa. Obsérvense los diferentes 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

 public s ta t ic 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)

else

r 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

Page 132: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 132/482

Page 133: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 133/482

Clases, objetos y métodos115

/ / Máxi mo

común di vi sor p u b l i c s t a t i c i n t

m c d ( i n t a , i n t b)

i f ( a <

OI 1

 b < O )

r e t u r n - 1;i f ( a '?  b == O )

r e t u r n b;else

r e t u r n mcd ( b , a b ) ;1

/ / Pr ogr ama par a pr obar l a cl ase cr eaaai mpor t j ava. i o. * ;

 p u b l i c class Pr ueba3i

Funci on3

f

= new Funci on? ( );

I nput St r eamReader i s r

= new I nput Ct r eamReac l er ( Sy s t e m i n) ;

Buf f er edReader br =

newBuf f er edReac i er ( i s r ) ;

i n t nl = O , n2 = O;

t r y

i

Sy s t e m out . pr i nt ( " D e m e un númer o " ) ;

nl = I nt eger . par s eI nt ( b r . eadL i r . e

) ;

Sys t em out . pr i nt ( " D e m e ot ro r . , Amer o

" ) ;

\ n2 = I nt eger . par s eI nE ( br . eadl i ne ( ) ;

Cys t em out . pr i c t ( f mc a( nl , n2) ;

Cy s t em out . pr i nt"

es el máxi mo común di vi s or e nt z e

" ) ;

Sys t em out . pr i nt l n( p1 + y "

+ n 2 ) ;

I OExcept i one)

em. e r r . pr i nt l n ( " Er r or de l ec t ur a" ) ;

Existen una serie de técnicas para el diseño de algoritmos que usan recursivi-

dad, entre las que destacan la estrategia de dividey vencerás y la de retroceso obacktracking. La técnica divide y vencerás consiste en dividir un problema en doso más subproblemas, cada uno de los cuales es similar al original pero más peque-ño en tamaño. Con las soluciones a los subproblemas se debe poder construir demanera sencilla una solución del problema general. Para resolver cada subpro-

 blema generado existen dos opciones , o el problema es suficientemente pequeñoo sencillo como para resolverse fácilmente de manera cómoda o si los subproble-

mas son todavía de gran tamaño, se aplica de forma recursiva la técnica de dividey vencerás.

Page 134: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 134/482

1

16 Java 2. Manual de programación

Hay un gran número de problemas cuya solución requiere la aplicación de méto-dos de tanteo de forma sistemática, es decir, ir probando todas las opciones posi-

 bles. La técnica deb

divide la solución del problema en pasos y define

la solución del paso i en función de la solución del paso i + 1 . Si noes posible llegar a una solución se retrocede para probar con otra posible opción.

Page 135: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 135/482

I 5

Herencia

CONTENIDO5.1. Descripción de herencia.5.2. La clase baseObj ect .

5. 3. El mét odocl one.5. 4. El mét odoequal s.5. 5. El mét odo f i nal i ze.5. 6. El mét odo t os t r i ng.5. 7. El mét odoget cl ass .5. 8. Vent aj asde l aher enci a.5. 9. Super cl asesy subcl ases.

5. 1O. Modi f i cador esy her enci a.5. 1 . Cl ases abst r act as.

5. 12. Mét odos abst r act os.5. 13. I nt er f aces.5. 14. Def i ni ci ónde unai nt er f az.

117

Page 136: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 136/482

118

Java 2. Manual  de programación

~~~~~

Una de las propiedades más sobresalientes de la programaciónorientada a objetos es la herencia, un mecanismo que sirve paradefinir objetos basados en otros existentes. Java soporta herencia

con extensión de clases, que permite definir una nueva clasebasada en otra clase ya existente sin modificarla. Tal nueva clase,llamada subclase o clase extendida, hereda los miembros de unasuperclase existente y añade otros miembros propios.

Java soporta herencia simple a través de extensión de clases.En herencia simple una clase se extiende a partir de una únicasuperclase. Por ejemplo, una subclase Cuentacor r ien te se

 puede extender (ampliar) de una superclase Cuenta o  bienGerente de Empleado. Algunos lenguajes orientados a objetos,como C++, soportan herencia múltiple, que es aquella en que una

subclase puede tener varias superclases. Java, por el contrario, nosoporta herencia múltiple aunque su funcionalidad puede ser con-

seguida mediante interfaces.Este capítulo introduce al concepto de herencia.

Específica-

mente examina superclases y subclases, el uso de palabras reser -vadas, super y t h i s , 10s modificadores  p ro t e c t ed , f i n a l ya b s t r a c t , diferentes clases Útiles y el diseño de interfaces.

5.1. DESCRIPCIÓN DE HERENCIA

En terminología Java, la clase existente se denomina superclase. La clase derivada dela superclase se denomina la subclase. También se conoce a la superclase como clasepadre y una subclase se conoce como clase hija, claseextendida oclasederivada.

La Figura 5.1 contiene la definición de una clase para estudiantes. Un estudian-te es una persona, por lo que se puede definir la clase E s t udi ant e que se derivade la clase Per sona. Una clase derivada es una clase que se define añadiendovariables de instancia y métodos a una clase existente. En el ejemplo de la Figura5.1, la clase Per sona es la clase base y la clase Est udi ant e es la clase deriva-

da, Las clases derivadas tienen todas las variables de instancia y los métodos de laclase base, más las variables de instancia y métodos que se necesiten añadir.

Persona7

Figura 5.1. Jerarquía de clases.

Page 137: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 137/482

Herencia 119

La definición de una subclase tiene la sintaxis siguiente:

 public class nombrecldre

extendslaceBace

Un ejemplo puede ser:

 public class Estu=- ant e ext ends e r c o z a

 Nota: La herencia es siempre t de modo que una clase puede here-dar características de superclases de muchos niveles.

Si la clase Perro es una subclase de la clase Mamí f er o y la claseMamí f er o es una subclase de la clase Ani mal , entonces Perro heredará atri- butos tanto de Mamí f er o como de Ani mal . Se pueden reutilizar o cambiar losmétodos de las superclases y se pueden añadir nuevos datos y nuevos métodos delas subclases. Las subclases pueden anular (redefinir) el comportamiento hereda-do de la clase padre. Por ejemplo, la clase Or ni t or r i nco redefine el compor -tamiento heredado de la clase Mami f er o, ya que los ornitorrincos ponenhuevos.

/,-

-

-

Animal y

.

- Mamífero

I

1 Perro yA

.

_

I’i

Ornitorrinco~~ ~

-_

\

Figura 5.2. Herenciay redefinición decomportamientos.

5.2. LA CLASE BASE Object

En Java todas las clases utilizan herencia. A menos que se especifique lo contrario,todas las clases se derivan de una clase raíz, denominada Ob] ect . Si no se pro-

 porciona explícitamente ninguna clase padre, se supone implícitamente la claseObj ect . Así, la definición de la clase Mi Pr i mer Pr ogr ama:

Page 138: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 138/482

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:

importj ava. l ang. * ;

 public class Mi Pr i mer Pr ogr ama extends Obj ectt

 public static void mai n ( St r i ng [ I ar gsjI

Cys t em out . pr i nt l n( " Mi pr i mer pr ogr ama J ava" ) ;1

i

La clase Ob] ect '  proporciona la funcionalidad mínima garantizada que escomún a todos los objetos (Fig. 5.3).

Figura 5.3. Todas las clases son descendientes dela clase Obj ect

http://java.sun.com/products/jdk/I .3/docs/api/java/lanE/Object. htrnl

Page 139: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 139/482

Herencia 121

La clase Ob e c t define e implementa el comportamiento que cada clase del sis-tema necesita. La clase Obj ect esta en el nivel mas alto de la jerarquía y seencuentra definida en la biblioteca

j

ava . l a n g . Cada clase del sistema Java es undescendiente, directo o indirecto de la clase O b ect . Esta clase define el estado básico y el comportamiento que todos los objetos deben tener, tal como compararun objeto con otro objeto, convertir a una cadena, esperar una variable condición,notificar a otros objetos que ha cambiado una variable condición o devolver la clasedel objeto. La clase Ob ect  proporciona una funcionalidad mínima que garantizaun comportamiento común a todos los objetos. Estos objetos incluyen los métodossiguientes:

publ i c bool ean equal s (

J ava .l ang.Obj ect ob Determina si el obje to 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 tipo Cl ass .Devuelve un kalor aleatorio

 para este objeto. Este métododebe también ser anulado cuando

publ i c f i nal j ava. l ang. Cl as s get 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 ng0

el método equal s se cambia.Convierte el objeto a un valor

de cadena. Este método seanula también con frecuencia.

Regla: Los métodos de la clase O b ect que se pueden anular o redefinir son:cl oneequal sf i nal i ze

t ost r i ng

Regl a:Los métodos que no se pueden anular en la clase O b j ec , ya que son

final, son:get cl assnot i f y2

not i f yAl l

wai t

Los métodos wa; t y not i f y se tratarán en el capítulo destinado a la programación multihilo.

Page 140: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 140/482

122 Java 2. Manual de programación

5.3. EL MÉTODO clone

Se puede utilizar el método cl one para crear objetos de otros objetos del mismo tipo.

Por defecto, los objetos no son clónicos, de modo que la implementación de estemé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 interfaz Cl oneabl e y anulareste método.

 p ro t ec te d C' bj er t c l o r . e ( ) throws Cl oneKo t Cuppo r t edY xcept l on;

5.4. EL MÉTODO equals

Se utiliza para determinar la igualdad de dos objetos. Este método devuelve t ruesi los objetos son iguales y f al se 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 CeguEdc = 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 que los objetos son iguales aunque referencian a obje-tos distintos.

5.5. EL MÉTODO finalize

El método f i n a l ize no hace nada. Se redefine f i nal i ze para ejecutar opera-

ciones especiales de limpieza antes de que se recoleccione la basura correspon-diente al objeto o cuando el programa termina.

 p r o t ec t ed void 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étodos f i nal i ze cuando un programa termina. Sinla petición los métodos f i nal i ze no se invocan cuando termina un programa.

I En el Capítulo 13

\e estudia el concepto de excepciones.

Page 141: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 141/482

Herencia 123

Nota:Cuando se utiliza el operador new 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 un demonio,  proporcionado por

la máquina virtual de Java.

5.6. EL MÉTODO t o s t r i n g

El método t os t r i ng de Obj ect devuelve una representación St r i ng del obje-to. Se puede utilizar

t os t r i ng

 junto con Syst em. out . pr i nt l n

 paravisuali-

zar una representación de texto de un objeto, tal como el hilo thread 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ón St r i ng de un objeto depende totalmente del objeto. Larepresentación St r i ng de un objeto I nt eger es el valor entero visualizado comotexto. La representación St r i ng de un objeto  Thr ead contiene diversos atribu-tos sobre el hilo tal como su nombre y  prioridad. Por ejemplo la salida de la ins-

trucción anterior podría ser:

Thr e ad[ ma i n, 5, mai nl

5.7. EL MÉTODO getclass

El método get Cl ass es un método final que devuelve una representación en tiem-

 po de ejecución de la clase del objeto. Este método devuelve un objeto Cl ass. Se puede consultar el objeto Cl ass  para obtener diversas informaciones sobre laclase, tal como su nombre, su superclase y los nombres de los interfaces que

im-

 plementa.

 public finalj ava. l ang. Cl ac s get c l as s 0

Ejemplo

voidi mpr i m r No mbr e Ob~e t o ( 0b J e c t

b])

Cys t em out . pr i nt l n ( " La c l ase del o b j e t o es "+

obj .get c l ass ( ) . et Name ( ) ;

Page 142: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 142/482

124

Java 2. Manual de programación

Si el objeto ob)  pasado como parámetro fuera de tipo I 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. VENTAJAS DE LA HERENCIA

El mecanismo de herencia presenta importantes ventajas:

Facilidad en lamodificación de clases. Evita la modificación del código exis-tente al utilizar la herencia para añadir nuevas características o cambiar carac-

terísticas existentes.Extracciónde commalidad de clases d Evita la duplicación deestructuras/código idéntico o similar en clases diferentes. Sencillamente, seextraen las partes comunes para formar otra clase y se permite que ésta seaheredada por las demás.Organizacióndeobjetos en jerarquía. Se forman grupos de objetos que con-

servan entre sí una relación ((es un tipo de)) (is u kingoJ>. Por ejemplo, un

coche (carro) es un tipo de automóvil, un deportivo es un tipo de coche(carro), una cuenta corriente es un tipo de cuenta, un ingeniero de sistemasesun tipo de empleado, una matriz cuadrada esun tipo de matriz, manzanareineta esun tipo de manzana.

9 Adaptación de programas para trabajur en situacionessimilares pero dife -

rentes. Evita la escritura de grandes programas, si la aplicación, sistemainformático, formato de datos o modo de operación es sólo ligeramente

diferente, pues se debe utilizar la herencia para modificar el código exis -tente.

5.9. SUPERCLASES Y SUBCLASES

Una clase extendida hereda todos los miembros de sus superclases, exceptoconstructores y f i nal i ze, y afiade nuevos miembros específicos. En esencia,una subclase hereda las variables y métodos de su superclase y de todos susascendientes. La subclase puede utilizar estos miembros, puede ocultar las varia- bles miembro o anular (redefinir) los métodos. La palabra reservada t h i s . per -mite hacer referencia a la propia clase, mientras que super se utiliza parareferenciar a la superclase y  poder llamar a métodos de la misma (aunque esten

redefinidos).

Page 143: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 143/482

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 miembro o anule un método.

Regla: Los constructores no se heredan por la subclase.

Una claseextendida es una clase compuesta con miembros de la superclase(miembrosheredados) 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 superclases los 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 deacceso mientras que la subclase está en el mismo paquete que la superclase.Las subclases no heredan un miembro de la superclase si la subclase declara unmiembro con el mismo nombre. En el caso de las variables miembros, la varia-

 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érmino subclase se refiere simplemente a los mecanismos de cons-

trucción de una clase utilizando herencia y, es fácil de reconocer, a partir de ladescripción del código fuente por la presencia de la palabra clave extends.

5.1O. MODIFICADORES Y HERENCIA

El lenguaje Java proporciona diversos modificadores que se pueden utilizar paramodificar aspectos del proceso de herencia. Los modificadores que controlan elacceso o 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 a característica  pu b l i c , método o campo (dato público) puede acceder-

se desde el exterior de la definición de la clase. A una clase pública se puede

acceder fuera del paquete en el que está declarada.A una 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 paquete o den-tro de la definición de subclases.

Page 144: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 144/482

126 Java 2. Manual de programación

 A una característica pr i vat e se puede acceder sólo dentro de la definiciónde la clase en que aparece.

Otros componentes posibles de una declaración de clase son s tat i c, abs-t rac t y f i n a l . Los campos dato y métodos se pueden declarar como st 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 instancia de laclase. Los campos de datos y métodos estáticos se heredan de igual modo que losno estáticos, excepto que los métodos estáticos no se pueden anular (redefinir).

Regla:

st at i c Define datos y métodos. Representa amplia información de laclase que se comparte por todas las instancias de las clases.publ i c Define clases, métodos y datos de tal modo que todos los pro-

gramas puedan acceder a ellos.pr i vat e Define métodos y datos de tal modo que se puede acceder a ellos

 por la declaración de la clase, pero no por sus subclases.

 Nota: Los modificadores st at i c y pr i vat e se aplican aisladamente avariables o a métodos. Si los modificadores publ i c o pr i vat e no se utili-zan, por defecto las clases, métodos y datos son accesibles por cualquier clasedel mismo paquete.

Precaución: Las variables asociadas con modificadores son los miembros dela clase, no variables locales dentro de los métodos. Utilizando modificadoresdentro del cuerpo de un método se producirá un error de compilación.

Los métodos y las clases se pueden declarar abstractas ( abstr act ) . U claseabstracta no puede ser ( Es decir no se puede crear una instancia deuna clase abstracta utilizando el operador new. Tal clase sólo se puede utilizar comouna clase padre para crear un nuevo tipo de objeto. De modo similar un métodoabstract debe ser anulado (redefinido) por una subclase.

Un modificador alternativo, f i n a l ,es el opuesto de abst r act . Cuando seaplica a una clase, la palabra reservada indica que la clase no sepuede atender: esdecir, que no puede ser una clase padre. De modo similar, cuando se aplique a unmétodo la palabra reservada indica que el método no se puede anular y, en conse-cuencia, el usuario tiene garantizado que el comportamiento de una clase no puedeser modificado por una clase posterior.

Page 145: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 145/482

Herencia 127

Nota:Se puede utilizar el modificador f i n a l  para indicar que UT 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 clases y miembros de la clase (datos ymétodos). El modificador f i n a l  puede utilizarse también en variables localesen un método. Una variable local f i nal es una constante interna al método.

5.11. CLASES ABSTRACTAS

En ocasiones, una clase definida puede representar un concepto abstracto y comotal no se puede instanciar. Consideremos, por ejemplo, la comida en el mundo real.;Se  puede tener una instancia (un ejemplar) de comida?  No, aunque sí se puedentener instancias de manzanas, chocolates, naranjas o peras. La comida representa elconcepto abstracto de cosas que se pueden comer y no tiene sentido que tenga ins-tancias ya que no es un objeto concreto. Otro ejemplo puede ser la clase abstractaF i gur aTr esDi mens i ones; de ella se pueden definir clases concretas (especí-ficas), tales como Esf er a, Ci l i ndr o, Cono,. . .

Las clases abstractas son Útiles para definir otras clases que sirvan para instan-ciar objetos, pero de ellas no se pueden crear instancias utilizando el operador new.El propósito de una clase abstracta es proporcionar una superclase a partir de la cualotras clases pueden heredar interfaces e implementaciones. Las clases a partir de lascuales se pueden crear instancias (objetos), se denominan clases concretas. Todaslas clases vistas hasta este momento son clases concretas, significando que es posi-

 ble crear instancias de la clase.

Importante: Una clase abstracta es una clase que contiene los nombres de loscomportamientos sin las implementaciones que ejecutan esos comportamien-tos. Los objetos no sepueden instanciar de una clase abstracta.

I

Page 146: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 146/482

128 Java 2. Manual de programación

Uno de los objetivos de la programación orientada a objetos es reconocer los ele-mentos que son comunes y agrupar esos elementos en abstracciones generales. Porejemplo, si se desea construir un marco de trabajo

í

de clases para figu-

ras geométricas, se puede comenzar con la noción general de «una figuran comoclase base. A partir de esta clase base se pueden derivar las clases de figuras espe-

cíficas, tales como Cí r cul o o Rect ángul o.

-

Fi gur a>

-

-

c

/ ------ --

/ -./Rectángulo

1’

-

/’ Círculoi t __/

Figura 5.4. Herenciay jerarquía de clases.

Una clase se declara abstracta con la palabra reservada abst r act . Una jerarquíade clases no necesita contener clases abstractas, sin embargo, muchos sistemas orien-tados a objetos tienen jerarquías de clases encabezadas por superclases abstractas. LaFigura 5.5 representa una jerarquía de figura de la que a su vez se derivan otras dosclases abstractas, Fi gur aDos Di mens ones y Fi guraT r esDi mens ones .

_ -

-

Fi gur a- - *

~~

, , ’

- /-~-- .Fi gur a2 Di mensi ones 3

- - - - -

 

\

__

’Figura3 Dimension

I - * - %

Figura 5.5. Jerarquía de herencia de clases Fi gur a.

Las clases abstractas son como las clases ordinarias con datos y métodos, perono se pueden crear instancias de clases abstractas usando el operador new. Las cla-ses abstractas normalmente contienen métodos abstractos. Un método abstracto esuna signatura de un método sin implementación. Su implementación se proporcio-na en sus subclases. Para declarar una clase abstracta tal como Fi gur a se puedehacer con la siguiente sintaxis:

abstract class Fi gur aI

Si se trata de instanciar una clase abstracta, el compilador visualiza un errorsimilar al mostrado en la Figura 5.6 y rechaza compilar el programa.

Page 147: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 147/482

Herencia 129

1 4 1 I

Figura 5.6.

5.12.MÉTODOS ABSTRACTOS

Una clase abstracta es una clase definida con el modificador abstract 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 subclases.

Regla: No todos los métodos se pueden declarar abstractos. Los siguientes métodosno se pueden declarar como abstractos:

Métodos privados.Métodos estáticos.

Ejemplo

Definir una clase abstracta Ob et oGeomet r i co . Esta clase debe contener entreotros métodos, los de cálculo del área y perímetro de objetos geométricos. Dado queno se conoce cómo calcular áreas y  perímetros de objetos geométricos abstractos,los métodos c al c ul ar Ar ea y Cal c ul ar Per i met r o se definen como méto-dos abstractos. Estos métodos deben implementarse en las subclases. Suponiendouna clase concreta Ci r cul o como subclase de Obj et oGeomet r i co .

La posible implementación de la clase Ci r cul o es como sigue:

 publ ic c l a s s C i r c ~ l oextendsObl et oGeomeLr i co

t

pr i vat edoubl er a d i o ;

publ i c i r r u l c (double Y St r i ng nom)

super nc n? );

r adi o = z;

I

Page 148: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 148/482

130 Java 2. Manual de programación

 publ ic Ci r c s l c ( )

/

t h i s( 1 .O,

"Bl anco" );

 publ ic double de vo l ver Radi o ( )

t

r e tu rn r adi o;I

 publ ic doublec al c ul ar Ar ea ( )

r e tu rn r adi o * r adi c * Mat h. F I ;

 publ ic doublec ai c ul ar Per i met r o

( )

r e tu rn 2 * Mat h. PI * r adi o;I

 publ ic St r i ng t os t r i ng( )

return "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 abstracta Obj 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 iv a te St r i ng nombr e; publ ic

Obj et oGeo met r i c o( St r i nq nom)

r . ombre = r om;

abs t ra c t publ ic doublec al c ul ar k r ea( ) ;

ab st ra ct publ ic doublec al c ul ar Per i met r o( ) ;

 publ ic St r i ng t os t r i ng

( )

r e t u r nnor br e;

I

Como clase de prueba, se puede utilizar la siguiente clase Pr ueba:

import] ava. i o. * ;

 publ ic c l a s sPr ueua

 publ ic s t a t i c void mai r ( St r i ng' ] ar gc )

Page 149: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 149/482

Page 150: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 150/482

132

Java 2. Manual  de programación

Consejo: Utilice clases abstractas para generalizar propiedades comunes ymétodos de subclases y utilice métodos abstractos para definir los métodoscomunes que deben ser implementados en subclases.

Precaución: Un método abstracto no puede estar contenido en una clase noabstracta. En una subclase no abstracta extendida de una clase abstracta todoslos métodos abstractos deben ser implementados, incluso si no se utilizan enla subclase.

Ejemplo

, Rectangulo_ .

ObjetoGráfico

Línea Círculo Cuadrado

Figura 5.8. Las clases heredan cierto estado y 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 Sb j e t o Gr d f i x

i n t x ,

y ;

/ / . . .void

moveTo

( i n t nuevaX, i n tr i i ~ c ~ w Y )

t

1

/ / . . .

abs t rac t void d i b c j a r 1 ;

c l a s s C i r c u l o extendsObj 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 extendsC b j e t o ( ; r , i f i c c

void di buj ár ( )

i

}

/ / . . .

Page 151: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 151/482

Herencia 133

 Advertencia:Java vs.C++Una diferencia fundamental entre métodos C++ y métodos Java es que los

mé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 tipo y  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 abstracto y  proporciona una

implementación, debe hacerlo con el mismo nombre de método, lista de argu-mentos y tipo de retorno.

Reglas:Java utiliza la palabra reservada abstract

abst r act publ i cdoubl eal c ul ar Ar ea0;

que sirve como un modificador al método c al c ul ar Ar ea

(

) . Cuando unaclase contiene al menos un método abstracto, el modificador abstract 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 coal gunaFi gur a =newObj et oGeomet i co ( "Bl anco");/ /Er ro r

Ejemplo

Definamos la superclase E s t udi ant e y sus dos subclases, clases derivadas,Es t udi ant ePr egr ado y Es t udi ant epos t gr ado. En principio no pareceque tenga sentido crear instancias de la clase Est udi ant e, ya que un estudiante

 puede ser de pregrado, de postgrado o puede ser otro tipo de estudiante (de forma-ción profesional, idiomas, bachiller, etc.), por tanto, declararemos la clase estudian-

te como abstracta.a b s t r a c t c l a s s Est udi ant ei

 p ro te c te d f i n a l s t a t i c i n t NUM- DE- PRUEBAS = 3;

protected St r i ng nombr e;

Page 152: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 152/482

134 Java 2. Manual de programación

/ / vea el capí t ul o sobr e ar r ays pro tec ted i n t ]

pr ueba; p rotected St r i ng cal i f i caci on; pub l i c Est udi ant e ( )

t h i s( " Ni ngun nombr e" ) ;

1

 public Ss t udi a nt 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 - c i on =

" * * * * * " .

I

/ /

rretodo abstractoabstract  publ ic void ~a l c ul a r Cd l i f i c dc i on( ) ;

 pub l i c St r i ng 1eer Nombr e

( )

i

r e tu rn nombr e;I

 pub l i c i n t

1eer Not acPr uebas

( i n t r i umPr i i c ha )

r e tu rn pr neba[

numPr ueba - 1

;

1

 publ ic void poner Nombr e ( St r i ng ni i evoNombr e)

t

1

nombr e = nuevoNombr e;

 pub l i c void 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.13. INTERFACES

El lenguaje Java soporta interfaces que se utilizan para definir u n  protocolo de com- portamiento que se puede implementar por cualquier clase en cualquier parte de la jerarquía de clases.

Definición: Una interfaz ( en Java es una descripción de comporta-

miento.

Page 153: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 153/482

Herencia 135

En esencia, una interfaz es un sistema o dispositivo que utiliza entidades no rela-cionadas que interactúan. Ejemplos de interfaces son un mando a distancia paratelevisión, que es una interfaz entre el espectador y un aparato de televisión, un

navegador de Internet, que es una interfaz entre el internauta y la red Internet.Las interfaces en Java tienen la propiedad de poder obtener un efecto similar ala herencia múltiple que soportan otros lenguajes como C++. Si se utiliza la palabrareservada ext ends  para definir una subclase, las subclases sólo  pueden tener unaclase padre. Con interfaces se puede obtener el efecto de la herencia múltiple. Unainterfaz se considera como una clase especial en Java. Cada interfaz se compila enun archivo independiente bytecode tal como una clase ordinaria. No se pueden crearinstancias de una interfaz. En la mayoría de los casos, sin embargo, se puede utili-zar una interfaz de un modo similar a como se utiliza una clase abstracta. Una inter -

faz Java define un conjunto de métodos, pero no las implementaciones, así comodatos. Los datos, sin embargo, deben ser constantes y los métodos, como se acabade indicar, sólo pueden tener declaraciones sin implementación.

,

Sintaxis

modificador interface Nombre Interfaz

t

/ / dec l dr ac i ones de const ant es

/ / dec l ar ac i ones de l os mét odos

Def i ni ci ón:Una interfaz e s una colección con nombre de definiciones de mé-todos (sin implementaciones) que puede incluir también declaraciones deconstantes.

Una interfaz se puede considerar una clase abstracta totalmente y en ella hay que

tener en cuenta que:

Todos los miembros son públicos (no hay necesidad de declararlos piblicos).Todos los métodos son abstractos (se especifica el descriptor del método y no

Todos los campos son st at i c y f i nal (proporcionan valores constantes Útiles).hay ninguna necesidad de declararlos abst ract ) .

5.14. DEFINICIÓN DE UNA INTERFAZ

Una definición de interfaz consta de dos componentes (Fig. 5.9): la declaración dela i y el c de la i

Page 154: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 154/482

136

Java 2.Manual  de programación

declaraciónde interfaz  public interface

Compar arobj et os

i

 public static final int MENOR ~ 1;

de  public static final int I

C IJ A1

O ;

 public static final int MAYOR-

1;cuer po e constantes

l ai nt er í az

 publicint comparar ( Compar ar Ob etos ot r oOb1eto)

;

1

de métodos

Figura 5.9. Definiciónde una interfaz.

La declaración de la interfaz declara diversos atributos acerca de la interfaz, talcomo su nombre y si se extiende a otra interfaz. El cuerpo de la interfaz contienelas declaraciones de métodos y constantes dentro de la interfaz.

Consejo: Las clases abstractas y los interfaces se pueden utilizar para conse-guir programación genérica. Se deben utilizar interfaces si se necesita heren-

cia múltiple. Si la herencia que se necesita es simple, es suficiente el uso declases abstractas. Normalmente el uso de una clase abstracta es mayor que el

uso de una interfaz.

Ejemplo

Diseñar un método de ordenación genérico para ordenar elementos. Los elemen-tos pueden ser un array de objetos tales como estudiantes, círculos y cilindros.En este caso se necesita un método genérico comparar  para definir el orden de

los objetos. Este método deberá adaptarse para que pueda comparar estudiantes,círculos o cilindros. Por ejemplo, se puede hacer uso del número de expedientecomo clave para la comparación de estudiantes, del radio como clave para la com -

 paración de círculos y del volumen como clave para la comparación de cilindros.Se puede utilizar una interfaz para definir el método genérico comparar del modosiguiente:

 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) ;

Page 155: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 155/482

Herencia 137

El método compar ar determina el orden de los objetos a y  b del tipoCompar ar Obj et o. La instrucción a. compar ar ( b ) devuelve un valor -1 si aes menor que b, un valor de O si a es igual a b o un valor de 1 si a es mayor que

 b. Un método genérico de ordenación para un array de objetos Compar ar Ob e t o

se puede declarar en una clase denominada Or 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 ays

Compar ar Obj et o maxAct ual ;

inti ndi ceMaxAct ua1;

f o r (int i = x. l engt h- 1; i >= 1; i - - )

i

maxAct ua1 = x [ 1 1;

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 c eMaxAc tua: ;

s i f uer a necesar i o * /

if ( i ndi ceMaxAct ua1 != i

x [ ndi ceMaxAct ua1

= x [ l ;

x [ i ] = maxAct ual ;

I

I

 Nota: La clase Ordenar contiene el método ordenar . Este método se basaen algoritmos de ordenación.

Page 156: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 156/482

138 Java 2. Manual  de programación

Precaución:La definición de una interfaz es similar a la definición de unaclase 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 implementación;una clase abstracta puede tener métodos concretos. Ningún modificador abstracto aparece en una interfaz; se debe poner elmodificador abstract antes de un método abstracto en una clase abstracta.

Un método genérico de búsqueda de un determinado objeto en un array de obje-tos Compar ar Ob e t o ordenado ascendentemente se puede declarar en una clase

denominada Buscar como la que se expone a continuación. Los métodos de orde-nación y  búsqueda se explican en el capítulo destinado a arrays,

publ i c class B csca r

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 Cb j et o unobj et o)

i nt cent r al = ( i z +de) / 2;

i f ( de < i z )

í /

evuel 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 ar

x

[ cent r al ] == Compar ar Obj et o . MAYOR)

el se

r e t u r n( - i z )

;

ret urn ( Busqceda- bi nar i a ( x , z , cent r al - 1, unobj et o) ;

ret urn( E. J squeda- Di nar i a ( x ,cent r ai t1, 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) ) ;

Regl a:Una vez que se ha definido una interfaz, el nombre de la interfaz seconvierte en el nombre de un tipo. Cualquier clase que implemente la interfaz

se convierte en un subtipo de ella. Una interfaz es un contrato entre proveedo-res y clientes de un servicio particular. El diseño de una interfaz afecta a lasfuncionalidades y capacidad en el lado proveedor y las complejidades y con-

veniencias en el lado cliente.

Page 157: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 157/482

Herencia 139

Ejemplo

Considerar una interfaz Or denabl e.

 public interface Or denabl ei

/ * Compar ar el ement os i y J

par 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 DECRECTENDO

* /int c o mpa r a r ( i nt i , int j ) ;

/ / I nt er cambi a el ement os i y j

void i nt er cambi o( int i , int j ) ;

/ / I ndi ce del pr i mer el ement oint pr i mer o ( ) ;

/ / I ndi ce del Úl t i mo el ement oint ul t i mo ( );

/ / Bander a par a i ndi car di r ecci ón de or der . ac i ón

 boolean or denado ( );

void or denado (boolean b) ;

/ * I ndi cador de di r ecci ón par aCRECI ENDO o DECRECI ENDO

* /void di r ecci on (int d i r ) ;

int di r ecci on ( ) ;

/ / Val or es de i ndi cador es de di r ecci ones posi bl esstatic final int CRECI ENTE = 1;

static final int DECRECI ENTE =

- 1;

Page 158: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 158/482

6

Encapsulamiento

y po i imor t ismoCONTENIDO

6.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 a los elementos de un paquete.

6.10. Importación de paquetes.6.1 I . Control de acceso a paquetes.

6.12. Polimorfismo.6.13. Ligadura.6.14. Ligadura dinámica.

141

Page 159: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 159/482

142 Java 2.Manual  de programación

Este capítulo examina las importantes propiedades de Java en-

capsulamiento y polimorfismo.La programación orientada a objetosencapsula datos (atributos) y métodos (comportamientos) en

paquetes denominados objetos. La ocultación de la información yabstracción,como términos sinónimos, gestiona la visibilidad de loselementos de un programa.

Encapsulamiento es un término muy utilizado para significarque los datos y las acciones se combinan en un Único elemento (unobjeto de las clases) y que los detalles de la implementación seocultan. El término polimorfismo significa <<múltiplesformas,, (poly= muchos, morphos = forma). En lenguajes orientados a objetos, elpolimorfismo es un resultado natural de la relación es-un y losmecanismos del paso de mensajes, herencia y el concepto de sus-

titución. El polimorfismo es una de las propiedades clave de un tipode programación conocida Como programación orientada a objetos.El polimorfismo permite a los programadores enviar el mismo men-

saje a objetos de diferentes clases. Existen muchas formas de poli-morfismo en Java. Por ejemplo, dos clases diferentes pueden tenermétodos con el mismo nombre.

6.1.ENCAPSULAMIENTO

Encapsulamiento es un término que se utiliza en las modernas técnicas de programa-ción. Encapsulamiento significa que los datos y las acciones se combinan en una solaentidad (es decir, un objeto de la clase) y se ocultan los detalles de la implementa-

ción. La programación orientada a objetos (POO) encapsula datos (atributos) ymétodos (comportamientos) en objetos. Los objetos tienen la propiedad de ocultaciónde la información. Esta propiedad significa que aunque los objetos pueden conocercómo comunicarse unos con otros a través de interfaces bien definidas, no puedenconocer cómo están implementados otros objetos (los detalles de la implementaciónestán ocultos dentro de los propios objetos). Ésta es una situación muy frecuente delmundo real. Es posible conducir con eficacia un automóvil sin conocer los detallesinternos de cómo funciona el motor, el tren de engranajes o el sistema de frenos.

En Java se tiene un gran control sobre el encapsulamiento de una clase y un objeto.Se consigue aplicando modificadores a clases, variables de instancia y de clases, y méto-

dos. Algunos de éstos modificadores se refieren al concepto de paquete, que se puedeconsiderar 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, modifi-cador, antes de la palabra reservada class en la definición de la clase, por ejemplo:

Page 160: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 160/482

Encapsulamiento y polimorfismo 143

 public c l ass P e r s o n aI

. . .i

Una clase pública se define dentro de su propio archivo y es visible en cualquier parte. Una clase que es local a un paquete específico no tiene modificador y se puede definir dentro de un archivo que contiene otras clases. Como máximo, una delas 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 del programador. Puede permitirse el acceso completo a todo el interior dentro de laclase o se pueden imponer diversos niveles de restricciones. En particular, se puedecontrolar cuánto es el acceso a otra clase que tiene la instancia y las variables declase de una clase. Se consigue esta acción utilizando un modificador, palabra reser -vada, antes del tipo de la variable. Por ejemplo:

 public statici n t

VALOR -MAX=65;

 protected S t r i n g n o mb r e ="Pepe Mackoy" ; private i n t c u e n t a = O ;

La Tabla 6.1 lista los modificadores y sus significados. Normalmente es una buena idea imponer tanto encapsulamiento como sea posible. En consecuencia,debe ocultarse todo lo que se pueda, excepto lo que se desea hacer visible a otrasclases, en cuyo caso se debe permitir la cantidad mínima de visibilidad.

Tabla 6.1. El efectode un modificadorde métodoo 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 ase

en otros paquetesVisible sólo en la clase actual

Observación: El modificador p r o t ec t ed es más débil que el uso de ningúnmodificador.  No se debe utilizar ningún modificador con preferencia a

 p ro t ec t ed .

Page 161: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 161/482

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 se reali-

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 iva te s t a t i c i n t c o nt a r Obj et os 0

i

1

 protected f i n a l Obj ect enc ont r ar l l ave0

t

1

* . .

. . .

6.5. CLASES INTERNAS

Java permite definir clases e interfaces dentro de otras clases e interfaces. Una claseque no se anida dentro de otra se denomina clase  de nivel superior. Esto significaque prácticamente todas las clases iitilizadas hasta ahora son clases de nivel supe-rior. Las clases internas se definen dentro del ámbito de una clase externa (o denivel superior). Estas clases internas se pueden definir dentro de un bloque de sen -

tencias o (anónimamente) dentro de una expresión. La clase Empl eado tiene dosclases internas que representan una dirección y un sueldo (Fig. 6. I ) , El código fuen-

te de la clase Empl eado y sus dos clases internas D i r e c c i o n y Suel do es:

Ejemplo

 public c la ss Empl eadot

i n t edad = 0 ; public St r i ng nombre = "Mackoy" ;double tasa = 1 6 . 0 0 ;Di r ecci on di r ecci on;

Suel do suel do; public 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 asaHor a, i n t horas)

t

Page 162: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 162/482

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 cal 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 a1

i

Cys t em out . pr i nt l n

I

1

es 0

numer o+" "+cal l e+", t ci udad) ;

/ / c l ase i nt er na

cl ass Suel dot

i nt hor asTr aba j adas = O;

Suel do ( i n t horas)I

hor asTr aba j adas

= hor as;1

voi d Vi s ual i z ar Det al l es

( )

i

1

Cys t e m out . pr i nt l n ( " Sal ar i o = t hor asTr aba j 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 ( " \ nF i c ha Empl 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 es

0 ;

Page 163: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 163/482

146 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

Empl eado

Var i abl esde i nst anci a

edad, nombr e, di r ecci ón,t asa,suel do.

I

;

I

I

I I Cl asei nt er na Di r ecci ón I

I Cl asei nt er na Suel do II ¡

I

1

Imprimir Datos ()

Figura 6.1. Estructurade la claseEmpl eado.

Las clases internas no se pueden utilizar fuera del ámbito. Por consiguiente, lasclases externas de la clase Empl eado no pueden acceder a la clase interna (a

menos que sean subclases o estén en el mismo paquete, dependiendo de la visibili-dad en la definición de la clase).

En la práctica, la clase de nivel superior actúa como un paquete de objetosque contienen cero o más clases internas. Esto es particularmente útil en desa -rrollo de software orientado a objetos. Por otra parte, la capacidad para definirun código determinado que se puede crear y  pasar donde se necesite es muyimportante.

Sintaxis: C posee punteros a funciones. El lenguaje Smalltalk utiliza objetosque representan código (objetos bloque). Java posee clases internas.

Page 164: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 164/482

Encapsulamiento y polimorfismo 147

Ejemplo

class AI

int l ongi t ud;float val or ; / / var i abl es dur ant e l a ej ecuc i bn

 public A( ) / / const r uct or de Ai

1

 public float l eer Va l o r 0 / / devuel ve val or de una cl asei

1

return val or ;

class B

i

 public B O

I

1

/ / def i ni c i ón de B

/ / const r uct or de B

 public int l eer cuent a ( )

i

/ / accede a l ongi t ud de l a cl ase ext er nareturn 5* l ongi t ud;

1

1

/ / f i n de l a cl ase B1

/ / f i n de l a cl ase A

Una clase anónima es aquella que no tiene nombre y, cuando se va a crear unobjeto de la misma, en lugar del nombre se coloca directamente la definición.

I

Regla: Estas clases se utilizan principalmente en el manejo de sucesos. I

Ejemplo

Programa que permite la e ección de una opción de un componente Choi ce y pre-senta en pantalla la opción seleccionada (vea los Capítulos 9 y 1O). Para el cierre deventana, en lugar de crear la clase Ci er r e:

class Ci er r e extends Wi ndowAdapt ert

 public voidwi ndowCl osi ng( W ndowEvent e)

i

}

Sys t em exi t ( O) ;

1

Page 165: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 165/482

148 Java 2. Manual  de programación

utiliza una clase anónima; es decir, coloca, donde es necesario, directamente la defi-nición.

Así, en lugar de

addW ndowL i s t ener ( new Ci e r r e0 ) ;

se utiliza

addW ndowLi st ener ( new W ndowAdapt er O

I

publ i c voi d w i n d o w C l o s i n g (W i n c i o w Ev e n z e)i

1

1 ;

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 ass Ej Anoni ma

extends Fr ame i mpl ement s I t emLi st eneri

pr i vate 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 erre de l a vent anaaddW ndowLi st ener ( new W ndowAdapt er O

i

publ i c voi d wi ndowCl os i ng( W ndowEvent e)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

Page 166: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 166/482

Encapsu/arniento y poiirnorfismo

149

Ej Anoni ma ver i t ana = new Ej Anoni ma( ) ;

vent ana . ce t Layout ( new

Fl 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 voidp 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 voidi t emCt at eChanged( 1t emEvent e)

i

1

r epai nt ( ) ;

Compilación

C:l i br o \ TemaO

6> avac E] Anoni ma . ava

EjecuciónC: \ l i br o \ TemaOG>j ava Ej Anoni ma

El ementosel ecci onadoWi ndows 98

Figura 6.2. Resultado dela ejecución del ejemplo de clase anónima.

6.6. PAQUETES

Un paquete es una colección de clases que se compilan en una unidad de compila -ción. Los  paquetes proporcionan un medio adecuado para organizar dichas clases.Se pueden poner las clases que se desarrollan en paquetes y distribuir los paquetesa otras personas, por tanto, se puede pensar en los paquetes como bibliotecas que se

 pueden compartir por muchos usuarios.

Page 167: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 167/482

150 Java 2. Manual de programación

Es  posible llevar un conjunto de clases relacionadas juntas a una única unidadde compilación definiéndolas todas dentro de un archivo. Por defecto, se crea un

 paquete implícito (sin nombre); las clases pueden acceder a variables y métodos que

sólo son visibles en el paquete actual y sólo una de las clases puede ser visible públicamente (la clase con el mismo nombre que el 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 utilizar para construir aplicaciones. Por ejemplo, el paquete  j ava .i o agrega las clases deentrada y salida de datos en un programa. Un paquete puede contener a otros paque-

tes. Los paquetes sirven para organizar las clases en grupos para facilitar el accesoa las mismas cuando sean necesarias en un programa.

La referencia a una clase de un paquete se hace utilizando un nombre completo,

excepto cuando el paquete haya sido importado implícita o explícitamente. Porejemplo j

ava. awt .But t on indica que But t on es una clase del paquete awt yque awt es un paquete dentro del paquete

j

ava.Los paquetes son unidades encapsuladas que pueden poseer clases, interfaces y

subpaquetes. 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 visiblesfuera del paquete. Se puede poner un nivel de encapsulamiento tal que sólo

aquellos elementos que están concebidos para ser públicos puedan ser accedi-dos 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 cuando secoin pi la.

Un paquete explícito se define por la palabra reservada package en el comien-zo del archivo en el que se definen una o más clases o interfaces. Para poner unaclase en un paquete específico se necesita añadir la siguiente línea como la prime-

ra sentencia no comentario:

 package nombr epaqcet e;

Por ejemplo:

 package di buj os ;

Page 168: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 168/482

i ncapsu iamien to y poi imorf ismo 151

Los nombres de los  paquetes deben ser Únicos para asegurar que no hay con-flictos de nombres. Java impone un convenio de nombres por el que un nombre de

 paquete se construye por un número de componentes separados por un  punto (sepa-rador .). Estos componentes corresponden a la posición de los archivos. En el casosiguiente, los archivos del paquete

 packagepr uebac . di buj os ;

están en un directorio llamado di buj os dentro de un directorio llamado  p r u e -

 b a s . Por otra parte, si los archivos de un  paquete específico están en un directoriollamado concur so, dentro de un directorio llamado pr uebas, el nombre del

 paquete es

 packagepr uebas . c onc ur so ;

Observe que esto supone que todos los archivos asociados con un único paque-te están en el mismo directorio. Cualquier número de archivos se puede convertiren parte de un paquete, sin embargo, un archivo sólo se puede especificar en unúnico paquete.

 Nota: Un paquetp,

es una colección de clases relacionadas e interfaces que pro- porcionan protección de acceso y gestión de espacio de nombres.

- 1

6.8. PAQUETES INCORPORADOS

Java proporciona miichos  paquetes útiles:

Paquete  j ava . appl et : permite la creación de upp1rt.s a traves de la clase Appl et ,  propor-ciona interfaces pars conectar un  applet a un documento Web y  para audición de audio.Paquete  j ava. awt : proporciona un Abst r act Wi ndow T o o i k i t  para programación C U I

independiente de la plataforma, gráficos y manipulación de imágenes.Paquete  j ava. i o: soporta flujos de entrada y 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 interfaces Copi 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 errores y 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 grande y real grande (

Page 169: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 169/482

152 Java 2. Manual de programación

Paquete j ava. net : soporta facilidades de red (URL, sockets TCP, sockets UDP, direccionesIP,

Paquete l 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, con-

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 DE UN PAQUETE

Existen dos medios para acceder a un elemento de un paquete: 1) n total -

menteill

elemento,i

elpaquete, 2) utilizar sentencias i mpor t . Por ejem-

 plo, cuando se elige nombrar totalmente al elemento, se puede especificar la clasePanel  proporcionando su definición completa

1 ava. awt .Panel

como ocurre en la siguiente cabecera:

 public abs t rac t c l a s s Bot on ext ends j a va . awt . Pane1

I

Esta sentencia indica al compilador dónde buscar exactamente la definición dela clase Panel . Sin embargo, este sistema es un poco complicado para referirse ala clase Panel un número dado de veces, la alternativa es importar la clasej

ava .awt .Panel :

importj ava. awt . Pane1;

 public abs t rac t c l a s s Bot on ext ends Panel(

. . .

Hay ocasiones en que se desea importar un número grande de elementos de otro paquete. En este caso, en lugar de colocar una larga lista de sentencias de importa-ción ( i mport ) , se pueden importar todos los elementos de un paquete en una sola

acción utilizando el carácter(comodín))

* .

Por ejemplo:import

2

21;s.awt .*;

i i i i po i tn todos los elementos del paquete j ava .awt al paquete actual.

Page 170: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 170/482

Encapsu/arnientoy poiirnorfisrno 153

6.10.IMPORTACIÓN

DE PAQUETES

Como se acaba de comentar, para utilizar una clase de un paquete en un  programa, se

 puede recurrir a añadir una sentencia i mpor t en la cabecera del mismo. Por ejemplo,import r ni paquet e. Mi Prueba;

Las declaraciones i mpor t indican ai compilador Java dónde buscar ciertas cla-ses y nombres de interfaces, de forma que, una vez importado, el nombre de la clasese puede utilizar directamente sin el prefijo del nombre del paquete.

Si se tienen muchas clases para utilizar del mismo paquete, se puede emplear elcaracter asterisco (*) para indicar el uso de todas las clases del paquete. Por ejemplo,

importm paquet e. * ;

importa todas las clases del paquete mi paquet e.

Existen dos formatos de i mpor t

1. i mpor t paquet eDest i no . UnT i po ; importa la clase o interfaz

2. 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 declase y nivel de paque -

te. Las reglas de acceso a nivel de clase se resumen en la Figura 6.3.

Figura 6.3. Controlde acceso a nivelde clase.

Page 171: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 171/482

154

Java 2. Manual de programación

Un paquete consta de tipos (clases e i definidos en todos sus archivos.El acceso a nivel de paquete para un tipo es publ i c o package. Sólo los 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 un paque-te a los restantes paquetes. En otras palabras, una clase puede acceder a tipos públicos y sus miembros públicos en otro paquete. Una subclase puede tambiénacceder a los miembros públicos y  protegidos de sus superclases en otro paquete.Los códigos interiores de un paquete pueden acceder a todos los nombres de tipo ytodos los mé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. Control d e acceso a nivel d e  paquete

6.12. POLIMORFISMO

Polimorfismo es una palabra que significa ((múltiples formas)) y es una de las carac-terísticas más importantes de la programación orientada a objetos. En realidad, poli-morfismo es la propiedad por la que a la misma palabra se le asignan múltiplesdefiniciones. Existen muchas formas de polimorfismo en Java. Por ejemplo, dosclases diferentes pueden tener dos o mas métodos con el mismo nombre.

En esencia, p es la capacidad para enviar el mismo mensaje a obje-tos totalmente diferentes, cada uno de los cuales responde a ese mensaje de unmodo específico. Las aptitudes polimórficas de Java se derivan de su uso como liga-dura dinámica. Además, el mismo nombre de método se puede utilizar con pará-metros diferentes y se permite que áparentemente el mismo método sea declaradoun cierto número de veces dentro de la misma clase.

Polimorfismo puro‘, se produce cuando una única función se puede aplicar a ar -gumentos de una variedad de tipos. En polimorfismo puro hay una función (el cuer -

 po del código) y un número de interpretaciones (significados diferentes). El otro

’ Éste es el término utilizado pot Timoty Budd en la segunda edición de su libro U O

OrientedProgramming with Java, Addison-Wesley, 2000, p. 195.

Page 172: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 172/482

Page 173: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 173/482

156 Java 2. Manual  de programación

un método. Si una clase derivada no implementa todos los métodos abstractos quehereda de una clase abstracta, entonces esta clase se considera también una claseabstracta. En contraste, el término clase concreta se utiliza para referirse a una clase

en la que no se definen métodos abstractos y tiene implementaciones para todos losmétodos abstractos heredados. Una clase concreta representa un tipo de objeto espe-cífico, prefijado. Dado que una clase abstracta no está totalmente especificada, sus

métodos abstractos están definidos pero no implementados, no es posible crearobjetos de las clases abstractas. En consecuencia, si la clase Ani mal es una claseabstracta:

 public abs t rac t c l a s s Ani malI

 public abs t rac t void mover 0 ;

I

el siguiente código no es válido:

Ani mal = new Ani mal ( . . .;

Regl a: No es posible crear un objeto de una clase abstracta, pero sí es posibletener una referencia a clases bases abstractas que se refieren a un objeto de unaclase concreta, derivada.

6.13. LIGADURA

El término ligadura se refiere al acto de seleccionar cuál es el método que se eje-cutará en respuesta a una invocación específica. En algunos lenguajes, tales comoC, la ligadura se realiza totalmente en tiempo de compilación, incluso si están impli-cados métodos sobrecargados. La ligadura que se realiza en tiempo de compilaciónse denomina ligaduraestática ya que una vez que se establece la ligadura, ésta nocambia durante la ejecución del programa. Sin embargo, cuando la conversión detipos (casting) y la herencia están implicadas, la ligadura no se puede hacer total-mente en tiempo de compilación ya que el cuerpo real del código que se ejecuta

cuando se invoca un método puede depender de la clase real del objeto, algo que no puede ser conocido en tiempo de compilación. La ligadura d se refiere a laligadura que se lleva a cabo en tiempo de ejecución. El caso de ligadura dinámicase produce cuando se combinan la conversión de tipos, herencia y anulación demétodos.

Page 174: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 174/482

Encapsulamiento y polimorfismo 157

6.1 4. LIGADURA DINÁMICA

La ligadura dinámica se ilustra mediante los siguientes dos ejemplos, que utilizan

la jerarquía de clases. public c l a s s Base

t

publ i c voi doperaci on ( )

publ i cc l as sDer i vadal ext endsBasei

/ / no se ancl a el mét odo operaci on1

publ i cc l as sDer i vada2 ext endsBase

publ i c voi doperaci on ( )

En esta jerarquía de clases, se derivan dos clases de la misma clase base. Laclase Base y la clase Der i vada2 contienen una definición de un método llama-do oper aci ón. La clase Der i vadal no anula la definición de oper aci on. El

siguiente 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 c a. oper ac i on0;

gener i ca = ( Base) segundo;gener i c a. oper ac i on0;

En la primera invocación de oper aci on el objeto real es de la claseDer i vadal . Ya que la clase Der i vadal no anula el método oper aci on, lainvocación producirá la ejecución del método oper aci on de la clase Base. Enla segunda invocación de oper aci on el objeto real es de la clase Der i vada2que anula el método oper aci on definido en Base. La pregunta que podemoshacer es: jcuál de los dos métodos oper ac i or i 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 ligadura

dinámica ejecuta siempre un método basado en el tipo real del objeto. Por consi-guiente, en el segmento de código anterior la segunda invocación del método ope-r aci ón se enlaza al método oper aci ón de la clase

Der i vada2.

Ya que el tiporeal del objeto puede no ser conocido hasta el tiempo de ejecución, la ligadura se

Page 175: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 175/482

158 Java 2. Manual de programación

conoce como dinámica para diferenciarlo de las ligaduras que pueden determinarseen tiempo de compilación. Por ejemplo, considere las clases siguientes:

 public c l a ss Aut omovi lI

publ i c voi dconduci r ( )

I

Sys t em out . pr i nt l n( "Conduci r un aut omóvi l " ) ;1

I

publ i cc l as sCarro ext endsAut omovi li

 public void conduci r( )

i

1

Syst em. out . pr i nt l n( "Conduci r un car r o" ) ;

Estas dos clases se pueden utilizar en otra clase:

 public c l as s Ej empl oi

 public s t a t i c void mai n ( St r i ng ar gc [ )

(

Aut omovi l a = new Aut omovi l( );

Carro c = newC a r r o ( ) ;

a. conduci r( ) ;

c. conduci r ( );

a = c;a. conduci r ( );

1

I

Compilación

C: \ l i br o \ TemaGG>j avac Aut omovi l . j ava

C: \ l i br o \ TemaGG>j avac Car r o . j ava

C: \ l i br o \ TemaGG>j avac E j empl o . j ava

Cuando se ejecuta esta aplicación, la versión conduci r se define en la claseCarro dos veces, mientras que la versión de la superclase se llama sólo una vez.Así, la ejecución producirá:

C: \ l i br o\ TemaGG>j ava Ej empl oConduci r un aut omóvi lConduci r un car r oConduci r un carro

Page 176: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 176/482

Encapsu/amienío y po/imorf ismo 159

La variable a se declaró de tipo Aut omovi 1.Cuando se asignó a la instancia deCarro y se recibió el mensaje conduci r , se responde con la versión conduci rde Car r o, que se eligió en tiempo de ejecución. La ligadura dinámica o 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 sucedeen un lenguaje procedimental), se determina en tiempo de ejecución. Es decir, se

 busca cuál es la clase del objeto que ha recibido el mensaje y entonces decide cuáles el método que se ejecuta. Ya que esta decisión se realiza en tiempo de ejecución,se consume un tiempo de ejecución suplementario, pero, por el contrario, presentaflexibilidad. Cuando Java selecciona un método en respuesta a un mensaje, lo haceutilizando tres cosas:

La clase del objeto receptor.El nombre del método.El tipo y orden de los parámetros.

Es decir, se pueden definir varios métodos en la misma con el mismo nombre pero con parámetros diferentes. El sistema selecciona el método que desea llamaren tiempo de ejecución examinando los parámetros.

publ i c cl ass Gol f extends Aut omovi li

publ i c voi d c ar gar ( i nt

i )

i

i

Sys 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

1

Syst em. out . p r i n t l n ( " Car gando cadenas " + s ) ;

\

La clase G o l f tiene dos métodos denominados car gar , cada uno con un pará-

metro de tipo diferente. Este código significa que Java puede diferenciar entre losdos métodos y no se producen conflictos.

Page 177: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 177/482

 A 7

 Arrays

CONTENIDO7.1. Concepto dearray.7.2. Proceso dearrays.

7.3. Arrays de objetos.7.4. Copia de arrays.

7.5.  Arrays muItidime nsional es.7.6. Ordenación dearrays.7.7. Selección.7.8. Burbuja.7.9. Inserción.

7.10. Shel l .7. 1 . Or denaci ón rápi da.

7. 1 2. Búsqueda.7. 13. I mpl ement aci ón genér i ca del osmét odos

de or denaci ón.

161

Page 178: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 178/482

162 Java 2.Manual  de programación

7.1.

En capítulos anterioresse han utilizado variables para hacerlosprogramas másflexibles.Gracias a las variables se pueden alma-cenar, convenientemente, datos enlos programasy recuperarlos

por su nombre.Se pueden también obtener entradas del usuario delprograma. Las variablespueden cambiar constantementesu valor.Sin embargo, en algunos casos se han de almacenar un grannúmero devalores en memoria durante la ejecuciónde un progra-ma. Por ejemplo, suponga que desea ordenar un grupo de núme-

ros, éstos se deben almacenaren memoria yaque se han de utilizarposteriormente para comparar cada número conlos restantes.

 Almacenarlos números requiere declararvariablesen el programay es prácticamente imposible declararvariables para miembrosindividuales, se necesitaun enfoque organizadoy eficiente.

Todos los lenguajes de programación, incluyendo Java, propor -cionan una estructurade datos, array (<matr iz,vector,,) capaz dealmacenar una colección de datos del mismo tipo. Java trata estosarrays como objetos.

CONCEPTO DE ARRAY

Un army (((matriz, vector, lista))) es un tipo especial de objeto compuesto por unacolección de elementos del mismo tipo de datos que se almacenan consecutiva-

mente en memoria.I,a

Figura 7.1 es un array de 10 elementos de tipo d o u b l e y serepresenta por un nombre, 1i st a, con índices o 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 [81

l i s t a [ 9 1

I I

l i s t a-nombr e

[ i ]

-índice

Figura 7.1. El array l i s t a de 10 el ement os, con í ndi ces deO a 9.

Page 179: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 179/482

 Arrays 163

Otra forma de representar gráficamente un array es en forma de lista horizontal.

l i s ta [ O ] l i s t a [ l ] l i s ta[ 2 ]

l i s t a[31

l i s t a[4 ]

. . .

Figura 7.2.  Array l i s ta de10

el ement os.

Los arrays pueden ser unidimensionales (Figs. 7.1 y 7.2), conocidos tambiéncomo listas o vectores, y multidimensionales, conocidos también como tablas o

matrices, que pueden tener dos o más dimensiones.

Ejemplo

El array t emperat ur as de ocho elementos consta de los siguientes componentes:

t emperatur as

t emperaturas

t emperatur as

t emperatur as

t emperaturas

t emperaturas

t emperaturas

t emperaturas

Regl a:Un array tiene un nombre o identificador, un índice que esun entero

encerrado entrecorchetes,un tamaño o longitud, que es Úmerode elemen-tos que sepueden almacenarenelarray cuando sele asignaespacioen memo-ria. Un array se representa por una variable array y se debe  declarar, crear,iniciar y utilizar.

7.2. PROCESO DE ARRAYS

El proceso que se puede realizar con arrays abarca las siguientes operaciones:declaración,creación,inicialización y utilización. Las operaciones de declaración,creación e inicialización son necesarias para poder utilizar un array.

Page 180: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 180/482

Page 181: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 181/482

 Arrays 165

Regla:Se pueden combinar la declaración y la creación de un array con una

sola sentencia.

tipoDa to n = new tipoDa to[tamaño];

tipoDa

to nombreArray[ ] = new tipoDa to [tamañ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 ;

Pr ecauci ón:Una vez que un array se ha creado su tamaño no se puede modi-

ficar.

7.2.3. Inicialización y utilización

Cuando se crea un array, a los elementos se les asigna por defecto el valor cero paralas variables numéricas de tipos de datos primitivos,’ u

O O O  para variables detipo carácter, char , f al se para variables lógicas, bool ean, y nul l  para varia-

 bles objetos. A los elementos del array se accede a través del índice. Los índices delarray están en el rango de O a t amaño- l . Así, m L i s t a contiene 8 elementos ysus índices son O , 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 cero

y termina en tamaño-i.

Precaución:Al contrario que en otros lenguajes de programación, los índicessiempre se encierran entre corchetes:

temperaturas i s ];

Page 182: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 182/482

166

Java2.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 array mi Li

st a que consta de cinco elementos.

Cálculo del tamaño

El tamaño de un array se obtiene con una variable instancia l engt h. Así, por ejem- plo, si se crea un array m l i s t a , la sentencia m L i s t a . l engt h devuelve eltamaño del array m L i s t a (10, por ejemplo).

Utilización de los elementos del array

Las variables que reperesentan elementos de un array se utilizan de igual forma quecualquier otra variable. Por ejemplo:

int[l = new int[50];

int 1 = O,  j = O;/ / .. .

 j =n [ l ]

+ n[ 10] ;

Algunas sentencias permitidas en Java:

1. t emper at ur a[ 5] = 45;t emperat 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 emperat 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] ) ;

Regl as:

temperaturaí n+3 I

= 45;

valor de la variable de índiceíndice-

(elemento del array)

nombre del array

Page 183: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 183/482

 Arrays 167

Se pueden procesar elementos de un array mediante bucles (por ejemplo, f o r )

 por las siguientes razones:

Todos los 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 de un array se conoce, por lo que el bucle mas idóneo es f o r .

Ejemplo

1 . El bucle f o r siguiente introduce valores en los elementos del array. El tama-ño del array se obtiene en m l i s t a . l engt h.

for ( i n t i = O; i < m L i 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 un poco más complicado. Por ejemplo, la siguiente sentencia declara un array de 10

objetos Ci 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 cul o [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 cul o ( );

Representación gráfica

Crear un array de objetos Per sona (clase Persona) .

P e r s o n a [ ] p = newPer sonaL51;

Page 184: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 184/482

168 Java2.

Manual  de programación

2 def : ne L X array deobl etos

de t i po Per sona , q u e  puede conrener 5 o~: et os

Se crea UII array de o o j e t o s

Persoza

~

I new Persona)

Se neceSAt a crear l osob - et os de. array

. - - A

Figura 7.3. Creación de un array de objetos.

Persona\

Figura 7.4. Estructura completa del array.

Crear un array de 50 objetos pertenecientes a la clase Raci onal .

La clase Raci onal representa los números racionales.

Un número racional esun número con un numerador y un denominador de la forma n / d ; por ejemplo,1

/

, 2/

7

y 3 / 4 . Un número racional no puede tener un denominador de valor O.

Los enteros son equivalentes a números racionales de denominador 1, es decir,n / l . El siguiente programa crea un ar r ayRac i ona1, que se compone de 50objetos Raci onal , lo inicializa con valores aleatorios y a continuación invoca almétodo suma ( ) para sumar todos los números racionales de la lista.

 public c lass Pr uebaAr r ayDeObj et os

 public 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 ayRac i ona1

Page 185: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 185/482

 Ar rays 169

Raci onal [ ]

ar r ayRaci ona1 = new Raci onal [501 ;

/ / i ni c i al i z ar ar r ayRac i ona1

Sys t em out pr i nt l n( "Los númer os r aci onal es son " ) ;

for ( i n t = O; i < ar r ayRac i onal . l engt h; it+)

i

ar r ayRaci ona1

[]

= new Raci onal (

( i n t )( Mat h.r andom( )50),

Sys t em out . pr i nt ( ar r ayRac i onal [ i ]+" " ) ;

l +( i n t )Mat h. r andom( ) * l O) ) ;

}

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

" ) ;

/ / cal cul ar y vi sual i zar el r esul t adoSys t em out . pr i nt l n

( "La suma de l os númer os r aci onal es es" +

suma ( ar r ayRac i ona1) ;

1

 publ ic s t a t i c Raci onal suma( Raci onal [ ] a r r ayRac i ona1)

t

Raci onal suma = new Raci onal ( O, 1) ;for ( i n t

= O; i < ar r ayRac i onal . l engt h; i ++)

r et ur nsuma;suma = s ama. add ( a r r ayRac i ona1

[ ] ) ;

Observaciones

1. El programa crea un array de 50 objetos Raci onal y pasa el array al méto-

do suma ( ) ,que suma todos los números racionales del array y devuelve su

suma.2. Los números racionales se generan aleatoriamente utilizando el método

Mat h. r andom( ) .3. Precaución. Se ha de evitar un denominador O ;  para ello se puede añadir al

denominador un 1.

7.4. COPIA DE ARRA YS

Con frecuencia se necesita duplicar un array o bien una parte de un array. Existendos métodos para copiar arrays: copiar elementos individuales utilizando un bucley utilizar el método ar r aycopy.

Método 1

Un método para copiar arrays es escribir un bucle que copia cada elemento desdeel array origen al elemento correspondiente del array destino.

Page 186: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 186/482

170 Java 2 . Manual de programación

Ejemplo

El siguiente código copia ar rayFuente 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 si los elementos del array son objetos.

Método 2

Los inconvenientes anteriores se resuelven usando el método Syc tern. array-copy ( ) que copia arrays en lugar de utilizar un  bucle y que tiene el siguiente for -mato:

publ i c st at i c voi d ar r ayc opy( j ava. i ang. 0bj ec t

a r r a y r u e n t e , i nt p o s n;, l ava. ang. 0bj ec t arrayCesti,?o,

i nt pos -fin, i nt length)

, .

La sintaxis del método ar 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] ;

Syct er n. arr aycopy( ar r ayFuent e, 0,

ar r ayDect i no,

3, ar r ayFuent e. l engt h) ;

~ ~ ~

Not as:1. El método arraycopy

( )  puede copiar cualquier tipo (tipo primitivo o

tipo Ob] ec t ) de elementos del array.

2. En Java, se pueden copiar tipos de datos primitivos utilizando sentencias deasignación, pero no objetos ni arrays completos. La asignación de un obje-

to a otro objeto hace que ambos objetos apunten a la misma posición dememoria.

Page 187: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 187/482

 Arrays 171

7.5.  A RRAYS MULTIDIMENSION AL ES

Las tablas o matrices se representan mediante arrays bidimensionales. Un array

h en Java se declara como un array de objetos array.

tipo nombre [] [ 3 ;

Las tablas de valores constan de información dispuestaenf i las

y columnas. Paraidentificar un elemento de una tabla concreta se deben especificar los dos

subíndi-

ces (por convenio, el primero identifica la fila del elemento y el segundo identificala 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) Dos dimensiones (bidimensional).

La Figura 7.6 ilustra un array de doble subíndice, a, que contiene tres filas y cua-

tro columnas (un array de 3 x 4). Un array con rn filas y n columnas se denominaa

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 contres filas y cuatro columnas.

Page 188: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 188/482

Page 189: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 189/482

int b [ ][ ; ;b = new int[3]

j ; / / asi gna f i l a sb [ O ]

= newi n t [ 5 ] ; / / as i gna 5 col umnas a l a f ; l a

O

b [ l ] = newint[4]; / / as i gna 4 col umnas a :a

f i l a 1

b [ 2 ] = newint[3]; / / as i gna 3 col umnas a

;a

f i l a2

La expresión  b . l engt h devuelve el número de filas del array, mientrasb

[

1] .l engt h devuelve el número de columnas de la fila 1 del array.

Ejemplo

Declarar y crear una matriz de 5x5

intr;

I

m:riz

= new int[5]

5 1 ;

O

 bien

int mat r i z [ ] [ I = new int[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 valores a un elemento específico se puede hacer con sentencias

similares a:

mat r i z [ 2] [ O ] = 3;

Un medio rápido para inicializar un array de dos dimensiones es utilizar bucles f o r :

t abl a[ x]

[y] = 5;1

Page 190: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 190/482

Page 191: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 191/482

Page 192: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 192/482

Page 193: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 193/482

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 el applet (vea el Capítulo 11, ((Appletw), será necesario:

1 . Su compilació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 modificador target 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 del JDKcon la que el applet ha sido compilado. Así, con el jdkl.4se emplea

C: \ l i br o\ T ema07>j avac - target 1. 1 Appl et Tabl al . j av a

con la finalidad de que el applet  pueda ser ejecutado por los navegadores(browsers) habituales.Otra forma más adecuada para que un applet complilado en la versión 1.4 deljdk pueda ser ejecutado por los browsers habituales consiste en utilizar Plug -in(veáse el Apéndice F, ((Contenido del CDD)

 2 . Crear un archivo A t 1.h t m l con el siguiente contenido:

 Archivo  HTML ( At l . ht ml )

<HTML>

<APPLET

W DTH=350

HEI GHT=300

code=l i br o. Tema07. Appl e t T abl a l . c l a s s>

</ APPLES>

</ FI TML>

Al abrir la página, usando por ejemplo Microsoft Internet Explorer, el a secarga y ejecuta automáticamente. La salida obtenida se muestra en la Figura 7.7.

Page 194: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 194/482

Page 195: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 195/482

 Arrays 179

7.7.S E L E C C I ~ N

El algoritmo de ordenación por selección de un array con n elementos tiene los

siguientes pasos:1 .

Encontrar el elemento menor del array.2. Intercambiar el elemento menor con el elemento de subíndice

1.

3. A continuación, buscar el elemento menor en la sublista de subíndices 2 . . n,e intercambiarlo con el elemento de subíndice 2 . Situándose, por tanto, elsegundo elemento menor en la posición 2.

4. Después, buscar el elemento menor en la sublista 3 . .n, y así sucesivamente.

Por ejemplo, dada la siguiente lista 7 48

1 1 2 .Se compara a [i

] con los siguientes elementos:-7 4 8 1 12-4 I 8 1 12-

4 7 8 12-1 I 8 4 12

con lo que el elemento menor queda seleccionado en a [ i ]

Se compara a [ 2 j con los siguientes elementos:- 8 4 12- 8 4 12

-4 8 7 12con los que el elemento menor queda.seleccionado en a [

2

]

.

Se compara el elemento a 13

] con los siguientes:-

8 7 i 2-7 8 12

con lo que el elemento menor queda en a[3].

Se compara el elemento a[4] con los siguientes:-8 1 2

con lo que el array quedaría 1

4

l a 12.

También se podría buscar el elemento mayor y efectuar la 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 args )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;

fo r ( i n t  j =i+ l ;

1

<

a. l er g t h;

j ++)

Page 196: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 196/482

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 ( sort) se basa en comparar elementos adyacentesdel array e intercambiar sus valores si están desordenados. De este modo se dice quelos valores más pequeños

b

hacia la parte superior de la lista (hacia el pri-mer elemento), mientras que los valores más grandes se hunden hacia el fondo dela lista.

Si se parte de la misma lista que en el 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 8

4 17

8

4 1 7

14

7quedando el 7 en tercera posición:

1 4 -

quedando el cuatro en la segunda posición:

quedando el12

al final de la lista:

quedando el 8 en penúltima posición:

7

1 -4

con lo que la lista resultante sería 1 4 7 8 12.

Codificación

 pub l i c c l a s sPr uebaB

t

 pub l i c s t a t i c void mai n ( St r i ng ar gs)

i n t a [ ; =

{7, 4, 8, 1, 12};

f o r ( i n t i = 1; 1 <

a. l engt h; i ++)

Page 197: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 197/482

 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 or ( i n ti = 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 ini-ciales en el array es:

 publ ic c l a s sPr uebaBOp

t

publ i cs t a t i cvoi dmai n ( St r i ng[ ] args)I

i n t a [ ] = {7, 4, 8, 1, 12};

i n t i = 1;bool eanor denado;do

i

or denado = t r ue;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;

intauxi = a [ j l ;

a [ j l

=a[ j +l l ;

a[ j +l ] = auxi ;1

i ++;

1while ( or denado == false);

/ /Pr esent aci ón del 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 clasi-ficar sus cartas, donde el jugador va colocando, insertando cada carta en su posicióncorrecta. Por tanto, el método se basa en considerar una parte del array ya ordena-

Page 198: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 198/482

Page 199: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 199/482

Page 200: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 200/482

184 Java 2.Manual  de programación

Como hay intercambio entre a [3 ] y a [4

] se retrocede para comprobar que no se ha estropeado la orde-nación entre a [2 3 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 todos los elementos con un salto o intervalo de uno y el saltoya no puede ser menor.

Codificaciónp u b l i c c l a s s Pr uebaCh

publ i cs t a t i cvoi dmai 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 l e 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 l e( j >=

O)i

k =j

ts al t o;i f a [ j ]

<= a[ k l )

el seI

 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 adosf or ( i = O; i

< 5; i ++)

Cys t em out . pr i nt l n( a[ i l ) ;

!

Page 201: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 201/482

Page 202: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 202/482

Page 203: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 203/482

 Arrays 187

el se

r e t u r n ( c e c t r a 1 ) ;

i

publ i c i ntbús q üeda B( i nt [ ] a, i n t

c )

r et ur n( b~squecaB1: i ar ; a ( a , , a . l e ng~h ,

) ;

i

1

publ i c cl assCl ass1

i

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

pr :n t ( " El el ement o 1 est a en " ) ;

Sys t e m out . pr i nt l n ( " l a pos i 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 a posi c i ón + Mat h. abs ( p )) ;

I mpor t ant e:La búsquedabi nar i aesmucho másef i ci ent eque l al i neal ,peror equi er equel osel ement osseencuent r encol ocadosenelarrayde f orma orde-nada.

Page 204: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 204/482

Page 205: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 205/482

Page 206: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 206/482

Page 207: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 207/482

 Arrays191

El  programa de  prueba podría ser:

 publ ic c l a s sPr uebaT

I

publ i cs t a t i cvoi d i d i n ( St r i ngI

args ) t hr owsEx cept i c r

i

Enc er o[ : a = new Znt er o[ 7] ;

a [ u ]

= new Ent er o( 6) ;

a[:]

= new Ent er o( 1) ;

a [ 2 ]

= newEnt er o( 4) ;

a [ 3 ]

= new Ent er o( 7) ;

a [ 4 ] = new E n t e r o ( ? ) ;

a [ 5 ]

= newEnt er o( [ >) ;

a[ 61

= new E r t e r o ( 3 ) ;

Met cr d o r d e n a d c r

=

newY e t o r d o

;

or der ador . s el ec ci or

( a ,) ;

for (int

1 = O; 1 < a. , ~qgt h;

I ++)

Sys t e m. out . pr i nt l ní a[ i ] . val or ) ;1

Page 208: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 208/482

Page 209: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 209/482

Page 210: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 210/482

Cadenas y fechas 195

La cadena así creada se coloca en un lugar especial reservado para las mismas y,si posteriormente se crea otra cadena con el mismo literal, no se añade un nuevoobjeto a dicho espacio, sino que utiliza el objeto existente, al que añade una nuevareferencia.

Ejemplo

Las siguientes líneas de código producen el resultado que se muestra en la Figura 8.1:

St r i ng ci udad = "Madr i d" ;

St r i ng m ci udad

= "Madr i d" :

_ . Ambas r ef er enci as amput an almi smo l i t er al f í si co en elespaci o r eser vado par a el

~~

_ _ ~ al macenami ent o de l i t er al esSt r i ng

ci udad7:

Madrid

mi ci udad

Figura 8.1. Creación de cadenascon el mismo literal.

Otra forma de crear cadenas es usar un constructor explícito, por ejemplo:

char a r r[ = {

' H ,o ' ,

' 1' ,

' a '} ;

St r i ng sal udo = new C; r i ng( ar r ) ;

Esta última sentencia coloca un objeto St r i ng en elm (

en lugar desituarlo en el espacio reservado para las cadenas anteriormente comentado. Entre losdiversos constructores que posee la clase S t r i n g pueden destacarse los siguientes:

 public St r i ng ( )

 public St r , c g( c har [ ] arr)

 public Ct r i ng( j ava. ang. St r i ng cad )

 publicSt r i r . g ( j

ava .a = g .

St r i ngsuf ferbuffer)

Crea un objeto St r i nq sin

caracteres.

Crea un objeto s r r i ng a partir de un array decaracteres.

Crea un St r i ng con losmismos caracteres que otroobjeto St r i ng, es decir.realiza una copia.

Crea un objeto St r i ng conuna copia de los caracteresexistentes en unCt r i ngBuf f er , que es unacadena dinámicamenteredimensionable.

Page 211: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 211/482

Page 212: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 212/482

Page 213: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 213/482

Page 214: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 214/482

Page 215: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 215/482

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 por Java

 para el almacenamiento de literales St r i ng.

emplearse el métodoCuando se desean ignorar las diferencias entre mayúsculas y minúsculas, debe

 public booleanequal sI gnor eCase

( j ava.1ang. St r i ng otracad)

y, por tanto, la ejecución de las siguientes líneas de programa

if ( "ANA" . qual s I 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 eCase son métodos habitualmen-te utilizados en los programas que necesitan ordenar arrays de cadenas.

Otra forma de comparar cadenas es utilizar el método compar eTo, cuyo for -

mato es el siguiente:

 public int compar eTo ( j ava. l ang. St r i ng

otraCad)

Este método devuelve O cuando las cadenas son iguales, un número negativo si elobjeto St r i ng que invoca a compar eTo es menor que el objeto St r i ng que se le

 pasa como argumento y un número positivo cuando es el argumento el que es mayor.

Ejemplos

I . St r i ng cadl = newSt 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 ad1

t es menor que + c ad2) ;

Cys t em out . pr i nt l n( c ad1 t es i gual quet

c ad2) ;

Sys t em out . pr i nt l n( c ad1 +

es mayor que +c ad2) ;

el resultado es

La cadena Ana es menor que Anast asi a

Page 216: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 216/482

Page 217: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 217/482

Page 218: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 218/482

Cadenas y fechas 203

 Nota: e fe renc i a un carácter fuera de los límites de una cadena S t r i n g , esdecir, con índice negativo o mayor o igual al tamaño del St r i ng, produceuna St r i ngI ndexOut Of BoundsExcept i on.

2. / p u b l i c char c h a r A t ( i n t i n d i c e ) l

Devuelve el carácter de la cadena que se encuentra en la posiciónespecificada mediante el parámetro indice, lo mismo que en elcaso de los arrays se considera que el primer carácter de unacadena se encuentra situado en la posición cero y el último enl engt h ( )-1.

Ejemplo public class Ej c har At

 public s t a t i c voidrnair. ( S t r - n g [ ] a rgs )

I

St r i ng cad1 =

new St r i ng ( " A N A " ) ;for

( i n t i

= O ; I cadl . ; engt k. ( ) ;

i t t )

C y s t e m . o u t . p r i n t i n ( c a S l . c h a r A t ( l ) ) ;

i

1

h p r i t w

e t i

p r i r i t c i l l c i

AN

A

3U.

/ p u b l i c

j ava. l ang. St r i ng subst r i ng ( i n t

i ' i c i ü ,

i n tZ:R)~

36.  public  j ava. i ang. St r i nq s ubs t r i ng ( i n t i n i c i o )

El método subst r i ng  permite extraer una subcadena de una cadenay puede ser invocado con el paso de uno o de dos parámetros aelección del programador. Si se especifica un parámetro el métododevuelve una nueva cadena que comienza donde indica i ni ci oy se extiende hasta el final de la misma; si se especifican dos. lanueva cadena estará formada por los caracteres existentes en la cadenaoriginal entre la posición i ni ci o y la f i n - 1 , ambas inclusive.

 public class Ej s ubs t r i r , gs

I

Page 219: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 219/482

204 Java 2. Manual de programación

 public 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

< c adl . 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 ) ) ;

- r i me en pantal l aAN

A

4.

l pub l i c

cn a r [ ] t oCharA r ray ( )

Devuelve un array de caracteres creado a partir del objeto S t r i n g .

Ejemplo

 public c l a s s Ej t oChar Ar r ay

 public s t a t i c void 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 [ ; ar 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' ) ) ;

i

en pantallaHOLAhol a

Observaci ón:El método l ength() devuelve la longitud de una cadena

mientras que la variable l engt h de un array informa sobre la longitud delmismo:

cadl . l engt h( )

;

ar r . l engt h;

Page 220: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 220/482

Cadenas y fechas 205

5.  public booleanr egi onMat ches

(boolean ignoraDif, int iniciol ,

 j ava. l ang. St r i ng otracad,

intinicio2,

int cuantos)

Compara una parte de una cadena con parte de otra y devuelve un resultado b o o l e a n . Si el primer parámetro es t r u e , no distingue entre mayúsculas yminúsculas. El significado de los restantes parámetros es:

i n i c i o l , posición en la que comienza la comparación para la cadena queinvoca al método.o t r a Cad, la segunda cadena. i n icio2  posición de la segunda cadena enla que empieza la comparación.c u a n t o s número de caracteres a comparar.

6.[public booleanendc W t h( j av a. 1ang. St r i ng

sufijo)

Devuelve t r u e cuando la cadena termina con los caracteresespecificados como argumento.

7.lpublic boolean s t a r t s W t h( j ava. l ang. St r i ng prefijo)l

Devuelve t r u e cuando la cadena comienza con los caracteresespecificados como argumento.

8U.l public inti ndex of

(int car)]

8

 public inti ndex of ( j ava. l ang. St r i ng cad)

Estos métodos buscan la cadena o carácter especificados como parámetrosen la cadena fuente; y cuando los encuentran, interrumpen la búsqueda,devolviendo la posición donde aparece el carácter o donde comienza la cade-na buscada en la cadena fuente. Si no encuentran el carácter o cadena bus-

cados, devuelven -1,

i ndexof  podría utilizarse para comprobar si la opción elegida en un menúde opciones es válida.

importj ava. i o. * ;

 public classVer i f i c aOpc i on

i

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

Page 221: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 221/482

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;

try

i

Sys 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 " ) ;do

t

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

1

1

cat ch ( Except i on e)t }

9. l publ i c j ava. l anq. St r i nq r epl ace ( char ol dc har , char newChar ) l

Devuelve una nueva cadena resultante de reemplazar todas las aparicionesdel

ol dchar

con elnewchar .

1O. I pubi i c j ava. l ang. s t r i ng t r i m0

I

Elimina los espacios en blanco que pudieran existir al principio o final de

una cadena.11. l pubi i c j ava. i ang. s t r i ng t oLower Case

0

Convierte a minúsculas las mayúsculas de la cadena.

Page 222: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 222/482

Page 223: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 223/482

Page 224: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 224/482

Cadenas y fechas 209

Cadena a analizar en el ejemplo( 31. 4+5 2̂)

7.3

Cadena delimitadora que se estableceI l + - * / A

( ) I 1

Salida en pantalla

(

31. 4

52

+

 A

I

*7.3

import j a v a . u t i l . * ;

publ i cc l as sj St r i ngTokeni z er

t

pr i vat es t at i cSt r i ng[ ] expr es i onDi vi di da;

pr i vat est at i cSt r i ng

[

di vi de ( St r i ng cad)t

St r i ngTokeni zer s t 2 = new St r i ngTokeni zer ( cad,

i nt cont = O;whi l e

( st 2. asMor eTokens ( )

i

"+ - * / " ) ' I , true) ;

cont++;s t 2. nex t T ok enO;

1

St r i ngTokeni zer s t = new St r i ngTokeni zer ( cad,

St r i ng[ ] aux = newSt r i ng[ c ont ] ;

f or( i n t =O; i <aux. l engt h; i ++)

r et ur nux;

"+- * / ( ) , t r u e ) ;

aux[ i ] = s t . next Token( ) ;

1

publ i cs t at i cvoi dmai 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 or ( i nt =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 CLASE StringBuffer

 AI igual que S t r i n g , la clase St r i ngBuf f e r también pertenece al paquete j a v a. l a n g y ha sido declarada como f i n a l ;  pero a diferencia de los objetos

S t r i n g , con los que se necesita reservar una nueva área en memoria para crear unanueva versión, los objetos Str ingBu f f er son modificables, tanto en contenidocomo en tamaño.

 publicf inai

class St r i ngBuf f er ext endsObj ect i ql ement sSer i al i zabl e

Page 225: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 225/482

Page 226: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 226/482

Cadenas y fechas211

publ i c synchr oni zed j ava. 1ang. St r i ngBuf f er append( char c)

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( doub1e d)

publ i c j ava. 1ang. St r i ngBuf f er append( f 1oat f)

publ i c j ava. 1ang. Ct r i ngBuf f er append( i nt

i)

publ i c synchr oni zed j ava. 1ang. Ct r i ngBuf f er append( 1ong 1)

publ i cj ava. l ang. St r i ngBuf f er append( j ava. l ang. 0bj ec t

obj)

publ i c j ava. 1ang. St r i ngBuf f er append( j ava. l ang. St r i ng cad)

Los métodos append añaden al final del St r i ngBuf f er la cadena resultante de latransformación del correspondiente argumento.

publ i cj ava. 1ang. St r i ngBuf f er i ns er t ( i nt

desplazamiento,

bool eanb)

publ i c synchr oni zed j ava. l ang. St r i ngBuf f er i ns er t ( i nt

desplazamiento,

charc

publ i c synchr oni zed j ava. l ang. St r i ngBuf f er i ns er t ( i nt

desplazamiento, 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 er i nsert ( i n t desplazamiento, doubl e d)

publ i cj ava. 1ang. St r i ngBuf f er i nser t ( i nt

desplazamiento, f l oat f)

publ i c j ava. 1ang. St r i ngBuf f er i ns er t ( i nt desplazamiento, i n t i)

publ i cj ava. 1ang. St r i ngBuf f er

i nser t( i n t

desplazamiento, l ong 1)

publ i c synchroni zedj ava. l ang. St r i ngBuf f er i ns er t ( i nt

desplazamiento, j ava. l ang .Obj ect obj)

publ i c synchroni zedj ava. 1ang. St r i ngBuf f er i ns er t ( i nt

desplazamiento, j ava. 1ang. St r i ng cad)

Los métodos i nser t colocan distintos tipos de datos, previamente transformados a

cadena, en una determinada posición del St r i ngBuf f er .

publ i c synchr oni zedj ava. 1ang. St r i ngBuf f er del et e( i nt

inicio,

i nt fin)

Page 227: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 227/482

Page 228: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 228/482

Cadenas y fechas 21 3

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 objeto Dat e en una cadenade caracteres.

 public long get Ti r ne ( ) Devuelve el número de milisegundostranscurridos desde una fecha arbitraria. 1

de enero de 1970.

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. LOSFORMATOS

DE FECHAS

Los formatos especiales para las fechas se establecen mediante la clase Dat eFor matdel paquete j ava .text y se crea un objeto,formateador. For mat es la clase baseen el formate0 de información sensible a la localidad, como fechas y números.

 public abs t rac t c lass For mat extends Obj ect implements

Ser i al i zabl e, Cl oneabl e

y Dat eFor mat extiende For mat .

 public abst ract c la ss Dat eFor mat extends For mat

Los métodos

 public 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 a nc e 0

Y

 public 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 crear unformateador con el estilo de formato local.

Ejemplo

import j a v a . u t i l . * ;

import 1ava. t ext . Dat eFor r nat ;

Page 229: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 229/482

Page 230: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 230/482

Page 231: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 231/482

Page 232: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 232/482

Page 233: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 233/482

218 Java 2. Manual de programación

~~

Las interfaces Gráficas de Usuario ( IGU)' ofrecen objetos visualessobre los cuales pueden los usuarios actuar y de esta forma comu-

nicarse con un programa. En la versión 2 de Java, la bibliotecadenominada Java Foundation Classes proporciona un conjunto declases destinadas al diseño de interfaces gráficas, entre las que,conjuntamente con las de j ava .awt , dest acan l as per t eneci ental paquet e javax. s wing . Los componentes Swing se ejecutanuniformemente en cualquier plataforma y constituyen una mejorasobre los del awt aunque no siempre los reemplazan. Los compo -nentes de las IGU (botones, campos de texto, etc.) esperan a queel usuario ejecute alguna acción sobre ellos; es decir, esperan unevento (o suceso). Por eso se dice que la programación con IGUes una programación dirigida por eventos. La gestión de eventos

se verá con mayor profundidad en el capítulo diez.

AWT(Abstract W Toolkit) es un paquete en el que se encuentran clases capa-ces de crear componentes de la IGU (GUI); es decir, clases capaces de crear obje-tos visuales sobre los cuales pueden los usuarios actuar, mediante el empleo delratón o el teclado, para comunicarse con el programa, sustituyendo, por tanto,dichos objetos la

entradahalida

clásicas. El aspecto de estos componentes puedevariar de una plataforma a otra, ya que existe una vinculación con la IGU local.

Los componentes de la IGU (botones, campos de texto, etc.) se organizan encontenedores y esperan hasta que el usuario ejecute alguna acción sobre ellos, esdecir, esperan un evento (suceso). Por eso se dice que la programación IGU es una programación dirigida por eventos. Para el diseño de este tipo de programas esnecesario considerar, como se acaba de indicar, que las interfaces gráficas estánconstruidas por elementos gráficos denominados componentes agrupados dentro deotros que se denominan contenedores,  pero además hay que tener en cuenta que loscontenedores son a su vez componentes y pueden volver a ser agrupados en otroscontenedores. Habitualmente en un contenedor habrá varios componentes y parasituarlos de forma conveniente pueden usarse los administradores de diseño.

En ingles, G U.yerI

  C U I )

Page 234: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 234/482

Page 235: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 235/482

Page 236: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 236/482

Page 237: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 237/482

Page 238: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 238/482

Interfaces gráficas de usuario 223

Por la aplicación, que invoca al método r epai nt , considerando que éste, indirecta-mente, a través de updat e llama a pai nt .

 public void r epai nt ( )

Es el método que permite a las aplicaciones, mediante invocaciones a dicho método sobre

los componentes, ordenar la repintura de los mismos. Este método hace que el intérprete eje-cute una llamada al método updat e, que en su implementación por defecto llama al méto-do pai nt . El formato mostrado es el básico.

Figura 9.1. Jerarquía de clases.

Page 239: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 239/482

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 repintar, para que el proceso sea más rápido cuando

no

se necesita vover a pintar todo el área.

 public void r epai nt (long pl)

El parámetro especifica el máximo de milisegundos que pueden pasar antes de llamar almétodo update.

 public void r epai nt (long pl, intp2,

intp3,

intp4,

intp5)

Formato de r epai nt en el que se especifica tanto el tiempo como las dimensiones del áreaa repintar; pi y p2 son las coordenadas de la esquina superior izquierda, p3 la anchura yp4

la altura.

 public voidupdat e( j ava. awt . Gr aphi cs  pl)

Este método posibilita repinturas incrementales. AI igual que pai nt recibe como paráme-

tro el contexto gráfico del objeto al que pertenece y se invoca automáticamente cuando unaaplicación llama al método r epai nt . Cuando no se sobreescribe, el método updat e borra el contexto gráfico rellenando el fondo con el color de fondo por defecto y llama acontinuación a pai nt  para que dibuje de nuevo; estas operaciones hacen que se origine un

 parpadeo. Una forma de evitar esto essobrescribir updat e  para que no borre el contexto

gráfico; por ejemplo, escribiendo enél

una simple llamada a pai nt .

Todos los elementos de la interfaz de usuario que aparecen en pantalla e inte-ractúan con el usuario son subclases de Component (Fig.

9.1).

9.4. LA CLASE Container

Cont ai ner es una subclase abstracta de Component que contiene métodos adi-cionales que van a permitir a los contenedores almacenar objetos Component .

Not a:Los objetos Cont ai ner también son Component y, por consiguiente,

resulta posible anidarContai ner .

Los componentes se colocan en los contenedores empleando el método add dela clase Cont ai ner y los administradores de diseño acomodan los componentesen el contenedor e intentan reajustarlos cuando el usuario redimensiona dicho con-

tenedor. Los administradores de diseño se asocian al contenedor mediante el méto-do set L ayout . El formato de los métodos citados es:

 publicj ava. awt . Component add( j ava. awt . Cor nponent

pl)

 public void add( j ava. awt . Cor nponent pl, j ava. l ang. 0bj ec t p2)

 public j ava. awt . Component add( j ava . l ang. Ct r i ng pl,

 public voidset Layout ( j ava . awt . Layout Manager

pl)

j ava. awt . Component

p2)

Page 240: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 240/482

Interfaces gráficas  de usuario 225

Los principales administradores de diseño son: Fl owLayout , BorderLayouty Gr i dLayout .

9.5. VENTANAS

La clase Wi ndowhereda de Cont ai ner y contiene métodos para manejar venta-nas. Fr ame y Di al og extienden Wi ndow y Fi l eDi al og extiende Di al og,

 pudiéndose obtener así cuatro tipos básicos de ventanas:

Wi ndow

Fr 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ítulo y una barra de menús asociada.Ventana de diálogo con borde y título.Ventana de diálogo especializada en mostrar la lista de archivos de un directorio.

9.5.1. Clase Frame

En las aplicaciones IGU se emplea Fr ame como contenedor más externo, siendoBor der Layout su administrador de diseño por defecto. La clase Fr ame tiene lossiguientes constructores:

 public Fr ame( )

Crea una ventana estándar sin titulo. public Fr ame ( java. l ang.St r i ng  p i ) Crea una ventana con el titulo especificado.

El métodopublicsynchronizedvoidsetTitle

( j ava. l ang.St r i ngpl ) permite cambiar el título de un marco.

Figura 9.2. Marcos sin y con barrade menús.

Las dimensiones de una ventana tienen que ser establecidas después de que éstaha sido creada, y  para ello se utiliza el método public void setSi ze (int

pl, int p2) de  j ava .awt . Component . Además, las ventanas Fr amenecesitan que se las haga visibles, para lo que se emplea el método public voidset vi si bl e (boolean pl) de j ava. awt .Component .

Page 241: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 241/482

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 usuario efectúe

clic sobre el botón de cierre de la mismam.

La pulsación de este botón genera unsuceso que puede ser detectado por el oyente Wi ndowLi st ener del paquete j ava .awt .event ,  para ello se instancia y registra un 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 suplante y redefina el méto-

do wi ndowCl os i ng de Wi ndowAdapt er realizando la acción adecuada, que, para el contenedor más externo, es salir al sistema.

cl assRecept orEvent o

ext ends Wi ndowAdapter

publ i c voi d wi ndowCl os i ng( W ndowEvent e)

Syst em exi t O) ;

Wi ndowAdapt er es una clase que proporciona implementaciones vacías delos métodos presentes en Wi ndowLi st ener y que resulta conveniente utilizar,

 pues evita tener que codificar los muchos métodos que requiere el uso de dichainterfaz.

WindowListener

publ i c abst ract voi dwi ndowAct i vat ed( j ava. awt . event . W ndowEvent pl)

publ i c abst r act voi d wi ndowCl osed( ] ava. awt . event . W ndowEvent pl)

publ i c abst ract voi dwi ndowCl os i ng( ~ava. awt . event . W ndowEvent

pi )

publ i c abst ract voi dwi ndowDeact i vat ed( j ava. awt . event . W ndowEvent pl)

publ i c abst ract voi dwi ndowDei coni f i ed( j ava. awt . event . W ndowEvent

pl)

publ i c abst ract voi dwi ndowI coni f i ed( j ava. awt . event . W ndowEvent pl)

publ i c abst r act voi dwi ndowOpened( j ava. awt . event . W ndowEvent

pl)

Page 242: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 242/482

lnterfaces gráficas de usuario 227

Los tipos Wi ndowEvent se generan cuando una ventana cambia de estado y se procesan por los objetos que implementa la interfaz Wi ndowLi st ener .

Ejemplo

Un ejemplo de Fr ame que utiliza Gr aphi cs y  permite el cierre de la ventana dela aplicación usando Wi ndowAdapt er es Ej Mar co.

I

Bienvenido ai A WT

Figura 9.3. Escribiren un marco.

import j ava. awt . * ;

i mpor t ava. awt . event . * ;

publ i cc l as sEj Mar co ext endsFr amei

 public s t a t i c void mai n( St r i ng a r g s [ ] )

t new Ej Mar co( );

publ i cEj Mar co ( )

t

addW ndowLi st ener ( newCi er r e ( ) ;

s et T i t l e ( " Mar co" );set s i ze ( 200, 100);set vi s i bl e ( t r ue);

1

publ i c voi dpai 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 F ont ( l et r er o);g. dr awSt r i ng( " Bi enveni do al AWT", 42, 60);

1

c l as sCi er r e ext endsWi ndowAdapt erI

publ i c voi di ndowCl os i ng ( Wi ndowEvent e)

i

I

Cys t em exi t ( O );

1

Page 243: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 243/482

Page 244: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 244/482

hter faces

gráficas de usuario 229

9.5.2. Clase Dialog

Los cuadros de diálogo son  parecidos a las ventanas Frame, excepto porque no sonel contenedor más externo, sino ventanas hijas de otras de nivel superior, y además notienen barra de ineiiús. Estos objetos pueden ser redimensionados, desplazados ycolocados en cualquier lugar de la pantalla, no estando su posición restringida al inte-rior de la ventana padre, pero no pueden ser maximizados ni minimizados.

Figura 9.4. Cuadrode diálogo.

A veces, cuando se muestra un cuadro de diálogo, lo que se persigue es que elusuario introduzca o tome alguna información y 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 otras

ventanas mientras se exhibe el cuadro de diálogo. Los constructores son:

 public Di al og( 1

av a. awt . Fr ame p l )

El  paráinetro pl 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 que p2  permiteespecificar si va a ser o no un cuadro de diálogo modal.

 public Di a l og( ] ava. awt . Fr ame  pl, j ava. l ang. Ct r i ng p2)

Este formato permite especificar el titulo del cuadro de diálogo que se está creando

 public Di al og( : ava. awt . F raxe pl, j ava. l ang. St r i ng

p2,  boolean p3)

Incluye el título y si es modal o no.

Después de la creación, se puede establecer el tipo de cuadro de diálogo (modalo no modal) mediante el método

 public void set Modal (boolean pl)

Ejemplo

Muestra el funcionamiento de Di al og.

Page 245: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 245/482

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 ) ;

e l Mar co . addW ndowLi s t ener ( new Cer r a r ( ) ) ;

Di al ogo di al ogoNoModa1

= new Di al ogo( el Mar c o,

di al o go NoMo da l . s e t Bac k gr o und( Co l o r . y el 10~) ;

di a l o go No Mo da l . ge t Gr a phi c s 0 ;

/ * 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 ( new Cer r ar ( di a l ogoNoModa1) ) ;

di al ogoNoModal . s et Vi s i bl e( t r ue) ;

Di al ogo di al ogoModa1

= newai al ogo

( e l k l a r c o ,

di ai ogoModal . s et Si z e( 300, i OO) ;

di a l ogoModa l . addW ndowLi s t ener ( new

Cer r ar ( di a l 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 d0 ai 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)

Page 246: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 246/482

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) ;

el se

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 ext endsWi 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

 public voidi ndowc l os i ng( Wi ndowEvent evt )

t

i f ot r o3i ai ogo ! =nul l )

ot r oDi al ogo. di s pos e( ) ;

el seSys t e m exi t ( O ) ;

L l r ; S @

0' 1n

í

u m u

1

i ~ d 8

c c e ú ~ i

01t.35

irF<nlarid:

J

Figura 9.5. Cuadros de diálogomodalesy no modales.

Page 247: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 247/482

Page 248: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 248/482

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 ms g=" " ;

 public Vent ana ( )

t

Fr ame el Mar co = new Fr ame ( );

F i l eDi al og di al ogoAr chi vos = new F i 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 ector 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

= newDi 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 ( new Cer 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 og

I

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. setFont ( l et r er o);g. dr awSt r i ng ( mensaj e,12, 4O) ;

}

Page 249: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 249/482

234 Java 2. Manual de programación

classCerrar2 ext endsWi ndowAdapt er{

Di al ogo2 ot r oDi al ogo;

C e r r a r 2 ( Di al ogo2 unDi al ogo

)

ot r oDi al ogo = unDi al ogo;

i

 public void wi ndowCl os i ng( Wi ndowEvent evt )

I

)

ot r oDi al ogo. di s pos e0;

9.6. CLASE Panel

Los objetos de la clase Panel carecen de barra de título, barra de menús y borde,se emplean para almacenar una colección de objetos a los que de esta forma seorganiza en unidades, no generan eventos y adquieren el tamaño necesario paraque quepan los componentes que contienen. Esta clase es la superclase de Appl ety su administrador de diseño por defecto es Fl owLayout .

Constructores

public Panel ( )

Crea un nuevo panel.

 public Panel(

j ava .awt .Layout Manager pi ) Crea un nuevo panel yestablece un determinadoadministrador de diseño paraél. Por ejemplo:Panel pX = new Panel

( newGr i dLayout ( )

;

Para destacar un panel se establece un determinado color de fondo para él. El panelse coloca en un contenedor mediante el método add y, como él también es un conte-

nedor, se le pueden agregar componentes, incluidos otros paneles, mediante elmétodo add.

9.7. CLASE Label

Label extiende la clase Component y  permite mostrar texto estático, es decir,texto que no puede ser modificado por el usuario, en una IGU. Para crear un rótulocon la clase Label es necesario declarar una referencia y llamar al constructor.

Page 250: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 250/482

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étodo add de la clase Cont ai ner .

add (referencia- 

etiqueta)

I

Figura 9.8. Etiquetas, paneles.Empleode coloresde fondo

para destacarlos paneles.

Page 251: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 251/482

236 Java 2. Manual  de programación

El siguiente ejemplo muestra cómo crear etiquetas y paneles y establecer colores de

fondo.i mport

j ava. awt . * ;

i mpor tj ava. awt . event . * ;

publ i c cl ass Panel es extends Fr amei

publ i c Panel es ( )

t

addW ndowLi st ener ( new Ci er r e30 ) ;

Panel pX

= newPanel ( ) ;

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 stat 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) ;

I

1

cl ass Ci er r e3 ext ends Wi ndowAdapt ert

publ i c voi d wi ndowCl osi ng( W ndowEvent e)t

I

Sys t em exi t

( O);

1

9.8. CLASE Button

Esta clase produce botones con etiqueta que provocan la ejecución de una accióncuando se efectúa clic en ellos con el ratón. La clase But t on define los siguientesconstructores:

Page 252: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 252/482

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 entre los que des-

tacan

publ i c synchroni zed voi daddAc t i onL i s t ener ( j ava. awt . event . Ac t i onL i s t ener  pi)

Añade un receptor de eventos semánticos

publ i c synchr oni zed voi d

r emoveAct i onL i s t ener ( ] ava. awt . event . Act i onL i s t ener

pi )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 L abel ( 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 ejemplo no ejecutan ninguna acción.

i mport  j ava .awt .*;i mport j ava. awt . event . * ;

publ i c cl ass Pr ueba extends Fr amei

publ i c Pr ueba ( )

I

addW ndowL i s t ener ( new Ci e r r e 30) ;

Panel panel Bot ones

= new Panel ( );

for ( i nt i = 1; i < 8 ; ++)

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 stat i c voi d mai n( St r i ng ar gs [ J )

i

Pr ueba vent ana = new Pr ueba ( );

Page 253: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 253/482

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 clase Ci er r e3 ya fue implementada en el Apartado 9.7.

Figura 9.9. Botones.

Aunque la gestión de eventos se tratará en el Capítulo 10, es necesario advertirque, cuando se colocan botones en un contenedor, tienen como objetivo reaccionarante su pulsación. Para que se pueda reaccionar ante la pulsación de un botón hayque enlazarlo a Act i onLi st ener , interfaz definida en awt . event con unúnico método a implementar denominado act i onper f or med,  por lo que nonecesita adaptadores. Este método tiene un parámetro del tipo Act i onEvent , que

 puede informar a través del método getsource sobre el botón que ha sido pulsa-

do, y deberá ser redefinido para establecer la reacción adecuada ante la pulsaciónde un determinado botón. El marco en uso será el responsable de la redefinición delmétodo act i onper f or med.

9.9. CLASE Textcomponent

La clase Text component dispone de ina gran colección de métodos para fa ili-

tar la presentación de texto en un programa IGU, pero no dispone de constructores 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 mostrar al usuario un area de una Única línea,mientras que Text Ar ea  presenta varias líneas. El texto mostrado, tanto en unocomo en otro caso, puede ser editable o no.

Page 254: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 254/482

Interfaces gráficas de usuario 239

Los constructores de Text Fi el d son:

 public  Text Fi el d ( )

Crea un campo de texto por defecto. public  Text Fi el d (int pl)

Crea un campo de texto con  p1

caracteres de ancho, este número de caracteres no define laanchura del campo, pues esto depende del tipo de letra y del administrador de diseño que seempleen.

 public Text F i el d( j ava. 1ang. St r i ng pi)

Crea un campo de texto y lo inicializa con la cadena p 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 a p2

caracteres.

Otros métodos interesantes en el trabajo con campos de texto son:

 public synchronizedj ava. l ang. St r i ng g et T ex t 0

Método de lectura. Obtiene la cadena contenida en un campo de texto.

 public synchronized void s et Text ( j ava. l ang. Ct r i ng  pi)

Método de escritura. Establece el contenido de un campo de texto.

 public synchronized void s el ect ( i nt

pl, int p2)

Selecciona una serie de caracteres comenzando en pi y terminando en p2.

 public synchronized voids el ec t Al 1

( )

Método para seleccionar todos los caracteres pertenecientes a  Text component .

 public synchronizedj ava. l ang. St r i ng get Sel ec t edT ex t 0

Obtiene el texto previamente seleccionado. La selección previa pudo realizarse por la orden

sel ect o directamente por el usuario.

 public synchronized voids et Edi t abl e

(booleanpl)

Controla la editabilidad del campo.

 public voidset EchoChar

(char pl)

Sirve para introducir contraseñas, pues inhabilita el eco de los caracteres, exhibiendo en sulugar el carácter especificado como parámetro.

En los cuadros de texto será necesario tratar el evento que se produce al pulsar

la tecla RETURN. Este tratamiento consistirá en enlazar el campo de texto a la inter -faz Act i onLi st ener , y redefinir su método act i onper f or med, que tieneun parámetro capaz de informar sobre el campo de texto en el que ha sido pulsadala tecla RETURN (INTR O).

Page 255: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 255/482

240 Java 2.Manual de programación

Ejemplo

Solicita el nombre y la edad del usuario mediante cuadros de texto. La edad se soli-

cita con un cuadro «sin eco)), de forma que no se vea lo que se está tecleando. Trasla pulsación de R ETUR  N en el cuadro edad, el programa transforma la cadena leídaen un número, muestra dicha edad, y se disculpa por su falta de confidencialidadmediante la adición al mensaje de la palabra  J oven" . El ejemplo pretende resal-tar que los cuadros de texto no permiten la lectura directa de números. Utilizar epai nt y responde a eventos.

Intoduzca sunombre5

lntoduzca la edad enañosy pulse RETURN> a continuación

Figura 9.10. Cuadros de texto.

lntoduzca la edaden añosypulse<RETURN> a continuación

Joven de 86 años

Figura 9.11. Salida mostrada porel programa

Page 256: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 256/482

Page 257: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 257/482

242 Java 2. Manual  de programación

 public  Text Ar ea ( )

Crea un área de texto por defecto.

 public  Text Ar ea (int pl, int p2)

Crea un área de texto con p i filas y p2 columnas. public Tex t Ar ea( j ava. 1ang. St r i ng

pl)

Crea un área de texto y la inicializa con la cadena p i .

 public  Text Ar ea ( l ava. l ang. St r i ng pi, int p2, int p3)

Crea un área de texto y la inicializa con la cadena p1, estableciendo como número de filas

p2 y como número de columnas p3.

 public synchronized j ava. l ang. St r i ng g et T ex t 0

Método de lectura. Obtiene el texto.

 public synchronized voids et Text ( j ava. 1ang. St r i ng

 pi)Método de escritura. Establece el contenido del área.

 public synchronized void append( j ’ ava. 1ang. St r i ng pi)

Añade cadenas a un área de texto.

 public synchronized void s et Edi t abl e (boolean pi)

Controla la editabilidad del campo.

 public synchronized j ava. l ang. St r i ng get Sel ec t edText ( )

Obtiene el texto seleccionado. Pertenece a j ava .awt .ext Component .

Si el texto a mostrar no cabe en el número de filas o columnas visibles aparecenautomáticamente barras de desplazamiento en la dirección adecuada para que se

 pueda acceder cómoda y rápidamente a toda la información.

Figura 9.12.  Text Ar ea, el textoa most r arno cabe enel númer ode f i l asni de col umnas vi si bl es.

Para capturar sus eventos, el objeto  Text Ar ea se enlaza a la interfazText L i s t ener

y se sobrescibe el métodot ext Val ueChanged.

9.10. CLASE Canvas

La clase Canvas hereda de Component , encapsulando una ventana vacía o lien-zo, sobre el que se puede dibujar y que es capaz de recibir información por parte

Page 258: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 258/482

lnterfaces gráficas  de usuario 243

del usuario en forma de eventos producidos por el ratón o el teclado. Los lienzosno generan eventos, sólo los reconocen. El constructor de Canvas no tiene pará-metros

publ i c Canvas ( )

Los lienzos no tienen un tamaño por omisión y es necesario adjudicárselo; si nose le adjudica, éste dependerá del administrador de diseño que se esté utilizando y

 podría llegar a ser demasiado pequeño o incluso invisible. El método empleado conesta finalidad pertenece a la clase Component y es

publ i c voi d s et Si z e( i nt

pl,

i nt p2)

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 stat i c voi d mai n ( St r i ng ar gs [

)

VLi enzo vent ana = new VLi enzo ( );

vent ana. set Layout ( new F l owLayout O

1 ;

vent ana. s et T i 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ólo un fondo amarillo. Los Canvas heredan de Componentel método pai nt , pero como ya se comentó anteriormente, para que este métodohaga algo es preciso redefinirlo y  para ello es necesario crear una subclase deCanvas. Un ejemplo más completo sobre Canvas aparece en el apartado dedica-

do a los administradores de diseño.

Page 259: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 259/482

244 Java 2. Manual  de programación

9.11. CLASE Choice

Este tipo de componentes permite seleccionar una Única opción de entre una lista des-

 plegable de ellas (Fig. 9.13). Cuando se agregan a un contenedor, sólo muestran unadeterminada opción y una flecha que será la que permita escoger las restantes opcio-nes al efectuar clic sobre ella. El ancho que ocupan se establece automáticamentecomo el suficiente para mostrar las opciones incluidas en la lista. El constructor notiene parámetros y crea una lista vacía:

 public Choi ce ( )

Las opciones son cadenas de caracteres y aparecen en el orden en que se añaden

mediante el método public synchronized void addI t em( j av a. 1ang. St r i ng pi)

A cada una de estas opciones le corresponderá un índice, de forma que el primerelemento añadido tiene índice O, el siguiente 1 y así sucesivamente. Los índices se

 pueden obtener con el método

 public int get Se l ect edI ndex

( )

y estos números se utilizan frecuentemente como subíndices de vectores que con - ,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 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.

 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 enlazael objeto Choi ce a la interfaz I t emLi st ener y se redefine su métodoi t emst at el hanged, que tiene un parametro de tipo I t emEvent .

Page 260: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 260/482

lnterfaces gráficas de usuario 245

Ejemplo

Construir un menú de opciones con el componente Choice, a continuación elusuario selecciona una opción y se presenta en la pantalla la opción seleccionada.

i

Elemento seleccionado Dos

Figura 9.14. Presentación de la opción seleccionada.

import j ava. awt . * ;

i mpor t ava. awt . event . * ;

publ i cc l as sEj Choi ce ext ends Fr ame i mpl ement sI t emLi st ener{

pr i vat eChoi ce sel ecci ón;St r i ng el ement o = ;

publ i cE Choi ce ( )

I

addW ndowL i 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(

"DOS")

;/ * La Úl t i ma opci ón se denomi na Ter cer o en vez de Tr es,

par a que se vea con mayor f aci l i dad l a anchur a queadqui eren 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 hi s ) ;add ( sel ecci ón);

}

publ i cs t at i cvoi dmai n(

St r i ng ar gs [

] )

t

Ej Choi ce vent ana = new Ej Choi ce0;vent ana. set Layout ( new F l owLayout O

) ;

vent ana. s et Ti t l e (

"El AWT"

)

;

Page 261: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 261/482

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

1

r epai nt ( ) ;

9.12. CLASE Checkbox

Las casillas de verificación son componentes IGU con dos estados posibles: activa-do (true) y desactivado (f al se). Están formadas por un pequeño cuadro que

 puede presentar o no una marca de verificación y una etiqueta descriptora de laopción (Fig. 9.15).

r Casi l l aVeri f i caci ón

Figura 9.15. Casilla de verificación desactivada.

Las casillas de verificación pueden utilizarse individualmente y también puedenagruparse en un CheckboxGr oup. Los CheckboxGr oup agrupan de 1 a n

casillas de verificación de forma que no podrá haber varias activadas al mismotiempo. El constructor de un grupo CheckboxGr oup crea un grupo vacío y laforma de conseguir que las distintas casillas de verificación se añadan al grupo será

especificar el nombre del grupo cuando se creen las casillas de verificación. Laclase CheckboxGr oup hereda de Obj ect y no es un Component , por lo quelos objetos CheckboxGr oup no pueden agregarse a un contenedor, lo que se haráes añadir individualmente cada una de las casillas que constituyen el grupo. Dentrode los métodos para manejar este tipo de objetos citaremos.

Constructor de un conjunto de un CheckboxGr oup. public CheckboxGr oup ( )

 publicCheckbox ( j ava. l ang. St r i ng pl, j ava. awt . CheckboxGr oup p2,

 boolean p3)

Construye un Checkbox cuya etiqueta será la cadena especificada como pnmer parámetro, suestado (activado o desactivado) el tercer parámetro y lo agrega al CheckboxGr 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.

Page 262: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 262/482

Interfaces gráficas  de usuario 247

 public Checkbox ( )

Crea un Checkbox vacío y no seleccionado.

 public Checkbox( j ava. l ang. St r i ng pl)

Crea un Che kbox no seleccionado cuya etiqueta es la cadena pasada como parametro.

 public Checkbox ( j ava.l ang. St r i ng pl, booleanp2)

Crea un Chekbox cuyo estado inicial, seleccionado o no seleccionado, dependerá de loespecificado como segundo parámetro y cuya etiqueta es la cadena pasada como primer

 parámetro.

 public j ava. awt . Checkbox get Sel ect edCheckbox0

Determina dentro de un grupo el objeto Checkbox seleccionado.

 public boolean g e t s t a t e 0

Obtiene el estado del Checkbox.

 public j ava. l ang. St r i ng ge t l a be l o

Obtiene la etiqueta de un Checkbox.

Para tratar el evento de selección de una opción, se siguen lo mismos pasos quese expusieron en el caso de Choi ce.

Ejemplo

Creación de un CheckboxGr oup que trata el evento de selección de una opción.

........................ ................. ......Primeraopción 6 se.ci .nd.a..oP.c 4 ;

r Terceraopción C Cuartaopción

Elemento seleccionadoSegunda opción

Figura 9.16. CheckboxGr oup, el f ormat o del ascasi l l asde ver i f i caci óncambi ay se convi er t en en ci r cul ar es.

Page 263: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 263/482

248 Java 2. Manual de programación

i mpor t j ava. awt . * ;

i mport j ava. awt . event . * ;

publ i c cl ass Ej CheckboxGr oup extends Fr ame i mpl ements 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 ndowL i s t ener ( new Ci e r r e 3 0) ;

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 emL i s t ener ( t hi s ) ;

op3. addI t emL i s t ener ( t hi s ) ;

op4. addI t emL i s t ener ( t hi s ) ;

I

publ i c s t at i c voi d mai n( St r i ng a r g 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 T i t l e

(

"El AWT")

;

vent ana. set Si ze( 400, 250 ) ;

ventana.setResizable(fa1se);

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 una

f orma de consegui r que l os component es que s i 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

1

return new I ns et s ( 20, 20, 20, 20) ;

publ i c voi d pai nt ( Gr aphi cs g )

I

i 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);

\

Page 264: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 264/482

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 ava Ej CheckboxGr oup

9.13. LISTAS

La clase L 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 a los res-tantes elementos de la lista; sucede, de modo análogo, si el número de caracteresde alguna de las opciones supera el número de columnas visibles.

EneroFebrero

Agosto

OctubreI Noviembre

Figura 9.17. Lista cuyos elementosno caben en el númerode filas v isiblesy con varias opciones seleccionadas: Marzo,br i l , 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  pi)

Crea una lista con tantas filas visibles como especifique el parámetro pl y que no admiteselecciones múltiples.

Page 265: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 265/482

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 sea true o f al seel valor que le pasemos como parámetro p2.

Para añadir nuevas opciones a una lista se emplea: public void

add( j ava. l ang. St r i ng pl)

Otros métodos útiles son:

 public synchronizedj 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 selecciona ningúnelernento o se selecciona más de uno devuelve nu11.

 public synchronized intge t Se l ec t edI ndex0

Devuelve el índice del elemento seleccionado. AI  primer elemento de la lista le correspondeun cero, al siguiente un uno y así sucesivamente. Si hay más de un elemento seleccionado oaún no se ha seleccionado ninguno, devuelve -1.

 public synchronized void sel ect (intp l

Permite especificar la elección por defecto.

 public synchronized j ava. l ang. St r i ng[ ] get Sel ec t edI t ems 0

Se emplea para tratar selecciones múltiples, devolviendo un vector de cadenas que contiene

los nombres de los elementos seleccionados.

 public synchronizedint[] ge t Se l ec t edI ndexes 0

Se utiliza para tratar selecciones múltiples, devolviendo un vector de enteros con los índicesde los elementos seleccionados.

En una lista se han de considerar dos tipos de eventos; si se efectúa doble cliccon el ratón sobre un elemento de la lista se produce un Act i onEvent ; si se efec-túa un único clic sobre los elementos de la lista, se produce un I t emEvent . Para

tratar el suceso Act i onEvent se necesita enlazar el ,objeto Li st a la interfazAct i onLi st ener y sobreescribir act i onper f or med, y  para tratar el sucesoI t emEvent es necesario enlazarlo a

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 siguien-

tes características:

Efectuando clic con el botón izquierdo del ratón sobre elementos no seleccio-

Si efectúa clic sobre un elemento seleccionado, lo elimina de la selección.nados, los selecciona.

Page 266: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 266/482

Interfaces gráficas de usuario 251

Selección.Elemento1Elemento4

Figura 9.18. Resultado dela ejecucióndel programa ejemplo delistas.

El marcado y desmarcado de los elementos podrá efectuarse tantas veces comose quiera (Fig. 9.18). Para terminar el proceso de selección múltiple, deberá efec-tuar doble clic sobre un elemento aún no seleccionado de la lista, el cual, con éstaoperación, también se añadirá a la selección. Si efectúa doble clic sobre un elemento

 previamente seleccionado, también terminará el proceso de selección, pero esteúltimo elemento no se añadirá a la misma.

importj ava. awt . * ;

importj ava. awt . event . * ;

 public class Ej L i s t a extends Fr ame implements I t emLi s t ener ,Act i onLi st eneri

 private L i s t l i s t a ; public

E j L i s t aO

addwi ndowl i s t ener (new Ci er r e3 ( ) ;

l i s t a = new List(5,true);

for (int i = 1; i< 8; i ++)

l i s t a. add( " E l ement o " +i ) ;

l i s t a . addAc t i onL i s t ener ( t hi s ) ;

1i c t a. addI t emL i s t ener

(this);add( 1i s t a) ;

1

 public static void mai n(

St r i ng ar gs [

)

Ej L i s t a

vent ana = new E j L i s t a O;

vent ana.setLayou t

(new Fl owLayout ( ) ;

vent ana. s et T i t l e

( " El AWT" )

;

v ent ana. s et Ci z e(

400, 250) ;

vent ana. s et Vi s i bl e( t r ue) ;

Page 267: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 267/482

252 Java 2. Manual de programación

 public void pai nt ( Gr aphi cs g)

I

St r i ng ar rI = 1i s t a. get Sel ec t e dI t er ns

);

int al t o = g. get Font Met r i c s ( ) 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 ) ) ;

1

1

 public void act i onPer f or med( Act i onEvent e){

if ( e . ge t So ur c e0 == l i s t a )r epai nt

( );

1

 public voidi te rnSta teChanged(1 te rnEvent

e)t 1

9.14. CLASE Scrollbar

Las barras de desplazamiento son componentes que recorren valores enteros y pue-den estar orientadas horizontal o 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 pi)Crea una barra de desplazamiento en la dirección indicada por el parámetro p1:Scr o l l bar . HORI ZONTALoScr o l l bar . VERT1CAL.

Page 268: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 268/482

Interfaces gráficas de usuario 253

 public Scrol l bar (int

pl

,intp2,

intp3,

int p4, intp5)

Crea una barra de desplazamiento en la dirección que se le indique mediante el parámetro p l , con el valor inicial especificado en p2 (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 con los valores mínimo y máximo que contengan los parámetros p4 y p5. Si el valorinicial es menor que el mínimo o mayor que el máximo, el valor inicial se hará igual al míni-mo o máximo respectivamente.

Otros métodos necesarios para trabajar con barras de desplazamiento son:

 public synchronized voidset val ues

(int pl, intp2,

intp3,

int p4)

Establece los parámetros para una barra de desplazamiento.

 public int

get Maxi mum( )

Devuelve el valor máximo.

 public intget Mi ni mum( )

Devuelve el valor mínimo.

 public intget val ue ( )

Obtiene el valor actual de la barra.

 public synchronized voidset val ue

(intpl)

Establece el valor actual.

Ejemplo

Crea una barra de desplazamiento horizontal (Fig. 9.20).

importj ava. awt . * ;

importj ava. awt . event . * ;

classEj Bar r a

extends Fr ame{

 publicEj Bar r a ( ) '

( Scrol l bar bar r a = newScr 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 ndowL i s t ener (

new Ci er r e3 (

1

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

}

newE] Barra ( )

;

1 '

Page 269: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 269/482

254 Java 2. Manual de programación

La salida del programa anterior es la mostrada en la Figura 9.20.

I

Figura 9.20. Resultado dela ejecución del ejemplo.

Cada vez que se mueve el cuadro de desplazamiento se genera un evento deltipo Adj us me nt Ev ent , 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 corres-

 pondiente y se sobreescibirá el método adust r nent val uechanged.

9.15. MENÚS

Menuc omponent es la superclase de todos los elementos relacionados con losmenús, siendo subclases suyas tanto

MenuI

t emcomo MenuBar .MenuI

terncontiene los métodos para crear los elementos de un menú. La clase MenuBar con-

tiene el constructor de barras de menú. Las barras de menú actúan como contene-dores de menús. La clase Menu es una subclase de MenuI t emy proporciona

métodos para la administracción de los menús. Los menús contienen elementos demenú y se agregan a barras de menú.Cuando se selecciona un elemento de un menú se genera un evento del tipo

Act i onEvent , que se tratará de forma análoga a como se ha explicado en otrasocasiones.

Los elementos se añaden al menú mediante el método add y los menús a la barra de menús de la misma forma, pero la adición del menú a un marco se efectúa con:

 public synchronized void set MenuBar ( j ava. awt . MenuBar  pl)

Constructores

 public MenuBar( )

Construye la  barra de menús.

Page 270: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 270/482

lnferfaces

gráficas de usuario 255

 public Menu ( J ava.l ang. St r i ngpl)

Construye el menú, recibe como parámetro el nombre del menú.

Crea un elemento de menú, recibe como parámetro el nombre de la opción

 public MenuI t em( j ava . 1ang. St r i ng pl)

Ejemplo

Pasos a seguir para la creación de un menú que responda a eventos:

Figura 9.21. Menús.

/ /

Fr ame con bar r a de menú.import j ava. awt . * ;

import j ava. awt . event . * ;

 public class Ej Menu extends Fr ame implements Act i onLi st eneri

 public E Menu (

)

t

addW ndowLi st ener (new Ci er r e3( ) ;

s et Ti t l e ( " Mar co" );MenuBar mb = new MenuBar ( );

Menu m = new Menu ( "Ar chi vo" );MenuI t em abr i r = new MenuI t em( " Abr i r ar chi vo" ) ;MenuI t em cer r ar = new MenuI t em( "Cer r ar ar chi vo" ) ;abr i r . addAc t i onL i s t ener ( t hi s ) ;

c er r ar . addAc t i onL i s t e ner ( t hi s ) ;

m add( abr i r ) ;

m add( c er r ar ) ;

mb. add ( m);

set MenuBar ( mb);

set si ze ( 200, 100)s et Vi s i bl e( t r ue) ;

1

 public voida ct i onPer f o r med( Ac t i o nEvent

e)

t

Sys t em out . pr i nt l n( e. get Sour c e( ) ) ;

Page 271: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 271/482

256 Java 2. Manual  de programación

 public static void  main ( St r i ng args [)

I

new EjMenu ( );

9.16.  ADMINISTRADORES DE DISEÑO

Java tiene cinco administradores de diseño que controlan la ubicación de loscomponentes añadidos a un contenedor y, cuando el usuario redimensiona elcontenedor, estos administradores intentan reajustar dichos componentes enla 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 siguientesentencia:

setLayout (new NombreGestor(parámetros) ;

y cuando se desee no usar un administrador se pasa null al método s et l ayout ;

en este caso habrá que colocar y dimensionar los componentes de forma manual, para lo que se puede utilizar el método

 public void setBounds(int pl, int p2, int p3, int p4)

en el que los parámetros p l y p2 representan la posición, en pixels, del extremosuperior izquierdo del componente con respecto a su contenedor, mientras p 3 y p4

son la anchura y altura del objeto respectivamente.Cuando se quiere dejar un pequeño borde entre un contenedor y los componen-

tes que situamos en él se puede recurrir a redefinir el método get nset s de laclase Cont 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 administrador dediseño correspondiente cuando vaya a colocar los componentes en el contenedor.Un ejemplo de get i nset s aparece en el apartado que comenta la claseCheckbox.

Las características de los administradores de diseño fundamentales se detallan acontinuación.

9.16.1. FlowLayout

Utiliza la interfaz Layout Manager y es el administrador de diseño que usan poromisión los paneles y las applets. Cuando se utiliza Fl owLayout los componentesse colocan en el contenedor de izquierda a derecha en el orden en el que van siendoagregados y, cuando no caben más en una fila, continúan colocándose en la siguiente.

Page 272: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 272/482

lnterfaces gráficas de usuario 257

Los constructores son:

 p u b l i c Fl owLayout( )

 public Fl owLayout ( i n t pi)

Construye un Fl owLayout por defecto, que centra los

componentes, dejando5

 pixelesde espacio entre cada uno deellos.

Construye un Fl owLayout ymediante el parámetro permiteespecificar el alineamiento. Sonvalores válidos para dicho pa-

rámetro.Fl owLayout . LEFT

Fl owLayout . CENTER

Fl owLayout . RI GTH

 p u b l i c Fl owLayout ( i n t

 pl, i n tp 2 , i n t

p3) Construyeun Fl owLayout deforma que se pueden especifi-car tanto el alineamiento comoel espacio horizontal y verticala dejar entre los componentes.

El diseño se establece mediante s e t l a y o u t . Por ejemplo:

set Layout (new Fl owLayout ( F l owLayout . LEFT) )

La adición de componentes se efectúa empleando el método add.

9.16.2. BorderLayout

Es el administrador de diseños por defecto para los cuadros de diálogo y los mar -cos y se caracteriza por acomodar a los componentes en cinco areas:  Nor 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. Borde rLayou t : áreas.

Es  posible usar, por tanto, de uno a cinco componentes con B o r d e r L a y o u t ,

uno para cada posición, y, excepto en el caso de C e n t e r , cuando alguna posiciónno es usada la zona correspondiente será ocupada por los otros componentes.

Page 273: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 273/482

258 Java 2. Manual  de programación

Si no se usa Nor t h ni sout h, quedar í aa s í . Si nose usaNor t h, nisout h, niEast .

Figura 9.23. Bor der Layout cuando nose usan algunas pos iciones.

Sus constructores son:

 public Bor der Layout( ) Construye un Bor der Layout .

 public Border Layout (int pl, int p2) Construye un Border Layoutseparando cada área horizontaly verticalmente el número de pi-

xeles indicados como argumento.

Estableciéndose el diseño de la siguiente forma:

set Layout (new Border Layout ( )

setLayout (new Bor der Layout ( p i ,

p 2 ) )

 para situar un componente en una determinada posición se incluye la posición o

área en el método add : public j ava . awt . Component add( j ava . l ang. St r i ng pl,

j ava. awt . Component p2)

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 hade especificarse, los componentes podrán agregarse en cualquier orden.

9.16.3. GridLayout

Divide el contenedor en una cuadrícula que permite colocar los componentes en filasy columnas, concediendo el mismo tamaño a todos ellos. Dichos componentes seagregan a la cuadrícula ocupando la primera fila de izquierda a derecha y pasando acontinuación a ocupar, en el mismo sentido, la fila siguiente y así sucesivamente.

Los constructores de Gr i dLayout son:

 public Gr i dL ayout ( i nt pi, int p2)

Construye un Gr i dLayout con el número de filas especificado como primer parámetro yel número de columnas especificado como segundo parámetro.

 public Gr i dLayout (int pl, int p2, int p3, int p4)

Construye un Gr i dLayout con el número de filas especificado como primer parámetro yel número de columnas especificado como segundo parámetro y cada componente separadohorizontalmente por p 3 pixeles y verticalmente por p

4.

Page 274: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 274/482

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 con add:

 public j ava. awt . Cor nponent add( j ava. awt . Cor nponent p l

Nota: Redeñnirl =¿todo getinsets de la lase

ontainer sirve para

es quesecdoqueneauncontenedorueden ige-íi8lisrrns.

€jemplo

En este ejemplo se muestra el comportamiento de los administradores de diseño y dis-tintos componentes del AWT. Pero no incluye la gestión de eventos, excepto la del even -to de cierre que se produce cuando se hace clic en el icono de salida de la ventana.

Figura 9.24. Ejemplosobre elcomportamientode los administradores de diseño.

Page 275: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 275/482

Page 276: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 276/482

Page 277: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 277/482

262 Java 2. Manual  de programación

 j ava . awt .

9.17. swing

Component

j ava. awt . Cont ai ner

El paquete swi ng extiende el awt , añade nuevos componentes e incorpora dos

administradores de diseño más. La superclase de los componentes swi ng es laclase J Component , que deriva de la clase estándar Cont ai ner y, por tanto, des-ciende también de la clase Component del awt , de esta jerarquía se deduce quetodos los componentes swi ng son contenedores (Fig. 9.25). Entre las novedadesaportadas por  j avax .swi ng destacan las ventanas con pestañas, el hecho de

 poder añadir bordes así como asociar un texto de ayuda a cualquier componente.Además, los componentes swi ng se ejecutan uniformemente en cualquier plata-forma. Hay que tener en cuenta que, en muchas ocasiones, los nombres de los com-

 ponentes en ambos paquetes casi coinciden, diferenciándose únicamente en que losde swi ng anteponen una J , y la forma de trabajo también, facilitándose así el pasode awt a swi ng.

Figura 9.25. Jerarquía de clases: la clase J Component .

Page 278: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 278/482

10

Gestiónde eventos

CONTENIDO10.1. Tipos de eventos.

10.2.

Los componentesdel AWT como f uent ede event os.10. 3. Recept or es deevent os.10. 4. Procesami ent ode event os.10. 5. Cl ases adapt ador as.10. 6. Cl ases r ecept or as anóni mas.10. 7. Probl emas comunes enelt r at ami ent ode event os.

263

Page 279: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 279/482

264 Java 2. Manual de programación

Los usuarios pueden comunicarse con los programas a través delos objetos visuales que ofrecen las InterfacesGráficas de Usuario(IGU). Cuando se trata

del

paquete awt l acomuni caci ón sepr o-

duce de l a si gui ent e f or ma,l osdi st i nt os component es delAW T soncapacesde det ect ar event osde unadet ermi nada cl asey not i f i carest a acci ón aun obj et o r ecept or . Si el r ecept or r eci beel avi so deque ha ocur r i do det ermi nado suceso, l l ama a un mét odo,

edef i ni -

do por el pr ogr amador , que ej ecut a l as acci ones desePorot r a par t e,Swi ng pr oporci ona nuevos t i posde event os pero elpr o-cesami ent o del osmi smos es anál ogo al coment ado ant er i or-t e .En est e capí t ul o se coment anl osdi f er ent es t i posde event osdelAWT, as ícomo l ospr obl emas quese pr esent anen el pr ocesa-mi ent ode l osmi smos.

10.1. TIPOS DE EVENTOS

La programación GUI es una programación dirigida por eventos que implica lanecesidad de procesar los mismos y, 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ías fun-damentales, de bajo nivel, subclase de Component Event ,y semánticos, colegas de

Page 280: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 280/482

Gestión de eventos 265

Component Event . No obstante, la programación de los eventos de ambas cate-gorías es similar y su principal diferencia reside en la naturaleza del objeto evento yla información que es capaz de proporcionar.

Los eventos de bajo nivel ofrecen acceso al componente que ha generado elevento y, con él, acceso a los métodos de la clase Component mediante elmétodo:

 public j ava. awt . Component get Component 0

Los eventos semánticos proporcionan diferentes métodos para obtener una refe-rencia al objeto que ha generado el evento. Por ejemplo, en Act i onEvent se puede obtener la etiqueta identificativa del objeto fuente mediante

 public j ava. l ang. Ct r i ng get Act i onCommand0

mientras que en I t emEvent debiera utilizarse

 public j av a. awt . I t emCel ec t abl e get I t e mSe l e c t a bl e 0

Not a:Si no se desea recordar métodos específicos es  posible recurrir almétodo

 public java.lang.0bject getsource0

 perteneciente a la clase  j ava. ut i 1 . Event obj ect ,situada muy arribaen la jerarquía; como consecuencia, este método puede ser utilizado con todotipo de eventos,

10.2. LOS COMPONENTES DEL AWT COMO FUENTEDE EVENTOS

Los distintos componentes del AWT son capaces de actuar como fuente de even-

tos, es decir, como objetos capaces de detectar eventos de una determinada

clase y,  para conocer los eventos que pueden ser detectados por cada uno deellos, hay que tener en cuenta tanto la siguiente tabla como la jerarqu ía de cla-

ses del AWT.

Page 281: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 281/482

266 Java 2. Manual  de programación

Tabla 10.1. Fuentesde eventos

Fuente Clase de evento

B u t t o n

L l S t

Y e r.u I t en

T e x t F i e l d

A c t i o n E v e n t

A c t i o n E v e n t

A c t i o n E v e n t

A 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 nt E ve n t

C ornpor.e n t C or npone n tEve 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

Ch eck b o x

CheckboxMen~dItern

Choi ceL;c t

I t e r nEve n t

I ternEven t

I t e r n E v e n t

I t e r nEve n t

Corrponenr

K e y 0ver,t

C u n p o n e n t Mo u s eE v en t

T e x t A r e a

T e x t F i e l d

T e x t E v e n t

T e x t E v e n t

D; al og WindowEvent

Frame WindowEvent

10.3. RECEPTORES DE EVENTOS

Las clases de nivel más bajo dentro de los distintos subárboles a considerar enla jerarquía de eventos tienen una interfaz ((oyente))asociada, excepto MouseEven t

que tiene dos, con un único método o bien un conjunto de métodos declarados en ellas para tratar los eventos de las mismas y los receptores de eventos son clases que imple-mentan interfaces oyentes específicas.

Clase de evento Interfaz

A r t i o n E v e n t

I

Act1 onLi stener

~ctio n L i

s

tener, métodos:

 public abstract void ac t i onPer f or med( j ava. awt . event . Ac t i onEvent pl)

Page 282: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 282/482

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

Adj us

men t Li s t ener , métodos: public abs t rac t void

ad j us t ment ~a: ueChanged( ~ava. awt . event . Ad j us t me~~t Eventpl )

Clase de evento Interfaz

Component Event Component Li st ener

Component L i st ener , métodos:

 public abs t rac 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)

 public abs t rac t void

component Moved( j ava. awt . event . Component Event

pl

 public abs t rac t void

c 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 V e n t  p i )

 public abs t rac t void

component 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 , r

 public abs t rac t void

cor nponent Added( j ava. awt . event . Cont a i ner Event

 pl)

 public abs t rac t void

component Removed( j ava. awt . event . Cont ai ner Evenc

pl)

Clase de evento Interfaz

FocusEvent FocusL i s t ener

I

Focus is tener,

 public abs t rac t void f o c us Ga i ne d( j a va . a wt . e ve nt . F oc ds E ve ~t pi )

 public abs t rac 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 emL i

s t ener , métodos:

 public abstrac t void i t emCt at eChanged( j ava. awt . event . 1t emEvent

pl )

Page 283: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 283/482

268 Java 2. Manual de programación

MoxseEvenc

i

Clase de evento Interfaz

MouceL i c t ener

MouceMot i onL i c t ener

KeyEvenr . KeyL i st ener I

Text Event

KeyLis tener,m

 publ ic a b s t r ac t void k ey Pr es s e d( j a va . a wt . ev ent . Key Ev ent pl)

 publ ic abstract void keyRe l eased( ; ava . awt . event . KeyEvent pl)

 publ ic abstract void keyTyped( j ava . awt . event . KeyEvent

pl

Text L i s t ener

~

MouceLi tener ,métodos:

 public ab s t r a c t void

 public abs t r a c t void

 public abstract void

 public abs t r a c t void

 publ ic abstract void

Mo L se tioI:

Listen er,

 publ ic abstract void

 publ ic abstract void

Clase de evento

mouseCl i cked( j ava . awt . event . MouseEvent pl)

mouseEnt er ed( j ava. awt . event . MouseEvent pl)

mouseEx i t ed( j ava . awt . event . MouseEvent

pl)

mousePr essed( ~ava. awt . event . MouseEvent

pl)

mouseRel eased( j ava. awt . event . MouseEvent

pl)

métodos:

mOuSeDr agged

( 1ava. awt . event Mous eEvent pi)

mouceMoved( j ava. awt . event . MouseEvent

pl

 Interfaz

Text Listener ,

 public abstract voidt ext Val ueChanged( j ava. awt . event . Text Event

pl)

WlétOdOS:

Clase de evento Interfaz

W  ndowEve n I Wi ndowLi st ener

W i n c i o w L i stener ,métodos:

 public abstract void wi ndowAc t i vat ed( j ava . awt . event . W ndowEvent pl)

 public abs t rac t void wi ndowCl osed( j ava . awt . event . W ndowEvent pl)

 public abst rac t void wi ndowCl os i ng( j ava . awt . event . W ndowEvent

pl)

 public abstract voidwi ndcwDeact i vat ed( j ava. awt . event . W ndowEvent

p l

 public abstract void wi ndowDei coni f i ed( ~ava. awt . event . W ndowEvent pl)

 public abs t rac t void wi ndowI coni f i ed( j ava. awt . event . W ndowEvent

pl)

 publ ic a b s t r ac t void wi ndowCpened( j ava. awt . event . W ndowEvent

pl)

Page 284: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 284/482

Gestión de eventos 269

10.4. PROCESAMIENTO DE EVENTOS

Para el procesamiento de eventos, hace falta que un objeto fuente capaz de detectar

eventos de una determinada clase, notifique a un objetoreceptor que se ha produ-cido un evento de la clase que dicho receptor es capaz de interpretar y,  para ello,dicho receptor debe implementar una interfaz «oyente», asociada a un determinadotipo de suceso, sobreescribiendo cada uno de sus mé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.

EjemploPresentar 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.

Pnsicidn del r a t d 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 r g s [ ] )

t

Mar co f uent e = new Mar cof uent e. s et T i 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 yr egi s t .

1 ;

i n l os r ecept or esf uent e. addW ndowL i s t ener ( new Recept o r Ci e r r eO) ;

f uent e . addMouseLi s t ener ( new

Recept or Rat on( f uent e) ) ;

 public void pai nt ( Gr aphi cs g)t

g. dr awSt r i ng ( " Posi c i ón del r at ón:ixt ,

" +y, 60, 40);

Page 285: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 285/482

270 Java 2.Manual de programación

/ * Las cl ases r ecept oras i mpl ement an oyent es y sobr eescr i ben

* / sus mét odos

class Recept or c i er r e implements Wi ndowLi st ener

 public void wi ndowCl osi ng( W ndowEvent e)i

i

1

Sys t em exi t ( O ) ;

 public void wi ndowAct i vat ed( W ndowEvent e)t i

 public voidwi ndowCl osed( W ndowEvent e)

0

 public voidwi ndowDeact i vat ed( W ndowEvent

e)i 1

 public void wi ndowDei coni f i ed( W ndowEvent e)i }

 public void wi ndowI coni f i ed( W nd0wEvent e)i 1

 public void wi ndowOpened( W ndowEvent e)i }

class Recept or Rat on implements MouseLi st ener1

Marco l avent ana;

Recept or Rat on( Mar co f uent e)i

l avent ana = f uent e;1

 public voidmousepr ess ed ( 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 ( Mo u s e E v e n t e)o

 public void rnouseEnte red(M0useEven t

e)i 1

 public voidmouseExi t ed ( MouseEvent e)

t )

 public void mouseCl i cked( MouseEvent e)i }

1

Page 286: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 286/482

Gestión de eventos 271

Otra forma de implernentación podría haber sido:

import j ava. awt . * ;

importj ava. awt . event . * ;

 public class Mar co2 extends Fr ame implements Wi ndowLi st ener ,MouseLi st ener{ int x = O, y = O;

Mar co2 ( )

(

s et T i t l e ( " Mar co" );s et s i z e ( 250, 100);set vi s i bl e (true);

/ / se r egi s t r a el r ecept oraddW ndowL i s t ener ( t hi s ) ;

addMouseL i s t ener ( t hi s ) ;

1

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

i

1

i

1

Mar co2 f uent e = new Mar co2 ( )

;

 public void pai nt ( Gr aphi cs g )

g. dr awCt r i ng ( "Posi c i ón del r at ón: tx+ ,

" +y ,

60, 40) ;

 public void wi ndowCl osi ng ( Wi ndowEvent e)t

Sys t em exi t ( O) ;

 public void wi ndowAct i vat ed ( Wi ndowEvent e)i l

 public void wi ndowCl osed( W ndowEvent e)

{ I

 public void wi ndowDeact i vat ed( W ndowEvent e){ I

 public void wi ndowDei coni f i ed( W ndowEvent e){ I

 public void wi ndowI coni f i ed( W ndowEvent e)i }

 public void wi ndowOpened( W ndowEvent e)i )

 public void mousePr ess ed( MouseEvent e)i

x =e. get X( ) ;

y = e. get Y( ) ;

r epai nt ( )

;

I

Page 287: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 287/482

272 Java 2. Manual de programación

 public void mouseRel eased( MouseEvent e)

 public voidmouseEnt er ed ( MouseEvent e)

 public voidmouseExi t ed( MouseEvent e)

 public void mouseCl i cked( Mous eEvent e)i }

{ I

i }

1

En cuanto a swi ng, hay que destacar que aunque proporciona nuevos tipos deeventos el procesamiento de los mismos es análogo al estudiado. Los  programasque utilicen swi ng deberán incorporar las siguientes sentencias:

importj ava. awt . * ;

importj ava. awt . event . * ;

import j avax. s wi ng. * ;

importj avax. s wi nq. event . * ;

En versiones anteriores, swi ng ha usado otros nombres de paquetes:

cor n. sun. j ava. swi ng

j 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 sobreescribir todosellos, cuando se requiere una interfaz de este tipo se utilizan clases adaptadoras, queimplementan las interfaces oyentes con métodos vacíos y se definen las clasesreceptoras para que extiendan las adaptadoras.

Ejemplo

Implementación de un programa que presenta las coordenadas de la posición dondese 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

Page 288: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 288/482

Gestión de eventos 273

Mar co3 f uent e = new Mar co30;

f uent e. s et Ti t l e ( "Mar co" );f uent e. set 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 s t ener ( new Rec ept or Ci er r e20) ;

f uent e. addMouseLi st ener ( new Recept orRat on2( f uent e) ) ;

1

 public void pai nt ( Gr aphi cs g)

i

g. dr awSt r i ng ( " Posi c i ó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

I

Sys t e m exi t ( O) ;

1

classRecept or Rat on2

extends MouseAdapt ert

Marco3 l avent ana;

Recept or Rat on2( Mar co3 f 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 aquellos métodos,declarados en la 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 a i ner Adapt er

Class FocucAdapt er Class KeyAdapt er

Page 289: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 289/482

274 Java 2. Manual de programación

Cl ass MouseAdapt er Cl ass MouseMot i onAdapt er

Cl ass Wi ndowAdapt er

10.6. CLASES RECEPTORAS ANÓNIMAS

Una clase anónima es aquella que no tiene nombre y, cuando se va a crear un obje-to de la misma, en lugar del nombre se coloca directamente la definición. Las cla-ses receptoras pueden ser definidas como clases anónimas.

Ejemplo

Construir un menú de opciones con el componente Choi ce, elegir una opción, pre-

sentarla en pantalla y realizar el cierre de la ventana mediante una clase anónima(Fig. 10.3).

Elemento seleccionado Tercero

Figura 10.3. Ejemplo deChoi ce y cl ase anóni mapar a elci er r ede vent ana.

i mpor t j ava. awt . * ;

i mpor t j ava. awt . event . * ;

publ i c cl ass Ej Anoni ma extends Fr ame i mpl ement s I t emLi st eneri

pr i vate Choi ce sel ecci ón;St r i ng el ement o = ;

publ i c Ej Anoni 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

Page 290: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 290/482

Gestión de eventos 275

t

 public void wi ndowcl osi ng ( Wi ndowEvent e)I

I public void wi ndowAct i vat ed ( Wi ndowEvent e)

t }

 public void wi ndowCl osed( W ndowEvent e)t }

 public void wi ndowDeact i vat ed( W nd0wEvent e)t l

 public void wi ndowDei coni f i ed( W ndowEvent e)t l

 public void wi ndowI coni f i ed( W ndowEvent e)I }

 public voidwi ndowopened ( Wi ndowEvent e)

I I

Sys t e m exi t ( O) ;

1 )

sel ecci ón = new Choi ce ( );

sel ecci ón. addI t em(

"Uno") ;

sel ecci ón. addI t em(

"Dos" ) ;

sel ecci ón. addI t em( " Ter cer o" ) ;

/ / Opci ón pr esel ecci onadasel ecci ón. sel ect

(1);

s el ec ci ón. addI t emL i s t ener ( t hí s ) ;

add ( sel ecci ón);I

 public static void mai n( St r i ng a r g s [ ] )

i

Ej Anoni ma vent ana = new Ej Anoni ma ( );

vent ana. set Layout ( new F l owLayout O ) ;

vent ana. s et T i t l e ( " El AWT" ) ;

vent ana. set Si ze( 400, 250 ) ;

vent ana. s et Vi s i bl e( t r ue) ;

1

 public void pai nt ( Gr aphi csg)

Iel ement o = s el ec ci ón. get Sel ec t e dI t em( ) ;

g. dr awst r i ng ( "El ement o sel ecci onado"+el ement o,

20, 230) ;I

 public void i t emSt at eChanged( 1t emEvent e)t

I

r epai nt ( ) ;

1

Page 291: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 291/482

276 Java 2. Manual de programación

Resulta práctico definir como anónimas las clases receptoras que extiendenadaptadoras. Por ejemplo, en el caso anterior se podría definir la siguiente claseanónima:

/ / empl eo de una cl ase anóni maaddW ndowLi st ener ( new Wi ndowAdapt er

I

publ i c voi d wi ndowCl osi ng

i

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 «titubeos» delusuario ante la realización de una determinada elección y la medida a tomar sueleser ignorar las selecciones realizadas por el mismo hasta que éste confirme su deci-sión; para ello se añade un botón de confirmación y se ignoran los eventos genera-dos hasta que el usuario pulse dicho botón.

Ejemplo

Crear un CheckboxGr oup que agrupe 4 casillas de verificación. Sólo se 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 oup extends Fr ame i mpl ement s Act i onL i c t ener

i

pr i vat e Checkbox opl , op2, op3, op4;

pr i vate 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)

Page 292: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 292/482

Gestión de eventos 277

add( op1) ;

ac i 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( c onf 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 [ ]

)

i

Ej CheckboxGr oup vent ana = newEj 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 z e( 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 emento = "El ement o sel ecci onado: t

menu. get Cel ect edCheckbox( )

. get Label ( ) ;

1. se tTe x t ( el ement o);1

 public I nset s get I ns et s ( )

i

1

return new i nset s ( 20, 20, 20, 20);

 public voidact i onPer f or med( Ac t i onEvent e)

i

1

r epai nt ( )

;

1

class Ci er r e extends Wi ndowAdapt erI

 public voidwi ndowCl osi ng ( Wi ndowEvent e)

Sys t em exi t ( 0) ;

1

1

Page 293: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 293/482

278 Java 2. Manual de programación

~ r

Ptimera opción C

S e w n d a ao t i ón

r

Tercerao @

C o

,____ .  ___

A

L ..--..........<..I .............---,.,.._I_<.__._._._._,_,..__;

Elemento seleccionada: Cuarta opclón

Figura 10.4. Confirmación dela selecciónde una opción.

Por otra parte, en algunos programas las acciones a realizar ante un determinadoevento deben depender de eventos anteriores y, en estos casos, lo habitual es recu-

rrir a variables booleanas que reflejen lo que ha sucedido antes y  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.

En un  programa que efectúe la creación de una calculadora será preciso en pri-mer lugar distinguir entre la parte correspondiente al diseño de la pantalla y la de

Page 294: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 294/482

Gestión de eventos 279

manejo de los sucesos; dentro de esta última, es necesario resaltar que las accionesa realizar ante la pulsación de un  botón van a depender sobre todo de si dicho botónes un dígito o un operador. Considerando operadores binarios y las operacionescomo series de operandooperadoroperandooperador  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 operando y 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 anterior y de si esta fue undígito, la coma decimal o un operador. Por tanto, la ejecución de unas acciones uotras requerirá la consulta de los valores de variables booleanas ( o t oNumer o,

esDeci mal ) que informen sobre dicha selección anterior.

importj 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' ; / 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 (

Bot ones cer o, uno, dos , t r es , cuat r o, ci nco, seis, s ~e t e ,

ocho, nueve, coma;Bot ones suma, r est 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) ) ;

s et Bac k gr ound( Col or . 1i ght Gr ay ) ;

s et T i t l e

( "Cal cul ador a" j ;

set s i ze ( 200, 140);

addW ndowL i s t ener ( new Ci e r r e0 ) ;

Panel panel oper andos = new Panel ( ) ;

panel Oper andos. set Layout ( new

Gr i dL ayout ( 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 * /

Page 295: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 295/482

Page 296: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 296/482

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' , thi 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 ( newGr 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 ( new Fl owLayout 0) ;

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 stat 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 )

I

St r i ng . di gi t 0 =;

i f ( val or ==I . '

)

i f ( esDeci r nal )

{

I i f ( ot r oNumer o )

i

r esul t ado. setText ( " O" ) ;ot r oNumer o = f al se;

1

esDeci r na1 = t rue ;di gi t o = . ;

1

I

el se

i f ( otroNurnero

)

di gi t o = " " t val or ;

Page 297: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 297/482

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)i

double numer o;ncmer o = (new Doubl e ( r esul t ado. e t T e x t

( ) ) )

.doubl eval ue( ) ;

if(

( ot r oNumer o oper ador == ' =' && otrooperador ! ='

1

t

switch( operador )

i

case'+':

t ot al += numer o; break;

caseI- :

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. s e t Te x t

( ( new Doubl e ( t ot al ) ) .t os t r i ng ( ) ;

1

oper 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

Page 298: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 298/482

Gestión de eventos 283

classBot ones ext endsBut t on i mpl ement sAct i onLi st enerI

char unoper ador , unval or ;Cal cul ador a cal c;

Bo t ones ( Ct r i ng t ext o, char oper , char val or , Cal cul ador a c )

t

super (texto ) ;

unoper ador = oper ;u n v a l o r = va lo r ;

cal c = c;

1

 public voidact i onP er f o rmed( Ac t i onEv ent e)

i

i f ( unoper ador == 'x ' )

/ / no es un oper adorcal c . col oca ( unval or );

c al c . c al c ul a( unoper ador ) ;

el se

1

i

classCi er r e ext endsWi ndowAdapt eri

 public void wi ndowcl osi ng ( Wi ndowEvent e)t

1

Cys t em exi t ( O) ;

Page 299: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 299/482

I 11

 Applets

CONTENIDO11.1. Introduccióna HTML.11.2. Incorporaciónde applets a páginas Web.

11.3. Estructura de un applet.11.4. Transformación de aplicaciones en applets.11.5. Incorporación de sonido.11.6. Incorporación de imágenes.

285

Page 300: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 300/482

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 HTML.Tambié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 en los 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ón multiperso-

nal gracias a su organización en servidores, que disponen de la información y losrecursos, y clientes, que acceden a ellos. Dentro de los servicios proporcionados por Internet, la Web ocupa un lugar destacado, constituyendo las páginas Web,archivos guardados en servidores repartidos por todo el mundo y los navegadores

 programas cuya misión es conectarse a un servidor Web para recibir sus datos y presentar las páginas en pantalla. Las paginas Web se escriben en lenguaje HTML(lenguaje de marcas de hipertexto). En un documento HTML existe texto normal y

marcas encerradas entre llaves angulares que indican al navegador cómo mostrar elcontenido del documento en pantalla.

Existen marcas  básicas que necesitan otra de cierre, como las mostradas en laTabla 11.1.

Tabla 11.I.Marcas básicasde un documento HTML

~~ ~

_ _

Marca Significado

< H T M L > . . . </ HTML>

Comienzo y fin del documento HTML< H E A D > . . . </HEAD> Comienzo y fin de cabecera<BODY> . . . </ BODY> Comienzo y fin del cuerpo

Page 301: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 301/482

 Applets 287

Las marcas <HTML>

y</ HTML> señalan el principio y fin del documento y

< H E A D > </ HEAD>y <BODY> < / B O D Y > dividen el documento en sus dos par -tes fundamentales: cabecera y cuerpo.

 PARTES  EN U N DOCUMENTO HTML

<HTML> - Comienzo del documento<HEAD>

</HEAD><BODY>

</ BODY>

Cabezera

Cuerpo

1

1

. . .

. . .

</HTML>

-

Fin del documento

Otras marcas que necesitan cierre se muestran en la Tabla 11.2.

Tabla 11.2. Marcas en las que se exige cierre

Marca Significado

< T I T L E > título-de-fagágina < / T I T L E >

<Hn>. . ./ Hn>

<UL>

<UL>

<OL>

<OL>

< L I > . . . / O L >

<B>. . ./ B>

< I > . . .</ 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úmero n que las acompaña. El tamaño de textomás grande es para las de nivel 1

Comienzo y fin de una lista no numerada

Comienzo y fin de una lista numerada

Entrada de la lista NegritaCursiva

Existen también en HTML otras marcas que no necesitan cierre (Tabla 11.3).

Page 302: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 302/482

288 Java 2. Manual de programación

Tabla 11.3. Marcas en lasque se requierecierre

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 separar

el

siguiente 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 HTML

Así mismo, existe otra clase de marcas que requieren atributos con especifica-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áginaWeb la imagen con el nombre

especificado.La marca para la inclusión de unaimagen se puede complementarcon el atributo ALT que permitela sustitución de la imagen poruna descripción de la mismacuando dicha página se visite conel navegador en modo texto.

<I MG

SRC=nombre-imagen ALT=descripción>

Los enlaces en las páginas Web se indican a traves de la marca<A>. . ./ A>,que se denomina ((ancla))(anchors) y que necesita como atributo la referencia al

documento con el cual se enlaza (URL), de la siguiente forma:

<A HREF= ref -a1 doc urnent - con-e cua1-

se-en 1a a

tex t - que-se stra a- en-pa nt a11a < / A>

Además de las marcas citadas, existen caracteres que tienen un significado espe-cial en lenguaje HTML. Estos caracteres especiales sirven para representar en el

dispositivo de salida (pantalla, impresora,...) a otros caracteres normales de escritu-ra que no  pueden escribirse directamente, dado que tienen un significado especialen HTML. Es decir, por ejemplo, para representar en pantalla el símbolo es pre-ciso escribir en el documento HTML el carácter

(( &1t ; .

Page 303: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 303/482

 Applets 289

Tabla 11.5. Representación de caracteres especiales

Carácter quesedeseapresentar

<&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 partede conjunto ASCII estándar (Tabla 11.6).

Tabla 11.6. Códigos especiales para representar caracteres no ASCII

Carácter quesedeseapresentar Carácter porel quedebe susti tuirse

óñ

Ñ

. . .

&oacut e;

&nt i l de;

&Nt i l de;

. . .

11.2. INCORPORACIÓN DE APPLETS  APÁGINAS WEB

Los applets permiten vincular código Java con páginas Web. Esta acción permiteconstruirpáginas Web dinámicas. Además, hay que tener en cuenta que el código Javase ((descarga))desde el servidor para ser ejecutado en el navegador, de forma que seaprovecha la potencia del sistema local y 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 T

C O D E B A S E = U R L - d e - l a - c l a s e

CODE=n

ombre de-1a- c1aseN A M E = n o r n b r e

W I D T H = n ú r n e r o H E I G H T = n Ú m e r o

A L T = t e x t o

A L I G N = ? ’

usi f i

c a c i ó n

V S P A C E = e s p a c i o - vert ical

<PARAM

H S P A C E = e s p a c i o - h o r i zon tal>

N A ME =n o m b r e - a rgurnen t o VALUE= va1o

rgumen to>

.. .(  puede haber var ios)

(códigos HTML alternativos  para clientes que no soportan Java)

< / A P P L E T >

Page 304: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 304/482

290 Java 2. Manual de programación

Los distintos elementos y su responsabiiicLd se describen a continuación:

CODEBASE: Necesario cuando el upplet no se encuentra en el mismo lugar que

la página Web y representa el directorio, relativo al directorio en donde seencuentra la página Web, que contiene la clase del upplet.CODE: Obligatorio; nombre del archivo que contiene el código byte de la claseya compilada.NAME: Opcional. Nombre de la instancia del applet. Este nombre permite a losupplets de una misma página encontrarse y comunicarse entre sí.WI DTH y HEI GHT: Obligatorios; representan el tamaño del rectángulo queocupará el applet en la página Web.ALT: Opcional; sirve para especificar el texto alternativo que presentará unnavegador cuando comprenda la etiqueta APPLET, pero no pueda ejecutar elapplet.ALI GN: Opcional; establece la alineación del upplet con respecto a los otroselementos de la pagina. Como justificación, se podrá indicar LEFT, RI GHT,TOP, TEXTTOP, MI DDLE, ABSMI DDLE, BASELI NE, BOTTOM y ABSBOT-

 TOM.

tal que separará al upplet del texto que le rodea.VSPACE y HSPACE: Opcionales, permiten fijar el espacio vertical y horizon-

Entre las órdenes APPLET y / APPLET se pueden colocar parámetros para el

upplet con la sintaxis:

<PARAM N A M E = n o r n b r e - a r g u m e n t o V A 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 al applet. El nom-bre argumento  puede escribirse encerrado o no entre comillas y no se

hacedistinción entre mayúsculas y minúsculas.- VALUE: Valor que se desea enviar al upplet mediante el parametro. El

valor que se envía también puede escribirse encerrado o no entre comillas.

Es importante tener presente que los parámetros pasados a un upplet  pueden servarios, resultando necesario especificar para cada uno de ellos un nombre( NAME)y un valor (VALUE). Otro factor a considerar es que si se desea que lasapplets que trabajan con parámetros puedan ejecutarse siempre, conviene que en lasmismas se proporcionen valores por omisión para dichos parámetros. Por último,

diremos que los parámetros se reciben en el upplet siempre como cadenas median-

te el método get par amet er :

 public j ava. l ang. Ct r i ng get P ar a met er ( j av a. 1ang. St r i ng pl)

Page 305: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 305/482

App le fs

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 el valor -argumentodel parámetro cuyo nombre ( NAME) es nombre -argumento; si no lo encuentra,devuelve n u 11.

11.2.1. Edición de un documento HTML y-ejecución de applefs

La edición de una página HTML se realiza con un editor de texto. Una vez escrito

el código en el editor, se debe almacenar con la extensión HTML.La visualización de la página Web que incorpora un applet se podrá efectuar

usando un navegador o el visor de applets,appletviewer; de ambas formas el appletse carga y ejecuta automáticamente.

 FORMATO BÁSICO  DE UNA P ÁGINA WEB QUE INCORPORA UN AP PL ET

<HTML>

<HEAD></ HEAD><BODY>

<APPLET

CODE= nombr e- de- l a- cl aseWI DTH= númer ohei ght = númer o >

</ APPLET>

</ BODY></

TML>

Ejemplo

Una página HTML que incorpora un applet al que se le pasan parámetros podría serla mostrada en la Figura 11.1.

Page 306: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 306/482

292 Java 2. Manual de programación

<HEAD>

;/HEAD,

<RODY>

<HI .EjernpIo</Hl>

<UL>

~TlTLE>T&iacute, iulocírlTLE>

< L l >

Lino

<LI>

Dos </Liz

</UL>

<I-- Colocacion delcodiaa HTML aue i n t e r es e - - >

4 P F L E T

CODE = libroTenia11 El4pplet

c lass

WIDTH = 220

HEIGHT =i on>

~ P A R A M

 NAM E =C o l a r VALJE

='w5,1nn,inn :

cPARAM  NAME = " Nombre "VALUE

="Cadena">

aAPFLET>

</BODY,

:/HTML>

Figura 11.1. Página T. ht ml .

Es conveniente observar el código HTML y, sobre todo, cómo se especifica enCODE el 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 Figura 11.2 recibe como cadenas los  parámetros Nombre yCol or. Dicho upplet no adjudica valores por omisión para los parámetros, ya queel ejemplo pretende ser una demostración sobre el paso de los mismos y, si se pro-dujeran errores basta con que éstos se visualicen. Es importante destacar trata-miento del parámetro Color que en el mencionado upplet se efectúa. Es necesariotener en cuenta que en Java el color está encapsulado en la clase Col or , que defi-ne algunas constantes para especificar un conjunto de colores comunes, pero ade -

más es posible definir colores utilizando constructores de color. De esta forma es posible especificar cualquier color y después Java busca el más cercano al solici-tado en función de las limitaciones del sistema donde se esté ejecutando el pro-grama o applet. El tratamiento efectuado es debido a que applet exige recibircadenas como parámetros y el constructor de color empleado requiere tres núme-ros enteros.

 public Col or (int pl, int p2, int p3)

Los  parámetros son valores delO al 255 que se correspondencon la cantidad de colores puros,rojo, verde y azul, utilizados enla mezcla para obtener el colordeseado.

Page 307: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 307/482

 App lets 293

 packagelibroema1 1 ,

importjava wt

*,

importavaapplet ,

 publicclass EjAppl et extends Applet

String nombre,

Stringcolor,

 publicvoidnit0

i

nom b re = getPa rame e r(1' N om b re" ),c o Io t = yet Pa rameter( Co IoI ),

int cl = Integerparselnt(co1or substring(0,3)),

int c2

= Integerparselnt(co1or subctring(4,6)),int c3 = Integer parselnt(co1or sub str in gp, l O)),

setBa ckgro und(n ew Color(c1 ,c2, c3)),

I

1

i pu bl ic void paint(Graphics g)

g setFont(new Font("Arial", Font BOLD, 14)),

y drawSt r ing (nombre

20,2O),

Figura 11.2.  Applet: Ej Appl et . j ava.

El método i ni t ( )es proporcionado por la clase Appl et e inicializa el uppletcada vez que se carga (posteriormente se ampliará el concepto de i ni t ) . El upplet

 puede hacer uso de pai nt debido a que la clase Appl et hereda de Panel , que asu vez lo hace de Cont ai ner y ésta de Component .

Tanto la página como el upplet se almacenan en C :\ 1i br o\ Tema11 .

Una vez creados el applet y la p la única operación necesaria será compi-lar el upplet,  para lo que se utiliza la siguiente instrucción:

C: \ l i br o\ Temal l >j avac Ej Appl et . J av a

Al abrir la página, usando por ejemplo Microsoft Internet Explorer, el upplet se

Otra forma de ejecutar un upplet es utilizando uppletviewer; éste simula uncarga y ejecuta automáticamente. El resultado se muestra en la Figura 11.3.

navegador elemental y necesita que se le pase como parámetro el nombre del archi-vo HTML donde se incorpora el upplet. Es decir, ejecutar la orden:

C: \ l i br o\ Temal l >appl et v i ewer

T . h t m

Page 308: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 308/482

294 Java 2. Manual  de programación

. ti0

m D o s

\\

Par ámet r o: Par ámet r o:r n

el

Nombr e yl ugar

donde seencuent r al a pági na

Figura 11.3. Resultado dela ejecución delapplet E] Appl et .cl as s.

El uso de uppletviewer requiere añadir al archivo HTML la orden:

CODECASE = . . \ ..\

11.3. ESTRUCTURA DE UN APPLET

La clase Appl et extiende la clase Panel del AWT y Panel extiendeCont ai ner que, a su vez, extiende Component ,  proporcionándose así a lasupplets todas las herramientas necesarias en la programación IGU ( G

 de Usuario) y, al igual que todos los programas que trabajan con IGU, las uppletsestán guiadas por eventos.

Las upplets disponen de cinco métodos que pueden sobreescribir, aunque no esobligatorio que lo hagan, pues tienen implementaciones por defecto que se invoca-rán automáticamente durante la ejecución de la misma. Cuatro de estos métodos son

 proporcionados por la clase App1et :

 public void i n i t ( )

Inicializa el applet y es invocado  por elA

o el navegador cuando se carga elapplet.

Page 309: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 309/482

 Applets 295

 public void s t a r t)

Se ejecuta a continuación de i ni t y también cadavez que el usuario del navegador regresa a la

 página HTML donde reside el upplet y debe contenerlas tareas que deban llevarse a cabo en estas

ocasiones.

 public voids t o p ( )

Se ejecuta cuando el usuario abandona la páginaHTML en la que reside el applet.

 public void destroy ( )

Libera todos los recursos que el applet está utilizandoy se ejecuta antes de que el applet se descarguecuando el usuario sale de la sesión de navegación.

El quinto método es pai nt  perteneciente a la clase Cont ai ner , que se invo-

ca para dibujar en el applet al iniciar su ejecución, así como cada vez que el mismonecesita redibujarse. Un ejemplo se presenta cuando el applet se oculta por una ven-

tana y luego esta ventana se mueve o se cierra.

 ESTRUCTURA BÁS ICA  DE UN APPLET

import j ava. awt . * ;

importj ava. appl et . * ;

 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

( )

{ / I . .. i

 public void s t a r t O{ / / .. . I

 public void s t o p 0

{ / I . .. public void destroy O

{ / / .

.I

 public void pai nt ( Gr aphi cs g)

{ / / .. I

I

Otros métodos de interés cuando se trabaja conupplets

son: public void recize(int

pl,

int p2)

Redimensionar el applet.

Page 310: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 310/482

296 Java 2. Manual de programación

 public void r epai nt ( )

Repintar el upplet a petición del programa.

 public void updat e( j ava. awt . Gr aphi cs

pl)

Es llamado por r epai nt y, como pai nt , se utiliza para dibujar en el upplet, ofreciendo la posibilidad de efectuar repintados incrementales.

 public void s hows t at us ( j av a. l ang. Ct r i ng pi

Muestra un mensaje en la barra de estado del navegador o 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 p2).

Devuelve un objeto i mage que encapsula la imagen encontrada en la dirección especifica-

da mediante el parámetro p l y cuyo nombre es el especificado como segundo parámetro.

 public j ava. appl et . Audi oCl i p get Audi oCl i p ( j ava. net . URL pl,

j ava. l ang. St r i ng p2).

Devuelve un objeto Audi ocl i p que encapsula el fragmento de audio encontrado en ladirección especificada mediante el parámetro pl y cuyo nombre es p2.

 public j ava. appl et . App1et Cont ex t ge t Appl e t Cont ext 0

Obtiene el contexto del upplet.

 public j ava. net . URL ge t CodeBase0

Obtiene el URL del upplet.

 public j ava. net . URL get Document Base0

Devuelve el URL del archivo HTML que inició el upplet.

 public abstract void showDocument ( j ava. net . URL p i )

Muestra, desde el contexto de un upplet, el documento especificado mediante el parámetrop l .

Es un 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 abstractj ava. appl et . Appl et get Appl et ( j ava. l ang. St r i ng

pl)

Devuelve el upplet de nombre p l , si dicha upplet se encuentra en el contexto actual, en otrocaso devuelve nul l Definido en la interfazj ava. appl et . App1et Cont ex t

Page 311: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 311/482

 Applets 297

Además de Appl et Cont ext que permite acceder al entorno de ejecución delapplet, la clase Appl et dispone de otras dos interfaces mas: 1) Appl et St ub,

 proporciona mecanismos para la comunicación entre el applet y el navegador; 2)

Audi oc l i p, reproduce archivos de sonido. La incorporación de imágenes y soni-do a un applet se verá más adelante.

Ejemplo

Applet que calcula el volumen de una esfera y lo muestra en la barra de estado.

 package l i br o . Ter nal 1;

import j ava. awt . * ;

import j ava. awt . event . * ;

importj 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 ( )

i

mensaj e = new Label ( " I nt r oduzca el r adi o y pul se <RTM>:

" ) ;

val or = newText 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 o r med( Act i onEvent e)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. P I *Mat h. pow( r adi o,3) ;return vol umen;

I

Page 312: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 312/482

298 Java 2.Manual  de programación

Figura 11.4. Resultadode la ejecución delapplet Es f er avol . cl ass.

 Archivo  HTML ( Pagi na . HTML)

<HTML>

< H E A C >

</ HEAD><BODY>

<APPLET

CODE=l i br o. Temal l . Es f er aVol . c l as s

NAME=Es f er aVol

W DTH=32OHE; GHT=l OO

>

< / A P P ¿ E T >

</ BODY>

</ HTML>

11.4. TRANSFORMACIÓN DE APLICACIONES EN APPLETS

Las técnicas generales a seguir para transformar en upplets las aplicaciones conIGU desarrolladas en Java son:

Añadir a las importaciones del programa la del paquete j ava .appl et . .

Hacer que la clase que define el applet extienda Appl et . La sustitución deFr ame por Appl et obliga a eliminar las posibles llamadas a s et Ti t l e y acambiar di spose por dest oy.

Reemplazar el constructor de la clase por el método i ni t .Eliminar el método mai n.Eliminar las llamadas a Syst em. exi t .Hacer que la entrada y salida de datos se efectúe siempre a través del AWT.

Page 313: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 313/482

Appleis 299

Tener en cuenta que el administrador de diseño por defecto para las applets es

Crear un archivo HTML que incorpore el applet.Fl owLayout .

Se requiere, además, tener presente las siguientes consideraciones:

Los applets,  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ónmultihilo, deben detenerse los hilos de unapplet cuando se sale de la página Web en la que el mismo reside. Para ello, se

sobreescribe el método s t o p del applet. Los hilos se reinician en el métodos t a r t del applet que se invoca automáticamente cuando el usuario retorna ala página Web.Los applets sólo pueden crear conexiones por red con la computadora de la que

 proceden.

Ejemplo

Transformar en applet la 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 0

publ i c voi d i ni t0

t hi s . s et L ayout ( new Bor der 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;

Page 314: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 314/482

Page 315: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 315/482

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 a do r es . 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' , thisj ;

pane l Oper ador es . add( obt i ene ) ;

obt i ene. addAc t i onL i s t ener ( obt i enej ;

 Applets

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 adc r e. s ) ;

Panel pane l Resul t ado

= newPanel ( ) ;

panel Resu l t ado . set Layout (new Fl owLayout (

j j ;

r esul t ado = new Text F i 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;

I

esDeci mal = true;di gi t 0

' f

. Il .

I

I

else

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;

1

else

r epai nt ( ) ;

r es ul t ado. s et Text ( r es ul t ado. get Text ( )

+

di gi t 0 1;

Page 316: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 316/482

302

Java 2. Manual  de programación

void cal cul a ( charotrooperador)i

double numer o;numer o = ( newDoubl e ( r esul t ado. e tTex t ( ) ) .doubl eval ue ( ) ;

i f ( (ot r oNumer o operador ==

' ='

&&

otrocperador

! ='

)

swi t ch(perador

)

i

case I t ' :

t ot al t= numer o;br eak;

case I- :

t ot al -= numer o;br eak;

case * I :

t ot al* =

numer o;br eak;

case / I

:

t ot al / = numer o;br eak;

case x' :

case ' ' :

t ot al = numer o;br eak:

1

r esul t ado. set Text

(

( new Doubl e ( t ot al ) ) . os t r i ng( )

)

;

1

oper ador = Gt r oOper adGr ;

ot r oNumer o

= t r ue;esDeci mal = f al s e;i f ot rocpe rador == '

1

i

r esul t ado. set Text ( 0 ) ;

oper ador = ' ' ;t ot al = 0. 0;

1

classBot ones ext endsBut t on i mpl ement sAct i onLi st ener

i

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

Page 317: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 317/482

Applets 303

 p ub l i c voidact i onPer f o r 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

 Archivo  HTML ( PagCa l c . HFML)

<HTML>

<HEAD>

< T I T T E , C a l c u i a d o r a < / T I T = E >

<

/

H E A C >

<BODY>< A P P L E ,

C03Y =l i b r o . T ei a ; l . Ca ~c u i ~d ~~a . c l a s s

NAME=Ca1cui ado raW DTH=2 OC

HEI GHT=14@ >

</APPLET>

</ B03Y>

</ HTML>

Cuando un programa no trabaja con interfaz gráfica de usuario, su transforma-

ción en applet conlleva modificaciones más profundas, ya que se requiere pasar auna programación dirigida por eventos.

Ejemplo

Transformar en applet una aplicación que rellena un vector con1

O números enterosaleatorios, muestra los números generados y la media de los mismos.

/ / Apl i cac i ón

class LLenaAr r

 pub 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 in t [nE le rns ] ;

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 ;

Page 318: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 318/482

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

/ / pplet

i mpor t] ava. awt . * ;

i mpor t ] ava. appl et . * ;

publ i c c l ass LLenaArr2

ext 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) ;

Page 319: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 319/482

 Applets 305

g. dr awSt r i ng( " La medi 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>

<APPLET

CODE= LLenaAr r 2. c l ass

WI DTH= 400HEI GHT= l o o >

< / A P P L E T >

</ BODY>

<

/

TML>

Ejecución

C: \ l i br o\ Temal l >appl et v i ewer numer os . ht m1

El resultado se muestra en la Figura 1 1.5.

7 2 9 6 8 6 1 8 1 3

Lamed iaes 51

Figura 11.5. Resul tadode la ejecucióndelapplet

LLenaArr .c l ass

Page 320: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 320/482

306 Java 2. Manual de programación

11.5. INCORPORACIÓN DE SONIDO

Para reproducir sonidos desde un applet, se comienza por cargar el archivo de soni-

do mediante public j av a. appl et . Audi oC1i p get Audi oCl ; p( ; ava. net . URL  pi,

l ava. ang. St r i ng p2)

y posteriormente se controla la reproducción mediante los métodos proporcionados por Audi ocl i p.

Ejemplo

Audi oc l i p audi oc l ;

audi ocl = get Aud i 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 clip.

La interfaz Audi ocl i p del paquetej ava .appl et define los siguientesmétodos:

 public abs t rac t void l o o p ( ) Reproduce el archivo de forma continua.

 public abs t rac t void pl ay( ) Reproduce el archivo.

 public abs t rac t void s t o p ( )

Detiene la reproducción.

La versión 1.3 de la Plataforma 2 de Java incluye una nueva y poderosaA P I (

j avax .sound) que permite capturar, procesar y reproducir audio y MIDI.Este A P I  permite una flexible configuración del audio y del sistema M I D I , inclu-yendo métodos para que las aplicaciones puedan preguntar al sistema cuáles son losrecursos que están instalados y disponibles. Los archivos de audio pueden ser de losformatos AIF , AU y WAVy

los

de música M I D I  Ti po O , M I D I  Ti po 1y RMF.

11.6. INCORPORACIÓN DE IMÁGENES

El método a seguir para la incorporación de imágenes a un applet es similar al anterior -mente descrito para la incorporación de sonido. La imagen se carga mediante el método

 public j ava . awt . I mage ge t I mage ( j ava . net . URL

pi,

j ava. l ang. St r i ng p2)

Page 321: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 321/482

Applets 307

en el que pi representa el lugar de ubicación de la imagen, mientras que p2 es elnombre del archivo que la contiene, que puede ser de tipo  j pg o gi f , y se puedemostrar utilizando

 p ub l i c abstract  booleandr awI mage( j ava. awt . 1mage

 p l , i n tp2,

i n t p3, j ava . awt . i mage . I mageObser ver

p4)

El primer parámetro p l es la imagen, el segundo, p2, y tercero, p3, representanel lugar donde debe situarse la imagen en el applet (en realidad son las coordena-das para la esquina superior izquierda de la misma) y el cuarto, p4, es una refe-

rencia a un objeto I mageobser ver ,que puede ser cualquiera que implemente lainterfaz I 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 ub l i c abstract  boolean dr awI mage( j ava. awt . 1mage  p l , i n t p2,

i n t p3 , i n tp4,

i n tp5,

j ava . awt . i mage. I r nage0bserve r

p6)

Este segundo método permite establecer una anchura y altura determinadas para

I mageobser ver es una interfaz implementada por la clase Component quela misma mediante los parámetros p5 y p6.

define el método

 public abstract  boolean i mageupdat e ( j ava. awt .I magepl,

i n t p2,

i n tp3,

i n tp4,

i n tp5,

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étodo i mageupdat e devolveráf al se cuando se haya completado la carga de una imagen y 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 altavoz y haga sonar un pitidoespecial tras la introducción de los datos.

 package l i br o . Ter nal 1;

import j ava. awt . * ;

import j ava. awt . event . * ;

import j ava. appl et . * ;

Page 322: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 322/482

308 Java 2. Manual de programación

 public class Esf er aVol 2 extends 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 oduzca el r adi o y pul se <RTM>: " ) ;

val or = new TexL Fi el d( l 0) ;

add( mensaj e1 ;

ada ( val or );val or . addAc t i onl i s t ener ( t hi s ) ;

 public void act i onPer f o rmed( Ac t i 0nEvent e)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

Page 323: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 323/482

CGDE=i i br o. Temal l . Es f er aVol 2. c l as s

NAME=Esf er aVol 2

W DTH=320

HEI GHT=100 >

<

/ APPLES>.

< / B O D Y

>

</ HTML>

I I

Figura 11.6. Resultado dela ejecuciónde Es f er aVol 2. cl as s.

Si se requiere cargar varias imágenes simultáneamente en lugar de la interfazI mageobser ver y su método i 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étodos

publ i c Medi aTr acker ( j ava. wt . .Componentpl)

Permite crear la instancia.

publ i c voi d addI mage ( j ava. awt . I mage p l , i nt

p2)

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 delmisma.

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 nt pi

Obliga 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 decargar.

Page 324: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 324/482

 A 12

r r o g r amac i on

concurrente:Hilos de ejecuciónCONTENIDO

12.1. La programación mult ihilo enJava.12.2. Estados de unhilo.12.3. Creación de hilos.12.4. Planificacióny prioridades.12.5. Hilos de tipo demonio.12.6. Grupos de hilos.12.7. Sincronización.

12.8. Animaciones.12.9. Doble buffer.

311

Page 325: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 325/482

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 de los diferentes 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 de los casos, los hilos habrá quecoordinarlos, por ejemplo, para impedir que uno lea datos de unaestructura antes de que otro los escriba en ella.

12.1. LA PROGRAMACIÓNMULTlHlLO EN JAVA

Los hilos de ejecución en Java están implementados en la clase Thread, que forma parte del paquete  j ava . l a n g . Cada hilo (thread) tiene un principio, unflujo deejecución y un,fin definidos, pero no es una entidad independiente sino que debeejecutarse en el contexto de un programa. La clase Thread implementa el con-cepto de ejecución multihilo de una forma independiente de la plataforma donde se

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 que los hilos se eje-cuten de forma concurrente, esto es, alternada en el tiempo, dando la apariencia deuna ejecución simultánea. Por esta razón, la alternancia de código se efectúa deforma muy diferente en distintas computadoras.

Imp~rtante: Los sistemas operativos tienen diferentes formas de planificar laconcreta de la concurrencia de ope-

. Cuando varios hilos con la mismaede predecirse durante cuánto tiempo se

ido en un sistema específico.

Page 326: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 326/482

Programación concurrente: Hilos de ejecución 313

12.2. ESTADOS DE UN HILO

Los objetos hilo de Java tienen cuatro posibles estados: nuevo, ejecutable,bloqueado,

muerto (Tabla 12.1 .

Tabla 12.1 Estadosde objetos hilo

~~~ ~ ~ ~ ~ ~ ~~ ~~

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.

Ejecutable Se accede con una llamada al método s t a r t . éste método asigna los recursosnecesarios para ejecutar el hilo, planifica su ejecución y realiza una llamada a sumétodo r u n , que es el que contiene el código con las acciones que debe realizarel hilo y habitualmente es un

bucle.Como

los hilos se alternan, un hilo en estadoejecutable no tiene por qué ser el que, en un determinado momento, se encuentraejecutándose.

Bloqueado Un hilo puede estar bloqueado como consecuencia de:Una llamada al método s l eep, se tendrá así un hilo dormido que, al cabo deun cierto tiempo, despertará y pasará al estadoEjecutable. El método i n t e r r u p t

consigue 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 como wai t , y i e l d o  j o i n .

M  A este estado se llega tanto tras completar el método r u n . El método s t o p deversiones anteriores ya no se usa en

Java2,

debido a que ocasionaba problemas porejemplo por no limpiar, antes de finalizar la ejecución de un hilo, el estado de losobjetos con los que el mismo se encontraba trabajando.

Es preciso tener en cuenta que un hilo puede pasar fácilmente del estadoBloqueado al estado Ejecutable, 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 s Al i ve,que devuelve true siempre que el hilo no se encuentre en los esta-

dos Nuevo, ni Muerto. Otro método que indirectamente proporciona tambiéninformación sobre el estado de un hilo es j o i n , que obliga al hilo llamador a espe-rar hasta que finalice el hilo al que se llama. El método  j oi n permite, además,especificar el límite de tiempo que se esperará a que el otro hilo termine su trabajo.

Un hilo Muerto no puede volver al estado Ejecutable.

Importante: Los métodos st op, suspendedy r esume pertenecen a ver -siones anteriores y ya no se usan en Java2.

Page 327: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 327/482

314 Java 2. Manual  de programación

12.3. CREACIÓN DE HILOS

La creación de hilos en Java se puede efectuar de dos formas:

1 . Usando una instancia de una clase que implemente la interfaz Runnabl e.Esta interfaz sólo tiene el método r un, que es el método donde habrá quecolocar el código que debe ejecutar el hilo y su implementación constituye lamejor elección desde una perspectiva orientada a objetos.

2. Creando una subclase de la clase Thread para obtener un objeto que here dede ella. Hay que tener en cuenta que Java no admite la herencia múltiple, porlo que cuando se utiliza este método y se hereda de Thread , dicha subcla-

se ya no podrá serlo de ninguna otra.

En ambos casos, para que el hilo comience su ejecución es necesario: I ) crear el

El siguiente es un ejemplo de creación de un hilo implementando la interfazhilo, 2) llamar al método s t a r t .

Runn a b1e:

 public class Pr i nci pal

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

Encuent r a bc l = new Encuent r a ( "0012R" );

1

 public class Encuent r a implements Runnabl eI

 Thr ead t ;St r i ng c l aveb;

 public Encuent r a ( St r i ng c l ave)i

cl aveb = c l ave;t = new  Thr ead (this);

t . s t a r t 0 ;

 public void run ( )

i

Cys t em out . pr i nt l n( " Es t a es l a t ar ea a r eal i zar por el h i l o" ) ;

t=Y

Thr ead. c ur r ent Thr ead( ) . c l eep( 2000) ;

1

catch (I nt er r upt edExcept i on e)

Page 328: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 328/482

Programación concurrente: Hilos de ejecución 315

t

I

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

Después de compilar el programa, ejecute C : \ l i br o\ Temal 2>j

avaPr i nci pal . En este ejemplo, una clase llamada Encuent r a implementa lainterfaz Runnabl e, lo que obliga a Encuent r a a implementar el método r un.A continuación se construye un hilo con el constructor

 public  Thr ead ( l ava.i ang. Runnabi e PI)

cuyo p es una instancia dela clase que implementa la interfaz Runnabl e,

y después se llama al método st 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étodo r un, aunque éste

3uede llamar 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étodo s l eep.El método sl eep se utiliza cuando se pretende retrasar la ejecución de un hilo;

-ecibe como parámetro un número de milisegundos y hace dormir al hilo dichoi ú m e r o de 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-rumpirlo mientras está dormido. Cuando el hilo completa el método run se con-

iierte en muerto y finaliza. El hilo actual puede obtenerse mediante el métodoChr ead. cur rentThread ( ) .

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)t

Encuent 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;

Page 329: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 329/482

316 Java 2. Manual de programación

 public E n c u e n t r a 2 ( S t r i n g c l a v e )I

c la ve b= c l a v e ;

 public voidr u n ( )

i

C y s t e m . o u t . p r i n ~ l n("E s t a es l a t a rea a r e a l i z a r  p o r e l hi l o" ) ;t=Y

{

s ; e e p ( 2 0 0 0 ) ;

i

catch ( I n t e r r u p t e d E x c e p t i o n e )

S y s t e m . o i i t . p r i n t 1 1 1 ( " F i n " );

En este caso, el método r u n se coloca en una subclase de Thread. Esta clase,en vez de implementar la interfaz

R u n a b l e ,

extiende T h r e a d y redefine sumétodo r u n . El hilo se crea

i

la clase E n c u e n t r a 2 y, como en el casoanterior, para que comience su ejecución se recurre también a s t a r t .

12.4. PLANIFICACIÓN Y PRIORIDADES

Los sistemas operativos difieren en la forma de planificar la ejecución de los hilos.Solaris 7 , por ejemplo, usa multitarea por derecho de prioridad (preemptive) estoquiere decir que ejecuta un hilo de cierta prioridad hasta completarlo o hasta queestá listo otro hilo de más alta prioridad que lo desaloja. Windows utiliza reparti-

ción de tiempo por turno circular (round -robin), esto implica la concesión a cadahilo de una cantidad limitada de tiempo, transcurrida la cual el hilo puede ser desa -lojado por otro que esté listo con su misma prioridad; los hilos con mayor prioridadsiguen ejecutándose los primeros y desalojando, como siempre, a los de menor prio-ridad. Además, hay que tener en cuenta que Windows  NT es capaz de utilizarmáquinas con más de una unidad central de proceso (UCP). En un sistema con múl-tiples UCP los hilos del programa podrían ser planificados en UCP separadas.

Como Java puede rodar en diferentes sistemas, cada uno de los cuales tiene su propia forma de manejar hilos, no se puede predecir durante cuánto tiempo se eje-

cutará un hilo antes de que sea interrumpido en un sistema específico. Si en undeterminado momento existen varios hilos en estado Ejecutable, se ejecutará pri-mero el que tenga mayor prioridad y, sólo cuando finalice o se detenga dicho hilo,se iniciará la ejecución de otro con menor prioridad; por otra parte, si un hilo con

Page 330: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 330/482

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-

taforma y sólo se presenta ante hilos de idéntica prioridad, y métodos que puedenayudar a resolverlo son sl eep y y i e l d .

El método sl eep quita el control de la UCP a un hilo con cualquier prioridad,ofreciendo oportunidad para que otros se ejecuten. Además, un hilo puede ceder suderecho de ejecución efectuando una llamada al método yi el d, pero sólo a hilosadecuados y disponibles; es decir, a hilos ejecutables con igual prioridad que elmismo, por lo que éste método no asegura que el hilo actual detenga su ejecución.Es redundante en los sistemas con repartición de tiempo por turno circular. Losmétodos suspend y r esume pertenecen a versiones anteriores y ya no se usan en

En Java la prioridad de los hilos por omisión es 5 y, cuando se crea uno nuevo,hereda la prioridad del que lo creó. La prioridad podrá ser modificada mediante elmétodo

'

Java2.

 public 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 que vale 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

 public final int get P r i or i t y ( )

12.5. HILOS DE TIPO DEMONIO

Un demonio es 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 como demonios. Paraespecificar que un hilo de ejecución es de tipo demonio, se deberá realizar una lla-mada al método

 public final void setDaernon (boolean pl)

 pasándole como argumento t rue. Para determinar si un hilo es de este tipo, sedeberá llamar al método

 public final boolean isDaernon

( )

Page 331: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 331/482

318

Java 2. Manual de programación

12.6. GRUPOS DE HILOS

Los hilos 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 colo -ca por defecto en el grupo del hilo bajo el cual se crea y para colocarlo en otro hayque especificarlo en el constructor, no siendo posible cambiar a un hilo de grupotras su 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 oup

pl , j ava. l ang. Runnabl e p2)

 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

p3)

El grupo de un hilo actual puede obtenerse medi 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 de eje-

cución, sino también otros grupos. La clase Thr eadGr oup implementa las carac-terísticas y  posibilidades de los grupos de hilos y dentro de ella es posible destacarlos siguientes métodos:

 public  Thr eadGr oup (

j ava. l ang. St r i ng pi)

Crea un grupo de hilos, el parámetro pl 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ámetro p2 es el nombre para elgrupo hijo.

 public int ac t i v ec ount

( )

 Número de hilosE

de un grupo de hilos

 public final void d e s t r o y ( )

Destruye un grupo de hilos y sus subgrupos.

 public int enumer at e ( j ava. i ang. Thr ead

p 1 [

1

Devuelve en el array una referencia a todos los hilos activos del grupo.

 public int enumer aze ( j ava. 1ang. Thr eadGr oup p i [ 1 )

Devuelve en el array una referencia a todos los grupos activos del grupo.

Page 332: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 332/482

Programación concurrente: Hilos de ejecución 319

 public final int; .

,'../, ' , ' I

Devuelbe la prioridad m á x i m a

q u e

puedc

tcricr t in h i l o d c u n g r u p o

 public final-J-. J.

',

f,

Devuelve el nombre del grupo

 public finalj avc . l anq. Thr e, ~J r 2r &L

~ J C I 0

Devuelve el grupo padre de un grupo de hilos

 public final Boolean i s üaemon

( )

Indica si el grupo es un demonio.

 public final void s et Maxpr i or i t y

(int

pl)

Establece la prioridad máxima para un grupo.

 public final voids et Daemon

(booleanpl)

Establece si el grupo actual es o no un demonio.

12 .7 . S INCRONIZACI~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 alguna forma y 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 de p

t en el que existe un productor que genera datos y los almacena enuna estructura de tamaño limitado, por ejemplo un array, desde donde se extraen porun consumidor. El productor será un hilo que añade los datos a la estructura tanrápido como puede, mientras que el consumidor va 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 el

array en un instante determinado e impedir que, de momento, siga trabajando el productor cuando el array esté lleno o el consumidor si se queda vacío, como semuestra en el siguiente programa.

Page 333: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 333/482

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 rgs )

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 dponer ( 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 qu i 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;

Page 334: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 334/482

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 . st ar t ( ) ;

 public void r u n 0

i

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) ;

1

catch (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 voidr u n ( )

t

for (int i = O; 1 < 5; i ++)

dt os . qui t ar ( ) ;

try

i

 Thr ead. c u r re n t Th re ad

( )

. s l eep( 100);

Page 335: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 335/482

322 Java 2. Manual de programación

El  problema que surge ahora es debido a que puede ocurrir que, tras un incre-mento del contador por parte del h i l o l , y antes de que éste coloque un nuevodato en la estructura, el planificador decida dejar de ejecutar el productor y comen-

zar a ejecutarc

y pase a ejecutarse el h i 1 0 2 , que quita un dato de la posición indicada por el contador, donde aún no hay un dato válido, y decrementa

el contador; si ahora vuelve a ejecutarse el h i l o l como ya tenía efectuado suincremento de contador no lo realiza de nuevo y coloca el dato actual sobrescri-

biendo uno anterior. Java soluciona este tipo de problemas mediante la sincroniza-

ción, usando variables de condición y monitores.. Los monitores son objetos especiales asociados a datos que controlan el acceso a

los mismos. Por otra parte, se denominan secciones críticas a aquellos bloques decódigo de un programa que acceden a datos compartidos por hilos de ejecución dis -

tintos y concurrentes. Cuando, en Java, se marcan secciones críticas con la palabrareservada synchr oni zed se asocia un Único monitor a los datos contenidos enellas; de esta forma, durante el tiempo que un hilo permanece dentro de uno de estos bloques sincronizado, los demás hilos que quieran acceder ai mismo o a cualquierotro sincronizado sobre la misma instancia tienen que esperar hasta que el monitoresté libre, pues sólo un hilo  puede obtener el monitor sobre los datos en un instantedado y los hilos que no poseen el monitor no pueden tener ningún tipo de acceso alos datos con él asociados. Para aplicar todo esto al ejemplo anterior bastaría marcarcon synchr oni zed los métodos poner 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 [ c on t ado 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 [ c on t ado 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, todos los  bloques que acceden a losrecursos compartidos deben estar sincronizados. También hay que tener en cuentaque, aunque los bloques sincronizados pueden no ser métodos completos, en gene-

Page 336: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 336/482

Programación concurrente: Hilos de ejecución 323

ral, la mejor opción es que lo sean.  No hay problema en que un hilo llame a unmétodo que accede a datos para los 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 hilosceda voluntariamente el monitor al otro, estas cesiones voluntarias se efec-túan a través de los métodos wai t , not i f y y not i f yAl l de la claseOb] ec t .

En el problema p citado como ejemplo, si uno de los pro-

cedimientos de monitor descubre que no puede continuar, situación que correspon-dería a los casos array lleno  para productor y v  para consumidor, 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 despertar y volver a competir por

el monitor ( not i f y) .

Métodos

 public final void wai t ( ) Cuando un hilo en ejecución invoca el método

wai t  pasa a una cola asociada al objeto y suejecución se detiene hasta que otro hilo activeel método not 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-tando un método sincronizado puede despertaral primero de la cola asociada ai objeto.

 public final voidn o t i f y A l l ( )

Convierte en Ejecutables todos 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 bloques de código de un programa que acceden a datos compartidos por hilos de ejecución distintos y con-

currentes; si las secciones criticas se marcan con la palabra s y n c h r o n i z e d

se asocia un único monitor a los datos contenidos en ellas.Los monitores son objetos especiales asociados a datos que controlan el acce-

so a los mismos, ya que sólo un hilo puede obtener el monitor sobre los datos enun instante dado. Un hilo puede ceder voluntariamente el monitor al otro a tra-vésdelosmétodos w 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 .

Page 337: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 337/482

324 Java 2. Manual de programación

Ejemplo

 public class Pr i nc i pal s 2

'L

 public static voidpai n ( St r i ng[ a r g s )

Dat os2 d = new Da t o s 2 0;

P roauc 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 ( )

t

ad = new doubl e [

4;

;

 public synchronized void poner ( double d)

while ( c or . 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 repi 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[ c ont ador l = d*1000 cont ador ;i

not i f y ( ) ;

 public synchronized void qui t ar ( )!while ( cont ador < O)

t

t=Y

t

wai t ( );

Page 338: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 338/482

Programación concurrente: Hilos de ejecución 325

i

cat ch ( I nt er r upt edCx cept i on e)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 ements 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 0

t

for ( i nt := O ; i < 3; i t + )

dt c c . 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 cs;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

Page 339: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 339/482

326

Java 2. Manual  de programación

ci t os . qui t ar ( );

1

12.8.  ANIMAClON

ES

Un upplet trabaja con animaciones cuando efectúa unapresentación

sucesiva deimágenes, cada una con pequeñas diferencias con respecto a la anterior, dando asíla apariencia de movimiento. Estas applets, además de dibujar las imágenes,deben poder responder a las acciones del usuario, por lo que las animaciones

deben ejecutarse como hilos independientes que no obstaculicen otras tareas y loshilos deben detenerse cuando se sale de la página Web en la que reside el applet.Para todas estas tareas:

El upplet implementará la interfaz Runnabl 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étodos s t a r t y s t o p del applet con el código ade-

cuado para convertir en Ejecutables y Muertos los 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 asigna n u l l al/los hilo/s

 para que se puedan recolectar susrecursos cuando se abandone la página Web en la que el applet reside.

Page 340: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 340/482

Programación concurrente: Hilos de ejecución 327

Por ejemplo:

 public void s t o p ( )

hi l octop ( )

;

 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 con GUI, no es necesario que se trate de un applet.

Nota:  No confunda los métodos s ta r t y st opde los hilos y de las upplets.El método stop 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. DOBLE BUFFER

Una técnica muy empleada en las animaciones con la finalidad de reducir el parpa-deo es el doble b Esta técnica permite que, mientras se presenta un imagen en

 pantalla (primer b también puede tratarse de texto o gráficos, se pueda ir ela-

 borando en memoria la imagen siguiente (segundo b El doble buffer requiere:

La creación de un objeto Image vacío, que actúa como buffer. El método aemplear pertenece a la clase j ava .awt .Component :

 public  j av a, awt . I mage cr eat eI mage

(int

pl, intp2)

donde pi yp2

son la anchura y altura de la misma. Por ejemplo

i magen = c r eat ehage ( ANCH0, ALTO

) ;

Obtener un contexto gráfico para dibujar la imagen en segundo plano, con elsiguiente método de la clase j ava .awt .Image:

 public abstract j av a. awt . Gr aphi c e g et Gr a ph i c s 0

Page 341: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 341/482

328 Java 2. Manual  de programación

Por ejemplo,

cont ext oGr a f = i ma ge n. ge t Gr a phi c c 0 ;

Mostrar el contenido del buffer mediante dr awI mage de j ava.awt . Gr aphi cs

 pub l ic 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 misma y el cuarto es elobservador. Por ejemplo,

g .ar awi mage ( i magen, O, O, t h i s )

;

Pero tenga presente que dr aw I mage tiene otros muchos formatos mediantelos cuales puede ser invocado.

Ejercicio

Pelota que rebota en los  bordes de un upplet; su movimiento se puede detener y

reactivar efectuando clics con el ratón sobre en cualquier posición del mismo(Fig. 12.1).

/ / Ej empl o de ani maci ón

y dobl e buf f er .

import ; ava. awt . * ;

import j ava. awt . event . * ;

import j ava. appi et . * ;

 p ub l i c class Rebot a extends Appl et implements Runnabl e,MouceL i s t ene r

{

 pub l i c f i n a l i n t ANCHO = 2 0 0 ;

 pub 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;

 booleane2ecut abl e

= t r u e ;Ts r ead hi i o = n u l l ;

I mage i magen;Gr aphi cs c ont ex t oGr af ;

 pub l i c void i n i t ( )

Page 342: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 342/482

Programación concurrente: Hilos de ejecución 329

I

r 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 e

superior del applet */

i n t r ango = ANCHO -  TMI N;px = ( i n t ) ( Mat h . r andom0 * r ango) ;

try

i

i magen = cr eat eI mage ( ANCH0, ALTO ) ;

cont ext oGr af = i ma ge n. get Sr aphi c s 0;

I

cat ch ( Except i on e)t

cont ext oGr af = nul l ;1

addMous eL 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 ( );

I

publ 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 ) ;

1

cat ch( Except i on e )

i }

Page 343: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 343/482

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 voidupdat e ( Gr agh i c s 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 r nage ( i magen,O, O, this );

else

d i b u j a (

g ) ;

 public voiddiCu

1 a ( Gr aphi cs g )

y. s et Col or ( Col or .gray) ;g. f i l LRec t

( O,O, ANCEG, ALTG ) ;

g. s et c oi or ( C o l o r . r ed) ;

y. f i l , Oval ( px, py, acz, al , ac t ua- )

;

 public void mousePr ecced ( YouseEvent e)

if ej ecut abl e

)

else

e ~e c u ~a b l e= ! ej ecut abl e;

hi l o r esume ( )

;

hi l os l s pend ( 1

;

Page 344: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 344/482

Programación concurrente: Hilos de ejecución331

1

 public void r nouc e R e l e a c e d ( Mouc e E ve n t e){ I

 public voidmouseEnt er ed ( MonseEvent e)

1 1

 public void r nouseExi t ed ( MouceEvent e)t i

 public void mousecl i cked ( MouseEvent e)I }

Unas Últimas aclaraciones: en el ejemplo expuesto, el método run se encarga deobtener la posición donde la pelota ha de ser dibujada, de forma que se consiga su

rebote en los bordes del  apple t, y manda que se redibuje. Cuando se presiona elratón, mousepr es s ed detiene o activa alternativamente la ejecución del hilo.

El archivo Rebot a. h t m creado es el siguiente:

 Archivo HTML

(Rebota.htm)

<HTML>

<HEAD>

</ HEAD><BODY>

<appl et

code=Rebot a. cl asc

name=Rebot a

wi dt h=200

hei ght =100 >

</ appl et >

</ BODY>

</ HTML>

Appl et st art ed1

Appl et st art edI

Appl ets tarted I

~~ _ _ _ _

Figura 12.1.  Applet Viewer muestraRebot a, cl as s.

Compilación

C:l i br o \ Temal 2>j avac

Rebot a. 3ava

Page 345: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 345/482

332 Java 2. Manual de programación

Ejecucion

conappietviewer

C: \ i i br o \ T e~a 12>a ppl et v i ewe r Rebot a . ht m

EjercicioEl siguiente applet que muestra el funcionamiento del método de ordenación deno-

minado método de l burbuja. Este applet  presenta dos botones; uno permite lageneración de un nuevo array aleatorio de números enteros y el otro lanza un hiloque efectúa la ordenación del mismo (Fig. 12.2). Cada número entero contenido enel array se representa en

su

correspondiente posición mediante un gráfico de barras,donde la altura de la barra se corresponde con el valor del número. El proceso deordenación aparece paso a paso, pudiéndose apreciar en cada momento los inter -

cambios que se van efectuando (Figs. 12.3 y 12.4).

Figura 12.2. Situación inic ial

El applet diseñ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 al 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 denac i onGr af i ca extends Appl et implements

Act:

onL s t en e r , RLI

n

nab1e

Page 346: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 346/482

Page 347: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 347/482

334

Java 2. Manual  de programación

i magen = cr eat eI mage( ANCH0, ALTO ) ;

cont ext oGr af = i magen. ge t Gr aphi cc ( ) ;

cat ch( Except i on e)

cont ex2oGr af = null;

 public void s t o p ( )i

1

hi l os t op ( ) ;

 public void pai nt ( Gr aphi c s g)

if( cont ext oGr af ! =null )

t

di buj a ( c ont ex t oGr af

) ;

g . r awI mage ( i magen, O O, this );

else

.di buj a( g ) ;

 public void updat e( Gr aphi cs g)

pai nt (

g

) ;

1

 public void di buj a ( Gr aphi cs g)

g. s et c ol or ( Col or .gray);g. f i l l Rect ( O, O, ANCHG, ALTO ) ;

for (int i = O; 1

< ar r Gr d. l engt h; i t +)

di buj aEnt ( g, a r r Gr d[ i ] ,

i )

;

/ * Cont r ol de Event os.Al pul sar el bot ón

nuevoArr

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 nuevaOr d 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 nadas i el ar r ay ya se est aba or denando.Una vez empezado el pr oceso de or denaci ón o se gener a un

nuevo ar r ay o hay que esperar a que di cho proceso t ermi ne * /

 public void act i onPer f or med( Act i onEvent e)i

if ( e . ge t Co ur c e 0 == nuevoAr r )

Page 348: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 348/482

Page 349: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 349/482

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 s u posi ci ón i

 p u b l i c vo iddi buj aEnt ( Gr aphi c s

g , 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. s et Col or ( c o1or deBar r a) ;

g. f i l l Rect ( x, y, w, h) ;

AOOlet

starfeu I

Figura 12.3. Fase intermediadel procesode ordenación,se observa cada intercambio.

Figura 12.4. Array ordenado.

Page 350: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 350/482

Programación concurrente:Hilos de ejecución337

El archivo Ord .h t m tiene el siguiente contenido:

 Archivo HTML ( Or d.ht m)

<HTML><HEAD><TI TLE>Pr oces o de or denaci ón en el mét odo de l a Bur buj a</ TI TLE>

</ HEAD><BODY>

<appl et

code=Or denac i onGr af i ca . c l ass

name=Or denaci onGr af i ca

wi dt h=640

hei ght =400

>

</ appl e t >

</ BODY></ HTML>

Page 351: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 351/482

II

Maneio

de excepciones

CONTENIDO

13.1. Conceptos generales.

13.2. Manejo de excepciones.13.3. Capturay tratamientode excepciones.13.4. Lanzar la excepción.13.5. Declarar la excepción.13.6. El bloque f i n a l l y .13. 7. Cr eaci ónde excepci ones.13. 8. Mét odosde l a cl ase Thr owabl e.

339

Page 352: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 352/482

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.El compilador 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 clase Error abarcan fallos graves de los que los pro-gramas no pueden recuperarse y, por tanto, no suelen ser capturadas por losmismos.La clase Except i on abarca las excepciones que los programas suelen captu-

rar; tiene varias subclases, entre las que destacan Runt meExcept i on,I OExcept i on e I nt er r upt edExcept i on.

- Runt meExc ept i on comprende errores en tiempo de ejecución que se producen al efectuar operaciones sobre datos que se encuentran en la memo-ria de la computadora, se subdivide en diversas subclases entre las quedestacan Ar i t hmet i c Ex cept i on y 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 este

 paquete se importa automáticamente.- I OExcept i on comprende los errores de entrada/salida y  pertenece al

 paquete  j ava .i o .- I nt er r upt edExcept i on, de cuyo tipo son los errores debidos a la

interrupción de un hilo de ejecución por otro, pertenece también a j ava .l ang.

Page 353: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 353/482

Manejo de excepciones 341

Además de disponer de todas estas clases, es posible extender la claseExcept i on o sus subclases y crear nuevos tipos de excepciones que respondan auna anomalía en el funcionamiento de un programa sobre la cual deben ser infor -mados los usuarios, aunque hay que tener en cuenta que no es conveniente utilizar

las excepciones como un método alternativo para especificar flujo de control.

Importante: Todos los errores que se pueden originar en un método, excepto losde tipo Error 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. Los

proga -

mas no están obligados a capturar ni declarar las excepciones del tipoRunt i meExcept i on.

 Throwabl e

Error

Except i on

I nt er r upt ed Except i on

Runt i meExcept i on

Ar i t hmet i cExcept i on

I l Legal Ar gument Except i on

r -Number For mat Except i on

1

~~

I ndexOutOf BoundsExcept i on

I

St r i ngl ndexOut Of BoundsExcept i onAr r ayl ndexOut Of BoundsExcept i on

. . .Nul l Poi nt er Except i on

I Legal Moni t or St at eExcept i on

. . .- I OExcept i on

Fi l eNotFoundExcept i on

,

. . .EOFExcept i on

- WTExcept i on

Figura 13. .

Excepciones,

Page 354: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 354/482

342 Java 2. Manual de programación

Dada la obligatoriedad impuesta por el compilador con respecto a la capturade algunas excepciones, hace ya tiempo que se viene utilizando código para la gestiónde las mismas y se ha visto ya que para capturar excepciones basta con escribir el códi-

-

go que se quiere controlar en un bloque t r y y especificar la excepción que se deseacapturar en una cláusula cat ch. Así ,si escribe el siguiente programa, el compiladorle obligará a modificarlo y capturar, de la forma especificada, la excepciónI OExcept i on que por la operación de lectura pudiera haber sido generada.

Ejemplo

El programa siguiente pide la introducción por teclado de un número entero, n,

comprendido entre 1y 2 O ; a continuación, muestra las sucesivas potencias de 2

desde 2 elevado a 1 hasta 2 elevado a n .

import j a v a . i o . * ;

 public c l a s s E: empl o

/ / E: enpl o 1.

 public s t a t i c void mai n ( St r i ng ar gs[ )

I nput St r eamReader i c r = newI nput St r eamReader ( Sy s t em i n) ;

Buf f er edReader br = new Buf f er edReader ( 1s r ) ;

St r i ng cadena;i n t n = O ;

Syc t em out . pr i nt ( " Deme un numer o ent er o ent r e 1 y 20 ' I ) ;

cadena = br . r eadLi ne( ) ;

n = I nt eger . par s eI nt ( cadena);i n t 1 = 1;

while( 1

<= n)

Sys t em out . pr i nt l n ( " 2" " +i +" = " +Mat h. pow( 2, ) ) ;

i t + ;

Si lo modifica de la siguiente forma, el compilador lo aceptará y funcionarácorrectamente cuando introduzca números enteros en el rango indicado, pero daráuna excepción si teclea una letra en lugar de un número o pulsa R ETUR  N (I NTR O) sinintroducir nada.

Ejemploimport 3

ava . C. *; public c l a s s Ej empl o2

Page 355: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 355/482

Manejo de excepciones 343

 public static void r a i n ( C r r L r g args [ ] )

!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 ac i ón de l a cadena,

debi do a que l as i nst r ucci ones en el CLoque t ry pasr i a?.

no ser ej ecut adas , per o ser i a i gual i n2c i al i z ar l a a I '

* /St r i ng cadena = " C" ;int n;Sy s t em out . pr i nt ( " Deme un númer o ent er o ent r e 1 y 2C " ) ;

t=Y

I

cadena = br .eadL i ne ( ) ;

1

catch ( I OExcept i on e)t }

n = 1nt eger . par s eI 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 ;

I

I

I

importante:  No se puede garantizar que las sentencias siguientes a un deter -minado catch vayan a ser ejecutadas.

13.2. MANEJO DE EXCEPCIONES

Las operaciones que se pueden realizar con excepciones son: captura y tratamiento(manejo), lanzamiento y declaración.

13.3. CAPTURA Y TRATAMIENTO DE EXCEPCIONES

Para capturar una excepción, se escribe el código que se quiere controlar en un blo-que t r y ; se especifica la excepción que se desea capturar en una cláusula ca tch y

se coloca el tratamiento para la misma en el bloque catch. La cláusula ca tch con-siste en la palabra reservada ca tch , seguida por el tipo de excepción que se deseacapturar y 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.

Page 356: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 356/482

344 Java 2. Manual de programación

 No se debe colocar una estructurat r y / c a t c h

 para cada una de las instruccio-nes de un programa que pueda lanzar una excepción, sino agrupar las que estén rela-cionadas en un único bloque t r y . En estos casos, es decir, cuando las sentenciasencerradas en un  bloque t r y  pueden producir más de una excepción, es posible

 poner varias cláusulas cat ch consecutivas; permite efectuar un tratamiento distin-to para cada una de las excepciones. La búsqueda de la excepción originada se efec-

tuará secuencialmente en cada una de lasclaúsulas cat ch, por tanto no se debe

colocar una claúsula cat ch que capture excepciones de una superclase antes deotra que capture las de una de sus subclases.

Ejemplo

Modificar el ejercicio de las potencias de modo que no se produzca una interrupciónsi se teclea una letra en lugar de un número o se pulsa R ET UR  N ( INTRO) sin introdu-

cir nada.

import j a v a . i o . * ;

 public c lass E

 jempl o3

 public 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 ( " Deme un númer o ent er o ent r e 1 y 20" ) ;

t r y

i

St r i ng cadena = b r . r eadL i ne ( );

n = I nt eger . par s eI nt ( cadena);

catch ( I OExcept i on e){/ / t r at ami ent o 11

catch( Nur nber For mat Except i on e)

{/ / 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 gene-

radas en un bloque t r y ,es utilizar una claúsula cat ch que capture excepciones de

Page 357: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 357/482

Manejo  de excepciones345

una superclase que englobe todos los tipos de excepciones que, por las instruccio-nes incluidas en t r y , pueden ser generadas y utilizar i nst anceof  para determi-nar el tipo de excepción.

Ejemplo

Dado que la clase Except i on engloba las excepciones a considerar en los ejem- plos I a  3 ya explicados, para capturar las citadas excepciones I OExcept i on yNumber For mat Except i on  podría escribirse

el

código de la siguiente manera:

import j ava. i o. * ;

publ i cc l as s j empl o4

t

publ i cs t at i cvoi dmai 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 nt 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=Y

t

cadena = br .eadLi ne ( );

n = I nt eger . par s eI nt ( cadena);1

catch ( Except i on e)i

if ( e i ns t anceofI OExcept i on)

el sei f ( e i ns t anceofNumber 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" ) ;1

i nt i = 1;whi l e i

<=

n)

i

Sy s t em out pr i nt i n ( " 2 "̂ +i +"

=" +Mat h. pow( 2, ) ) ;

i ++;

1

13.4. LANZAR LA EXCEPCIÓN

Una claúsula cat ch  puede recibir una excepción y, en lugar de tratarla o despuésde hacerlo, volver a lanzarla mediante una instrucción t hr ow.

Page 358: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 358/482

346 Java 2. Manual de programación

Ejemplo

Modificando levemente el ejemplo anterior, puede utilizarse también en el presen-te caso. La modificación consiste en la creación de un método de lectura que, des -

 pues de su tratamiento, lanza la excepción Number For mat Except i on.

import j ava. i o. * ;

 public class Ej empl o5t

 public static int l eer ( )

i

I 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;try

i

cadena = br . r eadL i ne ( );

n = 1nt eger . par seI nt ( cadena);1

catch ( I OExcept i on e){ )

cat ch( Number For mat Except i on e)i

Sys t e m out . pr i nt l n

( " 1)¿Tec l eó sol o return?" ) ;

throw ( e );1

return n;1

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

)

i

int n = O;

Sys t em out . pr i nt ( "Deme un númer o ent er o ent r e 1 y 20

' I ) ;

try

{ n = l eer ( )

;

cat ch( Number For mat Except i on e)

Sys t e m out . pr i nt l n

( " 2 )

¿Tec l eó una l et r a o un r eal ?" ) ;1

int 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

Page 359: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 359/482

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 excepciones R u n t imeExcep t i on debencapturarse en el método donde se han producido; en caso contrario serán tratadas

 por el bloque t r y del método invocador más próximo que capture dicha excepcióny sin necesidad de ser listadas en la cabecera del método.

Ejemplo

En este caso leer no efectúa ningún tratamiento y, como se puede observar, sehace necesario listar la I OExcept i onen 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 ( Sys t em i n) ;

Buf f er edReader br = new Buf f er edReader ( i s r ) ;

St r i ng cadena = ;

try

t

cadena = br .eadLi ne ( );

return I nt eger . par s eI nt ( c adena) ;

1

finally

t 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 ( " Deme un númer o ent er o ent r e 1 y 20 ' I ) ;

I

try

n = l eer ( );

1

catch ( I OExcept i on e)i }

catch ( NumberFor ma Excep t on e)

i

1

int i =l ;

while ( i <= n)

Syst em. out . pr i nt l n " ¿Tec l eó sol o ret ur n?" ) ;

Page 360: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 360/482

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 bloque t r y no puede aparecer sólo, por lo que,al no ser necesario ninguna claúsula cat ch, se ha de colocar una cláusula y bloquef i n a l l y .

f i na l l y

I }

13.6. EL BLOQUE finally

Cuando no se produce ninguna excepción en un método y también cuando se pro-duce pero es capturada, la ejecución continúa en la sentencia siguiente a cat ch,excepto si se fuerza a otro tipo de abandono mediante instrucciones como r et ur n,br eak o cont i nue. Cuando la excepción no se captura, la búsqueda de la claúsu-

la cat ch adecuada para la captura de la excepción lanzada continúa por los restan-tes métodos en orden inverso a como fueron efectuadas las llamadas. Por tanto, nose puede garantizar que las sentencias siguientes a un determinado cat ch vayan aser ejecutadas.

Ejemplo

Compare los siguientes códigos. En el primer caso, las instrucciones Siguientes a loscatch se ejecutan Únicamente si ocurre una excepción. En el segundo caso, por las

instrucciones siguientes a los catch en el método leer no pasa ni cuando todo escorrecto ni cuando se produce una Number For mat Except i on.

i mpor tava. i o. * ;

publ i cc l a s sEj empl o7t

publ i cs t a t i ci n t l eer ( )

i

I nput St r eamReader i s r = newI nput Ct r eamReader ( Sys t em i n) ;

Buf f er edReader br = newBuf f er edReader ( 1s r ) ;

St r i ng cadena = " ' I ;

t r y

cadena = br .eadLi ne

( );

r e t u r n nt eger . par s eI nt ( c adena) ;

Page 361: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 361/482

Manejo de excepciones 349

/ / cuando t odo es cor r ect o sal e1

ca t ch ( I OExcept i on e)o

c 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" ) ;r et ur nO;

publ i cs t a t i cvo i dmai 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 =l ;

whi l e ( i

<=

n)

f

Sys t em out . pr i nt l n ( " 2" " +i +" = " +Mat h. pow( 2, i ) ) ;

it+;

1

impor t j ava. i o. * ;

publ i cc l a s sEj empl o8t

publ i cs t a t i ci n t e e r ( )

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 r y

I

cadena = b r . r eadLi ne( );

r et ur n nt eger . par s eI nt ( c adena) ;

1

c a t c h( I OExcept i on e)I 1

/ /

I nst r ucci ón si gui ent e a cat chSys t em out . pr i nt l n( "No pasa cuando no hay er r or ni " +

r et ur nO;

"cuandosepr oduceunNumber For mat Except i on" ) ;

publ i cs t a t i cv o i dmai n ( St r i ng a r g s [ ] )

I

Page 362: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 362/482

350

Java 2. Manual  de programación

i nt n = O;Sys t em out . pr i nt ( " Deme un númer o ent er o ent r e 1 y 20 " ) ;

t=Y

i

1

cat ch( Number For mat Except i on e)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

1

I

Not a:El bloque finally sirve para colocar en él instrucciones que se desease realicen siempre que se sale de un bloque t r y y es opcional, pero pasa aser obligatorio cuando un  bloque t r y no va seguido por ninguna claúsulacatch ya que, como se dijo, el bloque t r y no puede aparecer solo.

El formato general es:

try

1

}

cat ch( Ti po- de- excepc i on i dent i f i cador )

i

1

/ / ot r os cat ch s i l os hubi er af i nal l y{

1

. . .

. . .

. . .

Las instrucciones colocadas en el bloque f i n a l l y se realizan siempre que se

sale del bloque t r y : tanto si se ha producido una excepción y se ha capturado,como si no se ha capturado, como si no se ha producido la excepción, como si seha salido del bloque t 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 bloque f i n a l l y sentencias que a su vez puedan produ-

cir nuevas excepciones.

Page 363: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 363/482

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, se muestra acontinuación el control de excepciones en un  programa diseñado para comparar dosarchivos especificados mediante la línea de órdenes. Para comprender la imple-mentación efectuada se necesita conocer que los argumentos pasados en la línea deórdenes a un programa se reciben por el método main y se almacenan en el arrayunidimensional de tipo s t r i ng que dicho método especifica siempre como  pará-metro.

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

)

Los argumentos escritos a continuación del nombre del  programa se separanunos de otros por un espacio en blanco y Java almacenará el primero de ellos enargs [ O ] ,el segundo en args[

1

] ,y así sucesivamente. El programa compara losarchivos, efectuando una lectura secuencia1 de ambos y comprobando la igualdadentre lo que va leyendo de cada uno de ellos. Se detiene cuando encuentra algunadiferencia o uno de los archivos termina.

La claúsula t 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 sea

generada por no encontrarse el archivo, conviene identificar cuál de los dos archi-vos pasados como parámetros es el que no ha sido encontrado, por tanto se colo-can dentro del t r y anterior otros dos bloques t r y que permitan identificar cuálde ellos ha sido la causa. La instrucción de cierre de archivo debe aparecer en el

 boque f i nal l y para que siempre sea ejecutada y como lanza una I 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 a CompAr 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 a CompAr chLa l l amada debe ser :  j ava CompAr ch ar chi vo1 ar chi vo2

Otros casos considerados son aquellos en los que alguno o ambos archivos noexisten.

importj a v a . i o . * ;

class CompAr chI

Page 364: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 364/482

352

Java 2. Manual  de programación

 public static 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;

try

t

/ /Abr e el pr i mer ar chi vo

t r y

i

/ / Exc epc i ón por apertura del ar chi vof l = new F i l eI nput Ct r eam( args

[ O ] ;

1

c 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

1

Cys 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

try

I

f 2 = new F i l eI nput Ct r eam( ar gc [ 11) ;

cat ch( F i 1eNot FoundExcept i on e)I

Sys t em out . pr i nt l n (argsl ]

+ Ar chi vo no encont r ado" ) ;i

/ /

Compar a l os ar chi vos

do

t

/ *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 * /

I

while(i

!= - 1 & & j

! =- 1 ) ;

/ / f i n de ar chi vo

i f ( i

! = )

else

Sys 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 ) ;

i

catch ( I OExcept i on e)t

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

Page 365: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 365/482

Manejo de excepciones 353

I

c 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" )

;

1

cat ch( Except i on

e)I

}

f i n a l l yi

/ / ] ava. l ang. Nul l Poi nt er Exc ept i on

try

i

/ * 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 operaci ón de ci er r e l anza una excepci ón que hayque tratar * /

i f ( f l ! =nul l )f l . cl ose

0

;

catch ( I OExcept i on e)i

1

try

t

i f ( f 2 ! =nul l )f 2 . c l os eO;

1

cat ch(

I OExcept i on e)t }

I

Not a:Los argumentos pasados en línea de comandos a un programa se reci- ben por el método main y se almacenan en el array unidimensional de tipoString que dicho método especifica siempre como parámetro. Cuando sellama al programa sin parámetros, la posterior referencia a los mismos originauna excepción del tipo Array Inde OutOfBoundsExcept i on.

13.7. CREACIÓN DE EXCEPCIONES

En Java es posible definir nuevas excepciones específicas para una determinada situa-ción, que se usarán para detectar anomalías en el funcionamiento de una aplicación.

Page 366: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 366/482

354

Java 2. Manual de programación

Para crear una excepción se define una subclase de Except i on que implementeun constructor con un  parámetro de tipo St r i ng y sobreescriba el métodoget Mecs age

( ) de la clase  Thr owabl e. Hay que tener en cuenta que la clase

Except i on no define ningún método, sólo hereda los definidos por Thr owabl e.

Ejemplo

Creación de una nueva excepción.

c la s s NuevaExcp ext endsExcept i on!

St r i ng mensaj e;

publ i cNuevaExcp ( St r i ng c aus a )

i

I

mensaj e = causa;

publ i cSt r i ng get Mess age ( )

r et ur nmensaj 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 caso, laexcepción deberá ser capturada o declarada escribiendo su tipo en la cabecera delmétodo que la lanza precedido por la palabra reservada t hr ows. Si se lanza desdemai n el tratamiento no se podrá posponer y habrá que capturarla.

Ejemplo

Esta aplicación que usa la nueva excepción ( NuevaExcp) .La excepción se lanzay captura en mai n. El ejemplo lanza la excepción siempre, aunque lo normal seríaque ésta sólo se lanzara cuando ocurriera algún motivo.

 public c l a s s Ej empl o9i

 public s t a t i c void mai n ( St r i ng ar gc)i

try

i

/ / se l anza si empr et hrow new NuevaExcp( " C1n motivo");

I

catch ( NuevaExcp e)

Page 367: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 367/482

Manejo de excepciones 355

Sys t em out . pr i nt l n( e. get Mes s age0) ;

El  programa siguiente solicita la edad y, si no está en el rango adecuado, lanzauna excepción.

import j ava. i o. * ;

publ i cc l a s s j empl o10

publ i cs t a t i cvo i dmai n ( St r i ng a r g s [ ] )

i

I nput St r eamReader i s r = newI nput St r eamReader ( Sy s t em i n) ;

Buf f eredReader br = newBuf f er edReader ( i s r ) ;

St r i ng cadena;i n t edad = O;Sys t e m out . pr i nt ( " I nt r oduzca l a edad " ) ;

t r y

I

cadena = br . eadLi ne

( );

edad = I nt eger . par s eI nt ( c adena) ;

i f ( edad < 18 1 1 edad > 65)t hr ow new

Fuer aDeRango( " Excepci Ón: val or f uer a de r ango" ) ;Sys t em out . pr i nt l n ( "Edad: + edad) ;

c at c h( Except i on e)

i f ( e i ns t anc eofI OExcept i on)

el sei f ( e i ns t anc eofNumber For mat Except i on)

el se

Syst em. out . pr i nt l n ( "Error de ent r ada/ s al i da" ) ;

Sys t em out . pr i nt l n ( "No t ecl eó un númer o ent er o" ) ;

Sys t em out . pr i nt l n( e. get Mes s age( ) ) ;

c l a s sFuer aDeRango ext endsExcept i onI

St r i ng mensaj e;

publ i cFueraDeRango ( St r i ng causa)i

1

p u b l i c St r i ng get Mess age

( )

i

I

mensaj e = causa;

r et ur nmensaj e;

i

Page 368: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 368/482

356 Java 2. Manual de programación

Ejemplo

El

 problema de las Torres de Hanoi es un problema clásico de recursión. Se tienen tres

torres y un conjunto de discos de diferentes tamaños. Cada disco tiene una perfora-ción en el centro que le permite ensartarse en cualquiera de las torres. Los discoshan de encontrarse siempre situados en alguna de las torres. Inicialmente todosestán en la misma torre, ordenados de mayor a menor, como se muestra en el dibu-

 jo. Se debe averiguar los movimientos necesarios para pasar todos los discos a otratorre, utilizando la tercera como auxiliar y cumpliendo las siguientes reglas:

En cada movimiento sólo  puede intervenir un disco. Origen Destino Auxiliar

2 3 No puede quedar un disco sobre otro de menor tamaño. ’

El

 problema se puede resolver considerando que para pasar, por ejemplo, tresdiscos del pivote origen al destino, han de pasar dos discos al pivote auxiliar, moveruno al destino y mover dos discos del auxiliar al destino.

Paso 7

Orinen Destino Auxiliar

Paso 3

~

Paso 2

~

Oriqen

DestinoA u x G r - T

Oriqen Destino Auxiliar

El paso 1, vulnera la primera regla, pero para solucionarlo, podemos recurrir ala misma mecánica: movemos un disco de origen a destino, movemos el siguiente

al auxiliar y, por último movemos el disco de destino a auxiliar.

Fases del Paso 1

Origen Destino Auxiliar Origen Destino Auxiliar~

Origen Destino Auxiliar

Lo mismo ocurriría con el paso 3 y se solucionaría de la misma forma.

Se creara la clase Hanoi  para resolver el problema. En esta clase el métodomovsTor r e

lanza una NuevaExcp si

el número de discos es negativo. El método

Page 369: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 369/482

Manejo de excepciones357

m a i n de la clase Pr uebaHcaptura y trata las excepciones; vuelve a pedir el núme-

ro de discos cuando éste fue negativo y ante cualquier otro tipo de excepción, comointroducir una letra en lugar de un número, el programa termina.

 publ ic cl ass Hanoi

pr i vat es t at i cvoi dmovs Tor r e ( i n tndi scos, i n t or i gen, i nt

dest i no, i n t auxi l i ar ) t hr owsNuevaExcpi

/ / Cont r ol Excepci onesi f ( ndi scos < O)

i f ( ndi scos == O)

i f ( ndi scos ==1)

el se

t hrow new NuevaExcp ( " Numer o de di scos i ncor r ect o" ) ;

r et ur n;

Syst em. out . pr i nt l n ( "Paso di sco de " +or i gen+" a " t ues t i no) ;

mo vs T or 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 o di sco de + or i gen t a 'I

+

dest i no) ;movsTor r e( ndi sc os - 1, auxi l i ar , des t i no, or i gen) ;

publ i cHanoi( i n t

) t hr owsNuevaExcpi

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 as sNuevaExcp ext endsExcept i oni

St r i ng mensaj e;

publ i cNuevaExcp ( St r i ng causa)I

mensaj e = causa;i

 publ ic St r i ng get Mecs age

( )

I

return mensaj e;

Page 370: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 370/482

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)i

int n = O;

 boolean repet i r = false;

do

t

try

I

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) ;

1

catch ( NuevaExcp el )t

Sys t em out . pr i nt l n ( " \ t El númer o de di scos no puede " +

"ser negat i vo" ) ;

repet i r = true;1

catch ( I OExcept i on e2){

1

catch ( 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);

1

while ( r epet i r );1

13.8. MÉTODOS DE LA CLASE Throwable

 public j ava. l ang. Thr owabl e f i l l I nCt ac kTr ac e( )

Devuelve un objeto con los métodos en ejecución en el momento de lanzarse la excepción.

 public j ava. l ang. St r i ng g et Mess age0

Devuelve el mensaje descriptivo almacenado en una excepción.

Page 371: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 371/482

Manejo de excepciones 359

 public void pr i nt Ct ac kTr ac e( )

Muestra por consola un mensaje con la clase de excepción, el mensaje descriptivo de lamisma y una lista con los métodos en ejecución en el momento de lanzarse la excepción.

 public voidpr i nt St ac kTr ac e( j ava. i o. Pr i nt St r eam

pl)

Envía el mensaje anteriormente especificado al flujo que se le especifique como parámetro.

 publicj ava. l ang. St r i ng t os t r i ng( )

Devuelve una cadena descriptora de la excepción.

Page 372: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 372/482

D Ii I I l l 111

II

 Arch vosCONTENIDO

14.1. La clase F i l e .14. 2. Fl uj os.14. 3. Aper t ur a dear chi vos.14. 4. Encadenami ent o def l uj os14. 5. Excepci ones enar chi vos.14. 6. Mét odos deI nput st r eam.14. 7. Mét odos deOut put st r eam.14. 8. Mét odosde Reader .14. 9. Mét odosde Wr i t er .

14. 10.14. 1 .

14. 12.14. 13.14. 14.14. 15.

14. 16.14. 17.

14. 18.

Mét odosde Dat a nput s t r eam.Mét odos de

at aout put s t r eam

Mét odosde RandomAccess Fi l e.Ser i al i zaci ónde obj et os.St r i ngTokeni zer

y

St r eamTokeni zer .Oper aci ones conar chi vosy mant eni mi ent ode l osmi smos.Ar chi vossecuenci al es.Ar chi vos di r ect os.

Funci onesde t r ansf or maci ónde cl avey t r at ami ent ode col i s i ones.

361

Page 373: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 373/482

362 Java 2. Manual de programación

Como estructura de datos, los archivos permiten el almacena-

miento permanente y la manipulación de un gran número dedatos. Los archivos de datos son un conjunto de datos estructura-

dos que se tratan como una unidad y se encuentran almacenados

en un dispositivo de almacenamiento externo. Un archivo se con-sidera formado por una colección de datos lógicamente relaciona-

dos, a los que denominaremos registros, cada registro agrupadatos también con una relación lógica entre sí a los que se deno-

mina campos y es el programador el encargado de estructurar losarchivos de tal forma que se adapten a las necesidades del pro-

grama ya que, en realidad, Java considera los archivos simple-

mente como flujos secuenciales de bytes.En los archivos de datos se pueden destacar dos organizaciones

fundamentales:secuencia/

y la directa o aleatoria, siendo posible

trabajar en Java con ambos tipos de organizaciones. La organi-zación secuencia/ implica que los datos se almacenan consecu-

tivamente en el soporte externo, no siendo posible accederdirectamente a un determinado dato si no se recorren todos losanteriores. La organizació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 almacenado,eliminarlo o insertar uno nuevo en cualquier posición del archivo sin

que 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 de fhjo y se mostrará cómo estructurar losdatos e implementar en Java ambos tipos de organizaciones.

14.1. LA CLASE F i l e

Los objetos de la clase Fi l e no especifican cómo se almacena o recupera la infor -mación en un archivo, sólo describen las propiedades del mismo y  permiten obte-ner información sobre él.

 Nota: Un objeto de la clase File posibilita la obtención de información sobrelas propiedades tanto de un archivo como de un subdirectorio y  permite lamodificación de algunos de sus atributos. Los métodos del et e y

r enameTo

de la clase Fi l e permiten borrar y renombrar archivos.

Los objetos Fi l e se crean mediante los siguientes constructores:

Page 374: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 374/482

 Archivos 363

 public Fi l e ( j ava. i o. F i i e dir, j ava. l ang. Ct r i ng nombre)

Donde el primer parámetro es un objeto Fi l e que referencia un directorio y el segundo elnombre del archivo.

 public Fi l e (7 ava . l ang .St r i ng path)El  parámetro es el nombre de un directorio o 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 directorio y 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 ( " e j empl o. dat " )

;

/ * r ut a absol ut a, en ei s i gui ent e caso especi f i ca el di r ecto-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 te r / como separador * /

Métodos y campos a destacar dentro de la clase son:

 public static final char se para to r c har

 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 c anwr i t e 0

Variable inicializada co'n elseparador indicado en el archi-vo de propiedades del sistemaque permite especificar rutas

independientes 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.

Devuelve t rue si se puede

escribir en el archivo o directo-rio.

 public boolean canRead( )

Devuelve t rue si se puede leerdesde el archivo o directorio.

Page 375: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 375/482

364 Java 2. Manual de Programación

 public booleani 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 booleanm k d i r

( )

 public  boolean d e l e r e )

I>e\uclve t rue si el archivo re- presentado por el objeto F i l e esun archivo normal.

Devuelve t r u e si el archibo

representado por el objeto ?i 10

es un directorio.

Devuelve un array con los nom- bres de los archivos y directo-rios existentes en el directorioespecificado por el objeto F i l e .

Esta lista no incluye el directo-rio actual ni el padre del actual.

Crea el directorio especificado por el objeto F i l e .

Borra el objeto01~ e

specifica-

do, cuando se trate de un direc-torio cste ha de estar vacio

 public booleanrenar?eTo ( j ava. i o . F i l e dect) l ienombra el archivo especifi-

cado por el

objcto F i l e con elnombre del archivo Fi l e pasadocomo parámctro y devuelvet r u e cuando la operación seefectúa con éxito y f a l c e si seintenta renoinbrar un archivocambiándolo d e directorio.

 public boolean e x i s t s )

Ejercicio

Mostrar el contenido de un subdirectorio.

De\ t ie lbe t r u e si existe elob.jeto F i l e especificado yf a l c e en caso contrario.

Figura 14.1. Listadodel contenido de un subdi rectorio

Page 376: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 376/482

7

 Archivos 365

i mpor t j ava. i o. * ;

publ i c cl ass L i 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

ret urn br . r e a dL i ne 0;

i

c at c h( Ex c ept i c n e)t i

return 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: \ : . ic rc 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 bo

de"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

Utilice AWT para efectuar la misma tarea que el ejercicio anterior y defina una claseanónima para el cierre de la ventana.

Page 377: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 377/482

366 Java 2. Maru  de Programación

-ii

LEr LE

Figura 14.2. Listadodel contenido de un subdirector io. Pantalla inicial.

Conten idc ide c

\ l i b r o  A

Temaül qCilR5

Tema1 1 <[)IR-

_

1

Figura 14.3. Listado del contenido de un subdi rectorio.

importj ava. awt . * ;

import j ava. awt . even: . * ;

importj ava. i o. * ;

 public class Ej F i l e extends Fr ame implements Act i onL i s t ener

 Text Fi el d t ext oi ; Text Ar ea t ext o2;

 publicEj Fi l e (

)

cet¿ayoct

(new Bor der Layout ( ) ;

/ / empl eo de Ena cl ase anóni ma

Page 378: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 378/482

Page 379: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 379/482

368 Java 2. Manual de Programación

14.2. FLUJOS

Los programas en Java realizan las operaciones de entrada/sal ida a través de, f lu-

jos; así se consigue gestionar de forma similar la entrada/sal ida sobre dispositi-vos muy diferentes, como teclado, pantalla, impresora, una conexión a red, unbz@r en memoria o un archivo en el disco. A diferencia de la pantalla, la impre-sora no tiene definido en Java un flujo de salida es tándar y para sacar por impre-

sora los resultados de un programa hay que asociar un flujo al puerto ( LPT1, ...)

donde esté conectada. Las diferentes clases de flujos se encuentran agrupadas enel paquete j ava .i o y en la parte superior de esta jerarquía destacan las clases:I nput st r eam, Out put st r eam, Reader , Wr i t er y RandomAccessFi l e.

Figura 14.4. Clases de flujosque heredan de Object.

i nput st r eames una clase abstracta, superclase de otras concretas que tratancon flujos de entrada de bytes, mientras que Out put st r eames la clase abstractasuperclase de otras que representan un flujo de salida de bytes. Estas clases definen,

 pues, la funcionalidad básica común a todas las clases de flujo de bytes. Vea la

Figura 14.5. Wr i t er es una clase abstracta para escribir caracteres en flujos yReader la clase abstracta cuyas subclases podrán leerlos (Fig. 14.6.).

Cuando se trabaja con Reader o Wr i t er el flujo se orienta a Unicode (16 bits)y con Streama bytes (8  bits). Las clases St r eam, en gran parte, se consideranobsoletas, ya que Java usa Unicode y tiene más sentido usar Reader /Wr t er quetrabajar con b donde Java tiene que traducir los bytes en Unicode  para impri-mirlos y de vuelta en Unicode cuando los lee.

Por otra parte, en adición a St r eam, Reader y Wr i t er , el paquete  j ava. i o

define la clase RandomAccessFi l e que permite implementar archivos de acce-so directo.

Page 380: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 380/482

 Archivos 369

Figura 14.5. I nput st r eamy Out put st r eam, j er ar quí ade cl ases.

Page 381: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 381/482

370 Java 2. Manual  de Programación

Reader

Figura 14.6. Reader y Writer, jerarquía de clases.

14.3.  APERTURA DE ARCHIVOS

Para crear, escribir o leer un archivo se requiere establecer un flujo a/desde él; lasclases capaces de crear un flujo aidesde un archivo requieren una referencia a unobjeto Fi l e o un nombre de archivo como argumento. Estas clases son:

La subclase F i l eOut put Ct r eamhereda de Out put Ct r eam y permitecrear un flujo de salida para escribir bytes en un archivo. Los constructoresson:

 public F i l eOur put Ct r eam( j av a. l ang. St r i ng nombre).

 publicF 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 F i Le Cut put Ct r e am( j ava. l ang. Ct r ; ng

nombre,  boolean

añadir) .

Page 382: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 382/482

 Archivos 371

Los tres constructores lanzan excepción. Con los 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 por nombr e.

Ejemplo

Fi l eout put st r eam f 1 = new F i l eOut put Ct r eam( " i nf o.t xt " ) ;

o bien

Fi l e ar ch = new F i l e( " e j empl o . da~" j;

Fi l eout put st r eam f 2 = newF i l eOut put St r eam

( a r ch );

Un flujo debe cerrarse cuando ya no vaya a utilizarse con las sentencias sufi-cientes:

f l . c l o s e 0;

f 2 .cl ose ( ;

La subclase Fi l eI nput St r eamhereda de I nput st r eamy  permite crearun flujo para lectura de bytes desde un archivo. La lectura comienza desde el

 principio del archivo y cuando se leen datos del mismo, para que se puedanvolver a leer los datos del principio es necesario cerrar el flujo y volverlo aabrir. Los constructores son:

 public Fi l eI nput St r eam( ] ava. i c . Fi l e file)

 publicF i l eI nput Ct r eam( j ava. l ang. St r i ng nombre)

Ambos constructores lanzan una Fi l eNot FoundExcept i on

Ejemplo

Fi l eI nput St r eam f l = new F i l eI nput St r eam( " not as . t xt " ) ;

o bien

Fi l e ar ch = new Fi l e ( " e ]empl o. t xt "  j ;

Fi l eI nput St r eam f 2 = new F i L eI nput St r eam( ar c h) ;

El flujo se cierra de modo similar al caso anterior.

Fi l ewr i t er hereda de Wr i t er y proporciona la posibilidad de crear unflujo para escritura de caracteres en un archivo. Los constructores son:

Page 383: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 383/482

372 Java 2. Manual de Programación

 public F i 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 file)

St r i ng nombre)

St r i ng nombre,  boolean añadir)

y lanzan una I OExcept i on. Los dos primeros constructores destruyen unaarchivo existente; el último permite añadir datos al final del mismo.

Ejemplo

F l i eWr l t er f e new F i l eWr i t er ( " i nf o. x t " ) ;

f e . l os e

) ;

. . .

Fi l eReader  permite crear un flujo  para la lectura de caracteres desde unarchivo. Análogamente a lo que ocurre con Fi l eI nput St r eam, la lecturacomienza desde el principio del archivo y cuando se leen datos del mismo, parauna nueva lectura desde el principio es necesario cerrar el flujo y volverlo aabrir. Los constructores son:

 public Fi l eReader ( l ava. i o . F i i e file)

 public F i l eReader ( j ava. l ang. St r i ng nombre)

y lanzan una excepción Fi l eNot FoundExcept i on.

Ejemplo

Fi l eReaderf l

= new Fi l eReader ( " i n f o . t x t " ) ;

f l . cl ose ( );

. . .

La clase RandomAccessFi l e permite el acceso directo (también llamado

u aleatorio) a una determinada posición dentro de un archivo, así comola lectura y escritura de datos en dicho archivo. Esta clase no deriva deI nput st r eamni de Out put st r eam, sino que implementa las interfacesDat aI nput y Dat aout put que definen los métodos de entradahal ida bási-cos. El flujo se crea mediante:

 public Randc mAc c es s F i l e( j av a. i o. F i l e file, j ava. l ang. Ct r i ng m )

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ámetro mrepresenta el modo en el que se creará el flujo y en la llamadase le podrá pasar: r (lectura) o r w(lectura/escritura).

Page 384: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 384/482

 Archivos 373

Ejemplo

RanaomAcceccF i l e

:le = new Rai domAcceccFi l e ("datos =a- " ,

" r w" ) ;

f l e . cl ose ( 1

;

Not a:En Java RandomAccessFi l ees la clase que permite el acceso directoy Fi l e Re a d e r ,F i l e In p u tS t r e a m , Fi l eWr i t er y Fi l eOut put St r eamofrecen tratamiento secuencial.

14.4. ENCADENAMIENTO DE FLUJOS

Para conseguir flujos personalizados, que se adapten a los requisitos de transferencia dedatos en Java se utiliza la composición de flujos. Este sistema sirve no sólo para archi-vos, si no que se aplica también a los flujos de red y de conector (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 e r

Buf f er edReaderBuf f er edWr i t er

Buf f er edI nput St r eam

Buf f er e dOut put St r ea m

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 caracteresI

Establecen un buffer para bytes

Escribe valores y objetos en un flujo de bytes.

Escribe valores y objetos en un flujo de caracteres.

Permiten leer y escribir tipos de datos primitivos,efectuando conversiones desde un flujo de bytes adichos tipos de datos primitivos.

Estos flujos pueden asociarse unos con otros y con los de apertura de archivos paraobtener el flujo deseado ai escribir o 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 unidades más grandes, se le puedeasociar un objeto Pr i nt st r eam. Los objetos Pr i nSt r eamadmiten los métodospr i nt y pr i nt l n para valores y objetos. Cuando se trata de objetos, estos métodos

Page 385: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 385/482

374 Java2.

Manual  de Programación

llaman al método t ost r i ng del objeto e imprimen el resultado.Pr i ns t r eam

almacena los datos a imprimir en un bufer con la finalidad de trabajar de la forma máseficiente posible y disminuir el número de operaciones de transferencia, así los datos

sólo se escriben cuando se llena el buffer

o termina el programa. Esto resulta muy con-veniente para los archivos, pero no para la pantalla.Systern. out es una instancia de

Pr i n St r eamy por eso pr i nt y pr i nt 1n sonlos

mé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ísicamente en elflujo 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 se

l l ena, cuando t er mi na el pr ogr ama y cuando 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 =new Fi l e ( " t ext o. x t " ) ;

/ / l a s i gui ent e i nst 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 = new F i l eOut put St r eam( f ) ;

Pr i nt s t r eam sal i da = new 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 or ú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 abiertocon Fi l eI nput St r eam. El

 programa que lee llama a un Buf f er Reader

queutiliza un I nput St r eamReader , que a su vez utiliza un Fi l eI nput St r eam

 para leer del F i l e .

Ejemplo

/ / Obj et o Fi l eFi l e f = new Fi l e ( " t ext o. x t " ) ;

/ / Aper t ur a del ar chi vo par a l ect ur a.F l u l o

de byt esFi l eI nput St r eam f l = new F i l eI nput St r eam( f ) ;

Page 386: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 386/482

 Archivos 375

/ / Conver si ón a f l u j o de car act er esI nput Ct r eamReader ent r ada = new 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 = newBuf 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étodo r eadL i ne ( ) de la clase Buf f er edReader  permite leer unasecuencia de caracteres de un flujo de entrada y devuelve una cadena; además, uti-liza un

b

 para mejorar el rendimiento. Para efectuar lectura desde teclado, seutiliza syst em. i n, que es una instancia de j ava. i o . I nput st r eam; por estarazón, las lecturas de una cadena desde teclado se han efectuado con un método

análogo ai anteriormente expuesto.Ejemplo

I nput Ct r eamReader ent r ada= new I nput Ct r eamRea der ( Sy s t e m i n) ;

Buf f er edReader l ect or cad = new 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 put St reamse utilizan respectivamente paraleer o escribir en un flujo Fi l eOut put St r eamo Fi l eOut put St r eamdatos

de tipos primitivos y recuperarlos como tales y también en este caso se aplica enca-denamiento.

Ejemplo

Fi l eI nput Ct r eam f e = new F i l eI nput Ct r eam

Dat aI nput Ct r eam de = new 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 ts t r e am

14.5. EXCEPCIONES EN ARCHIVOS

Cuando se trabaja con archivos se pueden producir errores deentrada/salida

y Javaobliga a prever este tipo de errores y recoger las excepciones que pueda lanzar elsistema. Las excepciones del paquete j ava .i o se muestran en la Figura 14.7.Cuando el programador diseña un método tiene dos opciones con este tipo deexcepciones: listarías en la cabecera del mismo o bien recogerlas y tratarlas. Si está

sobrescribiendo un método del que no puede modificar la interfaz, se verá obligadoa recoger estas excepciones y tratarlas en el propio método.Las excepciones en el trabajo con archivos pueden ser lanzadas por los métodos

de escritura y lectura, pero además hay que tener en cuenta que la apertura de un

Page 387: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 387/482

376 Java 2. Manual de Programación

archivo puede producir una excepción I OExcept i on cuando falla la operación; porejemplo, si se intenta abrir para lectura un archivo que no existe, y el cierre de unarchivo con el método cl ose también puede producir una I OExcept i on. Por otra

 parte, los archivos en Java terminan con una marca de fin de archivo y cuando en lalectura de un archivo se llega a dicha marca se puede lanzar una EOFExcept i on.

Capturar y tratar las excepciones en la apertura y cierre de un archivo.

publ i c cl ass Cont r o l Exc epc i one s

t

publ i c s t at i c voi d mai n ( S t 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 )

;

1

c at c h( I 0Ex cept i on e)I

Cys t em out . pr i nt l n( e );1

f i nal l yt

try

i

/ * 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 os e0;

1

c at c h( I 0Ex cept i on e)

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" );:t

1

Page 388: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 388/482

 Archivos 377

Figura 14.7. Excepciones del paquete 1 a v a . 10

 Nota: Al trabajar con archivos, las excepciones pueden ser lanzadas por losmétodos de lectura y escritura y también por las operaciones de apertura y cie-rre del archivo. El compilador obliga a tratar dichas excepciones.

Page 389: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 389/482

378 Java 2. Manual de Programación

Nota: Cuando se detecta el fin de flujo:

.El método r ead de i nput st r eamdevuelve - 1 .

El método r eadLi ne devuelve n u l l .Los métodos que se exponen en Dat aI nput St r eam generan unaEOFExcept i on.

14.6. MÉTODOS DE inputstream

 public int available( )

De\uelve el número de bytes actualmente disponibles para su lectura en el flujo de entrada.

 public void cl ose0

Cierra el flujo de entrada. Genera una I OExcept i on si se produce un error.

 public synchronized void mark(int num)

Coloca una marca en el flujo de entrada, válida hasta que se lea el número de bytes especi-

ficado como parámetro.

 public booleanmarksupported0

Comprueba si el flujo de entrada soporta los métodos mark y reset.

 public abstract int read0

Devuelve como entero el siguiente byte disponible de la entrada.

 public int read(byte

b[

)

Intenta leer desde el flujo de entrada el número de bytes necesarios para llenar el array  b

 pasado como parámetro y devuelve el número real leído.

 public intread(byte

b [

1 ,

int desde, int cuantos)

Intenta leer desde el flujo de entrada el número de bytes especificados corno tercer paráme-tro y los introduce en el array b empezando en  b [decde ] .

 public synchronized void reset ( )

Coloca el puntero de entrada en la marca establecida con m a r k .

 public long skip(1ong

n)

Salta y descarta n  bytes del flujo de entrada, devolviendo el número real de  bytes saltados.

Excepto m a r k , todos los métodos restantes lanzan una I OExcept i on.

Page 390: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 390/482

 Archivos 379

14.7. MÉTODOS DE Outputstream

publ i c voi d cl ose( )Cierra el flujo de salida. Genera una I OExcept i on si se produce un error

publ i c voi d f l us h( )Vacía y limpia el buffer.

publ i c voi d wri t -e ( byteb [

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 desde, i nt cuantos)

Escribe b . cuant os bytes del array b en el flujo de salida comenzando desde b [ doczel .

publ i c abst r act voi d wr i t eí i nt 5)

Escribe un Único byte en el flujo de salida.

Todos estos métodos lanzan una excepción I OExcept i on.

14.8. MÉTODOS DE Reader

La clase Reader es una clase abstracta, superclase de todos los flujos de entradaorientados a carácter que proporciona un conjunto de métodos similar al que la clasei nput

S

t r eam proporciona para los flujos de entrada orientados a byte. Todos susmétodos lanzan una excepción I OExcept i on.

publ i c

publ i c

publ i c

publ i c

publ i cpubl i c

publ i c

publ i c

publ i c

abst r act voi d cl ose ( )

voi d mark ( i nt

numlaracteres)

bool ean markSupport ed( )

i nt r ead( )

i nt read ( char c[

]

abst r act i nt readí char c[ I

i nt desde, i nt cuantos)

bool ean ready ( )

voi d reset 0

l ong ski p( 1ong

n)

14.9. MÉTODOS

DE Writer

La clase Wr 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 claseOut put st r eam proporciona para los flujos de entrada orientados a byte. Todossus métodos lanzan una I OExcept i on.

Page 391: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 391/482

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 desde, 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 ng

cadena)

publ i c voi d wr i t e ( j ava. l ang. Ct r i ng

cadena, i nt desde, i ntcuan tos)

cuantos)

14.10. MÉTODOS DE DataInputStream

Esta clase actúa como filtro envolviendo u n flujo de entrada para así  permitir lalectura desde un archivo de datos de tipos primitivos. Métodos deDat aI r ipu tSt r eamson:

publ i cpubl i cpubl i cpubl i cpubl i cpubl i cpubl i c

publ 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 read ( byt e buffer[

]

)

f i nal i nt r ead( byt e

buffer[ 1 ,

i nt

desde,i nt

cuantos)

f i nal bool ean r eadBool ean0

f i nal byt e r eadByte ( )

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 buffer[1

f i nal i nt ski pByt es ( i nt n)

f i nal voi d r eadFul l y( byt e buffer[ 1 , i nt desde, i ntcuan tos)

f i nal i nt readI nt

( )

f i nal l ong r eadLong ( )

f i nal shor t readshor t ( )

f i nal i nt r eadUnsi gnedByte ( )

f i nal i nt r eadUnsi gnedChor t ( )

f i nal j ava. l ang. Ct r i ng

r eadUTF( )

stat i c f i nal j ava. l ang. Ct r i ng

r eadUTF ( j av a. i o. Dat aI nputentrada)

Todos estos métodos lanzan una I OExcept i on y casi todos ellos están defini-dos en la interfaz Dat aI nput implementada por la misma. Los métodos r eadUTF

devuelven una cadena de caracteres Unicode y generan una excepción del tipoUTFDat aFor mat Except i on si los bytes no representan una codificación UTF-

8 válida de una cadena Unicode. En el formato UTF-8' los dos primeros bytes indi-can el número de bytes que han de ser leídos a continuación para formar la cadena.

El nombre de los restantes métodos realizan las tareas que dicho nombre sugiere.

Las siglas UTF-8 significan Formato de Transformación Universal 8; es un formato de transmisión paraUnicode válido para los archivos de sistemas Unix.

Page 392: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 392/482

 Archivos 381

14.11. MÉTODOS DE DataOutputStream

Esta clase actúa como filtro envolviendo un flujo de salida para así permitir laescritura en un archivo de datos de tipos primitivos. Todos los métodos de

Dat aOut put St r eam, excepto s i ze ( ) lanzan una I OExcept i on. Métodosde Dat aOut put St r eamson:

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 buffer[i , i nt desde, i nt cuactsc)

publ i c synchroni zed voi d wr i t e ( i nt valor)

publ i c f i nal voi d wr i t eBool ean( boo1ean booleano)

publ i c f i nal voi d wr i t eBy t e ( i nt valor)

publ i c f i nal voi d wr i t eBy t ec

( ] ava. l ang. Ct r i ng cadena)

publ i c f i nal voi dwr i t ec har

( i n t

carácter)

publ i c f i nal voi d wr i t ec har s ( j ava. l ang. St r i ngcadena)

publ i c f i nal voi d wr i t eDoubi e ( doubl e valor)

publ i c f i nal voi d wri teFl oat : ( f l oat valor)

publ i c f i nal voi d wri t eI nt ( i nt v)

publ i c f i nal voi d wr i t eLong ( l ongv)

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 ( ] av a. l ang. St r i ng cadena)

El método s i z e ) devuelve el número de bytes escritos y, por su nombre y lo

comentado en otras ocasiones, puede deducirse el significado de los restantes. Casitodos los métodos de esta clase están definidos en la interfaz Dat aout put imple-mentada por la misma.

 Nota: Dat aI nput St r eamy Dat aOut put St r eamse utilizan respec-

tivamente para leer o escribir en un flujoF i l eOut put Ct r eam

oFi eOut put St reamdatos de tipos primitivos y recuperarlos como talesaplicando encadenamiento.

14.12.MÉTODOS DE RandomAccessFile

Esta clase implementa las interfaces Dat aI nput y Dat aout put y además de losmétodos de ambas interfaces ofrece también los siguientes:

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.

Page 393: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 393/482

382 Java 2. Manual de Programación

publice voidceek(1ong

pl ) Coloca en una posición especí-fica relativa al principio delarchivo, de forma que las ope-raciones de lectura o escritura

 puedan realizarse directamenteen dicha posición.

14.13. SERIALIZACIÓN DE OBJETOS

En Java un registro de un archivo se puede corresponder con una clase y los cam -

 pos del registro coincidirían con las variables de instancia; por consiguiente, enlugar de leer y escribir series de datos agrupadas en los archivos, puede resultar más

adecuado leer y escribir objetos. La serialización de objetos es la forma de guardarobjetos en archivos o enviarlos a través de la red, ya que permite escribir o leer obje-tos en flujos. El mecanismo de serialización mantiene el control sobre los tipos deobjetos y las relaciones entre ellos.

Para que se pueda serializar un 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 no habráque añadir implementaciones a la clase, pero obliga a que todos los campos de datosdel objeto sean serializables; como los tipos predefinidos son todos serializables,

en realidad lo único que habrá que considerar es que si desde ese objeto se refe-rencian otros, estos también hayan sido declarados serializables. La clase que permite escribir los objetos en el flujo de salida es

O b j e c t O u t p u t S t r e a m yC b j e c t I n p u t C t r e a m

la que permite leerlos.O b j e c t O u t p u t S t r e a m

implementa la interfazO b j e c t c u t p u t

que a suvez implementa

D a t a c u t p u t

que le añade la capacidad de escribir, además deobjetos, tipos básicos de datos. Las operaciones con archivos se harán encade-nando un O b j e c t c u t p u t s t r e a m a un F i l e C u t p u t C t r e a m y 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 flujo

abierto hacia el archivo:

 public final void wr i t eObj ec t ( j ava. i ang. 0bj ec t obj)

Los métodos f l u s h ( ) y c l o s e ( ) se emplearán para obligar a volcar el con-

tenido delbgfer

y cerrar el flujo respectivamente.C b j e c t I n p u t C t r e a m implementa la interfaz

C b j e c t I n p u t

que a su vezimplementa D a t a I n p u t que le añade la capacidad de leer, además de objetos, tipos

 básicos de datos. Las operaciones con archivos se harán encadenando un

C b j e c t I n p u t S t r e a m a un F i l e I n p u t S t r e a m y el método r 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 archivo.

Page 394: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 394/482

 Archivos 383

I I

Nota: La serialización de objetos permite guardar en archivos objetos queimplementan la interfaz S er a1 z ab1e.

14.14. StringTokenizer Y StreamTokenizer

St r i ngTokeni zer  pertenece al paquete j ava . ut i l ; trabaja sobre cadenas yse puede utilizar como herramienta para efectuar el análisis de las líneas leídas deun archivo de texto. La clase St r eamTokeni zer es miembro del paquete j a v a . i o y realiza un trabajo muy similar a St r i ngTokeni zer ,  permitiendo

dividir un flujo de entrada en fragmentos significativos mediante el empleo de unosdelimitadores. El constructor es:

 public St r eamTok eni z e r ( j av a. i o. Reade r

r )

La constante TT EOF indica que se ha leído el final del flujo; de modo análogo TT EOL y TT WORD indican el fin de línea y el fin de palabra. Para inicializar los

del&itadores,se emplea r e se t sy n ta x ( ) y después con el método wor dchar s

se puede establecer la serie de caracteres que pueden constituir una palabra. Elmétodo eol I s Si gni f i cant determina que los caracteres de línea nueva seantratados como

t

de forma que next Token devuelva TT-EOL cuando se leael fin de línea.

14.15. OPERACIONES CON ARCHIVOS Y MANTENIMIENTODE LOS MISMOS

Las operaciones con archivos son aquellas que tratan con su propia estructura, talescomo la creación, apertura o cierre de los mismos y que son proporcionadas por ellenguaje, en este caso Java. Además de utilizar este tipo de operaciones al trabajarcon archivos, será necesario diseñar métodos que efectúen tareas de mantenimien-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:L Se efectúa colocando en el registro que se desea borrar una bandera oindicador que lo marque como borrado. Admite la posterior recuperación de lainformación.

Page 395: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 395/482

384 Java 2. Manual de Programación

Fkica. implica la desaparición de esa información del archivo de forma que no pueda ser recuperada por operaciones posteriores. Puede efectuarse mediante lasobreescritura del registro o bien creando un nuevo archivo que no incluya dichoregistro.

Modificaciones. Proceso de modificar la información almacenada en undeterminado registro de un archivo.

ConsultaDe un Único registro.De todos los registros del archivo.

14.16.  ARCHIVOS SECUENCIALES

En los archivossecuenciales los registros se almacenan unos al lado de otros sobreel soporte externo y se pueden designar por números enteros consecutivos; sinembargo, estos números de orden no se pueden utilizar como funciones de accesoy  para realizar el acceso a un registro resulta obligatorio pasar por los que le prece-

den. Además, este tipo de archivos no pueden abrirse simultáneamente para lecturay escritura y terminan con una marca de final de archivo.

Los archivos secuenciales en Java se pueden abrir para lectura conFi 1e I nput St reamo Fi 1eReader ypara escritura con Fi 1 OutputSt 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 comen-

zará por el principio. Cuando un archivo secuencial se abre para escritura, el puntero de datos imaginario puede colocarse al principio del archivo, con lo quesi éste existía se perderá cualquier información almacenada en el mismo, o  bienal final:

 public F i l eOut put Ct r eam( j ava. l ang. St r i ng nombre,  boolean añadir)

 public Fi l ewr i t er ( J ava. ang. St r i ng nombre,  boolean aríadir)

 para así poder añadirle nueva información por el final.Un caso particular de archivos secuenciales son los archivos de texto, que están

formados por una serie de líneas cada una de las cuales se encuentra constituida poruna serie de caracteres y separadas por una marca de final de línea.

Ejercicio

Diseñar Ún  programa con interfaz gráfica que muestre el contenido de los archivosde texto que se le indiquen a través de un campo de texto (Fig. 14.8).

Page 396: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 396/482

 Archivos 305

-

mod e c on c odepageprepate=((850) C i W I N D ü W S \ C O M M A N D \ e g aI

mode con codepage select=850

keybsp,,C

iWINDOWSiCOMMAND\keyboard

SYS

set path=% p ath% ,C h i pFin

f

Figura 14.8. Ejecución: muestrael contenido del archivoc :aut oexec. bak.

importj ava. i o. * ;

import j ava. awt . * ;

import j ava. awt . event . * ;

 public class LeeText o extends Fr ame implementsAc 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 ( )

cetLayou t (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 F i 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 ( ) ;

Page 397: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 397/482

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 o de 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

i

F i l e3eader f = null;

Suf f e r e dRe ade r 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 e a s L i ne 0;

if ( r ader , a ! =null)

cor . t eni do. append( cadena + " \ n " ) ;

i

while ( cadena ! =null);

catch ( F i l eNo z Fo undEx c ept i s n e)!

c ont e ni do . apFend( " Ei ar c h; vo no ex i 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=Y

t

if ( b r ! =null)

{

Dr . c l os e( ) ; / / bast 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 " );

i

coxt eni do . appexd ( "F: n\ n\ n" )

;

Page 398: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 398/482

 Archivos 387

Ejercicio

Un ejemplo de serialización. El  programa debe permitir efectuar altas y bajas y con-

sultas de los datos de los empleados de una empresa.

En la implementación expuesta a continuación, las operaciones se efectúan enun array en memoria; este array es el campo de datos de un objeto de tipoPer sonal . El objeto Per sonal se recupera y escribe desdeien

un archivo en eldisco empleando serialización. Como los elementos del array son objetos de tipoEmpl eado, la clase Empl eado también ha de ser serializable. El método mai nde la clase Ej

empl 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 clase Empl eado representa los registros y sus campos son: códi go,edad, nombr e, domi ci l i o y t el Sf ono. El códi go es el campo clave queidentificaal empleado y 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 array.El array se crea de nuevo, para aumentar su tamaño, en cada adición y se utiliza otro

array auxiliarc opi aDeL i st a  para conservar la información anterior. Tras crear

el nuevo array ar r Empl eados , se copian en e1 los elementos del arrayc opi aDeL i s t a

y se coloca al final el nuevo empleado ( unEmpl eado) . Estaforma de trabajar imita el funcionamiento de la clase Vector del paquete j ava .ut i l , que inicialmente crea un array de objetos de un tamaño determinadoy, si más adelante se necesita, crea otro de mayor tamaño, mueve todos los objetosal nuevo y borra el antiguo; la clase Vector  proporciona así arrays dinámicos, queaumentan o disminuyen de tamaiio en tiempo de ejecución.

La baja de un empleado (métodoel i Lm nar

de la clase Per sonal ) disminu-ye el tamaño del array.

La consulta pide un códi go y efectúa un recorrido secuencia1 del array hastaque éste se acaba o encuentra un empleado cuyo códi go sea igual al introducidodesde teclado. En el caso de que encuentre a dicho empleado, muestra la informa-ción almacenada sobre dicho empleado.

import j a v a . i o . * ;

 public c la s sEj empl o

static Per sonal l i s t a = nu 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 scos ta t ic boolean car cbi os ;

Page 399: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 399/482

Java 2. Manual de Programación

 publ ic static void mai p( St r i ng[ ] args)

l eer ( ) ;

oper aci ones ( );

escr i bi r ( )

;

 publ ic s t a t i c void 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 cher 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

catch ( Cl assNot FoundExcept i sn e)

Syst em. out . p r i n t i r .( " E r r o r : + e.os t r i ng ( ) ) ;

catch ( 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 ( ) ) ;

1

f i n a l l y

I

i f ( o i s ! = nul l )oi s .cl ose ( ) ;

1

catch ( I OExcept i on e)

t j

 publ ic s t a t i c void oper aci ones ( )

t

s ho r t opci ón = O ;

I npuZCt r eamReader i s r = new : nput St r eamRea der ( Sy s t em i n) ;

Buf f er edReader br = new BL f f er edReader ( 1s r ) ;

Page 400: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 400/482

 Archivos 389

int posi = - 1;short código = 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 otry

t

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. F i 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: " ) ;

do

opci ón = Short . par s eShor t (new Buf f e r 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 * /

/ * se t ra ta l a excepc i 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 . eadLi ne ( ) ;

catch ( Numcer For mat Except

i o n ne)

Syst em out . pr i nt l n

( " Vai or no vál ; do

+

e r ro r = true;

"( ha de ser un númer o) " ) ;

I

while ( e r r o r );Syst em. out . r

i ni : ombr e:nombr e = br . r eai L i ne

( ) ;

do

{

) ;

Page 401: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 401/482

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 or

no vái l do

f

error = true;

" ( ha de serUI

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 eadL i 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;

do

case 2: / / baj as

t

er ro r=

false;try

t

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 L i ne ( ) ;

1

i

catch ( Number For mat Except i on ne)

Sys t em out . pr i nt l n( " Vai or no vál i do

f

error = true;

" ( ha de ser un númer o) " ) ;

!i

while ( 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 r1

n t 1n ( " Reg c t r o e1i mi i ado ;

cambi os = true;

1

elseif

( 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" ) ;

Page 402: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 402/482

 Archivos 391

case 3: / / consul t asdo

er ro r = false;

try

I

Sy st em out

. pr i nt ("Código 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 on

r e )t

Cys t em out . p r i ~t l n

( " Val or no vál i do+

er ro r = true;

" (ha de serUT.

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)

else

Cyst em out

. pr i nt 13

( " Regi st r o noencoctzado" ) ;

Cys t e m out . pr i nt l n

( " L i s t a vac i a" ) ;else

l i s t a. e: ement o( pos i )

. most r ar0 ;

 break;case 4:

while ( o pc i 6n ! = 4) ;

catch I OExcept i on e)

 public static void es cr i b; r ( )

t

Obj ect Out put St r eamous = null;

/ / s i

hubo cambi os l o s ' : ; 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 );F i l eOnt put Ct z e an( " empr e s a. da t " ) ) ;

i

l i s t a = null;

catch (

I OExcept i on e)

Page 403: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 403/482

392 Java 2. Manual  de Programación

t

Cys t em out . pr i nt i n( " Er r o r :

+

e. t oSt r i ng( ) ;

finally

t

if(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 ( )

/ / r e a ' e l arraynEl ement os = O;ar r Empl eados = i ni c i al i z ar ( nE1ement os ) ;

 private Empl eado[ ] inicializar(int

nEl ement os)

t

return new Empl eado [ nE l ement os ]

;

catch( Ou

Of Memor y 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)

else

return ar r Empl eados

[ 1 ;

I

Page 404: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 404/482

Page 405: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 405/482

394 Java 2. Manual de Programación

i f ( pos 1 < nEl ement oc)

for ( i n t 1 = pos i ; I < nE l ement os ; I ++)

i f ( ar r Empl eadcc

[

] . ev ol v er c odi go ( ) == cc d)

return 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 nmp l eado ( sh o r 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 devo l ver Nombr e0

r et ur n nombr e;

Page 406: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 406/482

 Archivos 395

 public void es t abl ecer Edad ( s h o r t annos)t

I

edad = annos;

 public s h o r t devol ver Edad

( )

t

r e t u r n edad;

 public void ec t abl ec er Dom c i l i o( St r i ng dom)i

domi ci l i o = dom;

 public St r i ng devol ver Dom c i l i o( )

I

r e t u r ndom c i1i o;

i

 public void es t abl ecer Tel Sf ono ( St r i ng t f no)I

t el éf ono = t f no ;1

 public St r i ng devol ver l el ' i f ono( )

i

re t u r n t ei éf ono ;I

 public void most r ar ( )

i

Sys t em out . pr i nt l n ( devol ver Codi go ) ) ;

Syst em. out . pr i nt l n ( devo Lver Nombr e ( ) ) ;

Cys t em out . pr i nt l n ( devo. L ver Edad ) ) ;

Sys t em out . pr i nt l n ( devo. . ver Dom ci l i o ) ) ;

Sy s t e m out . pr i nt l n ( devo1- ver Tel éf ono

) ;

I

14.17. ARCHIVOS DIRECTOS

Los registros en un archivo de acceso directo han de ser de longitud fija. En unarchivo directo, el orden físico de los registros 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,

Page 407: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 407/482

396 Java 2. Manual de Programación

se abren para lectura y escritura al mismo tiempo. En JavaRandomllccessFi le

es la clase que permite la apertura de archivos de acceso directo y ofrece el métodos ee k ( p o s i c i ó n )  para el posicionamiento sobre un determinado registro del

srchivo.

 Nota: A diferencia de los secuenciales:

Los archivos directos se abren para lectura y escritura al mismo tiempo.Permiten el posicionamiento sobre un determinado registro, sin que seanecesario recorrer los anteriores.

14.18. FUNCIONES DE TRANSFORMACIÓN DE CLAVEY TRATAMIENTO DE COLISIONES

Aunque la información en un archivo directo puede colocarse simplemente deforma secuencial, normalmente esto no se hace así, dado que la utilidad fundamen-

tal de los archivos directos es proporcionar un rápido acceso a la información. Conesta finalidad los datos deben situarse de tal manera que puedan ser localizadosrápidamente y, como éste tipo de archivos permite el posicionamiento directo en undeterminado lugar del archivo y el acceso a la información en los archivos se sueleefectuar utilizando una clave, la solución consiste en crear una relación perfecta-mente definida entre la clave identificativa de cada registro y la posición donde secolocan dichos datos. La

c

es un campo del propio registro que lo identifica demodo único, por ejemplo el número de matrícula de un alumno en el caso de unarchivo que almacenara datos de alumnos o el  NIF, número de identificación fiscal,

en el caso de querer guardar información sobre los 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 Tabla 14.1,otras veces esto no es posible.

Tabla 14.1. Fórmula que en algunas ocasiones se  puede aplicar para transformar la clave en una posición

Fórmula Clave Posición relativa al

comienzo del Archivo

O

5* t amaño r egi st r oo s i c i o r . = (long) ( x - 1 )* t amaño r egi s t r o;

Page 408: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 408/482

 Archivos 397

La citada fórmula no se puede utilizar cuando 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 mismas o 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 tipo l o n g dado que el argumento de s e e k es de tipo l 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 que se ha producido una colisión y 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ón

que produzca pocas colisiones.

Ejemplo

Imagine que las claves identificativas de los registros que desea almacenar oscilanentre los valores 1a 1O O OO O O ,  pero la cantidad de registros sobre los cuales se vatener que guardar información sólo es 5 O . Según la fórmula de la Tabla 14.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 grande y estaría en su mayor parte deso-cupado. Puesto que se sabe que no va a ser necesario guardar más de 50 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 entre 1 y 1 0 0 0 0 0 0 en números entre O y 4 9 .Lógicamente con esta función a registros con diferentes claves les puede corres-

 ponder el mismo x 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ón hushy 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 por fin un

Page 409: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 409/482

398 Java 2.Manual de Programación

determinado registro. El tratamiento de las colisiones también se puede efectuar demuy diferentes formas:

Creando una zona especial, denominada zona de excedentes, a la cual se lle -van exclusivamente esos registros. La zona de desbordamiento, excedentes osinónimos podría encontrarse a continuación de la zona de datos o ser inclusootro archivo.Buscando una nueva dirección libre en el mismo espacio donde se están intro-

duciendo todos los registros, zona de datos, para el registro colisionado. Lo quese puede hacer mediante diferentes técnicas, por ejemplo, direccionamientoabierto y encadenamiento.

-El direccionamientoabierto resuelve las colisiones mediante la búsqueda, enel mismo espacio donde se están introduciendo todos los registros (zona dedatos) de la primera posición libre que siga a aquella donde debiera habersido colocado el registro y en la que no se pudo situar por encontrarse yaocupada. El archivo se considera circular y cuando se busca sitio para unregistro las primeras posiciones siguen a las últimas.

- El encadenamiento se basa en la utilización de tablas hash que permitanlocalizar rápidamente por la clave la posición donde se ha escrito el archivo

en el disco. Los registros se colocan en el archivo de forma secuencia1excepto cuando se deseen aprovechar los huecos dejados por las operacionesde baja.

Ejercicio

Presentar un menú de opciones que permita efectuar altas, bajas y consultas en unarchivo directo mediante el método de transformación de claves. El archivo,ot 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. El campo clave es el códi go.

El método de transformación de claves consiste en introducir los registros en elsoporte que los va a contener en la dirección que proporciona el algoritmo de con-

versión. Su utilización obliga al almacenamiento del códi go en el propio registro,ya que éste no se podrá deducir de la posición, y hace conveniente la inclusión enel registro de un campo auxiliar, ocupado, en que se marque si el registro está ocu- pado o no. Se requiere tener en cuenta que códigos distintos, sometidos al algorit -

mo de conversión pueden proporcionar una misma dirección, por lo que se tendrá previsto un espacio en el disco para el almacenamiento de los registros que hancolisionado. Aunque se puede hacer de diferentes maneras, en este caso se reser -vará espacio para las colisiones en el propio archivo a continuación de la zona dedatos. Se supondrá que la dirección más alta capaz de proporcionar el algoritmo de

Page 410: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 410/482

 Archivos 399

conversión es FINDATOS y se colocaran las colisiones que se produzcan a partir deallí en posiciones consecutivas del archivo. La zona de colisiones será la compren-

dida entre FINDATOS y MAX; siendo MAX una constante establecida por el progra-

mador que determina el tamaño total del archivo y cuyo valor, lógicamente, serámayor que F I NDAT OS .

Creación. Cuando se abre el archivo por primera vez se debe realizar un reco-

rrido de todo el archivo inicializando el campo ocupado a un valor vacío, porejemplo, a espacio en blanco. La inicialización a espacio en blanco del campoocupado se realiza hasta MAX.Altas. Para introducir un nuevo registro se aplica al campo c ó d i g o de dichonuevo registro el algoritmo de conversión, obteniendo así la posición donde

debe situarse. Se lee la información almacenada en el archivo en dicha posi -ción y si el campo ocupado 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úaen la primera posición libre existente en la zona de colisiones.C

Para localizar un registro se aplicará al có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 baja y 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.B

La eliminación de un registro se efectuará mediante baja lógica y con-sistirá en:

- Localizar el registro buscándolo por su 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 campo ocupado,

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 regi 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 =15;

/ / Fi n de l a zona de dat os

static 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 eredReader ( i s r );

s t a t i c Per sonal 2 ar chi vo = n u l l ;

( Sys t em i n);

Page 411: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 411/482

400 Java 2. Manual  de Programación

publ ic s ta t i c void mai n ( St r i ng[ args)i

try

I

abr i r ( )

;operaci ones

( );

1

catch ( I OExcept i on e)i :

1

f i n a l l y

i

t r y

i ar chi vo. cerrar ( );

1

catch(

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( ) ) ;

}

publ i cs t at i cvoi dabr i r ( ) t hr ows I OExcept i on1

Empl eado2 unEmpl eado = nul 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 c i 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) ;

1

else

Sys t em out . pr i nt l n ( " Ar chi vo ya exi st e" ) ;

publ i cs t at i cvoi doper aci ones( ) t hr ows I OExcept i oni :

shor topci ón = O;bool eaner 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" ) ;

Page 412: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 412/482

Sys t em out . pr i nt 1n ( "4. Fin");

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

Sys t em out . pr i nt ( " E L j a opci ón:" )

;

do

{

error = f al se;try

i

opci ón = Shor t . par seShor t ( new Buf f er edReader ( new

I nput St r eamReader ( Sys t er n. i n) ) r eadL i ne( ) ) ;

1

cat 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

1

whi l e( opc i ón

! =4) ;)

publ i c stat 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( )

throws 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;

Page 413: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 413/482

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

do

i

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 s es hor 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) " ) ;

1

while (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 c hi vo. el ement o( pos i ) ;

encont r adoHueco = false;

/ / si no est á l i br e se busca hueco en l a zonadc?

col i s i onesif ( unEmpl eado. evol ver Ocupado (

) == ' *

en l a zona de dat os * /

t

posi = FI NDATOS - 1;while ( pos i < MAX- 1 && encont r adoHueco)

Iposi = posi + 1;

unEmpl eado = ar chi vo. e l 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( )

;

do

i

error = false;

try

I

Sys t em out . pr i nt ( "edad: ' I ) ;

edad = Shor t . par s eShor t ( br . r eadL i ne( ) ) ;

1

Page 414: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 414/482

 Archivos 403

catch ( Number For mzl t Except i on ne)!

Syst em. out . p r i n t : l n ( "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 c i l i o = br . 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 s i ones * /

1

1

 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;

do

i

error = false;

try

Sys t e m out . pr i nt ( "Códi go a bor r ar :" )

;

códi go = Short . par s es hor t ( b r . eadLi ne

( ) ;

i

catch ( 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)

" ) ;

1

i

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;

Page 415: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 415/482

404 Java 2. Manual  de Programación

/ * si no se encont r ó en l a zona de dat os se recor 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 = arch i 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

1

if( ! 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( pos i , 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) " ) ;

1

1

while ( 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;

Page 416: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 416/482

Page 417: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 417/482

Page 418: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 418/482

 Archivos 407

 pub l ic i n t l ongi t ud ( ) throws I OExcept i on

r e tu rn ( i n t )Mat h. c e i l ( (double)r a f .l engt h( ) / 1or gReg) ;

 publ ic void cerrar ( ) throws I OExcept i on

if ( 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. * ;

 pub 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 1i 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 char ocupado;

 publ ic Empl eado2 ( )

i

códi go = O;

edad = O;nombr e = ;

domi c i 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 * /

 publ ic Empl eado2 ( s h o r t cod, St r i ng nom, s h o r t annos, Str1r .g

dom, St r i ng t f no, char m3r ca)

I

códi go = cod;nombr e = nom;edad = annos;domi c i l i o = dom;t el éf ono = t f n o ;ocupado = mar ca;

i

 publ ic long t amaño ( )

i

/ * t amaño q u e ocupan l os campos de dat os. Un shor t ocspa 2byt 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 * /return 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

Page 419: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 419/482

408 Java 2. Manual de Programación

publ i c voi dest 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 des 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 ng

dorn)

1

domi c i l i o = dom;1

publ i c St r i ng devol ver Dom c i l i o( )

i

return dorn; ci l l o;

publ i c voi des t abl ec er Tel ef ono( Ct r i ng t f n o )

t el kf onc

= t f n o ;

Page 420: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 420/482

 Archivos 409

 public St r i ng devol ver Tel ef ono( )

I

return t el éf ono;I

 public void most r ar ( )

I

Sys t em out . pr i nt l n( devol ver Códi go( ) ) ;

Sys t em out . pr i nt l n( devol ver Nombr e( ) ) ;

Sys t em out . pr i nt l n d ev ol v er Edad0) ;

Sys t em out . pr i nt l n devol ver Dom c i l i o( ) ) ;

Sys t em out . pr i nt l n devol ver Tel ef ono( ) ) ;

1

Page 421: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 421/482

CA 15

Estructurasde datosdefinidaspor

e l

programador

CONTENIDO15.1. Listas.15.2. Implementaciónde una lis ta.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.

rn 411

Page 422: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 422/482

41

2

Java 2. Manual de programación

Java, como los restantes lenguajes de programación, suministrauna serie de ti’pos de 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 que los manipulan.Estos tipos de datos se definen mediante clases y proporcionanuna de las características más importantes de la P O 0 (Pro-gramación Orientada a Objetos), la reutilización de componentes.Las colecciones de datos organizados y a las que se accede deforma perfectamente definida constituyen una estructura 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 de los 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 son estructuras de datoslineales,puesto que en ellas cada elemento tiene un único prede-

cesor y un Único sucesor, mientras que las dos Últimas son estruc-turas no lineales. En este capítulo se describen estructuras dedatos lineales, ya que las 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

Una lista es una secuencia de elementos del mismo tipo o clase almacenados en me-

moria. Las listas son estructuras lineales, donde cada elemento de la lista, excepto el primero, tiene un único predecesor y cada elemento de la lista, excepto el último, tieneun único sucesor. El número de elementos de una lista se denomina longitud. En unalista es posible añadir nuevos elementos o suprimirlos en cualquier posición.

Existen dos tipos de listas: contiguas y enlazadas. En una listacontigua los ele-mentos son adyacentes en la memoria de la computadora y tienen unos límites,izquierdo y derecho, que no pueden ser rebasados cuando se añade un nuevo ele -mento. Se implementan a través de arrays. En este tipo de listas la inserción o eli-minación de un elemento, excepto en la cabecera o final de la lista necesitará unatraslación de parte de los elementos de la misma (Fig. 15.1). Una lista enlazada secaracteriza porque los elementos se almacenan en posiciones de memoria que noson contiguas (adyacentes), por lo que cada elemento necesita almacenar la refe-rencia al siguiente elemento de la lista.

Page 423: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 423/482

Estructuras de datos definidas por el programador 413

Las listas enlazadas son mucho más flexibles y potentes que las listas contiguasy, en ellas, la inserción o eliminació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 vinculando nodos (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 serie o 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 adecuadas y el tras-

 paso de la información del viejo al nuevo array. Se ha de tener en cuenta que la clase

Vector de Java permite crear estructuras de datos de tipo array de objetos redi-

mensionables durante la ejecución de un programa. En el caso de utilizar nodos vin-culados para almacenar la información, éstos se crean y destruyen conforme serequieran, de esta manera la lista aumenta o disminuye de tamaño dinámicamente ysólo se llena cuando se agota la memoria disponible. El acceso a la lista se realizamediante una referencia al primer nodo de la misma y, para marcar su fin, se esta-

 blece la referencia de enlace del último nodo a n u l l .

LLongi tud Vacíos Límitede la lista superior

Límiteinferior

Figura 15.1. Listacontigua.

 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.

Page 424: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 424/482

414 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.

xi

Las listas enlazadas se clasifican a su vez en tres tipos: circulares, doblementeenlazadas y doblemente enlazadas circulares.

xi

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 desde f rente af i nal como desde f i n a l a f rente .Cada nodo de dichas listas consta de unmiembro con información y otros dos que referencian objetos de su mismo tipo( a n t y s i g ) , uno para referenciar al nodo sucesor y otro al predecesor (Fig. 15.5).

~

t i na1

f r ent e

I

I

xrl

Figura 15.5. Lista doblementeenlazada.

 Listas doblemente enlazadas circulares. En este tipo de listas el miembro a n t

del primer nodo de la lista referencia, o apunta, al último nodo y el miembro s i gdel último nodo al primero (Fig. 15.6).

Page 425: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 425/482

Estructuras de datos definidas por e programador 415

i ni ci o

Figura 15.6. Lista doblemente enlazadacircular.

Resumen:Una lista enlazada se caracteriza porque los elementos se almace-

nan en posiciones de memoria que no son contiguas o adyacentes. Cada ele-mento necesita almacenar al menos una referencia al siguiente elemento de lalista. En una lista enlazada la inserción o eliminación (supresión) de un ele-mento no requiere el desplazamiento de otros elementos de la misma.

Importante: Una lista enlazada que se implementa vinculando nodos aumen-

ta y disminuye de tamaño dinámicamente.

I

15.2. IMPLEMENTACIÓN DE UNA LISTA

Los métodos básicos que necesitaría implementar una lista son los especificados enla clase Li st a:

El constructor Li st a crea una lista vacía asignando el valor n u l1al miem- bro privado inicio que contiene la referencia al primer nodo de la lista.El método vaci a determina si la lista esta vacía comprobando si la referen-cia al primer nodo de la lista es nul l . Devuelve t rue cuando la lista estávacía y f a1se en caso contrario.El método

i ns er t ar pr i nc i pi o

crea un nuevo nodo donde almacena unareferencia al objeto que recibe como parámetro y otra al i ni ci o de la lista, por último asigna a i ni ci o el nuevo nodo y convirtiéndolo así en el primerelemento de la lista.

El métodobor r ar pr i nc i pi o

guarda en auxi la referencia al primer nodode la lista, y quita éste nodo de la lista, asignando a i ni ci o la referencia alsiguiente nodo de la lista, contenida en i ni ci o. s i g; por Último, devuelvela referencia al nodo que se ha quitado (auxi ).

Page 426: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 426/482

416 Java 2. Manual  de programación

 public class Li s tai

 private Nodo i ni c i o;

Li s ta ( )

i

i ni ci o = null;

 public boolean vací a ( )

(

1

return ( i n i c i o == null);

 public voidi ns er t ar Pr i nc i pi o( 0bj ect el 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)

t

return null;1

else

I

Nodo auxi = i n i c i o ;i ni ci o = i n i c i o . si g;return ( auxi );

I

1

 public voidmost 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;1

I

 public class Nodoi

 public Obj ect i nf o; public Nodo si g;

Page 427: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 427/482

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 voidmost 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 taunaL i s t a = new Li s t a ( );

unaL i s t a. i ns er t ar Pr i nc i pi o( new I nt eger ( 1) ) ;

unaL i s t a. i ns er t ar Pr i nc i pi o( new

I 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;

1

unaL i 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 buscar o suprimir un ele-mento determinado. Estas acciones requieren añadir métodos que permitan la

 búsqueda y el  borrado de elementos con un determinado valor en un campo dedatos clave.

15.3. LISTA ORDENADA

Una lista está  ordenada cuando sus elementos está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 resultan más rápidas las operaciones de supresión de elementos en

 posiciones intermedias mediante el empleo de este tipo de listas (Fig. 15.8).

Page 428: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 428/482

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 intermediade la lista.

i n i c i o ............................................

Figura 15.8. Supresión de un elemento en una posición intermedia dela lista.

< . ,

l n l C l O ..................~

I

- 1 I / I r I

Figura 15.9. Supresión del primer elemento dela lista en una lista

con varios elementos.

Page 429: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 429/482

Estructuras de datos definidas por el programador 419

, . .

l nl CI O . . . . . . . . . . . . . . . . . . . . . . . . .

Figura 15.10. Supresión del primer elemento de la listaen una lista con un único elemento.

La clase Li st aor denada muestra las operaciones básicas para necesarias para

trabajar con una lista encadenada ordenada construida mediante vinculación denodos. Estas operaciones san:

El constructor Li st aor denada crea una lista vacía, asignando el valornul l al miembro privado i ni ci o que contiene la referencia al primernodo de la lista.El método vaci a comprueba el valor de i ni ci o y devuelve true cuandola lista está vacía, es decir, cuando la referencia al primer nodo es nul l . y

f al se en caso contrario.El método i nser t ar crea un nuevo nodo de la clase Nodo2, capaz de alma-cenar un entero, una cadena y la referencia a otro objeto de su misma clase, yalmacena en dicho nodo la cl avey el nombre a i nser t ar . El método utili-za una variable de la clase Nodo2 para recorrer la lista hasta que esta se acabeo encontrar un elemento con cl avemenor o 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 al que en ese momento está siendo visitado. Cuandotermina el recorrido inserta el nuevo nodo a contiuación del ant er i or . Si elant er i or es nul l , puede significar que la lista está vacía o que la clave del

 primer elemento de la misma es menor o igual a la del nuevo y, en ambos casos,dicho nuevo elemento ha de situarse al comienzo de la lista.El método borrar 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 la i nser ci ón, empleandotambién las variables actual y ant er i or .Si encuentra el elemento y es el primero, hace que i ni ci o referencie al siguiente nodo de la lista, mientras

que si lo encuentra en cualquier otra posición, lo que hace es que el camposi gdel elemento ant er i or referencie al elemento siguiente ( act ual . cig) .

El método most rar Li st a utiliza la variable actual  para efectuar un recorri-do de la lista y presentar la información almacenada en cada uno de sus nodos.

Page 430: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 430/482

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 (int 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;

/* recor re l a l i st a hast a encont rar 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 ( c l ave < act ual . c l ave)i

ant er i or = actual ;act ual = act ual . s i g;

1

elsepasado = 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 er a 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;else

ant er i or . s i g = nuevoNodo;

nuevoNodo. si g = act ual ;i

 public Nodo2 bor r ar(int

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 & & ! encont r ado)i

Page 431: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 431/482

Estructuras de datos definidas por el programador 421

if ( c l ave == ac tual . c l ave)

else

encont r ado = true;

I

ant er i or = actual ;act ual = act ual . s i g;I

/ / si se encuent r a se 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 st 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 tual . s i g;

ant er i or . s i g = act ual . s i g;

i

return null;

 public void buscar (int 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 ( actual !

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;

actual ;act ual = act ual . s i g;

1

/ / si se encuent r a s e muest r aif ( encont r ado)

else

a c t ua l . mo s t r a r No do 0 ;

Sys t em out . pr i nt l n ( “No es ta” );1

 public voidmos t r ar l i s t a

0

i

Nodo2 ac t ual = i ni Ci 0;

while ( actual ! =null)

Page 432: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 432/482

422 Java 2. Manual de programación

ac t ual . mos t r ar Noao( ) ;

act ual = ac tual . s i g;

 public class Nodo2

 public int c l ave; public St r i ng nomsre;

 public n'odo2 sig;

 public Nodo2(int cl , St r i ng n)

cl ave = c l ;nombr e = n;

s l g

= null;

 public voidmost r ar Nodo ( )

Cys t er . out

. pr i nt l n ( " Cl ave: " - cl ave+" Nombr e " +nombr e) ;

I

 public classP r ~e b a 2

i

 public static void mai n ( Ct r i nq a rgs )

Li st aor denada u n a i i s t a = newL 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 " ) ;; naL i s t a . mos t r ar L i s t a( ) ;

/ / . .

15.4. LISTASGENÉRICAS

Y USO DE INTERFACES

 A diferencia de la clase Li sta, la clase Li st aor denada creada en el apartadoanterior es demasiado específica, ya que sólo puede almacenar un tipo entero y una

cadena. Para arreglar situaciones como ésta y que una lista pueda almacenar datosde cualquier clase, los métodos de la lista deberán trabajar con la superclaseOb] ec t .

Esta estructura permitirá, siempre que se efectúen las conversiones ade-cuadas, utilizar la lista para almacenar objetos de distinta clase. Se ha de tener pre-

Page 433: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 433/482

Estructuras de datos definidas por el programador 423

sente que Java convierte implícitamente una referencia a un objeto de una subclaseen una referencia a su superclase y también que es conveniente que en un objetol sólo se almacenen datos homogéneos, de una misma clase.

En la clase L i saor 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 la iinpleinentación de 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 clase Obj ect , como perteneciente a la interfaz Compar abl e. Así,

 para construir una L i saOdenadaGener i ca

y utilizarla  para almacenar en ella

una serie de libros ordenados por el ISBN se 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 e c , int

c r : te r i c ) throws Ex cept i un;

Declarar Compar abl e el campo de datos del nodo, i n f .

/ /

Ncdo compar abl e public class Nodo3

 private Compar abl e i nf ;

 privateKu'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 sus inétodoc trabajen con Compar abl e.

/ / L i s t a enl azada or denada es tandar par a Coppar abl es public class L - s t aCdeoadaSener i ca

I

 private int c r i t e r i o ;

Page 434: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 434/482

424 Java 2. Manual de programación

 private Nod03 pr i mer o;

Li s t aOdenadaGener i ca( i nt cr 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 ab1e el ement o) t hr owsExcept i on

i

1

/ / . . .

 public Comparabl e obt ener ( Compar ab1e el ement o) t hr owsExcept i on

t

/ / ...1

/ / .. .

Hacer que los tipos de datos a colocar en la lista implementen los métodos decomparación. Así,  para construir una lista de libros ordenada por ISBN, laclase Li br o debe implementar el método menorque.

class Li br o implements Compar abl e

i

 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 ng a, 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 ab1e c, int cr i ter i o) throws Except i on

{

Page 435: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 435/482

Estructuras de datos definidas por el programador 425

if (! c

instanceof Libro)

t

throw new Exception ("Error de comparación");

i

return((

(Libro))

.ISBN<

ISBN);

1

 public String devolverAutor

( )

t

return (autor);

I

 public StringdevolverTitulo 1

(

return(titu1o)

;

i

 public long devolverISBN ( )

I

1

return (ISBN);

íjercicio

Diseñar una clase ListadeLibros, que permita efectuar la gestión de una biblioteca.

La clase Lis adeLibros representa un array unidimensional cuyos elemen-

tos son listas enlazadas ordenadas de la clase ListaOrdenadaGenerica 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 e ISBN. 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 una ListaOrdenadaGenerica, loslibros que comiencen por la misma inicial serán situados en la correspondiente listaenlazada ordenados por ISBN.

Page 436: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 436/482

426 Java 2.Manual de programación

z

Figura 15.11. La clase Li sta enl azada.

Los aspectos más importantes en cuanto a genericidad de la claseLi st aOrdenadaGeneri ca acaban de ser comentados, ya que esta clase ha sido

 puesta como ejemplo para exponer las características de las listas genéricas. Por otra parte, Li st aOr denadaGener i ca es una lista ordenada y los métodosestal 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 clase Li st aor denada,excepto porel empleo del método menorque, en lugar de un operador

relacional,

 para efectuarlas comparaciones entre los elementos de la lista y el elemento a insertar o eliminar.Otros detalles se especifican en el código como comentarios.

Como Li st adeLi br os representa un array cuyos elementos pertenecen a laclase Li st aOr denadaGener i ca, su constructor crea e inicializa el array, cre-ando cada uno de sus objetos, de la clase Li st aOr denadaGener i ca.El méto-do guardar : 1) llama al método 1

i st 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 array de lalista donde el libro debe ser insertado; 2) invoca al método i nser t ar deLi st aOrdenadaGener i ca para que

efectúe

la inserción. Los métodos recuperary el i mi nar también recurren a l i st a para determinar la posición en el array dela lista donde el libro a consultar o suprimir debe encontrarse situado; la diferen-

cia entre ambos es que recuperar una vez localizada la lista llama a obt ener  paraque encuentre el elemento dentro de la misma, mientras el i mi nar llama a el i -mi na para que suprima dicho elemento de la lista.

Page 437: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 437/482

Estructuras de datos definidas porel

programador 427

Otras clases e interfaces implementadas son:

NOd03. Clase de los nodos de la Li st aOr denadaGener i ca.

Li br o. Clase que implementa la interfaz Compar 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.

 pub l i c class Li st adeLi br osi

/ /  Tamaño del ar r ay de i ndexaci ón

f i n a l s ta t ic i n t 1 = ' z ' - ' ' +l ;

/ / Decl ar aci ón del ar r ay de I ndexaci ón

 pub l i c L i s t aOr denadaGener i ca[ ] l i br os;

/ * Const r uct or : I ni c i 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 SBN y car ece de val or elpar ámet r o pasado a Li st aOr denadaGener i ca * /

 pub l i c Li st adeLi br os ( )

I

l i br os = new L i s t aOr denadaGener i c a[ l ] ;

f o r ( i n t

i =O; i <l i br os . l engt h; i t +)

l i br os [ i ]

= new Li st aOr denadaGener i ca ( O ) ;1

/ /Si mpl e conver si ón de cl ave Ti t ul o- - >no

de l i s t a

i n t l i st a ( St r i ng t i t ul o)i

r e t u r n ( ( t i t ul o. t oL ower Cas e )

). c har At

( O)' a ' );

/ /

No de l i br os

i n tnl i br os

( )

!

i n t c = O ;

f o r ( i n t i =0; i < 1i br os . l engt h;

i + + )

Page 438: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 438/482

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 para el al macenami ent o

publ i c voi d guar dar ( L i br o l i br o){

try

I

1

cat ch( Except i on e) { )

l i br os [ l i s t a( l i br o. devol ver T i 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 ono se r eal i za compr obaci ón de segur 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 para l a el i r ni nac i Ón( vea cl 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

{

1

l i br os [ l i st a ( t i t ul o) . el i mi na( newLi br o(

t i t u l o , I SBN) ;

Page 439: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 439/482

Estructuras de 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 nt cr 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 s i l a l i s t a es t á o no vaci a

publ i c bool ean es t av ac i a

( )

t

r et ur n ( pr i mer o == nul l ) ;

/ / o 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 para 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: r

compar 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 a r ( Compar ab1e el er nent c ) t hrows Except Lon

Nodo3 nuevo = new No d o3 ( e l e me ~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 i o )

)

Page 440: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 440/482

Page 441: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 441/482

Estructuras de datos definidas por el programador 431

while (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( a ux2

! =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 )

else

pr i mer o = n u l l ;

auxl . s i gnar s i gui ent e (aux2 .devol ver s i gui ent e ( 1

) ;

1

/ *

Nodo3 compar abl e que i mpl ement a l a f ac i l i dadadi c i c i al

dedel 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  Nodo 3

 p r i v a t eCompar abL e

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 edevol ver val or ( )

i

r e tu r n( i n f );

 p u b l i cNodo3 dev ol v er Ci gai ent e

( 1

r e tu r n( c i g)

;

1

 p u b l i c voidas i gnar v al or

( Compar abl ei r . f or mac i o~. )

i n f = i nf or nac i ón;

 p u b l i c voida s i gna r S i gui ent e ( No do 3 s i gui ent e)

i

s;g = c i gui er t e;

Page 442: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 442/482

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 L i 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 L i br o( Ct r i ng a, St r i ng t , long i )I

autor = a;

t i t ul o = t ;

I SBN =i ;

 public St r i ng devo l 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) throws

Except i on

if ( !( c i nst anceof L i br o) )

return ( ( Li bro) ) . SBN<I SBN)

;

throw new Except i on ( " E r r o r de comparaci ón" ) ;

1

Page 443: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 443/482

Estructuras de datos definidas por el programador433

/ * 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 e en

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 * /

i nt er f aceCompar abl e

bool eanenor que( Compar ab1e c, i ntcr i t er i o) t hr ows xcepz i on;

1

/ / Excepci ón est ándar gener al de bj squeda

c l as sNoEst a ext endsExcept 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 L i s t adeL i br os

publ i cc l as sPr uebaLi

 public s t a t i c void mai n ( St r i ng[ ] args)i

/ / I ni c i al i za un obj et o L i s t adeL i 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

L i br o l i b r o l

= new L i br o ( " Chesterton" ," El padr e Br own" , 471193089) ;

Li br o l i br o2 = new L i br o ( " Fr oi d" ," Di e Tr aumdeut 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

!L i 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%) ;

Page 444: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 444/482

434 Java 2. Manual de programación

.............................. a n t i n f s i g ......................

Syc r er 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( nuevo2. devol v er Ti t ul o( ) +: +nuevo2. devol ver Aut o r

( )

) ;

Cycr em i n . read (

) ;

a n t i n f s i gI

catch ( 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 ) ;

catch ( Except i on e) {

I

15.5. LISTAS DOBLEMENTE ENLAZADAS

Se caracterizan porque su recorrido puede realizarse tanto desde f r ent ea f i nal

como desde f r ent e a f i nal . Este tipo de listas se suele construir vinculandonodos. Cada nodo de dichas listas consta de un campo con información y otros doscampos (ant y s i g ) que referencian el nodo antecesor y el sucesor respectiva-

mente. Además en una lista doblemente enlazada, cada nodo, excepto el primero yel último, se encuentra referenciado por otros dos, su sucesor y su antecesor.

Figura 15.12. Inserción de un nuevo elementoal principio de una lista doblementeenlazada.

Page 445: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 445/482

Estructuras de datos definidas por el programador 435

En la operación de inserción será necesario tener en cuenta si se trata del primerelemento de la lista; en caso contrario, el nuevo elemento ha de colocarse por delan-te del primero, en una posición intermedia o al final. La supresión debe contemplarsi se desea eliminar un elemento al principio de la lista, en el medio o ai final, y ade-más la posibilidad de que la lista conste de un único elemento y quede vacía tras su

eliminación.

15.6. PILAS

Unapila es una lista que tiene establecidas ciertas restricciones en cuanto a la formade extraer o colocar en ella nuevos elementos. La pila se utiliza siempre que se

desea recuperar una serie de elementos en orden inverso a como se introdujeron. Laextracción de un elemento de una pila se realiza por la parte superior, de igual formaque la inserción. Esta propiedad implica que el único elemento accesible de una pilaes el último. Estas estructuras se denominan LIFO (Last I First Output),((último elemento que se pone en la pila es el primero que se puede extraer)).

Las pilas se pueden implementar vinculandonodoc

y también mediante arrays,utilizando una variable auxiliar, ci ma, que apunte al Último elemento de la pi l a.

En realidad, en Java no es necesario definir la clase Pi l a, ya que en el paquetej ava. ut i 1 viene la clase St ack (pila). La clase St ack hereda de Vector , yaque una pila se puede implementar con eficiencia mediante una tabla que no tienetamaño fijo. Los métodos proporcionados por St ack son:

 public boolean empt y ( )

Comprueba si 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ón Empt ySt ackExcept i on.

 public synchronized  j ava. l ang. Obj ect pop ( )

Quita el objeto situado en la cima de la pila y lo devuelve como resultado 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 t

obj)

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 hasta la  posición donde el objeto,

obj ,

se encuentra situado o -1 si el objeto no está en la pila.

 public St ack ( )

Constructor.

Page 446: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 446/482

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 implementadacon vector

La implementación de una pila utilizando nodos vinculados requiere el diseñode los métodos:

.

.

Se

P i l a , el constructor. Crea una pila vacía asignando nul l al miembro pri-vado ci 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 de ci ma;devuelve true cuando el valor de ci ma es nul l y f al se en caso contra-rio.

api l ar . Añade un nuevo elemento en la cima de la pila, es decir, crea unnuevo nodo cuyo campo s i g referencia la ci ma de la pila y a continuacitn

asigna a ci ma el nuevo nodo.de sapi l ar . Comprueba que la pila no está vacía, suprime el nodo de la cimahaciendo que ci 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 c i 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 ( )

I

ci ma = null;

1

 public boolean vací a ( )

return ( ci ma == null);

I

Page 447: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 447/482

Estructuras de datos definidas porel

programador437

pub l i c vo idapi l ar ( 0bj ec t el ement o){

ci ma = new Nodo4( el ement o, ci ma) ;

publ i cObj ect desapi l ar ( ) t hr owsExcept i on{

i f ( vací a )

Obj ect aux =c i ma. i nf ;

ci ma =c i ma. s i g;

r et ur naux) ;

t hrow new Except i on ( " Pi l a Vaci a" ) ;

1

publ ic OLj ect obt ener ci ma

( ) t hr owsExcept i on

i i f ( vací a( ) )

r et ur n( ci ma. n f )

;

t hrow new Except i on ( "Pi l a Vac i a" ) ;

1

pub l ic c l assNodo4i

Obj ect i nf ;Nod04 si g;

Nodo4 ( Obj ect i nf or maci ón, Nod04 s i 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

i mpor t ava. i o. * ;

publ i cc l as s r uebaP

I public s t a t i c void 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 y

II nput St r eamReader i s = new

I nput St r eamReader ( Syst em i n) ;

Buf f eredReader bf = new Buf f er edReader ( i s);cadenai = bf .r eadLi ne

( )

;

Page 448: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 448/482

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 h0; t +)

p. api l ar ( newChar 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 );1

c at c h( Except i on e ) i

1

Cuando un programa llama a un subprograma, se utilizan internamente pilas para guardar el lugar desde donde se hizo la llamada y el estado de las variables en

ese momento.Entre las aplicaciones de las pilas destacan: 1) Su uso en la transformación de

expresiones aritméticas de notación injija a postfija' y en la posterior evaluación dela expresión. 2) Su utilización para la transformación de algoritmos recursivos eniterativos.

15.7. COLAS

Una cola es una estructura de datos lineal en donde las eliminaciones se realizan poruno de sus extremos, denominadofrente, y las inserciones por el otro, denominadofinal. Se las conoce como estructuras FIFO (First Input First Output). La cola de unautobús o de un cine son ejemplos de colas que aparecen en la vida diaria. La colase podrá implementar mediante un array unidimensional, usando la clase Vect or

o utilizando nodos vinculados.Cuando se implementa con un array (Fig. 15.14) se utilizan dos variables nu-

méricas, pr i mer o y úl t i mo, para marcar el principio yfinal de la cola; comolos elementos se añaden por el final y se quitan por el principio, puede ocurrir quela variable úl t i mo llegue al valor máximo del array, aun cuando queden posi-ciones libres a la izquierda de la posición pr i mer o (Fig. 15.15). Existen diver -sas soluciones:

Una de las tareas que realiza un compilador es la evaluación de expresiones aritméticas. En la mayo-ría de los lenguajes de programación las expresiones aritméticas se escriben en notación i que son aque-

llas en las cuales el símbolo de cada operación binaria se sitúa entre los operandos: 4 * (3+5). Muchoscompiladores transforman estas expresiones i en notación po.s?fij~~, en la cual el operador sigue a losoperandos (oprefija, en la cual el operador procede a los operandos) 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 notaciones p yprefija.

Page 449: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 449/482

Estructuras de datos definidas por el programador 439

Retroceso Consiste en mantener fijo 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 paraque el  principio coincida con el principio de la tabla.

Un array circular es aquel en el que se considera que la compo-nente primera sigue a la componente última.

Mediante un array circular

pr i mer o úl t i mo MAX

Figura 15.14. Cola implementada con array.

pr i mer o úl t i mo I

MAX

Figura 15.15. Cola implementada con un array tras una seriede operacionesde adición y sustracción de elementos.

La clase Vect or de Java, así como la creación de una cola utilizando nodosvinculados evitan los problemas originados por MAX en las implementaciones conarrays.

Las operaciones típicas en una cola son: crear la cola, comprobar si la cola estáo no vacía, poner elementos en la cola por el,final, quitar elementos por elfrente yobtener el objeto situado en e1,frente de la misma. En la implementación de unacola utilizando nodos vinculados que se efectúa a continuación los métodos querealizan las mencionadas tareas se denominan respectivamente: Col a, vací a,

poner , qui t ar y obt ener pr i mer o. Los miembros privados pr i mer o yúl t i mo guardan la información sobre elfrente yJinal de la cola; inicialmente, elconstructor asigna nul l a ambos.

Page 450: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 450/482

440 Java 2. Manual de programación

El método vaci a comprueba si queda algún elemento que se pueda extraer dela cola consultando pr i mer o y si el valor de pr i mer o es nul l devuelvetrue para indicar que la cola está vacía, en caso contrario devuelve f al se.El método poner se encarga de añadir nuevos elementos a la cola por elfinal; para ello, comienza por comprobar si la cola está vacía, si esto ocurre,será necesario que pr i mer o referencie al nuevo elemento, en caso contra-rio será el elemento referenciado por u1t i mo, a través de su campo si g ,

quien establezca un vínculo con el nuevo elemento, el método poner termi-na asignando a u1t i mo el nuevo elemento.El método qui t ar , si la cola no está vacía, asigna a una variable aux elobjeto alamacenado en el campo i nf del primer elemento, después hace quepr i mer o referencie al nodo referenciado por el campo si g de dicho primer

elemento, si la cola se ha quedado vacía y pr i mer o es nul l asigna tam- bién nul l a ul t i mo, en cualquier caso, cuando la cola no está vacía,devuelve aux.El método obt enerpr i mer o devuelve el objeto referenciado por el campoi nf o del elemento referenciado por pr i mer o.

publ i cc l as sCol at

pr i vat eNodo4 pr i mer o;pr i vat eNodo4 ul t i mo;

Col a ( )

{

pr i mero = nul l ;ul t i mo = nul l ;

1

pub li c boolean vací a ( )

{

\

r et ur n( pr i mer o == nul l );

publ i cvoi dponer ( Obj ect el ement o)t

Nod04

aux = new NOdO4( el ement o, nul l ) ;i f ( vací a )

el se

ul t i mo = aux;

pr i mer o = aux;

u1t i mo. si . g = aux;

1

publ i cObj ect qui t ar ( ) t hr owsExcept i on{

i f ( vací a( )

Obj ect aux = pr i mer o. i nf ;

throw new Except i on ( " Col a vací a" ) ;

Page 451: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 451/482

Estructuras de datos definidas porel

programador 441

pr i mer o = pr i mer o. s i g;

if ( pr i mer o ==

nul l )

ul t i mo = nul l ;

r et ur ndux);

)

 public Obj ect obt e ne r p r i me r o0 t hr owsExcept i onI

if ( vaci a )

r et ur n( pr i mer o. n f ) ;

t hrow new Except i on ( "Col a vací a" ) ;

1

 public class Nodo4

i

Obj ect i nf ;Nodo4 si g;

Nodo4 ( Obj ect i nf ormaci ón, Nodo4 s i gui ent e)i

i n f = i nf or maci ón;s i g = s i gui ent e;

1

1

Una aplicación de las colas es una cola de impresión. En un sistema de tiempocompartido suele haber un procesador central y una serie de periféricos comparti-dos: discos, impresoras, etc. Los recursos se comparten por los diferentes usuariosy se utiliza una cola para almacenar los programas o  peticiones de los diferentesusuarios que esperan su 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, la cola deprioridad; en ella el procesador central no atiende por riguroso orden de llamada,sino por las prioridades asignadas por el sistema o bien por el usuario, y sólo den-

tro de las peticiones de igual prioridad se producirá una cola.

Resumen: En realidad las pilas y las colas son listas que tienen establecidasciertas restricciones en cuanto a la forma de extraer o colocar

en ellas nuevoselementos:

La extracción de un elemento de una pila se reaIiza  por la parte superior, lomismo que la inserción. Estructura LIFO.

En una cola las eliminaciones se realizan siempre por uno de sus extre-mos, denominado frente, y las inserciones por el otro, denominado final.

Page 452: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 452/482

442 Java 2. Manual de programación

15.8. COLAS CIRCULARES

Una cola circular es una variante de las listas circulares. Una cola necesita dos refe-

rencias, una al primer elemento y otra al último; por consiguiente, una cola circularse toma como referencia de acceso la del Último nodo, de esta forma se tiene implí-citamente la del primero puesto que en una cola circular el primer elemento sigueal Último (Fig. 15.16).

último

I1

L

pr i mer o

Figura 15.16. Cola circular.

Teniendo en cuenta las consideraciones anteriores y utilizando nodos vincula-dos, los métodos a implementar tendrán las siguientes características:

El constructor, Col aci r cul ar . Crea la cola, asignando nul l al miembro privado ui t i mo.

vaci a. Devuelve true si la cola está vacía ( ul t i mo es nul l ) y f al se encaso contrario.

poner . Crea un nuevo nodo y comprueba si la cola está vacía; si está vacía,al campo si g del nuevo nodo le asigna el nuevo nodo; si no está vacía, asig -na al campo sig del nuevo nodo el primero ( ul t i mo.si g) y a ul t i mo. s i g

el nuevo. Al terminar, en ambos casos, asigna a u1t i mo el nuevo.qui t ar . Tras verificar que la lista no está vacía, el método considera doscasos: 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 valor nul l ;2) que la lista tenga más de un elemento y,  para eliminar el primero, este

 primero (que es ui 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 campo i nf o del primer elemento.

Page 453: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 453/482

Estructuras de datos definidas por el programador443

La implementación de la cola circular es:

 public class Col ac i r cul ari

 private Nodo4 ul t i mo;

Col ac i r cul ar( )

i

ul t i mo =

null;

 public boolean vací a ( )

i

return(u1timo == null);1

 public void poner ( Obj ect el ement o)I

Nodo4 aux = newN odo4( e l e r ne n t o ,

null);

if ( vac i a )

else

i

aux . s i g = aux;

aux. s i g = ul t i moul t i mo. s i g = aux

1

ul t i mo = aux;1

 public Obj ect qui t ari

if ( vac i 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. sig.i nf ) ;

throw new Except i on ( " Col a vací a" ) ;

1

/ / La c l ase Nodo no cambi a public class Nodo4

Page 454: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 454/482

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 ac i 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 = newI nput St r eamReader ( Syst ern . i n) ;

Buf f eredReader bf = new Buf f er edReader ( i s ) ;

cadenai = bf . eadLi ne ( );

for ( i n t i = O; i < c adenai . l engt h( ) ; it+)

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 ( )

;

!c at c h( Except i on e)

{ }

1

Page 455: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 455/482

 A  A

Palabras

reservadasJava

m 445

Page 456: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 456/482

446 Java 2. Manual  de programación

Las siguientes palabras no se pueden utilizar como identificadores:

aDs t rac t

bool eaibr eakbyt ecasecatchcharc l assconstc ont i r ue

def au- t

aoubl e

e- seex te r .ds

f al cef i nal

13

f i nal l y

f l oatf o rgot o

l f

i mpl ement si mpor ti nst anceofin:

i nt er f acel ongr.a t T,er ewn , l l

packagepr i vat epr ot ect ed

publ i c

r e turnshorts zat i c

superswi t ch

synchr oni zedt hi st h r o w

z

nr ows

t r ar.

si en tt rue

t r y

voi dvol at i i e

* . . i l e

.h '

Las siguientes palabras reservadas pueden no tener significado en algunas ver -

siones actuales, pero están reservadas para uso futuro:

byval ue

cast

C

st

future

generic

got0

inner

operator

outer

rest

var

Page 457: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 457/482

APEND ICE B

Prior idad

de operadores

447

Page 458: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 458/482

448 Java 2. Manual de programación

B.1. PRIORIDAD DE OPERACIONES

Los operadores se muestran en orden decreciente de prioridad de arriba a abajo. Los

operadores 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

Acceso 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 oKe ga c i on

1ógi ca un1ta r 1aCompl 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 oS

urna

Rest a

I z da- Dcha

I zda- DchaI zda- DchaI zda- DchaI zda- 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 zda- 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.Ja1dad_

_

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- DCha

ORi nc l Ls ; ve bi t a b i r I zda- Dcha

Page 459: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 459/482

Prioridad de operadores 449

Operador Tipo Asociatividad~

& & AND l ógi co I z da- Dcha~~~ ~~

I 1 OR l ógi co I z d a- 3c ha

? : Condi ci ona: t er nar i o 3c k a- I d a

-

-

+=-=

* =

/ =~

c -

& =

I =

<<=

>>=

>>>=

Asi gnaci ónAsi gnaci ónAsi gnaci ónAsi gnaci ónAsi gnaci ónAsi gnaci ónAs i gnac - ón

Asi 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 t

OR exc l us i ve bi t a bi tOR i nc l us i ve bi t a

bi c

de despl azami ent o

3ck a- I zdaEcha- I zdaDcha- I zdaDcna - I zda

Echa- I zdaDcna- I zdaDcha- I z s a

Dcha- : zdaCcha- I zc i o

a i zqui er da bi t a bi t Ec ha - I z a a

Despl azami ent o der echo bi t a bi t conasi gnaci ón de

ext ens i ór .

de si gnoEcha - I zda

Despl azami ent o der echob i t a bi t con

asi gnaci ón de ext ensi ón a cer o Dcha- I zda

Page 460: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 460/482

451

Page 461: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 461/482

452 Java 2. Manual de programación

Este apéndice describe las reglas básicas de sintaxis de Java que cumplen las dife-rentes versiones existentes en la fecha de publicación de este libro: J D K l .1, 1.2 y 1.3,con el compilador Java 2.0. Gran parte de la sintaxis de Java se basa en C y/o

C++.

C.1. ESTRUCTURA DE PROGRAMAS JAVA

Un programa Java consta de una colección de archivos o unidades de compilación.Cada archivo puede contener un nombre opcional de paquete, una serie de declara-

ciones i m p o r t y por último una secuencia de declaraciones de interfaces o clases.Una unidad de compilación  puede identificar sus paquetes, importar cualquier

número de otros paquetes, clases o interfaces y declarar cualquier número de clasese interfaces.

C.1.1. 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 interfaces o clases. Se puede uti-lizar un asterisco para incluir todos los elementos de un  paquete.

i mpor t nombr ePaquece . * ;

i mpor t nombr ePaquet e. Nor r Dr eC- 2se;

i mpo r t nonbr ePaque t e . Nambr e I ? t e r f a z ;

Así ,i mpor t  j ava .i o . *; indica al compilador que importe cualquier clasedel paquete j ava .i o  proporcionado por Java a medida que se necesite. Es una

 buena idea incluir esta línea al  principio de cualquier archivo  j ava que realiceoperaciones de entradaisalida. Otros ejemplos:

i mpor t j ava. ut ; l . Dat e;

i mpor t . ] ava. net . * ;  

C.1.2. Definición de clases

Una definición de una clase consta de una declaración y un cuerpo. El cuerpo con-tiene campos de datos y declaraciones de métodos. La declaración de una clase cons-

ta de palabras reservadas e identificadores: una secuencia opcional (en el modelosintáctico para indicar que es opcional se encierra entre [ ] ) de modificadores, la

 palabra reservada cl ass, el nombre de la clase, un nombre opcional de la clase padre, una secuencia opcional de interfaces y el cuerpo de la clase con sus miembros.

Page 462: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 462/482

Guía de sintaxis 453

[modificadoresDeClase] class Nombre [extendsPadre]

[implements Interfa zI[, Interfaz2

[,

... I : ]

{

I

/ / c u e r p o de l a cl ase ( mi embr os)

Losmodi f

i cador esDeCl ase  pueden ser: abst r act , f i n a l , publ i c.Una clase abstracta es aquella que tiene uno o más métodos abstractos y de la

que el programador no piensa instanciar objetos. Su fin es servir como supercla-

se de la que otras puedan heredar. Las clases que heredan de una clase abstractadeben implementar los métodos abstractos de su superclase o seguirán siendo abs-

tractas. Una clase f i n a l no puede ser superclase y todos sus métodos son implí-

citamente f i n a l . Una clase pública debe estar en su propio archivo, denominado Nombre.

j

ava. Los miembros de una clase pueden ser métodos y variables de ins-tancia (pertenecientes a un tipo base o una clase).

/ / For mato más si mpl e de una def i ni ci ón de cl asecl as sl aseüno

I

}

I/

Cl aseüno

/ / campos de dat os y decl araci ones de mét odos

/ / Una cl ase que ext i ende ot r a cl asepubl i ccl assl aseDos extends Ot r ac l ase

I

/ / campos de dat os y decl araci ones de mét odos} / /

l aseDos

/ / Cl ase compl ej apubl i c abs t r ac tcl as si obj et o ext ends t r ac l as e

i ni pl ament s

nt er f azUno, I nt er f azDos

t

} / / Mi Obj et o/ / campos de dat os y decl araci ones de mét odos

Ejemplos

1.public

classPr i mer pr ogr ama

publ i cs t at i cvoid mai n ( St r i ng[ ] args)I

1

Sys t em out . pr i nt l n( " Si er r aMagi na- Car c hel ej o" ) ;

Page 463: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 463/482

454 Java 2. Manual  de programación

2.  public abstract class 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 tipo y su identificador. El tipo puede seruno de los tipos primitivos o puede ser una clase. Las declaraciones de las variableslocales y campos de datos pueden incluir la asignación de un valor inicial. Los argu-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 e

es de t i po char/ / y de val or i ni ci al ' M'

S t r i r , g sal udo ="H ol aMackoy" ; / /

sal udo es de t i po St r i ng/ / y de val or i ni c i al

"H ol aMackoy"

 boolean i nt er r upt or = false; / / i nt er r upt or es de t i po bool ean/ / y val or i ni ci al f al se

Una declaración de variables de instancia o campos de datos tiene una partede modificador opcional, un tipo, un nombre de variable y una inicializaciónopcional.

[ modi f i c ador esDeVar i abl e]

t i po nombr e [ = 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 .  public class

 protected protected

 protected

/ / . . .

i

Fi gur a

Rect angul o pos i t i on;double dx, dy;Col or col or ;

Page 464: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 464/482

Guía de sintaxis 455

2. c l a s s Empl eado ext endsPer sonai

 protected St r i ng nombr e = ;

pr ot ect edi nt edad;pr ot ect ed

mpi 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 a los

campos de datos. A los campos de datos que no se les proporciona un valor inicialexplícito se les asigna un 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 reservadas f i n a l y s t a t i c y se les asigna un

valor en la declaración. Este valor ya no se podw modificar.

Ejemplo

c l a s s Empl eado ext endsPer sonat

publ i cs t at i cf i nalcant 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-tipo)expresibn

C.1.8. Creación de objetos

Una instanciación (creación) de objetos crea una instancia de una clase y declarauna variable de ese tipo. Los objetos se crean a partir de una clase utilizando el ope-rador new. La sintaxis adecuada es:

Page 465: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 465/482

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 nombre nombr 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ón de

memoria donde se encuentra dicho objeto.

C.1.9. Declaración de métodos

Las declaraciones de métodos simples, denominadas también s 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 declaraciones detipo (sin valores iniciales) separados por comas. La lista de argumentos puede estarvacía. Los métodos pueden también tener una visibilidad explícita.

[modi fadoresDeMe todos] t poDeResu1tado no todo

[

ipoparámetrol parámetrol

[,tipoParámetroZ parámetroZ[, ...]])

[throws ExcepciÓn[

, Excepcin2

[,.. .I I It

/ / cuer po del métodoi

Los modi 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 ,stat i c, synchr oni zed. Como t i poDeResul t ado se espe-

cificará voi d cuando el método no devuelva resultados. En la implementación delmétodo, cuando éste no haya sido declarado voi d, se utilizará la instrucciónreturn  para devolver un valor al punto de llamada del método. Es decir, en cuan-

to que se ejecuta r et ur n, el método termina devolviendo un Único valor comoresultado. Para devolver múltiples valores mediante una función en Java deben com-

 binarse todos los ellos en un objeto y devolver la referencia al objeto. A continua-ción del nombre del método y entre paréntesis se especificará la lista de parámetros,que constará de cero o más parámetros formales cada uno de ellos precedido por sutipo y separados por comas.

Page 466: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 466/482

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 reservada t 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 assEj 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 c al c ul 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) [

entero * /

/ / 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

protected 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 odo

1 / / 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 odoi

c 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 los appkts) debe tener un método mai n que es dondecomienza la ejecución de la misma. Es decir, para ejecutar un programa el intérpretede Java comienza llamando al método m a i n (

) . Este método se llama antes de la

Page 467: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 467/482

458 Java 2. Manual  de programación

creación de un objeto y ha de declararse como st at i c  para que se pueda llamarsin tener que referirse a una instancia particular de la clase. Como además es Ila-

mado  por código fuera de su clase, también tiene que ser declarado como pub1

i c ,que es la forma de permitir que un miembro de una clase pueda ser utilizado porcódigo que está fuera de la misma. La palabra reservada v o i d indica que mai n nodevuelve nada.

 public s t a t i c void ma;?. ( St r i ngI args )

St r i ng [ ] args es la declaración de un array de St r i ng, mediante el cualla clase podría tomar un número variable de parámetros en la línea de órdenes;

aunque no se use, es necesario incluir este parámetro cuando se define el métodomai n().

C.1.12. Extensión de clases

[acceso] [final: class Nombreclase extendsSuperclase

// cLer po de

l a cl ase ampl i aaa

Constructor de la subclase

2Tbr eCl ase

( a r q l l , . .)

. . .;

publ i c

i

super

. . .1

C.1 .I

3. Constructores

La sintaxis de un constructor es similar a la de un método, sin t i poDeResu l t ado

y cuyo nombre debe coincidir con el de la clase. El constructor se invoca automáti-camente cuando se crea una instancia de la clase.

~nodiiieacore~DeCons~rtictor] nombreConstructor

( [tipoParánetrol

 parámetrol[,ipoParámetro2

parámetro2

[, . .I 1 1 )

/ / cuer po ael constructor1

Page 468: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 468/482

de sintaxis 459

Los modi f i cador esDeConst r uc t o r

siguen las mismas reglas que en los

Un constructor debe ser invocado con el operador new.

Una clase puede tener múltiples métodos constructores, siempre que éstos sediferencien unos de otros en el número y/o tipo de parámetros.

métodos normales, pero un constructor abstracto estático final no está permitido.

c la s s Per sona

pr ot ect edt r i r g nombr e =;

pr ot ect edi nt edad = O;publ i cPer sona ( St r i ng nom, i nt años)t

nombr e = nom;

edad=

años;publ i cs t at i cvoi dmai n ( St r i ng ar gs [ 3 )

Per sona p = new Per sona ( " L ui s i t o Mackoy" , 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

El cuerpode un constructor comienza con una llamada heredada al constructor dela superclase de la clase. Esta llamada debe ser la primera sentencia del cuerpo deun constructor y no  puede aparecer en ningún otro lugar. En Java super ( . . .es usado en vez del nombre del constructor de la superclase. Si no se usa superentonces se supone implícitamente que el cuerpo del constructor comienza con lallamada super

(

) sin parámetros. El resto del cuerpo es como un método normal.

c la s s Empl eado ext endsPer sona

pr ot ect edSt r i ng cat egor i a = ' I ;

pr ot ect edi nt sal ar i o = O;

publ i cEmpl eado ( St r i ng nom, i ntaños, Ct r i z g

n:vel, i n t suel do)

super( nom, años) ;cat egor i a = ni vel ;

sal ar i o = suel do;

publ i cs t at i cvoi dmai n ( St r i nq args [ ]

Page 469: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 469/482

460 Java 2. Manual de programación

Empl eado e = new Empi eado ( " Ar z ur i t o Mackoy" , 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:

te. 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 N terfaz

t

 public abstract tipoDeResu1 tado nombreMétodo );

/ / ot r as decl ar aci ones de mét odos vaci os.

Se ha de tener en cuenta que:Todos los miembros de una interfaz son públicos automáticamente.

Todos los métodos son abstractos automáticamente.Todos los campos deben ser declarados st at i c y f i n a l .

La clase que implementa la interfaz debe implementar todos los métodos decla-rados en ella.

 public class Irnplementa

[extends Padr e] implements Nombr eI nt er f az

 publict i poDeResEl t ado nombr eKét odo0

t

/ / .. .

//se 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.

[modificadoresDeClase] class Nombre [extends Padre]

[implements Interface]

i Interface2 [ ... 1 1 1

/ / I mpl ement aci ón de t odos l os mét odos de l as di st i nt as i nt er f aces

Page 470: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 470/482

Guía de sintaxis 461

Es posible definir clases que tengan objetos del tipo Nombr eI nt er f az, comosi la interfaz fiera una clase, pudiendo así usarse en ellas, las diversas implementa-ciones de ésta. La clase E j empl o puede usar, entre otras que hubiera definidas, la

que ofrece la clase I mpl ement a.

 public class Ejemplo

{

 public Ejemplo

(

1

 public tipoDeResultado unMetodo (NombreInterfaz elemento)

{

//.. .

/ / .. .

C.l I 6. Clases anónimas

Una clase anónima es aquella que no tiene nombre y, 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 clase I mpl ementa que implementaNombr e I nt er f az, a siguiente instrucción

e. unMet odo

( ne w I mpl ement a ( )

;

 pasa a e. unMet odo

una nueva instancia de dicha clase I mpl ement a como pará-metro. Si se quisiera emplear una clase anónima no se efectuaría la declaración dei mpl ement a y la instrucción anterior se sustituiría por:

e. unMét odo

( ne wNombr eI nt er f az ( )

I

 publict 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 er f az * /

1

) ;

Page 471: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 471/482

462 Java 2. Manual  de programación

C.2. SENTENCIAS

C.2.1. Sentencias de declaracióntipo n ombre Var ab1e;

Ejemplos

int l ongi t ud;double e;Ci r cul o ci r cul o;

C.2.2. Sentencias de asignación

Una sentencia se asignación asigna el valor de la expresión en el lado derecho a lavariable del lado izquierdo.

nombre = expresiónlegal;

Ejemplos

l ongi t ud = 5 + I ;

i += 5;

C.2.3. Sentencias return

Las sentencias return  proporcionan una salida de un método con un valor deretorno no v o i d . Las sentencias de retorno pueden no aparecer en un método conun tipo de retorno void. Las sentencias return  pueden aparecer en cualquier

 parte de una estructura de control; producen un retorno inmediato del método. Elvalor de la expresión a continuación del retorno debe coincidir con el tipo de retor -no del método.

Ejemplo

 public int calcularResta(int x, int y) {

I

return x- y ;

Page 472: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 472/482

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

i

i 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 sobre dos alternativas basadas enel valor lógico de una expresión.

i f (expresiónlógica)

bl o tenciasl

/ / s i son var i as sent enci as se enci er r an ent r e { }

b tencias21

[else i f (expresiónlógica)

[elsebl o tenciashr]

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 sentencia swi t ch es la bifurcación múltiple.

switch (expresion-int)

f

Page 473: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 473/482

464 Java 2. Manual de programación

case constante-expl:

sentenciasl;

ent r e l l aves * /

[ br eak;

senncias2;

[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

[ casecons tane-exp2:

[caseonstante-expN:

senteni

aN;

[break;]

senenciasX;

[break;

[default

Ejemplos

1. switch ( y / 50){

case2: el emento = new Demo2( O, O) ; br eak;case3: el emento = new Demo3( 0, O, 100) ; br eak;case4: el emento = new Demo4( 0,

O, 200) ; br eak;case5: el emento = new Demo5( O,

O) ; br eak;

1

2. swi t ch n)

case1:case2:

i

vi sual i z ar Resul t ado

br eak;case3:case4:

case5:case6:

vi sual i z ar Resul t ado

vi sual i z ar Resul t ado

br eak;def aul t :

vi sual i z ar Resul t ado

} / / f i n de swi t ch

C.2.7. EtiquetasnombreE

tiqueta:

break[nombreEtiquetal

;

continuenombreEtiqueta];

" 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" ) ;

Page 474: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 474/482

Guía de sintaxis 465

s a l i r :i

for( i

= O; i<

10;i ++)

{

for ( j = O;  j < 20; j ++)

I

if ( 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 sentencia whi l e se utiliza para crear repeticiones de sentencias en el flujo del programa.

while (expresiónlógica)bl

oqueSentencias

/ / e l bl oquesent enci as puede ej ecut arse 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. Sentencia do-while

La sentencia do- whi l e se utiliza para repetir la ejecución de sentencias y 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

Page 475: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 475/482

466 Java 2. Manual de programación

Ejemplo

do

S y s t e m . o u t . p r i n t ( c ue n ta + ' I ,

' I ) ;

c u e n t a + + ;

I

while ( c u e n t a <= numero)

C.2.1O. Sentencia f o r

La sentencia f o r se usa para repetir un número fijo de veces la ejecución de unaserie de sentencias.

f o r(

[ i n i c i a c i ó n ]; [ c o n d i c i ó n D e T e s t ]; [ a c t u a l i z a c i ó n ]

s e n t e n c i a s

Ejemplo

f o r ( i n t i = O ; i < 1 0 ; i t + )

a [ i ] = 5 * i;

C.2.11. Método e x i t y sentencia break

La sentencia b r e a k se puede utilizar en una sentencia sw i t ch o en cualquier tipode sentencia de bucles. Cuando se ejecuta b r e a k el bucle que lo contiene o la sen-tencia swi t ch terminan y el resto del cuerpo del bucle no se ejecuta. Una invoca-ción al método e x i t termina una aplicación. El formato normal de una invocación

al método e x i t es

S y s t e m . e x i t ( O ) ;

La captura de excepciones se realiza mediante bloques t r y - c a t c h .La/s senten-

ciais de un bloque se colocarán siempre entre llaves.try

b l o q u e A I n t e n t a r / / aunque sea u n a ú n i c a s e n t e n c i a és ta i r á e n t r e { }

boqueCen t e n c ia s1

catch ( t i p o E x c e p c i o n 1 i d e n t i f i c a d o r l )

Page 476: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 476/482

Guía de sintaxis 467

[catch ( t i poEx cepc i on2 i dent i f i c adoz - 2)

boqueSen t encias 2 ]

. . .[f i na l l y

boqueSen

tenci ashr ]

o bi en

t r y

f i na l l y

bl oqueAi ntentar

boquesen t nc i asN

yaque el bl oquet r y nopuedeaparecersól o.

i mpor tava. i o. * ;

publ i cclass Ret ur nTr yEj

{

publ i cs t at i ci nteer ( )

i

I 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 eredReader ( i s r )

;

St r i ng cadena = ' I ;

t r y

{

cadena = br . eadLi ne

( );

r et ur nI nt eger. par s eI nt

( cadena);1

catch( Except i on e){

i f ( e i ns t anceofI OExcept i on)

el sei f ( e i ns t anceofNumber 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" ) ;r et ur nO;

publ i cs t at i cvoi dmai n ( St r i ng ar gs [ )

t

i nt n;do

{

Page 477: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 477/482

468 Java 2.Manual  de programación

Sys t em out . pr i nt ( "Deme un númer o ent er o ent r e 1 y 20 ' I ) ;

n = l eer( );

1

whi l e ( 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 sentencia t hr owlanza una excepción, que puede ser una excepción recibidao bien una nueva excepción. Una cláusula catch puede recibir una excepción y, en

lugar de tratarla o después de hacerlo, volver a lanzarla mediante una instrucciónt hr ow.

t r y

bloqueAIntentar

catch(N tExcep tion iden tificador)

{

//. ..throw (identificador) ;

1

Para lanzar una nueva excepción, se crea un objeto de una subclase deExcept i on que implemente un constructor y se lanza con t hr owcuando ocurrael hecho que debe provocar la excepción:

if (expresiónlógica)

throw new ConstuctorSublclaseException [parámetroi [, parámetro2

[, ... I l l ) ;

Ejemplo

if ( edad< 18 I I edad > 65)

t hrow new Fuer aDeRango ( "Excepci ón: val or f uer a de r ango" ) ;

c l as sFuer aDeRango ext endsExcept i on{

St r i ng mensaj e;

publ i cFueraDeRango ( St r i ng causa)i

mensaj e = causa;

Page 478: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 478/482

Guía de sintaxis 469

p u b l i c St r i ng get Mess age ( )

i

1

re turn mensaj e;

C.2.14. Sentencia throws

Lista las excepciones no tratadas y  pertenecientes a clases distintas deRunt i meExcept i on. Así, su tratamiento será pospuesto y deberá ser efectuado

 por el método llamador o tendrán que volver a ser listadas en la cabecera de éste con

otra cláusula t hr ows.[ nod i f i

cadoresDeMé todos] t i poDeResul t ado nombr eMét odo

(

[ipoparáme trol paráme trol

[,tipoParárnetro2 parárnetro2[, .. .I, ])

[throwsExcepción1[

Excepción2 [ ... I I I

/ / cuerpo del mét odo que no t r at a l a excepci ón

C.2.15. Sentencia package

Cada clase pública definida en Java debe ser almacenada en un archivo separadoy si hay varias relacionadas todas ellas se almacenan en el mismo subdirectorio.Un conjunto de clases relacionadas definidas en un subdirectorio común puedeconstituir un paquete Java. Los archivos del paquete deben comenzar con lasiguiente sentencia:

 package nombrepaquete;

donde el nombre del paquete refleja el subdirectorio que contiene dichas clases. Seutiliza 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;

Page 479: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 479/482

470 Java 2. Manual de programación

Se puede usar una clase definida en otro paquete especificando, para referirsea ella, la estructura de directorios del otro paquete seguida por el nombre de laclase que se desea usar y empleando el carácter punto como separador.Referenciar clases de esta forma puede resultar molesto y la solución consiste en

utilizar i m p o r t , que permite incluir clases externas o  paquetes enteros en elarchivo actual.

c.3. MISCELÁNEA

C.3.1. Referencia a miembros de una claser:a

et o. ?

omOreComponen

te

Si es st at i c no es necesario referirse a una instancia en particular de la clasey  puede referenciarse como

nombreClase. nombreComponente

Los miembros de una clase están asociados con una instancia específica de lamisma, 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 realizadosen Java, con respecto a tipos numéricos y con respecto a objetos. El formato a apli-

car para efectuar una conversión explícita de tipos es:

(tjpoA'ombre) 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 = (double)4/(double)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 ado

doubler es i i l t aao

=4 / 5 ; / *conver s i ón i mpl í c i t a, as i gna 0. 0 al

r esul t ado * /

A 1 c m r . o unAl umno

=

( Al uy no)KnaPer sona;

Page 480: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 480/482

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. Losarrays 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 loa:

double[]j ar r Codbl e; / / ar r ay bi di mensi onal para al macenar datos cioLble

int a[]I ;

/ /ar ray bi di mens- ona- capaz de al r r acenar enteros

C.4.2. Creación de un array

arrEnt = newint[100];

/ *necesar i a su pr evi a dec1araz: ón:

i nt ar r Ent [ ] ; * /

Es  posible crear arrays en los que cada fila contiene un número diferente decolumnas:

a = newint[3]

I ; / / asi gna f i l a s ( supuest a l a pr evi a aec l ar ac i ón)

a [ O ] = newint[7];

/ / as i gna 7 col umnas a l a f ; i a Oa [ i ] = new

int[5];

/ / as i gna 5 col umnas a l a f i l a 1

a [ 2 ]

= newint[9];

/ / as i gna 9 col umnas a l a f i l a 2

C.4.3. Combinar declaración y creación

La declaración y la creación se pueden combinar.

int[] arrEnt = newintiloo];

double[]I a r r Do ubl e =

newdoubie[8j l o ] ;

Pel ot a [ ] ar r ay Pel ot as = newPel ot a; l C] ;

C.4.4. Com binar declaración creación e inicialización

int[] arrEnt = 119, 2, 3, 5, 7, 6, 8, 15, 9, 1 2 ) ;

Page 481: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 481/482

Page 482: Java 2 Manual de Programaci

7/23/2019 Java 2 Manual de Programaci

http://slidepdf.com/reader/full/java-2-manual-de-programaci 482/482