You are on page 1of 159
2X_IAVA2: MANUAL DE USUARIO Y TUTORIAL onan Aiflogo en un entomo grafico, pero... la inteligencia de esa pieza siempre de , ia de esa pieza siempre dependert de la habilidad y experiencia del programador respecto del Ienguaje usado y de sus recursos. En fin, un buen applet © una buena aplicacion seré nicamente resultado del trabajo de un buen programador Java. CAPITULO 1 INTRODUCCION A JAVA El uso principal que se hace de Intemet e incluso de las redes internas (corporativas) es el del creo electronico (e-mail) y la navegacin Web, aunque cada ‘vex hay més aplicaciones web corporativas que utilizan Intemet como base de ‘comunicaciGn y transmisién de datos. Los documentos Web pueden contener variedad de texto y grificos de todas clases, asi como proporcionar enlaces hipertexto hacia cualquier lugar de la red. Los navegadares utlizan documentos eseritos en lenguaje HTML. La combinacién actual de navegadores HTML/WWW esti limitada, pues, texto y gris. Si se quiere reproducir un sonido o ejecutar un programa de demostravin, primero hay que descargar (download) el fichero en cuestion y luego tutlizar un programa en el ordenador propio capaz de entender el formato de ese fichero, o bien carga un médulo (plug-in) en el navegador para que pueda interpretar el fchero que se ha descargado. Hasta hace bien poco, la nica forma de realizar una pigina Web con contenido interactivo era mediaate la interfaz. CGI (Common Gateway Imerface), que permite pasar parimetros entre formularios definidos en lenguaje HTML y programas escritos fn Perl o en C. Esta interfaz resulta muy incémoda de programar y es pobre en sus posibildades. Actualmente esti en auge el uso de plugins Flash que permiten incorporar contenido dindmico e interactivo a las piginas web. Sin embargo, Flash no cs exactamente un lenguaje de programacién y el contenido a presentar depende en gran medida de la herramienta utiizada en el desarollo. El lenguaje Java y los navegadores con soporte Java proporcionan una forma diferente de hacer que ese navegador sea eapaz de ejecutar programas. Con Java se puede reproducir sonido directamente desde el navegador, se pueden visitar home ‘pages con animaciones, se puede ensefar al navegador a manejar nuevos formatos de 2 JAVA: MANUAL DE USUARIO Y TUTORIAL oman ficheros,e incluso (a pesar de la mala calidad) se puede transmitir video por la lineas telefonicas, el navegador esté preparado para mostrar esas imagenes. Uilizando Java se pueden eliminar los inconvenientes de la interfaz CGI o las limitaciones de los plug-ins Flas, asi como afta aplicaciones que vayan desde ‘experiment cientificos interactvos de propésito educativo a juegos o aplicaciones cespecializadas para le eleventa. Es posible implementar publicidad interactiva y peviicos personaizados. Pr ejemplo, alguien podria eseribir un programa Java que implementara una simulacion quimica intractva —una cadena de ADN— Utiizando un navegador con soporte Java, un usuario podria recibir fcilmente esa simulacin e interaccionar con ella en lugar de conseguir simplemente un dijo esti y algo de texto. Lo reibid cobra vida. Ademés, con Java el usuario puede «star seguro de que el cigo que hace funciona el experimento quimico no conticne ningin troz0 de e6digo malicioso que dai al sistema. El eédigo que intenteactuar desirctvamente 0 que contenga erores no pode traspasar los muros defensivos colocados por las cracterstias de Seguridad y robustez de Java Java rooting un nueva foma de aseder alas picaciones El software visa mignon a de he No yrs det acs, Clima veten cnn se neces, Por cpl, a mayor de los nveqadrs Web pn psu eco nmr de mai pes mere PNG'y PEG). Sse enaenran con oo tp de omit, el mavegadr estar 0 tee cpa par proces, ta quer acai pan pode poeta las vets dl novo format, Sin entry un navegador con soporte Jave puede ena cone serior qu content qe proce ee ue foro y anager Por an, algucn vent uevo agora de cepresin fringing yw ops ei Jor deca guia inaladn ene ervidr gus cones iagenss qu qe pic, Es decir le avegadre con soporte vase chain times ste a Ia cundoecentan un ue tio de chee o gor, En esta filosofia es en la que se basan los NC (Network Computer), que son ondenadores sin disco y con mucha memoria. Sus programas residen en un servidor que los envia cuando se los solicta. Es quiz un guifo al pasado y una versién futurista de lo que ha sido un Terminal-X en otros tiempos, salvando las diferencias, evidentemente (no sea que alguien tilde al autor de irreverente con las nuevas, tecnologia). Java fue el primer lenguaje con la virtud de ser compilad e interpretado de forma simultinea. Cuando un programador realiza una aplicacién © un applet en Java y lo ‘compila, en realidad, ef compitador no trabaja como un compilador de un Fenguaje al ‘uso. El compilador Java inicamente genera el denominado ByteCode. Este coigo es ‘un céigo intermedio entre el lenguaje maquina del procesador y Java, Evidentemente «ste c6igo noes ejecutable por si mismo en ninguna plataforma hardware, pues no se corresponde con el lenguaje de ninguno de los procesadores que actualmente se emma [CAPITULO L-INTRODUCCION JAVA. ‘conocen (habri que esperar a ver qué ocurte con los provesadores Java si alguna vez Salen al mundo comercial), Por lo tanto, para ejecutar una aplicacién Java es necesario disponee de un mecanismo que permita ejecutar el ByteCode. Este mecanismo es la ddenominada Miquina Virtual Java (JVM). En cada plataforma (Solaris, Linx, ‘Windows 95/98/NT/2000/XP/Vista, HP-UX, MacOS, etc. existe una Maquina Virtual specifica, Asi que cuando el ByteCode Hega a la maquina virtual, sta lo interpreta pasindolo a cédigo maquina del procesador donde se esté trabajando, asi como «jeoutando las instrucciones en lenguaje maquina que se deriven dela aplicaciOn Java De este modo, cuando el mismo ByteCode llega a diferentes plataformas, éste se cjecutard de forma correcta, pues en cada una de esas plataformas existird la maquina ‘virtual adecuada, Con este mecanismo se consigue la famosa multiplataforma de Java, ‘en la que con slo codificar una vez, podemos ejecutar en varias plataformas En realidad la Maquina Virtual ava (SVM) desempeta otras funciones, como la Ge asla los programas Java al entomo de la JVM, consiguiendo una gran seguridad SSin embargo, como podri estar deduciendo el lector, esto tiene algunas desventajas, y la mis clara es la velocidad de ejecucidn, Puesto que la JVM debe estar interpretando constantemente el ByteCode, se consume demasiado tiempo de procesador en realizar esta interpretacion, que por otra parte no aporta nada a la aplicacién, obteniendo asi un bajo rendimiento. Para solucionarlo se han adoptado solucionesintermedias. Una de las més itiles son los compiladores IT (Just-fn-Tine). Estos compiladoresestin situados a a entrada de la JVM, de forma que seg llega el [ByteCode To van compilando al enguaje maquina del procesador. A diferencia de la intepretacién, el compilador no ejecuta el ByteCode, inicamente lo traduce y lo almacena en eédigo nativo dentro de Ia JVM. Asi, uns vez que la aplicacin esté dentro de la JVM, ya se encuentra en lenguaje migquina y, por To tanto, seré irectamente ejecutable, sin necesidad de interpretaciones, consiguiendo dotar de mayores rendimientosa la apicacin, Muy breve y de forma muy genérica, éte es el funcionamiento bisico de Java Todas las mejora al lenguaje se centran basicamente en conseguit mejores tempos de jecucidn y dotar de mayores prestaciones a la Maquina Virtual Java. ORIGEN DE JAVA ‘Sum Microsystems, lider en servidores para Internet, uno de cuyos lemas desde hace mucho tiempo ha sido “the network is the computer” (lo que quiere dar a entender que el verdadero ordenador es fa red en su conjunto y no cada méiquina individual), es quien ha inventado el lenguaje Java, en un intento de resolver simultineamente todos los problemas que se planteaban a los desarrolladores de software por la prliferacién de arqutecturas incompatibles, tanto entre las diferentes ‘maquinas como entre los diversos sistemas operativos y sistemas de ventanas que funcionan sobre una misma méquina, afiadiendo la dificutad de crear aplicaciones distribuidas en una red como Internet. 424A? MANUAL DE USUARIO Y TUTORIAL cum El autor ha podido leer en su dia mas de cinco versiones dstntas sobre el origen, cconcepcién y desarollo de Java, desde la que dice que éte fue un proyecto que rebots durante mucho tiempo por distintos departamentos de Sun sin que nadie le prestara ‘ninguna atencién, hasta que finalmente encontts su nicho de mercado en la aldea slobal que es Intemet; hasta la mis difundida, que justifca a Java como lenguaje de pequeios electrodomésticos. Hace bastantesafios Sun Microsystems decid intentarintroducirse en el mercado de la clectrénica de consumo y desarollar programas para pequefos dispositivos clectrénicos, Tras unos comienzos dudosos, Sun decidié crear una filial, denominada FirstPersom Inc. para dar margen de maniobra al equipo responsable del proyecto, El mercado inicialmente previsto para los programas de FirstPerson eran los fequipos domésticas: microondas, tostadoras y, fundamentalmente, televisién interactiva. Este mercado, dada la falta de soisticacién de los usuarios, requeria unas interfaces mucho més cémodas intuitvas que los sistemas de” ventanas que proliferaban en el momento Otros requisits importantes eran la fiablidad del cédigo y ta facilidad de desarrollo, James Gosling, ef miembro del equipo con mis experiencia en lenguajes de Programacién, deidi6 que las ventajas de eficencia de C+ (el lenguaje mis usado en aque! momento) no compensaban el gran coste de pruebas y depuracin. Gosling habia estado trabajando en su tempo libre en un lenguaje de programacién que él habia llamado Oat, sein parece el nombre se debe al roble que se veia por la ventana de su casa (joriginalidad ante todo!) el cual, aun pariendo de la sintaxis de C++, imtentaba remedlar las deficiencias que habia observado {Los lenguajes al uso en aquellos dias, como Co C++, debian ser compilados para lun chip concreto, y si se eambiaba el chip, todo el software debia compilarse de evo. Esto encarecia mucho los desarollos y el problema era especialmente acusado en el campo de ls eletrnica de consumo. La aparicién de un chip mas barao y, szeneralmente, mis eficiente, conduce inmediatamente a ls fabricantes'incluitlo on las nuevas series de sus cadenas de produccién, por pequetia que sea la diferencia en Precio, ya que, multiplicada por la tirada masiva de los aparatos, supone un ahora ‘considerable, Po tanto, Gosling decidié mejorar las caractersticas de Oak y utilizar, El primer proyecto en que se aplicé este lenguaje recibié el nombre de proyecto Green y consstia en un sistema de control completo de ls aparatos electrnicos y el «entoro de un hogar. Para ello se construyé un ordenador experimental denominado *7 (Star Seven). sistema presentaba una interfaz basada en la repesentacion de la casa de forma animada y el control se levaba a cabo mediante una pantalla sensible al {acto. En el sistema aparecia Duke, la actual mascota de Java, Posteriormente se aplic '8 otro proyecto denominado VOD (Video On Demand) en el que se empleaba como interfaz para la televisininterativa. Ninguno de ests proyectos se convirtié nunca en un sistema comercial, pero fueron desarollados enteramente en un Java primitivo y fueron como su bautismo de fuego. oma {CAPITULO eINTRODUCCIONAIAVA 5 ‘Una vez que en Sun se dieron cuenta de que a corto plazo la television interactiva no iba a ser un gran éxito, urgieron a FirsiPerson a desarrollar con rapidez nuevas ‘estrategias que produjeran beneficios. No lo consiguieron y FirstPerson cer en la primavera de 1994, Pese a lo que parecia ya un olvido defintivo, Bill Joy, cofundador de Sun y uno de los desarrolladores principales del Unix de Berkeley, juzg6 que Internet podria Hegar a ser el campo de juego adecuado para disputar a Microsoft su primacia casi absoluta en el terreno del software, y vio en Oak el instrumento idéneo para llevar cabo estos planes. Tras un cambio de nombre y algunos de dseo, el Lenguaje Java fue presentado en sociedad en agosto de 1995. Sun Microsystems creé entonces la unidad de negocio JavaSoft, dedicada exclusivamente a todo lo referente a lava, Actualmente, esta unidad ha sido absorbida por la propia Sin NNo obstante, lo mejor seri hacer caso omiso de las historias que pretenden dar ‘arta de naturaleza la claividencia industrial de sus protagonists, porque la cuestion ssi independientemente de su origen y entorno comercial, Java offece soluciones a las expectativas del lector. Porque tampoco es cuestion de desechar la penicilina aunque su origen haya sido fruto de lacasualidad. CAPITULO 2 CARACTERISTICAS DE JAVA Java, al igual que cualquier otro lenguaje de programacién, dispone de sus propias| paricularidades, que representarin una ventaja 0 una desventaja dependiendo de la Aplicacién que se vaya a realizar, Por ello este capitulo esté dedicado a presenta las rincipales caracterstcas propias de Java y proporcionar una visién desde Ia perspectiva de desarollador sobre las expectativas que se colocan sobre Java, CARACTERISTICAS PRINCIPALES DE JAVA de programaci cultivo, se podrian resumir en las siguientes: Simple Java oftece toda la funcionalidad de un lenguaje potente, pero sin Tas caractristicas menos usadas y mas confusas de éstos. C++ no es un lenguaje conveniente por razones de seguridad, pero C y C+ eran los lenguajes mis difundidos en el nacimiento de Java, por ello Java se diseio para ser parecido a C++ ¥ asi faciitar un rid y fil aprendizaje. Java elimina muchas de las caracteristicas de otros lenguajes como C++, para mantener reducidas las especificaciones del lenguaje y atadir caracteristicas: muy itiles como el garbage collector (reciclador de memoria dindmica). No es necesario preocuparse de liberar memoria, el reiclador se encarga de ello y como es de baja prioridad, cuando entra en accion, permite liberar bloques de memoria muy grandes, to ‘que limita mucho la fragmentacién de la memoria, jo JAVA2:MANUAL DE USUARIO Y TUTORIAL, oman descompilable todo el cédigo, aunque asi se pierda portabilidad. También se puede recurriral uso de ofiuscadores de cddigo. Portable Mas alla de la portabilidad bisica por ser de arquitectura independiente, Java implementa otros estindares de portabilidad para facilitar el desarollo. Los enteros son siempre enteros y, ademas, enteros de 32 bits en complement a 2. Ademés, Java construye sus interfaces de usuario a través de un sistema abstracto de ventanas de fouma que éstas puedan ser implantadas en entornos Unix, Pe o Mac. Interpretado EL intérprete Java (sistema run-time) puede ejecutar direcamente el eédigo objeto, Enlazar (lintar) un programa normalmente consume menos recursos que compilarlo, por lo que los desarolladores Java pasarin mis tiempo desarrollando y ‘menos esperando por el ordenador. No obstante, el compilador actual del IDK es bastante lento, Por abora, en que todavia no hay compiladores especificos de Java para las diversas plataformas, Java es mis lento que otros lenguajes de programacién ya {que debe ser interpretado y no ejecutado como sucede en cualquier programa tradicional, No obstante, aunque Java sigue siendo bésicamente un lenguaje interpretado la situacin se acerca mucho a la de los programas compilados, sobre todo en lo que a la rapidezen la ejecucion del cédigo se refiere. Multitarea ‘AL ser Multtarea_o Multihilo (0 multiilvanado, mala traduccion de ‘multithreaded, Java permite realizar muchas actividades simultneas en un programa. El téamino multithreaded es de dificil traduccién, aunque actualmente parece ser que la palabra mulitarea para expeesar lo mismo es la que esti ms comminmente aceptada. Las tareas —a veces Ilamadas, procesos ligeros, 0 hilos de ejecucion— son hhisicamente pequetios procesos o piezas independientes de un gran proceso. Al estar estas tareas construidas en el mismo lenguaje, son muy files de usar. El beneficio de ser multitarea consiste en un mejor rendimiento interactivo y ‘mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real esti limitado a las eapacidades del sistema operativo subyacente (Unix, Windows, ete.) de Ja plataforma, ain supera alos entornos de flujo tnico de programa (single-threaded) tanto en faciidad de desarrollo como en rendimiento, imico Java se beneficia todo lo posible de la teonologia orientada a objetos y no intenta ‘conectar todos los médulos que comprenden una apicacion hasta el mismo tiempo de eran ___eniruno2.caracrerisicas De JAVA Ut ejecucién. Las librerias nuevas o actualizadas no paralizarin Ia ejecucién de las aplicaciones actuales siempre que mantengan el API anterior. Difundido Java, en la actualdad, ya noes un lenguaje ecién nacido que solamente se conoce en unos cuantos centros de investigacién, Java se ha convertido en el lenguaje mis ifundido ‘en este momento. Es el lenguaje que cuenta con una legion de programadores mis numerosa. Esta circunstancia, independientemente de las caracteristicas intrnsecas al propio lenguaje, hace que sea muy ficil encontrar documentacién, cédigo de ejemplo y muchos otros recursos referentes al lenguaje en Internet, en revises especializadas, en multtud de libros y, en resumen, en cualquier tipo de lugar 0 foro de desarrolladores. Ademis, Java es un lenguaje que se utiliza tanto para grandes aplicaciones empresariales, televisiOn intractiva, juegos para teléfonos méviles y, en realidad, para cualquier tipo de programa. Esto proporciona ‘una versatilidad al lenguaje que hace que se convierta en la mejor de sus caracteristcas, JAVA COMMUNITY PROCESS: Aunque Sun Microsystems es la méxima autoridad y tiene la iltima palabra en todo lo que se relieve a la plataforma Java, gran parte de las especificaciones y cextensiones que se ineorporan ala plataforma Java se realizan bajo el Java Community Process (JCP). Este programa permite que tanto as grandes corporaciones como las ‘empresas pequetas ¢ incluso personas individuales sean partcipes y tengan decision en Ia definicién y revision de las diferentes partes de la plataforma Java y puedan inluir en la direccién en la que se dirige Java. El proceso que se sigue es simple: se crea en primer lugar una peticion de especificacin, Java Specification Request (JSR), con alguns caracteristica nueva 0 ‘con mejoras a alguna de las partes ya definidas de Java, al objeto de extender la plataforma Java, Sila JSR es aceptada para su desarrollo, se proceder ala creacién de lun grupo de expertos para definir formalmente esa JSR. Este grupo de expertos esti constituido por miembros del JCP con experiencia contrastada en el area cubierta por la JSR, lderado por una de las empresas mis relevante del sectoral que se diige la JSR y cualquier otra persona voluntaria que quiera aportar su tempo y esfuerzo a la comunidad Java, Cuando la definicn formal de la especificacin est lista, se publica para que sea revisada por el resto de los miembros del JCP y por el piblico ea general La especificacién entonces es modifcada con todos los comentarios aportados por quienes la hayan revisado antes de set volada y aceptada como parte integrante de la Plataforma Java cerrindose su desarrollo y desintegrando el grupo de expertos que la ‘gestions, Todos los estindares J2SE estin definidos en base al JCP. Si el lector desea mis informacién, puede consultar la direccién de Internet: utp:/ivww.jeporg en donde 1_JAVA2: MANUAL.DE USUARIO Y TUTORIAL encontrar una lista de todas las JSR que han sido definida o estin en proveso de ser definidas, entre las cuales se incluyen todas las que integran la edicidn I2SE 6.0 de la plataforma Java y las previstas para su incorporacién a posterires revisiones de la plataforma Java 2 Como se puede comprobar, Sun iz ger pre el dena de eva pro na ce nave del ecroog, lo cuales mucho mas evident en el mundo de los dlopotvos movies, ene cual hay os ere 0 grupos de desl afeans a San qe han relizado implemetaciones dels espeiicacioes pounds como 1 CAPITULO 3 PRIMEROS PASOS EN JAVA ‘Como cualquier otro lenguae, Java se usa para crear aplicaciones pero, ademés, tiene la particulardad especial de poder crear aplicaciones muy especiales, son los applets, que es una mini (let) aplicacion (app) disefiada para cjecutarse en un navegador. A continuaci, se verd en detall lo minimo que se puede hacer en ambos casos, lo que permitiré presenta la secuencia de edicién, compilacin, ejecucién en Java, que sed imprescindible ala hora de estudiar detalles més concretos de Java, para «que ls ejemplos que se muestren sean mejor comprendidos. Hay que hacer una aclaracién antes de entrar a ver nada, porque muchos programadores que se introducen en Java piensan solamente en applets, porque les llama la atencién en su navegacion por Internet. Pero Java va mucho mas alli, y no hay por qué establecer una distincién entre applet como aplicacién grafica y aplicacin independiente como aplicacién de consola. No hay nada que impids a una aplicaciOn independiente funcionar como una aplicacion en modo grifico, lo nico ‘que hay que hacer es tomaise la molestia de inicializar la ventana de la apicacién a mano y aliairle el evento de que se cierre cuando el mensaje que se lo indique le Hepue, cosas que en el caso de los applets estin a cargo del navegadar o visualizador ‘que s¢ esté empleando. Esto es importante, porque en este Tutorial se utlizarin fundamentalmente aplicaciones Java independientes, porque los applets tienen unas medidas de seguridad tan estritas que no permiten muchas de las opciones del lenguaje, como por ejemplo el acceso a ficheros ola impresién de documentos. UNA MINIMA APLICACION EN JAVA [La aplicacién mis pequefia posible es la que simplemente imprime un mensaje en 1a pantalla, Tradicionalmente, el mensaje suele ser “Hola Mundo!”. Esto es justamente lo que hace el siguiente fragmento de cédigo: yy 17 Aplicacién WolaMundo de ejemplo Wy Clase Holamundoapp ( pubTic static void wain¢ String argsf) ) ¢ Systen.out.printin( “Hola Mundo!” ) ? HolaMundo Hay que ver en detalle la aplicacin anterior, linea a line. Esas lineas de eéigo contienen los componentes miniimos para imprimir Hola Mundo! en Ia pantalla. Es un sjemplo muy simple, que no instancia objetos de ninguna otra clase; sin embargo, accede a una de ls clases incluidas en la plataforma Java, ul 71 Aplicacién Holahundo de ejemplo a Estas tres primeraslineas son comentarios. Hay tres tipos de comentarias en Java, (//)e8 un comentario orientado a linea. lass Holamundospp { sta linea dectara la clase HolaMundoApp. El nombre de la clase especificado cn el fichero fuente se utiliza para crear un fichero. nombredeclase. class en el directorio en el que se compila la aplicacién, En este caso, el compilador crear. un fichero Hamad HolaMundoApp.class public static void main¢ string args{] ) { Fsta linea especifica el método que el intxprete Java busca para ejecutar en Primer lugar. Igual que en otros lenguajes, Java utiliza una palabra clave, wan, para especificar la primera funcién a ejeeutar. En este ejemplo tan simple no se pasan argumentes. public signifiea que el método main puede ser llamado por cualquiera, imcluyendo el intéprete Java static es una palabra clave del lenguaje que le die al compilador que main se refiere ala propia clase HolaMundoApp y no a ninguna instancia de a clase. De esta forma, si alguien intenta hacer otra instancia de la clase, el metodo main() no se jecutaria void indica que main() no devuelve nada. Esto es importante, ya que Java realiza ‘una estricta comprobacién de tipos, incluyendo aquellos que se ha declarado que S/APPLET> Esta marce HTML llama al applet MiCodigo.class y establece su anchura y altura inicial. Cuando se acceda ala pigina Web donde se encuentre incluida la marca, se ejecutari el ByteCode contenido en MiCodigo.class, obtenigndose el resultado de la ejecucién del applet en lz ventana del navegador, con soporte Java, que se esté uilizando. Si no se dispone de ningin navegador, se puede utilizar et visor de applets que proporciona Sun con la plataforma Java 2, el applerviewer, que ademés requiere muchos menos recursos de la méquina en que se estéejecutando que cualquier otro de los navegadores que se acaban de citar. Para el desarollador, en el momento de probar sus applets, resulta mucho més cémodo el uso del visor applerviewer que el de un navegador. Prueba de un applet Lajecucin de un applet sobre appletvewer se realiza a través de a amada: appletviewer fichero.heal En este caso el fichero con el eédigo HTML. que ejecutaré el applet HolaMundo csHolaMundo. htm? que generari la salida que muestra la figura 3.1 ARGUMENTOS EN LA LINEA DE COMANDOS Al ejecutar aplicaciones, se pueden especficar argumentos en la linea de llamada, ¥ silos programas estin preparados para aceptarlos, podrin tomarlos en cuenta. Los .22_JAVA2: MANUAL. DE USUARIO Y TUTORIAL usuarios del sistema DOS o de Linux, estarin muy familiarizados con comands del tipo copy FicheroA Ficheros En donde copy es el nombre del programa y ficheroA y fichero® son los argumentos de la linea de comandos, Sin embargo, Java, a diferencia de otros lenguajes como Cr+, trata de forma diferente los argumentos que se pasan en la linea de llamada. La sintaxis uilizada por Java es la que se ha visto en la miniaplicacion inicial desarollada al comienzo de este capitulo: public static void main( String args{] ) { } En el lenguaje Java los parimetros siempre deben aparecer en la declaracin del metodo main), aunque el programa lava no esté preparado para aceptar ninguno. El nombre del programa no se proporciona en Java y el mimero de elementos en cl array se puede obtener mediante el aributo lenge del array, con To que n0 es necesario que el sistema operativo indique cuantos parimetros hay en la linea de comands. Solamente como curiosidad, y también como muestra de una aplicacién un poco mis complicada que la impresion de un mensaje, el siguiente ejemplo, Java302. java, imprime la lista de argumentos que se pasa a una aplicacion Java. class Java301 ie static void main( String args{] ) ( for (int 1=0; 1 «args, lengthy 14+ ) ‘systen.out.printlaC args{i] 3s fu Si se compila y, posteriormente, ejecuta esta aplicacion con ta llamada que se indica, lo que se obtiene en pantalla es lo que se muestra a continuacin: X javac Java301java X java JavaHDl estos son argunentos estos, arguments CAPITULO 4 LENGUAJE JAVA Ahora que ya se ha visto a grandes rasgos lo que Java puede offecer,y tras la tgeneracin del primer cédigo Java, se supone que el gusanllo de comenzar con Java ya estar satisfecho, por lo que es el momento de enrar a pelearse con el lenguaje en si, En el aprendizaje de todo lenguaje de programacién el primer paso suele ser entrar en conocimiento de los conceptos fundamentales, como son las variables, ls tpos de datos, expresiones, flujo de control, etc. Por ello, en este capitulo se trata estos conceptos. Lo hisico resulta muy familiar a quienes tengan conocimientos de C/C++ © cualquier lenguaje orientado a objetos. Los programadores con experiencia en otros lenguajes proceduralesreconocerin la mayor parte de las construcciones. Elector encontrar en ls apéndices recursos para poder profundizar en cada uno de los conceptos que se introducen o describen en éste y posteriorescapitulos. Sin embargo, como referencia del lenguaje, a continuacién s¢ comentan los que son fundamentales para Java, Cuando se programa en Java, se coloca todo el eéigo en métodos, de la misma forma que se escriben funciones en otros lenguajes como C. COMENTARIOS En Java hay tes tipos de comentarios: // comentarios para una sola Tinea /* comentarios de una o sais: Tineas, ” 24_JAVA2: MANUAL DE USUARIO Y TUTORIAL on comentario de documentacion, de una o mis Tineas *y Los dos primero tipos de comentarios son los que todo programador conoce y se utlizan del mismo modo. Los comentarios de documentacién, colocados inmediatamente antes de una declaracién (de variable o funcién), indican que ese ‘comentario ha de ser colocado en la documentacién que se genera automticamente ‘cuando se utiliza la herramienta de Java, javadoc, no disponible en otros lenguajes de programaciéa. Dichos comentarios sirven como deseripcién del elemento deelarado permitiendo generar una documentacién de las clases que se va construyendo al mismo tiempo que se genera el cbdigo de la aplicacin. La plataforma Java 2 permite la creacién de doclets, que son pequetias aplicaciones que la heramienta javadoc puede ejecutar para generar cualquier tipo de documentacién especial que se desee. A pesar de la posible complejidad de los ddoclets, la salida estindar es un fichero HTML con el mismo formato que el resto de ka documentacién de Java, por lo que resulta muy ficil navegar através de las clases. IDENTIFICADORES Los identticadores nombran variables, funciones, clases y objetos, cualquier cosa {que el programadornecesite identifcaro usar. En Java, un identficador comienza con una letra, un subrayado (_) 0 un simbolo de dolar (8). Los siguientes caracteres pueden ser letras 0 digitos. Se distinguen las smayisculas de las minisculas y no hay una longitud méxime establecida pare el idemiticador. La forma basica de una declaacién de variable, por ejemplo, seri: ‘ipo identificador ( = valor] ,ideneificador [+ valor] «.-1; Serian identifcadores vidos: ‘identi Ficador onbreusuario Nonbre_Usuario cvariable_del_sistena Stransaccion Y stLuso sera, por ejemplo: ‘int contador_principal char _lista_de Ficheros; Float Scantidad_en_Euros; Palabras clave Las siguientes son las palabras clave que estin definidas en Java y que no se pueden utilizar como identificadores: oma f (CAPITULO &LENGUAIEIAVA_25 abstract continue for net switch assert default’ goto nul synchronized boolean do if package this break double implements private threadsafe byte else import protected throw” byvalue enum instanceof public transient. case extends int reurn true catch false interface short try char Final ong static void class Finally native super while const Float Palabras reservadas [Ademis, et lenguaje se reserva unas cuantas palabras mis, pero que hasta ahora ‘no tienen un cometido especifico. Son: cast future generic. immer ‘operator outer rest var Literales Un valor constante en Jave se erea utilizando una represeatacidn literal de él. Java utiliza cinco. tipos de elementos: enteras, recles en coma flotante, booleanos, ccarocteres y cadenes, que se pueden poner en cualquier lugar del cbdigo fuente de Java, Cada uno de estos literales tiene un tipo correspondiente asociado con él Enieros: byze 8 bits ‘complement a dos short 6 bits complemento a dos int 32 bits complemento a dos Jong 64 bits complemento a dos Porejemplo: 221 077 ox0C00 Reales en coma flotante: Float 32 bits IEEE 754 oub 64 bits IEEE 754 Porejemplo: 3.1¢ 2612 3.1612 Booleenos: true false Caracteres: Porejemplo: a \t_—_\u?272 [7777] nimero unicode FRAN oa | “76 JAVA2) MANUAL DEUSUARIO Y TUTORIAL oma oma CAPITULO 4 LENGUASEAVA_27 adenas Yong 13 = 200; Por jemplo: "Esto es una cadena Tiveral” no es necesario colocar la L después de 200 porque resultara superfiu, Sin embargo, (Cuando se inserta un literal en un programa, el compitador normalmente sabe cexactamente de qué tipo se trata. Sin embargo, hay ocasiones en a que el tipo es ambiguo y hay que guiar al compilador proporciondndole informacin adicional para indiarle exactamente de qué tipo son los caracteres que componen el literal que se va, 1 encontrar. En el ejemplo siguiente se muestran algunos casos en que resulta, imprescindible indicar al compilador el tipo de informacién que se le esti proporcionando: class Literates ( Ghar C= OxffFF; —// mayor valor de char en hexadecinal byte b 7] mayor valor de byte en hexadecinal shorts +P] mayor valor de short en hexadecinal int 12 71 hexadecimal en minusculas fine 42 2 0x2 77 hexadecimal en mayisculas int 13 = 0177; // octal (un cero al principio) Tong 11 = 1001; Tong 12 = 1001 Yong 13 = 200; Uf Tong 14(200);_// no esta pernivido Hoat ft float 2 = 1 float (3 = If; float f4 = 1e-45f; // en base 10 float £5 = leva; double di = 16; ovble #2 = 10: double 43 = 476474; // en base 10 ) Un valor hexadecimal (base 16), que funciona con todos 10s tipos enters de datos, se indica mediante un Ox o OX seguido por 0-9 y a-F, bien en mayisculas 0 ‘miniscula. Los nimeresoctals (base 8) se incan clocando un cero ala izquierda del nimero que se desce. No hay repesemaciOn para umes bination. i se nena incializar una variable con un valor mayor que el. que puede almacenar, el compilador generar un ero Se puede colocar un caricter al final del literal para indicar su tipo, ya sea una letra mayiiscula o miniscula, La letra L. se usa para indicar un Jong, la letra F significa Float y la letra D mayiscula o miniscula es lo que se emplea para indicar que el literal es un double, a exponenciacién se indica con la letra e, mando cono referente la base 10. Es decir, que hay que realizar una traslacin mental al ver estos niimeros de tal forma que 1.3e-45Fen Java, en la realidad es 13x10", No es nevesario indicarle nada al compilador cuando se puede conocer et tipo sin ambigedades. Por ejemplo, en: en el caso: Float f4 = 1e-45F; // en base 10 si es necesario indicar el tipo, porque el compilador trata normalmente los nimeros exponenciales como double, por lo tanto, si no se coloca laf final, et compilador sgenerari un error indicando que se debe colocar un moldeador para converte el double en Float. Cuando se realizan operaciones matemiticas 0a nivel de bits con tpos de datos bisios mis pequeios que int (char, byte o short), esas valores son promocionados aint antes de realizar las operaciones ye resultado es de tipo int. Sse quire seguir teniend etpo de dato original, hay que colocar un moldeo, tniendo en cuenta que a pasar de un tipo de dato mayor uno menor, es decir, al hacer un mole estrecho, se pusde perder informacién. En general, el tipo més grande en una expresén e el. que determina el tamafio del resultado de la expresin; i se mutiplica un Float por un double, el resultado secéun double, y si se suma un int y un Tong, el resultado seri un Tong SEPARADORES Sélo hay un par de secuencias con otros caracteres que pueden aparecer en el cédigo Java; son los separadores simples, que van a definir la forma y funcién del ‘igo. Los separadores admitidos en Java son © - paréntess. Para contener lists de pardmetros en la definicién y lamada a métodos. También se utiizan para definir precedencia en expresiones, contener ‘expresiones para control de flujo yrodear las conversiones de tipo. 4 - aves. Para contenet los valores de matrices inicializadas automaticamente También se utilizan para defnir un bloque de cédigo, para clases, meétodos y imbitos locales C1 = corchetes. Para declarar tipos matriz. También se utilzan cuando se referencian valores de matrz 4» punto y coma, Separa sentencias. coma. Separa identiicadores consecutivos en una declaracié ‘También se utiliza para encadenar sentencias dentro de una sentencia For. de variables derecha sea mdificado, Ena siguiente tabla aparecen los oper es rece os operadores que eutlzan en av, por orden de el operando izquierdo es mayor que el derecho >» el operando izquierdo es mayor o igual que el derecho << el operando izquierdo es menor que el derecho cl operando izquierdo es menor igual que el derecho operand izquierdo es igual que el derecho cl operando izquierdo es dstnto de derecho Los operadores relacionales combinados con los operadores condicionales se utlizan para obtener expresiones mis complejas. Los operadores condicianales que soporta el lenguaje Java son: {4 expresionesizquierda y derecha son true | ola expresion izquierda o la expresion dela derecha son true laexpresidn de la derecha es False Los operandos de estos operadores deben ser tipas booleanos, o expresiones que >>, no disponible en otros lenguajes y, ademas, el entomo en el que se realizan algunas de las operaciones no siempre es el mismo en Java que en los otros lenguajes, Los operadores de bits que soporta Java son los que aparecen en la siguiente tabla Operador Use Operacion - 5>Operando >> Despl __Desplza bits del operando hacia Ta derechs las posicianes indicadas (cn igno) << Operando << Despl _Despaza bits del operand hacia Ia izquieeda las posiiones indicadas >>> Operando >>> Despl Desplaza bits del operando hacia ls drecha ls posiciones indicadas (sin signo) & —Operando & Operando Realiza una opeacién AND logica entre los dos operands 1 Operand | Operando Reliza una opraion OR gic ene los dos operands 1 Operando Operando Realza una opeacén Kigca OR Exclsiva eae Joe dos operndos = -Operando Compementario del opeando(unario) En Java, el operador de desplazamiento hacia la dereca sin signo rellena los bits que pueden quedar vac con ceros. Los bits que son desplazados fuera del entomno se pierden En el desplazamiento a la izquierda, hay que ser precavidos cuando se trata de desplazarenteros positives pequefios, porque el desplazamiento a la igquierda tiene el efecto de multiplicar por 2 para cada posicién de bit que se desplace; y esto es peligroso porque si se desplaza un bit 1 la posicién mis alta el bit 31 0 el 63, ef valor se convertia en negativo. Operadores de asignacién EE operador = es un operador binario de asignacién de valores. El valor almacenado en la memoria y representado por el operando situado a la derecha del ‘operador es copiado en la memoria indicada por el operando de la izquierda. Ni el ‘operador de asignacién ni ningin oto, se pueden sobrecargar. Java soporta toda la panoplia de operadores de asignacién que se componen con ‘otros operadores pare realizar la operacién que indique ese operadory luego asignar el valor obtenido al operando situado ala izquerda del operador de asignacién. De este ‘modo se pueden realizar dos operaciones con un solo operador. ta fa He be In be Kew oom owe Por ejemplo, las dos sentencias que siguen realizan la misma funcidn: Y las otras comprobaciones siguen ef mismo pate. Operador ternario if-then-else El enguaje Java soprta este operador termario. Aunque la constrain wtlizada por este operadores algo confuse, se puede llegar a entender perfectamente cuando tuno lee en el pensamiento lo que esti escrito en el céiigo. La forma general del operadores expresion 7 sentencial : sentencia2 en donde expresion puede ser cualquier expresién de la que se obtenga como resultado un valor booleano, y si es true entonces se ejecuta la sentencial y en caso contrario se ejecuta la sentencia2. La limitacién que impone el operador es que sentencial y sentencia2 deben devolver el mismo tipo, y éste no puede ser void, Puede resultar itil para evaluar algiin valor que seleccione una expresién 2 utilizar, como en la siguiente sentenci: cociente = denosinador == 07 0 : nunerador / denominador Cuando Java evalia la asignaciOn, primero mira la expeesién que esti a la iquirda del interrogante. Si denominador es cero, entonces evali la expresién que esti entre el interrogante y los dos puntos, y se utiliza como valor de la expresin completa. Si denominador no es cero, entonces evalia la expresin que esta después 4e los dos puntos y se utiliza e resultado como valor de la expresin completa, que se asignaa la variable que esti a in iquierda del operador de asignacion, cociente. En el ejemplo Java402. java, se utiliza este operador para comprobar que el ‘denominador no es cero antes de evaluar la expresin que divide por él, devolviendo lun cero en caso contrario. Hay dos expresiones, una que tiene un denominador cero y otra que no, class Javadoz_( public static void wain( String args(} ) { inva = 2 int b= 4 int c= 4 int d= 05, Uf UtsTizamos e1 operador ternario para asignar valores a las dos 17 variables e yf, que son resuTtado de Ta evaluacion realizada 1 por el operador |AVA2: MANUAL DE USUARIO Y TUTORIAL ona ous CAPTTULOS:LENGUAIEJAVA 38 int e= (== 0) 70: G/B) int f= @ == 0) 70: e/a); Mint fees a systen.out.printinG "a Systen-out printin¢ systen-outprintinG "ec Systen-out printin( "d= Systen-out printlnQ) Systen-out.printIn¢ Systen-out printIn( "c 7 } El programa se ejecuta sin erores, y la salida que genera por pantalla es: % java Javaton a-28 6 cna 4 asb-7 cfd Si ahora se cambia la linea que asigna un valor ala variable F,y se elimina este ‘operador, dejindola como: int Fac / 4; se prodicir’ una excepcién en tiempo de ejecucion de division por cero, detenigndose Ja ejecucin del programa en esa linea. % java Java4on Exception in thread “sain” java.Jang.ArithneticException: / by zero ‘at Javad02.main(ava402,java:42) Moldeo de operadores Es Jo que se conoce como casting, refriéndose a “colocar un molde”. Java automiticamente convierte el tipo de un dato en otro cuando es pertinente. Por ejemplo, si se asigna un valor entero a una variable declarada como flotante, el compilador convierte autométicamente el int a Float. El casting, 0 moldeo, permite hhacer esto explictamente,o forzarlo cuando normalmente nose hat Para realizar un moldeo, se coloca el tipo de dato que se desea (incluyendo todos los modificadores) dentro del paréntesis ala izquierda det valor. Por ejemplo: void moldeos0 ( int i= 100; ‘ong 1 = Clona)' Tong 12 = Clong)200; ) “34 JAVA2- MANUAL DE USUARIO YTUTORIAL ensu Como se puede observar, es posible realizar ef moldeo de un valor numérico del ‘mismo modo que el de una variable. No obstante, en el ejemplo el moldeo es superfuo, porque el compilador ya promociona los enteros a flotantes, cuando es necesario, automiticamente, sin necesidad de que se le indique, Aunque hay otras 1ocasionesen que es imprescindible colocar el moldeo para que el cédigo compile Java permite el moldeo de cualquier tipo prmitivo en otro tipo primitivo, excepto «en el caso de ls booleanos, en que no se permite moldeo alguno. Tampoco se permite el moldeo de clases. Para convertir una clase en otra hay que utilizar métodos espevficos. La clase String es un caso especial que se veri més adelante. VARIABLES Las variables se uiizan en la programacién Java para almacenar datos que varian durante la ejeeucién del programa. Para usar una variable, hay que indicarle al compilador el tipo y nombre de esa variable, declaracién de la variable. El tipo de la variable determinara el conjunto de valores que se podrin almacenar en la variable y cl tipo de operaciones que se podrn realizar con ella Por ejemplo, el tipo int solamente puede contener nimeros completos (enteros). En Java, todas las variables de tipo int contienen valores con signo, EXPRESIONES ‘Los programas en Java se componen de senfencias, que a su vez estan compuestas en hase a expresiones, Una expresin es una determinada combinacin de operadores Y operands que se evahian para obtener un resultado particular, Los operandos ‘pueden sr variables, constants oIlamadas a metodo. Una lamada a un método evalia el valor devueto por el método el tipo de una amada aun método es el tipo devuelto por ese método, Java soporta constantes con nombre y a forma de cearlas es: final float PI = 3,14159265358979323846; sta linea de cédigo produce un valor que se puede referenciar en el programa, Pero no puede ser moeifcado. La palabra clave Final es la que evita que esto suceda, En ciertos casos, el orden en que se realizan las operaciones es determinant para el resultado que se obtenga. Al igual que en C+, Pascal y otros lenguajes, en Java se puede controlar el orden de evaluacin de las expresiones mediante” el uso de paréntesis. Si no se proporcionan estos paréntess, el orden estar determinado por la Drecedencia de operadores, de tal modo que las operaciones en las que estén involucrados operadores con mis ata precedencia sein los que primero se evalien. cua :LENGUAIE AVA. 35, ARRAYS: Java cuenta con un tipo de datos verdadero de posiciones secuenciales, array, que ispone de comprobaciones exhaustivas para su correcta manipulacion; por ejemplo, 4e la comprobacién de sobrepasar los limites definidos para el aray, en evitacién de ’ Si se compila el fichero Javad. java, la salida por pantalla que genera el ccompitador ser: ema (CAPITULO ¢: LENGUAIESAVA. > javac Javadi. java Note: Jave4ll.java uses or overrides a deprecated APT Note: Recompiie with -Xlint:deprecation for details. Y si al comando de compilacion se afiade la opcién -X1int:deprecation, el compilador indicara deforma especifica qué es lo que sueede: > javac -XVint:deprecation Javadi. java JavaS LL java:34: warning: [deprecation] metodobeprecated() in Obsoleta has been deprecated ‘bsalet. odaDeprecated(); 1 warning El cambio de utilizar la etiqueta @deprecated en los comentarios ala anotacién @veprecated no introduce nada nuevo en el lenguaj, sino que es otra forma de hacer lo mismo. Sin embargo, otras anotaciones como @Override 0 @SupressWarnings si que incorporan nuevas funcionalidadesa la plataforma Java La anotacién @Override se puede utilizar en las declaraciones de los métodos para indicar que un método sobrescribe al método correspondiente de su superclas. La razén de su uso es que los errores aparezcan cuanto antes. Es frecuente a la hora de sobreseribir un método que se cometan errores tipogritices o que se especifiquen argumentos erréne0s 0 que se devuelve un tipo de dato distinto del que devuelve el metodo que se intente sobrescribir. Es decir, que no es infrecuente que en vez de sobrescribir un método, en realided se estécreando un método nuevo, lo que hari que sea muy dificil enconirar el problema que ocasiona su presencia, en tiempo de cjecucidn. El uso de @Override permite que el compiladar pueda comprobar que el ‘huevo método sobrescibe al de Ia superclase y presentar el errr, silo hubiera, ya en tiempo de compilacién public class Javasi2 ( override public int hasheoded ( return 0; ? override public bootean equals( Object obj ) { return true; } ? En el cédigo anterior, el problema que presenta es que Ia signatura del método deberia ser hashCode() y no hashcade(). Sila declaracién anterior estuviese (como es habitual) incluida en el cédigo fuente de una clase mucho mayor, seria muy ‘complicado darse cuenta del error que genera la circunstancia de que hashcode() tenga su nombre todo en minisculas, con lo cual, no esté sobrescibiendo al método hashCode), sno que se trata de un método nuevo, Utilizando la anotacicn Override, «la hora de compilar Ia clase se genera el aviso acerca del problema: 42 JAVA: MANUAL DEUSUARO Y TUTORIAL, crn > javac Javadi. java Jalasl2.jevar31i method does not override or implenent a method from a ‘supertype override Lerror La anotacién @Suppresswarnings quizés sea ain més interesante porque permite indicar al compilador que no proporcione avisos sobre cosas que normalmente si ‘generarian avisos. El compilador define varias opciones de supresién de avisos, en funcién de sus tipos: all, deprecation, unchecked, fallrough, path, serial y finally. Para mostrar un ejemplo, en el siguiente cOdigo se utiliza la anotacién anterior para suprimir los avisos de tipo falihrough. Si el lector observa la clase, apreciar la ‘augencia dela sentencia break en cada una de las opeiones switch. public class Java4h3 ( public static void main( String args{] ) int i = args. length; switch 1) ‘case 0: Systen.out.printn( "0" ); case 1 System.out print a( case 2 System.out printn( case 3 Systen.out printIn( aerate System.out.printin( “Default” 35 ) ) ) Sise compila la clase con el comand: > javac Javadi. java |asalida por pantalla no indica ningin problema. i se quiere que el compilador avise dd que las cliusulas switch caen en un fllthrough, es decir, que fltan una 0 varias sentencias break, se debe incluir la opeion -XTint:fal through en el comando de compilacin > javac -KVint:fal through Java4i3.java ‘que si se ejecuta, ahora generard la siguiente sada por pantalla: Javat3.java:39: warning: [Fallthroogh] possible fall-through into case case 1: Javai3.java:41: warnings (Falithroogh) possible falT-through into case case 2 ‘ena (CAPITULO 4:LENGUAEJAVA_ 3 3ava4i3 java:43: warning: [fal through] possible fal1-through into case case 3 3avata3.java:4: warning: [fal theough] possible fall-through into case deravte: 4 narnings Pero en el caso de que se quieran ignorar los avisos anteriores, es decir, ignorar el hhecho de que no haya sentencias break, es donde entra en juego la. anotacién SuppressWarnings, que en este caso se puede afadir en el método main() de la forma (Suppresswarnings("falIthrough") ¥y se compila eon el comando anterior con la opcién XTint, entonces se generard el fichero class correspondiente a a clase sin indicarningin aviso en la salida, El lector debe usar esta anotacin con juicio; es decir, no debe utilizarse para que cl resultado de ta compilacion aparezca limpio, sino para evitar que en la salida parezca todo tipo de informacin cuando se esté resolviendo un tipo de problema cconereto. De este modo, e pueden evitar todos los avisos que no interesen 0 no deban tenerse en cuenta en ese instante y solamente contribuyen a complicar la salda. CONTROL DE FLUJO El control del flujo es la manera que tiene un lenguaje de programacion de hacer {que el flujo de la ejecucin avance y se ramifique en funcién de los cambios de estado de tos datos. Java, en este aspecto, no utiliza los principios de disefto orientado a objeto, sino que las sentencias de control del flujo del programa se han tomado del CiC+*. A continuacién, se tratan todos los mecanismos que proporciona Java para conseguir este control y decidir qué partes del od Sentencias de salto iffelse if expresién-booleana ) ( sentencias; ) [else ( n Esta construccién hace que el programa atraviese un conjunto de estados bbooleanos que determinan la ejecucién de distintos fragmentos de cédigo. La cliusula else es opcional. Cada una de las sentencias puede ser una compuestay la expresién: bbooteana podria ser una variable simple declarada como boolean, o bien una |M_JAVA2: MANUAL DE USUARIO Y TUTORIAL cexpresion que utilce operadores relacionales para generar el resultado de una comparacién, swite ‘switch( expresion ) { ‘case valor: sentencias; break: case valor2: sentencias; break; (deraut sentencias:] La sentencia switch proporeiona una forma limpia de enviar la ejecucion a partes diferentes del eédigo en base al valor de una tnica variable o expresion. La expresin puede devolver cualquier tipo bisico, y cada uno de los valores especificados en las sentencias case debe ser de un tipo compatible. La sentencia switch funciona de la siguiente manera: el valor de la expresin se compara con cada uno de los valores liteales de las sentencias case. Si coincide cox alguno, se ejecutard el eédigo que sigue a la sentencia case. Si no coincide cox ringuno de ellos, entonces se ejecutari la sentencia defautt (por defecto), que es fopcional. Sino hay sentencia default y no coincide con ninguno de ls valores, no hard nada. Al igual que en otros lenguajes, cada constante en una seatencia case debe El uso de la cliusula default, a pesar de ser opcional, siempre deberiautlizars, porque en el caso de desarollo de aplicaciones en entornos colaborativos, alin programador puede haber cambiado el conjunto de valores utilizado en Ia sentencia switch, sin haber recordado actualizar las cliusulas case, en cuyo caso la apicacion no funcionara correctamemte, siendo dificil detectar un error tan sutil, Por ello, es importante utilizar la clausula defau?t indicando qué valor de switch ha hecho llega: ahi el Majo de la apicacin. Fl compitedor de Java inspeccionaré cada uno de los valores que pueda tomar la cexpresién en base a las sentencias case que se proporcionen, ¥ creari una tabla cficiente que uliza para ramificar el control del ljo al case adecuado dependiendo del valor que tome la expresin, Por lo tanto, si se necesita selecionar ene un gran trupo de valores, una sentencia switch se ejecutari mucho mas rapido que la Wogice ‘quivalente codificada utilizando sentencias if-else. La palabra clave break se utiliza habitualmente en sentencias switch sin etiqueta para que la ejecucidn sate tas el final de la sentencia switch. Sino se pone el break, la ejecucién continuard en el siguiente case. A la hora de programar es un error habitual olvidar un break; dado que el compilador no avisa de dichas omisiones, es oma CAPITULOS:LENGUAIEJAVA 45 aconsejable poner un comentario en los sitios en los que normalmente se pond el break, diciendo que la intencin es que el case contin en el siguiente, por convenio este comentario ¢s simplemente, “Contimia”, También se puede hacer uso de la opcién X1 int del compilador que en este caso generariaavisos de tipo allthrough. Sentencias de bucle Bucles for for( inicializacién; terminacién; iteractén ) { ‘sentencias; } Un buete for, normalmente, involucra a tres acciones en su ejecucin: ‘© Inicializacién de la variable de control ‘+ Comprobacién del valor de la variable de control en una expresién condicional *Actualizacin de la variable de control La cléusula de inicio y la cliusula de incremento pueden estar compuestas por varias expresiones separadas mediante el operadot coma (,), que en estos bucles Java, también soporta: Fort ac 0; 2 <7; aneyben? ) El operador coma garantiza que el operando de su iaquierda se ejecutard antes que cl operando de su derecha. Las expresiones de la cliusula de inicio se ejecutan- una sola vez, cuando arranca el bucle, Cualquier expresign legal se puede emplear en esta ldusula, aunque generalmente se utiliza para inicializaién. Las variables se pueden declarareiniializaral mismo tiempo en esta clusula: for( int ent=0; ent < 2; cates) {La segunda cliusula, de comprobacidn o fst, consiste en una tnica expresién que Abe evaluarse a fase para que el bucle concluya, Esta segunda expresion debe ser de tipo booleano, de tal modo que se pueden utilizar inicamente expresiones relacionales expresiones relacionales y condicionales, El valor de la segunda cliusula se comprueba cuando la sentencia comienza la ejecucién y en cada una de ls iteraciones posteriores La tercera clausula, de incremento, aunque aparece fisicamente en la declaracién de bucle, no se ejecuta hasta que se han ejecutado todas las sentencias que componen cl cuerpo del bucle for; por ello, se utiliza para actalizar la variable de control, Es ‘importante tener en cuenta que si se usa variables incluidas en esta terceracléusula «las sentencias del cuerpo del bucle, su valor no se actualizaré hasta que la ejecucién ‘de todas y cada una de ls sentencias del cuerpo del bucle se haya completado. En esta cléusula pueden aparecer miltiples expresiones separadas por el operador coma, que Sern ejecutadas de izquierda a derecha La primera y tercera cliusulas del bucle for pueden encontarse vacas, pero : ¥ con la nueva forma del bucle for introducida por J2SE 5.0, se puede escribir el ‘mismo eédigo de forma mis clara: for int num : iapares ) System.out.printing "Numero impar: "snum ); Como se ha indicado, esta nueva forma del bucle For también se puede utilizar ‘con colecciones, tal como se mostrari en captulos posteriors. De este modo, ¢s posible prescndr de uso de iteradores que son una fuente de errores, porque aparecen al menos tres veces en cada bucle y pueden generar fallosen tiempo de ejecucién muy dlfciles de detectar. Para evitarl, se deja al compilador que realic todo el trabajo, tal ‘como se muestra en el eddigo siguiente VectorcInteger> v new Vectorcinteger>; // coleccién genérica veaddElement( 1); 7/ conversiones inplicitas, CAPITULO 4: LENGUAIEJAVA_ 47 v.addelement( 2): Viaddetenent( 3): Fort Integer i: v) ‘System.cut.printin( "Numero: "+i ); Se crea un iterador de tipo Integer que recorre todos los valores de Ia coleccién de tipo Veetor. El iterador i es local al bucle For y la nueva sintaxis se encarga de actualizar el iterador y realizar la conversién a Integer. La clase Java407 utiliza las dos formas del bucle for para recorrer fa coleccién que se pasa como argumento a cada uno de los métodos de la clase. class Javaso7 ( // Wétodo que utiTiza Ta forea clasica de recorrer una coleccién Y/ wesVizando un sterador para ello private void forantiguo( Coltection ¢ ) ¢ Systen-out.println( "For al estilo de siempre for( Teerator 4 = c.iteratorO; iuhasNextO; ) ( ‘String elenento ="(String)i next O; Systen.out print( elemento 3; } ) // Natodo que utiliza Ya nueva forma del bucle for para recorrer la 77 coleceion de senejante manera que e1 nétoda anterior private void fortuevot Collection ¢_) { Systen.outprintin( "For en formato nuevo for( Object obj :'e) { System, out.print( ab} ): ? public static void main( String args{] ) { Tavat07 af ~ new Javat070;, 1/ Creanos una coleccién y utiTizando clases genéricas, // resteinginos su contenido a elementos de tipo String ArrayListeString> Vista ~ new ArrayListestrinpO; // Tncorporanos: algunos elementos a a Vista Vista.add¢ “Tutorial ™ ) Tistaladd¢ “de *') Vista.add¢ “Java *"); Tistacadd¢ “adaptado’* ); Tistacadd¢ “al * ) Tistaladd¢ “32se *"); Vistaladd¢ "6" ); // Ahora invocamos a 10s métodos que nos presentan €1 contenido 11 de a Vista af forantiguot Vista); SySten.out-printn; af fortuevot Tista Di ) » Hay que tener en cuenta, no obstante, que esta nueva forma del bucle for no puede utilizarse cuando se recorre una coleccién para modificatla; por ejemplo, para climinar elementos. |#8_JAVA2: MANUAL DELSUARIO Y TUTORUAL rans Bucles while Liniciatizacton;) viniTeC terminacién-expresién-booleana ) { [iteractoni) Elbucle whiTe es la sentencia de bucle mas bsica en Java, Ejecutarepetidamente una vez tras otra una sentencia mientras una expresin booleana sea verdadera. Las partes de inicializacion e iteracién, que se presentan entre corchetes, son opeionales. Esta sentencia whe se utiliza para crear una condi de entrada, El significado de esta condicidn de entrada es que la expresin condicional que controla el buce se comprueba antes de ejecutar cualquiera de las sentencias que se encuentran situadas en el interior del bucle, de tal modo que si esta comprobacidn es fase la primera vez, el conjunto de las sentencias nose ejecutari munca Bucles do/while [iniciatizactén;) oC sentencias; [steracténiy ) while( terminacién-expresién-booteana ); A veees, se puede desear ef ejecutarel cuerpo de un bucle whiTe al menos una vez, incluso si la expresin booleana de terminacién tiene el valor False la primera ver es desir, si se desea evaluar la expresin de terminacidn al final del bucle en vez 4e al principio como en el bucle while. Esta construccién do-whi te hace es0 exactamente Excepeiones try-eateh-throw wry ( 2} cateh( Exception ) ¢ } Java implementa excepciones para facilitar la construccién de cédigo robust, Cuando oeurre un error en un programa, el cédigo que encuentra el error lanza una excepeidn, que se puede capturar y recuperarse de ella. Java proporciona muchas ‘excepciones predefinidas, El manejo y control de excepciones es tan importante en Java que debe ser tratado en un capitulo aparte, aunque sirva este punto como mencién previa de su existencia, ems CAPITULO 4 LENGUAIEJAVA. 6 Control general del flujo Dreak break (etiqueta); La sentencia break puede uilizarse en una senteneia switch o en un bucle. (Cuando se encuentra en una sentencia switch, break hace que el control del flujo del programa pase ala siguiente sentencia que se encuentre fuera del entomo del switch. Sise encuentra en un bucle, hace que el flujo de ejecucién del programa deje el Ambito Gel bucley pase a la siguiente sentencia que venga a continuacién del bucle. Java incompora la posibilidad de etiquetar la sentencia break, de forma que el control pasa. a sentencias que no se encuentran inmediatamente después de la sentencia switch o del bucle, es decir, saltari a la sentencia en donde se encuentre situada la ctiqueta. La sintaxs de una sentencia etiquetada es la siguiente: eciqueta: sentencia; continue continue [etiquetal; La sentencia continue no se puede utilizar en una sentencia switch, sino solamente en bucles. Cuando se encuentra esta sentencia en el discurrr normal de un programa Java, la iteracién en que se encuentre el bucle finaliza y se inicia la siguiente Java permite el uso de etiquetas en la sentencia continue, de forma que el funcionamiento normal se ve alterado y el salto en la ejecucién dl flujo de programa se realizaria la sentencia en la que se encuentra colocada la etiqueta. Por ejemplo, ante la presencia de bucles anidados, se pueden utilizar etiquetas para poder salir de ells: uno: forc ) ¢ os: for€ ) { ‘continue; // seguiria en el bucle interno continue uno; // seguiria en el bucle principal break uno; // se saldria del bucle principal } ) Hay autores que sugieren que el uso de sentencias break y continue etiquetadas proporciona una atenativa al infame goto (que Java no soport, aunque reserva la palabra). Quiz sea as, pero el entoro de uso dela sentencasetiquetadas break y continue es mucho mis restrictivo que un goto. Concretamente, un break 0 continue con etiqueta compilan con éxito solamente si la sentecia en que se S0_IAVA2: MANUAL DE USUARIO Y TUTORIAL _ ‘encuentra colocads la etigqueta es una sentencia a la que se pueda legar con un break ‘continue normal return return expresién; La sentencia return se utiliza para terminar un método o funcién ‘opcionalmente devolver un valor al metodo de Hamada, En el céigo de una funcin siempre hay que ser consecuentes con la declaracién {que se haya hecho de ella Por ejemplo, si se declara una funcion para que devuelva un entero, ¢ imprescindible colocar un return final para salir de esa funcién, independientemente de que haya otros en medio del eédigo que también provoquen la sada de la funcién. En caso de no hacerlo se generari un Aviso (Warning), y el cédigo Java no se debe compilar con Warnings. int func { ifCa== 0) return 1; return 0; // es inprescindible porque se retorna un entero } Si el valor a retomar es void, se podra omitir ese valor de retomo, con lo que la sintaxis se queda en un sencllo {se usaria simplemente para finalizar el método o funcén en que se encuentra, asi ‘como devolverel control al método o funcién de Hamada, TIPOS GENERICOS Los tipos genéricos representan un concepto dificil de ubicar en un capitulo Aeterminado, porque representan un concepto basic a la hora de la comprobacin de tipos; sin embargo, st uso principal es con colecciones. El motivo primordial de la existencia de tipos genéricos (generics) es proporcionar a una clase la capacidad de trabajar con una amplia variedad de tipos de objetos. Por ejemplo, la clase ArrayList Pemite almacenar una lista de cualquier tipo de objets; sin embargo, ArrayList siempre fuerza a que sea necesario colocar un moldeo a los abjetos que contiene al soearlos dela lista para convertrlos al tipo que verdaderament les corresponde: String cadena = (Swing)arrayList.get( 0 ); Desde el J2SE 5 se introducen los tipos genéricos en el lenguaje Java para evitar la presencia del moldeo y que no se produzca el error que generaba la ausencia del ‘moldeo en tiempo de ejecucién, una excepein de tipo ClassCastException, Este Soporte a tpos genéricos ha sido una de las peticiones que mas insistentemente se han ons - CAPITULO 4 LENGUAEIAVA_ 51 hecho y se habia pospuesto porque requeria cambios en la especificacién de lenguaje Java € incluso actualizaciones en la especificacién de la Méquina Virtual Java. Finalmente, a partir de la version J2SE 5.0 los tipos genéricos forman parte del lenguaje Java CCon la inclusién de los tipos genéricos en las colecciones Java, se asegura en tiempo de compilacin Ia asignacn de tipos, Para ello incluso se cambia la notacién, aunque no resulte demasiado significativa ColeccioncTipol,Tipo,-I> identificador = nen CoteccioncTipot,Tip,-1>Oi, En donde Coleccion es el tipo de la coleccién de que se trate: Vector, ArrayList, HashMap, etc, y tipo es el tipo de objetos que podri almacenar est coleccién, Por ejemplo, un Veetor que almacene objetos de tipo String, se declararé de [a siguiente forma: Vector v = new Vector(: La aplicacion del ejemplo Java408.,ava crea una lista de enteros y otra de cadenas ¢ imprime el contenido de amas en bucles separados, introduciendo ls funcionalidad que proporciona el uso de tipos genéricos. El cédigo completo del ejemplo se reproduce seguidamente. class Javat0s ( public static void main( String args{] ) { 7/ Creanos 12 coleccian de enterds e intraducimos elementos VectoreInteger> v= new Vectoretnteger>(; v.add1 5 viadd( 395 ViadaC 5.95 71 Ceeanos 1a coleccién de cadenas e introduciaos elenentos Uistestring> al = new AerayListQ; al.addC “Tutorial” 5 aleaddc aNsadd¢ “Dava"); 7/ Tapriminos 1" contenido de 1a coleccién de enteros System-out-printin( "Contenido de 12 coleccion de enteros:" ); for( Integer iv.) Systen.out.printlac 4 95 // Tmprininos.e1 contenido de 1a coleccién de cadenas Systen-out-printIn( "Contenido de a coleccion de cadenas: For( Strings : al) ‘Systen.out.println¢ s ); La sintaxis también permite a los desarolladores indicar los parimetros que cextienden una clase o implementan una interfz, Esto ayuda a restringr el tipo de pardmetros que acepta una clase, una interfaz oun método, También se pueden utilizar tips parametrzable, tal como se muestra en el ejemplo 1avas09. java, 52_JAVA2: MANUAL DE USUARIO TUTORIAL cua lass Javagos { public static class ClasecT4,T2> ( private TL tipol: private T2 tipe2: public Clase TL tipol, 12 vipod ) ¢ ‘this. cipol = tipo this tipo2 = tipo2i } public T2 getTiporo) { return€ this. pol; } public T2 getTipo20 { return( this.tipe2 ); ? public static void main( Stringl] args ) { ClasecString,Integer> ccadint ‘nen Clase( *Primero",1 ); String ticadint = cCadtnt.getTipolO; Integer t2CadIne ~ cCadint.getT p00; Clasectnteger,Boolean> cIntBol = new Clasecinteger,foolean>( 1, true ); Integer tlint8ol = cIntBo} gett p04 Boolean t2Intéol = cIntBal \getTi poz > ) En el método main(), puede observa el lector la ereacin de dos clases de tipo ‘Clase, una destinada a contener objetos de tipo String ¢ Integer y otra que contend ‘objetos de tipo Integer y Boolean, Del mismo mado se pueden utilizar tipos genéricos a Ia hora de parametrizar una imterfaz o un método de una clase El uso de tipos genéricos no aumenta el tamao del cédigo, ni reduce la complejdad del desarrollo, sino que permite al compilador comprobar el tipo de datos {que integran la colecidn y también evita la necesidad de colocar moldeos explicitos & la hora de manipular los datos de las coleeciones, La utlizacién de tipos. genéticos en lenguaje Java permite el empleo de comodines. Para entender por qué se han incorporado, considere el lector la siguiente clase que define un objeto de tipo Vebiculo y las clases que extienden el objete Vehiculo particularizandolo en objetos de to Automovil y Motocicleta, cada uno de ellos con los métodos arrancar) y parar). public abstract class Vehiculo { abstract public void arrancar(); abstract public void parar();, ) ome CAPITULO“: LENGUMEIAVA 53 class AutonoviT extends Vehicuto { public void arrancarO) { System.out.printin( "El coche esta en movimiento. } wie votd pararO) ( c ‘System.out.printin( "E1 coche esta detenido...” ); } , class Wotocicleta extends Vehicuto { public void arrancarO) { Systen-out-printin( "La moto esta en movimiento public void parar() ( Systen.out.println( "La moto esta detenida } Si hora se crea una aplicacin, Java4i0.java, en la que se declaran colecciones 4 estos objeto, tal como se reproduce en el cddigo siguiente: Vic class Javadio { Mublie statte voldnain( String) args ) ( // DeFinizos un Vector de objetos de tipo AutonoviT Vector coches ~ new Vector motos = new Vector iotacicleta>(); 1/ Niadinos algunos elementos a1 vector mmotos.add( new HotocicletaQ ); mmotos.add( new MotocicletaO ); 11 Ahora arrancanos todos Tos vehicules | // Esta Vinea codigo es 1a que genera el error que se indica de 1 ‘ncompatibiTidad de tipos Vector misVehiculos = coches: U1 Arrancanos Tos dos coches y las dos’ wotocicTetas for( Vehiculo v : misVehiculos ) "vearranearO)} misvehiculos » sotos: For( Vehiculo v: misVehiculos ) vearrancar(); » en tempo de compilacion se producen Ios erores que se muestran: 4 javac Javadi java Javad. avast: incompatible types fein)” naa tetor some > Wired: java-util-Vectoralehiculo> 7 Vector misVehiculos = coches; AL x SOAS. Javatl0.jaya:65: incompatible types found“! java.util vector-Hotocicleta> required: java.util Vector S4_JAVA2: MANUAL De USUARIO ¥ TUTORIAL ei sisvehiculos = motos; Para que la anterior aplicacién funcione, hay que recurir al uso de comodines, simplemente creando el Vector tal como se muestra a continuacin Vectors? extends Vehiculo> wisVehiculos = coches: inl liners (7) es ame, ge jit on a pli ene extents dena tsvberi como un Vcr & lt Spo Gu Ste Weil Loc ice aca gucci! ele Eines densa iseheves como un Vetr gu soe poh cous Oe tp ro Vel Para que un Vector acepte cualquier tipo de objeto pues, se puede utilizar la declaacion Vector, que es distinia de Vector por el mismo motivo indicado en el parrafo anterior. CAPITULO S PROGRAMAS BASICOS EN JAVA En este capitulo se ampli el estudio de los applets, que ya se han presentado en capitulos anteriores. Pero antes de entrar en materia en cuestiin de applets, quiz sea més conveniente aprender los entresijos de la herramienta que proporciona Sun Microsystems para su visualizacién, porque no siempre es seguro que el navegador «ue se utilice para ejecutar el eédigo HTML que contenga la marca APPLET tenga el soporte de todas las earactristicas que se hayan incorporado a la versién de JDK con ue se haya compilado, dada la vertiginosidad con que evolucions la plataforma Java, cosa que si se puede asegurar tratindose del visor de applets, appletviewer, amén de {que para el desarrollador es mucho més cémodo comprobar el funcionamiento de un applet en esta herramienta que en un navegador. EL VISOR DE APPLETS (APPLETVIEWER) El visor de applets (appletviewer) es una aplicacién que permite ver en funcionamiento applets, sin nevesidad de utilizar de un navegador World-Wide-Web (www) como Firefox, Mozilla, Opera, Internet Explorer o Netscape Navigator. En adelante, se recurriri muchas veces a él, ya que el objetivo de este Tutorial es el Jenguaje Java y, como se ha indicado antes, es la forma mis sencilla, rpida, moda y evondmica de poder ver un applet en ejecucién, Applet {La definicion mis extendida de applet, muy bien resumida en su dia por Patrick "Naughton, indica que un applet ¢s "una pequera aplicacién accesible en un servidor Internet, que se transporta por la red, se instala automdticamente y se gjecutain situ como parte de un documento web". Claro que asi la dfinicién establece el entorno 56 JAVA 2:MANUAL DE USUARIO YTUTORLAL oy (lnteret, Web, ete). En realidad, un applet es una aplicacion pretendidamente coria (nada impide que ocupe ms de un gigabyte, ano ser el pensamiento de que se vaa transporar por la red y una mente sensata) basada en un formato grifico sin representacin independiente: es decir, se trata de un elemento a embeber en otras aplicaciones; es un componente en su sentido esticto Un ejemplo en otro ambito de cosas podtia ser el siguiente: imaginese el lector tuna empresa que cansada de empezar siempre a cadificar desde cero, disetia wn formulario con los datos bisicos de una persona (nombre, direccidn, ete.). Tal formulario no ¢s un dislogo por si mismo, pero se podria integrar en didlogos de clientes, proveedores, empleados, ete. El hecho de que se integre esttica (embebido en un ejecutable) 0 dinimicamente (itérpretes, librerfs, DLLs, etc.) no afecta en absoluto a la esencia de su comportamiento camo componente con el cual construit Aidlogos con sentido auténomo. Pues bien, asi es um applet. Lo que ocurre es que, dado que no existe una base adecuada para soportar aplicaciones industriales Java en las que insertar estes rmiiaplicaciones (aunque todo se va andando y ya se pueden encontrar aplicaciones de ‘ste tipo en iniranets), los applets se han construido mayoritariamente, y con gran cierto comercial (a las pruebas hay que remitise), como pequeias aplicaciones imteractivas, con movimiento, lces y sonido... en Inernet Llamadas a applets con appletviewer Al ser un applet una minima aplicacién Java diseRada para ejecutarse en un navegador Web, no necesita por tanta preocuparse por un método main() ni en dénde se realizan las Hlamadas. El applet asume que el cddigo se esti ejecutando desde dentro de un navegador. El appletviewer se asemeja al minimo navegador. Espera coms argumento el nombre del fichero HTML. a cargar, no se le puede pasar directamente lun programa Java. Este fichero HTML debe contener una marca que especifica ¢l cbdigo que cargara el appletviewer: amt “APPLET CODE=HoVaundo.class WIDTH=300 HETGHT=100> caine El appletviewer creari un espacio de navegacién, incluyendo un area grifice, onde se ejecutaré el applet, entonces llamaré a la clase applet apropiada. En cjemplo anterior, el applerviewer cargari una clase de nombre HolaMundo y le perma trabajar en su espacio gritico, La marca APPLET de HTML Dado que los applets estin generalmente destinados a ser ejecutados en navegadores Web, habia que preparar el lenguaje HTML. para soportar Java, o mejot, oman CAPITULO : PROGRAMAS BASICOSENJAVA 5? los applets. El esquema de marcas de HTML y la evolucién del estindar mareado por ‘Netscape hicieron ficil la adicién de una nueva marca que permitira, una vez aiadido cl correspondiente c6digo gestor en los navegadores, la ejecucién de programas Java enellos. La etiqueta APPLET fue definidafundamentalmente por el consorcio World-Wide- Webs; sin embargo, actualmente este consorcio ha reeomendado que en su lugar se ulce la etiqueta OBJECT. A continuacign se descrie la etiqueta APPLET, porque para ‘mostrar la forma de incorporar applets a un documento web, es la forma mis sencilla y directa. Con el JDK de Java, Sun Microsystems proporciona una herramienta que converte de forma autommitica las etiquetas APPLET a la combinacién de etiquetas (JECT y EMBED, para aplicar ls recomendaciones del World-Wide-Web. La sintaxis de las etiquetas y (ancan “ S/APPLET> Atributos obligerorios: CODE: Nombre dela clase principal que implement el applet WIOTH: Anchors inicial del apple en el documenta Wed EIGHT: Altura inical él applet ene! documento Web Arbus opeionates: CCODEBASE: URL base del applet ARCHIVE: archivo JAR que coatiene el spplet empequetado ALT: Texto alternativo MAME: Nombre de la instancia para referencia en otros applets ALIGN: Jusifcacion del applet ‘SPACE: Espaciado vertical SPACE: Espaciado horizontal Los applets se incluyen en las piginas Web a través de la marca , que para quien conozea HTML resultara muy similar a tres marcas de ese enguaje, como |e marca , por ejemplo. Ambas necesitan la referencia a un fichero fuente que no forma parte de la pigina en que se encuentran embebidos. IMG hace esto través de SRC=parémetro y APPLET lo hace através de CODEpardmetro, El parimetro de CODE indica al navegador dénde se encuentra el fichero con el cédigo Java compilado ‘class. Es una loclizacin relativa al documento fuente, Para proporcionar parimetros a un applet, que al fin y al cabo es un programa cjecutable, se define otra nueva etiqueta HTML: , que finaliza la descripcin del applet. Un navegador con soporte Java ignorard todo el texto que haya entre las marcas y , sin embargo, un navegador que no soporte Java ignorar las marcas y presentara el texto que haya entre ells. Se coment6 en pirrafos anteriores que con el JDK se dispone de un conversor para la etiqueta APPLET, que adapta ls lamadas a las recomendaciones del consorcio World-Wide-Web, Ejeutande este conversor sobre el applet HolaMundo, cl resultado {que se obiene es el que se muestra a continua, ML >"CONVERTED_APPLET"=-> 1-— HIM CONVERTER ~-> “param mane = “type” value = “application/x-java-applet; ips versione. 6.0.05°> ‘ coments “enbed ‘ype = “application/x-java-apple ipi-versione1.6.0.08" \, oma {CAPITULO : PROGRAMAS BASICOSENJAVA 39 CODE ~ *WoTaMundo.class” \ wIDTa = 300 \, NeXGHT = 100 scriptable = false pluginspage = “netp://Java.sun.con/praducts/plugin/ index. htslédowntoad”> “noesbed> “ APPLET CODE = S/APPLETS folaMundo.cTass” WIDTH = 300 HEIGHT = 100> <1-~"END_CONVERTED_APPLET" ram En el listado anterior se puede comprobar el uso de las etiquetas OBJECT y EMBED, ceuya combinacién proporciona soporte tanto para Inernet Explorer como para cualquier navegador que cumpla las reeomendaciones del World-Wide-Web como Newscape Navigator 0 Firefo. PASO DE PARAMETROS A APPLETS. El espacio que queda entre las marcas de apertura y cierre de la definicién de un applet se utiliza para cl paso de parmetros al apple. Para ello se utiliza la marca PARAM en la gina HITML para indicar los parimettos y el método getParameter() de la clase javacappletApplet para leerlos en el cédigo interno del applet. La ‘construccin puede repetirse cuantas veces se quiera, una tras ora Los atrbutos que acompatian a la marca PARAM son os siguientes: NAME "Nombre de parimetro que se desea pasar al applet. VALUE Valor que se desea transmitir en el parimetro que se ha indicado antes. Testo HTML ‘Texto HTML que seri interpretado por los navegadores que no entienden la ‘marca APPLET en sustitucion del applet mismo, Para mostrar esta posibilidad, se recurre de nuevo al conocido applet bisico HolaMundo, para modifcarlo y que pueda saludar a cualquiera. Lo que se hari seri pasarle al applet el nombre de ia persona a quien se desea saluda. Se genera el cbdigo para ello y se guarda en el fichero HolaTal. java (4 JAVA2: MANUAL DEUSUARIOY TUTORIAL ‘onan fnport java.awt. Graphics; ‘import Java. applet. applets public class HolaTal extends Applet { String nombre publie void init ( // Ootiene Ta cadena de? pardmetro “nombre” que se Fija en Ta 1 Vianada a1 applet desde 1a pagina hal ronbre'= getParaneter( "Nonbre ); } public void paintt Graphics 9 ) ¢ // Pinta el saludo en la posicién indicada g.dranstring( "Wola “snombres"!™,25,25 ); ) > Al compilar el ejemplo se obtiene el fichero HoTaTal «class que se incluir en Ia siguiente pigina Web, que se genera a partir del fichero HolaTal.htal, en el que s2 incluye el applet, y que tendré el siguiente contenido: Tm “APPLET CODEsHolaTaD class NIDTH=300 HEIG “PARAM NIME= "Hombre" VALUE="Agustin"> S/APRLET> “/nM Evidentemente el lector puede sustitur el nombre por el suyo propio, Este cambio no afectari al ebdigo Java, no seré necsaria recompilatlo para que el applet tenga la deicadeza de saludar al amable lector. Los parimetros no se limitan a uno solo. Se puede pasar al applet cualquier ‘imero de parimetrs y siempre hay que indicar un nombre y un valor para cada uno decllos. El método geiParameter) es fcil de entender. El tinico argumento que necesita es el nombre del pardmetro cuyo valor se quiere recuperar. Todos los parimetros st passin como objetos de tipo String, en caso de necesitar pasarle al applet un valor entero, se ha de pasar como String, recuperarlo como tal y luego converts al tipo que se dese. Tanto el argumento de NAME como el de VALUE dehen ir colocados entre bles coma"), ya que son String FE hecho de que las marcas y sean ignoradas por los rnavegadores que no entienden Java, es inteligentemente aprovechado a la hora de ‘efnir un contenido alternative a ser mostrado en este dkimo caso. Asi la etiqueta e& dodle “APPLET atributos> paranetros Contenido alternative “ PARAM NAME=°Nosbre” VALUE-"AgUSt in"> No veris lo bueno hasta que consigas un navegador S/APPLET>

. [No es de interés el contr la creacién de ficheras CAB; sel lector est interesado, puede consultar le documentacién que proporciona Microsofi. Una vez que se dispone de este fichero, se puede aadir un parimetro CABBASE a la marca : “APPLET NAME<"Hola” CODE="HolaMundo” WIDTH-50 HEIGAT=50 > “PARAM NIME-CABBASE. VALUE="hola. cab"> “ ems ____ CAPITULO s PROGRAMAS BASICOS ENIAVA 69 Ahora que se puede hacer esto con ficheros .cab y .zip, es tarea del lector el trabajo de incorporar los ficheros . jar y poner los tes formats juntos bajo el mismo paraguas dela marca . ESCRIBIR APPLETS JAVA Para escribir applets Java, hay que utilizar una serie de métodos, Inluso para el applet mais sencillo, Son los que se usan para arrancar (start) y detener (stop) la cjecucién del applet, para pintar (paint) y actualizar (update) la pantalla y para capturar la informacin que se pasa al applet desde el fchero hom através de la marca APPLET (getParameter) Los applets no necesitan un método main() como las aplicaciones Java, sino que ddeben implementar (redefinit) al menos uno de los tres métodos siguientes: init), start) 0 paini). init) Esta funcién miembro es llamada una dnica vez al erearse el applet, La clase Applet no hace nada en ini). Las clases derivadas deben sobrescrbir este método para cambiar el tamafio durante su inicializacién, y cualquier otra iniciaizacion de los datos que solamente deba realizarse una vez. Deberian realizarse al menos les siguientes acciones: ‘© Carga de imagenes y sonido. ‘+ Elredimensionado del applet para que tenga su tamatio corecto, ‘ Asignacin de valores a la variables globales, Por ejemplo: public void init { ifC width < 200. || height < 200 ) resize 200,200 ): valor-globall’= 0; valor_global2 = 100; //, cargarenos imigenes en senoria sin nostrarlas // cargarenos misica de fondo en wenor'a sin reproducicla } destroy() Esta funcidn micmbro es llamada cuando el applet no se va a usar mis, La clase Applet no hace nada en este metodo. Las clases derivadas deberian sobeescribilo para hhacer una limpieza final. Los applets multitarea deberin usar destroy() para “matar” {4_AVA2: MANUAL DE USUARIO Y TUTORIAL oma cualquier tarea que pudiese quedar activa, antes de concluir definitivamente la jecucin del applet. start) ‘Llamada para activar el applet. Esta funcién miembro es llamada cuando se visita applet. La clase Applet no hace nada en este método, Las clases derivadas deberian sobrescribirlo para comenzar una animacién, sonido, etc public void start ( ‘estadetenido = false; 11 comencar Va reproduccion de 1a misica msictip.ay0 ‘Tambien se puede ulizar star) para eliminar cualquier tarea que se necesite stop) Liamada para detener el applet. Se llama cuando el applet desaparece de la pantalla La clase Applet no hace nada en este método, Las clases derivadas deberian sobrescriirlo para detner la animacin el sonido, ete public void stop() ( ‘estabetenido = true; VFC/* 250 esta reproduciendo misica? */ ) susicClip.stop0s resize( int width,int height ) El método ini?) deberia llamar a esta funcién miembro para establecer el tamaiio el applet, Puede utilizar las variables anchuray altura, pero no es necesario. Cambiar ef tamafo en oto sitio que no sea ini) produce un reformateo de todo el documento y no se recomienda. width ‘Variable entra su valores el ancho defnido en el parimetro WIOTH de la marca HTML del APPLET. Por defecto es la anchura del iono. height Variable entera, su valores la altura definida en el parimetro HEIGHT de la marca HTML del APPLET. Por defecto es la altura del icono, Tanta width como height estin siempre disponibles para que se pueda comprobar el tamao de applet. ‘Se puede retomar el ejemplo de init) ox {CAPITULO 5 PROGRAMAS BASICOSENIAVA_65 public void init { fC width < 200. || height < 200) resize( 200,200 ); paint( Graphics ) Este método se llama cada vez que se necesita reffescar el ea de dibujo del applet. El método paint) pertenece a a clase Component, que es heredado por varias clases intermedia y, finalmente, es heredado por la clase Applet. La clase Applet simplemente dibuja una caja en el area. Obviamente, la clase derivada deberia sobrescribir este método para representar algo inteligente en la pantalla Para repintar toda la zona del applet cuando llega un evento Paint, se pide el rectingulo sobre el que se va a apicar paint) y si es mis pequeito que el tamafo real el applet se invoca a repaint(), que como va a hacer un update), actualizaré toda la Se puede utilizar paint) para imprimir el mensaje de bienvenida: void public paint¢ craphies 9 ) { g.dranString( "Hota Javal”,25,25 ); 77 Dibujaremos Jas inigenes que necesitenos y update( Graphics g) Esta es la funcién que se llama realmente cuando se necesita actualizar la pantalla. La clase Applet simplemente limpia et area y llama al método paint). Esta funcionalidad es suficiente en la mayoria de los casos. De cualquier forma, las clases, Pero Ia circunstancia explicada antriormente sigue vigénte: no se puede sgarantizar que esto libere todos los recursos y, por lo tanto, que se produzca la finalizacin del objeto, CLASES. ‘Las Clases son lo mis simple de Java. Todo en Java forma parte de una Clase, es una Clase o describe eémo funciona una Clase. El conocimiento de las Clases es fundamental para poder entender los programas Java. Las acciones de los programas Java se colocan dentro del Bloque de una clase 0 tun Objeto. Un Objeto es una instancia de una clase. Todos los métodos se definen dentro del blogue dela clase, Java no soporta funcioneso variables globales. Asi pues, el esqueleto de cualquier aplicacién Java se basa em la definiién de una clase. Todos los datos bisicos, como los enteros, se deben declarar en las clases antes de hacer uso de ellos. En lenguajes procedurales como C la unidad fundamental son los Ficheros con cédigo fuente, en Java son las clases. De hecho son pocas las sentenciag ue se pueden colocar fuera del bloque de una clase. La palabra clave import puede colocarse al principio de un fichero, fuera del bloque de la clase. Sin embargo, el compitadorreemplazara esa sentencia con el contenido del fichero que se indigue, que consstri, como es de suponer, en més clases. La definicin de una clase consta de dos partes, la declaracién y el cuerpo, sein la siguiente sintaxs: DeclaracionClase { Cuerpoclase } La declaracion de la clase indica al compilador el nombre de la clase, la clase de ta que deriva (su superclase), los privilegos de acceso ala clase (publica, abstract, Final) y sila clase implementa o no, una o varias interfaces. El nombre de la clase debe Ser un identificador valido en Java. Por convencién, el nombee de las clases Java ‘empieza con una letra maytiscula, Cada clase Java deriva, directa indirectamente, de la clase Object. La clase padre inmediatamente superior a la clase que se esté declarando se conoce como ‘superclass (superclase), Si no se especitica la superclase de la que deriva una clase, se entiende que deriva directamente de la clase Object (definida en el paquete java lang) En Ia declaracin de una clase se uiliza la palabra clave extends para especificat 4a superclase, de la forma: lass MiClase extends Superclase { 1/ cuerpo de Ta clase } 72_JAVA2-MAMUAL DE USUARIO Y TUTORIAL _ oman Lahherencia de los métodos de acceso a una clase no se puede utilizar en Java para ‘modifica el control de acceso asignado a un miembro dela clase padre, Una clase hereda las variables y métodos de su superclase y también de i superclase de esa clase, ete. es decir, de todo el drbol de jerarquia de clases desde clase que se esti declarando hasta la raz superior del rbok: Objeet. En otras palabras, ‘un objeto que es instanciado desde una clase determinada, contiene todas las variables ‘ymétodos de instancia definidos para esta clase y sus antecesores, aunque los métodes pueden ser modificados(Sobrescritos) en atin lugar. Una clase puede implementar una o mas interfaces, declaréndose esto utilizando |a palabra clave implenents, seguids de la lista de interfaces que implement, separadas por coma (,), de la forma: lass miclase extends SuperClase inplenents Mitnterfaz,Tulnterfaz ( {/Pcuerpo de Ta clase ) Cuando una clase indique que implementa una interfaz, se puede asegurar que proporciona una definicién para todos y cada uno de los métodos declarados en est interfaz; en caso ontario, el compilador generaré errores al no poder resolver los ‘todos de la interfaz en la clase que lo implementa Hay ciera similitud entre una interfaz y una clase abstracta, aunque las definiciones de métodos no estan permitidas en una interfazy si se pueden defini en la clase abstracta. El propésito de las interfaces es proporcionar nombres, es decir, solamente declara Jo que necesita implementar Ia interfaz, pero no cémo se ha de realizar esa implementacion; es una forma de encapsulacién de los protocolos de los métodos sin forzar al usuario a utlizar la herencia ‘Cuando se implementa una interfaz, los nombres de los métodos dela clase deber coincidir con las nombres de los métodos que estin declarados en esa interfa, todos cada uno de ellos, El cuerpo de la clase contiene las declaraciones, y posiblemente Ia inicializacién, de todos los datos miembros, tanto variables de clase como variables de instancia,as\ como la definicién completa de todos los métodos. Las variables pueden declararse dentro del cuerpo de a clase o dentro del cuerpo de un método de la clase, Sin embargo, esta ditimas no son variables miembro de la clase, sino variables locales del método en el que estin declaradas Un objeto instanciado de una clase tiene un estado definido por el valor actual de las variables de instanciay un entorno definido por los métodos de instancia, Es tipico e la programacién orientada a objetos el restringit el acceso a las variables. y om {CAPITULO 6: CONCEPTOS BASICOS DEAVA_73 proporcionar métodos que permitan el acceso a esas variables, aunque esto no es cstrictamente nevesario. Alguna o todas las variables pueden declaarse para que se comporten como si fuesen constants, utilizando la palabra clave Fina Los objetos instanciados desde una clase contienen todos los métods de instancia de esa clase y también todos los métodos heredados dela superlase y sus antecesores. Por ejemplo, todos los objetos en Java heredan, directa o indirectamente de la clase Object; luego todo objeto contiene los miembros de la clase Object, es dir, Ia clase Object define el estado y entomo basicos para todo objeto Java, Las caracterstcas més importantes que la clase Object cede a sus descendientes son ls siguientes: Posibilidad de cooperacién consigo o can otro objeto Posibilidad de conversién automsiica a String, Posibilidad de espera sobre una variable de condicién, Posibilidad de notificacién a otros objetos del estado de la variable de condicign, La sintaxis general de definicin de clase se podria extender tal como se muestra encel siguiente esquema, que debe tomarse slo como referencia y no al pie de la letra NonbredetaClase { 7/ declaracion de las variables de instancia 11 declaracin de Tas variables de 11 clase inetodoDernstancia0{ // variables locales y ¢Séigo y wetadodeLaClaseO) { // variables locales y cSdigo } > Tipos de clases Hasta ahora s6lo se ha utilizado la palabra clave pub ic para calificar el nombre de las clases que se han visto, pero hay tres modificadores mis. Los tipos de clases {que se pueden definir son: public La clases public son accesibles desde otras clases, bien sea directamente o por herencia, desde clases declaradas fuera del paquete que contiene a esas. clases Piiblicas, ya que, por defecto, las clases solamente son accesibles por otras clases ‘declaradas dentro del mismo paquete en el que se han declarado. Para acceder desde ‘otros paquetes, primero tienen que ser importadas. La sintaxis es: ‘¥_JAVA2: MANUAL DE USUARIO V TUTORIAL . i public class miClase extends SuperClase “implenents milnterfaz, ulnterfar { {7 cuerpo de 1a clase y ‘Aqui la palabra clave public se utiliza en un contexto diferente de que se empl ‘cuando se define internamente la clase, junto con private y protected. abstract Una clase abstract tiene al menos un método abstracto. Una clase abstacta no sinstancia, sino que se utiliza como clase ase para la herencia final Una clase Final se declara como la case que termina una cadena de herenca, es lo contrario a una clase abstacta, Nadie puede heredar de una clase final. Por Variables de instancia La declaracin de una variable miembro dentro de la definicién de una clase sin anteponerle fa palabra clave static, hace que sea una variable de instancia en todos los objetos de la clase. El significado de variable de instancia seria, mas o menos, que cualquier objeto instanciado de esa clase contiene su propia copia de toda variable ce instancia, Si se examinara la zona de memoria reservada a cada objeto de la clase, se encontraia Ia reserva realizada para todas las variables de instancia de la clase. En ‘otras palabras, como un objeto es una instancia de una clase, y como cada objeto tiene su propia copia de un dato miembro paricular de la clase, entonces se puede denominar a ese dato miembro como variable de instancia En Java se accede a ls variables de instanciaasociadas a un objeto determinad uilizando el nombre del objeto, el operador punto (.)y el nombre dela variable: si0bjoto.miVar ablebernstancia; Variables estaticas La declaracién de un dato miembro de una clase usando static, crea um variable de clase o variable estvica de la clase. El significado de vatiable estitca es que todas las instancias de la clase (todos los objetos instanciados de la clase) contienen las mismas variables de clase oestitics. En otras palabras, en un moment determinado se puede querer crear una clase en la que el valor de una variable de instancia sea el mismo (y de hecho sea la misma variable) para todos los objetos instanciados a partir de esa clase. Es decir, que exista una tnica copia de la variable de. instancia, entonces es cuando debe usase la palabra clave static lass Documento extends Pagina { static int version = 10; } El valor de la variable version set el mismo para cualquier objeto instanciado de la clase Documenta, Siempre que un objeto instanciado de Documento cambie lt Variable version, ésta cambiar para todos ls abjetos Si se examinara en este caso la zona de memoria reservada por el sistema para ‘cada uno de los objetos, se encontraia con que todos los objetas comparten la misma ‘zona de memoria para cada una de las variables esttica, por ello se llaman también variables de clase, porque son comunes la clase, a todos los objetos instanciados de lachase Se puede acceder a las variables de clase utilizando el nombre de la clase y e! ‘nombre de la variable, no es necesario instanciar ningin objeto de la clase pars acceder alas variables de clase. CAPITULO 6: CONCEFTOS BASICOS DEJAVA_T7 Se accede las variables de clase utilizando el nombre de la clase, el nombre de la variable y el operador punto (.). La siguiente linea de eédigo ya archivist, se utiliza, part acceder la variable out dela clase System, Ene proceso se accede al método iprintn( de ta variable de clase que presenta una cadena en el dispositivo esténdar de salida system.out.printing “Mola, Mundo" ); Es importante recordar que todos los objetos de la clase comparten las mismas variables de clase, porque si alguno de ellos modifica alguna de esas variables de clase, quedaran modifcadas para todos los objetos de la clas. Esto puede utlizarse como una forma de comunicacin entre objets. Constantes En lenguaje Java se utiliza la palabra clave Final para indicar que una variable Entrada en 2 funcion paso¥ Systen-out.printIn¢ "Valor de la variable peinitiva: Systen-out printIn¢ "Valor contenido en el objeto: “+ ‘varkef.varlastancia ); Systen.out.printin( "=> Modificamos os valores” ); varkef varinstancia = 101; varPrim = 201; Systen.out.printIn¢ "--> Todavia en 1a funcion pasoVariables" ); Systen-out printIn¢ "Valor de Ta variable prinitiva: "svarPrim }; Systen.out.printIn¢ "Valor contenido en eT objeto: varkef varTnstancia ); ) public static void main¢ String args{] ) // Tnstancianos un objeto para acceder a sus métodos Sava6Ota0b} = new Java6040;, 7/ Instanciamos un objeto normal Wiclase obj = new MiClaseQ: 7/ Instanclamos una variable de tipo primitivo ables” ); varPria }; {JAVA MANUAL DE USUARIO Y TUTORIAL um fin varPrin = 200; Systen-out-printin( "> Estanos en main()" ); Systen-out.printin( "valor de 1a variable prinitivi Systen-out.printin( "Valor contenido en el objeto: “+ ‘bj-varTnstancia ); {/ UYamanos al método 6e1 objeto a0bj.pasoVariables( varPrin,obj ); System.out.println( "> Volvenos a main)" ); System.out.printla( "Valor de Ta variable primitiva, todavia varPrim system.out.printla¢ “Valor contenido ahora en e1 objet: obj.vartnstancia ); “warPrie J; Los métodas tienen acceso directo a las variables miembeo dela clase. El nombre 4d un argument puede tener el mismo nombre que una variable miembeo dela clase Bn este caso, la variable local que resulta del argumento del método, oculta a ls variable miembro dela clase, (Cuando se instancia un metodo se pasa siempre una referencia al propio objeto ‘que a llamado al metodo, es la referencia this, Constructor El lenguaje Java soporta la sobrecarga de métodos, es decir, que dos o més métodos puedan tener el mismo nombre, pero distinta lista de argumentos en st invocacion. Si se sobrecarga un método, el compilador determinara ya en tiempo de compilacién, en base a lista de argumentos con que se lame al método, cul es le versin del método que debe utilizar, Java también soporta la nocién de constructor. El constructor es un tipo ‘especifico de metodo que siempre tiene el mismo nombre que la clase y se utiliza pare cconstrur objtos de esa clase. No tiene tipo de dato espectico de rtomo, ni siquers void. Esto debe a ue el tipo especifico que debe devolver un constructor de clase sel propio tipo de la clase, En este caso, pues, no se puede especificar un tipo de retomo, ni se puede colocer ninguna sentencia que devuelva un valor. Los constructores pueden sobrecargarse, y aunque puedan contenercédigo, su funcién primordial es inicializar el nuevo objeto que se instancia dela clase, En Java, ha de hacerse una llamada explicita al constructor pra instanciar un nuevo objeto (Cuando se declare una clase, se pueden declarar uno mas constructores opcionales que realizan la inicializacién cuando se instanca (se erea una ocurtencia) un objeto de dicha clase oman CAPITULO 6:CONCEPTOS RASICOS DEIAVA_ #5 Usilizando el eédigo de la seccién anterior, cuando se rea una nueva instancia de (MiClase, se crean(instancias) todos los métodos y variables, y se llama al constructor de la clase: wiClase mes fie = new MiClaseQ; La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new no consume memoria, simplemente es una declaracién de tipo. Después de ser instanciado un nuevo objeto mc, el valor de + en el objeto mc serd igual 10 Se puede referenciar la variable (de instancia) + con el nombre del objeto: ee.itts // inceementa Ta instancia de 4 de nc Al tener me todas las variables y métodos de MiClase, se puede usar Ia primera sintaxis para llamar al método Suma_a_ if uilizando el nuevo nombre de clase me: nc-Suma_aiC 10 ); vy ahora la variable mc. vale 21 Luego cuando se instancia un objeto, siempre se hace una llamada directa al constructor como argumento del operador new. Este operador se encarga de que el sistema proporcione memoria para contener al objeto que se va a crear. Sino se proporciona explicitamente un constructor, el sistema proporcionard uno por defecto que inicializaré automticamente todas las variables miembro a cero 0 su ‘equivalent, en Java. Se puede pensar en el constructor de defecto como un método que tiene el mismo ‘nombre que la clase yuna lista de argumentos vacia, Si se proporciona uno o mis constructores, el constructor de defecto no se proporcionard automdticamente y si fuese necesaria su ubizacton, tendria que proporeionarlo expictamente el programa, Las dos sentencias siguientes muestran e6mo se utiliza el constructor en Java para Aeclarar,instanciary, opcionalmente, inicilizar un objet: Wiclase miobjeto ~ new MiClaseO; Wiclase miObjeto = new MiClaseC 1,2,3 3 Las dos sentencias devuelven una referencia al nuevo objeto que es almacenada cn fa variable i0bjeto. También se puede invocar al constructor sin asignar la referencia a una variable. Esto es iil cuando un método requiere un objeto de un tipo seterminado como argumento, ya que se puede inclu una llamada al constructor de este objeto en la llamada al metodo imetodo( new MiConstructor( 1,23 ) i 6_JAVA2: MANUAL DE USUAMO ¥ TUT Aqui se instancia ¢ inicializa un objeto y se pasa a la fimeién. Para que 1 programa compile adecuadamente debe existir una version de la funcién que espere recibir un objeto de ese tipo como parémeto, Cuando un método o una funcién comienza su ejecucién, todos los parimeteos se ‘rean como variables locales autométicas. En este caso, el objeto es instanciado en ‘conjuncién con la Hamada ala funciéa que sera ttizada para inicalizar esas variables locales cuando comience la ejecucién y Inego serén guardadas. Como son automiitica, ‘cuando el método concluye su ejecucién, sera marcado para su destrucién. En el siguiente ejemplo, 1ava60s. java, se ilusran algunos de los concepts sobre constructors que se han planteado en esta seecidn. class Miclase { int varinstancia: 1/ Este es el constructor parametrzado Wiclasec int dato) ¢ // ReVenanos a variable de instancia con Tos datas que se pasan 17 al constructor Varlnstancia = dato; void vervarinstanciaQ_( Systen.out.printIn( "El Objeto contiene "+ varnstancia }; } ? Tass Javasos public static void aain¢ String argst]_) { Systen.out.printin( "Lanzando 12 aplicacion” ); 77 Instanciamos un objeto de este tipo Vanando al constructor 1/1 de detecto Sava6as. obj = new 32va6050; // Llanamos ala funcion pasindole un constructor paranetrizado 11 como, pariietro ‘bj mune fun new MiCTABe(100) 9: } // fsta funcién recibe un objeto y Vana a uno de sus métodos para 1/ presentar en pantalla el dato que contiene el objeto ‘oid miFuncion( MiClase objeto ( objeto. verVarinstancia(); } ) HERENCIA. En casos en que se vea involucrada Ia erencia, los constructores toman wn, significado especial porque lo normal es que la subclase neceste que se ejecute el constructor de la superclase antes que su propio constructor, para que se inicialcen correctamente aquellas variables que deriven de la supercase, La sintaxis pare oma __cAPiTULo 6 cONCEFTOS BASICOS DELAVA_#7 conseguir esto es sencilla y consiste en incluir en el cuerpo del constructor de lz subelase como primera linea de eédigo la siguiente sentenc super paranetros_opcionales ); Esto hard que se ejecue el constructor de la supercase, utlizando los parémetros que se pasen para Ia inicalizacin, En el ejemplo Java606.java, se ilustra el uso de «sta palabra clave pura llamar al constructor de la superclase desde una subelase. Si super no aparece como primera sentencia del cuerpo de un constructor, el ccompilador Java insertard una llamada implicta, super(), al constructor de la superclase inmediata. Es decir, el constructor por defecto de la superclase es invocado aulomaticamente cuando se ejecuta el constructor para una nueva sublase si no se «especifiea un constructor parametrizado para llamar al constructor de la superclase, CONTROL DE ACCESO El control de acceso también tiene un significado especial cuando se trata de constrctores. Aunque mas adelante se trata a fondo el tema del control de acceso, con referencia a los constructores se puede decir que el control de acceso que se indique determina la forma en que otros objetos van a poder instanciar objtos dela case, En la siguiente descripcin, se indica cémo se trata el control de aeceso cuando se tienen entre manos a los construtores: private ‘Ninguna otra clase puede instanciar objetos de la clase. La clase puede contener métodos piblicos, y estos métodos pueden construir un objeto y devalverlo, pero nadie mas puede hacerlo, protected Solamente la subclass dela clase pueden cea instancas deel public CCualguier otra clase puede crear instancias e a case. package [Nadie desde fuera del paquete puede constrair una instancia de la clase. Esto es lil sise quiere tener acceso a las clases del paquete para crear insancias dela clase, pero sin que nadie més pueda hacerlo, con lo cual se restringe quién puede crear instancias de la clase, ‘Una instancia de una clase, un objeto, contene todas las variables y métodos de instancia de la clase y de todas sus superclases. Sin embargo, se puede sobreseibir un metodo declarado en una superclase, indicando ef mismo nombre y misma lista de argumentos 1 JAVA2 MANUAL DE USUARIO Y TUTORIAL cum Si una clase define un método con el mismo nombre, mismo tipo de retomo y misma lista de argumentos que un método de una supercase, el nuevo métod sobeescribiri al método de Ia superlase, utilizandose en todos los objets que se creen en donde se vea involucrado el tipo de lasubclase que sobrescrie el método Finalizadores Java tiene una forma de reeuperarautomiticamente todos os objetos ques salen el mbito de la clase. No obstante, proporciona un método que, cuando se especifique «nel cOdigo de la clase, lamar al recclador de memoria (garbage collector): U/ Cierra el canal cuando este objeto es reciclado protected void FinalizeO { close; ) Cada objeto tiene ef método finalize), que es heredado de la clase Object. i se necestase realizar alguna limpieza asociada eon la memoria, se pod sobcescrii el método finalized) y colocar en él el eédigo que sea necesaio. El método finalize) siempre se invocara antes de que el recictador de memoria libere la zona de memoria ocupada por el objeto, pero no hay garantia alguna de que el reciclador de memoria reclame la memoria de un determinado objeto, es decir, no hay ‘aranta de que el método finalize) sea invocado. La regla de oro a seguir es que nose debe poner ningin ego que deb ser ejecta en el método finalize). Por ejemplo, ise necesita coli a comunicaion con un servidor cuando ya no se va a usar un objeto, no debe ponerse el céigy de desconexién en el método finalize), poraue puede que munca sea lamado. Luege, en Java, es responsabilidad del pogramador escribir metodos pra realizar limpieza que no involuere ala memoria ocupada po el objeto y eecutarlos en el instante presi. Eh modo finalized el revislador de wcinoia sot ies para ibe la mera eb play debera restingisesu uso solamente a eo, y no depended ellos pa reizar singin oto tpo de limpiea. No obstante, Java dispone de dos métodos que permiten asegurarse de la jecucin de los finalizadores. Los dos métodas habilitan Ia finalizacién ats sia de la aplicacién, haciendo que los finalizadores de todos los objetos que tengan Finalizador que todavia no hayan sido invocados autométicament, se eecuten anes de que la Maquina Virtual Java concluya la ejecucién de la aplicacién Estos dos métodos son: ‘run inalizersOnExt{ booTean ), método esttico de java.lang Runtime, y runFinalizersOnEvt{ boo ean ), método esttico de java.lang System CAMITULO 6: CONCEPTOS BASICOS DEJAVA_# ‘Una clase también hereda de su superclase el método finalize), y en caso rnecesario, debe lamarse una vez que el método finalize) de la clase haya realizado las tareas que se Ie hayan encomendado, de la forma: super Finali2e0 En ls construccidn de un objeto, hay que desplazarse por el irbol de jerarquia, de herencia, desde laraiz del drbol hacia las ramas, yen la fnalizacién, hacerlo al revés, los desplazamientos por la herencia deben ser desde las ramas hacia las superclases hast llegar ala clase rai. CONTROL DE ACCESO Java implementa cuatro especificadotes de acceso: private, public, protected y package Po; lo tanto, cuando se crea una nueva clase en Java, se puede espeificar el nivel de acceso que se quiere para las variables de instancia y los métodos defindos en la clase: private, protected, public y package. La tabla siguiente muestra el nivel de acceso que esté permit a cada uno de los cspecificadores: Nivel de Asseso cla subelme __pagute tos private x protected x x x Public x x x x package x x Si se profundiza en el significado de ta tabla, se podira observar que la columna clase indica que todos los métodos de una clase tienen acceso a todos los otros miembros de la misma clase, independientemente del nivel de acceso especificedo, La columna subelase se aplica © todas las clases heredadas de la clase, independientemente del pagueteen que residan. Los miembros de una subelas tienen acceso a todos los miembros dela superclase que se hayan dsianado como public. Elastrisco (+ en I interseeciinsubclase-protected quiere decir que si ua clase es ala vez subclasey esti en el mismo paquete que la clase con un miembro protected, enionees la clase tene acceso a ese miembro protegido En general, sila subelase no se encuentra en el mismo paguete que la superclase, no tiene acceso a los miembros protegids de la superclase. Los miembros de una subclase no tienen acceso a los miembros de la superclase catalogados como private © package, excepto a los miembros de una subclase del mismo paguete, que tienen acceso a los miembros dela supercase designados como package. 90_JAVA2 MANUAL DE USUARIO ¥ TUTORIAL ems La columna paguete indica que las clases del mismo paguete tienen acceso a ls miembros de una clase, independientemente de su drbol de herencia. La tabla indica que todos los miembros protected, public y package de una clase pueden set accedidos po ota clase que se encuentre en el mismo paquete. Colocando dos 0 mis clases en el mismo paquete se hace que larelacién Friend, de amistad, se extienda 2 todos los métodos de las clases, es decir, si eres amigo de uno de os miembros de una familia, seris amigo autométicamente de todos y cada un de os componente de esa familia, La columna odos indica que los privilegis de acceso para meétodos que no estin en la misma clase, ni en una subclase, ni en el mismo paquete, se encuentrn restringids alos miembros piblics dela clase Si se observa la misma tabla desde el punto de vista de las filas, se pueden escribir los ealiicadores de los métodos, private private String NuneroelDocunentoDeldentidad; Las variables y métodos de instancia privados s6lo pueden ser accedidos desde dentro de la clase. No son accesibles desde las subclases de esa clase. Hay que resaltar, una vez mis, que un método de instancia de un objeto de una clase puede acceder a todos los miembros privados de ese objeto, o miembros privados de ‘cualquier otro objeto de la misma clase, Es decir, que en Java el contol de acceso ‘existe a nivel de clase, peo no a nivel de objeto de la clase. Una cuestion interesante puede plantearsea la hora de declarar una clase private © Final, porque en ninguno de los casos se permite que las clases sean sobreserita, Sin embargo, hay diferencias entre ambas posibilidades. Las clases derivadas 10 pueden sobrescribir un método private por disefio, mientras que la palabra clave final indica al compilador que las clases derivadas no pueden sobrescribir un metodo partir de ese nivel. Como private indica que ya no se pueden sobresribir métodos, el uso de private y final juntos es redundante; no causaré problemas, pero 10 Jmplica nada, ya que todo método private es considerado automiticamente como final public public void CualquieraPuedezcceder(0() CCualquier case desde cualquier lugar puede acceder a las variables y métodos ée instancia pablcos. ome _caPirun9: CONCERTOS BASICOSDEIAVA. 1 protected protected void Solosubclases()4 Sélo las subclases de la clase y nadie més pueden acceder a las variables y métodos de instancia protegidos. Todas las clases de un paguete pueden ver os méiodos protegidos de ese paquete. package void MetodoDeMi Paquete() {} Por defecto, sino se especifica el control de acceso, las variables y métodos de instancia se declaran package, lo que significa que son accesibles por todos los ‘objetos dentro del mismo paquete, pero no por los externos al paquete Aparentemente, parece lo mismo que protected; la diferencia estriba en que la designacion de protected es heredada por las subclases de un paguete diferente, mientras que la designacién package no es heredada por subclases de paquetes diferentes Debido a la complejidad y posible confusién respecto alos niveles de proteccién {que proporciona Java para permitir el control preciso de la visibilidad de variables y métodos, se puede generar otra tabla en base a cuatro categorias de visibilidad entre Jos elementos de clase: wivate_sinmodifcador protected _ pubic ST SE Misma clase sl St Misma subclase de paquete No ST st st Misma no-subelase de paquete No ST st st Subelase de diferente paquete No NO st st Novsubclase de diferente paquete «NO-NO et YY una guia de uso indicara tener en cuenta lo siguiente: ‘+ Usar private para métodos y variables que solamente se uti clase y que deberian estar ocultas para todo el resto sn dentro dela ‘+ Usar public para métodos, constantes y otras variables importantes. que mune rmeronsagic of S57 7 fo AtrayListctntegersO, "5.95 17 Uso de auteboxing EL compilador automit Ferrier automiticamenteafadiré el céigo necesaio para rela a carte lott 5, en a clase Integer que le comesponse,ullzand> i terstca de awtoboxing de Java, ‘ El programa Java608. java valores objets eon 08 5a¥a hace uso dels conversions implicit para xr in *pondientes alas clases auxiliares de los tipas primitives, para geen a ee se caw [CAPITULO :CONCEPTOS BASICOS DEIAVA_97 Mediante las conversiones implicitas se elimina la necesidad de conversién plicit de tips primitvos a fas clases corespondientes y viceversa, no siendo rvesaria esa cantidad de cédigo extra para llevar a cabo las conversiones. Les Conversiones implicit hacen la programacién mis sencilla, pero el desarrollador {ebe tener presente que oculta la creacion de objetos. Por ejemplo, en la ejecucin del Siguiente eddigo, la creacion de objeto se realizar solamente la primera vez que se {jeeue, en las siguientes se uilizard la copia, porque con los valores entre -127 y 128 (byte, short e int) se utiliza un caché y no se crearin objetos nuevos con el mismo org int in vista.add¢ , En estas conversiones no se llama a new sino al método valueO/) de las clases ausiliare, con 1o cual los programas son menos intensives en el uso de ls memoria ‘demas, esta capacidad afiadida a Java es una caracteristica de conveniencia que permite un e8digo mas claro y aumenta le productvidad, 1< 20; tee) CLASE OBJECT La clase Object, como se ha indicado en ocasiones anteriores, es la clase raiz de todo el arbol de la jerarquia de clases Java, y proporciona un cierto numero de rétodos de utiidad general que pueden utilizar todes los objetos. La lista completa se puede ver en la documentacién del API de Java, aqui solamente se trata algunos de alos El método equals() public boolean equa7s( Object obj 35 Todas Ins clases que se definan en lenguaje Java heredarin el método equals(), que se puede utilizar para comparar dot objetos. Esta comparacién no es Ie misma que proporciona el operador =, que solamente compara si dos referencias a objetos ‘puntan al mismo objeto. El método equals() se utiliza para saber si das objetos distntos son det mismo ‘ipo y contienen los mismos datos. EI método devuelve true si os objets son iguales y false en caso contrari. El sistema ya sabe de antemano cémo aplicar el método a todas las clases estindar 4 todos los objetos de los que el compilador tiene conocimiento. Por ejemplo, se pwede usar directamente para saber si dos objets String son iguales. Las subclases pueden sobrescribir el método equals() para realizar la adecuada ‘comparacin entre das objetos de un tipo que haya sido definido por el programador. 8_1AVA2: MANUAL DEUSUARO Y TUTORIAL Ze rae En I apicaci de ejemplo Yava609 java, se sobescribe el méodo para compan dos objetos de Ia nueva clase que crea la aplicacién, = En is eager el fd nyu slew pent tim One Si me de two em epost ge Sas no aa Shean ono sed En el ejemplo, una vez que se ejecuta, es necesario hacer un moldeo del argumento al tipo de la clase antes de intentar realizar la comparacin, Se utiliza s{ ‘operador instanceof para confirmar que el objeto es del tipo correcto. Uno de les objets proporcionados para comprobar su equivalencia es de tipo errno (String) y el método sobrescito equals) indcaré que noes un objeto equivalent. class Java60a ( int wiDato; 1/ Constructor paranetrizado Javas03¢ int dato.) { iniDato = dato; } public static void aain(Steing args) ) ( 7/ Se instancian Tos sbjetos gue s€ wan a testear Javasos ebjt = new dvatoN( 2) 3ava69 0b}? = new Javaso9e 2 9; 3609 9b)3 = pew Java09¢ 3) Serna obit abet String 3 realizan Tas cmprobiconesy se presenta por pantalla (7 el resultado de cat'una de elses Desens: Pr Panel Systencout.printn( "jt eqs obj? obj1.equals( obj1 ) Systen-out printing "oj equals eh)2: “eubyL-equals¢ 0b)2 3 > Systen-out-printn( "ot equals 0b}3: “vabyL-equalst 0b)3 ) Spon Brnt I "01 als OE ob} abate oh) ) // Se sobrescribe e1 nétodo equals() override public boolean eouals( object ara ) ¢ // Se comprueba que el argunento es del vipo adecuado y 1/, que no es rulo. Si Yo anterior se cumple se realiza 17 1a conprabacion de equivatencia de los datos. 71 Oosérvese que se ha empleado e1 operador instanceof Hf (Garg t= mull) a8 (arg instanceof Javaso3) ) { // Nacenos un woldeado del Object general a tipo Java609 43ava609 temp = avas0s)arg; 1/ Se reatiza 1a comparacion y se devuelve el resultado return ts.aate oe ens else ( 11 No es del tipo esperado return( false ) ) ) d oon ____“carirunoe-concertos mAsicosEsAVA 99 El método getClass() public final native Class getClass; En Java existe la clase Class, cuyas instancia representan las clases e interfaces «que est eecutando la aplicacin Java. No hay un constructor para la clase Clas, sus ‘bjetos son construidos autométicamente por la Maguina Virtual Java cuando las clases son cargadas,o por llamadas al método defineClass() del cargador de clases. El método gerClas() de la clase Object se puede utilizar para determinar la clase de un objeto, Es decit, devuelve un objeto de tipo Class, que contiene informacion Jmportante sobre el objeto que crea la clase. Una vez determinada la clase del objeto, se pueden utilizar los métodas de la clase Class para obtener informacién acerca del objeto como cual es su nombre o eémo se lama su supeelase. [Adems, habiendo determinado la clase dl objeto, el método newlnstance() de la _lase Class puede invocarse para instanciar otro objeto del mismo tipo. El resultado es aque el operador new ser uilizado con un constructor de ua clase conocida, Hay que hacer notar que la dtima afirmacién del parrafo anterior es una situacién que el compilador no conoce en tiempo de compilacién, es decir, no sabe el tipo det ‘objeto que va a ser instanciado. Por lo tanto, si se necesita referencia al nuevo objeto, cs necesario declarar la variable de referencia del tipo genérico Object, aunque el ‘objeto actual tomara todos los atributos de la subclase actual por la que serd instanciado, El método getClass) es un método final y no puede ser sobrescrito, Devuelve un objeto de tipo Class que permite el uso de los métodos definidos en la clase Class sobre ese objeto. El programa Java610.java, ilustra alguna de estas caracteritics, Primero, instancia un objeto, mira la clase de ese objeto y utiliza alguno de los métodos de la clase Class pata vbtencr y prescntarinformacién aecrea del objeto. Luego, pregunta al usuario si quiere instanciar un nuevo objeto, instanciando un objeto de tipo String en un caso 0, en el otro caso, se aplica el método getClass?) a un objeto existente y ulizando el método newlrstance() se instancia un nuevo objeto del mismo tipo. El método toString) public String tostringO; La clase Object dispone de este método que puede usarse para converts todos los ‘objetos conocidos por el compilador a algin tipo de representacién de cadena, que depender del objeto, 100_JAVA2: MANUAL DE USUARIO Y TUTORIAL eter elmo tring) ea el exerci cnn ag forma similar, si se aplica el método, toString?) al objeto Thread, se pucde oben, informacion importante acerca de las {areas y presentarla como cadena, oe class avasia ¢ 1 Se deFinen Tas v String’ uno: String dos; String tres; fariables de instancia para Ta clase 1 Constructor de 1a clase Java6 LC String a, String BySteing ¢ ) { dos = bi; tres = cy Public static void main¢ String args 4 Se instancia un objeto de la tla Sava)" ee ava tora Present el objeto utiTizando el Stcsas ar System cat printIn¢ obj.toString() ); oo Uf Solorescritura del método toString of sabres do t0StringO) de 1a clase object Public String toString 1/ Convierte‘an objeto a cadena earn aor" "dost" everee ye , ¥ To dewelve Otros métodos Hay otros metodos tiles en la clase Object que se ¢ste Tutorial. Porejemplo,elmétado MS Wan en otras seccones de protected vid Fis ee; ue sect nel arta de fnalicabres. 0 ani ropa dae unfacrguvasdetng e bli fina void weg; PIN Fal naive vid malt Jong tint; Dublic final native void motify(): public Final native void motifyAtiC); ‘2 5 tata cuando se describ la mulitara(madreadig) en av, en APMTULO S: CONCERTOS BASICOSDEJAVA_ 01 CLASES ABSTRACTAS ‘Una de las caracteristicas mas iiles de cualquier lenguaje orientado a objetos es la posbilidad de declarar clases que definen cémo se uilzan solamente, sin tener que implementar métodos, son las clases absiractas. Mediante una clase abstracia se intenta fijar un conjunto minimo de métodos (el comportamiento) y de atributos, que pemitan modelar un cierto concepto, que sera refinado y especalizado mediante cl rmecanismo de la herencia. Como consecuencia, la implementacién de la mayoria de los métodos de una clase abstracta podria no tener significado. Pare resolver, Java proporciona los métodos abstractos. Estos métodos se encuentran incompletos, slo cuentan con la declaracién y no poseen cuerpo de definicién, Esto es muy itil cuando la implementacién es espevfica para cada usuario pero todos os usuarios tienen que utilizar los mismos métodos. Un ejemplo de clase abstracta en Java es la clase Graphics: public abstract class Graphics ( public abstract void drawl ineC int x1,int yl,int x2,int y2 J; public abstract void drawval( int x,int y,int width, int height 3; public abstract void drawAre( int x,int yvint width, ‘nt height, int startangle, int arckngle 3; Los métodos se declaran en la clase Graphics, pero el cédigo que ejecutaré el inétodo esti en algin otra sitio: public class MiClase extends Graphics ( public void drawLine( int x1,int ylyint x2,int y2) { } } Cuando una elase contiene un método abstract tiene que declrarse abstracta. No obstante, no todos los métodos de una clase abstraca tienen que ser abstracts. Las clases abstractas no pueden tener métodes privados (no se podrian implementat) nt tampoco estiticos. Una clase abstracta tiene que derivarse obligatoriamente, no se puede hacer un new de una clase abstract, INTERFACES, Los métodos abstractos son ttiles cuando se quiere que cada implementacién de la clase parezca y funcione igual, pero necesita que se cree una nueva clase para Utilizar esos métodos abstractos. Las interfaces proporcionan un mecanismo para abstrae los métodos a un nivel superior, lo que permite simular la herencia miltiple de otros lenguajes de programacin, Una interfaz sublima el concepto de clase abstracta hasta su grado mas alto, Una interfaz podri verse simplemente como una forma, es como un molde, solamente 1W2_JAVA2: MANUAL DEUSUARIO TUTORLAL tons permite declarar nombres de métodos, listas de argumentos, tipos de retomo y adicionalmente miembros datos (los cuales podrin ser inicamente tipos bisicos y serin tomados como constants en tiempo de compilacion, es decir, static y Final), Una interfaz contiene una coleccién de métodos que se implementan en ato Tuga. Los métodos de una interfaz son public, static y Final La principal diferencia entre interface y abstract es que una inteaz proporciona un mecanismo de encapsulacién de los protocolos de los métods sin forzar al usuario a ulizar la herencia. Por ejemplo: public interface Videotlip ( 7/ comienza la reproduceion del video void playO; V7 reproduce el clip en un bucle void bucleQ: V1 detiene 1a reproducctin void stop; } Las clases que quieran utilizar la interfaz. VideoClip utilizarin la pala ‘implements y proporcionarin el cédigo necesario para implementar los métodos que se han definido paral interfaz Class MiClase inplenents VideoClip { void playO ( ‘cadigo> } void bucled ( ‘cdg } wid stop ( ) la interface es como si se hiciese una accién de ierfaz, con To cual no se hereda nada, solamente se AL utilizar implements. copiar-y-pegar del codigo de ‘pueden usar Tos metodes, La ventaja principal del uso de interfaces es que una interface puede ser implementada por cualquier nimero de clases, permitiendo a cada clase compart a imterfaz de programacién sin tener que ser consciente de la implementacién que hagan las otras clases que implementen la interface. Class MiotraClase implements Videoclip ( void playO ( } void bucte ( } void stop ( oma CcaPITULO 6 CONCEPTOS BASICOS DEJAVA 13 4a constante que corresponds al color de que se trate. Lo cierto es que esto tira un poco por tera el paradigma de los objtos, pero hace cf eédigo mas lepible. peat CAPITULO 8:CONCEPTOS BASICOS DE JAVA_107 PAQUETES La palabra clave package permite agrupar clases ¢ interfaces. Los paquetes se utlizan en lengusje Java de forma similar a ebmo se utilizan las lbreias en otras Jenguajes, para agruparfunciones y clases. Los nombres de los paquetes son palabras separadas por puntos y se almacenan en drectoris que coinciden con esos nombres Por ejemplo, los ficheros siguientes, que contienen c6digo fuente Java: Applet. java, AppletContext. java, Applet Stub. java, AudioCTip. java contienen en su cbdigo la linea package java.applet; Y las clases que se obtienen de la compilacién de los ficheros anteriores se encuentran con el nombre nonbre_de_clase.class, en el directorio: java/applet En el Tutorial de Java de Sun Microsystems, se indica que “Ios ficheros .class del paquete java.util estén en un directorio llamado uti de un directorio java, situado en alin lugar apuntado por CLASSPATH’ CLASSPATH es una variable de entomo que indica al sistema dénde debe buscar los ficheros .class que neceste. Sin embargo, lo que dice el Tutorial de Java de Sun, normalmente no es asi, Io cual puede ocasionar confusién. Cuando se utiliza ka plataforma Java 2, no existe el directorio que se indica; es més, no es necesaria la declaracin de esta variable de entorno. La no existencia se debe a que Java tiene la capacidad de buscar ficheros comprimidos que utilicen la tecnologia zip (Ios ficheros con extensién JAR utilizan este tipo de tecnologia de compresién). sto redunda en un gran ahorro de espacio en diseo y ademés, mantiene la estructura de directorios en el fichero comprimida. Por tanto, se podria parafrasear lo indicado por Sun escribiendo que “en algin lugar del disco, se encontraré un fichero comprimido (ipo jar) que contiene wna gran cantidad de fcheros .c1ass. Antes de haber sido comprimidos, las ficheros .class del paquete java.util estaban situados en wn directorio llamado util de un directorio java Estos ficheros, junto con sus estructura, se almacenan en el fichero comprimido que debe encontrarse en algi lugar apuntado por CLASSPATH’ ‘A la hora de crear un paquete hay que tener presente una serie de ideas: |. La palabra clave package debe ser la primera sentencia que aparezca en el fchero, ‘exceptuando, claro est, los espacias en blanco y comentarios. 2. Bs aconsejable que todas las clases que vayan a ser incluidas en el paquete se encuentren en el mismo directorio. Como se ha visto, esta recomendacicn se la ‘puede uno saltar la torera, pero se core el riesgo de que aparezcan determinados {Ht W642 MANUAL DE USUARIO ¥ ORAL ot Problemasdifciles de resolver ‘omy : ae ‘ora de compl, en el supuesto caso de ue 3. Ante todo, ecord 0 i ome rela rt gue en un Fiche nicamente puede exist, como maxino, ta cle con cl eestor deste an aor de cso pb, debe sticohy Fichero con el nombre dela clase oe Import Los paquetes de clases se cargan o one el pagute cone, 2" 2 In palabra clave taport, especificand | lizando un astern TAY Hombre de clase, Se pueden car vars lo import java.oate; ‘import javacawts I uso del astersco debe ha feoeare Es asain tr3¢0, se cargarn todos ls paquetes To. que haré todavia sieccin, solamente ce ee erico no tiene inp alguna ne import Miclase; Paquetes de Ja CAPITULO 7 CLASES JAVA AVA En un lenguaje orietado a objetos, las clases definen cualquier objeto que se pueda manipula. Java tiene muchas clases tiles, no slo aquellas que se ulizan pars srificos y sonido, usadas en la construccién de applets y mucho mis conocidas, En ste capitulo se descrben algunas de la clases que integranellenguae Java y qe proporcionan caracteristicas especiales, como el acceso ditecto a funcioncy mmateméticas © a las propiedades del sistema operativo en el que se ejecta la splicacin Java. En la descripeién de las funcionalidades que proporciona cada una de la clases descrits, se incluyen aplicaciones de ejemplo, de las cuales solamente se ‘eproducen las partes de cédigo relevantes a dichas funcionalidades, o se deveribe e1 fancionamiento de la apicacién. El lector debe recur al soporte digital que {compari este Tutorial para vere ego fuente de los ejemplos ens ttalidad, que se encuentran profusamente comentados para ayudar ala comprension de cade uta de las sentencas, LA CLASE MATH {a clase Math representa Ia lbreia matemitica de Java, Las funciones que Contiene son las de todos los lenguajes, parece que se han metido en una cltee solamente a propésito de agrupacién, por eso se encapsulan en Math, y lo mismo {tede con las dems clases que corresponden a objetos que tienen un tipo equivalente (Character, Float, etc). El constructor de la clase es privado, por lo que no se {ieden crear instancas de la clase. Sin embargo, Math es pubic para que se pueda "lamar desde cualquier sito y static para que no haya que incilizara, a anv Mn DDE USUARIOY TUTORIAL one Funciones matematicas Si se importa la clase, se tiene acceso al conjunto de funciones matemitics estindar: Math.abs( x ) Math.sin( double a) Math.cos( double a) Math.tan( double a ) Nath.asin( double r ) Nath.acos( double + ) Nath.atan( double r ) Math. atan2(double a, Double b) ath.exp( double x ) Nath. 10g¢ double x ) hath. sqrt( double x ) Yath.ceil( double a) para int, 1ong, Float y double ddevuelve el seno del angulo aenradianes ddevuetve el coseno del nul a enradianes ddevuelve la tangente del ngulo a en radianes devuelve el nguo cuyo seno es ddevuelve el ngulo cuyo coseno es ¢ devuelve el angulo cuya tangent es devuelve el dngulo cuya tangent es a/b vuelve eclevado a x LA CLASE CHARACTER Al trabajar con caracteres se nevesitan muchas funciones de comprobacién y traslcién. Estas funciones estin englobadas en la clase Character. De esta clase si que se pueden crear instancias, al contrari de To que sucedia con la clase Math, La primera de las siguientes sentencias creari una variable caricter y la segunda un objeto Character: char Character C; A partir del J2SE 5, el lenguaje Java dispone de soporte Unicode 4.0. Los caracteres adicionales se codifican como pares de valores UTFI6, que generan un caticter distinto 0 codepoint En general, cuando se utlice una secuencia de caracteres o un objeto String, el APL de Java manejara los caracteres de modo transparente a la aplicacién. Sin embargo, el tipo char todavia permanoce con 16 bits, con lo cual aquellos métodos {que utilizan char como argumentos, disponen de versiones complementarias en las «que se acepta un valor int para poder representa ls caracteres Unicode, La clase Character tiene métodos para recuperar elcaricter actualy el siguiente, para asi poder recuperar el caricter Unicode. Por ejemplo, String u = "\uos4o\u0co8" Systen.out.printin€ us "'~ " su.Tength) >; System out printIn( Character isHighSurrogate( u.charat(0) ) ): Systen.out.printin( Cint)u.charAtl) 9; LAS CLASES DE TIPOS NUMERICOS Cada tipo numérico tiene su propia clase de objetos. Asi el tipo Float tiene el ‘objeto Float, al igual que double dispone de su propia clase Double, int de Integer, ‘ong de Long y boolean de Boolean. Dela misma forma que con la clase Character, se han codificado muchas funcionesitiles dentro de los métodos de estas clases. La clase Float dispone de métodos para realizar comprobaciones: boolean b = Float.iswaN( F boolean b = Float, nFinitel f 5 EI método isVaN) comprueba si Fes un No-Niimero. Un ejemplo de no-nimero es raiz cuadrada de 2. [H2_JAVA2 MANUAL DE USUARIO YTUTORIAL crs La especificacin del IEEE para la coma flotante trata a estos dos valores de forma muy especial, y en el siguiente ejemplo, Java704.java, se crean dos obje‘os Double, uno es infinitoy el otro es un no-nimero. lass Java704 { public static void aain( String args(] ) ( Double di = new Double 1/0.) Double 2 = new Double 0/0, ): Systen.out.printIn¢ él + ":'" + dl.istafiniteQ +", "+ 1-15¥aNO) 9; Systen.out.printIn¢ a2 6": " + a2.tsinfiniteO +", "+ 2-15NaNO D3 Siseejecuta este programa, la salida obtenida es la siguiente: % java Java704 Infinity: trve, false NaN: false, true LA CLASE STRING Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y StringBuffer. Un objeto String representa una cadens alfanumérica de un valor Constante que no puede ser cambiada después de haber sido creada. Un objeto StringBuffer representa una cadena cuyo tamafio puede variar, o bien puede ser ‘modificada por programa, Los objetos de tipo String son objetos constantes y, por lo tanto, muy baraios para el sistema. La mayoria de las funciones relacionadas con cadenas esperan valoes String como argumentos ydevuelven valores String, Hay que tener en cuenta que las funciones estticas no consumen memoria ce ‘objeto, con lo cual es mis conveninte usar Character que char. No abstant, char 3° ‘sa, por ejemplo, para ler fcheros que estn escrito desde otro lenguaje. Existen varios constructores para crear nuevas cadena string; String( String value 9; String¢ char value} String( char valuel], int offset, int count ; Steing( byte asciif]int hibyte’); String( byte asciiL]int hibyte,int offset,int count); String( StringBuffer buffer );, Tal como uno puede imaginarse, las cadenas pueden ser muy compleis, existiendo muchos. métodos ities para trabajar con elas y, afortunadamente, la ‘mayoria estin codificados en la clase String, por lo que seria conveniente que et programador tuviese una copia de la declaracién de la clase String sobre st mesa de cx APiTULO 7-CLASES JAVA 133 trabajo, para determinar el significado de los pardmetros en los constructores y métodos de la clase. Fs mis, esta necesidad puede extenderse a todas las dems clases, pero claro, teniendo en cuenta el espacio disponible sobre la mesa de trabajo. Hay que resaltar el hecho de que mientras que el contenido de un objeto String no puede modificarse, una referencia a un objeto String puede hacerse que apunte a otro objeto String, de tal forma que parece que el primer objeto he sido modificado. Esta caracterstca es la que ilustrael ejemplo Java706. java, class avaros { ‘String cadena = "ESTA CADENA SE LLAMA cadena"; Sering cadena? = “esta cadena se Vana cadena2"; public static void main( steing args(] ) ¢ 3ava706 obj = new Java7050); System. out. printia( "Los valores originales de las cadenas sor systen.out.println( obj .cadenat ); systen-out printIn¢ bj cadena? ; Systen.out. printIn( "Reemplaza cadenal con otra cadena” ); (bj. cadenal = obj.cadenal +" "+ obj. cadena2; Systen-out.printla( "Presenta el nuevo valor de cadenai Systen-out printIn¢ bj .cadenat_); Systen-out printIn( "Fiaaliza eV programa" ); } Es importante resaltar que la siguiente sentencia no modifica el objeto original refetenciado por la variable str: {this0bj.stel = thisObj.stel +" " + thisObj.ser2; sino que esta sentencia crea un nuevo objeto que es la concatenacién de los objetos existentes, y hace que la variable de referencia str apunte al nuevo objeto en lugar ‘de apuntar al objeto original. Ese objeto original queda marcado para que el reciclador de memoria en su siguiente pasada devuelva la memoria que ocupaba al sistema Una reflexién especial merecen los arrays de objetos String, La siguiente sentencia declarae instancia un array de referencias a cinco objetos de tipo String. String miArray = new String(S]: ste aray no contiene los datos de las cadenas. S6lo reserva una zona de memoria para almacenar las cineo referencias a cadenas. No se guarda memoria para almacenar los earacteres que van a componer esas cinco cadenas, por lo que hay que reservar expresamente esa memoria la hora de almacenar los datos conetetos de las eadenas, tal como se hace en la siguiente linea de cbigo: ‘iArray{0] = new String( "Esta es 1a primera cadena” ); miarray(1) = new String( “Esta es Ta Segunda cadena” LM JAVAZMAWUALDEUSUAROYTUTORAL tae Con frecuencia se necesita convertir un objeto cualquiera a un objeto String, Porque sea necesario pasarlo @ un método que solamente acepte valores String, o 3¢ ‘cualquier otra razin. Todas ls clases heredan ef método toString) de la clase Object '¥ muchas de ellas To sobrescriben para proporcionar una implementacién que tenga ‘sentido para esas clases. Ademiés, puede haber ocasiones en que sea necesarig sobrescribir el método /Siring?) para clases propias y proporcionarles un método de conversion adecuado, La clase String posee numerosas funciones para tansformar valores de ots tipos de datos a su representacién como cadena. Todas estas funciones tienen el nombre de vuiue0Y, estando el método sobrecargado para todos los tipos de dios bisicos. Ahora bien, la conversion contraria de valor numérico de un tipo bisieo a cadena no tiene métodos en Java, Las clases que encapsulan a los tipos besos Aisponen det método roSiring() heredado de Object, que convierte el valor que representan a un objeto de tipo String, LA CLASE STRINGBUFFER La clase StringBuffer dispone de muchos métodos para modifica el contenido 4e los objtos de tipo StringBuffer. Si el contenido de una cadena va a ser modificado cen un programa, habri que sacrificar el uso de objetos String en benefcio de StringBuffer, que aunque consumen mas recursos del sistema, permiten ese tipo de ‘manipulaciones. La clase StringBuffer puede utilizar en un entorno multtarea sin problemas, pero si en la ejecucin de la aplicacion Java se puede asegurar que solamente habe ‘una taea, un inico shread, entonces puede utlizarse la clase StringBuilder, que ¢s bisicamente idéntica a StringBuffer, con la diferencia de que no es thread safe, con lo cual no tiene fa sobrecarga que implica el control dela concurrencia necesario en un entormo mutitarea, Al estar Ia mayoria de las caracteristicas de los objetos StringBuffer basadas en su tamaio variable, se necesita un nuevo método de creaci: StringBuffer(; StringbufferC int Yength ); StringBuffer String str): Se puede crear un StringBuffer vacio de cualquier longitud y también utilizar un ‘String como punto de pata para un StringBuffer. StringBuffer Dos = new Stringbuffer( 20 ); StringBuffer Uno = new StringBuffer “Hola Mundo” ; StringBuffer Cero = new StringBuffer); Parece, aparentemente, mis efectivo si se conoce la longitud final del objeo, indiarla cuando se intancia el objeto, que dejar que el sistema instance el objeto ean (caPiTULO 7-CLASES JAVA_115 us longitu por defeto Iuego acer que se increment, en tiempo de eecucén, fando se manipule el objeto. Esto se muestra en la siguientes sentencis, que sili el métodolengeh) del clase String para hacer ls cosas mas interesante (un Simple enter indicando el tamafto del objeto StringBuffer habria fncionado iqualmente Stringduffer str = new Stringbuffer("Stringbuffer de prueba”. 1engthO): Str-apoend( "StringBuffer de prueba” );, Cambio de tamaio EE cambio de tamafio de un StringBuffer necesita varias funciones espevificas para manipular la Jongitud de ls eadenas: int length; Chae charAt( int index ): void getchars( int srcBegin, int srcEnd,char dst], int dst8egin 3; {oid setLength( int newlength ; oid seecharAt¢ int index,char ch ; ne eapacityO: oid ensureCapacity( int mininusCapacity ); int reverseQ; I método capacity) es particularmente interesante, ya que devuelve la cantidad de espacio que hay actualmente reservado para el objeto StringBuffer, en contraposicién al método lengeh(), que devuelve la cantidad de espacio ocupado por objeto StringBuffer. Modificacién del contenido Para cambiar el contenido de un StringBuffer, se pueden utilizar dos métodos: append) ¢ insert). En el ejemplo Java707. java, se muestra el uso de extos dos métodes: class Java707 ( public static void aain( String args{] ) ( 1/ Crea un StringBuffer inicializado un texto por defecto StringBuffer str'= new StringBuffer( “Tutorial” ); // Le concatena otro texto, ‘string Ste-append¢ "de Java™); 7/ nprine en consola el resultado de 1a concatenacién System.out.printIn¢ str); U6 JAVA2:MANUAL DE USUARIO Y TUTORIAL alts Operadores de concatenacién Hay que recordar que los operadores "s" y "+=" también se pueden aplicar cadenas. Ambos realizan una concatenacién y estin implementados con objeos StringButfer. Por ejemplo, la sentencia: Steing 5 = "Que" +" tal?"s ¢ interpretada por el compilador como: String 5 = ‘nen StringbuFfer().append( “Qué” ).append( * tal?™ ).toStringO: y se marcara el StringBuffer para borrarlo, ya que el contenido pasa al objeto String También, la sentencia $62" por abit: seria interpretada por el sistema como: string s = ew SteingBuffer().append( s ).append(" por ahi!" ).tosering(; ¥ volveria a marcar para botrar el nuevo StringBuffer utlizado para crear el objeto String LA CLASE STRINGTOKENIZER La clase StringTokenizer proporciona uno de lo primeros pasos para realizar un anilisis gramatical de una cadena de entrada, extrayendo los.simbolos que se eneuentren en esa cadena. Si se tiene una cadena de entrada cuyo formato es regula se desea extraer la informacién que esth coifcada en ella, StringTokenizer es cl punto de partida, Para utilizar esta clase, se necesita un String de entrada y un String que indiue cl delimitador a utilizar. Los delimitadores marcan la separacién entre los simbolos {que se encuentran en fa cadena de entrada. Se considera que todos los caracteres de a cadena son delimitadores vilidos; por ejemplo, para <,;:> el delimitador puede ser luna coma, un punto y coma 0 dos puntos. El conjunto de delimitadores por defeto son los caracteres de espacio habituales: espacio, tabulador, linea nueva y retorno de Una vez. que se ha creado un objeto StringTokenizer, se utiliza el métolo rnextTokend) para ir extrayendo los. simbolos consecutivamente. El métolo /hasMoreTokens() devuelve true cuando todavia quedan simbolos por extract, CAPHTULOT:CLASES JAVA_117 En el ejemplo Java708. java, se crea un objeto StringTokenizer para analizar gramaticalmente parejas del tipo “clave-valor” de un String. Los conjuntos consecutivos de parejas claveevalor, van separados por dos puntos (:). class Java708 { String cadena jionascastellano:" + vaditoraRA-MA:" + ‘autor=Agustin Froufe:” + “ermal Tofroufesservidorcorreo.es ‘twlosTutorial de Java: + public static void aain( String args{] ) ( StringTokenizer st = new Stringokenizer( cadena, white St-hashoreTokens©) ) £ String clave = st.nextToken( String valor ~ st.nextToken System. out-printIn¢ clave + } } > + valor): Y la salida de este programita tan sencillo, una vee ejecutado se presenta en la reproduccién siguiente: 4 java Java703 ‘titulo Tutorial de Java ‘dion castellano editor RAMA autor Agustin Froufe e-mail froufedservidorcorreo.es EI uso de StringTokenizer presenta un problema cuando intervienen cadenas vacias. Por ejemplo, el siguiente trazo de cédigo: U/ Nay dos comas consecutivas separando cada cadena StringTokenizer st = new StringToken’zer("Esto,es,una, ,cadena",", shileC stshasMoreTokens() ){ ‘System. sut-printin( st-nextToken© 3 ) ‘generar a salida que se reproduce a continuacién: sto cadena Es decir, no se ha respetado ta cadena vacia, lo cual puede representar un problema cuando esas cadenas vacas deban ser preservadas, Usilizar StringTokenizer para detectarlas hace el e6digo més complejo, por ello, fa clase String proporciona el método splii). Utlizando la invocacién a este método, el ‘digo anterior se podria rescribir de la forma: 18_JAVA2: MANUAL DE USUARIO Y TUTORIAL _ String(} tokens = String. split(",","Esto,es,una, cadena”); Fort String s: cokens ) { ‘systea.out.printin¢ § ); y 4 la salida generada por la ejecuci6n de este cbdigo si respetaria la presencia de la ‘cadena vacia, EI método split) tiene la venaja aadida de que soporta expresiones regularss ‘como argumento para indicar el deimitador de separacién entre los elementos ¢ ‘obtener dela cadena origen EXPRESIONES REGULARES En las aplicaciones que se desarollan en cuslquierlenguaje, y por tanto también ‘en Java, suele ser necesario algiin tipo de procesamiento de texto, ya sea para buscar palabras, para vaidardirecciones de eocreo electrnico, para comprobar claves, para asegurar el formato correcto de datos que se vayan a introduciren una base de dats, incluso para tareas mucho més complejas como puede ser et comprobar la integridad de un documento XML. Todas estas taeas se realizan através del reconocimiento y ccomprobacién de patrones en las cadenas de texto; tarea en la que la claie ‘StringTokenizer dispone de métodos como charAr() que permiten ese procesamient, ‘No obstante, el céidigo que se obtiene es complejo y muy dificil de seguir. Para subsanar esta circunstancia, fa plataforma Java 2 dispone de un paguete destinado al uso de expresiones regulaes,javautiLregex; que permite realizar todo lo anteriormente expuesto y que incluso permite Ia utlizacién de metacaracteres, 0 comodines, ptoporcionando una gran versatlidad a la manipulacién de as cexpresiones, Una expresiin regular es un patron de carateres que describe a un conjunto de cadenas, El paguete regex se puede emplear para busca, presentar 0 modifica algur, 6 todas, las apariiones de un determinadopatrin de caracteres en la cadena de text La forma més simple de una expresiin regular es una cadena de texto, por ejemplo "Tuorial” 0 "Java", La comprobacién del texto utilizando expresionss repulares permite también comprobar si ese texto est escrito siguiendo una forma sintictca especifiea; por ejemplo, en el caso de una direecin de correo electri imprescindible la presencia del carter @ con una palabra (al menos) a cada lado de se caricter. Para crear expresiones regulars se utilizan eractres especiales y ondinatos. Las earacteres especiales permitidos son Walter cay com {CAPITULO 7-CLASES JAVA U9 cualquier otto caricter que aparezca en una expresion regular y no vaya precedido de Inbar invertda, \, se considera un carter ordinario, Los caracteres especiales se utilzan para propésits especifics. Por ejemplo, el cardter punto (.) indica cualquier caricter, excepto el de mueva linea, De este modo, si aparece Ia expresién regular p.pa en una bisqueda, se encontrarian correctas palabras como papa, pipa, popa o pupa. Las expresiones que se utilizan en el paquete regex siguen la sintaxis del lenguaje Perl, por lo que en Java se puede utilizar esa misma sintaxis, Si el lector no esta familiarizado con este lengua, deberd recurrr ala documentacin del API de Java, en donde se describen todas las construcciones admitidas en la creacién de expresiones regulars, Una expresin regular se representa en Java através de una instancia de la clase Pattern; por tanto, una expresidn regular especifcada en la cadena correspondiente creada en base a caracteres ordinarios y especiales, debe se inicialmente compilada en une instancia de la clase Pattern. E1 resultado obtenido se usari para crear un objeto de tipo Matcher que seri el encargado de comprobar cualquier secuenciaarbtraria de caracteres contra esa expresion regula, EI método compile) de la clase Pattern es el encargado de compilar la cadena correspondiente ala expresin regulary convertirlaen un patrén, El método matcher() «ea un objeto que seré el que comprucbe la entrada que se le pase contra ese patri EI método partern() devuelve el patrén resultante de la compilacion de la expresién regular. Estos son los métodos mas interesantes dela clase Pattern Las instancias de la clase Matcher se utilizan para comprobar secuencias de caracteres en busca de aquellas que coincidan con el patein correspondiente a la cxpresion regular. La entrada de esta instancias se proporeiona através de la intefaz ‘CharSequence que soporta una gran variedad de fuentes de datos, de modo que todas ‘eas fuentes de datos dispongan de un formato uniforme y de acceso en modo s6l0 lectura para ser accesibles mediante objetos de tipo Matcher. Un objeto de tipo Matcher se crea pati de un pati invocando al método matcher) de la clase Pattern, Una ver creado, e pueden utiliza los métodos dela clase Matcher para realizar operaciones como la bisqueda de la coincdencia completa dela secuencia de earacteres de entrada contra el patrén mediante el método ‘naiches). También se puede buscar la primera aparcin del patna partir del nico de la secuencia de caracteres, utlizando el método lookingdt), para seguir luego tascando la siguiente apriién del patina través del metodo find) Cada uno de los métodos anteriores devuelve un booleano indicando el éxito 0 fracaso de ta bisqueda de coineidencias, aunque también se pueden invocar métodos «specificos de objeto Matcher para consultar el estado, |a0_JAVA21 MANUAL DEUSUARIO TUTORIAL ore La clase Matcher también define métodos para permitrreemplazar 10s petones de las expresiones regulares que se encueniten por nuevas cadenas de texte, i) ejemplo Java709. java realiza la comprobacién de una direccién de corroy clectrénico, asegurindose de que la cadena de caracteres que se pasa es una dieccin, de correo electrnico valida. No se trata de un ejemplo exhaustivo que comjruci. todas las posibles incoherencias en las direcciones de correo elect6aico, sino ung simple muestra para que el lector pueda fumilirizarse con el uso de las expresiones regulares, El ejemplo 32va710. java imprime los comentarios de una sola linea que se encuentran incluidos en un fichero de cédigo. Para uilizaro, el lector debe indiar | fichero que contene el cédigo fuente del que quiere extaer los comentarios, por defecto, se usa el propio fichero de eddigo del ejemplo. El eédigo del ejemplo es muy simple. Crea el patrin de bisqueda en base a los ‘aractresullizados en Java para delimitar ls comentarios de una linea, las dos baras, inclinadas, //; abr el fchero de c6digo fuente, utiliza un canal para recuperar | contenido y 1 conirasia con el patrén. Cade vez que se encuentre un comentao, caviar ala pantalla, LA CLASE FORMATTER La clase Formatter proporciona al lengua Java la posibilided de formatcar Ix salida de los programas, soportando formatos numéricos, de cadena, de fechas y hora, de mensajes localizados para el pas de ejecucin de la apicacin e inluso permite |a justiticacion o alineacin det texto. Si el lector es programador desde hace aos, Probablemente la descripcin anterior le recuerde a la maravillosafuncién del lngusje C pring). Y asi es, Java recupera las caracterisicas de esa funcidn y tambin su ‘nombre, deforma que todo lo que la func prin) podia hacer en C, ahora lo puede hacer en Java ‘Systen.out.printf( *Ninero decimal: %.2F" numero ): ‘Asumiendo que numero es un nimero en coma flotante, este sentencia inca al compitador que debe presentarlo con al menos dos digitos en la parte decimal de! mero (coloeando ceros si fuese necesario) El método print) también a sido incorporado a la clase PrintStream, una de cuyas implementaciones mas comunes es System.out. La clase Java7LT muesta unt serie de ejemplos en donde se uilizan ls earacteristcas que proporciona esta clase. Class Java7i ( public static void main¢ String args} ) 1/ Enviams todos Tos mensajes a.un objeto de tipo Avpenable StringBuilder sb = new StringBuilder) // Creanos. un objeto de tipo Formatter, fjando GERNAKY como 1/ Locale para que se formatee el numero con la coma "," CORO 1 separador decinal cum ____capiruno r-cuases ava 121 Formatter fat = new Forsatter( sb,Locale.CERMARY ); Uf Eavianos un nimero decimal 2 Ta salida ‘Float nun = 123456.07F; frt.Format( "El nlimero’es: X(,.2*,nun 3; Systen-out.printin¢ sb); // Envianos la fecha actual. Xa se utiliza para saltar a 1a U7 siguiente Vinea System-out.format( "Fecha actual: iste de #1St@ de aSt¥xa", ‘Calendar getinstanceO ); // Envianos la hora actual en formato de 12 horas. tn se utiliza V/ para saltar ala siguiente Vinea Systen-out.format( "Hora actual: tr" Calendar.getInstanceO ); 7/ Favianos 1a hora actual en formato de 24 horas 2ull Systen-out. format( "Hora actual: tT",Calendar.getinstance() ); ¥ Eluso de la clase permite que en lugar de concatenar cadenas, como en: sering ronbreConpleto = nosbre +" " + apelTido; sea posible describ la salida y proporcionar argumentos que se coloquen en tos lugares convenienies de ese cadena de slide: sombreConpteco = ysten. out .ariacf( “KINs 325 Et raago de opciones de formato va desde algo como 7.4F para indicar le precisa y longited de un nimero decimel,« %tT para dar formato a una hora 0 #383 para indicer el tercerargumento de tipo cadena. Pare indicar una mueve linea, aunque se acepta el cardcter estindar de Unix “\n", para facilitar la ejecucién en cualquier plalaforina, se recomienda utilizar %. Le documentacin del API de Java indica todos Jos formats disponibles Por tanta, el métode printf) viece a seemplazar a printin), de modo ue en lugar 4e utilizar la concstenacién para construir la cadena de salida, se colocan los mareadores de formato que posteriarmente serén sustituidas por los valores comrespondientes de los argumentos. Estos marcadores incluyen meta-informacién para especificar el formato y fos valoces que tomien, colocdndose despues de la cadens {que indica el formeto, como en el caso de una secuencia variable de arguments en la invocacin de un método. La ufilizacién de la clase Formatter implica la ereacién de un cbjeto de tipo Appendable pars almacener la salida y la invoeacién del método prin), 0 del metodo formar(), para colocar el contenido formateado en ese objeto Hay muchos objetos que implementan la interfaz Appendable y para utlzarlos con Formatter basta con pasarios como argumento al constructor de Formatter. Ea, ‘ejemplo anterior se utiliza la clase StringBuilder en lugar de StringButTer, porque la ejecucin de la aplicacion se produce en una Gnica tarea, Al constructor de [22_JAVAZ: MANUAL DE USUARIO Y TUTORIAL Formatter también hay que pasarle el Locale que se utilizaré para que formas contenido de acuerdo ala caracterstcas del pais que corresponda a ese Locale, Una vez creado el objeto Formatter, ya se puede invocara su método prin) coq una cadena conteniendo el formato y la lista de argumentos. Si se necesita util yp Locale diferente al indicado en el constructor, el método prinf) dispondra de ung forma en la que se puede fjar el Loeale a utilizar en la llamada. En secciones anteriores se ha indicado que la clase PrintStream conte: as defiiciones de objeos como System.out y System.err para poder escribir ena iis cetindar yen la salida de error, respectivamente, Ahora Java intoduce mis ‘onstructores y métodos para soportar el formateo de la sala. Proporciona el mois ppend{) que implementa la interfaz Appendable, por lo que no se puede Ihmar dlirectamente, aunque si se pueden invocar directamente los métodos forma) y pring, que permite el uso de la posibilidad de indicar un niimero variable argumentos. La clase String dispone de dos métodos estticos format), que funcionan de forma semejante a pring); envian una cadena indicando wn formato, os argumests 4, opcionalmente, un Locale, con lo que se genera una salida en la cus ls ‘rgunentos son convertidos al formato que se especifca. En este caso, como sea ‘de métodos de la clase String, devuelven un objeto de tipo String, mientras que en ‘aso anterior los métodos enviaban {a salida @ cualquier objeto de tipo Strean. E| ntodo formar) de la clase String no hace nada espectacular, simplemente evita ner ilizar un objeto Formatterdirectamente y la ereacion de un objeto inteneiio Si el desarollador quiere incoporar capacidades de formateo a ss props css ‘mediante Formatter, entones es cuando enra en juego la interfaz Formatabl, ue obliga a implementa el método formato, cuya defniién es void formatTo( Formatter formatter. int flags.iat width, int precision ) El ejemplo Java712. java muestra el uso de la interfaz Formattable en e qe se rea una clase con Ia propicdad mensaje, que se imprime en la salida estar, controlando la anchura yjustificacin de la cadena de slid. La cjecucidn de est apicacion genera las lineas que se reproducen sepuidamsis En las dos primeras se puede observar la diferencia entre wilizar el método toString) © recurir al uso de Formatter y en ls siguientes se muestra el efecto que prose las opciones de control de anchura yjusificacién 4 java Javari2 Corta: Java7i2e12981F Gena Corta: "Tutorial Cadena Larga: "Tutorial de Java’ Gadena Larga: Tutorial Cadena Larga: "Tutorial -APITULO 7 CLASES JAVA 125 LA CLASE SCANNER Esta clase facta la tarea de leery analizarcadenas y tipos hsicos de datos en las plcaciones, incorporando para ello el uso de expresiones regulares.. La clase Java713 presenta en pantalla el texto del fichero que se pase como argumento en la invocacién. Si se compils el fichero Java713. java y se ejecuta, la splicaciOn solicitaré el nombre de un fichero de texto y presentaré en pantalla su contenido completo En el eédigo de la clase se puede observar que la parte mis importante es la creacidn de un objeto de tipo Scanner a partir del objeto Fle, originado por la carga {el fichero de texto que se indique en la lina de comand, El objeto Scanner divide «contenido del fchero en base aun delimitador, que en el ejemplo es el fin de linea: sino indica ninguno, por defecto se utilizar el espacio en blanco. Observe el lector que hay otras opeiones para detectar l final de una linea, por cjemplo, se podria comprobar mediante los caracteres de retoro de carro y nueva linea usando a expresion “\r\n\n" y también se podrian utilizar los métodos restLineO y hasNextLine() dela propia clase Scanner. Un cambio muy simple en el patrén utilizado en el delimitador empleado por Scanner proporciona mucha flexbilidad, Por ejemplo, si se indica el delimitador \\2", Seanmer leer el fichero de una sola vez, circunstancia que puede set comeniente en ciertas ocasiones, como a la hora de leer el contenido completo de una poina web sin crear varios objetos intermedios. El cédigo siguiente correspondiente a la clase Java714, que permite imprimir el contenido de una pégina web, leera el contenido completo de la pigina principal dela web de Sun dedicada a Java, URL FT = new URLC "hetp://java.sun.com” > UWcomection conn = url openConnection(); Scanner se'= new Scanner(-conn.getInputSerean() ): seaueebeliniter€ “WEF ScinextO); En resumen, una vez creado un objeto de tipo Scanner, se pueden utilizar los rmétodos mextXxx( para extraer el tipo de variable que se espera, aunque hay dos apreciaciones. La primera es que la clase Pattern se puede utilizar para crear una cexpresin regular utiizada como token. La segunda es que el método nextLine() ‘anza hasta pasada la linea actual y devuelve todos los datos de la linea en un objeto ‘etipo String, _ LA CLASE PROPERTIES Hay ocasiones en que es necesario que el sistema sea capaz de leer atrbutos __‘eterminados de ese sistema, asi como de leer y/o modificaratributos especficos dela aplic ion, Los mecanismos que Java proporciona para resolver estas tareas son tres USUARIO ¥ TWTOWAL jmentos en la linea de comandos, parimetros en seine Comandos,parimetros en la Wanda @ applets y jy, Ls Propiedad: defien enor passe, edi pe 2 tvs de as Prope au sen erro ena a oe eas ley aus kenge es proper sp estin ejecutando, mientras que los applets tienen este acceso denegado (si condiciones normale, sn el uso de applets rma). voces at limitado al servidor desde el que ha sido descargado. he ff rograma Java715.java instanca un objeto Properties para presentar ex alla Tas Propiedades por defect del sistema don a rama is Py or defecto del sistema donde se ejecute. Su cio comples class Java7is { public static void main( String args(] ) { 1] Instancia y presenta un objets Hope ies 7 11 Vas caractectsticas del Steen ed Properties obj = new Properties( Systen.getPro DaDeTTSEe seg, am POpertiesSysten.getProperties()): ) 1 Como se puede observa, lo fundamental en este programa son ls dos lineas de cucpo del método en donde se instncia un objeto Properties y se listen le Fropiedades por defeco del sistema que conten ee objeto. Las Propiedad de sitema ew mame dad, / Imaero dao psn oer anand a stl gPrperii) dea se Sten més poe ce a sig lula pr visalarceend a Ps DT:CLASESIAVA 125 Una vez que se ha creado un objeto Properties para el programs, se pueden ardar en un dispositive de almacenamiento fijo utilizando el método save/) y psteriormente recuperarlos a través del método load). Las Propiedades del sistema soa mantenidas a través dela clase System. LA CLASE RUNTIME Esa clase encapsula el proceso del intérprete Java que se eceute, No se puede ceear una instancia de Runtime; sin embargo, se puede obtener una referencia al cbjeto Runtime que se esté ejecutando actualmenteHlamando al metodo esttco Runtime geRuntime(). Los applets y otros fagmentos de cédigo de los que se 0) System-out-println( System.getenv( args[0) ) ); ) > Ejecutando la aplicacién pasando como parimetro la variable de entomo PROCESSOR_IDENTIFTER, la. aplicaciOn realiza la llamada al método getenv() e imprime el valor actual de la variable. La salida producida por la ejecucién de la aplicacién en el ordenador de autor se reproduce a continuacin: 1 java Java717 PROCESSOR IOENTIFTER x86 Farily 15 Model 3 Stepping 4, Genvinelnte? La plataforma Java 2 proporciona dos versiones del método getenv(), la primera «la vista anteriormente y la segunda es Ia que devuelve la pareja formada por la variable de entorno y el valor que contiene. La aplicacién Java718. java devuelve todas las variables de entorno del sistem class java7is ( public static void main¢ String args{] ) ( For( Map.Entry variable: Systen.getenv() entryset© ) ( Systen.out.println(variable.getkey(}+" / "+variable.getvalueQ); } 2 Entrada/Salida estindar La clase System proporciona automaticamente, cuando comienza la ejecucin de un programa, un canal para leer del dispositivo estindar de entrada (normalmente, et teclado), un canal para presentar informacidn en el dispostivo estindar de salida (normalmente, la pantalla) y otro canal donde presentar mensajes de error, que es el Aispositivo estindar de error (normalmente, la pantalla). Los tres eanales o streams de entrada/salidaestin controlados por esta clase y se referencian como: System.in cntrada estindar Systen.out salida estindar system.err sada de error estindar Las variables intermas de la clase System out y err son de tipo PrintStream, es Tista = new ArrayListestring>Q; Vista.add¢"Vinea 1° ) Vista.add¢ “Vinea 2" ) Tista.add¢ "Tinea 3°): Tista.add¢ “Tinea 4" 93 1/ Greamos €1 iterador que utiTizarenos para recorrer Ta Vista Teerator iterador = lista. iterator; for€ int 10; iterador.hasNextO; i++ ) £ String elemento = (String)iterador.next(); //-Intencamos elininar et tercer elemento’ de a Vista fC elenento.equals(Tinea 3") ) { 7/ Gta Tinea provoca una excepcign al elininar el elemento de 17 Rio ConcurrentModi Ficat ionéxception, VistacrenoveC 1); 1) Si'se comenta 1a Vinea anterior y se descomenta a 1 siguiente, se elimina 12 excepcion 1 iterador.renoveO; } U/ Taprimimos 1a Vista original Systen-out-printin¢ elemento ); } Uf Anprininos 1a Vista sin el elemento eliminado antes ‘terador = Vista.iteratorQ) while( iterador.hasHext© ) Systen.out-printin(."->"+iterador.next() ); ) d Si el lector ejecuta la aplicacién, obtendri una excepeién de tipo ConcurrentModificationException, provocada al intentareliminar un elemento de la lista mientras se iteraba sobre ella. Tanto las implementaciones de la lista como el iterador permiten detectar el problema. Sin embargo, es posible eliminar de forma

You might also like