Você está na página 1de 100

Mapa Web

Portada Captulos del manual de Java Introduccin a Java Introduccin a Java El uso principal que se hace de Internet e incluso de las redes internas (corporativas) es correo electrnico (e-mail), aunque actualmente hay un auge sorprendente de la navegacin web . Los documentos web pueden contener variedad de texto, grficos de todas clases y proporcionar enlaces hipertexto hacia cualquier lugar de la red. Los navegadores utilizan documentos escritos en lenguaje HTML. La combinacin actual de navegadores HTML/WWW estn limitados pues, a texto y grficos. Si se quiere reproducir un sonido o ejecutar un programa de demostracin, primero hemos de bajarnos (download) el fichero en cuestin y luego utilizar un programa en nuestro ordenador capaz de entender el formato de ese fichero, o bien cargar un mdulo ( plugin ) en nuestro navegador para que pueda interpretar el fichero que hemos bajado. Hasta ahora, la nica forma de realizar una pgina web con contenido interactivo, era mediante la interfaz CGI ( Common Gateway Interface ), que permite pasar parmetros entre formularios definidos en lenguaje HTML y programas escritos en Perl o en C. Esta interfaz resulta muy incmoda de programar y es pobre en sus posibilidades. El lenguaje Java y los navegadores con soporte Java, proporcionan una forma diferente de hacer que ese navegador sea capaz de ejecutar programas. Con Java se puede reproducir sonido directamente desde el navegador, se pueden visitar home pages con animaciones, se puede ensear al navegador a manejar nuevos formatos de ficheros, e incluso, cuando se pueda transmitir video por las lneas telefnicas, nuestro navegador estar preparado para mostrar esas imgenes. Utilizando Java, se pueden eliminar los inconvenientes de la interfaz CGI y tambin se pueden aadir aplicaciones que vayan desde experimentos cientficos interactivos de propsito educativo a juegos o aplicaciones especializadas para la televenta. Es posible implementar publicidad interactiva y peridicos personalizados. Por ejemplo, alguien podra escribir un programa Java que implementara una simulacin qumica interactiva (una cadena de adn). Utilizando un navegador con soporte Java, un usuario podra recibir fcilmente esa simulacin e interaccionar con ella, en lugar de conseguir simplemente un dibujo esttico y algo de texto. Lo recibido cobra vida . Adems, con Java podemos estar seguros de que el cdigo que hace funcionar el experimento qumico no contiene ningn trozo de cdigo malicioso que dae al sistema. El cdigo

que intente actuar destructivamente o que contenga errores, no podr traspasar los muros defensivos colocados por las caractersticas de seguridad y robustez de Java. Adems, Java proporciona una nueva forma de acceder a las aplicaciones. El software viaja transparentemente a travs de la red. No hay necesidad de instalar las aplicaciones, ellas mismas vienen cuando se necesitan. Por ejemplo, la mayora de los navegadores del Web pueden procesar un reducido nmero de formatos grficos (tpicamente GIF y JPEG). Si se encuentran con otro tipo de formato, el navegador estndar no tiene capacidad para procesarlo, tendra que ser actualizado para poder aprovechar las ventajas del nuevo formato. Sin embargo, un navegador con soporte Java puede enlazar con el servidor que contiene el algoritmo que procesa ese nuevo formato y mostrar la imagen. Por lo tanto, si alguien inventa un nuevo algoritmo de compresin para imgenes, el inventor slo necesita estar seguro de que hay una copia en cdigo Java de ese algoritmo instalada en el servidor que contiene las imgenes que quiere publicar. Es decir, los navegadores con soporte Java se actualizan a s mismos sobre la marcha, cuando encuentran un nuevo tipo de fichero o algoritmo.

Origen de Java El uso principal que se hace de Internet e incluso de las redes internas (corporativas) es correo electrnico (e-mail), aunque actualmente hay un auge sorprendente de la navegacin web . Los documentos web pueden contener variedad de texto, grficos de todas clases y proporcionar enlaces hipertexto hacia cualquier lugar de la red. Los navegadores utilizan documentos escritos en lenguaje HTML. La combinacin actual de navegadores HTML/WWW estn limitados pues, a texto y grficos. Si se quiere reproducir un sonido o ejecutar un programa de demostracin, primero hemos de bajarnos (download) el fichero en cuestin y luego utilizar un programa en nuestro ordenador capaz de entender el formato de ese fichero, o bien cargar un mdulo ( plugin ) en nuestro navegador para que pueda interpretar el fichero que hemos bajado. Hasta ahora, la nica forma de realizar una pgina web con contenido interactivo, era mediante la interfaz CGI ( Common Gateway Interface ), que permite pasar parmetros entre formularios definidos en lenguaje HTML y programas escritos en Perl o en C. Esta interfaz resulta muy incmoda de programar y es pobre en sus posibilidades. El lenguaje Java y los navegadores con soporte Java, proporcionan una forma diferente de hacer que ese navegador sea capaz de ejecutar programas. Con Java se puede reproducir sonido directamente desde el navegador, se pueden visitar home pages con animaciones, se puede ensear al navegador a manejar nuevos formatos de ficheros, e incluso, cuando se pueda transmitir video por las lneas telefnicas, nuestro navegador estar preparado para mostrar esas imgenes. Utilizando Java, se pueden eliminar los inconvenientes de la interfaz CGI y tambin se pueden aadir aplicaciones que vayan desde experimentos cientficos interactivos de propsito educativo a juegos o aplicaciones especializadas para la televenta. Es posible implementar publicidad interactiva y peridicos personalizados. Por ejemplo, alguien podra escribir un programa Java que implementara una simulacin qumica interactiva

(una cadena de adn). Utilizando un navegador con soporte Java, un usuario podra recibir fcilmente esa simulacin e interaccionar con ella, en lugar de conseguir simplemente un dibujo esttico y algo de texto. Lo recibido cobra vida . Adems, con Java podemos estar seguros de que el cdigo que hace funcionar el experimento qumico no contiene ningn trozo de cdigo malicioso que dae al sistema. El cdigo que intente actuar destructivamente o que contenga errores, no podr traspasar los muros defensivos colocados por las caractersticas de seguridad y robustez de Java. Adems, Java proporciona una nueva forma de acceder a las aplicaciones. El software viaja transparentemente a travs de la red. No hay necesidad de instalar las aplicaciones, ellas mismas vienen cuando se necesitan. Por ejemplo, la mayora de los navegadores del Web pueden procesar un reducido nmero de formatos grficos (tpicamente GIF y JPEG). Si se encuentran con otro tipo de formato, el navegador estndar no tiene capacidad para procesarlo, tendra que ser actualizado para poder aprovechar las ventajas del nuevo formato. Sin embargo, un navegador con soporte Java puede enlazar con el servidor que contiene el algoritmo que procesa ese nuevo formato y mostrar la imagen. Por lo tanto, si alguien inventa un nuevo algoritmo de compresin para imgenes, el inventor slo necesita estar seguro de que hay una copia en cdigo Java de ese algoritmo instalada en el servidor que contiene las imgenes que quiere publicar. Es decir, los navegadores con soporte Java se actualizan a s mismos sobre la marcha, cuando encuentran un nuevo tipo de fichero o algoritmo.

