anaya.multimedia.la.biblia.de.java.2

922
d. t.. , - &y;?% -

Upload: alex-cordova

Post on 15-May-2015

2.110 views

Category:

Documents


9 download

TRANSCRIPT

  • 1. d.-&y;?%-,t..

2. Indice .Introduccion. ............................................................................................. 23Contenido del libro ......................................................................................... 24Requerimientos ............................................................................................. 25Otros recursos ................................................................................................ 26.1 Java bsico............................................................................................ 29Todo sobre Java ........................................................................................... 30 Orgenes del lenguaje Java ....................................................................... 32Todo sobre bytecodes ............................................................................... 32 La seguridad del lenguaje Java .................................................................33 Programas Java .......................................................................................34 Es Java 2 o Java 1.2? .............................................................................. 37Adquirir e instalar Java .................................................................................. 37 Qu ocurre con CLASSPATH? ................................................................ 38Cules son las novedades de Java 1.1? ......................................................... 39Qu est censurado en Java 1.1 ? ................................................................... 41Cules son las novedades de Java 2? ............................................................. 41Qu se censur en Java 2? ........................................................................... 44Escribir cdigo: creacin de archivos de cdigo ............................................. 44 3. Escribir cdigo: conocer las palabras reservadas de Java................................ 45Escribir cdigo: crear una aplicacin .............................................................. 48 public class app ...................................................................................... 49 public static void main[String[] args) ........................................................ 50 System.out.println("iHola desde Java!"); ................................................... 51Compilacin ................................................................................................... 51Compilacin: utilizando opciones en la lnea de comandos ............................ 52 Opciones de compilacin cruzada .............................................................. 55Compilacin: revisin de los mtodos censurados ..........................................55Ejecucin del cdigo ...................................................................................... 56Ejecucin de cdigo: utilizar las opciones de la lnea de comandos ...............59Conocimientos bsicos: comentar el cdigo ................................................... 61Conocimientos bsicos: importando paquetes y clases Java ........................... 64Conocimientos bsicos: buscar clases Java con CLASSPATH ...................... 66Crear applets ................................................................................................... 69Ejecutarapplets ...............................................................................................71Crear aplicaciones ventana.............................................................................. 72Ejecutar aplicaciones ventana ......................................................................... 73Diseo de programas Java ..............................................................................74 Rendimiento .............................................................................................. 75 Mantenimiento ........................................................................................... 75 Extensibilidad .......................................................................................... 76 Disponibilidad ........................................................................................... 76Distribucin del programa Java ...................................................................... 77.2 Variables. arrays y cadenas..................................................................79Variables ....................................................................................................79Tipos de datos .................................................................................................81Arrays ............................................................................................................. 82Cadenas........................................................................................................... 85De qu tipo de datos disponemos? ................................................................ 87Creacin de literales enteros ...........................................................................88Creacin de literales en coma flotante ...........................................................89 ..Creacion de literales booleanos.......................................................................91Creacin de literales carcter .......................................................................... 91Creacin de literales tipo cadena ....................................................................93Declaracin de variables de tipo entero ....................................................... 93 4. Declaracin de variables de tipo coma flotante ............................................... 94Declaracin de variables de tipo carcter ....................................................... 95Declaracin de variables de tipo booleano...................................................... 96Inicializacin de variables............................................................................... 98 . .Inicializaclondinmica ................................................................................... 99Conversin de tipos de datos ........................................................................ 100 Conversionesautomticas........................................................................100 Casting a nuevos tipos de datos ...............................................................101Declaracin de arrays unidimensionales ....................................................... 103Creacin de arrays unidimensionales............................................................104Inicializacin de arrays unidimensionales .....................................................105Declaracin de arrays multidimensionales.................................................... 105Creacin de arrays multidimensionales.........................................................106Inicializacin de arrays multidimensionales .................................................108Creacin de arrays multidimensionales......................................................... 109Longitud de un array .....................................................................................110La clase String ...........................................................................................110..Creacion de cadenas...................................................................................... 117Obtencin de la longitud de la cadena .........................................................119Concatenacin de cadenas ............................................................................ 120Obtencin de caracteres y substring ..............................................................121Bsqueda y reemplazamientos en cadenas .................................................... 122Cambio de maysculas a minsculas (o viceversa) en cadenas .................... 123Formateo de nmeros en cadenas ............................................................... 124La clase StringBufferr...................................................................................124.. de StringBuffers............................................................................. 125CreacionObtencin y establecimiento de longitudes y capacidades de StringBuffer .. 129Establecer caracteres en StringBuffers..........................................................130Aadir e insertar utilizando StringBuffers ....................................................130Borrar texto en StringBuffers........................................................................ 131Reemplazar texto en StringBuffers ............................................................... 132.3 Operadores. condicionales y bucles ...................................................135Operadores ................................................................................................135Condicionales ........................................................................................... 137Bucles ....................................................................................................... 139Precedencia de operadores ............................................................................ 140 5. Incremento y decremento: ++ y................................................................... 141NOT unario:.y ! ......................................................................................... 143Multiplicacin y divisin: * y / ..................................................................... 144Mdulo: % .................................................................................................... 145Suma y resta: + y ......................................................................................... 145Operadores de desplazamiento: >>> y . >=. java app Hola desde Java! No se trata de uno de los programas ms significativos, pero s es buenopara empezar. Veamos este programa lnea por lnea. 42. public class app Esta es la primera lnea de app-java: public class a99 {Esta lnea indica que estamos creando una clase de Java nueva llamadaapp. Despus de que esta clase la transformemos en bytecodes, la mquinavirtual de Java podr crear objetos de esta clase y ejecutarlos. Aprender todosobre las clases en el captulo 4; este cdigo es slo para empezar con laprogramacin Java. Observe la palabra clave public en el cdigo anterior. Esta palabra es unespecificador de acceso, sobre la que aprender ms en los captulos 4 y 5. Elespecificador de acceso public indica que esta clase est disponible en cual-quier parte del programa que la utilice.Observe adems que si construye una clase pblica, Java le obliga a dar unnombre al archivo. Es decir, slo puede tener una clase pblica en un archivocon extensin ".javaW. razn de esto es que el compilador de Java traduceLael archivo de extensin ".javan en un archivo bytecode con la extensin".class", lo que significa que appjava se convertir en app.class, y si JVMnecesita la clase app, sabr cmo mirar en el archivo app.class. Dado queJVM utiliza el nombre del archivo para determinar las clases pblicas quehay en l, slo se puede tener una en cada archivo. Por esa razn, el cdigopara la clase app debe estar en un archivo llamado app.java (observe que Javaes bastante particular en esto, y el uso de maysculas hay que tenerlo encuenta). La implementacin de la clase que estamos definiendo ahora, estar entrellaves: public class app Java siempre encierra bloques de cdigo entre llaves, es decir,{y }.Como ver en el captulo 4, el cdigo de un bloque tiene su propio alcance (suvisibilidad para el resto del programa). A partir de ahora, continuaremosconstruyendo nuestra aplicacin siguiendo con la siguiente lnea de cdigo. 43. public static void main[String[] args) Esta es la siguiente lnea de cdigo de nuestra aplicacin: public class app { public static void main(String[l arga) {Aqu estamos creando un mtodo de la clase app. Un mtodo en la progra-macin orientada a objetos es como una funcin o subrutina en la programa-cin estndar, un bloque de cdigo al que se le puede pasar el control y quepuede devolver un valor. Los mtodos permiten manejar fcilmente el cdigoen una unidad funcional sencilla; cuando llama a un mtodo, la mquinavirtual de Java ejecuta el cdigo de ese mtodo.Los mtodos sern tratados formalmente en el captulo 4, pero aqu la ideaes que estamos creando un mtodo llamado main, que es el mtodo que lamquina virtual de Java busca cuando inicia una aplicacin (las applets notienen mtodo main). Cuando encuentra el mtodo rnain, JVM le pasa con-trol, y nos situamos en la parte del cdigo que queremos ejecutar de estebloque de cdigo del mtodo.Antes de continuar hay varias cosas que observar. El mtodo main debedeclararse con el especificador de acceso public, lo que quiere decir quepuede ser llamado desde fuera de su clase. Tambin debe declararse comostatic, que significa, como veremos en el captulo 4, que main es un mtodode una clase, no un mtodo de un objeto. Cuando se termine de ejecutar, nodebe devolver ningn valor, por lo cual usamos la palabra void en este cdigo(en otras palabras, un valor de retorno de tipo void significa que actualmenteno devuelve valor). Finalmente, observe el argumento entre parntesis quesigue a la palabra main: String[] args. Aparece una lista de argumentos entreparntesis en la declaracin de un mtodo para indicar que los valores se lepasan al mtodo y que el cdigo del mtodo puede usarlo. En este caso,estamos indicando que a main se le pasa un array cuyos elementos soncadenas de caracteres, llamado args. Estos elementos son valores que sepasan desde la lnea de comandos cuando se inicia la aplicacin; por ejemplo,si escribe Ijava app Hola ah", entonces "Hola" y "ah" seran las dos cadenasdel array args. Todos los detalles se mostrarn en el captulo 4. Dado que nousaremos ningn argumento desde la lnea de comandos en esta aplicacin,no usaremos args en el cdigo del mtodo main. 44. Esta lnea de cdigo, entonces, inicia el mtodo main. Todo el trabajo deeste mtodo es visualizar el texto "Hola desde Java! ", lo que se realizar enla siguiente lnea de cdigo.System.out.println("iHola desde Java! "); El mtodo main tiene una lnea de cdigo: public class app I public static void main(String[] args)(System.out.println("iHola desde Java!");1 >Esta es la lnea de cdigo que hace todo el trabajo. En este caso, estamosusando el cdigo que los programadores de Sun ya han creado para visualizarel texto "Hola desde Java!". En particular la clase System del paquete java.lang.En Java, las libreras de clases se llaman paquetes y el paquete java.lang esten todo programa Java, lo que quiere decir que no hay que hacer nadaespecial para utilizarlo, a diferencia de otros paquetes Java. La clase Systemdel paquete java.lang incluye un campo (es decir, un miembro de datos de laclase) llamado out, y este campo, a su vez, tiene un mtodo llamado println,que hace que se visualice el texto.Para referirse al campo out de la clase System, usamos la terminologaSystern.out. Para utilizar el mtodo println del campo out, usamos la termi-nologa System.out.println. Para imprimir el texto "Hola desde Java!", se lopasamos a System.out.println cerrndolo entre comillas.Observe adems que esta lnea de cdigo termina con un punto y coma(;). Esto es algo que Java ha heredado de C y C++ (de hecho, Java haheredado muchas cosas de C y C++), y casi todas las sentencias de Java seterminan con punto y coma. Si no est acostumbrado a ello, lo conseguirrpidamente, ya que el compilador de Java rechaza la traduccin a bytecodeshasta que el punto y coma est en su sitio.Por lo tanto, hemos creado una nueva aplicacin y la hemos almacenadoen un archivo llamado app.java. Cul es el siguiente paso? Ejecutarlo. Eche-mos un vistazo al siguiente tema.CompilacinEl gran jefe, mascando un cigarro, permanece de pie detrs de ustedmientras guarda la nueva aplicacin Java en un archivo. "Hmm", dice el gran 45. jefe, nada impresionado. "Y ahora?" "Ahora", dice, "tenemos que compilar el programa y ya podremos ejecutarlo". "De acuerdo," dice el gran jefe. "Sorprndame".Para traducir un programa Java a un archivo bytecode que la mquina virtual de Java pueda utilizar, usar el compilador de Java, que se llama javac (por ejemplo, en las mquinas Windows, este programa se llamar javac.exe, que est en el directorio bin de Java). A continuacin se indica cmo usar javac en general:javac [opciones] [archivos fuente] [@archivos]Argumentos de javac: opciones: Opciones desde la lnea de comandos. archivos fuente: Uno o ms archivos que se van a compilar (como app-java). @archivos: Uno o ms archivos de la lista de archivos fuente.Para compilar app.java, usaremos este comando:C:javac app. javaEl compilador de Java, javac, toma el archivo app.java y (suponiendo que no haya errores) lo compila, traducindolo y creando un nuevo archivo Ilama- do app.class. Si hubiera errores, el compilador de Java nos avisar de que hay errores incluyendo qu Inea de cdigo est mal, como en este caso en el que hemos olvidado el mtodoprintln e intentamos usar uno llamado printline: C:javac app.java app.java:5: Method printline(java.1ang.String) notfound in classjava.io .Print Strearn.System.out.printline("iHo1a desde Java!"); 1 errorCuando app.java est compilado sin errores, el nuevo archivo, app.class, contiene todo 10 que la mquina virtual de Java necesitar para crear objetos de la clase app. Ya hemos creado app.class. Ahora, jcmo lo ejecutamos en JVM? Veamos el siguiente punto.Compilacin: utilizando opcones en la lnea decomandos "Hmm", dice el programador novato, "tengo un problema. Me gusta guar-dar todos mis archivos con extensin ".class" en el mismo directorio, pero 46. algunas veces se me olvida copiar las nuevas versiones de esos archivos enese directorio". "Hay una opcin del compilador que es perfecta para eso: laopcin -d. Usando esa opcin, puede situar los archivos creados por elcompilador en el directorio de destino que quiera". "Entonces, slo tengo queacordarme de utilizar esa opcin ...," dice el programador. Hay un buen nmero de opciones que se pueden usar con javac. Porejemplo, indicaremos cmo usar la opcin -d para situar el archivo app.class yen el directorio temp., que ya~existe que, en este caso, es un subdirectoriodel directorio actual: javac -d T e m p . app. java A continuacin se muestra la lista de opciones de javac. Observe que lasopciones que empiezan con -X (llamadas opciones no estndar) estn marca-das de esa forma por Sun ya que pueden cambiar en el futuro: -classpath ruta de acceso. Establece la ruta de acceso del usuario, sobrescribindola en la variable de entorno CLASSPATH. Si no se especifica CLASSPATH ni -classpath, la ruta de acceso es el directorio actual. Observe que si no se usa la opcin -sourcepath, la ruta de acceso se busca tanto para los archivos fuentes como para los archivos de clase. -d directorio. Fija el directorio de destino de los archivos de clase. Para los lectores que sepan qu son los paquetes Java, si una clase forma parte de un paquete, javac pone el archivo de clase en un subdirectorio que refleja el nombre del paquete, creando los directorios necesarios. Por ejemplo, si especifica -d c:clases y la clase se llama com.package1. Class1, el archivo de clases se llama c:clasescompackage lClassl .class. Si no se especifica la opcin -d, javac pone el archivo de clases en el mismo directorio que el archivo fuente. Observe que el directorio indicado por -d no se aade automticamente a su ruta de acceso de clases. -deprecation. Muestra una descripcin de cada uso o sobrescritura de un miembro o clase censurado. (Sin -deprecation, javac slo muestra los nombres de los archivos fuente que usan o sobrescriben miembros o clases censurados). -encoding. Fija el nombre codificado del archivo fuente. Si no se especifica -encoding, se usar el convertidor por defecto de la plataforma. -g. Genera todo la informacin de debugging, incluyendo variables locales. Por defecto, slo se genera el nmero de lnea e informacin del archivo fuente. 47. -g:none. Hace que el compilador no genere ningn tipo de informacinde debugging.-g:(lista de palabras reservadas). Slo genera algunos tipos de informa-cin de debugging, especificados por la lista de palabras reservadasseparadas por coma. Las palabras vlidas son source (informacin dedebugging del archivo fuente), lines (informacin de debugging delnmero de lnea) y vars (informacin de debugging de Ias variableslocales).-nowarn. Deshabilita todos los mensajes de aviso.-O. Optimiza el cdigo para la ejecucin en trminos de hacer msrpido el tiempo de ejecucin. Observe que utilizar la opcin -O puederalentizar la compilacin, producir archivos de clase ms grandes yhacer que el programa sea difcil de poner a punto. Observe que antes detener JDK 1.2, las opciones -g y -O no podan usarse juntas. Con JDK1.2, puede combinar -g y -O, pero puede obtener resultados inespera-dos, como prdida de variables o de cdigo.-sourcepath ruta de acceso de fuentes. Especifica la ruta de acceso de lasfuentes para las definiciones de clases o de interfaces. Al igual que conla ruta de acceso de clases, las- entradas se separan por punto y coma(;) y pueden ser directorios, archivos Java (con extensin ",jarW) oarchivos zip. Si usa paquetes, el nombre local de la ruta de accesodentro del directorio o del archivo debe reflejar el nombre del paquete,como ver ms tarde. Observe que las clases buscadas en la ruta deacceso de clase sern recompiladas automticamente si sus archivos decdigo fuente no se encuentran.-verbose. Crea la salida "verbose". Incluye informacin sobre cadaclase cargada y de cada archivo fuente compilado.-X. Visualiza informacin sobre las opciones no estndares.-Xdepend. Busca todas las clases que pueden ser utilizadas por losarchivos fuente ms recientes para recompilar. Esta opcin descubrirclases que necesitan serrecompiladas, pero puede ralentizar enorme-mente el proceso de compilacin.-Xstdout. Enva mensajes del compilador a System.out. Por defecto, losmensajes del compilador van a System.err, que ver ms tarde.-Xverbosepath. Describe las rutas de acceso y las extensiones estndarque fueron localizadas para buscar archivos fuente y de clases. 48. -Joption. Usa esta opcin para pasar una opcin al lanzador de Javallamado por javac. Por ejemplo, -J-Xms64m fija la memoria de inicio a64 MB. Aunque esta opcin no empieza con -X, no es una opcinestndar de javac. Es una convencin para pasar opciones a las aplica-ciones escritas en Java que se estn ejecutando en JVM. Opciones de compilacin cruzadaLas opciones de compilacin cruzada se consideran un tema avanzado de Java; javac soporta la compilacin cruzada, en la que las clases se compilan mediante un proceso autosuficiente (por defecto) y la implementacin de extensin de clases. Se debe utilizar -bootclasspath y -extdirs cuando se est hablando de compilacin cruzada. A continuacin se indican las opciones de compilacin cruzada:-target versin. Genera los archivos de clase que trabajar en JVM conla versin indicada. Por defecto se generan archivos de clase que soncompatibles con JVM 1.1 y 1.2. Las versiones soportadas por javac enJDK 1.2 son 1.1 (asegura que los archivos de clase generados serncompatibles con JVM 1.1 y 1.2; esto es por defecto) y 1.2 (generaarchivos de clase que se ejecutarn en JVM 1.2 pero no en JVM 1 .I).-bootclasspath ruta de acceso de arranque. Realiza la compilacin cru-zada contra el conjunto de clases de arranque indicadas. Al igual quecon la ruta de acceso de clases, estas entradas estn separadas por puntoy coma (;) y pueden ser directorios, archivos con extensinW.jar"oarchivos zip.-extdirs directorios. Realiza la compilacin cruzada contra los directo-rios indicados; los directorios estn separados por punto y coma (;).Cada archivo con extensin ".jarW los directorios indicados es locali- dezado automticamente por los archivos de clase.Compilacin: revisin de los mtodoscensurados"Bueno", dice el programador, " jcmo puedo cambiar todos los mtodos censurados para que sean correctos? Ahora que ya estoy en Java 2, no s lo que es obsoleto y lo que no". "Eso es fcil", responde. "El compilador de Java, javac, le dir si est usando un mtodo que ya ha sido abandonado. 49. Mejor an, puede usar la opcin -deprecation para asegurarse de tener todos los detalles".La opcin -deprecation es buena, y es la opcin estndar que utilizo para asegurarme de que estoy evitando los mtodos obsoletos. Supongamos que tiene un programa de 200 lneas, y que cuando lo intenta compilar, javac le devuelve este resultado:C :javac app . javaNote: app.java uses or overrides a deprecated API. Recompile with " - deprecation" for details.1 warning Esto no es de mucha ayuda. Sin embargo, utilizando la opcin -deprecation, puede conocer el problema exacto:C: >javac app.java -deprecationapp.java:109: Note: The method java.awt.Dimension s i z e 0 in classjava.awt.Component has been deprecated.x = ( s i z e 0 .width - fontmetrics.stringWidth(text) ) / 2 ;ANote: app.java uses or overrides a deprecated API. Please consultthe documentation for a better alternative.1 warningComo puede ver, el problema es que app.java utiliza el mtodo size en la lnea 109 y ese mtodo es obsoleto. Si se reemplaza por el mtodo de la nueva versin, getSize, se resuelve el problema.Ejecucin del cdigoEl gran jefe se est poniendo impaciente. Ha escrito usted una nueva aplicacin y la ha compilado sin errores a la primera (de lo que puede sentirse orgulloso), pero realmente no ha ocurrido nada que el gran jefe pueda ver. Es hora de ejecutar la nueva aplicacin.Las aplicaciones Java se ejecutan con el programa llamado java (en Windows, por ejemplo, es el archivo java.exe del directorio bin de Java). El programa java, llamado utilidad java, es lo que realmente ejecuta JVM. A continuacin puede ver cmo usar la utilidad java:java [opciones] clase [parmetro . . . 1java [opciones] -jar archivo.jar [parmetro . . .1Estos son los parmetros de las lneas anteriores: opciones. Opciones de la lnea de comandos, que se vern en otro apartado. 50. clase. Nombre de la clase a la que se llama. archivo.jar. Nombre del archivo de archivo Java (JAR) al que se llama. Se usa slo con -jar. Los archivos JAR se tratan en el captulo 23. Parmetro. Un parmetro de la lnea de comando que se pasa al mtodo main. Por ejemplo, para ejecutar la aplicacin llamada app, que est en el archi-vo app.class, podra ejecutar el siguiente comando en la lnea de comandos(observe que se omite la extensin".class" de app.class): java app El resultado aparecer inmediatamente: java app Hola desde Java! En la figura 1.4 puede ver cmo funciona en una ventana DOS bajoWindows. Eso es todo. Ya ha escrito, compilado y ejecutado su primera aplicacin.Felicidades!Figura 1.4. Ejecucin de una aplicacin en una ventana DOS. Observe que si su aplicacin no responde o si quiere pararla por algunarazn, puede pulsar Control-C. Si no funciona, intntelo con la tecla Esc. Adems, en este libro, ver cmo crear aplicaciones ventana, y cuandoejecute una de estas aplicaciones con la utilidad java, obtendr los resultadosque aparecen en la figura 1.5. Hay algo que hacer notar sobre la figura 1.5; la ventana consola (aqu unaventana DOS) est por debajo y espera que la aplicacin termine antes de 51. continuar (es decir, antes de que elprompt de DOS aparezca en este caso). Sino quiere que una ventana consola est asociada con su aplicacin ventana,puede utilizar la utilidad javaw, como se indica: j avaw appFigura 1.5. Ejecucin de una aplicacin ventana.A continuacin se indica cmo se utiliza javaw en general, igual que lautilidad java: javaw [opciones] clase [parmetro . . 1. javaw [opciones] -jar archivo.jar [parmetro . . . 1 Estos son los parmetros utilizados con javaw: opciones. Opciones de la lnea de comandos, que trataremos prxima- mente. clase. Nombre de la clase a la que se llama. Archivo.jar. Nombre del archivo de archivo Java (JAR) al que se llama. Se usa slo con -jar. Los archivos JAR se tratan en el captulo 23.Parmetro. Un parmetro de la lnea de comandos pasado al mtodomain.Cuando usted lanza una aplicacin ventana de Java como esta, la ventanaconsola no espera a que la aplicacin termine; si la est ejecutando en DOS,la aplicacin aparece y el prompt DOS reaparece en la ventana DOS. Esto daun sentido ms profesional a estas aplicaciones.De hecho, hay otro lanzador en Java 2, el lanzador oldjava, que Sunincluy para la compatibilidad hacia atrs. Este lanzador no soporta elframework de extensiones Java (ver el punto "Cules son las novedades de 52. Java 2?"). Proporciona compatibilidad hacia atrs cuando tiene una aplica-cin que utiliza el estilo de seguridad de Javal. 1, que es incompatible con lastcnicas de carga de clases de 1.2 (o quizs las clases que se estn cargandohan sido generadas o cambiadas de alguna forma que es incompatible con laestructura de clases de 1.2). En este libro estoy siguiendo Java 2, por lo queno se usar mucho el oldjava, pero si est migrando a Java 2 y necesita usar elmecanismo de carga de clases antiguo, es bueno saber que est ah. Tambinhay una utilidad oldjavaw. , As es como puede ejecutar una aplicacin, usando cualquier utilidad deJava: java, javaw u oldjava. Cuando lance una aplicacin java2, el compiladorJust In Time (JIT) compila los bytecodes y ejecuta la aplicacin. Mientras estemos enel tema de compilar y ejecutar el cdigo, hay otrodetalle que deberamos tratar: las opciones de la lnea de comando que sepueden usar con los comandos javac y java. Les echaremos un vistazo en losdos apartados siguientes.Ejecucin de cdigo: utilizar las opciones de lalnea de comandos"Bien," dice el programador, "tengo otro problema. He almacenado todosmis archivos con extensin ".class" en un directorio, pero no quiero estarcambiando a ese directorio para ejecutarlos". "Otro problema fcil de resol-ver," le dice. "Puede usar la opcin -classpath de la utilidad java o establecerla variable de entorno CLASSPATH para que el compilador de Java busquelas clases correctamente". 53. Echaremos un vistazo al uso de las opciones de la lnea de comandos eneste punto. Utilizar estas opciones.con las utilidades java, javaw y oldjava,de la siguiente forma (para ver informacin sobre estas utilidades, ver laseccin "Ejecucin del cdigo," ya tratado en este captulo): java [opciones] clase [parmetro . . . 1 java [opciones] -jar archivo.jar [parmetro ... 1 javaw [opciones] clase [parmetro . . . 1 javaw [opciones] -jar archivo.jar [parmetro . . . 1 oldjava [opciones] clase [parmetro . . . 1 oldjavaw [opciones] -jar archivo.jar [parmetro . . . 1A continuacin se citan las opciones de la lnea de comandos que puedeutilizar con estas herramientas (observe que las opciones no estndar, quequiere decir que en un futuro puede que no estn soportadas, empiezan conuna X): -classpath ruta de acceso o -cp ruta de acceso. Especifica una lista de directorios, archivos con extensin".jar" o archivos con extensin".zip" para localizar archivos de clase. Se separan las entradas con punto y coma (;). Observe que al especificar cualquiera de estas dos opciones se est borrando lo que indique la variable de entorno CLASSPATH. Utilizadas con java o javaw, -classpath o -cp slo especifican la ruta de acceso para las clases de usuario. Usadas con oldjava u oldjavaw, especifican la ruta de acceso para las clases de usuario y las de arranque. Si no se especifican ni -classpath ni -cp y CLASSPATH no est, la ruta de acceso a las clases de usuario est limitada al directorio actual, que est referenciado con un punto (.). Ver el apartado "Conocimientos bsicos: bsqueda de clases Java con CLASSPATH," ms adelante en este captulo para ms informacin.-Dproperty=valor. Fija un valor de propiedad del sistema.-jar. Ejecuta un programa encapsulado en un archivo JAR. El primerparmetro es el nombre de un archivo JAR en vez de un nombre de clasede inicio. Cuando usa esta opcin, el archivo JAR es la fuente de todaslas clases de usuario y el resto de las rutas de acceso a otras clases deusuario se ignoran. Las herramientas oldjava y oldjavaw no soportan laopcin -jar.-verbose o -verbose:clase. Visualiza informacin sobre cada clase queest cargada.-verbose:gc. Informa sobre cada evento de la coleccin garbage. Estacoleccin realiza la gestin de memoria en Java. 54. -verbose:jni. Da informacin sobre el uso de mtodos nativos (es decir,especficos de la plataforma) y otras actividades de la interfaz nativa deJava.-version. Visualiza informacin sobre la versin y se cierra.-? o -help. Visualiza informacin de ayuda y se cierra.-X. Visualiza informacin sobre las opciones no estndares.-Xbootclasspath:ruta de acceso de arranque. Especifica una lista dedirectorios separados por punto y coma (;), archivos con extensin".jar" o archivos con extensin ".zipVpara localizar los archivos de laclase de arranque. Observe que estos sern utilizados en lugar de losarchivos de las clases de arranque que Java incorpora.-Xdebug. Inicia con el debugger habilitado.-Xnoclassgc. Deshabilita la coleccin de clases garbage.-Xmsn. Indica el tamao de memoria inicial que se quiere utilizar (estevalor debe ser mayor que 1000). Para multiplicar el valor por 1000,aadir la letra k. Para multiplicar el valor por un milln, aadir la letram. El valor por defecto es lm.-Xmxn. Especifica el tamao mximo de memoria (este valor debe sermayor que 1000). Para multiplicar el valor por 1000, aadir la letra k.Para multiplicar el valor por un milln, aadir la letra m. El valor pordefecto es 64m.Xrunhprof[:help] [: csubopcin>=cvalor>,.. .l. Habilita el seguimientode la CPU, la pila o del monitor. Esta opcin va seguida normalmentepor una lista de pares separados por coma (,) de la forma=.-Xrs. Reduce el uso de las seales del sistema operativo.Xcheck:jni. Ejecuta tratamientos adicionales para las funciones de lainterfaz nativa de Java.-Xfutrue. Ejecuta un seguimiento estricto del formato de archivo declases.Conocimientos bsicos: comentar el cdigoLa persona encargada de la correccin del programa entra y le mira con reproche. "Qu ocurre?, pregunta. "Su cdigo", dice. "No puedo imaginar lo 55. que ah est escrito". "Lo siento, olvid comentarlo", dice. "Le pido que lohaga", dice l. "Arrglelo". , A veces, el cdigo puede ser muy crptico y difcil de descifrar. Por ello,Java le permite comentar su cdigo para explicar a todo el mundo que lo leacmo funciona el programa y lo que hace. Como ejemplo, aadamos comen-tarios a la aplicacin que ya hemos desarrollado en los puntos anteriores: public class app public static void mainString[l args)(System.out.println("iHola desde Java!");1 1Java admite tres tipos de comentarios, dos de los cuales son de C++.Puede poner cualquier comentario de cualquier longitud con los caracteres"/*My "*/u: / * Esta aplicacin visualiza ";Hola desde Java!" * / public class app I public static void main(String[] args){System.out.println("iHola desde Java!");1 1 El compilador de Java ignorar todo el texto que est entre "/*" y "*/".Puede dividir los comentarios que ponga entre estos indicadores en variaslneas: / * Esta aplicacin visualiza "iHola desde JavalR Creado por: 0. Whiz, 1/1/00 */ public class app { public static void main(String[] args)(System.out.println("iHola desde Java! " ) ; De hecho, en muchos entoinos corporativos, se espera que se use unacabecera de comentario estndar, creado con "/*" y "*/" para todo cdigonuevo. Sera algo as como: Esta aplicacin visualiza ";Holadesde Java!" * * Autor: G.Whiz 56. * ~mportaciones:Ninguna * * Parmetros: Argumentos de la lnea de comandos * * Retorno: Ninguno * * Supuestos: Ninguno e * Fecha de creacin: 1/1/00* * ltima actualizacin: 1/1/01 * ******************************public class app { public static void rnain(String[] args) { System.out.println(iH01a desde Java! " 1 ; 1 1 Java tambin soporta una lnea de comentario utilizando la doble barra,"11". El compilador de Java ignorar toda la lnea despus de la doble barra,por lo que puede crear lneas enteras de comentarios o aadir un comentario auna sola lnea: / * Esta aplicacin visualiza "Hola desde Java!" * / public class app//Crear la clase app ( //Crear main( ), punto de entrada a la aplicacin. public static void main(String[l args) { / / Visualizar el mensaje con System.out.println("iHola desde Java! " ) ; 1 1 Finalmente, Java tambin soporta un comentario que se inicia con "/**" yque termina con "*/". Este comentario est diseado para usarse con laherramienta javadoc, que permite crear documentacin casi automticamente.Echaremos un vistazo a esto en el captulo 21. A continuacin hay un ejem-plo para el uso de "/**" y "*/": / * * Esta aplicacin visualiza ";Hola desde Javanl * / public class app { public static void main(String[] args) ( System.out.println("iH01a desde Java!"); 1 1 Comentar el cdigo es de gran importancia en entornos de grupo donde secomparten los cdigos de los archivos fuente. Adems es muy cmodo si otrapersona va a retomar el proyecto en el que ha estado trabajando usted. 57. Conocimientos bsicos: importando paquetesy clases Java "Hmm", dice el programador novato, "tengo un problema. El coordinador del equipo de diseo me dijo que usara la clase Date para visualizar la fecha actual en mi aplicacin, pero Java parece no entender la clase Date, me da un error cada vez que intento usarlo". "Eso se debe a que la clase Date forma parte del paquete de utilidades de Java y tiene que importar ese paquete antes de que pueda utilizarlo". "iImportarlo?", pregunta el programador. Las clases que Sun ha creado estn almacenadas en libreras de clases llamadas "paquetes". Para que una clase de un paquete est disponible en su cdigo, tiene que importar el paquete, lo que quiere decir que el compilador localizar ese paquete para esas clases. Adems puede importar clases indivi- duales que no son parte de un paquete. Por defecto, slo las sentencias bsicas de Java estn disponibles en una aplicacin, las del paquete java.lang. El compilador automticamente importa el paquete java.lang, pero para usar el resto de las clases que vienen con Java tendr que hacer la importacin con la instruccin import. Aqu se muestra cmo utilizar esa sentencia:import [paquetel[.paquete2... ].]-(nombrede clase[*);Observe que se pone un punto (.) entre el paquete y los nombres de clase para separarlos. Los paquetes Java estndares estn almacenados en un gran paquete llamado java, por lo que el paquete de utilidades se llama realmente java.uti1 (hay otros grandes paquetes disponibles; por ejemplo, el paquete swing est almacenado en el paquete java). Puede referirse a la clase Date en java.uti1 como java.util.Date. A continuacin se indica cmo importar esa clase en un programa:import java.util.Date;public class app( 7Observe que si va a usar las sentencias import para importar clases en un programa, stas deberan estar en la parte de arriba del cdigo. As, podemos utilizar la clase Date, como se indica a continuacin (observe que estamos creando un objeto de la clase Date usado el operador Java new, de la que aprenderemos ms en el captulo 4):import java.util.Date;public class appI 58. public static void main(String[] args) ~ ~ s t ~ . o u t . p r i n t l n ( ~ H o y + nrr Date( ))j= m1 > Cuando ejecute esta aplicacin, ver la fecha del da: c:>java app HOY = Lunes 2 Agosto 12:15:13 EDT 2000Como puede ver estudiando la forma general de la sentencia previa import,hay tambin una tcnica taquigrfica que carga todas las clases de un paque-te; se puede usar un asterisco (*) para utilizar todas las clases de un paqueteespecfico. A continuacin se indica cmo se podra hacer si quisiera impor-tar todas las clases del paquete java.uti1 de una vez: public class app { public static void main(String[] args) {System.out.println("Hoy = " + new Date()); 1 1 Esto est bien si se quiere importar las clases proporcionadas por Sun, yaque Java sabe donde buscar las clases con las que fue instalado. Pero qupasa si quiere importar sus propias clases u otras proporcionadas por un tercero? He aqu hay un ejemplo. Supongamos que tiene una clase llamada printeren un archivo llamado printer.java, y esa clase tiene un mtodo, llamado print: public class printer I public void print() C System.~ut.println(~~Hola desde Javaln); 1 >Podra querer utilizar el mtodo print en otras clases, como en este caso,donde estamos creando un nuevo objeto de la clase printer usando el operadornew y usando el mtodo printer de ese objeto en una aplicacin llamada app: 59. public class appi. public static void main(String[l args) ( (new p r i n t e r ( ) ) .print ( ); 1 1Para ello, puede importar la clase printer de esta forma (observe que puede adems poner el cdigo de la clase prnter en el mismo archivo que la clase app, en cuyo caso no tendra que importar la clase printer):import printer:public class app public static void main (String[ 1 args) {(new printer ( )) .print ( ) ; 11Esto funciona como debera. Felicidades, acaba de importar una clase en su programa.Esta tcnica es buena si prnter.class est en el mismo directorio en el que se est compilando esta aplicacin, ya que el compilador Java buscar el directorio actual por defecto. Sin embargo, supongamos que quiere almace- nar todas sus clases en un directorio llamado c:clases. Cmo encontrar el compilador printer.class all? Para contestar a esa pregunta, veamos el si- guiente punto CLASSPATH.Conocimientos bsicos: buscar clases Java conCLASSPATH"Ese jorobado Johnson", dice el programador novato. "Me dio un archivo de clases nuevo, johnson.class, para trabajar con l, y se supona que resolve- ra mis problemas con esa hoja de clculo. Pero Java dice que no puede encontrar johnson.class". "Dnde tiene ese archivo?", le pregunta. "En un directorio especial que cre ;ara ello", dice el PN, "llamado jorobadojohnson". "Ese es el problema", le dice. "Tiene que incluir el directorio jorobadojohnson en su ruta de acceso a clases".Por defecto, Java podr encontrar sus clases de arranque (con las que viene), extensiones de clases (esas que usan el framework de extensiones Java; ver en este mismo captulo) y clases en el directorio actual (es decir, donde est compilando su programa). Las clases pueden almacenarse en 60. archivos con extensin ".classW, ".jarW ".zipW. y Java puede localizar todo estetipo de archivos. Pero qu ocurre si quiere hacer una bsqueda de clases en otro directorioo en un archivo con extensin ".jarWsuministradas por un tercero? Puedehacerse con la variable de entorno CLASSPATH, ya que Java usa esta varia-ble para determinar dnde quiera buscar las clases. Veamos un ejemplo que introduje en el punto anterior. Digamos que tieneuna clase llamada printer en un archivo llamado printer.java, y esa clase tieneun mtodo, llamado print: public class printer I public void print() { System.~ut.println(~iHoladesde Java! " ) ; 1 > Ahora supongamos, como en el punto anterior, que quiere usar el mtodoprint de otras clases, como en este caso, donde creamos un nuevo objeto de laclase printer usando el operador new y usando el mtodo print de ese objetoen una aplicacin llamada app: import printer; public class app { public static void main(String[] args) { (new printer ( )) .print ( ); 1 1 Esto funciona si printer.class est en el mismo directorio en el que se estcompilando esta aplicacin, porque el compilador de Java buscar el directo-rio actual por defecto. Pero supongamos que quiera almacenar todas susclases en un directorio llamado c:clases. Cmo buscar el compilador Javaprinter.class ah? Para que el compilador Java busque en c:clases, puede fijar la variable deentorno CLASSPATH para que incluya ese directorio. Por defecto, no hayninguna ruta de acceso ni directorios en CLASSPATH, pero puede aadir aCLASSPATH una lista con separaciones por punto y coma (;), como seindica a continuacin para Windows (observe que es importante no dejarespacios entre los signos de igual): 61. En Windows NT, puede seguir estos pasos para fijar la variable de entornoCLASSPATH: 1. Abrir el men Inicio y abrir el Panel de Control de la opcin Configura-cin. Hacer doble clic sobre Panel de Control para abrirlo. 2. En el cuadro de dilogo Propiedades del Sistema, hacer clic sobre lapestaa Entorno. 3. Hacer clic sobre la variable CLASSPATH, haciendo que se vea el valoractual de CLASSPATH al final del cuadro de dilogo. 4. Aadir la ruta de acceso que quiera a CLASSPATH y hacer clic sobreOK para cerrar el cuadro de dilogo de Propiedades del Sistema.Tambin puede saber el valor actual de CLASSPATH usando el comandoSET: Ahora el compilador de Java (y otras herramientas Java como la utilidadjava) tendr suficiente informacin para buscar en c:clases y c:newclassesautomticamente. Esto significa que este cdigo funcionar si printer.classest en c:clases, ya que ese directorio est en CLASSPATH: import printer ; public class app I public static void main(String[] args) I( n e w printerO).printO; 1 1Puede aadir una nueva ruta de acceso en CLASSPATH a la que ya existe,como sigue: Observe que tambin puede buscar archivos con extensin ".jarUy ".zipUpara las clases: 62. En los orgenes, CLASSPATH produjo dolor de cabeza a los programado- res de Java ya que ninguna clase era considerada clase de arranque, lo que significaba que haba que fijar y entender CLASSPATH antes de que se pudiera usar Java. Esto se ha arreglado con el concepto de clases de arranque, que son clases que vienen con Java (y son localizadas automticamente). Sin embargo, si quiere usar paquetes no estndares y almacenar sus propias clases en otros directorios, es importante saber cmo se fija CLASSPATH.Crear appletsEl gran jefe se est impacientando. "Qu es todo esto de las aplicaciones que visualizan "Hola desde Java!" en la ventana consola? Queremos usar Java para crear applets que se puedan utilizar en los navegadores Web". "De acuerdo", le dice, "deme un minuto".En los captulos que siguen, echaremos un vistazo a la sintaxis de Java, que sera un duro camino si lo primero que se quisiera hacer fuera escribir applets en primer lugar. Lo que es ms, sera intolerable si no iniciramos un libro de un lenguaje tan visual como Java con al menos una applet. En este punto, cubrir el proceso de crear una applet Java. El saber crear una applet bsica le ayudar a probar, visualmente, la sintaxis de los siguientes captu- los. Las applets se introducirn formalmente en el captulo 6; por lo tanto, considere esto como un aperitivo.Las applets estndar estn construidas en la clase Applet, que est en el paquete java.applet. Sin embargo, comenzaremos importando esa clase en un nuevo archivo de cdigo fuente Java, que llamaremos applet.java:import java.applet.Applet;La clase java.applet.Applet es la clase que forma la base para las applets estndar, y puede derivar sus propias clases de applets de esta clase usando la palabra clave extends:import java.applet.Applet;public class applet extends Applet{ Es hora de aadir cdigo a esta nueva applet. Las applets no tienen un mtodo main como las aplicaciones; de hecho, esa es la diferencia principal 63. entre applets y aplicaciones. Por lo tanto, cmo se puede visualizar textodirectamente en una applet? El trazado actual de una applet est contenido en su mtodo paint, que lamquina virtual de Java llama cuando es hora de visualizar laapplet. La clasejava.applet. Applet tiene su propio mtodo paint, pero podemos sobrescribirel mtodo definiendo su propio mtodopaint, como sigue (ver captulos 4 y 5para ms detalles de la sobrescritura): import java.applet.Applet; import java.awt.*; public class applet extends Applet public void paint(Graphics g) (Este mtodo paint es realmente una parte de Java Abstract WindowsToolkit (AWT), que ver con gran detalle en este libro, por lo que hemosimportado las clases AWT con la instruccin import.java.awt.*. Ver cmoel siguiente mtodo paint se pasa a un objeto Java de la clase Graphics (esteobjeto se llama g en el cdigo). Puede usar el mtodo drawstring de esteobjeto para dibujar el texto.En este caso, dibujaremos el texto "Hola desde Java! " en las coordenadas(60,100) en la applet; las coordenadas se miden en pixels desde la partesuperior izquierda de la applet, por lo que esta posicin est a 60 pixels delborde izquierdo de la applet y a 100 pixels del el superior. Este es el cdi-go: import java.applet.App1et; import java.awt. ; public class applet extends Applet ( public void paint(Graphics g) ( g.drawString("iHola desde Javaln, 60, 100); 1 1Eso es todo, ahora puede compilar applet-java para obtener applet.class.Hay un paso ms: crear una pgina Web para visualizar en ella la applet.Veremos esto a continuacin. 64. Ejecutar applets"De acuerdo", dice el gran jefe, "ha creado una applet. Por qu no lo veo en una pgina Web?" "Vemoslo," dice. "Creo...".Para visualizar una applet, puede usar una pgina Web con la etiqueta de HTML (Hypertext Markup Language). De hecho, se puede almacenar el HTML necesario en un archivo de cdigo fuente de applets, como podr ver en el captulo 6; adems lo aprender todo sobre la etiqueta en ese captulo. Por ahora, aqu hay una pgina Web, applet.htm1, que visualizar la applet desarrollada en el punto anterior:Puede abrir esta applet en una pgina Web con un navegador Web, como se ve en la figura 1.6, donde la applet se ha abierto con Microsoft Internet Explorer.Figura 1.6. Una applet funcionando con lnternet Explorer.II 65. Adems puede usar el visualizador de applets de Sun, que viene con Java, para abrir applet.htm1, de la siguiente forma:La figura 1.7 muestra la applet con el visualizador de applets de Sun.Figura 1.7. Una applet funcionando en el visualizador de applets de Sun.Crear aplicaciones ventanaEl gran jefe est impresionado con su nueva applet y pregunta, "Puede tambin hacer que una aplicacin visualice ventanas?" "Por supuesto", le dice. "Vayamos a ello".Lo aprender todo sobre la creacin de aplicaciones ventana en el captulo 6, pero tomaremos un primer contacto aqu. Crear una aplicacin ventana es parecido a la creacin de una applet, con la excepcin de que tiene que tener un mtodo main, y que usted es el responsable de crear la ventana. Con el fin crear la ventana para la aplicacin, derivaremos una nueva clase de la clase AWT Frame y aadiremos el mismo cdigo del mtodo paint que se utiliz en la applet del apartado anterior:import j ava . a w t . * ;c l a s s AppFrame e x t e n d s Frame( public void paintiGraphics g) { g.drawString("iHola desde Javal", 60, 100); 1 1 66. Ahora crearemos la clase aplicacin, que llamaremos app. Esta es la clase que tendr un mtodo rnain, y en ese mtodo, usaremos el operador new para crear un nuevo objeto de la clase AppFrame al que se le dar un tamao en pixels y se mostrar en la pantalla:import java.awt.*;import java.awt.event.*;class AppFrame extends Frame{public void paint(Graphics g)( g.drawString("iHola desde Java!", 60, 100);11public class app{public static void main(String [ I args){AppPrame f = new AppFrame( ); Ahora que la nueva aplicacin ventana est preparada, cmo se ejecuta? Echemos un vistazo al siguiente punto.Ejecutar aplicaciones ventana Como con las aplicaciones consola, para ejecutar una aplicacin ventana, puede usar las utilidades java o javaw:j ava appj avaw app 67. La utilidad java lanza la aplicacin y hace que la ventana consola espere hasta que la aplicacin sea desechada, mientras que la utilidad javaw lanza la aplicacin y no espera a que la aplicacin sea desechada. La ejecucin de la aplicacin aparece en la figura 1.8.Esto es todo; ahora ejecutaremos aplicaciones ventana Java. Figura 1.8. Una aplicacin ventana.Diseo de programas JavaEl diseo de la cabecera del programa ya est hecho, y su nueva oficina funciona. Pero cuando se sienta usted all, mirando fijamente la esquina de la ventana y golpeando su nueva mesa, se pregunta si es capaz de conservar su nueva posicin.El diseo de los programas en Java no es tarea fcil. Un buen diseo de programacin involucra muchos aspectos, y echaremos un vistazo a algunos de ellos en este captulo, antes de empezar a excavar en la sintaxis de Java.De hecho, uno de los aspectos ms importantes de la creacin de una nueva aplicacin es disearla. Si no se selecciona bien puede que sea necesa- rio hacer muchas revisiones del producto. Muchos libros se dedican al diseo de programas. Microsoft, que debera saber algo de ello, divide el proceso en cuatro reas:Rendimiento. Responsabilidad y optimizacin global de la velocidad yUSO de recursos.Mantenimiento. Capacidad de la aplicacin para ser mantenida fcil-mente.Extensibilidad. Capacidad de la aplicacin para ser extendida de formasbien definidas. 68. Disponibilidad. Robustez de la implementacin de la aplicacin y disponibilidad para su uso. Veamos rpidamente estas cuatro reas.Rendimiento El rendimiento es un tema de diseo que es duro de argumentar. Si losusuarios no consiguen lo que quieren con su aplicacin, esto se convierteclaramente un problema. En general, el rendimiento depende de las necesida-des de los usuarios. Para algunas personas, la velocidad es esencial; paraotros, la robustez o el uso eficiente de los recursos es lo que estn buscando.Globalmente, el rendimiento de una aplicacin es una indicacin de lo bienque responde a las necesidades de los usuarios. He aqu algunos aspectosgenerales de rendimiento que debera considerar cuando escriba programasJava: eficiencia del algoritmo velocidad de CPU diseo y normalizacin eficiente de base de datos limitacin de accesos externos velocidad de la red temas de seguridad USO de recursos velocidad de acceso a la Web A lo largo del libro trataremos ms temas especficos de rendimiento.Mantenimiento El mantenimiento es la medida de lo fcilmente que puede adaptarse suaplicacin a necesidades futuras. Este asunto se deriva de buenas prcticas deprogramacin, de las que hablar a lo largo del libro. Buena parte de esto esde sentido comn, simplemente tener en mente las necesidades de codifica-cin futura al escribir el cdigo. Algunos puntos de la "programacin pti-ma" son los siguientes: Evitar el uso de bucles y condicionales anidados. Evitar el paso de variables globales a procedimientos 69. Ser modular cuando se escribe el cdigo. Dividir el cdigo en paquetes. Documentar los cambios de programa. Dar a cada procedimiento un nico propsito. Asegurarse de que la aplicacin puede extenderse sin problemas a ms tareas y mayor nmero de usuarios. Planificar la reutilizacin de cdigo. Programar de forma defensiva. Uso de procedimientos para el acceso a datos sensibles. Uso de comentarios. Uso de nombres de variables consistentes. Uso de constantes en lugar de nmeros "mgicos".Extensibilidad La extensibilidad es la capacidad de la aplicacin para extenderse de unaforma bien definida y relativamente fcil. Generalmente, supone una preocu-pacin en las aplicaciones grandes y, con frecuencia, involucra a toda unainterfaz especialmente diseada para la extensin de mdulos. De hecho,Java, en s mismo, est diseado para ser extendido, usando elframework deextensiones Java.Disponibilidad La disponibilidad es medir del tiempo que la aplicacin puede utilizarse,en comparacin con el tiempo que los usuarios quieren utilizarla. Esto loincluye todo, desde que no se quede congelada cuando se ejecuta una tarealarga (al menos, dar al usuario el estado de la operacin), hasta trabajar contcnicas y mtodos que no se cuelguen, hacer backups de datos crticos yplanificar el uso alternativo derecursos, si es posible, cuando el acceso alrecurso deseado est bloqueado. Globalmente el proceso de diseo es de los que ms tiempo requiere. Dehecho, todo el ciclo de desarrollo es tema de muchos estudios, puede resultarsorprendente saber que algunos de ellos consideran que el diseo es, almenos, el quince por ciento del proyecto total cuando se prueba un campo yse aaden planificacin, diseo y pruebas de interfaz de usuario. 70. No entraremos en ms detalle sobre el ciclo de desarrollo de software, pero los programadores no deberan cambiar los pasos crticos del diseo en proyectos serios, ya que pueden dar ms problemas en una ejecucin larga que el tiempo que ahorran en una ejecucin corta.Distribucin del programa JavaBien", dice el programador novato, "he terminado mi programa Java, y estoy preparado para venderlo". "Ah, js?" pregunta. "Revisaremos primero los temas de licencia".Para que los usuarios ejecuten sus programas, necesitarn tener un entorno de ejecucin Java en sus sistemas. El JDK de Java 2 contiene un entorno de ejecucin, por lo que los usuarios podran usar su programa si lo tuvieran instalado. Sin embargo, observe que la mayora de los usuarios no tendrn todo el JDK Java 2 instalado, por lo que la mejor seleccin para los usuarios ser el entorno de ejecucin de Java 2 (JRE). Aqu es donde la distribucin de JRE en lugar de JDK ocupa un lugar destacado:El entorno de ejecucin de Java es redistribuible, y el JDK de Java 2 no,lo que viene a decir que la licencia de JRE le permite empaquetarlo consu software. Mediante la distribucin de JRE de su aplicacin, puedeasegurarse de que sus usuarios tendrn la versin correcta del entornode ejecucin de su software.El JRE es ms pequeo que el JDK. El JRE contiene todo lo que losusuarios necesitan para ejecutar su software, pero no incluye las herra-mientas de desarrollo y las aplicaciones que forman parte del JDK.Dado que el JRE es pequeo, es ms fcil empaquetarlo con su softwareen vez de que los usuarios lo descarguen del sitio Web de software Java.En Windows, el instalador JRE instala automticamente java y javawen la ruta de acceso del sistema operativo, lo que significa que no tieneque preocuparse de encontrar los lanzadores para iniciar la aplicacin(es decir, no tiene que dar instrucciones a los usuarios para que esta-blezcan las rutas de acceso en sus sistemas).Puede encontrar ms informacin sobre el entorno de ejecucin de Java 2 en http://java.sun.com/products/jdk/l.2/runtime.html. 71. m Variables, arrays y cadenasEste captulo inicia nuestra discusin sobre la sintaxis de Java, y se ver gran parte de ella. Aqu, vamos a tratar sobre cmo se almacenan y recuperan, en Java, los datos de variables, arrays y cadenas. El trabajo con datos es parte fundamental de cualquier programa, y la informacin contenida en este cap- tulo es esencial para cualquier programador de Java. Aunque ya programe en Java, eche un vistazo al material de este captulo, porque hay mucho que ver.VariablesLas variables pueden ser de diferentes tipos y actan como gestores de memoria de los datos. Los diferentes tipos tienen que ver con el formato de los datos que se almacenan en ellas, as como con la memoria que es necesa- ria para gestionar ese dato. Por ejemplo, la variable de tipo entero, int, es de 4 bytes (o 32 bits) y se utiliza para almacenar valores enteros. Esto hace que un dato de tipo int pueda tomar un rango de valores que va desde -2.147.483.648 hasta 2.147.483.647. En Java, hay bastantes tipos de varia- bles, por ejemplo, enteros, coma flotante y caracteres, que veremos en este captulo. 72. Antes de usar una variable en Java, debe declararla, especificando su tipo.A continuacin se indica cmo se declaran las variables en Java: tipo nombre [ = valor] [ , nombre [ = valor] . . . ]; Ahora, podemos ver cmo se declara una variable de tipo int, es decir quecontiene un entero (la variable se llama days): public class app (public static void main(String[] args){ int days; Este cdigo aloca 32 bits de memoria y etiqueta esa ubicacin, de formaque el compilador entiende la variable days y en el cdigo puede haberreferencias a ese nombre. A continuacin, se indica cmo se almacena unvalor numrico de 365 en days, utilizando el operador de asignacin de Java(=): public class app (public static void main(String[] args) { int days; days = 365; En este caso, el valor 365 es una constante entera, es decir, un valorconstante que se sita directamente en el cdigo. A lo largo de este captulo,veremos los tipos de constantes que Java permite. Para comprobar que dayscontiene el valor 365, lo visualizamos por pantalla: public class app Ipublic static void mainString[] args){ int days; days = 365; 73. Este es el resultado del cdigo:C:>java aPPNmero de das = 365Como puede ver, hemos creado una variable en la que se han almacenado datos y se ha obtenido ese dato para visualizarlo en pantalla. As funciona.Hay un convenio que permite inicializar una variable en el momento de declararla. A continuacin, se puede ver como days se declara e inicializa con el valor 365 en un nico pasoipublic class app( public static void main(String[l args){int days = 365;~ystem.out.println("Nmero de das = " + days);11El tipo int es una de las clases de variables que se pueden usar. Estas son todas las posibilidades:Enteros: Estos tipos son byte, short, int y long, que guardan el signo y elvalor.Nmeros en coma flotante: Estos tipos sonfloat y double, que almace-nan nmeros en coma flotante con signo.Caracteres: Este es el tipo char, que guarda las representaciones de loscaracteres, tanto letras como nmeros.Booleano: Este tipo est diseado para guardar slo dos valores: verda-dero (true) o falso (false).Veremos todos estos tipos con ms detalle ms adelante, incluyendo el rango de valores que puede tomar cada uno. Todos ellos forman lo que en Java se conoce como tipos de datos sencillos. Cada uno de estos tipos repre- senta un valor de datos sencillos, no uno compuesto (en oposicin a un array, que tambin se tratar en este captulo). Es posible almacenar un dato en una variable de cualquier tipo y ese dato debe estar dentro del rango permitido para ese tipo.Tipos de datosJava pone mucho nfasis en sus tipos de datos. Es un lenguaje que insiste en que las variables sencillas que se declaran y se utilizan deben correspon- derse con la lista establecida. 74. Todas las variables sencillas deben tener un tipo (y de hecho, toda expre- sin, toda combinacin de trminos que Java puede evaluar para obtener un resultado, tambin tiene un tipo). Adems, Java es muy particular para man- tener la integridad de esos tipos, especialmente si intenta asignar un valor de un tipo a una variable de otro tipo. Java es ms insistente en cuanto al tipo d e datos que un lenguaje como C++; en C++, por ejemplo, se puede asignar un nmero en coma flotante a un entero y C++ gestionar la conversin de tipos, pero eso no se puede hacer en Java. Sin embargo, en Java, puede haber conversin entre ciertos tipos de datos, por ejemplo, entre tipos de enteros, como veremos en este captulo.Hasta aqu, hemos revisado lo que Java hace con los tipos de datos senci- llos y variables; ya es hora de echar un vistazo al almacenamiento de datos, lo que se denomina arrays.ArraysLos tipos sencillos son buenos para almacenar datos simples, pero con frecuencia, los datos son ms complejos. Supongamos, por ejemplo, que quiere crear un nuevo banco, el Banco de Programacin Java, y necesita obtener la cantidad de dinero de cada cuenta, utilizando como ndice el nmero de cuenta. En este caso, es mejor trabajar con datos compuestos, que son proporcionados por los arrays.Utilizando un array, podr agrupar tipos de datos sencillos en estructuras ms complejas y hacer referencia a esa nueva estructura por su nombre. Lo que es ms importante: mediante un ndice numrico, podr hacer referencia a los datos individuales almacenados en el array. Eso es importante, porque los ordenadores se destacan por ejecutar millones de operaciones muy rpida- mente, por lo tanto si se puede hacer referencia a los datos con un ndice numrico, se puede trabajar muy rpido con un conjunto de datos, simplemente incrementando el ndice del array para as, acceder a todos sus elementos.Aqu tenemos un ejemplo. En este caso, empezar con 100 nuevas cuentas en el Banco de Programacin de Java y cada una tendr su propia entrada en 75. un array llamado accounts[]. Los corchetes indican que es un array, y entreellos se sita el ndice del elemento del array al que se quiere acceder. Acontinuacin se puede ver cmo he creado el array accounts[], haciendo quecada elemento sea de tipo doble para obtener mucha precisin. Primero,declaro el array y luego lo creo con el operador new, que es el que Javautiliza para ubicar memoria: public class app Ipublic static void main(String[l args) I double accounts [ 1; account S = new double [1001 ; Ahora que he creado un array con 100 elementos, puedo hacer referenciaa ellos numricamente, como se indica a continuacin (observe que estoyalmacenando $43.95 en la cuenta 3 y visualizando esa cantidad): public class app {public static void main(String[l args) I double accounts [ 1 ; accounts = new double[1001; System.out.println("La cuenta 3 tiene $ " = + accounts[31): 1 1 Este es el resultado del programa: C:>java app La cuenta 3 tiene $43.95 Como puede ver, ahora puede referirse a los elementos del array utilizan-do un ndice numrico, que los organiza fcilmente. En Java, el elemento msbajo declarado de esta forma es el 0, por lo que la sentencia accounts = newdouble[100] crea un arraycuyo primer elemento es accounts[O] y el ltimo esaccounts[99]. Se pueden combinar los pasos de declaracin y creacin en uno solo: public class app I public static void main(String[l args) I double accountsl 1 = new double[1001; 76. accounts [ 31 = 43.95; System.out.println("La cuenta 3 tiene S " + accounts[31);1 1 Adems se puede inicializar un array con valores cuando se declara,encerrando entre llaves la lista de valores. Por ejemplo, este cdigo creacuatro cuentas y guarda el valor 43.95 en accounts[3]: public class app ( public static void main(String[] args)(double accounts[ 1 = {O, 0, 0, 43.95);accounts[3] = 43.95;System.out.println("La cuenta 3 tiene S " + accounts[31);1 1 Esto har que algunos clientes del Banco de Programacin de Java noestn contentos, por supuesto; adems de una cuenta corriente quieren unacuenta de ahorro. Cmo gestionaremos esto y mantendremos todo indexadopor nmero de cuenta? El array accounts[] es un array unidimensional, tambin llamado vector,es decir, es una lista de nmeros que pueden ser indexados por otro nmero.Sin embargo, en Java, los arrays pueden tener muchas dimensiones, lo quesignifica que se pueden tener muchos ndices. En el siguiente ejemplo, exten-der accounts[] a un array de dos dimensiones, accounts[] [], para gestionar lacuenta de ahorro y la cuenta corriente. El primer ndice de accounts[][] ser Opara la cuenta de ahorro y 1 para la cuenta corriente, y el segundo ndice serel nmero de la cuenta como antes. As sera el cdigo: public class apppublic static void main(String[] args){double accounts [ 1 [ 1 = new double [2][lo01;accounts[01[31 = 43.95;accounts [l]131 = 2385489382.06;System.~ut.println(~~acuenta de ahorro 3 tiene $ " + account[0] 131;System.~ut.printin(~Lacuenta corriente 3 tiene $ " + accounts[ll 131;1 1 Ahora que accounts[][] es un array de dos dimensiones, la referencia acada elemento se hace utilizando dos ndices, por ejemplo, el saldo de la 77. cuenta de ahorro 3 es accounts[0][3] y el saldo de la cuenta corriente esaccounts[l][3]. Estos son los resultados al ejecutar la aplicacin:C:>java appLa cuenta de ahorro 3 tiene $43.95La cuenta corriente 3 tiene $2.3854893820639Observe que he dado a la cuenta corriente 3 un saldo de $2,385,489,382.06(ilusin) y que Java ha visualizado 2.38548938206 x lo9.Cadenas Quizs se haya dado cuenta de que, en los ejemplos anteriores, he usadoel operador + para crear el texto que se va a visualizar:public class app{public static void main(String[l args)Ldouble accounts [ 1 [ 1 = new double [ 2 1 [ l o 0 1 ;System.out.println("Lacuentade ahorro 3 tiene 5" + accounts[01 131; Systam.out.println("La cuentacorriente 3tine $ " + accounts[ll[31;1} Esto se debe a que las propias clases de Java (la clase String), soportan lascadenas de texto y se puede considerar la clase String como la definicin deun nuevo tipo de datos. Por ejemplo, a continuacin se puede ver cmo secrea una cadena llamada greeting que guarda el texto "Hola desde Java!":public class app(public static void main(String[l args) 78. I String greeting = " ; H o l a desde J a v a ! " ; Ahora, se puede tratar esta cadena de igual forma que los otros tipos devariables, incluyendo su visualizacin: public class app (public static void main(String [ ] args) (String greeting= "Hola desde Java!"; Este es el resultado de la aplicacin: C:>java app Hola desde Java!Aunque las cadenas no son uno de los tipos sencillos d e Java, tienen unespacio en este captulo, ya que la mayora de los programadores los tratancomo cualquier otro tipo de datos. De hecho, muchos programadores argu-mentaran que las cadenas deberan ser un tipo de datos sencillos en Java,como lo son en otros lenguajes. La razn es que no tienen nada que ver con lalnea de Java, que extiende el lenguaje C. C no tiene un tipo sencillo decadenas; en C, se gestionan las cadenas como arrays unidimensionales decaracteres, lo que es bastante embarazoso. Una de las cosas sobre C++ quehaca felices a los programadores era que la mayora de las implementacionesincluan una clase String, que se poda usar igual que cualquier otro tipo dedatos. Java contina con este uso, implementando las cadenas como unaclase, no como un tipo de dato intrnseco, pero la gestin de cadenas es tanfundamental para la programacin, que tiene sentido revisar las cadenas eneste captulo.Hay dos clases string en Java: String y StringBuffer. Se utiliza la claseString para crear cadenas de texto que no se pueden modificar. Como puedever en el cdigo anterior, puede utilizar cadenas como si fuera un tipo senci-llo de Java. Echaremos un vistazo al uso de cadenas en este captulo y en elsiguiente (uso de operadores + y -). Revisaremos tambin el uso de operado-res en las cadenas.Por ahora, es suficiente. Comenzaremos a crear y a usar variables, arraysy cadenas. 79. De qu tipo de datos disponemos?"Veamos", dice el gran jefe (GJ), " cmo escribira un programa Java para gestionar la deuda de la empresa?" "Estamos en deuda?" pregunta. "Slo un poco", responde GJ. "Cunto?" l e pregunta. "Aproximadamente $2.848.238.493.902,77", dice GJ. "Hmm", dice. "Creo que hay que usar nmeros en coma flotante". ,Qu tipo de datos sencillos puede usar para crear variables en Java? Los encontrar en la tabla 2.1.Los tipos de datos sencillos pueden clasificarse por categoras, como se hizo al principio de este captulo: Enteros: estos tipos son byte, short, int y long, que guardan el signo y el valor. Tabla 2.1. Tipos de variables. 1 boolean 2 Verdadero, Falso I 1 char2 N/A I double8 -1.7976931 3486232E308 a -94065645841 247E-324 para valoresnegativos y 4.94065645841 247E-324 a 1.7976931 3486232E308 para valores positivos float -3.402823E38 a -1.401 298E-45 para valores negativos y 1.401298E-45 a 3.402823E38 para valores positivos 1 int 4 -2,147,483,648 a2,147,483,647 1 short 2 -32,768 a 32,767I Nmeros en coma flotante: estos tipos sonfloat y double, que almace- nan nmeros en coma flotante con signo. 80. Caracteres: este es el tipo char, que guarda las representaciones de los caracteres, tanto letras como nmeros. Booleano: este tipo est diseado para guardar slo dos valores: verda- dero (true) o falso (false). Hasta aqu, una visin general de los tipos de datos sencillos que estndisponibles. Veamos los siguientes puntos para ver cmo funciona cada unode ellos.Creacin de literales enteros El programador novato aparece y dice, "cmo asigno un valor hexadecimal,base 16, a una variable en Java?" "Tiene que usar un literal hexadecimal, que empieza con los caracteres Oxo OX", le responde. Un literal es un valor constante que se puede usar directamente en elcdigo Java, y hay una serie de reglas para controlarlo. En este captulo, ya heusado literales enteros, que son los que uilizan la mayora de los programado-res. Este es el ejemplo anterior: public class app {public static void main(String[] args) { int days = 365; System.out .println("Nmero de das = " + daysl ; 1 } Aqu, estoy asignando un literal entero con un valor de 365 a la variabledays. Por defecto, los literales enteros son del tipo int. Sin embargo, si se lesasigna a otros tipos de enteros, como short, Java convierte el tipo de literalautomticamente. Por otro lado, los valores long pueden tener ms dgitosque los int, por lo que Java proporciona una forma explcita de crear constan- 7tes long: se aade una L al final del literal. Este es el ejemplo: public class app I public static void rnain(String[l args) { long value; value = 1234567890123456789L; System.out.println("E1 valor = " + value); 81. Este es el resultado del cdigo:c:>java app~l valor = 1234567890123456789Adems puede crear literales en formato octal empezando con un cero y en formato hexadecimal empezando con O o OX. Estos son algunos ejemplos:xpublic class appIpublic static void main(String[] args){ int value; value = 16; System.out.println( "16 decimal = " + value); value = 0 2 0 ; System.out.println("20 octal = " + value + " en decimal".); value = 0x10;System. out. println("10 hexadecimal = " + value + " en decimal". );11Esto es lo que el programa visualiza:C:>java app16 decimal = 1620 octal = 16 en decimal.10 hexadecimal = 16 en decimal.Creacin de literales en coma flotanteEl programador novato aparece y dice, "Tengo un problema. Quiero poner un nmero en coma flotante, 1.5, en una variable de coma flotante, pero Java insiste en decir "Tipo incompatible para =. Se necesita conversin especfica para double". Qu ocurre?" "Por defecto", le dice, "los nmeros en coma flotante que se utilizan como literales son de tipo double, no de tipofloat. Se pueden cambiar aadiendo una F al final del literal para convertirlo en fo float o una d o D para pasarlo a double". "iAh!",contesta el PN. 82. En el cdigo, los literales en coma flotante son de tipo double por defecto,como por ejemplo, 3.1415926535, 1.5 y 0.111 111 1. La notacin estndarpara los literales en coma flotante es un nmero seguido por una parte 7 7fraccionaria. Adems se puede indicar en potencia de 10 con e o E : Esto es lo mismo que 1.345 x 101 -9.999E-23, que es lo mismo que-9.999 x 1o-23. A continuacin, vemos un ejemplo en el que se trata de asignar un literalen coma flotante a una variable tipofiroat: public class app Ipublic static void main(String[l args)I float value; value = 1.5f; System.out.println("E1 valor =+ value);1 1 Desafortunadamente, el tipo por defecto de los literales en coma flotante,es double, por lo que Java devuelve el siguiente error: C: >javac app.java -deprecation app. java:7: Incompatible type for = . Explicit cast needed to convertdouble to float.value = 1.5;A 1 errorEsto se puede arreglar explcitamente convirtiendo el literal afiroat, comose indica a continuacin: public class app {public static void main(String[] args){ float value; value = 1.5f;System.out.println("E1 valor = " + value); 1 1 Ahora, el cdigo se ejecuta como esperamos: C:>java app ~l valor = 1.5 83. Creacin de literales booleanosEn Java, los valores booleanos slo pueden ser verdaderos o falsos (no O 1 u otros valores numricos como ocurre en otros lenguajes; esto forma partede la insistencia de Java en los tipos de datos). Esto quiere decir que losnicos dos literales booleanos que se pueden usar son verdadero y falso.A continuacin vemos un ejemplo que utiliza verdadero (true) como lite-ral booleano: public class app {public static void main(String[l args)( boolean value; value = true;System.out.println("E1 valor = " + value); 1 1 Este es el resultado del programa: C:>java app El valor = trueCreacin de literales carcter "Hey", dice el programador novato, "cmo asigno una letra a una varia-ble en Java? Estoy evaluando todos los productos de la empresa y quieroasignarles letras". "Puede usar literales de tipo carcter, cada uno de loscuales representa un carcter", le responde. "Por cierto, el gran jefe sabeesto?" "Todava no", dice el PN. La forma bsica de un literal de tipo carcter en Java es un valor quecorresponde a un carcter del conjunto de caracteres Unicode (para msdetalles sobre Unicode, ver www.unicode.org). Los literales de tipo carcterson nmeros que actan como ndices dentro del conjunto de caracteresUnicode, no caracteres actuales. Por ejemplo, el cdigo Unicode para la letraC es 67. Sin embargo, la siguiente aplicacin visualiza una C: public class app (public static void main(String[l args) i char char3; 84. System.out.println("La tercera letra del alfabeto = " + char3); 1 Tambin, puede referirse al cdigo Unicode para la letra C con un literalde tipo carcter encerrado entre comillas simples: public class app 1 public static void main(String[] args) 1 char char3; System.out.println"La tercera letra del alfabeto = " + char3); 1 1 Adems de encerrar los caracteres entre comillas simples, tambin puedeencerrar secuencias de escape entre este tipo de comillas para obtener litera-les de tipo carcter que no pueden conseguirse tecleando un simple carcter.Estas son las secuencias de escape:(comilla simple) " (comillas dobles)(barra invertida) b (espacio en blanco) ddd (carcter octal) f (avance) n (nueva lnea) r (retorno de carro) t (tabulador) uxxxx (carcter Unicode en hexadecimal) Por ejemplo, si quiere que se visualice una doble comilla que aparece en eltexto, puede utilizar la secuencia de escape ": public class app 1 public static void main(String[] args) I dijo, n;Rolal"m); ~yet~.out.printin~1 85. Este es el resultado del cdigo: c:>java aPP $1 dijo, "iHola!"Creacin de literales tipo cadena El programador novato regresa con un caf. "De acuerdo", dice, "este es elproblema: quiero usar una sentencia println para sacar varias lneas, puedohacerlo?" "Claro", le dice, "utilice el literal de tipo carcter n para aadir unapregunta PN.nueva lnea". " ~ C ~ O ? , Esto es un ejemplo de lo que PN quiere hacer. En este caso, visualizarvarias lneas de texto utilizando el literal n para comenzar una nueva lnea: public class app {public static void main(String[] args){ System.o~t.println(~Estoes nun textonde varias lneasm.);1 1 Esta es la salida de la aplicacin: C:>java app Esto es un texto de varias lneas Como con la mayora de los lenguajes de programacin, se pueden ponercadenas entre comillas dobles (al igual que los literales de tipo carcter seencierran entre comillas simples). Adems se pueden utilizar secuencias deescape introducidas en la seccin anterior. Observe que el compilador con-vierte los literales de tipo cadena en objetos String, no en tipos de datossencillos inherentes (lo que quiere decir que el cdigo como "HolaW.length()es perfectamente legal y devuelve la longitud de la cadena "Hola").Declaracin de variables de tipo entero "Realmente, ahora es cuando estoy programando", dice el programadornovato, "y necesito almacenar algunos datos enteros. Cmo puedo hacerlo?""Con una variable entera", le dice. "Tome una silla y vemoslo". Java utiliza cuatro tipos de enteros, cada uno con su propio nmero debytes alocados en memoria: byte (un byte), short (dos bytes), int (cuatro 86. bytes) y long (ocho bytes). Para conocer el posible rango de valores que cada uno puede tomar, ver el punto "De qu tipos de datos disponemos?", en este captulo. Usar uno u otro depende del rango de datos que se quiera, as como de otras consideraciones, como cunta memoria hay disponible (en caso de que se quieran tener muchos enteros).Esto es un ejemplo que utiliza todos los tipos enteros, declara un entero de cada tipo, asigna a cada tipo un dato y luego visualiza ese dato:public class apppublic static void main(String[l args){ byte bytel; short shortl; int intl; long longl; bytel = 1; shortl = 100; intl = 10000; longl = 100000000; System.out.println("byte1 = " + bytel); System.out.println("shortl = " + shortl); System.out .println ( "intl =+ intl); System.out.println("1ongl = " + longl); 11Este es el resultado de la aplicacin:bytel = 1shortl = 100intl = 10000longl = 100000000Declaracin de variables de tipo coma flotante"Lo siento", dice el programador novato, "pero los enteros no se truncan. Estoy tratando de disear un conversor de moneda y crea que se poda ignorar la parte decimal de cada valor, pero el gran jefe me dijo que todos los decimales cuentan. Hay algn otro tipo de datos que pueda utilizar?" "Cla- ro", le dice. "Puede usarfloats y doubles".Java incluye dos tipos de variables en coma flotante, cada uno con su propio nmero de bytes para alocar en memoria:float (cuatro bytes) y double (ocho bytes). Para ver el rango posible de valores que cada tipo puede gestio- nar, ver la seccin "De qu tipo de datos disponemos?", en este captulo. El 87. usar uno u otro depende del rango de los datos que se quiera, as como de otras consideraciones, como cunta memoria hay disponible (en el caso de que se quiera tener muchos valores en coma flotante).A continuacin tiene un ejemplo que declara y usa ambos tipos, float y double (observe que explcitamente hago que los literales seanfloat o double, por lo que no habr ningn problema con las conversiones de tipo): public class app {public static void rnain(String[] args){float floatl;double doublel;floatl = 1.11111111111F;doublel = 1.1111111111111E+9D;System.out.println("f10atl = " + floatl);System.out.println("doub1el = " + doublel);1 1 Esta es la salida del cdigo (observe que he sobrepasado la precisinpermitida para un float, por lo que el valor se ha redondeado): C:zjava app floatl = 1.1111112 doublel = l.lllllllllllllE9Declaracin de variables de tipo carcterSe pueden declarar variables de tipo carcter con la palabra clave char.Para los posibles valores que se pueden almacenar en una variable char, vertambin en este captulo.Esto es un ejemplo en el que se declaran dos variables de tipo char: charly char2. Este ejemplo prueba que se puede asignar a un char un cdigoUnicode o un literal de tipo carcter (de hecho, el compilador traduce losliterales de tipo carcter en cdigos Unicode): public class app {public static void main(String[l args){char charl, char2; charl = 65; char2 = B;System.out.println("char1 = " + charl); 88. Este e s el resultado del cdigo: C:=-java app charl = A char2 = BA continuacin veremos un punto clave que se tratar en un tema futuro: aadir parte de un texto al final del charl, convirtindolo a una cadena, e incrementar el valor de char2, cambiando de B a C:public class appIpublic static void main(String[l args)Ichar charl, char2;charl = 65;char2 = B:System.out.println("char1 = " + charl);System.out.println("char2 = " + char2);+Sy~tcrm.out.println(~char1 1 =+ charl + 1);Esta es la salida de la nueva versin del programa:charl = Achar2 = Bcharl + 1 = Al++char2 = CDeclaracin de variables de tipo booleanoLas variables de tipo booleano se declaran con la palabra clave boolean. En Java, las variables de tipo booleano slo pueden tener dos valores: verda- dero y falso (no valores numricos como O y 1, como ocurre en otros lengua- jes de programacin). Aqu tenemos un ejemplo en el que se declara y se usan dos variables de tipo booleano:public class apptpublic static void main(String [ ] args) 89. { boolean booleanl, boolean2; booleanl = trUe; boolean2 = false; System.o~t.println(~boo1eanl " + booleanl); = System.out.println("boolean2 = " + booleanl); Este es el resultado del cdigo: C:>java app booleanl = true boolean2 = false Generalmente, durante las pruebas, se usan valores booleanos para deter-minar el flujo de un programa. De momento, no dir ms sobre ello y ledaremos un repaso en el siguiente captulo. En este caso, estoy usando dostipos de variables con la sentenciaifde Java. Compruebo el valor de booleanlcon la sentencia if, haciendo que el cdigo visualice el mensaje "booleanl esverdadero"., si es verdadero (true) y "booleanl es falso". en caso contrario: public class app {public static void main (String[1 args) { boolean booleanl, boolean2; booleanl = true; boolean2 = false: System.out.println("b001eanl = " + booleanl); If(booleanl) { System.o~t.println(~boolean1es verdadero".); 1 else { System.o~t.println(~boolean1 falsom.); es 1 1 1 El nuevo resultado es: C: >java app booleanl = true boolean2 = false booleanl es verdadero. 90. Inicializacin de variables "De acuerdo", dice el programador novato, "Ya lo tengo todo claro. Pri-mero, declaro una variable y despus le asigno un valor". "Realmente", ledice, "puede hacer las dos cosas en un solo paso". El PN contesta, "idgamecmo! " Pues bien, vamos a declarar variables y a asignarles valores de la siguienteforma: public class app I public static void main(String[l args) { int intl; i n t l = 1;System.out.println("int1 = " + intl); 1 1Sin embargo, puedo combinar estos dos pasos en uno solo inicializandouna variable cuando la declaro: public class app ( public static void main(String[] args) { i n t i n t l = 1;System.out.println("int1 = " + intl); 1 1 A continuacin se indica cmo se declaran e inicializan varias variables: public class app ( public static void main(String[] args){ i n t i n t l = 1, i n t 2 3 2, i n t 3 = 3;System.out.println("int1 = " + intl + " , int2 = " + int2 + " , int3 = " + int3);1 1 Este es el resultado del programa: C:>java app intl = 1, int2 = 2, int3 = 3 91. Inicializacin dinmicaLlegados a este punto, acabamos de asignar valores constantes a variables, pero se puede asignar cualquier expresin (una expresin es cualquier combi- nacin de trminos Java que da un valor) a una variable cuando es declarada, siempre que la expresin sea vlida en ese momento. Por ejemplo, aqu se est asignando el valor 2 a intl y 3 a int2 y el valor de intl veces int2 a int3, usando el operador multiplicacin de Java (*):public class appIpublic static void main(String[] args){ int intl = 2, int2 = 3; i n t int3 = i n t l * int2; System.out.println("int1 = " + intl + " , int2 = " + int2 + " , int3 = " + int3);Esto es lo que nos devuelve el cdigo cuando lo ejecutamos:C:>java appintl = 2, int2 = 3, int3= 6 Observe que el compilador de Java no tiene ni idea de lo que valdr intl veces int2 cuando crea los bytecodes para esta aplicacin. Esto significa que el valor actual con el que int3 est inicializado ser determinado en tiempo de ejecucin, y es por lo que este proceso se llama inicializacin dinmica. Al igual que en C++, en Java se puede introducir declaracin de variables en el cdigo, como se indica a continuacin:public class appI public static void main(String[] args)Ii n t i n t l = 2, i n t 2 = 3;System.out.println("int1 = " + intl + " , int2 = " + int2);i n t int3 = i n t lint2; 92. Este es el resultado del cdigo:C:>java appintl = 2, int2 = 3int3 = 6Conversin de tipos de datos"Uf", dice el programador novato. "Me he atascado. Tengo una variable de tipo int y quiero asignarla a una variable de tipo byte, pero Java me devuelve un error "Tipo incompatible para =". Qu es lo que est mal?" "Es un problema de conversin de tipos", le explica, "y tiene que usar explcitamen- te un cast de tipos". "Hmm", dice PN, "cmo se hace eso?"Java es un lenguaje muy insistente con los tipos, y como consecuencia de ello, con frecuencia nos enfrentamos a la situacin de asignar una variable de un tipo a una variable de otro. Hay dos formas de hacerlo: contando con una conversin automtica y haciendo explcitamente un cast de tipos. Vemos- las. Conversiones automticas"1Cuando asigna un tipo de dato a una variable de otro tipo, Java convertir el dato al nuevo tipo de variable de forma automtica si las dos condiciones siguientes son verdaderas:Los tipos del dato y de la variable son compatibles.El tipo de destino tiene un rango mayor que el de origen.7Por ejemplo, se puede asignar un valor de tipo byte a una variable int, ya que byte e int son tipos compatibles y las variables int tienen un rango mayor que los valores byte. Por lo tanto, no se perder ningn dato en la conversin de tipos. Esto es un ejemplo:public class app{ public static void main(String[l args)(byte bytel = 1;int intl;i n t l = bytel;System.out.println("int1 = " + intl); 93. El compilador de Java no tiene ningn problema con este cdigo y hace laconversin de tipos automticamente. Este es el resultado del programa: c:>java app intl = 1 Este tipo de conversiones, en las que se convierte a un tipo de datos quetiene mayor rango, se llaman extensin de conversiones. En ellas, los tiposnumricos, como entero o coma flotante, son compatibles entre s. Por otrolado, los tipos char y boolean no son compatibles entre s y tampoco con lostipos numricos.Casting a nuevos tipos de datos Si se est asignando un valor que es de un tipo con un rango mayor que lavariable a la que se le est asignando, se est ejecutando lo que se denominaestrechamiento de conversiones. El compilador de Java no las ejecutaautomticamente, ya que se perdera la posibilidad de precisin. Si se quiere hacer un estrechamiento de conversiones, se debe usar expl-citamente un cast, que tiene el siguiente formato: (tipo de dato de destino) valor Por ejemplo, en este cdigo, se est convirtiendo un tipo entero a un tipobyte: public class app Ipublic static void main(String[l args) { byte bytel; int intl = 1; byte1 = (byte) intl; System.out.println("byte1 = " + bytel); 1 1 Si no se hace explcitamente el cast, el compilador devolver error, perocon el cast de tipos, no hay problema, ya que Java decide que se conoce laposibilidad de perder algunos datos cuando se introduce un valor probable-mente mayor en un tipo ms pequeo. Por ejemplo, cuando se pone unnmero en coma flotante en un long, la parte fracciona1 del nmero se trunca- 94. r, y puede que se pierdan ms datos si el valor en coma flotante est fuera delrango que un long puede gestionar. Esta es la salida del cdigo: C:>java app bytel = 1 Algo a tener en cuenta es que el compilador de Java convierte a un tipo demayor precisin, si es necesario, al evaluar expresiones. Por ejemplo, vamosa considerar el siguiente cdigo, en el que parece que slo hay bytesinvolucrados: public class app I public static void main(String[] args){byte bytel = 100;byte byte2 = 100;byte byte3;byte3 = bytel * byte2 /100; 7 Por lo tanto, como Java sabe que de la multiplicacin de tipos puederesultar valores del tamao de un entero, automticamente convierte el resul-tado de bytel * byte2 en un entero, lo que quiere decir que realmente hay queusar explcitamente un cast para mantener el tipo