Welcome to Scribd!
Academic Documents
Professional Documents
Culture Documents
Hobbies & Crafts Documents
Personal Growth Documents
Java 2 PDF
. [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 ) i6_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 argumentos1 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, solamente1W2_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 tresUSUARIO ¥ 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