Caractersticas de Java
Las caractersticas principales que nos ofrece Java respecto a cualquier otro lenguaje de programacin, son: Es SIMPLE : Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las caractersticas menos usadas y ms confusas de stos. C++ es un lenguaje que adolece de falta de seguridad, pero C y C++ son lenguajes ms difundidos, por ello Java se dise para ser parecido a C++ y as facilitar un rpido y fcil aprendizaje. Java elimina muchas de las caractersticas de otros lenguajes como C++, para mantener reducidas las especificaciones del lenguaje y aadir caractersticas muy tiles como el garbage collector (reciclador de memoria dinmica). No es necesario preocuparse de liberar memoria, el reciclador se encarga de ello y como es un thread de baja prioridad, cuando entra en accin, permite liberar bloques de memoria muy grandes, lo que reduce la fragmentacin de la memoria. Java reduce en un 50% los errores ms comunes de programacin con lenguajes como C y C++ al eliminar muchas de las caractersticas de stos, entre las que destacan: aritmtica de punteros no existen referencias registros (struct) definicin de tipos (typedef) macros (#define) necesidad de liberar memoria (free) Aunque, en realidad, lo que hace es eliminar las palabras reservadas (struct, typedef), ya que las clases son algo parecido. Adems, el intrprete completo de Java que hay en este momento es muy pequeo, solamente ocupa 215 Kb de RAM.

Es ORIENTADO A OBJETOS : Java implementa la tecnologa bsica de C++ con algunas mejoras y elimina algunas cosas para mantener el objetivo de la simplicidad del lenguaje. Java trabaja con sus datos como objetos y con interfaces a esos objetos. Soporta las tres caractersticas propias del paradigma de la orientacin a objetos: encapsulacin, herencia y polimorfismo. Las plantillas de objetos son llamadas, como en C++, clases y sus copias, instancias . Estas instancias, como en C++, necesitan ser construidas y destruidas en espacios de memoria. Java incorpora funcionalidades inexistentes en C++ como por ejemplo, la resolucin dinmica de mtodos. Esta caracterstica deriva del lenguaje Objective C, propietario del sistema operativo Next. En C++ se suele trabajar con libreras dinmicas (DLLs) que obligan a recompilar la aplicacin cuando se retocan las funciones que se encuentran en su interior. Este inconveniente es resuelto por Java mediante una interfaz especfica llamada RTTI ( RunTime Type Identification ) que define la interaccin entre objetos excluyendo variables de instancias o implementacin de mtodos. Las clases en Java tienen una representacin en el runtime que permite a los programadores interrogar por el tipo de clase y enlazar dinmicamente la clase con el resultado de la bsqueda. Es DISTRIBUIDO : Java se ha construido con extensas capacidades de interconexin TCP/IP. Existen libreras de rutinas para acceder e interactuar con protocolos como http y ftp . Esto permite a los programadores acceder a la informacin a travs de la red con tanta facilidad como a los ficheros locales. La verdad es que Java en s no es distribuido, sino que proporciona las libreras y herramientas para que los programas puedan ser distribuidos, es decir, que se corran en varias mquinas, interactuando. Es ROBUSTO : Java realiza verificaciones en busca de problemas tanto en tiempo de compilacin como en tiempo de ejecucin. La comprobacin de tipos en Java ayuda a detectar errores, lo antes posible, en el ciclo de desarrollo. Java obliga a la declaracin explcita de mtodos, reduciendo as las posibilidades de error. Maneja la memoria para eliminar las preocupaciones por parte del programador de la liberacin o corrupcin de memoria. Tambin implementa los arrays autnticos , en vez de listas enlazadas de punteros, con comprobacin de lmites, para evitar la posibilidad de sobreescribir o corromper memoria resultado de punteros que sealan a zonas equivocadas. Estas caractersticas reducen drsticamente el tiempo de desarrollo de aplicaciones en Java. Adems, para asegurar el funcionamiento de la aplicacin, realiza una verificacin de los byte-codes , que son el resultado de la compilacin de un programa Java. Es un cdigo de mquina virtual que es interpretado por el intrprete Java. No es el cdigo mquina directamente entendible por el hardware, pero ya ha pasado todas las fases del compilador: anlisis de instrucciones, orden de operadores, etc., y ya tiene generada la pila de ejecucin de rdenes. Java proporciona, pues: Comprobacin de punteros Comprobacin de lmites de arrays Excepciones Verificacin de byte-codes Es de ARQUITECTURA NEUTRAL : Para establecer Java como parte integral de la red, el compilador Java compila su cdigo a un fichero objeto de formato independiente de la arquitectura de la mquina en que se ejecutar. Cualquier mquina que tenga el sistema de ejecucin ( run-time ) puede

ejecutar ese cdigo objeto, sin importar en modo alguno la mquina en que ha sido generado. Actualmente existen sistemas run-time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac, Apple y probablemente haya grupos de desarrollo trabajando en el porting a otras plataformas.

El cdigo fuente Java se "compila" a un cdigo de bytes de alto nivel independiente de la mquina. Este cdigo (byte-codes) est diseado para ejecutarse en una mquina hipottica que es implementada por un sistema run-time, que s es dependiente de la mquina. En una representacin en que tuvisemos que indicar todos los elementos que forman parte de la arquitectura de Java sobre una plataforma genrica, obtendramos una figura como la siguiente:

En ella podemos ver que lo verdaderamente dependiente del sistema es la Mquina Virtual Java (JVM) y las libreras fundamentales, que tambin nos permitiran acceder directamente al hardware de la mquina.

Adems, habr APIs de Java que tambin entren en contacto directo con el hardware y sern dependientes de la mquina, como ejemplo de este tipo de APIs podemos citar:

Java 2D: grficos 2D y manipulacin de imgenes Java Media Framework : Elementos crticos en el tiempo: audio, video... Java Animation: Animacin de objetos en 2D Java Telephony: Integracin con telefona Java Share: Interaccin entre aplicaciones multiusuario Java 3D: Grficos 3D y su manipulacin Es SEGURO : La seguridad en Java tiene dos facetas. En el lenguaje, caractersticas como los punteros o el casting implcito que hacen los compiladores de C y C++ se eliminan para prevenir el acceso ilegal a la memoria. Cuando se usa Java para crear un navegador, se combinan las caractersticas del lenguaje con protecciones de sentido comn aplicadas al propio navegador. El lenguaje C, por ejemplo, tiene lagunas de seguridad importantes, como son los errores de alineacin . Los programadores de C utilizan punteros en conjuncin con operaciones aritmticas. Esto le permite al programador que un puntero referencie a un lugar conocido de la memoria y pueda sumar (o restar) algn valor, para referirse a otro lugar de la memoria. Si otros programadores conocen nuestras estructuras de datos pueden extraer informacin confidencial de nuestro sistema. Con un lenguaje como C, se pueden tomar nmeros enteros aleatorios y convertirlos en punteros para luego acceder a la memoria:

printf( "Escribe un valor entero: " ); scanf( "%u",&puntero ); printf( "Cadena de memoria: %sn",puntero );
Otra laguna de seguridad u otro tipo de ataque, es el Caballo de Troya . Se presenta un programa como una utilidad, resultando tener una funcionalidad destructiva. Por ejemplo, en UNIX se visualiza el contenido de un directorio con el comando ls . Si un programador deja un comando destructivo bajo esta referencia, se puede correr el riesgo de ejecutar cdigo malicioso, aunque el comando siga haciendo la funcionalidad que se le supone, despus de lanzar su carga destructiva. Por ejemplo, despus de que el caballo de Troya haya enviado por correo el /etc/shadow a su creador, ejecuta la funcionalidad de ls persentando el contenido del directorio. Se notar un retardo, pero nada inusual. El cdigo Java pasa muchos tests antes de ejecutarse en una mquina. El cdigo se pasa a travs de un verificador de byte-codes que comprueba el formato de los fragmentos de cdigo y aplica un probador de teoremas para detectar fragmentos de cdigo ilegal -cdigo que falsea punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de un objeto-. Si los byte-codes pasan la verificacin sin generar ningn mensaje de error, entonces sabemos que:

El cdigo no produce desbordamiento de operandos en la pila El tipo de los parmetros de todos los cdigos de operacin son conocidos y correctos No ha ocurrido ninguna conversin ilegal de datos, tal como convertir enteros en punteros El acceso a los campos de un objeto se sabe que es legal: public, private, protected No hay ningn intento de violar las reglas de acceso y seguridad establecidas El Cargador de Clases tambin ayuda a Java a mantener su seguridad, separando el espacio de nombres del sistema de ficheros local, del de los recursos procedentes de la red. Esto limita cualquier aplicacin del tipo Caballo de Troya , ya que las clases se buscan primero entre las locales y luego entre las procedentes del exterior. Las clases importadas de la red se almacenan en un espacio de nombres privado, asociado con el origen. Cuando una clase del espacio de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y luego en el espacio de nombres de la clase que hace la referencia. Esto imposibilita que una clase suplante a una predefinida.

En resumen, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a zonas delicadas de memoria o de sistema, con lo cual evitan la interaccin de ciertos virus. Java no posee una semntica especfica para modificar la pila de programa, la memoria libre o utilizar objetos y mtodos de un programa sin los privilegios del kernel del sistema operativo. Adems, para evitar modificaciones por parte de los crackers de la red, implementa un mtodo ultraseguro de autentificacin por clave pblica. El Cargador de Clases puede verificar una firma digital antes de realizar una instancia de un objeto. Por tanto, ningn objeto se crea y almacena en memoria, sin que se validen los privilegios de acceso. Es decir, la seguridad se integra en el momento de compilacin, con el nivel de detalle y de privilegio que sea necesario. Dada, pues la concepcin del lenguaje y si todos los elementos se mantienen dentro del estndar marcado por Sun, no hay peligro. Java imposibilita, tambin, abrir ningn fichero de la mquina local (siempre que se realizan operaciones con archivos, stas trabajan sobre el disco duro de la mquina de donde parti el applet), no permite ejecutar ninguna aplicacin nativa de una plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar nuestra mquina para hacer peticiones o realizar operaciones con otra. Adems, los intrpretes que incorporan los navegadores de la Web son an ms restrictivos. Bajo estas condiciones (y dentro de la filosofa de que el nico ordenador seguro es el que est apagado, desenchufado, dentro de una cmara acorazada en un bunker y rodeado por mil soldados de los cuerpos especiales del ejrcito), se puede considerar que Java es un lenguaje seguro y que los applets estn libres de virus. Respecto a la seguridad del cdigo fuente, no ya del lenguaje, JDK proporciona un desemsamblador de byte-code, que permite que cualquier programa pueda ser convertido a cdigo fuente, lo que para el programador significa una vulnerabilidad total a su cdigo. Utilizando javap no se obtiene el cdigo fuente original, pero s desmonta el programa mostrando el algoritmo que se utiliza, que es lo realmente interesante. La proteccin de los programadores ante esto es utilizar llamadas a programas nativos, externos (incluso en C o C++) de forma que no sea descompilable todo el cdigo; aunque as se pierda portabilidad. Esta es otra de las cuestiones que Java tiene pendientes. Es PORTABLE : Ms all de la portabilidad bsica por ser de arquitectura independiente, Java implementa otros estndares de portabilidad para facilitar el desarrollo. Los enteros son siempre enteros y adems, enteros de 32 bits en complemento a 2. Adems, Java construye sus interfaces de usuario a travs de un sistema abstracto de ventanas de forma que las ventanas puedan ser implantadas en entornos Unix, Pc o Mac. Es INTERPRETADO : El intrprete Java (sistema run-time) puede ejecutar directamente el cdigo objeto. Enlazar (linkar) un programa, normalmente, consume menos recursos que compilarlo, por lo que los desarrolladores con Java pasarn ms tiempo desarrollando y menos esperando por el ordenador. No obstante, el compilador actual del JDK es bastante lento. Por ahora, que todava no hay compiladores especficos de Java para las diversas plataformas, Java es ms lento que otros lenguajes de programacin, como C++, ya que debe ser interpretado y no ejecutado como sucede en cualquier programa tradicional. Se dice que Java es de 10 a 30 veces ms lento que C, y que tampoco existen en Java proyectos de gran envergadura como en otros lenguajes. La verdad es que ya hay comparaciones ventajosas entre Java y el resto de los lenguajes de programacin, y una ingente cantidad de folletos electrnicos que supuran fanatismo en favor y en contra de los distintos lenguajes contendientes con Java. Lo que se suele dejar de lado en todo esto, es que primero habra que decidir hasta que punto Java, un lenguaje en pleno desarrollo y todava sin definicin definitiva, est maduro como lenguaje de programacin para ser comparado con otros; como por ejemplo con Smalltalk, que lleva ms de 20 aos en cancha. La verdad es que Java para conseguir ser un lenguaje independiente del sistema operativo y del procesador que incorpore la mquina utilizada, es tanto interpretado como compilado. Y esto no es ningn contrasentido, me explico, el cdigo fuente escrito con cualquier editor se compila generando el bytecode. Este cdigo intermedio es de muy bajo nivel, pero sin alcanzar las instrucciones mquina propias de cada plataforma y no tiene nada que ver con el p-code de Visual Basic. El byte-code corresponde al 80% de las instrucciones de la aplicacin. Ese mismo cdigo es el que se puede ejecutar sobre cualquier plataforma. Para ello hace falta el run-time, que s es completamente dependiente de la mquina y del sistema operativo, que interpreta dinmicamente el byte-code y aade el 20% de instrucciones que faltaban para su ejecucin. Con este sistema es fcil crear aplicaciones multiplataforma, pero para ejecutarlas es necesario que exista el run-time correspondiente al sistema operativo utilizado.

Es MULTITHREADED : Al ser multithreaded (multihilvanado, en mala traduccin), Java permite muchas actividades simultneas en un programa. Los threads (a veces llamados, procesos ligeros), son bsicamente pequeos procesos o piezas independientes de un gran proceso. Al estar los threads contruidos en el lenguaje, son ms fciles de usar y ms robustos que sus homlogos en C o C++. El beneficio de ser miltithreaded consiste en un mejor rendimiento interactivo y mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real est limitado a las capacidades del sistema operativo subyacente (Unix, Windows, etc.), an supera a los entornos de flujo nico de programa (singlethreaded) tanto en facilidad de desarrollo como en rendimiento. Cualquiera que haya utilizado la tecnologa de navegacin concurrente, sabe lo frustrante que puede ser esperar por una gran imagen que se est trayendo. En Java, las imgenes se pueden ir trayendo en un thread independiente, permitiendo que el usuario pueda acceder a la informacin en la pgina sin tener que esperar por el navegador. Es DINAMICO : Java se beneficia todo lo posible de la tecnologa orientada a objetos. Java no intenta conectar todos los mdulos que comprenden una aplicacin hasta el tiempo de ejecucin. Las librera nuevas o actualizadas no paralizarn las aplicaciones actuales (siempre que mantengan el API anterior).

Java tambin simplifica el uso de protocolos nuevos o actualizados. Si su sistema ejecuta una aplicacin Java sobre la red y encuentra una pieza de la aplicacin que no sabe manejar, tal como se ha explicado en prrafos anteriores, Java es capaz de traer automticamente cualquiera de esas piezas que el sistema necesita para funcionar.

Instalacin del JSDK

El SDK de Java (JSDK) se proporciona gratuitamente desde la web de SUN. Para los ejemplos que aparecen en este manual la versin ms idnea es J2SE (Java 2 Standardad Edition). Es la distribucin base que cualquier kit de Java necesitar. Se puede obtener desde aqu http://java.sun.com/j2se/1.4.2/download.html Adems, en esa misma direccin podremos descargar el NetBeans, un potente editor de Java que nos facilitar la tarea de programar, compilar y resolver errores entre otras muchas cosas. Java es actualmente uno de los lenguajes ms populares y existen multitud de editores para l. Los ms conocidos son el JDeveloper, JBuilder, Visual J++ y por supuesto el propio NetBeans, de SUN. Sin embargo, aqu trataremos solo el uso del SDK, sin editor, ya que es lo ms recomendable. Si sabemos utilizar el SDK sin herramientas adicionales, tendremos mayor facilidad para usar cualquier editor y siempre que estemos faltos de algn editor, podremos salir del paso sin l. Las herramientas que trae el SDK y que ms utilizaremos son: java (ejecutable): Ejecuta cualquier programa compilado de Java javac (compilador): Compilar el cdigo fuente escrito en Java. Java no se ofrece de forma gratuita. No todas las mquinas disponen de la versin del Java Development Kit para ejecutarse en ellas. Por ello, solamente comentar la instalacin de JDK en Solaris, Windows y Linux. Actualmente ya hay entornos de desarrollo integrados completos para Java, diferentes del JDK de Sun. Oracle dispone de un entorno de desarrollo de Java, la propia SUN

ofrece el entorno NetBeans y Borland posee el JBuilder. Adems Microsoft ofrece soporte Java en su plataforma .NET. No obstante, trataremos solamente el JDK. El entorno bsico del JDK de Java que proporciona Sun est formado por herramientas en modo texto, que son: java, intrprete que ejecuta programas en byte-code. javac, compilador de Java que convierte el cdigo fuente en byte-code. javah, crea ficheros de cabecera para implementar mtodos para cualquier clase. javap, es un descompilador de byte-code a cdigo fuente Java. javadoc, es un generador automtico de documentos HTML a partir del cdigo fuente Java. javaprof, es un profiler para aplicaciones de un solo thread. El entorno habitual pues, consiste en un navegador que pueda ejecutar applets, un compilador que convierta el cdigo fuente Java a byte-code y el intrprete Java para ejecutar los programas. Estos son los componenetes bsicos para desarrollar algo en Java. No obstante se necesita un editor para escribir el cdigo fuente, y no son estrictamente necesarias otras herramientas como el debugger, un entorno visual, la documentacin o un visualizador de jerarqua de clases. Cualquier navegador actual servir para mostrar los Applets Java que realicemos. La instalacin en un principio es como la de cualquier otro programa, pero una vez lo hayamos instalado tenemos que incluir en el path del sistema operativo la ruta hacia el directorio bin. Por ejemplo si hemos instalado Java en: c:java En el PATH de nuestro sistema operativo debe estar presente la ruta: c:javabin En Windows XP, para cambiar las variables del sistema, se debe ir a Inicio > Configuracin > Panel de Control > Sistema > Opciones Avanzadas > Variables de entorno. Una vez hecho esto, abrimos la consola, Inicio > Ejecutar > cmd y ya deberan estar disponibles los comandos "java" y "javac". En Linux la instalacin es muy similar.

Conceptos Basicos Ahora que ya hemos visto a grandes rasgos lo que Java puede ofrecernos, y antes de entrar a saco en la generacin de nuestro primer cdigo Java, vamos a echar un vistazo al lenguaje Java en s. Lo bsico resultar muy familiar a los que tengan conocimientos de C/C++. Los programadores con experiencia en otros lenguajes procedurales reconocern la mayor parte de las construcciones. Esperemos que este captulo no resulte demasiado intenso, no obstante, s debe estar presente, porque ms de una vez

recurriremos a l como referencia. En posteriores captulos profundizaremos sobre aspectos de la programacin en Java por los que aqu pasaremos de puntillas e iremos presentando ejemplos de cdigo de cada uno de esos aspectos de la programacin en Java. Programacin Cuando se programa en Java, se coloca todo el cdigo en mtodos, de la misma forma que se escriben funciones en lenguajes como C. Comentarios En Java hay tres tipos de comentarios:
// comentarios para una sola lnea /* comentarios de una o ms lneas */ /** comentario de documentacin, de una o ms lneas */

Los dos primeros tipos de comentarios son los que todo programador conoce y se utilizan del mismo modo. Los comentarios de documentacin, colocados inmediatamente antes de una declaracin (de variable o funcin), indican que ese comentario ha de ser colocado en la documentacin que se genera automticamente cuando se utiliza la herramienta de Java, javadoc. Dichos comentarios sirven como descripcin del elemento declarado permitiendo generar una documentacin de nuestras clases escrita al mismo tiempo que se genera el cdigo. En este tipo de comentario para documentacin, se permite la introduccin de algunos tokens o palabras clave, que harn que la informacin que les sigue aparezca de forma diferente al resto en la documentacin.

Identificadores Los identificadores nombran variables, funciones, clases y objetos; cualquier cosa que el programador necesite identificar o usar. En Java, un identificador comienza con una letra, un subrayado (_) o un smbolo de dlar ($). Los siguientes caracteres pueden ser letras o dgitos. Se distinguen las maysculas de las minsculas y no hay longitud mxima. Seran identificadores vlidos:
identificador nombre_usuario Nombre_Usuario _variable_del_sistema $transaccion
y su uso sera, por ejemplo:

int contador_principal; char _lista_de_ficheros; float $cantidad_en_Ptas;

Palabras clave Las siguientes son las palabras clave que estn definidas en Java y que no se pueden utilizar como indentificadores:

abstract continue for boolean default goto break do if byte double implements byvalue else import case extends instanceof catch false int char final interface class finally long const float native

new null package private protected public return short static super

switch synchronized this threadsafe throw transient true try void while

Palabras Reservadas Adems, el lenguaje se reserva unas cuantas palabras ms, pero que hasta ahora no tienen un cometido especfico. Son:

cast operator

future outer

rest

generic

var

inner

Literales Un valor constante en Java se crea utilizando una representacin literal de l. Java utiliza cinco tipos de elementos: enteros, reales en coma flotante, booleanos, caracteres y cadenas, que se pueden poner en cualquier lugar del cdigo fuente de Java. Cada uno de estos literales tiene un tipo correspondiente asociado con l. Enteros:

byte short int long Por ejemplo:

8 bits 16 bits 32 bits 64 bits 21 077

0xDC00

complemento a dos complemento a dos complemento a dos complemento a dos

Reales en coma flotante:

float double Por ejemplo:


Booleanos:

3.14

32 bits 64 bits 2e12 3.1E12

IEEE 754 IEEE 754

true false
Caracteres:

Por ejemplo: a t u???? [????] es un nmero unicode


Cadenas:

Por ejemplo: "Esto es una cadena literal" Arrays Se pueden declarar en Java arrays de cualquier tipo:

char s[]; int iArray[];


Incluso se pueden construir arrays de arrays:

int tabla[][] = new int[4][5];


Los lmites de los arrays se comprueban en tiempo de ejecucin para evitar desbordamientos y la corrupcin de memoria. En Java un array es realmente un objeto, porque tiene redefinido el operador []. Tiene una funcin miembro: length. Se puede utilizar este mtodo para conocer la longitud de cualquier array.

int a[][] = new int[10][3]; a.length; /* 10 */ a[0].length; /* 3 */


Para crear un array en Java hay dos mtodos bsicos. Crear un array vaco:

int lista[] = new int[50];


o se puede crear ya el array con sus valores iniciales:

String nombres[] = { "Juan","Pepe","Pedro","Maria" };


Esto que es equivalente a:

String nombres[]; nombres = new String[4]; nombres[0] = new String( nombres[1] = new String( nombres[2] = new String( nombres[3] = new String(

"Juan" ); "Pepe" ); "Pedro" ); "Maria" );

No se pueden crear arrays estticos en tiempo de compilacin:

int lista[50];

// generar un error en tiempo de compilacin

Tampoco se puede rellenar un array sin declarar el tamao con el operador new:

int lista[]; for( int i=0; i < 9; i++ ) lista[i] = i;


Es decir, todos los arrays en Java son estticos. Para convertir un array en el equivalente a un array dinmico en C/C++, se usa la clase vector, que permite operaciones de insercin, borrado, etc. en el array.

Operadores Los operadores de Java son muy parecidos en estilo y funcionamiento a los de C. En la siguiente tabla aparecen los operadores que se utilizan en Java, por orden de precedencia:

++ ! * + << < & && ? : =

-~ / >> > ^ || op=

[]

() instanceof % >>> <= | (*= >= == !=

/=

%=

+=

-=

etc.) ,

Los operadores numricos se comportan como esperamos:

int + int = int


Los operadores relacionales devuelven un valor booleano. Para las cadenas, se pueden utilizar los operadores relacionales para comparaciones adems de + y += para la concatenacin:

String nombre = "nombre" + "Apellido";


El operador = siempre hace copias de objetos, marcando los antiguos para borrarlos, y ya se encargar el garbage collector de devolver al sistema la memoria ocupada por el objeto eliminado. Separadores Slo hay un par de secuencias con otros caracteres que pueden aparecer en el cdigo Java; son los separadores simples, que van a definir la forma y funcin del cdigo. Los separadores admitidos en Java son: () - parntesis. Para contener listas de parmetros en la definicin y llamada a mtodos. Tambin se utiliza para definir precedencia en expresiones, contener expresiones para control de flujo y rodear las conversiones de tipo. {} - llaves. Para contener los valores de matrices inicializadas automticamente. Tambin se utiliza para definir un bloque de cdigo, para clases, mtodos y mbitos locales. [] - corchetes. Para declarar tipos matriz. Tambin se utiliza cuando se referencian valores de matriz. ; - punto y coma. Separa sentencias. , - coma. Separa identificadores consecutivos en una declaracin de variables. Tambin se utiliza para encadenar sentencias dentro de una sentencia for. . - punto. Para separar nombres de paquete de subpaquetes y clases. Tambin se utiliza para separar una variable o mtodo de una variable de referencia.

Control de Flujo Muchas de las sentencias de control del flujo del programa se han tomado del C: Sentencias de Salto

if/else if( Boolean ) { sentencias; } else { sentencias; } switch switch( expr1 ) { case expr2: sentencias; break; case expr3: sentencias; break; default: sentencias; break; } Sentencias de Bucle Bucles for for( expr1 inicio; expr2 test; expr3 incremento ) { sentencias; } El siguiente trocito de cdigo Java que dibuja varias lneas en pantalla alternando sus colores entre rojo, azul y verde. Este fragmento sera parte de una funcin Java (mtodo): int contador; for( contador=1; contador <= 12; contador++ ) { switch( contador % 3 ) { case 0: setColor( Color.red ); break; case 1: setColor( Color.blue ); break; case 2: setColor( Color.green ); break; } g.drawLine( 10,contador*10,80,contador*10 ); } Tambin se soporta el operador coma (,) en los bucles for for( a=0,b=0; a < 7; a++,b+=2 )

Bucles while while( Boolean ) { sentencias; } Bucles do/while do { sentencias; }while( Boolean ); Excepciones try-catch-throw try { sentencias; } catch( Exception ) { sentencias; } Java implementa excepciones para facilitar la construccin de cdigo robusto. Cuando ocurre un error en un programa, el cdigo que encuentra el error lanza una excepcin, que se puede capturar y recuperarse de ella. Java proporciona muchas excepciones predefinidas. Control General del Flujo break [etiqueta] continue [etiqueta] return expr; etiqueta: sentencia; En caso de que nos encontremos con bucles anidados, se permite el uso de etiquetas para poder salirse de ellos, por ejemplo: uno: for( ) { dos: for( ) { continue; // seguira en el bucle interno continue uno; // seguira en el bucle principal break uno; // se saldra del bucle principal } } En el cdigo de una funcin siempre hay que ser consecuentes con la declaracin que se haya hecho de ella. Por ejemplo, si se declara una funcin para que devuelva un entero, es imprescindible que se coloque un return final para salir de esa funcin, independientemente de que haya otros en medio del cdigo que tambin provoquen la salida de la funcin. En caso de no hacerlo se generar un Warning, y el cdigo Java no se puede compilar con Warnings.

int func() { if( a == 0 ) return 1; return 0; // es imprescindible porque se retorna un entero } Clases Las clases son lo ms simple de Java. Todo en Java forma parte de una clase, es una clase o describe como funciona una clase. El conocimiento de las clases es fundamental para poder entender los programas Java. Todas las acciones de los programas Java se colocan dentro del bloque de una clase o un objeto. Todos los mtodos se definen dentro del bloque de la clase, Java no soporta funciones o variables globales. Esto puede despistar a los programadores de C++, que pueden definir mtodos fuera del bloque de la clase, pero esta posibilidad es ms un intento de no separarse mucho y ser compatible con C, que un buen diseo orientado a objetos. As pues, el esqueleto de cualquier aplicacin Java se basa en la definicin de una clase. Todos los datos bsicos, como los enteros, se deben declarar en las clases antes de hacer uso de ellos. En C la unidad fundamental son los ficheros con cdigo fuente, en Java son las clases. De hecho son pocas las sentencias que se pueden colocar fuera del bloque de una clase. La palabra clave import (equivalente al #include) puede colocarse al principio de un fichero, fuera del bloque de la clase. Sin embargo, el compilador reemplazar esa sentencia con el contenido del fichero que se indique, que consistir, como es de suponer, en ms clases. Tipos de Clases Hasta ahora slo se ha utilizado la palabra clave public para calificar el nombre de las clases que hemos visto, pero hay tres modificadores ms. Los tipos de clases que podemos definir son: abstract Una clase abstract tiene al menos un mtodo abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia. final Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final. public Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas.

synchronizable Este modificador especifica que todos los mtodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban. Variables y Mtodos de Instancia Una clase en Java puede contener variables y mtodos. Las variables pueden ser tipos primitivos como int, char, etc. Los mtodos son funciones. Por ejemplo, en el siguiente trozo de cdigo podemos observarlo: public MiClase { int i; public MiClase() { i = 10; } public void Suma_a_i( int j ) { i = i + j; } } La clase MiClase contiene una variable (i) y dos mtodos, MiClase que es el constructor de la clase y Suma_a_i( int j ). Ambito de una variable Los bloques de sentencias compuestas en Java se delimitan con dos llaves. Las variables de Java slo son vlidas desde el punto donde estn declaradas hasta el final de la sentencia compuesta que la engloba. Se pueden anidar estas sentencias compuestas, y cada una puede contener su propio conjunto de declaraciones de variables locales. Sin embargo, no se puede declarar una variable con el mismo nombre que una de mbito exterior. El siguiente ejemplo intenta declarar dos variables separadas con el mismo nombre. En C y C++ son distintas, porque estn declaradas dentro de mbitos diferentes. En Java, esto es ilegal. Class Ambito { int i = 1; // mbito exterior { // crea un nuevo mbito int i = 2; // error de compilacin } } Mtodos y Constructores

Los mtodos son funciones que pueden ser llamadas dentro de la clase o por otras clases. El constructor es un tipo especfico de mtodo que siempre tiene el mismo nombre que la clase. Cuando se declara una clase en Java, se pueden declarar uno o ms constructores opcionales que realizan la inicializacin cuando se instancia (se crea una ocurrencia) un objeto de dicha clase. Utilizando el cdigo de ejemplo anterior, cuando se crea una nueva instancia de MiClase, se crean (instancian) todos los mtodos y variables, y se llama al constructor de la clase: MiClase mc; mc = new MiClase(); 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 declaracin de tipo. Despus de ser instanciado un nuevo objeto mc, el valor de i en el objeto mc ser igual a 10. Se puede referenciar la variable (de instancia) i con el nombre del objeto: mc.i++; // incrementa la instancia de i de mc Al tener mc todas las variables y mtodos de MiClase, se puede usar la primera sintaxis para llamar al mtodo Suma_a_i() utilizando el nuevo nombre de clase mc: mc.Suma_a_i( 10 ); y ahora la variable mc.i vale 21. Finalizadores Java no utiliza destructores (al contrario que C++) ya que tiene una forma de recoger automticamente todos los objetos que se salen del alcance. No obstante proporciona un mtodo que, cuando se especifique en el cdigo de la clase, el reciclador de memoria (garbage collector) llamar: // Cierra el canal cuando este objeto es reciclado protected void finalize() { close(); } Alcance de Objetos y Reciclado de Memoria Los objetos tienen un tiempo de vida y consumen recursos durante el mismo. Cuando un objeto no se va a utilizar ms, debera liberar el espacio que ocupaba en la memoria de forma que las aplicaciones no la agoten (especialmente las grandes). En Java, la recoleccin y liberacin de memoria es responsabilidad de un thread llamado automatic garbage collector (recolector automtico de basura). Este thread

monitoriza el alcance de los objetos y marca los objetos que se han salido de alcance. Veamos un ejemplo: String s; // no se ha asignado todavia s = new String( "abc" ); // memoria asignada s = "def"; // se ha asignado nueva memoria // (nuevo objeto) Ms adelante veremos en detalle la clase String , pero una breve descripcin de lo que hace esto es; crear un objeto String y rellenarlo con los caracteres "abc" y crear otro (nuevo) String y colocarle los caracteres "def". En esencia se crean dos objetos: Objeto String "abc" Objeto String "def" Al final de la tercera sentencia, el primer objeto creado de nombre s que contiene "abc" se ha salido de alcance. No hay forma de acceder a l. Ahora se tiene un nuevo objeto llamado s y contiene "def". Es marcado y eliminado en la siguiente iteracin del thread reciclador de memoria.

Herencia La Herencia es el mecanismo por el que se crean nuevos objetos definidos en trminos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puede crear la subclase Pato, que es una especializacin de Ave. class Pato extends Ave { int numero_de_patas; } La palabra clave extends se usa para generar una subclase (especializacin) de un objeto. Una Pato es una subclase de Ave. Cualquier cosa que contenga la definicin de Ave ser copiada a la clase Pato, adems, en Pato se pueden definir sus propios mtodos y variables de instancia. Se dice que Pato deriva o hereda de Ave. Adems, se pueden sustituir los mtodos proporcionados por la clase base. Utilizando nuestro anterior ejemplo de MiClase, aqu hay un ejemplo de una clase derivada sustituyendo a la funcin Suma_a_i() : import MiClase; public class MiNuevaClase extends MiClase { public void Suma_a_i( int j ) { i = i + ( j/2 ); } } Ahora cuando se crea una instancia de MiNuevaClase, el valor de i tambin se inicializa a 10, pero la llamada al mtodo Suma_a_i() produce un resultado diferente: MiNuevaClase mnc; mnc = new MiNuevaClase();

mnc.Suma_a_i( 10 ); En Java no se puede hacer herencia mltiple. Por ejemplo, de la clase aparato con motor y de la clase animal no se puede derivar nada, sera como obtener el objeto toro mecnico a partir de una mquina motorizada (aparato con motor) y un toro (aminal). En realidad, lo que se pretende es copiar los mtodos, es decir, pasar la funcionalidad del toro de verdad al toro mecnico, con lo cual no sera necesaria la herencia mltiple sino simplemente la comparticin de funcionalidad que se encuentra implementada en Java a travs de interfaces . Control de Acceso Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se quiere para las variables de instancia y los mtodos definidos en la clase: public public void CualquieraPuedeAcceder(){} Cualquier clase desde cualquier lugar puede acceder a las variables y mtodos de instacia pblicos. protected protected void SoloSubClases(){} Slo las subclases de la clase y nadie ms puede acceder a las variables y mtodos de instancia protegidos. private private String NumeroDelCarnetDeIdentidad;Las variables y mtodos de instancia privados slo pueden ser accedidos desde dentro de la clase. No son accesibles desde las subclases. friendly (sin declaracin especfica) void MetodoDeMiPaquete(){}Por defecto, si no se especifica el control de acceso, las variables y mtodos de instancia se declaran friendly (amigas), lo que significa que son accesibles por todos los objetos dentro del mismo paquete, pero no por los externos al paquete. Es lo mismo que protected. Los mtodos protegidos (protected) pueden ser vistos por las clases derivadas, como en C++, y tambin, en Java, por los paquetes (packages). Todas las clases de un paquete pueden ver los mtodos protegidos de ese paquete. Para evitarlo, se deben declarar como private protected , lo que hace que ya funcione como en C++ en donde slo se puede acceder a las variables y mtodos protegidos de las clases derivadas. Variables y Mtodos Estticos En un momento 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 nica copia de la variable de instancia. Se usar para ello la palabra clave static . class Documento extends Pagina { static int version = 10; }

El valor de la variable version ser el mismo para cualquier objeto instanciado de la clase Documento . Siempre que un objeto instanciado de Documento cambie la variable version , sta cambiar para todos los objetos. De la misma forma se puede declarar un mtodo como esttico, lo que evita que el mtodo pueda acceder a las variables de instancia no estticas: class Documento extends Pagina { static int version = 10; int numero_de_capitulos; static void annade_un_capitulo() { numero_de_capitulos++; // esto no funciona } static void modifica_version( int i ) { version++; // esto si funciona } } La modificacin de la variable numero_de_capitulos no funciona porque se est violando una de las reglas de acceso al intentar acceder desde un mtodo esttico a una variable no esttica. Todas las clases que se derivan, cuando se declaran estticas, comparten la misma pgina de variables; es decir, todos los objetos que se generen comparten la misma zona de memoria. Las funciones estticas se usan para acceder solamente a variables estticas. class UnaClase { int var; UnaClase() { var = 5; } UnaFuncion() { var += 5; } } En el cdigo anterior, si se llama a la funcin UnaFuncion a travs de un puntero a funcin, no se podra acceder a var , porque al utilizar un puntero a funcin no se pasa implcitamente el puntero al propio objeto ( this ). Sin embargo, s se podra acceder a var si fuese esttica, porque siempre estara en la misma posicin de memoria para todos los objetos que se creasen de UnaClase. this y super Al acceder a variables de instancia de una clase, la palabra clave this hace referencia a los miembros de la propia clase. Volviendo al ejemplo de MiClase, se puede aadir otro constructor de la forma siguiente: public class MiClase { int i;

public MiClase() { i = 10; } // Este constructor establece el valor de i public MiClase( int valor ) { this.i = valor; // i = valor } public void Suma_a_i( int j ) { i = i + j; } } Aqu this.i se refiere al entero i en la clase MiClase . Si se necesita llamar al mtodo padre dentro de una clase que ha reemplazado ese mtodo, se puede hacer referencia al mtodo padre con la palabra clave super : import MiClase; public class MiNuevaClase extends MiClase { public void Suma_a_i( int j ) { i = i + ( j/2 ); super.Suma_a_i( j ); } } En el siguiente cdigo, el constructor establecer el valor de i a 10, despus lo cambiar a 15 y finalmente el mtodo Suma_a_i() de la clase padre (MiClase) lo dejar en 25: MiNuevaClase mnc; mnc = new MiNuevaClase(); mnc.Suma_a_i( 10 ); Clases Abstractas Una de las caractersticas ms tiles de cualquier lenguaje orientado a objetos es la posibilidad de declarar clases que definen como se utiliza solamente, sin tener que implementar mtodos. Esto es muy til cuando la implementacin es especfica para cada usuario, pero todos los usuarios tienen que utilizar los mismos mtodos. Un ejemplo de clase abstracta en Java es la clase Graphics : public abstract class Graphics { public abstract void drawLine( int x1,int y1,int x2, int y2 ); public abstract void drawOval( int x,int y,int width, int height ); public abstract void drawArc( int x,int y,int width, int height,int startAngle,int arcAngle ); ... } Los mtodos se declaran en la clase Graphics , pero el cdigo que ejecutar el mtodo est en algn otro sitio: public class MiClase extends Graphics {

public void drawLine( int x1,int y1,int x2,int y2 ) { <cdigo para pintar lneas -especfico de la arquitectura-> } } Cuando una clase contiene un mtodo abstracto tiene que declararse abstracta. No obstante, no todos los mtodos de una clase abstracta tienen que ser abstractos. Las clases abstractas no pueden tener mtodos privados (no se podran implementar) ni tampoco estticos. Una clase abstracta tiene que derivarse obligatoriamente, no se puede hacer un new de una clase abstracta. Una clase abstracta en Java es lo mismo que en C++ virtual func() = 0; lo que obliga a que al derivar de la clase haya que implementar forzosamente los mtodos de esa clase abstracta. Interfaces Los mtodos abstractos son tiles cuando se quiere que cada implementacin de la clase parezca y funcione igual, pero necesita que se cree una nueva clase para utilizar los mtodos abstractos. Los interfaces proporcionan un mecanismo para abstraer los mtodos a un nivel superior. Un interface contiene una coleccin de mtodos que se implementan en otro lugar. Los mtodos de una clase son public , static y final . La principal diferencia entre interface y abstract es que un interface proporciona un mecanismo de encapsulacin de los protocolos de los mtodos sin forzar al usuario a utilizar la herencia. Por ejemplo: public interface VideoClip { // comienza la reproduccion del video void play(); // reproduce el clip en un bucle void bucle(); // detiene la reproduccion void stop(); } Las clases que quieran utilizar el interface VideoClip utilizarn la palabra implements y proporcionarn el cdigo necesario para implementar los mtodos que se han definido para el interface: class MiClase implements VideoClip { void play() { <cdigo> }

void bucle() { <cdigo> } void stop() { <cdigo> } Al utilizar implements para el interface es como si se hiciese una accin de copiar-ypegar del cdigo del interface, con lo cual no se hereda nada, solamente se pueden usar los mtodos. La ventaja principal del uso de interfaces es que una clase interface puede ser implementada por cualquier nmero de clases, permitiendo a cada clase compartir el interfaz de programacin sin tener que ser consciente de la implementacin que hagan las otras clases que implementen el interface . class MiOtraClase implements VideoClip { void play() { <cdigo nuevo> } void bucle() { <cdigo nuevo> } void stop() { <cdigo nuevo> } Mtodos Nativos Java proporciona un mecanismo para la llamada a funciones C y C++ desde nuestro cdigo fuente Java. Para definir mtodos como funciones C o C++ se utiliza la palabra clave native . public class Fecha { int ahora; public Fecha() { ahora = time(); } private native int time(); static { System.loadLibrary( "time" ); } } Una vez escrito el cdigo Java, se necesitan ejecutar los pasos siguientes para poder integrar el cdigo C o C++: Utilizar javah para crear un fichero de cabecera (.h) Utilizar javah para crear un fichero de stubs , es decir, que contiene la declaracin de las funciones

Escribir el cdigo del mtodo nativo en C o C++, es decir, rellenar el cdigo de la funcin, completando el trabajo de javah al crear el fichero de stubs Compilar el fichero de stubs y el fichero .c en una librera de carga dinmica ( DLL en Windows '95 o libXX.so en Unix) Ejecutar la aplicacin con el appletviewer Ms adelante trataremos en profundidad los mtodos nativos, porque aaden una gran potencia a Java, al permitirle integrar a travs de librera dinmica cualquier algoritmo desarrollado en C o C++, lo cual, entre otras cosas, se utiliza como mtodo de proteccin contra la descompilacin completa del cdigo Java. Paquetes La palabra clave package permite agrupar clases e interfaces. Los nombres de los paquetes son palabras separadas por puntos y se almacenan en directorios que coinciden con esos nombres. Por ejemplo, los ficheros siguientes, que contienen cdigo fuente Java: Applet.java, AppletContext.java, AppletStub.java, AudioClip.java contienen en su cdigo la lnea: package java.applet; Y las clases que se obtienen de la compilacin de los ficheros anteriores, se encuentran con el nombre nombre_de_clase.class, en el directorio: java/applet Import Los paquetes de clases se cargan con la palabra clave import, especificando el nombre del paquete como ruta y nombre de clase (es lo mismo que #include de C/C++). Se pueden cargar varias clases utilizando un asterisco. import java.Date; import java.awt.*; Si un fichero fuente Java no contiene ningn package, se coloca en el paquete por defecto sin nombre. Es decir, en el mismo directorio que el fichero fuente, y la clase puede ser cargada con la sentencia import: import MiClase; Paquetes de Java

El lenguaje Java proporciona una serie de paquetes que incluyen ventanas, utilidades, un sistema de entrada/salida general, herramientas y comunicaciones. En la versin actual del JDK, los paquetes Java que se incluyen son: java.applet Este paquete contiene clases diseadas para usar con applets. Hay una clase Applet y tres interfaces: AppletContext, AppletStub y AudioClip. java.awt El paquete Abstract Windowing Toolkit (awt) contiene clases para generar widgets y componentes GUI (Interfaz Grfico de Usuario). Incluye las clases Button, Checkbox, Choice, Component, Graphics, Menu, Panel, TextArea y TextField. java.io El paquete de entrada/salida contiene las clases de acceso a ficheros: FileInputStream y FileOutputStream. java.lang Este paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread, Exception, System, Integer, Float, Math, String, etc. java.net Este paquete da soporte a las conexiones del protocolo TCP/IP y, adems, incluye las clases Socket, URL y URLConnection. java.util Este paquete es una miscelnea de clases tiles para muchas cosas en programacin. Se incluyen, entre otras, Date (fecha), Dictionary (diccionario), Random (nmeros aleatorios) y Stack (pila FIFO).

Referencias Las referencias en Java no son punteros ni referencias como en C++. Este hecho crea un poco de confusin entre los programadores que llegan por primera vez a Java. Las referencias en Java son identificadores de instancias de las clases Java. Una referencia

dirige la atencin a un objeto de un tipo especfico. No tenemos por qu saber cmo lo hace ni necesitamos saber qu hace ni, por supuesto, su implementacin. Pensemos en una referencia como si se tratase de la llave electrnica de la habitacin de un hotel. Vamos a utilizar precisamente este ejemplo del Hotel para demostrar el uso y la utilizacin que podemos hacer de las referencias en Java. Primero crearemos la clase Habitacion , implementada en el fichero Habitacion.java , mediante instancias de la cual construiremos nuestro Hotel: public class Habitacion { private int numHabitacion; private int numCamas; public Habitacion() { habitacion( 0 ); } public Habitacion( int numeroHab ) { habitacion( numeroHab ); } public Habitacion( int numeroHab,int camas ) { habitacion( numeroHab ); camas( camas ); } public synchornized int habitacion() { return( numHabitacion ); } public synchronized void habitacion( int numeroHab ) { numHabitacion = numeroHab; } public synchronized int camas() { return( camas ); } public syncronized void camas( int camas ) { numCamas = camas; } } El cdigo anterior sera el corazn de la aplicacin. Vamos pues a construir nuestro Hotel creando Habitaciones y asignndole a cada una de ellas su llave electrnica; tal como muestra el cdigo siguiente, Hotel1.java : public class Hotel1 { public static void main( String args[] ) { Habitacion llaveHab1; // paso 1 Habitacion llaveHab2; llaveHab1 = new Habitacion( 222 ); // pasos 2, 3, 4 y 5 llaveHab2 = new Habitacion( 1144,3 ); // ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^ // A ByD C } }

Para explicar el proceso, dividimos las acciones en los cinco pasos necesarios para poder entrar en nuestra habitacin. Aunque no se incluye, podemos tambin considerar el caso de que necesitemos un cerrajero, para que cuando perdamos la llave, nos abra la puerta; y que en nuestro caso sera el garbage collector , que recicla la habitacin una vez que se hayan perdido todas las llaves. El primer paso es la creacin de la llave, es decir, definir la variable referencia, por defecto nula . El resto de los pasos se agrupan en una sola sentencia Java. La parte B en el cdigo anterior indica al gerente del Hotel que ya dispone de una nueva habitacin. La parte C llama al decorador de interiores para que " vista " la habitacin segn un patrn determinado, para que no desentonen unas habitaciones con otras y no se pierdan las seas de identidad del hotel. El cdigo electrnico que nos permitir acceder a la habitacin se genera en la parte D, una vez conocido el interior de la habitacin y se programa en la llave en la parte A. Si dejamos el ejemplo real a un lado y nos vamos a lo que ocurre en la ejecucin del cdigo, vemos que el operador new busca espacio para una instancia de un objeto de una clase determinada e inicializa la memoria a los valores adecuados. Luego invoca al mtodo constructor de la clase, proporcionndole los argumentos adecuados. El operador new devuelve una referencia a s mismo, que es inmediatamente asignada a la variable referencia. Podemos tener mltiples llaves para una misma habitacin: . . . Habitacion llaveHab3,llaveHab4; llaveHab3 = llaveHab1; llaveHab4 = llavehab2; De este modo conseguimos copias de las llaves. Las habitaciones en s mismas no se han tocado en este proceso. As que, ya tenemos dos llaves para la habitacin 222 y otras dos para la habitacin 1144. Una llave puede ser programada para que funcione solamente con una habitacin en cualquier momento, pero podemos cambiar su cdigo electrnico para que funcione con alguna otra habitacin; por ejemplo, para cambiar una habitacin anteriormente utilizada por un empedernido fumador por otra limpia de olores y con vistas al mar. Cambiemos pues la llave duplicada de la habitacin del fumador (la 222) por la habitacin con olor a sal marina, 1144: . . . llaveHab3 = llaveHab2; Ahora tenemos una llave para la habitacin 222 y tres para la habitacin 1144. Mantendremos una llave para cada habitacin en la conserjera, para poder utilizarla como llave maestra, en el caso de que alguien pierda su llave propia. Alguien con la llave de una habitacin puede hacer cambios en ella, y los compaeros que tengan llave de esa misma habitacin, no tendrn conocimiento de esos cambios hasta que vuelvan a entrar en la habitacin. Por ejemplo, vamos a quitar una de las camas de la habitacin, entrando en ella con la llave maestra: . . . llaveHab2.camas( 2 );

Ahora cuando los inquilinos entren en la habitacin podrn comprobar el cambio realizado: . . . llaveHab4.printData(); Referencias y Listas Hay gente que piensa que como Java no dispone de punteros, resulta demasiado complejo construir listas enlazadas, rboles binarios y grafos. Vamos a demostrar que quien as piense est bastante equivocado. Retomemos el ejemplo de los arrays, y en vez de stos vamos a usar una lista doblemente enlazada. El paquete de la lista simple se compone de dos clases. Cada elemento de la lista es un NodoListaEnlazada , NodoListaEnlazada.java : public class NodoListaEnlazada { private NodoListaEnlazada siguiente; private NodoListaEnlazada anterior; private Object datos; // . . . } Cada NodoListaEnlazada contiene una referencia a su nodo precedente en la lista y una referencia al nodo que le sigue. Tambin contiene una referencia genrica a cualquier clase que se use para proporcionar acceso a los datos que el usuario proporcione. La lista enlazada, ListaEnlazada.java , contiene un nodo principio-fin y un contador para el nmero de nodos en la lista: public class ListaEnlazada { public NodoListaEnlazada PrincipioFin; private int numNodos; // . . . } El nodo especial PrincipioFin es sencillo, para simplificar el cdigo. El contador se usa para optimizar los casos ms habituales. Revisemos pues el cdigo de nuestro Hotel, ahora Hotel3.java , que ser prcticamente el mismo que en el caso de los arrays: public class Hotel3 { // Nmero de habitaciones por ala public static final int habPorAla = 12; public static void main( String args[] ) { ListaEnlazada llaveMaestra; // paso 1 llaveMaestra = new ListaEnlazada(); // pasos 2-5 int numPiso = 1; for( int i=0; i < habPorAla; i++ ) // pasos 6-9 llaveMaestra.insertAt( i, new Habitacion( numPiso * 100 + i, ( 0 == (i%2)) ? 2 : 1 ); for( int i=0; i < habPorAla; i++ ) // pasos 10-12

( (Habitacion)llaveMaestra.getAt(i) ).printData(); } } El paso 1 es la llave maestra de la lista. Est representada por una lista genrica; es decir, una lista de llaves que cumple la convencin que nosotros hemos establecido. Podramos acelerar el tiempo de compilacin metiendo la lista genrica ListaEnlazada dentro de una ListaEnlazadaHabitacion . Los pasos 2 a 5 son equivalentes a los del primer ejemplo. Construimos e inicializamos una nueva ListaEnlazada , que usaremos como juego de llaves maestras. Los pasos 6 a 9 son funcionalmente idnticos a los del ejemplo anterior con arrays, pero con diferente sintaxis. En Java, los arrays y el operador [] son internos del lenguaje. Como Java no soporta la sobrecarga de operadores por parte del usuario, tenemos que usarlo siempre en su forma normal. La ListaEnlazada proporciona el mtodo insertAt() que coge el ndice en la lista, donde el nuevo nodo ha de ser insertado, como primer argumento. El segundo argumento es el objeto que ser almacenado en la lista. Obsrvese que no es necesario colocar moldeo alguno para hacer algo a una clase descendiente que depende de uno de sus padres. Los pasos 10 a 12 provocan la misma salida que los pasos 10 y 11 del ejemplo con arrays. El paso 10 coge la llave del juego que se indica en el mtodo getAt() . En este momento, el sistema no sabe qu datos contiene la llave, porque el contenido de la habitacin es genrico. Pero nosotros s sabemos lo que hay en la lista, as que informamos al sistema haciendo un moldeado a la llave de la habitacin (este casting generar un chequeo en tiempo de ejecucin por el compilador, para asegurarse de que se trata de una Habitacion ). El paso 12 usa la llave para imprimir la informacin. Referencias y Arrays Como en C y C++, Java dispone de arrays de tipos primitivos o de clases. Los arrays en C y C++ son bsicamente un acompaante para los punteros. En Java, sin embargo, son ciudadanos de primera clase. Vamos a expandir nuestro hotel creando todo un ala de habitaciones, Hotel2.java . Crearemos un juego de llaves maestras y luego construiremos las habitaciones: public class Hotel2 { // Nmero de habitaciones por ala public static final int habPorAla = 12; public static void main( String args[] ) { Habitacion llavesMaestras[]; // paso 1 llavesMaestras = new Habitacion[ habPorAla ]; // pasos 2-5 // ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ // A B, C, D y E int numPiso = 1; for( int i=0; i < habPorAla; i++ ) // pasos 6-9 llavesMaestras[ i ] = new Habitacion( numPiso * 100 + i, ( 0 == (i%2)) ? 2 : 1 ); for( int i=0; i < habPorAla; i++ ) // pasos 10-11

llavesMaestras[i].printData(); } } Cada paso en el ejemplo es semejante al que ya vimos antes. El paso 1 especifica que el juego de llaves maestras es un grupo de llaves de habitaciones. Los pasos 2 a 5 son, en este caso, la parte principal. En lugar de crear una habitacin, el gerente ordena construir un grupo contiguo de habitaciones. El nmero de llaves se especifica entre corchetes y todas se crean en blanco. Los pasos 6 a 9 son idnticos a los pasos 2 a 5 del ejemplo anterior, excepto en que en este caso todas las llaves pasan a formar parte del juego maestro. Los nmeros de piso se dan en miles para que cuando se creen las habitaciones, todas tengan el mismo formato. Tambin todas las habitaciones de nmero par tienen una sola cama, mientras que las habitaciones impares tendrn dos camas. Los pasos 10 y 11 nos permiten obtener informacin de cada una de las habitaciones. Una mnima aplicacin La aplicacin ms pequea posible es la que simplemente imprimir un mensaje en la pantalla. Tradicionalmente, el mensaje suele ser "Hola Mundo!". Esto es justamente lo que hace el siguiente fragmento de cdigo: // // Aplicacin HolaMundo de ejemplo // class HolaMundoApp { public static void main( String args[] ) { System.out.println( "Hola Mundo!" ) ; } }

HolaMundo Vamos ver en detalle la aplicacin anterior, lnea a lnea. Esas lneas de cdigo contienen los componenetes mnimos para imprimir Hola Mundo! en la pantalla. // // Aplicacin HolaMundo de ejemplo // Estas tres primera lneas son comentarios. Hay tres tipos de comentarios en Java, // es un comentario orientado a lnea. class HolaMundoApp { Esta lnea declara la clase HolaMundoApp . El nombre de la clase especificado en el fichero fuente se utiliza para crear un fichero nombredeclase.class en el directorio en el

que se compila la aplicacin. En nuestro caso, el compilador crear un fichero llamado HolaMundoApp.class. public static void main( String args[] ) { Esta lnea especifica un mtodo que el intrprete Java busca para ejecutar en primer lugar. Igual que en otros lenguajes, Java utiliza una palabra clave main para especificar la primera funcin a ejecutar. En este ejemplo tan simple no se pasan argumentos. public significa que el mtodo main puede ser llamado por cualquiera, incluyendo el intrprete Java. static es una palabra clave que le dice al compilador que main se refiere a la propia clase HolaMundoApp y no a ninguna instancia de la clase. De esta forma, si alguien intenta hacer otra instancia de la clase, el mtodo main no se instanciara. void indica que main no devuelve nada. Esto es importante ya que Java realiza una estricta comprobacin de tipos, incluyendo los tipos que se ha declarado que devuelven los mtodos. args[] es la declaracin de un array de Strings. Estos son los argumentos escritos tras el nombre de la clase en la lnea de comandos: %java HolaMundoApp arg1 arg2 ... System.out.println( "Hola Mundo!" ); Esta es la funcionalidad de la aplicacin. Esta lnea muestra el uso de un nombre de clase y mtodo. Se usa el mtodo println() de la clase out que est en el paquete System . El mtodo println() toma una cadena como argumento y la escribe en el stream de salida estndar; en este caso, la ventana donde se lanza la aplicacin. } } Finalmente, se cierran las llaves que limitan el mtodo main() y la clase HolaMundoApp .

Un Applet Bsico Vamos a comenzar la creacin del cdigo fuente del un applet que satisfaga nuestras necesidades. Recordamos que Java utiliza la extensin .java para designar los ficheros fuente. HolaMundo A continuacin est el cdigo fuente del applet HolaMundo, que es la versin applet de la mnima aplicacin Java que antes habamos escrito. Guardar este cdigo en un fichero fuente Java como HolaMundo.java .

// // Applet HolaMundo de ejemplo // import java.awt.Graphics; import java.applet.Applet; public class HolaMundo extends Applet { public void paint( Graphics g ) { g.drawString( "Hola Mundo!",25,25 ) ; } } Componentes bsicos de un Applet El lenguaje Java implementa un modelo de Programacin Orientada a Objetos. Los objetos sirven de bloques centrales de construccin de los programas Java. De la misma forma que otros lenguajes de programacin, Java tiene variables de estado y mtodos. Veamos como se descompone un applet en sus piezas/objetos: /* Seccin de importaciones */ public class NombreDelNuevoApplet extends Applet { /* Aqu se declaran las variables de estado (public y private) */ /* Los mtodos para la interaccin con los objetos se declaran y definen aqu */ public void MetodoUno( parmetros ) { /* Aqu viene para cada mtodo, el cdigo Java que desempea la tarea. Qu cdigo se use depende del applet */ } } Para HolaMundo, se importan las dos clases que necesita. No hay variables de estado, y slo se tiene que definir un mtodo para que el applet tenga el comportamiento esperado. Clases incluidas El comando import carga otras clases dentro de nuestro cdigo fuente. El importar una clase desde un paquete de Java hace que esa clase importada est disponible para todo el cdigo incluido en el fichero fuente Java que la importa. Por ejemplo, en el applet HolaMundo se importa la clase java.awt.Graphics , y podremos llamar a los mtodos de esta clase desde cualquier mtodo de nuestro programa que se encuentre en el fichero HolaMundo.java . Esta clase define una rea grfica y mtodos para poder dibujar

dentro de ella. La funcin paint() declara a g como un objeto de tipo Graphics ; luego, paint() usa el mtodo drawString() de la clase Graphics para generar su salida. La clase Applet Se puede crear una nueva clase, en este caso HolaMundo , extendiendo la clase bsica de Java: Applet . De esta forma, se hereda todo lo necesario para crear un applet. Modificando determinados mtodos del applet, podemos lograr que lleve a cabo las funciones que deseamos. import java.applet.Applet; . . . public class HolaMundo extends Applet { Mtodos de Applet La parte del applet a modificar es el mtodo paint() . En la clase Applet , se llama al mtodo paint() cada vez que el mtodo arranca o necesita ser refrescado, pero no hace nada. En nuestro caso, lo que hacemos es: public void paint( Graphics g ) { g.drawString( "Hola Mundo!",25,25 ); } De acuerdo a las normas de sobrecarga, se ejecutar este ltimo paint() y no el paint() vaco de la clase Applet . Luego, aqu se ejecuta el mtodo drawString() , que le dice al applet cmo debe aparecer un texto en el rea de dibujo. Otros mtodos bsicos para dibujar son: drawLine( int x1,int y1,int x2,int y2 ) drawRect( int x,int y,int ancho,int alto ) drawOval( int x,int y,int ancho,int alto ) Tanto para drawRect() como para drawOval() , las coordenadas ( x,y ) son la esquina superior izquierda del rectngulo (para drawOval, el valo es encajado en el rectngulo que lo circunscribe). Compilacin y Ejecucin de Hola Mundo Vamos a ver a continuacin como podemos ver el resultado de nuestra primera aplicacin Java en pantalla. Generaremos un fichero con el cdigo fuente de la aplicacin, lo compilaremos y utilizaremos el intrprete java para ejecutarlo. Ficheros Fuente Java Los ficheros fuente en Java terminan con la extensin " .java ". Crear un fichero utilizando cualquier editor de texto ascii que tenga como contenido el cdigo de las ocho lneas de nuestra mnima aplicacin, y salvarlo en un fichero con el nombre de HolaMundoApp.java . Para crear los ficheros con cdigo fuente Java no es necesario un procesador de textos, aunque puede utilizarse siempre que tenga salida a fichero de texto plano o ascii, sino que es suficiente con cualquier otro editor.

Compilacin El compilador javac se encuentra en el directorio bin por debajo del directorio java , donde se haya instalado el JDK. Este directorio bin , si se han seguido las instrucciones de instalacin, debera formar parte de la variable de entorno PATH del sistema. Si no es as, tendra que revisar la Instalacin del JDK . El compilador de Java traslada el cdigo fuente Java a byte-codes, que son los componentes que entiende la Mquina Virtual Java que est incluida en los navegadores con soporte Java y en appletviewer. Una vez creado el fichero fuente HolaMundoApp.java, se puede compilar con la lnea siguiente: %javac HolaMundoApp.java Si no se han cometido errores al teclear ni se han tenido problemas con el path al fichero fuente ni al compilador, no debera aparecer mensaje alguno en la pantalla, y cuando vuelva a aparecer el prompt del sistema, se debera ver un fichero HolaMundoApp.class nuevo en el directorio donde se encuentra el fichero fuente. Si ha habido algn problema, en Problemas de compilacin al final de esta seccin, hemos intentado reproducir los que ms frecuentemente se suelen dar, se pueden consultar por si pueden aportar un poco de luz al error que haya aparecido. Ejecucin Para ejecutar la aplicacin HolaMundoApp, hemos de recurrir al intrprete java , que tambin se encuentra en el directorio bin , bajo el directorio java . Se ejecutar la aplicacin con la lnea: %java HolaMundoApp y debera aparecer en pantalla la respuesta de Java: %Hola Mundo! El smbolo % representa al prompt del sistema, y lo utilizaremos para presentar las respuestas que nos ofrezca el sistema como resultado de la ejecucin de los comandos que se indiquen en pantalla o para indicar las lneas de comandos a introducir. Problemas de compilacin A continuacin presentamos una lista de los errores ms frecuentes que se presentan a la hora de compilar un fichero con cdigo fuente Java, nos basaremos en errores provocados sobre nuestra mnima aplicacin Java de la seccin anterior, pero podra generalizarse sin demasiados problemas. %javac: Command not found No se ha establecido correctamente la variable PATH del sistema para el compilador javac . El compilador javac se encuentra en el directorio bin , que cuelga del directorio java , que cuelga del directorio donde se haya instalado el JDK (Java Development Kit). %HolaMundoApp.java:3: Method printl(java.lang.String) not found in class java.io.PrintStream. System.out.printl( "HolaMundo!); ^

Error tipogrfico, el mtodo es println no printl. %In class HolaMundoApp: main must be public and static Error de ejecucin, se olvid colocar la palabra static en la declaracin del mtodo main de la aplicacin. %Cant find class HolaMundoApp Este es un error muy sutil. Generalmente significa que el nombre de la clase es distinto al del fichero que contiene el cdigo fuente, con lo cual el fichero nombre_fichero.class que se genera es diferente del que cabra esperar. Por ejemplo, si en nuestro fichero de cdigo fuente de nuestra aplicacin HolaMundoApp.java colocamos en vez de la declaracin actual de la clase HolaMundoApp , la lnea: class HolaMundoapp { se crear un fichero HolaMundoapp.class , que es diferente del HolaMundoApp.class , que es el nombre esperado de la clase; la diferencia se encuentra en la a minscula y mayscula. La Clase Math La clase Math representa la librera matemtica de Java. Las funciones que contiene son las de todos los lenguajes, parece que se han metido en una clase solamente a propsito de agrupacin, por eso se encapsulan en Math, y lo mismo sucede con las dems clases que corresponden a objetos que tienen un tipo equivalente (Character, Float, etc.). El constructor de la clase es privado, por los que no se pueden crear instancias de la clase. Sin embargo, Math es public para que se pueda llamar desde cualquier sitio y static para que no haya que inicializarla. Funciones matemticas Si se importa la clase, se tiene acceso al conjunto de funciones matemticas estndar: Math.abs( x ) para int, long, float y double Math.sin( double ) Math.cos( double ) Math.tan( double ) Math.asin( double ) Math.acos( double ) Math.atan( double ) Math.atan2( double,double ) Math.exp( double ) Math.log( double ) Math.sqrt( double ) Math.ceil( double ) Math.floor( double ) Math.rint( double ) Math.pow( a,b ) Math.round( x ) para double y float Math.random() devuelve un double Math.max( a,b ) para int, long, float y double Math.min( a,b ) para int, long, float y double Math.E para la base exponencial Math.PI para PI

He aqu un ejemplo, Mates.java , de uso de algunas funciones de la clase Math: class Mates { public static void main( String args[] ) { int x; double rand,y,z; float max; rand = Math.random(); x = Math.abs( -123 ); y = Math.round( 123.567 ); z = Math.pow( 2,4 ); max = Math.max( (float)1e10,(float)3e9 ); System.out.println( rand ); System.out.println( x ); System.out.println( y ); System.out.println( z ); System.out.println( max ); } La Clase Character Al trabajar con caracteres se necesitan muchas funciones de comprobacin y traslacin. Estas funciones estn empleadas en la clase Character . De esta clase s que se pueden crear instancias, al contrario que sucede con la clase Math . Declaraciones La primera sentencia crear una variable carcter y la segunda un objeto Character:

char c; Character C; Comprobaciones booleanas

Character.isLowerCase( c ) Character.isUpperCase( c ) Character.isDigit( c ) Character.isSpace( c ) En este caso, si tuvisemos un objeto Character C , no se podra hacer C.isLowerCase , porque no se ha hecho un new de Character. Estas funciones son estticas y no conocen al objeto, por eso hay que crearlo antes. Traslaciones de caracteres

char c2 = Character.toLowerCase( c ); char c2 = Character.toUpperCase( c ); Traslaciones de carcter/dgito

int i = Character.digit( c,base ); char c = Character.forDigit( i,base ); Mtodos de la clase Character

C = new Character( 'J' ); char c = C.charValue(); String s = C.toString(); La Clase Float Cada tipo numrico tiene su propia clase de objetos. As el tipo float tiene el objeto Float . De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Float . Declaraciones La primera sentencia crear una variable float y la segunda un objeto Float:

float f; Float F; Valores de Float

Float.POSITIVE_INFINITY Float.NEGATIVE_INFINITY Float.NaN Float.MAX_VALUE Float.MIN_VALUE Conversiones de Clase/Cadena

String s = Float.toString( f ); f = Float.valueOf( "3.14" ); Comprobaciones

boolean b = Float.isNaN( f ); boolean b = Float.isInfinite( f ); La funcin isNaN() comprueba si f es un No-Nmero . Un ejemplo de no-nmero es raiz cuadrada de -2. Conversiones de Objetos Float F = new Float( Float.PI ); String s = F.toString(); int i = F.intValue(); long l = F.longValue(); float F = F.floatValue(); double d = F.doubleValue(); Otros Mtodos

int i = F.hashCode(); boolean b = F.equals( Object obj ); int i = Float.floatToIntBits( f ); float f = Float.intBitsToFloat( i ); La Clase Double Cada tipo numrico tiene su propia clase de objetos. As el tipo double tiene el objeto Double . De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Double . Declaraciones La primera sentencia crear una variable double y la segunda un objeto Double:

double d; Double D; Valores de Double

Double.POSITIVE_INFINITY Double.NEGATIVE_INFINITY Double.NaN Double.MAX_VALUE Double.MIN_VALUE Mtodos de Double

D.isNaN(); Double.isNaN( d ); D.isInfinite(); Double.isInfinite( d ); boolean D.equals(); String D.toString(); int D.intValue(); long D.longValue(); float D.floatValue(); double D.doubleValue(); int i = D.hashCode(); Double V.valueOf( String s ); long l = Double.doubleToLongBits( d ); double d = Double.longBitsToDouble( l ); La Clase Integer Cada tipo numrico tiene su propia clase de objetos. As el tipo int tiene el objeto Integer . De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Integer . Declaraciones La primera sentencia crear una variable int y la segunda un objeto Integer:

Integer.MIN_VALUE; Integer.MAX_VALUE; Valores de Integer

Integer.MIN_VALUE; Integer.MAX_VALUE; Mtodos de Integer

String Integer.toString( int i,int base ); String Integer.toString( int i ); int I.parseInt( String s,int base ); int I.parseInt( String s ); Integer Integer.valueOf( String s,int base ); Integer Integer.valueOf( String s ); int I.intValue(); long I.longValue(); float I.floatValue(); double I.doubleValue(); String I.toString();

int I.hashCode(); boolean I.equals( Object obj ); La Clase Long Cada tipo numrico tiene su propia clase de objetos. As el tipo long tiene el objeto Long . De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Long . Declaraciones La primera sentencia crear una variable long y la segunda un objeto Long:

long l; Long L; Valores de Long

Long.MIN_VALUE; Long.MAX_VALUE; Mtodos de Long

String Long.toString( long l,int base ); String Long.toString( long l ); long L.parseLong( String s,int base ); long L.parseLong( String s ); Long Long.valueOf( String s,int base ); Long Long.valueOf( String s ); int L.intValue(); long L.longValue(); float L.floatValue(); double L.doubleValue(); String L.toString(); int L.hashCode(); boolean L.equals( Object obj ); En los mtodos toString() , parseInt() y valueOf() que no se especifica la base sobre la que se trabaja, se asume que es base 10 . La Clase Boolean Los valores boolean tambin tienen su tipo asociado Boolean , aunque en este caso hay menos mtodos implementados que para el resto de las clases numricas.

Declaraciones La primera sentencia crear una variable boolean y la segunda un objeto Boolean:

boolean b; Boolean B; Valores de Boolean

Boolean.TRUE; Boolean.FALSE; Mtodos de Boolean

boolean B.booleanValue(); String B.toString(); boolean B.equals( Object obj ); La Clase String Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y StringBuffer . Un objeto String representa una cadena alfanumrica de un valor constante que no puede ser cambiada despus de haber sido creada. Un objeto StringBuffer representa una cadena cuyo tamao puede variar. Los Strings son objetos constantes y por lo tanto muy baratos para el sistema. La mayora de las funciones relacionadas con cadenas esperan valores String como argumentos y devuelven valores String. Hay que tener en cuenta que las funciones estticas no consumen memoria del objeto, con lo cual es ms conveniente usar Character que char. No obstante, char se usa, por ejemplo, para leer ficheros que estn escritos desde otro lenguaje. Existen muchos constructores para crear nuevas cadenas: String(); String( String str ); String( char val[] ); String( char val[],int offset,int count ); String( byte val[],int hibyte ); String( byte val[],int hibyte,int offset,int count ); Tal como uno puede imaginarse, las cadenas pueden ser muy complejas, existiendo muchas funciones muy tiles para trabajar con ellas y, afortunadamente, la mayora estn codificadas en la clase String . Funciones Bsicas

La primera devuelve la longitud de la cadena y la segunda devuelve el carcter que se encuentra en la posicin que se indica en indice :

int length(); char charAt( int indice ); Funciones de Comparacin de Strings

boolean equals( Object obj ); boolean equalsIgnoreCase( Object obj ); Lo mismo que equals() pero no tiene en cuenta maysculas o minsculas. int compareTo( String str2 ); Devuelve un entero menor que cero si la cadena es lxicamente menor que str2 . Devuelve cero si las dos cadenas son lxicamente iguales y un entero mayor que cero si la cadena es lxicamente mayor que str2 . Funciones de Comparacin de Subcadenas boolean regionMatch( int thisoffset,String s2,int s2offset,int len ); boolean regionMatch( boolean ignoreCase,int thisoffset,String s2, int s2offset,int 1 ); Comprueba si una regin de esta cadena es igual a una regin de otra cadena. boolean startsWith( String prefix ); boolean startsWith( String prefix,int offset ); boolean endsWith( String suffix ); Devuelve si esta cadena comienza o termina con un cierto prefijo o sufijo comenzando en un determinado desplazamiento. int indexOf( int ch ); int indexOf( int ch,int fromindex ); int lastIndexOf( int ch ); int lastIndexOf( int ch,int fromindex ); int indexOf( String str ); int indexOf( String str,int fromindex ); int lastIndexOf( String str ); int lastIndexOf( String str,int fromindex ); Devuelve el primer/ltimo ndice de un carcter/cadena empezando la bsqueda a partir de un determinado desplazamiento. String substring( int beginindex ); String substring( int beginindex,int endindex ); String concat( String str ); String replace( char oldchar,char newchar );

String toLowerCase(); String toUpperCase(); String trim(); Ajusta los espacios en blanco al comienzo y al final de la cadena. void getChars(int srcBegin,int srcEnd,char dst[],int dstBegin); void getBytes(int srcBegin,int srcEnd,byte dst[],int dstBegin); String toString(); char toCharArray(); int hashCode(); Funciones ValueOf La clase String posee numerosas funciones para transformar valores de otros tipos de datos a su representacin como cadena. Todas estas funciones tienen el nombre de valueOf , estando el mtodo sobrecargado para todos los tipos de datos bsicos. Veamos un ejemplo de su utilizacin:

String Uno = new String( "Hola Mundo" ); float f = 3.141592; String PI = Uno.valueOf( f ); String PI = String.valueOf( f ); // Mucho ms correcto Funciones de Conversin String valueOf( boolean b ); String valueOf( int i ); String valueOf( long l ); String valueOf( float f ); String valueOf( double d ); String valueOf( Object obj ); String valueOf( char data[] ); String valueOf( char data[],int offset,int count ); Usa arrays de caracteres para la cadena. String copyValueOf( char data[] ); String copyValueOf( char data[],int offset,int count ); Crea un nuevo array equivalente para la cadena. La Clase StringBuffer Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y StringBuffer . Un objeto String representa una cadena alfanumrica de un valor constante que no puede ser cambiada despus de haber sido creada. Un objeto StringBuffer representa una cadena cuyo tamao puede variar. La clase StringBuffer dispone de muchos mtodos para modificar el contenido de los objetos StringBuffer. Si el contenido de una cadena va a ser modificado en un programa, habr que sacrificar el uso de objetos String en beneficio de StringBuffer, que aunque consumen ms recursos del sistema, permiten ese tipo de manipulaciones.

Al estar la mayora de las caractersticas de los StringBuffers basadas en su tamao variable, se necesita un nuevo mtodo de creacin: StringBuffer(); StringBuffer( int len ); StringBuffer( String str ); Se puede crear un StringBuffer vaco de cualquier longitud y tambin se puede utilizar un String como punto de partida para un StringBuffer. StringBuffer Dos = new StringBuffer( 20 ); StringBuffer Uno = new StringBuffer( "Hola Mundo" ); Cambio de Tamao El cambio de tamao de un StringBuffer necesita varias funciones especficas para manipular el tamao de las cadenas: int length(); char charAt( int index ); void getChars( int srcBegin,int srcEnd,char dst[],int dstBegin ); String toString(); void setLength( int newlength ); void setCharAt( int index,char ch ); int capacity(); void ensureCapacity( int minimum ); void copyWhenShared(); Obervar que una de las funciones devuelve una cadena constante normal de tipo String. Este objeto se puede usar con cualquier funcin String, como por ejemplo, en las funciones de comparacin. Modificacin del Contenido Para cambiar el contenido de un StringBuffer, se pueden utilizar dos mtodos: append() e insert() . En el ejemplo CadAppend.java , vemos el uso de estos dos mtodos: class CadAppend { public static void main( String args[] ) { StringBuffer str = new StringBuffer( "Hola" ); str.append( " Mundo" ); System.out.println( str ); } } En este otro ejemplo, CadInversa.java , mostramos un mtodo muy simple que le da la vuelta a una cadena: class CadInversa { public static String cadenaInversa( String fuente ) { int longitud = fuente.length(); StringBuffer destino = new StringBuffer( longitud ); for( int i=(longitud-1); i >= 0; i-- ) destino.append( fuente.charAt( i ) );

return( destino.toString() ); } public static void main( String args[] ) { System.out.println( cadenaInversa( "Hola Mundo" ) ); } } Las funciones que cambian el tamao son pues: StringBuffer append( Object obj ); StringBuffer append( String str ); StringBuffer append( char str[] ); StringBuffer append( char str[],int offset,int len ); StringBuffer append( boolean b ); StringBuffer append( int i ); StringBuffer append( long l ); StringBuffer append( float f ); StringBuffer append( double d ); StringBuffer append( char ch ); StringBuffer insert( int offset,Object obj ); StringBuffer insert( int offset,String str ); StringBuffer insert( int offset,char str[] ); StringBuffer insert( int offset,boolean b ); StringBuffer insert( int offset,int i ); StringBuffer insert( int offset,long l ); StringBuffer insert( int offset,float f ); StringBuffer insert( int offset,double d ); StringBuffer insert( int offset,char ch ); Operadores de Concatenacin Hay que recordar que los operadores " + " y " += " tambin se pueden aplicar a cadenas. Ambos realizan una concatenacin y estn implementados con objetos StringBuffer. Por ejemplo, la sentencia: String s = "Qu" + " tal ?"; es interpretada por el compilador como: String s = new StringBuffer().append( "Qu" ).append( " tal ?" ).toString(); y se marcara el StringBuffer para borrarlo ya que el contenido pasa al objeto String. Tambin, la sentencia: s += " por ah!"; sera interpretada por el sistema como: String s = new StringBuffer().append( s ).append( " por ah!" ).toString(); y volvera a marcar para borrar el nuevo StringBuffer. Uso de Conversiones

Veamos un ejemplo de utilidad de estas funciones. En el applet Conversion.java , que se muestra en el cdigo que sigue, se usan estas funciones para producir una salida til en un programa, presentando las coordenadas en las que se ha hecho click con el botn del ratn. public class Conversion extends Applet { int RatonX = 25; int RatonY = 25; String Status = "Haz click con el ratn"; public void paint( Graphics g ) { g.drawString( Status,RatonX,RatonY ); } public boolean mouseDown( Event evt,int x,int y ) { Integer X = new Integer( x ); Integer Y = new Integer( y ); RatonX = x; RatonY = y; Status = X.toString()+","+Y.toString(); repaint(); return true; } } Manejo de Excepciones Vamos a mostrar como se utilizan las excepciones, reconvirtiendo nuestro applet de saludo a partir de la versin iterativa de HolaIte.java : import java.awt.*; import java.applet.Applet; public class HolaIte extends Applet { private int i = 0; private String Saludos[] = { "Hola Mundo!", "HOLA Mundo!", "HOLA MUNDO!!" }; public void paint( Graphics g ) { g.drawString( Saludos[i],25,25 ); i++; } } Normalmente, un programa termina con un mensaje de error cuando se lanza una excepcin. Sin embargo, Java tiene mecanismos para excepciones que permiten ver qu excepcin se ha producido e intentar recuperarse de ella. Vamos a reescribir el mtodo paint() de nuestra versin iterativa del saludo: public void paint( Graphics g ) { try { g.drawString( Saludos[i],25,25 );

} catch( ArrayIndexOutOfBoundsException e ) { g.drawString( "Saludos desbordado",25,25 ); } catch( Exception e ) { // Cualquier otra excepcin System.out.println( e.toString() ); } finally { System.out.println( "Esto se imprime siempre!" ); } i++; } La palabra clave finally define un bloque de cdigo que se quiere que sea ejecutado siempre, de acuerdo a si se captur la excepcin o no. En el ejemplo anterior, la salida en la consola, con i=4 sera: Saludos desbordado Esto se imprime siempre! Generar Excepciones Cuando se produce un error se debera generar, o lanzar, una excepcin. Para que un mtodo en Java, pueda lanzar excepciones, hay que indicarlo expresamente. void MetodoAsesino() throws NullPointerException,CaidaException Se pueden definir excepciones propias, no hay por qu limitarse a las predefinidas; bastar con extender la clase Exception y proporcionar la funcionalidad extra que requiera el tratamiento de esa excepcin. Tambin pueden producirse excepciones no de forma explcita como en el caso anterior, sino de forma implcita cuando se realiza alguna accin ilegal o no vlida. Las excepciones, pues, pueden originarse de dos modos: el programa hace algo ilegal (caso normal), o el programa explcitamente genera una excepcin ejecutando la sentencia throw (caso menos normal). La sentencia throw tiene la siguiente forma: throw ObtejoExcepction; El objeto ObjetoException es un objeto de una clase que extiende la clase Exception . El siguiente cdigo de ejemplo origina una excepcin de divisin por cero: class melon { public static void main( String[] a ) { int i=0, j=0, k; k = i/j; // Origina un error de division-by-zero } } Si compilamos y ejecutamos esta aplicacin Java, obtendremos la siguiente salida por pantalla: > javac melon.java > java melon

java.lang.ArithmeticException: / by zero at melon.main(melon.java:5) Las excepciones predefinidas, como ArithmeticException , se conocen como excepciones runtime. Actualmente, como todas las excepciones son eventos runtime, sera mejor llamarlas excepciones irrecuperables. Esto contrasta con las excepciones que generamos explcitamente, que suelen ser mucho menos severas y en la mayora de los casos podemos recuperarnos de ellas. Por ejemplo, si un fichero no puede abrirse, preguntamos al usuario que nos indique otro fichero; o si una estructura de datos se encuentra completa, podremos sobreescribir algn elemento que ya no se necesite.

Excepciones Predefinidas Las excepciones predefinidas y su jerarqua de clases es la que se muestra en la figura:

Los nombres de las excepciones indican la condicin de error que representan. Las siguientes son las excepciones predefinidas ms frecuentes que se pueden encontrar: ArithmeticException Las excepciones aritmticas son tpicamente el resultado de una divisin por 0: int i = 12 / 0; NullPointerException Se produce cuando se intenta acceder a una variable o mtodo antes de ser definido: class Hola extends Applet { Image img; paint( Graphics g ) { g.drawImage( img,25,25,this ); } } IncompatibleClassChangeException El intento de cambiar una clase afectada por referencias en otros objetos, especficamente cuando esos objetos todava no han sido recompilados. ClassCastException El intento de convertir un objeto a otra clase que no es vlida. y = (Prueba)x; // donde x no es de tipo Prueba NegativeArraySizeException Puede ocurrir si hay un error aritmtico al intentar cambiar el tamao de un array. OutOfMemoryException No debera producirse nunca! El intento de crear un objeto con el operador new ha fallado por falta de memoria. Y siempre tendra que haber memoria suficiente porque el garbage collector se encarga de proporcionarla al ir liberando objetos que no se usan y devolviendo memoria al sistema. NoClassDefFoundException Se referenci una clase que el sistema es incapaz de encontrar. ArrayIndexOutOfBoundsException Es la excepcin que ms frecuentemente se produce. Se genera al intentar acceder a un elemento de un array ms all de los lmites definidos inicialmente para ese array. UnsatisfiedLinkException

Se hizo el intento de acceder a un mtodo nativo que no existe. Aqu no existe un mtodo a.kk class A { native void kk(); } InternalException Este error se reserva para eventos que no deberan ocurrir. Por definicin, el usuario nunca debera ver este error y esta excepcin no debera lanzarse. Crear Excepciones Tambin podemos lanzar nuestras propias excepciones, extendiendo la clase System.exception . Por ejemplo, consideremos un programa cliente/servidor. El cdigo cliente se intenta conectar al servidor, y durante 5 segundos se espera a que conteste el servidor. Si el servidor no responde, el servidor lanzara la excepcin de time-out: class ServerTimeOutException extends Exception {} public void conectame( String nombreServidor ) throws Exception { int exito; int puerto = 80; exito = open( nombreServidor,puerto ); if( exito == -1 ) throw ServerTimeOutException; } Si se quieren capturar las propias excepciones, se deber utilizar la sentencia try : public void encuentraServidor() { ... try { conectame( servidorDefecto ); catch( ServerTimeOutException e ) { g.drawString( "Time-out del Servidor, intentando alternativa", 5,5 ); conectame( servidorAlterno ); } ... } Cualquier mtodo que lance una excepcin tambin debe capturarla, o declararla como parte de la interface del mtodo. Cabe preguntarse entonces, el porqu de lanzar una excepcin si hay que capturarla en el mismo mtodo. La respuesta es que las excepciones no simplifican el trabajo del control de errores. Tienen la ventaja de que se puede tener muy localizado el control de errores y no tenemos que controlar millones de valores de retorno, pero no van ms all. Capturar Excepciones Las excepciones lanzadas por un mtodo que pueda hacerlo deben recoger en bloque try/catch o try/finally .

int valor; try { for( x=0,valor = 100; x < 100; x ++ ) valor /= x; } catch( ArithmeticException e ) { System.out.println( "Matemticas locas!" ); } catch( Exception e ) { System.out.println( "Se ha producido un error" ); }try Es el bloque de cdigo donde se prev que se genere una excepcin. Es como si dijsemos "intenta estas sentencias y mira a ver si se produce una excepcin". El bloque try tiene que ir seguido, al menos, por una clusula catch o una clusula finally catch Es el cdigo que se ejecuta cuando se produce la excepcin. Es como si dijsemos "controlo cualquier excepcin que coincida con mi argumento". En este bloque tendremos que asegurarnos de colocar cdigo que no genere excepciones. Se pueden colocar sentencias catch sucesivas, cada una controlando una excepcin diferente. No debera intentarse capturar todas las excepciones con una sola clusula, como esta: catch( Excepcion e ) { ... Esto representara un uso demasiado general, podran llegar muchas ms excepciones de las esperadas. En este caso es mejor dejar que la excepcin se propague hacia arriba y dar un mensaje de error al usuario. Se pueden controlar grupos de excepciones, es decir, que se pueden controlar, a travs del argumento, excepciones semejantes. Por ejemplo: class Limites extends Exception {} class demasiadoCalor extends Limites {} class demasiadoFrio extends Limites {} class demasiadoRapido extends Limites {} class demasiadoCansado extends Limites {} . . . try { if( temp > 40 ) throw( new demasiadoCalor() ); if( dormir < 8 ) throw( new demasiado Cansado() ); } catch( Limites lim ) { if( lim instanceof demasiadoCalor ) { System.out.println( "Capturada excesivo calor!" );

return; } if( lim instanceof demasiadoCansado ) { System.out.println( "Capturada excesivo cansancio!" ); return; } } finally System.out.println( "En la clausula finally" ); La clusula catch comprueba los argumentos en el mismo orden en que aparezcan en el programa. Si hay alguno que coincida, se ejecuta el bloque. El operador instanceof se utiliza para identificar exactamente cual ha sido la identidad de la excepcin. finally Es el bloque de cdigo que se ejecuta siempre, haya o no excepcin. Hay una cierta controversia entre su utilidad, pero, por ejemplo, podra servir para hacer un log o un seguimiento de lo que est pasando, porque como se ejecuta siempre puede dejarnos grabado si se producen excepciones y nos hemos recuperado de ellas o no. Este bloque finally puede ser til cuando no hay ninguna excepcin. Es un trozo de cdigo que se ejecuta independientemente de lo que se haga en el bloque try. Cuando vamos a tratar una excepcin, se nos plantea el problema de qu acciones vamos a tomar. En la mayora de los casos, bastar con presentar una indicacin de error al usuario y un mensaje avisndolo de que se ha producido un error y que decida si quiere o no continuar con la ejecucin del programa. Por ejemplo, podramos disponer de un dilogo como el que se presenta en el cdigo siguiente: public class DialogoError extends Dialog { DialogoError( Frame padre ) { super( padre,true ); setLayout( new BorderLayout() ); // Presentamos un panel con continuar o salir Panel p = new Panel(); p.add( new Button( "Continuar?" ) ); p.add( new Button( "Salir" ) ); add( "Center",new Label( "Se ha producido un error. Continuar?" ) ) add( "South",p ); } public boolean action( Event evt,Object obj ) { if( "Salir".equals( obj ) ) { dispose(); System.exit( 1 ); } return false; }

} Y la invocacin, desde algn lugar en que se suponga que se generarn errores, podra ser como sigue: try { // Cdigo peligroso } catch( AlgunaExcepcion e ) { VentanaError = new DialogoError( this ); VentanaError.show(); } Propagacin de Excepciones La clusula catch comprueba los argumentos en el mismo orden en que aparezcan en el programa. Si hay alguno que coincida, se ejecuta el bloque y sigue el flujo de control por el bloque finally (si lo hay) y concluye el control de la excepcin. Si ninguna de las clusulas catch coincide con la excepcin que se ha producido, entonces se ejecutar el cdigo de la clusula finally (en caso de que la haya). Lo que ocurre en este caso, es exactamente lo mismo que si la sentencia que lanza la excepcin no se encontrase encerrada en el bloque try. El flujo de control abandona este mtodo y retorna prematuramente al mtodo que lo llam. Si la llamada estaba dentro del mbito de una sentencia try, entonces se vuelve a intentar el control de la excepcin, y as continuamente. Veamos lo que sucede cuando una excepcin no es tratada en la rutina en donde se produce. El sistema Java busca un bloque try..catch ms all de la llamada, pero dentro del mtodo que lo trajo aqu. Si la excepcin se propaga de todas formas hasta lo alto de la pila de llamadas sin encontrar un controlador especfico para la excepcin, entonces la ejecucin se detendr dando un mensaje. Es decir, podemos suponer que Java nos est proporcionando un bloque catch por defecto, que imprime un mensaje de error y sale. No hay ninguna sobrecarga en el sistema por incorporar sentencias try al cdigo. La sobrecarga se produce cuando se genera la excepcin. Hemos dicho ya que un mtodo debe capturar las excepciones que genera, o en todo caso, declararlas como parte de su llamada, indicando a todo el mundo que es capaz de generar excepciones. Esto debe ser as para que cualquiera que escriba una llamada a ese mtodo est avisado de que le puede llegar una excepcin, en lugar del valor de retorno normal. Esto permite al programador que llama a ese mtodo, elegir entre controlar la excepcin o propagarla hacia arriba en la pila de llamadas. La siguiente lnea de cdigo muestra la forma general en que un mtodo declara excepciones que se pueden propagar fuera de l: tipo_de_retorno( parametros ) throws e1,e2,e3 { } Los nombres e1,e2,... deben ser nombres de excepciones, es decir, cualquier tipo que sea asignable al tipo predefinido Throwable . Observar que, como en la llamada al

mtodo se especifica el tipo de retorno, se est especificando el tipo de excepcin que puede generar (en lugar de un objeto exception). He aqu un ejemplo, tomado del sistema Java de entrada/salida: byte readByte() throws IOException; short readShort() throws IOException; char readChar() throws IOException; void writeByte( int v ) throws IOException; void writeShort( int v ) throws IOException; void writeChar( int v ) throws IOException; Lo ms interesante aqu es que la rutina que lee un char, puede devolver un char; no el entero que se requiere en C. C necesita que se devuelva un int, para poder pasar cualquier valor a un char, y adems un valor extra (-1) para indicar que se ha alcanzado el final del fichero. Algunas de las rutinas Java lanzan una excepcin cuando se alcanza el fin del fichero. En el siguiente diagrama se muestra grficamente cmo se propaga la excepcin que se genera en el cdigo, a travs de la pila de llamadas durante la ejecucin del cdigo:

Cuando se crea una nueva excepcin, derivando de una clase Exception ya existente, se puede cambiar el mensaje que lleva asociado. La cadena de texto puede ser recuperada a travs de un mtodo. Normalmente, el texto del mensaje proporcionar informacin para resolver el problema o sugerir una accin alternativa. Por ejemplo: class SinGasolina extends Exception { SinGasolina( String s ) { // constructor super( s ); } .... // Cuando se use, aparecer algo como esto try { if( j < 1 ) throw new SinGasolina( "Usando deposito de reserva" ); } catch( SinGasolina e ) { System.out.println( o.getMessage() );

} Esto, en tiempo de ejecucin originara la siguiente salida por pantalla: > Usando deposito de reserva Otro mtodo que es heredado de la superclase Throwable es printStackTrace() . Invocando a este mtodo sobre una excepcin se volcar a pantalla todas las llamadas hasta el momento en donde se gener la excepcin (no donde se maneje la excepcin). Por ejemplo: // Capturando una excepcin en un mtodo class testcap { static int slice0[] = { 0,1,2,3,4 }; public static void main( String a[] ) { try { uno(); } catch( Exception e ) { System.out.println( "Captura de la excepcion en main()" ); e.printStackTrace(); } } static void uno() { try { slice0[-1] = 4; } catch( NullPointerException e ) { System.out.println( "Captura una excepcion diferente" ); } } } Cuando se ejecute ese cdigo, en pantalla observaremos la siguiente salida: > Captura de la excepcion en main() > java.lang.ArrayIndexOutOfBoundsException: -1 at testcap.uno(test5p.java:19) at testcap.main(test5p.java:9) Con todo el manejo de excepciones podemos concluir que proporciona un mtodo ms seguro para el control de errores, adems de representar una excelente herramienta para organizar en sitios concretos todo el manejo de los errores y, adems, que podemos proporcionar mensajes de error ms decentes al usuario indicando qu es lo que ha fallado y por qu, e incluso podemos, a veces, recuperarnos de los errores. La degradacin que se produce en la ejecucin de programas con manejo de excepciones est ampliamente compensada por las ventajas que representa en cuanto a seguridad de funcionamiento de esos mismos programas.

Entrada/Salida Estndar Los usuarios de Unix, y aquellos familiarizados con las lneas de comandos de otros sistemas como DOS, han utilizado un tipo de entrada/salida conocida comnmente por entrada/salida estndar . El fichero de entrada estndar ( stdin ) es simplemente el

teclado. El fichero de salida estndar ( stdout ) es tpicamente la pantalla (o la ventana del terminal). El fichero de salida de error estndar ( stderr ) tambin se dirige normalmente a la pantalla, pero se implementa como otro fichero de forma que se pueda distinguir entre la salida normal y (si es necesario) los mensajes de error. La clase System Java tiene acceso a la entrada/salida estndar a travs de la clase System . En concreto, los tres ficheros que se implementan son: Stdin System.in implementa stdin como una instancia de la clase InputStream . Con System.in , se accede a los mtodos read() y skip( ). El mtodo read() permite leer un byte de la entrada. skip( long n ) , salta n bytes de la entrada. Stdout System.out implementa stdout como una instancia de la clase PrintStream . Se pueden utilizar los mtodos print() y println() con cualquier tipo bsico Java como argumento. Stderr System.err implementa stderr de la misma forma que stdout. Como con System.out, se tiene acceso a los mtodos de PrintStream. Vamos a ver un pequeo ejemplo de entrada/salida en Java. El cdigo siguiente, miType.java , reproduce, o funciona como la utilidad cat de Unix o type de DOS:

import java.io.*; class miType { public static void main( String args[] ) throws IOException { int c; int contador = 0; while( (c = System.in.read() ) != 'n' ) { contador++; System.out.print( (char)c ); } System.out.println(); // Lnea en blanco System.err.println( "Contados "+ contador +" bytes en total." ); } } Clases comunes de Entrada/Salida Adems de la entrada por teclado y salida por pantalla, se necesita entrada/salida por fichero, como son: FileInputStream DataInputStream FileOutputStream DataOutputStream

Tambin existen otras clases para aplicaciones ms especficas, que no vamos a tratar, por ser de un uso muy concreto: PipedInputStream BufferedInputStream PushBackInputStream StreamTokenizer PipedOutputStream BufferedOutputStream Ficheros Todos los lenguajes de programacin tienen alguna forma de interactuar con los sistemas de ficheros locales; Java no es una excepcin. Cuando se desarrollan applets para utilizar en red, hay que tener en cuenta que la entrada/salida directa a fichero es una violacin de seguridad de acceso. Muchos usuarios configurarn sus navegadores para permitir el acceso al sistema de ficheros, pero otros no. Por otro lado, si se est desarrollando una aplicacin Java para uso interno, probablemente ser necesario el acceso directo a ficheros. Ficheros Antes de realizar acciones sobre un fichero, necesitamos un poco de informacin sobre ese fichero. La clase File proporciona muchas utilidades relacionadas con ficheros y con la obtencin de informacin bsica sobre esos ficheros. Creacin de un objeto File Para crear un objeto File nuevo, se puede utilizar cualquiera de los tres constructores siguientes: File miFichero; miFichero = new File( "/etc/kk" ); o miFichero = new File( "/etc","kk" ); o File miDirectorio = new File( "/etc" ); miFichero = new File( miDirectorio,"kk" ); El constructor utilizado depende a menudo de otros objetos File necesarios para el acceso. Por ejemplo, si slo se utiliza un fichero en la aplicacin, el primer constructor es el mejor. Si en cambio, se utilizan muchos ficheros desde un mismo directorio, el segundo o tercer constructor sern ms cmodos. Y si el directorio o el fichero es una variable, el segundo constructor ser el ms til. Comprobaciones y Utilidades

Una vez creado un objeto File, se puede utilizar uno de los siguientes mtodos para reunir informacin sobre el fichero: Nombres de fichero String getName() String getPath() String getAbsolutePath() String getParent() boolean renameTo( File nuevoNombre ) Comprobaciones boolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory() boolean isAbsolute() Informacin general del fichero long lastModified() long length() Utilidades de directorio boolean mkdir() String[] list() Vamos a desarrollar una pequea aplicacin que muestra informacin sobre los ficheros pasados como argumentos en la lnea de comandos, InfoFichero.java : import java.io.*; class InfoFichero { public static void main( String args[] ) throws IOException { if( args.length > 0 ) { for( int i=0; i < args.length; i++ ) { File f = new File( args[i] ); System.out.println( "Nombre: "+f.getName() ); System.out.println( "Camino: "+f.getPath() ); if( f.exists() ) { System.out.print( "Fichero existente " ); System.out.print( (f.canRead() ? " y se puede Leer" : "" ) ); System.out.print( (f.canWrite() ? " y se puese Escribir" : "" ) ); System.out.println( "." ); System.out.println( "La longitud del fichero son "+ f.length()+" bytes" ); } else System.out.println( "El fichero no existe." ); } }

else System.out.println( "Debe indicar un fichero." ); } } Streams de Entrada Hay muchas clases dedicadas a la obtencin de entrada desde un fichero. Este es el esquema de la jerarqua de clases de entrada por fichero:

Objetos FileInputStream Los objetos FileInputStream tpicamente representan ficheros de texto accedidos en orden secuencial, byte a byte. Con FileInputStream, se puede elegir acceder a un byte, varios bytes o al fichero completo. Apertura de un FileInputStream Para abrir un FileInputStream sobre un fichero, se le da al constructor un String o un objeto File:

FileInputStream mi FicheroSt; miFicheroSt = new FileInputStream( "/etc/kk" ); Tambin se puede utilizar: File miFichero FileInputStream miFicheroSt; miFichero = new File( "/etc/kk" ); miFicheroSt = new FileInputStream( miFichero ); Lectura de un FileInputStream Una vez abierto el FileInputStream, se puede leer de l. El mtodo read() tiene muchas opciones: int read();

Lee un byte y devuelve -1 al final del stream. int read( byte b[] ); Llena todo el array, si es posible. Devuelve el nmero de bytes ledos o -1 si se alcanz el final del stream. int read( byte b[],int offset,int longitud ); Lee longitud bytes en b comenzando por b[offset]. Devuelve el nmero de bytes ledos o -1 si se alcanz el final del stream. Cierre de FileInputStream Cuando se termina con un fichero, existen dos opciones para cerrarlo: explcitamente, o implcitamente cuando se recicla el objeto (el garbage collector se encarga de ello). Para cerrarlo explcitamente, se utiliza el mtodo close():

miFicheroSt.close(); Ejemplo: Visualizacin de un fichero Si la configuracin de la seguridad de Java permite el acceso a ficheros, se puede ver el contenido de un fichero en un objeto TextArea. El cdigo siguiente contiene los elementos necesarios para mostrar un fichero:

FileInputStream fis; TextArea ta; public void init() { byte b[] = new byte[1024]; int i; // El buffer de lectura se debe hacer lo suficientemente grande // o esperar a saber el tamao del fichero String s; try { fis = new FileInputStream( "/etc/kk" ); } catch( FileNotFoundException e ) { /* Hacer algo */ } try { i = fis.read( b ); } catch( IOException e ) { /* Hacer algo */ }

s = new String( b,0 ); ta = new TextArea( s,5,40 ); add( ta ); } Hemos desarrollado un ejemplo, Agenda.java, en el que partimos de un fichero agenda que dispone de los datos que nosotros deseamos de nuestros amigos, como son: nombre, telfono y direccin. Si tecleamos un nombre, buscar en el fichero de datos si existe ese nombre y presentar la informacin que se haya introducido. Para probar, intentar que aparezca la informacin de Pepe. Objetos DataInputStream Los objetos DataInputStream se comportan como los FileInputStream. Los streams de datos pueden leer cualquiera de las variables de tipo nativo, como floats, ints o chars. Generalmente se utilizan DataInputStream con ficheros binarios. Apertura y cierre de DataInputStream Para abrir y cerrar un objeto DataInputStream, se utilizan los mismos mtodos que para FileInputStream:

DataInputStream miDStream; FileInputStream miFStream; // Obtiene un controlador de fichero miFStream = new FileInputStream "/etc/ejemplo.dbf" ); //Encadena un fichero de entrada de datos miDStream = new DataInputStream( miFStream ); // Ahora se pueden utilizar los dos streams de entrada para // acceder al fichero (si se quiere...) miFStream.read( b ); i = miDStream.readInt(); // Cierra el fichero de datos explcitamente //Siempre se cierra primero el fichero stream de mayor nivel miDStream.close(); miFStream.close(); Lectura de un DataInputStream Al acceder a un fichero como DataInputStream, se pueden utilizar los mismos mtodos read() de los objetos FileInputStream. No obstante, tambin se tiene acceso a otros mtodos diseados para leer cada uno de los tipos de datos:

byte readByte() int readUnsignedByte() short readShort() int readUnsignedShort()

char readChar() int readInt() long readLong() float readFloat() double readDouble() String readLine() Cada mtodo leer un objeto del tipo pedido. Para el mtodo String readLine(), se marca el final de la cadena con n, r, rn o con EOF. Para leer un long, por ejemplo:

long numeroSerie; ... numeroSerie = miDStream.readLong(); Streams de entrada de URLs Adems del acceso a ficheros, Java proporciona la posibilidad de acceder a URLs como una forma de acceder a objetos a travs de la red. Se utiliza implcitamente un objeto URL al acceder a sonidos e imgenes, con el mtodo getDocumentBase() en los applets:

String imagenFich = new String( "imagenes/pepe.gif" ); imagenes[0] = getImage( getDocumentBase(),imagenFich ); No obstante, se puede proporcionar directamente un URL, si se quiere:

URL imagenSrc; imagenSrc = new URL( "http://enterprise.com/~info" ); imagenes[0] = getImage( imagenSrc,"imagenes/pepe.gif" ); Apertura de un Stream de entrada de URL Tambin se puede abrir un stream de entrada a partir de un URL. Por ejemplo, se puede utilizar un fichero de datos para un applet:

ImputStream is; byte buffer[] = new byte[24]; is = new URL( getDocumentBase(),datos).openStream(); Ahora se puede utilizar is para leer informacin de la misma forma que se hace con un objeto FileInputStream:

is.read( buffer,0,buffer.length ); NOTA: Debe tenerse muy en cuenta que algunos usuarios pueden haber configurado la seguridad de sus navegadores para que los applets no accedan a ficheros.

Streams de Salida La contrapartida necesaria de la lectura de datos es la escritura de datos. Como con los Streams de entrada, las clases de salida estn ordenadas jerrquicamente:

Examinaremos las clases FileOutputStream y DataOutputStream para complementar los streams de entrada que se han visto. En los ficheros fuente del directorio $JAVA_HOME/src/java/io se puede ver el uso y mtodos de estas clases, as como de los streams de entrada ($JAVA_HOME es el directorio donde se haya instalado el Java Development Kit, en sistemas UNIX). Objetos FileOutputStream Los objetos FileOutputStream son tiles para la escritura de ficheros de texto. Como con los ficheros de entrada, primero se necesita abrir el fichero para luego escribir en l. Apertura de un FileOutputStream Para abrir un objeto FileOutputStream, se tienen las mismas posibilidades que para abrir un fichero stream de entrada. Se le da al constructor un String o un objeto File.

FileOutputStream miFicheroSt; miFicheroSt = new FileOutputStream( "/etc/kk" ); Como con los streams de entrada, tambin se puede utilizar: File miFichero FileOutputStream miFicheroSt;

File miFichero FileOutputStream miFicheroSt; miFichero = new File( "/etc/kk" ); miFicheroSt = new FileOutputStream( miFichero ); Escritura en un FileOutputStream

Una vez abierto el fichero, se pueden escribir bytes de datos utilizando el mtodo write(). Como con el mtodo read() de los streams de entrada, tenemos tres posibilidades: void write( int b ); Escribe un byte. void write( byte b[] ); Escribe todo el array, si es posible. void write( byte b[],int offset,int longitud ); Escribe longitud bytes en b comenzando por b[offset]. Cierre de FileOutputStream Cerrar un stream de salida es similar a cerrar streams de entrada. Se puede utilizar el mtodo explcito:

miFicheroSt.close(); O, se puede dejar que el sistema cierre el fichero cuando se recicle miFicheroSt. Ejemplo: Almacenamiento de Informacin Este programa, Telefonos.java, pregunta al usuario una lista de nombres y nmeros de telfono. Cada nombre y nmero se aade a un fichero situado en una localizacin fija. Para indicar que se ha introducido toda la lista, el usuario especifica "Fin" ante la solicitud de entrada del nombre. Una vez que el usuario ha terminado de teclear la lista, el programa crear un fichero de salida que se mostrar en pantalla o se imprimir. Por ejemplo:

95-4751232,Juanito 564878,Luisa 123456,Pepe 347698,Antonio 91-3547621,Maria El cdigo fuente del programa es el siguiente:

import java.io.*; class Telefonos { static FileOutputStream fos; public static final int longLinea = 81; public static void main( String args[] ) throws IOException { byte tfno[] = new byte[longLinea]; byte nombre[] = new byte[longLinea]; fos = new FileOutputStream( "telefono.dat" ); while( true ) { System.err.println( "Teclee un nombre ('Fin' termina)" ); leeLinea( nombre ); if( "fin".equalsIgnoreCase( new String( nombre,0,0,3 ) ) ) break; System.err.println( "Teclee el numero de telefono" ); leeLinea( tfno ); for( int i=0; tfno[i] != 0; i++ ) fos.write( tfno[i] ); fos.write( ',' ); for( int i=0; nombre[i] != 0; i++ ) fos.write( nombre[i] ); fos.write( 'n' ); } fos.close(); } private static void leeLinea( byte linea[] ) throws IOException { int b = 0; int i = 0; while( (i < ( longLinea-1) ) && ( ( b = System.in.read() ) != 'n' ) ) linea[i++] = (byte)b; linea[i] = (byte)0; } } Streams de salida con buffer Si se trabaja con gran cantidad de datos, o se escriben muchos elementos pequeos, ser una buena idea utilizar un stream de salida con buffer. Los streams con buffer ofrecen los mismos mtodos de la clase FileOutputStream, pero toda salida se almacena en un buffer. Cuando se llena el buffer, se enva a disco con una nica operacin de escritura; o, en caso necesario, se puede enviar el buffer a disco en cualquier momento. Creacin de Streams de salida con buffer Para crear un stream BufferedOutput, primero se necesita un stream FileOutput normal; entonces se le aade un buffer al stream:

FileOutputStream miFileStream; BufferdOutpurStream miBufferStream;

// Obtiene un controlador de fichero miFileStream = new FileOutputStream( "/tmp/kk" ); // Encadena un stream de salida con buffer miBufferStream = new BufferedOutputStream( miFileStream ); Volcado y Cierre de Streams de salida con buffer Al contrario que los streams FileOutput, cada escritura al buffer no se corresponde con una escritura en disco. A menos que se llene el buffer antes de que termine el programa, cuando se quiera volcar el buffer explcitamente se debe hacer mediante una llamada a flush():

// Se fuerza el volcado del buffer a disco miBufferStream.flush(); // Cerramos el fichero de datos. Siempre se ha de cerrar // primero el // fichero stream de mayor nivel miBufferStream.close(); miFileStream.close(); Streams DataOutput Java tambin implementa una clase de salida complementaria a la clase DataInputStream. Con la clase DataOutputStream, se pueden escribir datos binarios en un fichero. Apertura y cierre de objetos DataOutputStream Para abrir y cerrar objetos DataOutputStream, se utilizan los mismos mtodos que para los objetos FileOutputStream:

DataOutputStream miDataStream; FileOutputStream miFileStream; BufferedOutputStream miBufferStream; // Obtiene un controlador de fichero miFileStream = new FileOutputStream( "/tmp/kk" ); // Encadena un stream de salida con buffer (por eficiencia) miBufferStream = new BufferedOutputStream( miFileStream ); // Encadena un fichero de salida de datos miDataStream = new DataOutputStream( miBufferStream ); // Ahora se pueden utilizar los dos streams de entrada para // acceder al fichero (si se quiere) miBufferStream.write( b ); miDataStream.writeInt( i ); // Cierra el fichero de datos explcitamente. Siempre se cierra // primero el fichero stream de mayor nivel

miDataStream.close(); miBufferStream.close(); miFileStream.close(); Escritura en un objeto DataOutputStream Cada uno de los mtodos write() accesibles por los FileOutputStream tambin lo son a travs de los DataOutputStream. Tambin encontrar mtodos complementarios a los de DataInputStream:

void writeBoolean( boolean b ); void writeByte( int i ); void writeShort( int i ); void writeChar( int i ); void writeInt( int i ); void writeFloat( float f ); void writeDouble( double d ); void writeBytes( String s ); void writeChars( string s ); Para las cadenas, se tienen dos posibilidades: bytes y caracteres. Hay que recordar que los bytes son objetos de 8 bits y los caracteres lo son de 16 bits. Si nuestras cadenas utilizan caracteres Unicode, debemos escribirlas con writeChars(). Contabilidad de la salida Otra funcin necesaria durante la salida es el mtodo size(). Este mtodo simplemente devuelve el nmero total de bytes escritos en el fichero. Se puede utilizar size() para ajustar el tamao de un fichero a mltiplo de cuatro. Por ejemplo, de la forma siguiente: ... int numBytes = miDataStream.size() % 4; for( int i=0; i < numBytes; i++ ) miDataStream.write( 0 ); ... Terminologa en Java Esta es alguna de la Terminologa utilizada en Java, lo cual demuestra el amplio alcance que tiene este lenguaje. Applet : Un applet es un programa que genera una ventana adicional dentro de su "Netscape Navigator" o "Internet Explorer" , esta ventana puede componerse de mens,sonido o imgenes. Otro terminologa que casi siempre va en conjuncin con un Applet es : AWT (Abstract Window Toolkit) y "SWING", ambas son API's ("Programming Interface") utilizados para formar Applets. Java APIs : Forman la base para programar en el lenguaje Java, estas clases se encuentran divididas por paquetes ("packages") que serian el Anlogo de "Libreras en

C". AWT ("Abstract Windows Toolkit") mencionado anteriormente es uno de los paquetes del API Java Java Beans : Esta arquitectura permite una manera de re-utilizar componentes de software que pueden ser manipulados en herramientas de desarrollo("Builder Tools"). Estos "Beans" pueden ser tan sencillos como un botn,o complejos como el acceso a una base de datos; una caracterstica primordial de un JavaBean son los mtodos (funciones) get|set JFC "Java Foundation Classes" : Forman parte del API Java , y son un juego de componentes para generar una interfase grfica (GUI) y otros servicios que simplifican el desarrollo de aplicaciones en el Cliente ("Client Side") para Intranets e Internet. JNI "Java Native Interface" : Esto permite que cdigo escrito en Java sea capaz de interactuar con aplicaciones escritas en C, C++. JSP "Java Server Pages" : Este es un tipo de programa Java que contiene HTML, para ejecutar un JSP se requiere de un servlet engine como : Tomcat o bien un java application server como Websphere de IBM que son capaces de ejecutar un "Java Server Pages". JVM ("Java Virtual Machine"): Este componente de Java es el ingrediente principal del logo "Write Once, Run Everywhere", cada plataforma o Sistema Operativo (Oracle,Windows,Linux,etc) debe desarrollar un "Virtual Machine", esto otorga un nivel de abstraccin entre los programas escritos en Java y las diferentes plataformas, lo cual garantiza que toda aplicacin escrita en Java logre ser ejecutada en todo tipo de Plataforma que soporte un "Java Virtual Machine". Esto en contraste con programas escritos en C y C++ en los que era necesario modificar el cdigo fuente ("Source Code") para que el programa ejecutara en diferentes plataformas. Lo que interpreta un JVM "Virtual Machine" es Byte Code, el cual es generado al compilar cualquier programa en Java. Este Byte Code ser idntico si es producido en un ambiente Windows,Solaris,Linux..etc y como ya fue mencionado: a travs del JVM para cada plataforma se producen los mismos resultados. JDBC : JDBC es un API que permite la ejecucin de SQL (Structured Query Language) (lenguaje que utilizan las bases de datos ). Con este API es posible accesar casi toda fuente de Informacin desde Bases de Datos, Hojas de Clculo hasta archivos comunes("flat files") JDK o SDK: JDK es el ambiente en el cual es posible desarrollar cualquier aplicacin Java. Este ambiente o paquete incluye: El API de Java, el compilador de Java, as como el JVM "Java Virtual Machine" de la plataforma correspondiente.NOTA: La ltima versin de JDK a esta fecha es JDK1.4, sin embargo, esto tambin es denominado "Java 2 Platform"(J2SE) e inclusive SDK ("Standard Development Kit") JINI : Esta Tecnologa permite la comunicacin en Red desde aparatos domsticos(Refrigeradores,Hornos y otros dispositivos) hasta Sistemas Empresariales(Sun E10000, S80 de IBM ,etc), su gran ventaja ? Esta arquitectura permite que cada servicio (aparato o software) pueda comunicarse entre s, PERO sin necesidad de administracin humana.

RMI "Remote Method Invocation : Al igual que Jini, RMI permite que aplicaciones en Java se comuniquen a travs de Red, las aplicaciones pueden ejecutarse en computadoras en lados opuestos del mundo,PERO esto se logra mediante el Protocolo GIOP "General Inter Orb Protocol", aunque se utiliza IIOP, mejor conocido como "Inter Orb Protocol" que es una variacin de GIOP operado bajo el protocolo TCP/IP . Servlet : Un servlet generalmente es utilizado para procesar formas (requisiciones de usuarios),verificar ("authenticate") usuarios, generar contenido dinmico; es muy similar a un JSP, inclusive un JSP se convierte eventualmente en un Servlet, la diferencia es que un Servlet solo contiene lenguaje Java desde el inicio, mientras que un JSP contiene Java y HTML.

INTRODUCCIN.

1.1 Historia del lenguaje.


El lenguaje Java fue creado por Sun Microsystems Inc. en un proceso por etapas que arranca en 1990, ao en el que Sun cre un grupo de trabajo, liderado por James Gosling, para desarrollar un sistema para controlar electrodomsticos e incluso PDAs o Asistentes Personales (pequeos ordenadores) que, adems, permitiera la conexin a redes de ordenadores. Se pretenda crear un hardware polivalente, con un Sistema Operativo eficiente (SunOS) y un lenguaje de desarrollo denominado Oak (roble), el precursor de Java. El proyecto finaliz en 1992 y result un completo fracaso debido al excesivo coste del producto, con relacin a alternativas similares, tras lo cual el grupo se disolvi. Por entonces aparece Mosaic y la World Wide Web. Despus de la disolucin del grupo de trabajo, nicamente quedaba del proyecto el lenguaje Oak. Gracias a una acertada decisin de distribuir libremente el lenguaje por la Red de Redes y al auge y la facilidad de acceso a Internet, propiciado por la WWW, el lenguaje se populariz y se consigui que una gran cantidad de programadores lo depurasen y terminasen de perfilar la forma y usos del mismo. A partir de este momento, el lenguaje se difunde a una velocidad vertiginosa, aadindosele numerosas clases y funcionalidad para TCP/IP. El nombre del lenguaje tuvo que ser cambiado ya que exista otro llamado Oak. El nombre Java surgi en una de las sesiones de brainstorming celebradas por el equipo de desarrollo del lenguaje. Buscaban un nombre que evocara la esencia de la tecnologa (viveza, animacin, rapidez, interactividad ). Java fue elegido de entre muchsimas propuestas. No es un acrnimo, sino nicamente algo humeante, caliente y que a muchos programadores les gusta beber en grandes cantidades: una taza de caf (Java en argot Ingls americano2). De esta forma, Sun lanz las primeras versiones de Java a principios de 1995. Desde entonces, Sun ha sabido manejar inteligentemente el xito obtenido por su lenguaje, concedindose licencias a cualquiera sin ningn problema, fomentando su uso entre la comunidad informtica y extendiendo las especificaciones y funcionalidad del lenguaje.

1.2 Qu es Java?
Java es un lenguaje de desarrollo de propsito general, y como tal es vlido para realizar todo tipo de aplicaciones profesionales. Entonces, es simplemente otro lenguaje ms? Definitivamente no. Incluye una combinacin de caractersticas que lo hacen nico y est siendo adoptado por multitud de fabricantes como herramienta bsica para el desarrollo de aplicaciones comerciales de gran repercusin.

1.3 Qu lo hace distinto de los dems lenguajes?


Una de las caractersticas ms importantes es que los programas ejecutables, creados por el compilador de Java, son independientes de la arquitectura. Se ejecutan indistintamente en una gran variedad de equipos con diferentes microprocesadores y sistemas operativos. De momento, es pblico. Puede conseguirse un JDK (Java Developer's Kit) o Kit de desarrollo de aplicaciones Java gratis. No se sabe si en un futuro seguir sindolo. Permite escribir Applets (pequeos programas que se insertan en una pgina HTML) y se ejecutan en el ordenador local.

Se pueden escribir aplicaciones para intrarredes, aplicaciones cliente/servidor, aplicaciones distribuidas en redes locales y en Internet. Es fcil de aprender y est bien estructurado. Las aplicaciones son fiables. Puede controlarse su seguridad frente al acceso a recursos del sistema y es capaz de gestionar permisos y criptografa. Tambin, segn Sun, la seguridad frente a virus a travs de redes locales e Internet est garantizada. Aunque al igual que ha ocurrido con otras tecnologas y aplicaciones, se han descubierto, y posteriormente subsanado, agujeros en la seguridad3 de Java.

1.3.1 Qu se puede programar con Java?


Si tena preconcebida la idea de que con Java slo se programan applets para pginas web, est completamente equivocado. Ya que Java es un lenguaje de propsito general, puede programarse en l cualquier cosa: Aplicaciones independientes. Como con cualquier otro lenguaje de propsito general. Applets. Pequeas aplicaciones que se ejecutan en un documento HTML, siempre y cuando el navegador soporte Java, como ocurre con los navegadores HotJava y las ltimas versiones de Netscape y el explorador de Internet de Microsoft.

1.3.2 Es fcil de aprender?


S. Para el colectivo de programadores que conocen la programacin orientada a objetos, el cambio a Java puede ser realmente sencillo. Es un lenguaje bien estructurado, sin punteros y sin necesidad de tener que controlar la asignacin de memoria a estructuras de datos u objetos. Para los programadores en C++ tambin es sencillo el cambio, ya que la sintaxis es prcticamente la misma que en este lenguaje. Para todo aquel que no conozca la programacin orientada a objetos, este lenguaje es ideal para aprender todos sus conceptos, ya que en cada paso de su aprendizaje se va comprobando que las cosas se hacen en la forma natural de hacerlas, sin sorpresas ni comportamientos extraos de los programas. A medida que se va aprendiendo, se va fomentando en el programador, y sin esfuerzo, un buen estilo de programacin orientada a objetos. En realidad, no puede ser de otra forma, ya
3 El aspecto de seguridad tiene importancia fundamental en la creacin de applets puesto que estos programas son ejecutados en el navegador de cada usuario es necesario poder garantizarle que su sistema y sus datos estn seguros de posibles virus y/o fisgoneos de terceras personas que podran utilizar la red como medio para fines ms o menos oscuros.

que Java impide hacer cosas extraas y, adems, no permite abandonar la programacin orientada a objetos, como ocurre con otros lenguajes de programacin. Esto es bastante conveniente, de lo contrario, un programador que est aprendiendo puede sentir la tentacin de volver a lo que conoce (la programacin tradicional). A medida que se van comprobando las ventajas de la programacin orientada a objetos, para aquellos que las desconocen, y la facilidad y naturalidad del lenguaje Java, ste va atrapando a quien se acerca a l, y despus de algn tiempo trabajando con Java, hay pocos programadores que no lo consideren como su favorito.

1.3.3 Caractersticas del lenguaje.


Es intrnsecamente orientado a objetos. Funciona perfectamente en red. Aprovecha caractersticas de la mayora de los lenguajes modernos evitando sus inconvenientes. En particular los del C++. Tiene una gran funcionalidad gracias a sus libreras (clases). NO tiene punteros manejables por el programador, aunque los maneja interna y transparentemente. El manejo de la memoria no es un problema, la gestiona el propio lenguaje y no el programador. Genera aplicaciones con pocos errores posibles. Incorpora Multi-Threading (para permitir la ejecucin de tareas concurrentes dentro de un mismo programa). Esta caracterstica ser tratada con detenimiento en el punto $ 6 Threads. En la pgina 199. El lenguaje Java puede considerarse como una evolucin del C++. La sintaxis es parecida a la de este

lenguaje, por lo que en este libro se har referencia a dicho lenguaje frecuentemente. A pesar de que puede considerarse como una evolucin del C++ no acarrea los inconvenientes del mismo, ya que Java fue diseado partiendo de cero, es decir, no necesitaba ser compatible con versiones anteriores de ningn lenguaje como ocurre con C++ y C. Gracias a que fue diseado partiendo de cero ha conseguido convertirse en un lenguaje orientado a objetos puro, limpio y prctico. No permite programar mediante otra tcnica que no sea la programacin orientada a objetos (POO en adelante) y, una vez superado el aprendizaje de la programacin orientada a objetos, es realmente sencillo aprender Java. El lenguaje es Compilado o Interpretado? Ni una cosa ni la otra. Aunque estrictamente hablando es interpretado, necesita de un proceso previo de compilacin. Una vez compilado el programa, se crea un fichero que almacena lo que se denomina bytecodes o j_code (pseudocdigo prcticamente al nivel de cdigo mquina). Para ejecutarlo, es necesario un intrprete, la JVM (Java Virtual Machine) mquina virtual Java. De esta forma, es posible compilar el programa en una estacin UNIX y ejecutarlo en otra con Windows95 utilizando la mquina virtual Java para Windows95. Esta JVM se encarga de leer los bytecodes y traducirlos a instrucciones ejecutables directamente en un determinado microprocesador, de una forma bastante eficiente. Que el programa deba ser interpretado no hace que sea poco eficiente en cuanto a velocidad, ya que la interpretacin se hace prcticamente al nivel de cdigo mquina. Por ejemplo, es mucho ms rpido que cualquier otro programa interpretado como por ejemplo Visual Basic, aunque es ms lento que el mismo programa escrito en C++. Esta deficiencia en cuanto a la velocidad, puede ser aminorada por los compiladores Just-In- Time (JIT). Un compilador JIT transforma los bytecodes de un programa o un applet en cdigo nativo de la plataforma donde se ejecuta, por lo que es ms rpido. Suelen ser incorporados por los navegadores, como Netscape o Internet Explorer El lenguaje Java es robusto. Las aplicaciones creadas en este lenguaje son susceptibles de contener pocos errores, principalmente porque la gestin de memoria y punteros es realizada por el propio lenguaje y no por el programador. Bien es sabido que la mayora de los errores en las aplicaciones vienen producidos por fallos en la gestin de punteros o la asignacin y liberacin de memoria. Adems, el lenguaje contiene estructuras para la deteccin de excepciones (errores de ejecucin previstos) y permite obligar al programador a escribir cdigo fiable mediante la declaracin de excepciones posibles para una determinada clase reutilizable.

1.4 La Mquina Virtual Java (JVM).


La mquina virtual Java es la idea revolucionaria4 del lenguaje. Es la entidad que proporciona la independencia de plataforma para los programas Java compilados en byte-code.
4 Bueno, no completamente revolucionario, otros sistemas en el pasado, como por ejemplo el Pascal UCSD compilaban a un cdigo intermedio (p-code) que luego era interpretado al ejecutar el programa. No obstante, esta estrategia no es la habitual en la mayora de lenguajes, al menos no lo ha sido hasta ahora.

Un mismo programa fuente compilado en distintas plataformas o sistemas operativos, genera el mismo fichero en byte-code. Esto es lgico, ya que se supone que el compilador de Java traduce el fichero fuente a cdigo ejecutable por una mquina que nicamente existe en forma virtual (aunque se trabaja en la construccin de microprocesadores que ejecuten directamente el byte-code). Evidentemente, si un mismo programa en byte-code puede ser ejecutado en distintas plataformas es porque existe un traductor de ese byte-code a cdigo nativo de la mquina sobre la que se ejecuta. Esta tarea es realizada por la JVM. Existe una versin distinta de esta JVM para cada plataforma. Esta JVM se carga en memoria y va traduciendo al vuelo, los byte-codes a cdigo mquina. La JVM no ocupa mucho espacio en memoria, pinsese que fue diseada para poder ejecutarse sobre pequeos electrodomsticos como telfonos, televisores, etc.

1.5 JavaScript.
Atencin: No hay que confundir Java con JavaScript. JavaScript es una variacin del lenguaje Java. Desarrollado por Netscape y Sun, fue diseado para simplificar la creacin de contenidos interactivos en pginas web sin necesidad de tener que programar applets en Java. En lugar de ello se utilizan tcnicas ms sencillas mediante el lenguaje JavaScript que es ms flexible, aunque mucho menos potente. El lenguaje JavaScript es totalmente interpretado por el navegador. El cdigo fuente se incluye como parte de la pgina web en HTML y es el navegador el encargado de interpretar el cdigo fuente. No podra hacerse en Java? S, pero no de forma tan sencilla como con JavaScript. Este lenguaje fue pensado para acercar Java a programadores inexpertos y creadores de contenidos HTML sin conocimientos avanzados de programacin. Diferencias entre Java y JavaScript: Java es compilado, mientras que JavaScript es totalmente interpretado. Java es orientado a objetos. JavaScript utiliza objetos, pero no permite la programacin orientada a objetos. En JavaScript no es necesario declarar las variables y en Java s. En JavaScript, las comprobaciones de validez de referencias a objetos se realizan en tiempo de ejecucin, mientras que en Java se realiza en tiempo de compilacin. JavaScript tiene un nmero limitado de tipos de datos y clases. Los applets Java se transmiten como cdigo aparte de la pgina Web. En JavaScript, los applets se transmiten conjuntamente con la pgina web (embebidos en ella).

1.6 El entorno de desarrollo JDK.


La herramienta bsica para empezar a desarrollar aplicaciones o applets en Java es el JDK (Java Developers Kit) o Kit de Desarrollo Java, que consiste, bsicamente, en un compilador y un intrprete (JVM) para la lnea de comandos. No dispone de un entorno de desarrollo integrado (IDE), pero es suficiente para aprender el lenguaje y desarrollar pequeas aplicaciones.

1.6.1 Dnde conseguirlo?


El Kit de desarrollo puede obtenerse en las direcciones siguientes: http://www.sun.com http://www.javasoft.com El entorno para Windows95/NT est formado por un fichero ejecutable que realiza la instalacin, creando toda la estructura de directorios. El kit contiene bsicamente: El compilador: javac.exe El depurador: jdb.exe El intrprete: java.exe y javaw.exe El visualizador de applets: appletviewer.exe El generador de documentacin: javadoc.exe Un desensamblador de clases: javap.exe El generador de archivos fuentes y de cabecera (.c y .h) para clases nativas en C: javah.exe

1.6.2 Estructura de directorios.


.hotJava: Es donde se almacenan los ficheros de configuracin del navegador de Sun HotJava. bin: Es donde se almacenan los ficheros ejecutables del entorno de desarrollo: javac, jdb, java y appletviewer. demo: Contiene varios directorios con ejemplos de

programas y applets escritos en Java. include: Contiene cabeceras para utilizar funciones escritas en C. lib: Contiene las libreras de clases proporcionadas por el lenguaje. Estas libreras se encuentran comprimidas en el fichero classes.zip.

1.6.3 Configuracin.
En este caso se va a suponer que el JDK ha sido instalado en el directorio c:\java. En otro caso, bastara con sustituir ste por el directorio realmente utilizado. En primer lugar, para poder ejecutar el compilador javac y poder interpretar los programas ejecutables resultantes, hay que aadir en el path la localizacin de los ejecutables del entorno de desarrollo, modificando el fichero autoexec.bat de la siguiente forma: path = c:\java\bin; .. Tambin hay que aadir en l una variable CLASSPATH que contendr el/los directorios donde se almacenan las clases. set CLASSPATH = c:\java\lib; c:\Java\MisClases; . ; . Es conveniente incluir el directorio actual ( . ) para poder acceder a las clases que se estn creando en un determinado directorio en un momento dado.

1.7 Programacin orientada a objetos.


Antes de empezar a estudiar en detalle el lenguaje Java, es imprescindible conocer los conceptos y caractersticas particulares de la programacin orientada a objetos (POO). No slo es importante que este punto sea ledo por quien desconoce la POO sino que tambin es importante que lo lea quien la conoce, ya que existen distintas terminologas para nombrar los mismos conceptos. La programacin orientada a objetos es una evolucin lgica de la programacin estructurada, en la que el concepto de variables locales a un procedimiento o funcin, que no son accesibles a otros procedimientos y funciones, se hace extensible a los propios subprogramas que acceden a estas variables. Pero la programacin orientada a objetos va mucho ms all. En realidad, cambia la concepcin de la metodologa de diseo de los programas. En la programacin orientada a objetos, se definen objetos que conforman una aplicacin. Estos objetos estn formados por una serie de caractersticas y operaciones que se pueden realizar sobre los mismos. Estos objetos no estn aislados en la aplicacin, sino que se comunican entre ellos.

1.7.1 Qu es un objeto?
La respuesta a esta pregunta en trminos ajenos a la programacin parece simple. Un objeto es una persona, animal o cosa. Se distingue de otros objetos por tener unas determinadas caractersticas y sirve para algo, o dicho de otra forma, se pueden realizar distintas operaciones con/sobre ese objeto. Por ejemplo: Una casa es un objeto. CARACTERSTICAS: Nmero de pisos, altura total en metros, color de la fachada, nmero de ventanas, nmero de puertas, ciudad, calle y nmero donde est ubicada, etc. OPERACIONES: Construir, destruir, pintar fachada, modificar alguna de las caractersticas, como por ejemplo, abrir una nueva ventana, etc. Evidentemente, cada objeto puede definirse en funcin de multitud de caractersticas y se pueden realizar innumerables operaciones sobre l. Ya en trminos de programacin, ser misin del programador determinar qu caractersticas y que operaciones interesa mantener sobre un objeto. Por ejemplo, sobre el objeto casa puede no ser necesario conocer su ubicacin y por lo tanto, dichas caractersticas no formarn parte del objeto definido por el programador. Lo mismo podra decirse sobre las operaciones. En terminologa de programacin orientada a objetos, a las caractersticas del objeto se les denomina ATRIBUTOS y a las operaciones MTODOS. Cada uno de estos mtodos es un procedimiento o una funcin

perteneciente a un objeto. Un objeto est formado por una serie de caractersticas o datos (atributos) y una serie de operaciones (mtodos). No puede concebirse nicamente en funcin de los datos o de las operaciones sino en su conjunto.

1.7.2 Clases y objetos.


En la POO hay que distinguir entre dos conceptos ntimamente ligados, la CLASE y el OBJETO. De forma anloga a cmo se definen las variables en un lenguaje de programacin, cuando se declara un objeto hay que definir el tipo de objeto al que pertenece. Este tipo es la CLASE. En C, se definen dos variables X e Y de tipo entero de la forma siguiente: int X,Y; En este caso, X e Y son variables, y el tipo de dichas variables es ENTERO. La forma de declarar objetos en Java es la misma: Ccasa casa1,casa2; En este caso, casa1 y casa2 son efectivamente variables, pero un tanto especiales, son OBJETOS. Adems, el tipo de objetos es Ccasa. Este tipo es la CLASE del objeto5. Al declarar casa1 y casa2 como objetos pertenecientes a la clase Ccasa, se est indicando que casa1 y casa2 tendrn una serie de atributos (datos) como son nPuertas, nVentanas y color; y, adems, una serie de mtodos (operaciones que se pueden realizar sobre ellos) como son: abrirVentanas(), cerrarVentanas(), etc.
5 Aunque no todos los textos emplean la misma notacin, nosotros denominaremos objeto a la instancia de una clase. De este modo clase y tipo son los conceptos similares en programacin orientada a objetos y programacin estructurada al igual que hay similitud entre los conceptos de objeto y variable.

1.7.3 Propiedades que debe cumplir un lenguaje para ser considerado Orientado a Objetos.
ENCAPSULAMIENTO. HERENCIA. POLIMORFISMO.

1.7.3.1 Encapsulamiento.
El encapsulamiento consiste en la propiedad que tienen los objetos de ocultar sus atributos, e incluso los mtodos, a otras partes del programa u otros objetos. La forma natural de construir una clase es la de definir una serie de atributos que, en general, no son accesibles fuera del mismo objeto, sino que nicamente pueden modificarse a travs de los mtodos que son definidos como accesibles desde el exterior de esa clase. class Ccasa { int nPuertas, nVentanas; String color; public Ccasa(int np, int nv, String co) { nPuertas=np; nVentanas=nv; color=co; } public void pintar(String co) { color=co; } public void abrirVentanas(int n) { nVentanas=nVentanas+n; } public void cerrarVentanas(int n) { nVentanas=nVentanas-n;

if (nVentanas<0) nVentanas=0; } public void abrirPuertas(int n) { nPuertas=nPuertas+n; } public void cerrarPuertas(int n) {nPuertas=nPuertas-n; if (nPuertas<0) nPuertas=0; } } Ccasa casa1,casa2; La forma normal de declarar la CLASE Ccasa consiste en definir una serie de atributos no accesibles desde cualquier parte del programa, sino nicamente a travs de determinados mtodos. As, si se quiere abrir una nueva ventana en la casa casa1, la filosofa tradicional de un programador consistira en realizar lo siguiente: casa1.N_VENTANAS := casa1.N_VENTANAS + 1; Sin embargo, la forma natural de hacerlo en POO es llamando al mtodo casa1.abrirVentanas(1). Ese mtodo (procedimiento) se encargar de incrementar en 1 el atributo nVentanas. Esto no quiere decir que el atributo nVentanas no pueda ser accedido de la forma tradicional (si se hubiera definido como public) pero, para que el lenguaje pueda ser considerado como OO, debe permitir la posibilidad de prohibir el acceso a los atributos directamente.

1.7.3.2 Herencia.
Es una de las principales ventajas de la POO. Esta propiedad permite definir clases descendientes de otras, de forma que la nueva clase (la clase descendiente) hereda de la clase antecesora todos sus ATRIBUTOS y MTODOS. La nueva clase puede definir nuevos atributos y mtodos o incluso puede redefinir atributos y mtodos ya existentes (por ejemplo: cambiar el tipo de un atributo o las operaciones que realiza un determinado mtodo). Es la forma natural de definir objetos en la vida real. La mayora de la gente dira, por ejemplo, que un chalet es una casa con jardn. Tiene las mismas caractersticas y propiedades u operaciones que pueden realizarse sobre una casa y, adems, incorpora una nueva caracterstica, el jardn. En otras ocasiones, se aadir funcionalidad (mtodos) y no atributos. Por ejemplo: un pato es un ave que nada. Mantiene las mismas caractersticas que las aves y nicamente habra que declarar un mtodo sobre la nueva clase (el mtodo nadar). Esta propiedad permite la reutilizacin del cdigo, siendo muy fcil aprovechar el cdigo de clases ya existentes, modificndolas mnimamente para adaptarlas a las nuevas especificaciones. Ejemplo: Supongamos que tenemos construida la clase Ccasa y queremos definir una nueva clase que represente a los chalets. En este caso puede ser conveniente definir un nuevo atributo que represente los metros cuadrados de jardn. En lugar de volver a definir una nueva clase desde cero, puede aprovecharse el cdigo escrito para la clase Ccasa de la siguiente forma. ! class Cchalet extends Ccasa { int mJardin; public Cchalet(int np, int nv, String co, int nj) { super(np,nv,co); mJardin=nj; } } Cchalet chalet1,chalet2; Como puede verse, nicamente hay que declarar que la nueva clase Cchalet es descendiente de Ccasa (extends Ccasa) y declarar el nuevo atributo. Evidentemente, el mtodo constructor6 hay que redefinirlo para poder inicializar el nuevo atributo

mJardin. Pero los mtodos para Abrir/Cerrar puertas o ventanas no es necesario


6 El constructor es un mtodo especial, con el mismo nombre que la clase y cuya funcin es inicializar los atributos de cada objeto (instancia).

definirlos, son heredados de la clase Ccasa y pueden utilizarse, por ejemplo de la siguiente forma: chalet1.pintar(Blanco);

1.7.3.3 Polimorfismo.
El polimorfismo permite que un mismo mensaje enviado a objetos de clases distintas haga que estos se comporten tambin de forma distinta (objetos distintos pueden tener mtodos con el mismo nombre o incluso un mismo objeto puede tener nombres de mtodos idnticos pero con distintos parmetros)7. class Ccasa { public Ccasa(int np, int nv, String co) { nPuertas=np; nVentanas=nv; color=co; } public Ccasa() { nPuertas=0; nVentanas=0; color=; } Tiene dos mtodos con el mismo nombre pero parmetros distintos. En el primer caso se inicializarn los atributos del objeto con los parmetros del mtodo y en el segundo caso se inicializarn a cero, por ejemplo. Adems, si tenemos dos objetos casa1 y chalet1 y se llama al mtodo chalet1.abrirVentanas(2) se ejecutar el cdigo del procedimiento abrirVentanas de la clase Cchalet y no de la clase Ccasa.
7 Acadmicamente esto no es rigurosamente cierto. En realidad lo descrito aqu tiene ms que ver con la sobrecarga que con el polimorfismo , pero el concepto de polimorfismo es bastante ms complicado y a veces es mejor una mentira fcil de entender que una verdad incomprensible.

1.8 CUESTIONES
1. El lenguaje Java fue desarrollado con una finalidad especfica, muy distinta de su uso actual. Realmente se trata de un lenguaje de programacin de propsito general? 2. Es Java un lenguaje compilado o interpretado? Por qu? 3. Qu es un applet? Para qu sirve? 4. Cul es la finalidad de un compilador JIT (Just in time)? 5. Qu es el bytecode? 6. Es posible conseguir herramientas de desarrollo gratuitas para construir aplicaciones y applets en Java? Si es as, dnde? 7. Se te encarga la tarea de realizar un programa que acte como una calculadora simple, con las cuatro operaciones bsicas. Piensa qu clases definiras y con qu atributos y mtodos. 8. Cul es la funcin de la variable de entorno CLASSPATH en la instalacin del JDK? 9. Una urbanizacin est constituida por un conjunto de cuatro casas, cada una con una orientacin, posicin y aspecto diferente. Implementa la clase Urbanizacion.

VISIN GENERAL Y ELEMENTOS BSICOS DEL LENGUAJE. En Java, prcticamente todo son clases (objetos). El lenguaje obliga a la programacin orientada a objetos y no permite la posibilidad de programar mediante ninguna otra tcnica que no sea sta. Por esta razn, un programa estar formado por uno o varios ficheros fuente y en cada uno de ellos habr definida una o varias clases. En un fichero fuente puede declararse una o ms clases y tendr un aspecto

similar a este: class Clase1 { } class Clase2 { } class ClaseN { } Una clase est formada por una parte correspondiente a la declaracin, y otra correspondiente al cuerpo de la misma: Declaracin de clase { Cuerpo de clase } Se ha simplificado el aspecto de la Declaracin de clase, pero s que puede asegurarse que la misma contendr, como mnimo, la palabra reservada class y el nombre que recibe la clase. El cuerpo de las clases comienza con una llave abierta({) y termina con una llave cerrada (}). Dentro del cuerpo de la clase se declaran los atributos y los mtodos de la clase. Para que un programa se pueda ejecutar, debe contener una clase que tenga un mtodo main con la siguiente declaracin: public static void main( String argumentos [] ) 2.1 Hola, mundo. En primer lugar, vamos a ver qu estructura debera tener el tpico programa con el que se empieza en cualquier lenguaje de programacin y que proporciona una primera visin de la sintaxis del lenguaje y que comienza a transmitir una serie de sentimientos de aceptacin o de rechazo en el programador. El programa simplemente mostrar en pantalla el mensaje hola, mundo y terminar. Este ejemplo habr que crearlo mediante un editor cualquiera y guardar el fichero con el nombre Hola.java (ATENCIN: Es importante que tenga el mismo nombre que la clase Hola, distinguiendo entre maysculas y minsculas). ! class Hola { public static void main(String argumentos[]) { System.out.println("hola, mundo"); } } El lenguaje Java, al igual que C, distingue entre maysculas y minsculas, por lo que es importante transcribirlo literalmente. Tambin hay que comentar que en el nombre del fichero fuente tambin se hace distincin entre maysculas y minsculas a la hora de compilarlo, aunque el sistema operativo empleado no haga esta distincin. La extensin del mismo debe ser .java Para compilar el programa, hay que teclear: javac Hola.java El compilador crear un fichero que se llama Hola.class que contiene el cdigo bytecode (pseudoejecutable) Para ejecutarlo: java Hola Se escribe nicamente el nombre de la clase Hola y no Hola.class u Hola.java El intrprete Java buscar el fichero Hola.class en los directorios

especificados en la variable de entorno CLASSPATH ($ como se vio en el punto 1.6.3 Configuracin. En la pgina 19) y, si lo encuentra y tiene mtodo main(), lo ejecutar. El resultado de la ejecucin ser la visualizacin en pantalla del mensaje: hola, mundo Explicacin del programa Hola.java lnea a lnea: Este simple programa, a pesar de no ser muy extenso, contiene muchos de los conceptos de la programacin orientada a objetos en Java. No se pretende que, a partir del mismo, se aprendan y comprendan la totalidad de los aspectos de la POO y la sintaxis del Java, pero s que puede afirmarse que una vez comprendida y asimilada su filosofa, se estar en un punto bastante cercano a los conocimientos bsicos necesarios para entenderlos. La primera lnea del programa declara una clase llamada Hola, que es descendiente, al no indicar nosotros que herede de otra clase, de la clase Object. Entre las llaves de la clase Hola, se declaran los atributos y los mtodos de la clase. Todo lo que se encuentre entre la llave abierta ( { ) y la llave cerrada ( } ) pertenece a la clase Hola. En nuestro ejemplo, nicamente tiene un mtodo: main. Las llaves no sirven nicamente para marcar el inicio y el fin de una clase. Se utilizan para marcar principio y final de bloques de cdigo y se interpretan mediante el mtodo LIFO (Last In First Out) donde el ltimo en entrar es el primero en salir. En el ejemplo existen, adems de las llaves abierta y cerrada de la clase, otras llaves abierta y cerrada dentro del mtodo main(). Que se interpreten mediante el mtodo LIFO significa que la llave cerrada ( } ) del mtodo main() parentiza el bloque abierto por la ltima llave ( { ) antes de sta. Todo programa independiente escrito en Java empieza a ejecutarse (como en C) a partir del mtodo main(). Se pueden compilar clases que no posean mtodo main(), pero el intrprete Java no podr ejecutarlas inicialmente, aunque s pueden ejecutarse si son llamadas desde otro mtodo en ejecucin. Veremos en posteriores captulos que la forma de crear los applets es distinta y no necesita declarar este mtodo. Declaracin del mtodo main(): public: indica que el mtodo main() es pblico y, por tanto, puede ser llamado desde otras clases. Todo mtodo main() debe ser pblico para poder ejecutarse desde el intrprete Java (JVM). static: indica que la clase no necesita ser instanciada para poder utilizar el mtodo al que califica. (No se crea ninguna instancia u objeto de la clase Hola). Tambin indica que el mtodo es el mismo para todas las instancias que pudieran crearse. void: indica que la funcin main no devuelve ningn valor. El mtodo main debe aceptar siempre, como parmetro, un vector de strings, que contendr los posibles argumentos que se le pasen al programa en la lnea de comandos, aunque como es nuestro caso, no se utilice. Si no se han comprendido muy bien todos estos conceptos no importa, de momento. Hay una regla sencilla que nunca falla: El mtodo main() siempre se declara de la misma forma: public static void main(String argumentos[]) La instruccin que realmente realiza el trabajo efectivo de nuestro programa es la siguiente: System.out.println("hola, mundo"); Este lnea indica que se va a ejecutar el mtodo println(), encargado de mostrar un valor a travs de la salida estndar (en nuestro caso, un String) y despus realizar un retorno de carro y nueva lnea. Este mtodo pertenece al atributo out. Este atributo se encuentra incluido dentro de la clase System.

Como curiosidad (de momento), cabe mencionar que esta clase es static (no hemos declarado ningn objeto de la clase System). Un poco complicado para simplemente mostrar un mensaje en pantalla? Es posible que s lo sea para aquellos que an no conocen la programacin orientada a objetos, pero una vez conocidos y asimilados los conceptos de la POO (Programacin Orientada a Objetos) el programa es bastante sencillo y lgico. Para aquellos que conozcan C++ pensarn que es bastante parecido a lo que habran escrito en su lenguaje favorito. Este colectivo comprobar que es mucho ms fcil que C y tiene algunas ventajas. Despus de haber tomado contacto con Java, vamos a describir los elementos que componen el lenguaje. 2.2 Comentarios. Los comentarios en los programas fuente son muy importantes en cualquier lenguaje. Sirven para aumentar la facilidad de comprensin del cdigo y para recordar ciertas cosas sobre el mismo. Son porciones del programa fuente que no sern compiladas, y, por tanto, no ocuparn espacio en el fichero ejecutable. nicamente sirven para documentar. Si un comentario debe ocupar ms de una lnea, hay que anteponerle /* y al final */. !Ejemplo: /* Esto es un comentario que ocupa tres lneas */ Si el comentario que se desea escribir es de una sola lnea, basta con poner dos barras inclinadas: // !Ejemplo: for (i=0; i<20;i++) // comentario de bucle { System.out.println(Adis); } No puede ponerse cdigo despus de un comentario introducido por // en la misma lnea, ya que desde la aparicin de las dos barras inclinadas // hasta el final de la lnea es considerado como comentario e ignorado por el compilador. Existe otro tipo de comentario que sirve para generar documentacin automticamente en formato HTML mediante la herramienta javadoc ($ Vase A.7 javadoc (Generador de documentacin). en la pgina 265). Puede ocupar varias lneas y se inicia con /** para terminar con */. 2.3 Tipos de datos. En Java existen dos tipos principales de datos: 1) Tipos de datos simples. 2) Referencias a objetos. Los tipos de datos simples son aquellos que pueden utilizarse directamente en un programa, sin necesidad del uso de clases (POO). Estos tipos son: byte short int long float double char boolean El segundo tipo est formado por todos los dems. Se les llama referencias porque en realidad lo que se almacena en los mismos son punteros a zonas de memoria donde se encuentran almacenadas las estructuras de datos que los soportan. Dentro de este grupo se encuentran las clases (objetos) y tambin se incluyen las interfaces, los vectores y los Strings. Pueden realizarse conversiones entre los distintos tipos de datos (incluso entre simples y referenciales), bien de forma implcita o de forma explcita. ($ Vase: B Conversin de tipos. En la pgina 273). 2.4 Tipos de datos simples. A diferencia de otros lenguajes de programacin como el C, en Java los tipos de datos simples no dependen de la plataforma ni del sistema operativo. Un entero de tipo int siempre tendr 4 bytes, por lo que no tendremos sorpresas al migrar

un programa de un sistema operativo a otro. Es ms, ni siquiera hay que volverlo a compilar. Eso s, Java no realiza una comprobacin de los rangos. Por ejemplo: si a una variable de tipo short con el valor 32.767 se le suma 1, el resultado ser -32.768 y no se producir ningn error de ejecucin. Nota: A diferencia de otros lenguajes de programacin, los Strings en Java no son un tipo simple de datos sino un objeto que se estudiar en otro punto ($ Ver punto 3.5. STRINGS. En pgina 110). Los valores de tipo String van entre comillas dobles ( Hola ), mientras que los de tipo char van entre comillas simples ( K ). Los valores que pueden asignarse a variables y que pueden ser utilizados en expresiones directamente reciben el nombre de literales. $ Vase el punto 2.11 Valores literales. En la pgina 55 para conocer cmo indicar el tipo de dato asociado a cada literal. 2.5 Tipos de datos referenciales. El resto de tipos de datos que no son simples, son considerados referenciales. Estos tipos son bsicamente las clases, en las que se basa la programacin orientada a objetos. Al declarar un objeto perteneciente a una determinada clase, se est reservando una zona de memoria8 donde se almacenarn los atributos y otros datos pertenecientes a dicho objeto. Lo que se almacena en el objeto en s, es un puntero (referencia) a dicha zona de memoria. Dentro de estos tipos pueden considerarse las interfaces, los Strings y los vectores, que son unas clases un tanto especiales, y que se vern en detalle posteriormente. 8 En realidad, el momento en el que se realiza la reserva fsica del espacio de memoria es cuando se instancia el objeto realizando la llamada a su constructor, y no en el momento de la declaracin. Existe un tipo referencial especial nominado por la palabra reservada null que puede ser asignado a cualquier variable de cualquier clase y que indica que el puntero no tiene referencia a ninguna zona de memoria (el objeto no est inicializado). Adems, todos los tipos de datos simples vistos en el punto anterior pueden ser declarados como referenciales (objetos), ya que existen clases que los engloban. 2.6 Identificadores. Los identificadores son los nombres que se les da a las variables, clases, interfaces, atributos y mtodos de un programa. Reglas para la creacin de identificadores: 1. Java hace distincin entre maysculas y minsculas, por lo tanto, nombres o identificadores como var1, Var1 y VAR1 son distintos. 2. Pueden estar formados por cualquiera de los caracteres del cdigo Unicode, por lo tanto, se pueden declarar variables con el nombre: aoDeCreacin, ram, etc. (se acab la poca de los nombres de variable como ano_de_creacion), aunque eso s, el primer carcter no puede ser un dgito numrico y no pueden utilizarse espacios en blanco ni smbolos coincidentes con operadores. 3. La longitud mxima de los identificadores es prcticamente ilimitada.

4. No puede ser una palabra reservada del lenguaje ni los valores lgicos true o false. 5. No pueden ser iguales a otra identificador declarado en el mismo mbito. 6. Por convenio, los nombres de las variables y los mtodos deberan empezar por una letra minscula y los de las clases por mayscula. Adems, si el identificador est formado por varias palabras la primera se escribe en minsculas (excepto para las clases) y el resto de palabras se hace empezar por mayscula (por ejemplo: aoDeCreacin). Estas reglas no son obligatorias, pero son convenientes ya que ayudan al proceso de codificacin de un programa, as como a su legibilidad. Es ms sencillo distinguir entre clases y mtodos o variables. Ya que el lenguaje permite identificadores todo lo largos que se desee, es aconsejable crearlos de forma que tengan sentido y faciliten su interpretacin. El nombre ideal para un identificador es aquel que no se excede en longitud (lo ms corto posible) siempre que califique claramente el concepto que intenta representar. Siempre dentro de unos lmites; por ejemplo, no sera muy adecuado utilizar un identificador de un ndice de un bucle como indiceDeTalBucle en lugar de simplemente i. Hay que evitar identificadores como a1, a2, a3, a4, va1, xc32, xc21, xsda, y en general todos aquellos identificadores que no signifiquen nada. 2.7 Declaracin de variables. La declaracin de una variable se realiza de la misma forma que en C. Siempre contiene el nombre (identificador de la variable) y el tipo de dato al que pertenece. El mbito de la variable depende de la localizacin en el programa donde es declarada. Ejemplo: int x; Las variables pueden ser inicializadas en el momento de su declaracin, siempre que el valor que se les asigne coincida con el tipo de dato de la variable.
Ejemplo: int x = 0;

2.8 mbito de una variable. El mbito de una variable es la porcin de programa donde dicha variable es visible para el cdigo del programa y, por tanto, referenciable. El mbito de una variable depende del lugar del programa donde es declarada, pudiendo pertenecer a cuatro categoras distintas. Variable local. Atributo. Parmetro de un mtodo. Parmetro de un tratador de excepciones. Como puede observarse, NO existen las variables globales. Esto no es un defecto del lenguaje sino todo lo contrario. La utilizacin de variables globales resulta peligrosa, ya que puede ser modificada en cualquier parte del programa y por cualquier procedimiento. Adems, a la hora de utilizarlas hay que buscar dnde estn declaradas para conocerlas y dnde son modificadas para evitar sorpresas en los valores que pueden contener Los mbitos de las variables u objetos en Java siguen los criterios clsicos, al igual que en la mayora de los lenguajes de programacin como Pascal, C++, etc. No existen sorpresas. Si una variable no ha sido inicializada, tiene un valor asignado por defecto. Este valor es, para las variables de tipo referencial (objetos), el valor null. Para las variables de tipo numrico, el valor por defecto es cero ( 0 ), las variables de tipo

char, el valor \u0000 y las variables de tipo boolean, el valor false. 2.8.1 Variables locales. Una variable local se declara dentro del cuerpo de un mtodo de una clase y es visible nicamente dentro de dicho mtodo. Se puede declarar en cualquier lugar del cuerpo, incluso despus de instrucciones ejecutables, aunque es una buena costumbre declararlas justo al principio. NOTA: Tambin pueden declararse variables dentro de un bloque parentizado por llaves { }. En ese caso, slo sern visibles dentro de dicho bloque. ! class Caracter { char ch; public Caracter(char c) { ch=c; } public void repetir(int num) { int i; for (i=0;i<num;i++) System.out.println(ch); } } class Ej1 { public static void main(String argumentos[]) { Caracter caracter; caracter = new Caracter('H'); caracter.repetir(20); } } En este ejemplo existe una variable local: int i; definida en el mtodo repetir de la clase Caracter, por lo tanto, nicamente es visible dentro del mtodo repetir. Tambin existe una variable local en el mtodo main. En este caso, la variable local es un objeto: Caracter caracter; que slo ser visible dentro del mtodo en el que est declarada (main). Es importante hacer notar que una declaracin como la anterior le indica al compilador el tipo de la variable caracter pero no crea un objeto. El operador que crea el objeto es new, que necesita como nico parmetro el nombre del constructor (que ser el procedimiento que asigna valor a ese objeto recin instanciado). Cuando se pretende declarar mltiples variables del mismo tipo pueden declararse, en forma de lista, separadas por comas: Ejemplo: int x,y,z; Declara tres variables x, y, z de tipo entero. Podran haberse inicializado en su declaracin de la forma: int x=0,y=0,z=3; No es necesario que se declaren al principio del mtodo. Puede hacerse en cualquier lugar del mismo, incluso de la siguiente forma: public void repetir(int num) { for (int i=0;i<num;i++) System.out.println(ch); } En el caso de las variables locales, stas no se inicializan con un valor por defecto, como se ha comentado en el punto anterior, sino que es necesario asignarles algn valor antes de poder utilizarlas en cualquier instruccin, de lo

contrario el compilador genera un error, de tal forma que es imposible hacer uso de una variable local no inicializada sin que se percate de ello el compilador. Las variables locales pueden ser antecedidas por la palabra reservada final9. En ese caso, slo permiten que se les asigne un valor una nica vez. Ejemplo: final int x=0; No permitir que a x se le asigne ningn otro valor. Siempre contendr 0. No es necesario que el valor se le asigne en el momento de la declaracin, podra haberse inicializado en cualquier otro lugar, pero una sola vez: 9 Esta posibilidad no existe en el JDK 1.02. Aparece por primera vez en la versin 1.1. Ejemplo: final int x; x=y+2; Despus de la asignacin x=y+2, no se permitir asignar ningn otro valor a x. 2.8.2 Atributos. Los atributos de una clase son las caractersticas que se van a tener en cuenta sobre un objeto y por lo tanto su mbito est circunscrito, en principio, dentro de la clase a la cual caracterizan. Se declaran de la misma forma que las variables locales pero, adems, pueden tener algunos modificadores que afectan al mbito de los mismos y que se vern en otro captulo ($ 3.3 Declaracin de atributos. Pgina 84). En el ejemplo anterior, ch es un atributo de la clase Caracter y por lo tanto es manipulable en cualquier mtodo de dicha clase, como de hecho ocurre en los mtodo repetir() y Carcter(). Para acceder a un atributo de un objeto desde algn mtodo perteneciente a otra clase u objeto se antepone el nombre del objeto y un punto al nombre de dicho atributo. Por ejemplo: caracter.ch Con los nombres de los mtodos se hace lo mismo. Ejemplo: caracter.repetir(20); 2.8.3 Parmetros de un mtodo. Los parmetros se declaran en la cabecera del mtodo de la siguiente forma: [Modificadores_de_mtodo] Tipo_devuelto Nombre_de_mtodo (lista_de_parmetros) { } La lista_de_parmetros consiste en una serie de variables, separadas por comas y declarando el tipo al que pertenecen. Ejemplo: public static void miMtodo(int v1, int v2, float v3, String v4, ClaseObjeto v5); Ntese que aunque existan varios parmetros pertenecientes al mismo tipo o clase, no pueden declararse abreviadamente, como ocurre con las variables locales y los atributos, indicando el tipo y a continuacin la lista de parmetros separados por comas. As, es ilegal la siguiente declaracin del mtodo anterior: public static void miMtodo(int v1, v2, float v3, String v4, ClaseObjeto v5); (ILEGAL) La declaracin de un parmetro puede ir antecedida, como ocurre con las variables locales, por la palabra reservada final. En ese caso, el valor de dicho parmetro no podr ser modificado en el cuerpo del mtodo. Los parmetros de un mtodo pueden ser de dos tipos:

Variables de tipo simple de datos: En este caso, el paso de parmetros se realiza siempre por valor. Es decir, el valor del parmetro de llamada no puede ser modificado en el cuerpo del mtodo (El mtodo trabaja con una copia del valor utilizado en la llamada). Variables de tipo objeto (referencias): En este caso, lo que realmente se pasa al mtodo es un puntero al objeto y, por lo tanto, el valor del parmetro de llamada s que puede ser modificado dentro del mtodo (El mtodo trabaja directamente con el valor utilizado en la llamada), a no ser que se anteponga la palabra reservada final.. class Objeto { int variable; public Objeto(int var){ variable=var; } } class Parametros { public static void main (String argumentos[]) { int var1; Objeto obj; obj = new Objeto(1); var1 = 2; System.out.println("Valor del objeto = "+obj.variable); System.out.println("Valor de la variable = "+var1); modifica(var1,obj); System.out.println("-Despus de llamar a modifica()-"); System.out.println("Valor del objeto = "+obj.variable); System.out.println("Valor de la variable = "+var1); } static void modifica (int vv, Objeto oo) { vv++; oo.variable++; } } La salida del programa sera la siguiente: Valor del objeto = 1 Valor de la variable = 2 -Despus de llamar a modifica()Valor del objeto = 2 Valor de la variable = 2 Como puede verse, despus de la llamada, el valor del objeto obj s ha sido modificado (se ha realizado un pase de parmetro por referencia), mientras que el valor de la variable var1 no ha sido modificado (se ha realizado un paso de parmetro por valor). 2.9 Operadores. Los operadores son partes indispensables en la construccin de expresiones. Existen muchas definiciones tcnicas para el trmino expresin. Puede decirse que una expresin es una combinacin de operandos ligados mediante operadores. Los operandos pueden ser variables, constantes, funciones, literales, etc. y los operadores todos los enumerados en este punto. 2.9.1 Operadores aritmticos:

El operador - puede utilizarse en su versin unaria ( - op1 ) y la operacin que realiza es la de invertir el signo del operando. Como en C, los operadores unarios ++ y -- realizan un incremento y un decremento respectivamente. Estos operadores admiten notacin prefija y postfija. ++op1: En primer lugar realiza un incremento (en una unidad) de op1 y despus ejecuta la instruccin en la cual est inmerso. op1++: En primer lugar ejecuta la instruccin en la cual est inmerso y despus realiza un incremento (en una unidad) de op1. --op1: En primer lugar realiza un decremento (en una unidad) de op1 y despus ejecuta la instruccin en la cul est inmerso. op1--: En primer lugar ejecuta la instruccin en la cual est inmerso y despus realiza un decremento (en una unidad) de op1. La diferencia entre la notacin prefija y la postfija no tiene importancia en expresiones en las que nicamente existe dicha operacin: ++contador; es equivalente a: contador++; --contador; contador--; Es importante no emplear estos operadores en expresiones que contengan ms de una referencia a la variable incrementada, puesto que esta prctica puede generar resultados errneos fcilmente. La diferencia es apreciable en instrucciones en las cules estn incluidas otras operaciones. Por ejemplo: cont = 1; cont = 1; do { do { } } while ( cont++ < 3 ); while ( ++cont < 3 ); En el primer caso, el bucle se ejecutar 3 veces, mientras que en el segundo se ejecutar 2 veces. Otro ejemplo: a = 1; a = 1; b = 2 + a++; b = 2 + ++a; En el primer caso, despus de las operaciones, b tendr el valor 3 y a el valor 2. En el segundo caso, despus de las operaciones, b tendr el valor 4 y a el valor 2. Los operadores relacionales actan sobre valores enteros, reales y caracteres (char); y devuelven un valor del tipo boolean (true o false). ! class Relacional { public static void main(String arg[]) { double op1,op2; op1=1.34; op2=1.35; System.out.println("op1="+op1+" op2="+op2); System.out.println("op1>op2 = "+(op1>op2)); System.out.println("op1<op2 = "+(op1<op2)); System.out.println("op1==op2 = "+(op1==op2)); System.out.println("op1!=op2 = "+(op1!=op2)); char op3,op4; op3='a'; op4='b'; System.out.println("'a'>'b' = "+(op3>op4)); }

} Salida por pantalla: op1=1.34 op2=1.35 op1>op2 = false op1<op2 = true op1==op2 = false op1!=op2 = true 'a'>'b' = false Nota: Los operadores == y != actan tambin sobre valores lgicos (boolean). Estos operadores actan sobre operadores o expresiones lgicas, es decir, aquellos que se evalan a cierto o falso (true / false). Por ejemplo, el siguiente programa: ! class Bool { public static void main ( String argumentos[] ) { boolean a=true boolean b=true; boolean c=false; boolean d=false; System.out.println("true Y true = " + (a && b) ); System.out.println("true Y false = " + (a && c) ); System.out.println("false Y false = " + (c && d) ); System.out.println("true O true = " + (a || b) ); System.out.println("true O false = " + (a || c) ); System.out.println("false O false = " + (c || d) ); System.out.println("NO true = " + !a); System.out.println("NO false = " + !c); System.out.println("(3 > 4) Y true = " + ((3 >4) && a) ); } } producira la siguiente salida por pantalla: true Y true = true true Y false = false false Y false = false true O true = true true O false = true false O false = false NO true = false NO false = true (3 > 4) Y true = false 2.9.5 Operadores de asignacin: El operador de asignacin es el smbolo igual ( = ). op1 = Expresin Asigna el resultado de evaluar la expresin de la derecha a op1. Adems del operador de asignacin existen unas abreviaturas cuando el operando que aparece a la izquierda del smbolo de asignacin tambin aparece a la derecha del mismo: 10 Los nmeros negativos se almacenan en Complemento a dos (c-2), lo que significa que para almacenar el nmero negativo se toma el positivo en binario, se cambian unos por ceros y viceversa, y despus se le suma 1 en binario. 2.9.6 Precedencia de operadores en Java: Operadores postfijos [] . (parntesis)

Operadores unarios ++expr --expr -expr ~ ! Creacin o conversin de tipo new (tipo)expr Multiplicacin y divisin * / % Suma y resta + Desplazamiento de bits << >> >>> Relacionales < > <= >= Igualdad y desigualdad == != AND a nivel de bits & XOR a nivel de bits ^ OR a nivel de bits | AND lgico && OR lgico || Condicional al estilo C ? : Asignacin = += -= *= /= %= ^= &= |= >>= <<= >>>= 2.10 Constantes. Las constantes en Java son declaradas como atributos de tipo final. ($ Ver el punto: 3.3.2 Atributos final. En pgina 86). 2.11 Valores literales. A la hora de tratar con valores de los tipos de datos simples (y Strings) se utiliza lo que se denomina literales. Los literales son elementos que sirven para representar un valor en el cdigo fuente del programa. En Java existen literales para los siguientes tipos de datos: Lgicos (boolean). Carcter (char). Enteros (byte, short, int y long). Reales (double y float). Cadenas de caracteres (String). Literales lgicos Son nicamente dos: las palabras reservadas true y false. Ejemplo: boolean activado = false; Literales de tipo entero. Los literales de tipo entero: byte, short, int y long pueden expresarse en decimal (base 10), octal (base 8) o hexadecimal (base 16). Adems, puede aadirse al final del mismo la letra L para indicar que el entero es considerado como long (64 bits). Enteros en el sistema decimal (base 10): En Java, el compilador identifica un entero decimal (base 10) al encontrar un nmero cuyo primer dgito es cualquier smbolo decimal excepto el cero (del 1 al 9). A continuacin pueden aparecer dgitos del 0 al 9. Enteros en el sistema octal (base 8): Un nmero ser considerado por el compilador como octal siempre que el primer dgito sea el cero. A continuacin del cero puede aparecer cualquier dgito numrico comprendido entre 0 y 7. Si aparece un 8 9, se generar un error por el compilador. Enteros en el sistema hexadecimal (base 16): Un nmero en hexadecimal empieza por cero seguido de la letra x (mayscula o minscula). A continuacin puede aparecer cualquier dgito numrico comprendido entre 0 y 9 las letras A,B,C,D,E F, siendo indiferente el que las letras se encuentren en maysculas o minsculas. Literales de tipo real. Los literales de tipo real sirven para indicar valores float o double. A diferencia de los literales de tipo entero, no pueden expresarse en octal o hexadecimal. Existen dos formatos de representacin: mediante su parte entera, el punto decimal ( . ) y la parte fraccionaria; o mediante notacin exponencial o cientfica:

Ejemplos equivalentes: 3.1415 0.31415e1 .31415e1 0.031415E+2 .031415e2 314.15e-2 31415E-4 Al igual que los literales que representan enteros, se puede poner una letra como sufijo. Esta letra puede ser una F o una D (mayscula o minscula indistintamente). F Trata el literal como de tipo float. D Trata el literal como de tipo double. Literales de tipo carcter Los literales de tipo carcter se representan siempre entre comillas simples. Entre las comillas simples puede aparecer: Un smbolo (letra) siempre que el carcter est asociado a un cdigo Unicode. Ejemplos: a , B , { , , . Una secuencia de escape. Las secuencias de escape son combinaciones del smbolo contrabarra \ seguido de una letra, y sirven para representar caracteres que no tienen una equivalencia en forma de smbolo. Siempre que sea posible, es aconsejable utilizar las secuencias de escape en lugar del cdigo Unicode (en octal o hexadecimal), ya que el precompilador de Java sustituye los cdigos Unicode por su valor y si se ha utilizado, por ejemplo, el cdigo Unicode equivalente al cambio de lnea, puede interpretarse como tal y producir un error al creer que se abren comillas y se cierran en la lnea siguiente del fichero. Literales de tipo String. Los Strings o cadenas de caracteres no forman parte de los tipos de datos elementales en Java, sino que son instanciados a partir de la clase java.lang.String, pero aceptan su inicializacin a partir de literales de este tipo, por lo que se tratan en este punto. Un literal de tipo string va encerrado entre comillas dobles ( ) y debe estar incluido completamente en una sola lnea del programa fuente (no puede dividirse en varias lneas). Entre las comillas dobles puede incluirse cualquier carcter del cdigo Unicode (o su cdigo precedido del carcter \ ) adems de las secuencias de escape vistas anteriormente en los literales de tipo carcter. As, por ejemplo, para incluir un cambio de lnea dentro de un literal de tipo string deber hacerse mediante la secuencia de escape \n : Ejemplo: System.out.println(Primera lnea\nSegunda lnea del string\n); System.out.println(Hol\u0061); La visualizacin del string anterior mediante println() producira la siguiente salida por pantalla: Primera lnea Segunda lnea del string Hola La forma de incluir los caracteres: comillas dobles ( ) y contrabarra ( \ ) es mediante las secuencias de escape \ y \\ respectivamente (o mediante su cdigo Unicode precedido de \ ). Si el string es demasiado largo y debe dividirse en varias lneas en el fichero fuente, puede utilizarse el operador de concatenacin de strings + .de la siguiente forma: Este String es demasiado largo para estar en una lnea del + fichero fuente y se ha dividido en dos.

2.12 Estructuras de control. Las estructuras de control son construcciones hechas a partir de palabras reservadas del lenguaje que permiten modificar el flujo de ejecucin de un programa. De este modo, pueden crearse construcciones de alternativas y bucles de repeticin de bloques de instrucciones. Hay que sealar que un bloque de instrucciones se encontrar encerrado mediante llaves {..} si existe ms de una instruccin. 2.12.1 Estructuras alternativas. Las estructuras alternativas son construcciones que permiten alterar el flujo secuencial de un programa, de forma que en funcin de una condicin o el valor de una expresin, el mismo pueda ser desviado en una u otra alternativa de cdigo. Las estructuras alternativas disponibles en Java son: Alternativa if-else. Alternativa switch. 2.12.1.1 if-else. Forma simple: if (expresin) Bloque instrucciones El bloque de instrucciones se ejecuta si, y slo si, la expresin (que debe ser lgica) se evala a true, es decir, se cumple una determinada condicin. ! if (cont == 0) System.out.println(he llegado a cero); La instruccin System.out.println(he llegado a cero); slo se ejecuta en el caso de que cont contenga el valor cero. Con clusula else: if (expresin) Bloque instrucciones 1 else Bloque instrucciones 2 El bloque de instrucciones 1 se ejecuta si, y slo si, la expresin se evala a true. Y en caso contrario, si la expresin se evala a false, se ejecuta el bloque de instrucciones 2. ! if (cont == 0) System.out.println(he llegado a cero); else System.out.println(no he llegado a cero); Si cont vale cero, se mostrar en el mensaje he llegado a cero. Si cont contiene cualquier otro valor distinto de cero, se mostrar el mensaje no he llegado a cero. if-else anidados: En muchas ocasiones, se anidan estructuras alternativas if-else, de forma que se pregunte por una condicin si anteriormente no se ha cumplido otra sucesivamente. Por ejemplo: supongamos que realizamos un programa que muestra la nota de un alumno en la forma (insuficiente, suficiente, bien, notable o sobresaliente) en funcin de su nota numrica. Podra codificarse de la siguiente forma: ! class Nota { public static void main (String argumentos[]) { int nota;

if (argumentos.length<1) { // argumentos.length contiene el nmero de elementos // del array argumentos, que contiene los parmetros // suministrados en la lnea de comandos. System.out.println("Uso: Nota num"); System.out.println("Donde num = n entre 0 y 10"); } else { nota=Integer.valueOf(argumentos[0]).intValue(); // la instruccin anterior convierte un // String a entero. if (nota<5) System.out.println("Insuficiente"); else if (nota<6) System.out.println("Suficiente"); else if (nota<7) System.out.println("Bien"); else if (nota<9) System.out.println("Notable"); else System.out.println("Sobresaliente"); } } } En Java, como en C y a diferencia de otros lenguajes de programacin, en el caso de que el bloque de instrucciones conste de una sola instruccin (no necesita ser parentizado), se pone un punto y coma ( ; ) justo antes de la clusula else. 2.12.1.2 switch. Forma simple: switch (expresin) { case valor1: instrucciones1; case valor2: instrucciones2; case valorN: instruccionesN; } En este caso, a diferencia del anterior, si instrucciones1 instrucciones2 instruccionesN estn formados por un bloque de instrucciones sencillas, no es necesario parentizarlas mediante las llaves ( { } ). En primer lugar se evala la expresin cuyo resultado puede ser un valor de cualquier tipo. El programa comprueba el primer valor (valor1). En el caso de que el valor resultado de la expresin coincida con valor1, se jecutaran las instrucciones1. Pero ojo! Tambin se ejecutaran las instrucciones instrucciones2 .. instruccionesN hasta encontrarse con la palabra reservada break. Si el resultado de la expresin no coincide con valor1, evidentemente no se ejecutaran instrucciones1, se comprobara la coincidencia con valor2 y as sucesivamente

hasta encontrar un valor que coincida o llegar al final de la construccin switch. En caso de que no exista ningn valor que coincida con el de la expresin, no se ejecuta ninguna accin. Si lo que se desea es que nicamente se ejecuten las instrucciones asociadas a cada valor y no todas las de los dems case que quedan por debajo, la construccin switch sera la siguiente: switch (expresin) { case valor1: instrucciones1; break; case valor2: instrucciones2; break; case valorN: instruccionesN; } ! class DiaSemana { public static void main(String argumentos[]) { int da; if (argumentos.length<1) { System.out.println("Uso: DiaSemana num"); System.out.println("Donde num = n entre 1 y 7"); } else { da=Integer.valueOf(argumentos[0]).intValue(); switch (da) { case 1: System.out.println("Lunes"); break; case 2: System.out.println("Martes"); break; case 3: System.out.println("Mircoles"); break; case 4: System.out.println("Jueves"); break; case 5: System.out.println("Viernes"); break; case 6: System.out.println("Sbado"); break; case 7: System.out.println("Domingo"); } } } } Ntese que en el caso de que se introduzca un valor no comprendido entre 1 y 7, no se realizar ninguna accin. Esto puede corregirse utilizando el siguiente formato: Con clusula por defecto: switch (expresin) { case valor1: instrucciones1; case valor2: instrucciones2; case valorN: instruccionesN; default: instruccionesPorDefecto; }

En este caso, instruccionesPorDefecto se ejecutarn en el caso de que ningn valor case coincida con el valor de expresin. O en caso de ejecutar algunas instrucciones en alguno de los case, que no haya ninguna instruccin break desde ese punto hasta la clusula default. ! class DiasMes { public static void main(String argumentos []) { int mes; if (argumentos.length<1) { System.out.println("Uso: DiasMes num"); System.out.println("Donde num = n del mes"); } else { mes=Integer.valueOf(argumentos[0]).intValue(); switch (mes) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: System.out.println("El mes "+mes + " Tiene 31 das"); break; case 4: case 6: case 9: case 11: System.out.println("El mes "+mes + " Tiene 30 das"); break; case 2: System.out.println("El mes "+mes + " Tiene 28 29 das"); break; default: System.out.println("El mes "+mes + " no existe"); } } } } En este ejemplo, nicamente se ejecutar la clusula default en el caso en que el valor de mes sea distinto a un nmero comprendido entre 1 y 12, ya que todas estas posibilidades se encuentran contempladas en las respectivas clusulas case y, adems, existe un break justo antes de la clusula default, por lo que en ningn otro caso se ejecutar la misma. 2.12.2 Bucles. Los bucles son estructuras de repeticin. Bloques de instrucciones que se repiten un nmero de veces mientras se cumpla una condicin o hasta que se cumpla una condicin. Existen tres construcciones para estas estructuras de repeticin: Bucle for. Bucle do-while.

Bucle while. Como regla general puede decirse que se utilizar el bucle for cuando se conozca de antemano el nmero exacto de veces que ha de repetirse un determinado bloque de instrucciones. Se utilizar el bucle do-while cuando no se conoce exactamente el nmero de veces que se ejecutar el bucle pero se sabe que por lo menos se ha de ejecutar una. Se utilizar el bucle while-do cuando es posible que no deba ejecutarse ninguna vez. Estas reglas son generales y algunos programadores se sienten ms cmodos utilizando principalmente una de ellas. Con mayor o menor esfuerzo, puede utilizarse cualquiera de ellas indistintamente. 2.12.2.1 Bucle for. for (inicializacin ; condicin ; incremento) bloque instrucciones La clusula inicializacin es una instruccin que se ejecuta una sola vez al inicio del bucle, normalmente para inicializar un contador. La clusula condicin es una expresin lgica, que se evala al inicio de cada nueva iteracin del bucle. En el momento en que dicha expresin se evale a false, se dejar de ejecutar el bucle y el control del programa pasar a la siguiente instruccin (a continuacin del bucle for). La clusula incremento es una instruccin que se ejecuta en cada iteracin del bucle como si fuera la ltima instruccin dentro del bloque de instrucciones. Generalmente se trata de una instruccin de incremento o decremento de alguna variable. Cualquiera de estas tres clusulas puede estar vaca, aunque SIEMPRE hay que poner los puntos y coma ( ; ). El siguiente programa muestra en pantalla la serie de Fibonacci11 hasta el trmino que se indique al programa como argumento en la lnea de comandos. (NOTA: siempre se mostrarn, por lo menos, los dos primeros trminos). ! class Fibonacci { public static void main(String argumentos[]) { int numTerm,v1=1,v2=1,aux,cont; if (argumentos.length<1) { System.out.println("Uso: Fibonacci num"); System.out.println("Donde num = n de trminos"); } else { numTerm=Integer.valueOf(argumentos[0]).intValue(); System.out.print("1,1"); for (cont=2;cont<numTerm;cont++) { aux=v2; v2+=v1; v1=aux; System.out.print(","+v2); } System.out.println(); } } } 2.12.2.2 Bucle do-while. do bloque instrucciones while (Expresin);

En este tipo de bucle, bloque instrucciones se ejecuta siempre una vez por lo menos, y ese bloque de instrucciones se ejecutar mientras Expresin se evale a true. Por lo tanto, entre las instrucciones que se repiten deber existir alguna que, en algn momento, haga que la Expresin se evale a false, de lo contrario el bucle sera infinito. Ejemplo: El mismo que antes (Fibonacci). ! class Fibonacci2 { public static void main(String argumentos[]) { int numTerm,v1=0,v2=1,aux,cont=1; if (argumentos.length<1) { System.out.println("Uso: Fibonacci num"); System.out.println("Donde num = n de trminos"); } else { numTerm=Integer.valueOf(argumentos[0]).intValue(); System.out.print("1"); do { aux=v2; v2+=v1; v1=aux; System.out.print(","+v2); } while (++cont<numTerm); System.out.println(); } } } En este caso nicamente se muestra el primer trmino de la serie antes de iniciar el bucle, ya que el segundo siempre se mostrar, porque el bucle do-while siempre se ejecuta una vez por lo menos. 2.12.2.3 Bucle while. while (Expresin) bloque instrucciones Al igual que en el bucle do-while del apartado anterior, el bloque de instrucciones se ejecuta mientras se cumple una condicin (mientras Expresin se evale a true), pero en este caso, la condicin se comprueba ANTES de empezar a ejecutar por primera vez el bucle, por lo que si Expresin se evala a false en la primera iteracin, entonces el bloque de instrucciones no se ejecutar ninguna vez. Ejemplo: Fibonacci: ! class Fibonacci3 { public static void main(String argumentos[]) { int numTerm,v1=1,v2=1,aux,cont=2; if (argumentos.length<1) { System.out.println("Uso: Fibonacci num"); System.out.println("Donde num = n de trminos"); } else { numTerm=Integer.valueOf(argumentos[0]).intValue(); System.out.print("1,1"); while (cont++<numTerm) { aux=v2; v2+=v1; v1=aux;

System.out.print(","+v2); } System.out.println(); } } } Como puede comprobarse, las tres construcciones de bucle (for, do-while y while) pueden utilizarse indistintamente realizando unas pequeas variaciones en el programa. 2.12.3 Saltos. En Java existen dos formas de realizar un salto incondicional en el flujo normal de un programa. A saber, las instrucciones break y continue. 2.12.3.1 break. La instruccin break sirve para abandonar una estructura de control, tanto de las alternativas (if-else y switch) como de las repetitivas o bucles (for, dowhile y while). En el momento que se ejecuta la instruccin break, el control del programa sale de la estructura en la que se encuentra. ! class Break { public static void main(String argumentos[]) { int i; for (i=1; i<=4; i++) { if (i==3) break; System.out.println("Itereacin: "+i); } } } Este ejemplo producira la siguiente salida por pantalla: Iteracin: 1 Iteracin: 2 Aunque el bucle, en principio indica que se ejecute 4 veces, en la tercera iteracin, i contiene el valor 3, se cumple la condicin del if (i==3) y por lo tanto se ejecuta el break y se sale del bucle for. 2.12.3.2 continue. La instruccin continue sirve para transferir el control del programa desde la instruccin continue directamente a la cabecera del bucle (for, do-while o while) donde se encuentra. ! class Continue { public static void main(String argumentos[]) { int i; for (i=1; i<=4; i++) { if (i==3) continue; System.out.println("Itereacin: "+i); } } } Este programa es muy similar al anterior, pero en lugar de utilizar la instruccin break, se ha utilizado continue. El resultado es el siguiente: Iteracin: 1 Iteracin: 2 Iteracin: 4 Puede comprobarse la diferencia con respecto al resultado del ejemplo del

apartado anterior. En este caso no se abandona el bucle, sino que se transfiere el control a la cabecera del bucle donde se contina con la siguiente iteracin. Tanto el salto break como en el salto continue, pueden ser evitados mediante distintas construcciones pero en ocasiones esto puede empeorar la legibilidad del cdigo. De todas formas existen programadores que odian este tipo de saltos y no los utilizan en ningn caso. 2.13 Vectores. Para manejar colecciones de objetos del mismo tipo estructurados en una sola variable se utilizan los vectores. En Java, los vectores son en realidad objetos y por lo tanto se puede llamar a sus mtodos (como se ver en el captulo siguiente). Existen dos formas equivalentes de declarar vectores en Java: 1) tipo nombreDelVector[ ]; 2) tipo[ ] nombreDelVector; Ejemplo: int vector1[], vector2[], entero; //entero no es un vector int[] otroVector; Tambin pueden utilizarse vectores de ms de una dimensin: 12 Tambin llamados arrays, matrices o tablas. Ejemplo: int matriz[][]; int[][] otraMatriz; Los vectores, al igual que las dems variables pueden ser inicializados en el momento de su declaracin. En este caso, no es necesario especificar el nmero de elementos mximo reservado Se reserva el espacio justo para almacenar los elementos aadidos en la declaracin. Ejemplo: String Das[]={Lunes,Martes,Mircoles,Jueves, Viernes,Sbado,Domingo}; Una simple declaracin de un vector no reserva espacio en memoria, a excepcin del caso anterior, en el que sus elementos obtienen la memoria necesaria para ser almacenados. Para reservar la memoria hay que llamar explcitamente a un constructor new 13 de la siguiente forma: new tipoElemento[ numElementos] ; Ejemplo: int matriz[][]; matriz = new int[4][7]; Tambin se puede indicar el nmero de elementos durante su declaracin: Ejemplo: int vector[] = new int[5]; 13 $ Vase punto En la pgina 106. Visin General y elementos bsicos del lenguaje. 74 Para hacer referencia a los elementos particulares del vector, se utiliza el identificador del vector junto con el ndice del elemento entre corchetes. El ndice del primer elemento es el cero ( 0 ) y el del ltimo, el nmero de elementos menos uno. Ejemplo: j = vector[0]; vector[4] = matriz[2][3];14 El intento de acceder a un elemento fuera del rango de la matriz, a diferencia de lo que ocurre en C, provoca una excepcin (error) que, de no ser manejado por el programa, ser el compilador quien aborte la operacin. Para obtener el nmero de elementos de un vector en tiempo de ejecucin se

accede al atributo de la clase vector length. No olvidemos que los vectores en Java son tratados como un objeto. ! class Array1 { public static void main (String argumentos[]) { String colores[] = {"Rojo","Verde","Azul", "Amarillo","Negro"}; int i; for (i=0;i<colores.length;i++) System.out.println(colores[i]); } } El ejemplo anterior produce la siguiente salida por pantalla: Rojo Verde Azul Amarillo Negro Para acceder a un elemento en un vector multidimensional, a diferencia de otros lenguajes, los ndices van entre corchetes por separado y NO de la forma: matriz[2,3] Veamos otro ejemplo que calcula la letra del NIF15 a partir de un DNI que se suministra al programa en la lnea de comandos: ! class LetraNif { public static void main(String argumentos[]) { int dni; char tabla[]={'T','R','W','A','G','M','Y','F','P', 'D','X','B','N','J','Z','S','Q','V', 'H','L','C','K','E'}; if (argumentos.length<1) System.out.println("Uso: LetraNif dni"); else { dni=Integer.valueOf(argumentos[0]).intValue(); System.out.println(dni+"-"+tabla[dni%23]); } } } La ejecucin siguiente: java LetraNif 123456789 Produce la salida por pantalla: 123456789-B NOTA: Los Strings o cadenas de caracteres en Java son objetos pertenecientes a las clases String o StringBuffer y no vectores de tipo char. 15 La letra de un NIF se puede averiguar de la siguiente forma: Se calcula el resto de dividir el DNI entre 23. Si el resto es cero, la letra del NIF es la T; si el resto es 1, la letra es la R; 2 W, 3 A y as sucesivamente conforme a una tabla que se encuentra declarada en forma de vector en el ejemplo. 2.14 CUESTIONES 1. Cmo se denominan las variables que se declaran fuera de una clase? 2. Cul es la diferencia entre los conceptos atributo y mtodo de una clase? 3. Cul es el nombre del mtodo que debemos incluir en alguna clase para que el programa generado sea ejecutable?

4. Qu diferencias crees que existen entre los tipos de datos bsicos y los referenciales? 5. Con qu carcter no pueden comenzar los nombres de variables (o de mtodos? Cul es la recomendacin en Java para los nombres de atributos y mtodos respecto del uso de letras maysculas y minsculas? 6. Si deseas realizar un bucle que se ejecutar un nmero conocido de veces. Qu construccin del lenguaje emplears? Y si desconoces el nmero de veces? 7. Cul es la diferencia entre las instrucciones break y continue? 8. Qu cdigo de representacin emplea Java para los caracteres? 9. Cmo se pasan los parmetros de tipos bsicos a un mtodo, por valor o por referencia?

Você também pode gostar