You are on page 1of 37

Caractersticas de Java Anterior | Siguiente Las caractersticas principales que nos ofrece Java respecto a cualquier otro lenguaje

de programacin, seran: Simple Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las caractersticas menos usadas y ms confusas de stos. C++ no es un lenguaje conveniente por razones de seguridad, pero C y C++ son los 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 de baja prioridad, cuando entra en accin, permite liberar bloques de memoria muy grandes, lo que limita en mucho 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. 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 de 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. 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. 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. 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 empleado en el desarrollo de aplicaciones Java. Adems, para asegurar el funcionamiento de la aplicacin, realiza una verificacin de los ByteCodes, 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 ByteCodes

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 (ByteCode) 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 imagen 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 permitiran acceder directamente al hardware de la mquina. Adems, siempre 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:

Swing : Mejora de las herramientas para la implementacin de interfaces de usuario 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

La siguiente figura ilustra la situacin en que se encuentra Java cuando se ejecuta sobre un sistema operativo convencional. En la imagen se observa que si se excepta la parte correspondiente al Sistema Operativo que ataca directamente al hardware de la plataforma, el resto est totalmente programado por Javasoft o por los programadores Java, teniendo en cuenta que HotJava es una aplicacin en toda regla, al tratarse de un navegador y estar desarrollado en su totalidad en Java. Cualquier programador podra utilizar las mismas herramientas para levantar un nuevo desarrollo en Java, bien fuesen applets para su implantacin en Internet o aplicaciones para su uso individual.

Y la imagen que aparece a continuacin muestra la arquitectura de Java sin un Sistema Operativo que lo ampare, de tal forma que el kernel tendra que proporcionar suficientes posibilidades como para implementar una Mquina Virtual Java y los drivers de dispositivos imprescindibles como pantalla, red, ratn, teclado y la base para poder desarrollar en Java libreras como AWT, ficheros, red, etc. Con todo ello estara asegurado el soporte completo del API de Java, quedando en mano de los desarrolladores la implementacin de aplicaciones o applets o cualquier otra librera.

Seguro La seguridad en Java tiene dos facetas. En el lenguaje, caractersticas como los punteros o el casting

implcito que hace el compilador 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: %s\n",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 presentando 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 ByteCode 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 ByteCodes pasan la verificacin si 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 o 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 en que se interpreta, con el nivel de detalle y de privilegio que sea necesario. Con cdigo compilado no sera posible establecer estos niveles de seguridad entre dos objetos pertenecientes al mismo proceso, porque al compartr un nico espacio de direcciones, el cdigo de uno podra acceder tranquilamente a cualquier direccin del otro. 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, el propio JDK proporciona un desemsamblador de ByteCode, lo cual hace 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. Es otra de las cuestiones que Java tiene pendientes. 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. 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 ByteCode 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 runtime, que s es completamente dependiente de la mquina y del sistema operativo que interpreta dinmicamente el ByteCode 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 runtime correspondiente al sistema operativo utilizado. No obstante, este panorama est cambiando a pasos agigantados, y aunque Java sigue siendo bsicamente un lenguaje interpretado, la situacin se acerca mucho a la de los programas compilados, sobre todo en lo que a la rapidez en la ejecucin del cdigo se refiere. Para comprender el funcionamiento de HotSpot, que es el ltimo lanzamiento que hace Sun y que promete interpretar los ByteCodes ms rpido que un programa compilado, las siguientes imgenes muestran cmo acta el sistema runtime en los diversos casos que hasta ahora pueden darse. La imagen de la izquierda muestra las acciones correspondientes a un compilador tradicional. El compilador traslada las sentencias escritas en lenguaje de alto-nivel a mltiples instrucciones, que luego son enlazadas junto con el resultado de mltiples compilaciones previas que han dado origen a libreras, y juntando todo ello, es cuando genera un programa ejecutable.

La imagen de la derecha muestra la forma de actuacin de un intrprete. Bsicamente es un enorme bucle, en el cual se va leyendo o recogiendo cada una de las instrucciones del programa fuente que se desea ejecutar, se analiza, se parte en trozos y se ejecuta. Luego se va a recoger la siguiente instruccin que se debe interpretar y se contina con este proceso hasta que se terminan las instrucciones o hasta que entre las instrucciones hay alguna que contiene la orden de detener la ejecucin de las instrucciones que componen el programa fuente.

La imagen siguiente, situada a la izquierda, muestra un tipo de intrprete ms eficiente que el anterior, el intrprete de ByteCodes, que fue popularizado hace ms de veinte aos por la Universidad de California al crear el UCSD Pascal. En este caso, el intrprete trabaja sobre instrucciones que ya han sido trasladadas a un cdigo intermedio en un paso anterior. As, aunque se ejecute en un bucle , se elimina la necesidad de analizar cada una de las instrucciones que componen el programa fuente, porque ya lo han sido en el paso previo. Este es el sistema que Java utiliza, y la Mquina Virtual Java es un ejemplo de este tipo de intrprete. No obstante, sigue siendo lento, aunque se obtenga un cdigo independiente de plataforma muy compacto, que puede ser ejecutado en cualquier ordenador que disponga de una mquina virtual capaz de interpretar los ByteCodes trasladados.

Un paso adelante en el rendimiento del cdigo Java lo han representado los compiladores Just-In-Time, que compilan el cdigo convirtindolo a cdigo mquina antes de ejecutarlo. Es decir, un compilador JIT va trasladando los ByteCodes al cdigo mquina de la plataforma segn los va leyendo, realizando un cierto grado de optimizacin. El resultado es que cuando el programa se ejecute, habr partes que no se ejecuten y que no sern compiladas, y el compilador JIT no perder el tiempo en optimizar cdigo que nunca se va a ejecutar. No obstante, los compiladores JIT no pueden realizar demasiadas optimizaciones, ya que hay cdigo que ellos no ven, as que aunque siempre son capaces de optimizar la parte de cdigo de inicializacin de un programa, hay otras partes que deben ser optimizadas, segn se van cargando, con lo cual, hay una cierta cantidad de tiempo que inevitablemente ha de perderse. Y, finalmente, se presenta la ltima tendencia en lo que a compilacin e intrpretes se refiere. Lo ltimo en que trabaja Sun es HotSpot, una herramienta que incluye un compilador dinmico y una mquina virtual para interpretar los ByteCodes, tal como se muestra en la figura siguiente, situada a la izquierda de la pgina. Cuando se cargan los ByteCodes producidos por el compilador por primera vez, stos son interpretados en la mquina virtual. Cuando ya estn en ejecucin, el profiler mantiene informacin sobre el rendimiento y selecciona el mtodo sobre el que se va a realizar la compilacin. Los mtodos ya compilados se almacenan en un cach en cdigo mquina nativo. Cuando un mtodo es invocado, esta versin en cdigo mquina nativo es la que se utiliza, en caso de que exista; en caso contrario, los ByteCodes son reinterpretados. La funcin control que muestra el diagrama es como un salto indirecto a travs de la memoria que apunta tanto al cdigo mquina como al interpretado, aunque Sun no ha proporcionado muchos detalles sobre este extremo. Multihilo Al ser MultiHilo ( o multihilvanado, mala traduccin de multithreaded), Java permite muchas actividades simultneas en un programa. Los hilos -a veces llamados, procesos ligeros, o hilos de ejecucin- son bsicamente pequeos procesos o piezas independientes de un gran proceso. Al estar estos hilos construidos en el mismo lenguaje, son ms fciles de usar y ms robustos que sus

homlogos en C o C++. El beneficio de ser multihilo 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.) de la plataforma, an supera a los entornos de flujo nico de programa (single-threaded) 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 de un sitio interesante desde la red. En Java, las imgenes se pueden ir trayendo en un hilo de ejecucin independiente, permitiendo que el usuario pueda acceder a la informacin de la pgina sin tener que esperar por el navegador. Dinmico 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 mismo tiempo de ejecucin. Las librera nuevas o actualizadas no paralizarn la ejecucin de 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 cualquier pieza que el sistema necesite para funcionar.

Java, para evitar que los mdulos de ByteCode o los objetos o nuevas clases, no haya que estar trayndolas de la red cada vez que se necesiten, implementa las opciones de persistencia, para que no se eliminen cuando de limpie la cach de la mquina.

Y, para que el lector tenga idea de qu es lo que se mueve alrededor de Java, no hay mejor explicacin que la descripcin de los APIs que componen la plataforma Java, aunque no todas las que aqu se citan estn disponibles para su uso, ya que algunas se encuentran en fase de desarrollo, otras en fase de discusin pblica para aporte de ideas y otras en fase beta.
Java Enterprise JDBC API Java RMI Java IDL JNDI JavaBeans JAF Conjunto de especificaciones para entornos corporativos Java Database Connectivity, para permitir a aplicaciones o applets acceder a bases de datos de forma homognea va consultas SQL emote !ethod "nvocation, invocac#n remota de mtodos para aplicaciones distribuidas $uente de compatibilidad con el modelo est%ndar de objetos C& '( Java )aming and Directory "nterface, proporciona servicios de directorio y locali*aci#n de recursos en un entorno corporativo +specificaci#n de componentes basados en Java Java'eans (ctivation ,rame-or., entorno para determinar el tipo de datos, encapsular el acceso a ellos, descubrir las acciones /ue se les pueden aplicar e instanciar el componente Java'ean adecuado ($" para componentes /ue necesitan encriptaci#n, certificaci#n, firmas digitales y autentificaci#n Java ,oundation Classes, jerar/ua de clases para el desarrollo de aplicaciones gr%ficas e interfaces de usuario Conjunto de pe/ue0os componentes gr%ficos para aplicaciones1 botones, pesta0as, etc2 +3tensi#n del (45 para el tratamiento de informaci#n gr%fica bidimensional +specificaci#n /ue permite crear applets /ue se ejecutan en el servidor ($" para el intercambio de informaci#n entre un servidor 4eb y aplicaciones /ue se ejecutan en su entorno ($" para transacciones comerciales en "nternet Conjunto de especificaciones para el acceso y utili*aci#n de informaci#n interactiva Java !edia ,rame-or., conjunto de especificaciones para la ar/uitectura, protocolos e interfaces de programaci#n para reproductores multimedia, captura y videoconferencia

Java Security API JFC Swing Set Java 2D Java Servlet API Java Server API Java C !!erce API Java Me"ia API JMF

Java C lla# rati n Java $elep% ny Java Speec% Java Ani!ati n Java &D Java Manage!ent API JavaMail API Pers nal Java Java S!art Car" E!#e""e" Java

+specificaci#n para la comunicaci#n interactiva bidireccional +specificaci#n para aplicaciones de telefona +specificaci#n para el reconocimiento y sntesis de vo* +specificaci#n para la manipulaci#n y movimiento de objetos bidimensionales +specificaci#n para la manipulaci#n de objetos tridimensionales +specificaci#n para la gesti#n remota de redes +specificaci#n para proporcionar un conjunto de clases abstractas /ue modelice un sistema de correo +speficaciones para aparatos electr#nicos de consumo conectables a redes, incluyendo televisores, telfonos inteligentes, videoconsolas, etc2 +specificaciones para tarjetas inteligentes, tipo tarjeta de crdito +specificaciones para dispositivos electr#nicos industriales con soft-are embebido ejecut%ndose sobre sistemas operativos de tiempo real, incluyendo dispositivos de instrumentaci#n, electrnica de control de procesos, etc2

Diferencias y Similitudes con C++ Anterior | Siguiente Si no eres programador C++, puedes saltarte esta seccin, porque no te dir nada; al contrario, probablemente contribuya a confundirte ms que a aclararte cosas, al introducir conceptos muy familiares que entiende muy bien el que conoce C++, pero que a un profano lo dejan indiferente. Adems, muchas de las cosas que se citan no se utilizan en Java, sino que se enumeran para que los programadores que aterrizan en Java desde C++ las tengan en cuenta. Por todo esto, el embrollo que se puede formar un profano puede ser maysculo. Si conoces C++, esta seccin te servir para tener como referencia respecto a los cambios que representa Java sobre C++, y donde debes cambiar el concepto de las cosas. Fundamentalmente, porque hay caractersticas que siguen utilizndose en Java heredadas de C++, pero el sentido con que se aplican es ligeramente diferente, lo que muchas veces lleva a los programadores C++ que atacan Java, a confusiones innecesarias. Por ello, aunque un poco denso y latoso, es una seccin de lectura obligada para que tengas en cuenta las cosas que debes alterar en tu forma de concebir la programacin cuando ataques proyectos en Java. Entramos en materia. Java no soporta typedefs, defines o comandos de preprocesador. Al no existir un preprocesador, no est prevista la inclusin de ficheros de cabecera, tampoco tiene cabida el concepto de macro o constante. Sin embargo, s se permite cierto uso de constantes enumeradas a travs de la utilizacin de la palabra clave final. Java tampoco soporta enums, aunque soporte constantes enumeradas, como acabo de decir. Java soporta clases, pero no soporta estructuras o uniones. Todas las aplicaciones C++ necesitan una funcin de entrada llamada main() y puede haber multitud de otras funciones, tanto funciones miembros de una clase como funciones independientes. En Java no hay funciones independientes, absolutamente todas las funciones han de ser miembros de alguna clase

(mtodos). Funciones globales y datos globales en Java no estn permitidos. En C++ se pueden crear rboles de herencia de clases independientes unos de otros. En Java esto no es posible, en ltima instancia hay una clase Object, de la que hereda todo lo que el programador cree. Todas las funciones o definiciones de mtodos en Java deben estar contenidos dentro de la definicin de la clase. Para un programador C++ puede parecerle que esto es semejante a las funciones inline, pero no es as. Java no permite, al menos directamente, que el programador pueda declarar funciones inline. Tanto Java como C++ soportan funciones o mtodos (estticos) de clases, que pueden ser invocados sin necesidad de tener que instanciar ningn objeto de la clase. En Java se introduce el concepto de interface, que no existe en C++. Una interface se utiliza para crear una clase base abstracta que contenga solamente las constantes y las declaraciones de los mtodos de la clase. No se permite que haya variables miembro ni definiciones de m todos. Adems, en Java tambin se pueden crear verdaderas clases abstractas. Java no soporta herencia mltiple, aunque se pueden utilizar las posibilidades que ofrece el uso de interfaces para emplear las ventajas que ofrece la herencia mltiple, evitando los inconvenientes que se derivan de su uso. La herencia simple es similar en Java y en C++, aunque la forma en que se implementa es bastante diferente, especialmente en lo que respecta a la utilizaci n de los constructores en la cadena de herencia. Java no soporta la sentencia goto, aunque sea una palabra reservada. Sin embargo, soporta las sentencias break y continue con etiquetas, que no estn soportadas por C++. Bajo ciertas circunstancias, estas sentencias etiquetadas se pueden utilizar como un goto encubierto. Java no soporta la sobrecarga de operadores, aunque la utilice internamente, pero no est disponible para el programador. Tampoco soporta la conversin automtica de tipos, excepto en las conversiones seguras. Al contrario que C++, Java dispone de un tipo String y los objetos de este tipo no pueden modificarse. La cadenas que se encuentren definidas entre comillas dobles son convertidas automticamente a objetos String. Java tambin dispone del tipo StringBuffer, cuyos objetos s se pueden modificar, y adems se proporcionan una serie de mtodos para permitir la manipulacin de cadenas de este tipo. Al contrario que C++, Java trata a los arrays como objetos reales. Disponen de un miembro, length, que indica la longitud del array. Se genera una excepcin cuando se intenta sobrepasar el lmite indicado por esta longitud. Todos los arrays son instanciados en memoria dinmica y se permite la asignacin de un array a otro; sin embargo, cuando se realiza una asignacin, simplemente tenemos dos referencias a un mismo array, no hay dos copias del array, por lo que si se altera un elemento de un array, tambin se alterar en el otro. A diferencia de C++, el tener dos "punteros" o referencias a un mismo objeto en memoria dinmica no representa necesariamente un problema (aunque s puede provocar resultados imprevistos). En Java, la memoria dinmica es liberada automticamente, pero esta liberacin no se lleva a cabo hasta que todas las referencias a esa memoria son NULL o dejan de

existir. Por tanto, a diferencia de C++, una zona de memoria dinmica nunca puede ser invlida mientras est siendo referenciada por alguna variable. Java no soporta punteros, al menos en el sentido que atribuye C++, es decir, no permite modificar el contenido de una zona de memoria apuntada por un puntero, o realizar operaciones aritm ticas con punteros. La mayor necesidad de uso de punteros deriva de la utilizacin de cadenas y arrays, y esto se evita al ser objetos de primera clase en Java. Por ejemplo, la declaracin imprescindible en C++, char *puntero, para referenciar al primer elemento de una cadena no se necesita en Java, al ser la cadena un objeto String. La definicin de clase es semejante en Java y C++, aunque en Java no es necesario el punto y coma (;) final. El operador de mbito (::) necesario en C++ no se usa en Java, sino que se utiliza el punto (.) para construir referencias. Y, como no hay soporte de punteros, el operador flecha ( ->) tampoco est soportado en Java. En C++, las funciones y datos miembros se invocan utilizando el nombre de la clase y el nombre del miembro esttico conectados por el operador de mbito. En Java, se utiliza el punto (.) para conseguir el mismo propsito. Al igual que C++, Java dispone de tipos primitivos como int, float, etc. Pero, al contrario de C++, los tamaos de estos tipos son iguales independientemente de la plataforma en que se est n utilizando. No hay tipos sin signo en Java, y la comprobacin de tipos es mucho ms restrictiva en Java que en C++. Java dispone de un tipo boolean verdadero. Las expresiones condicionales en Java se evalan a booleano en vez de a entero como en el caso de C+ +. Es decir, en Java no se permiten sentencias del tipo if( x+y ), porque la expresin que va dentro del parntesis no se evala a booleano. El tipo char en C++ es un tipo de 8 bits que mapea el conjunto completo de caracteres ASCII. En Java, el tipo char es de 16 bits y utiliza el set de caracteres Unicode (los caracteres del 0 al 127 del set Unicode, coinciden con el set ASCII). Al contrario que en C++, el operador desplazamiento ( >>) es un operador con signo, insertando el bit de signo en la posicin vaca. Por ello, Java incorpora el operador >>>, que inserta ceros en las posiciones que van quedando vacas tras el desplazamiento. C++ permite la instanciacin de variables u objetos de cualquier tipo en tiempo de compilacin sobre memoria esttica o, en tiempo de ejecucin, sobre memoria dinmica. Sin embargo, Java requiere que todas las variables de tipos primitivos sean instanciadas en tiempo de compilacin, y todos los objetos sean instanciados en memoria dinmica en tiempo de ejecucin. Java proporciona clases de envoltura para todos los tipos primitivos, excepto para byte y short, que permiten que estos tipos primitivos puedan ser instanciados en memoria dinmica como objetos en tiempo de ejecucin, si fuese necesario. C++ requiere que las clases y funciones estn declaradas antes de utilizarlas por primera vez. Esto no es necesario en Java. C++ tambin requiere que los miembros estticos de una clase se redeclaren fuera de la clase. Esto tampoco es necesario en Java.

En C++, si no se indican valores de inicializacin para las variables de tipos primitivos, pueden contener basura. Aunque las variables locales de tipos primitivos se pueden inicializar en la declaracin, los datos miembros de tipo primitivo de una clase no se pueden inicializar en la definicin de la clase. En Java, se pueden inicializar estos datos miembros de tipo primitivo en la declaracin de la clase. Tambin se pueden inicializar en el constructor. Si la inicializacin no se realiza explcitamente, o falla por lo que sea, los datos son inicializados a cero (o su equivalente) automticamente. Al igual que ocurre en C++, Java tambin soporta constructores que pueden ser sobrecargados. Y, del mismo modo que sucede en C++, si no se proporciona un constructor explcitamente, el sistema proporciona un constructor por defecto. En Java todos los objetos se pasar por referencia, eliminando la necesidad del constructor copia utilizado en C++. No hay destructores en Java. La memoria que no se utiliza es devuelta al Sistema a trav s del reciclador de memoria, que se ejecuta en un thread diferente al del programa principal. Esta es una de las diferencias extremadamente importantes entre C++ y Java. Como C++, Java tambin soporta la sobrecarga de funciones. Sin embargo, el uso de argumentos por defecto no est soportado en Java. Al contrario que C++, Java no soporta templates, por lo que no existen funciones o clases genricas. El multithreading, o multihilo, es algo caracterstico de Java, que se proporciona por defecto. Aunque Java utiliza las mismas palabras clave que C++ para indicar el control de acceso: private, public y protected, la interpretacin es significativamente diferente entre C++ y Java. La implementacin del manejo de excepciones en Java es ms completo y bastante diferente al empleado en C++. Al contrario que C++, Java no soporta la sobrecarga de operadores. No obstante, los operadores + y += son sobrecargados automticamente para concatenar cadenas, o para convertir otros tipos a cadenas. Como en C++, las aplicaciones Java pueden hacer llamadas a funciones escritas en otros lenguajes, llamadas mtodos nativos. No obstante, los applets no pueden hacer llamadas a mtodos nativos. A diferencia de C++, Java dispone de un sistema interno de generacin de documentacin. Si se utilizan comentarios escritos de determinada forma, se puede utilizar la herramienta javadoc para generar la documentacin de la aplicacin Java, e incluso se pueden programar doclets para generar tipos especficos de documentacin. Java para Aplicaciones Corporativas Anterior | Siguiente Java actualmente est en boca de todos, Java e Intranet son las palabras de moda. Pero, surge la

pregunta de si esta es una buena tecnologa para desarrollar aplicaciones corporativas. Y la respuesta es afirmativa, en donde la red sea algo crtico, Java facilita tremendamente la vida de la programacin corporativa. Durante aos, las grandes empresas se han convencido de que la "red" corporativa es la arteria por donde fluye la sangre que mantiene vivo su negocio. Desde el gran servidor de sus oficinas centrales, hasta los servidores de las delegaciones, las estaciones de trabajo de los programadores y la marabunta de PCs, la informacin va fluyendo de unos a otros. Para muchas compaas, La Red es la Empresa. Si esta red no se mantiene sana, los pedidos no llegan, el inventario no se actualiza, el software no se realiza adecuadamente, los clientes no estn satisfechos y, fundamentalmente, el dinero no entra. La necesidad de diagnosticar y reducir la arterioesclerosis de la red, hace que se est n inyectando continuamente nuevas metodologas que subsanen este grave problema. Es Java la medicina? Est claro que cuando vemos un cepillo animado limpiando los dientes, cubos movindose en 3-D, o una banda de gatos locos en applets de Java, nos convencemos de que es el lenguaje idneo para Internet. Pero, qu pasa con las aplicaciones corporativas, sera una buena tecnologa all donde la red es el punto crtico? Vamos a intentar responder a esta cuestin comparando las capacidades de Java contra la lista de necesidades de la red corporativa. Desarrollo rpido de aplicaciones Hace aos, se deca que los programadores pronto desapareceran. Los generadores automticos de programas, eliminaran a los generadores humanos y el mundo sera un lugar mejor para vivir. Desafortunadamente, quienes decan esto no tuvieron en cuenta la acelerada demanda de software de calidad para muy diferentes aplicaciones. La tecnologa de objetos pronto vino a intentar facilitar la tarea, adoptando el modelo de "generar parte de un programa", as, generando la parte bsica de un programa (los objetos), se podra conectar con otros para proporcionar diferentes utilidades al usuario. El lenguaje C++ es una buena herramienta, pero no cumple totalmente la premisa. Visual Basic y NextStep, se acercan cada vez ms al poder de los objetos. Java facilita la creacin de entornos de desarrollo-aplicaciones de modo similar, pero adems es flexible, poderoso y efectivo. Los programadores ahora disponen de herramientas de programacin de calidad, que apuntan hacia esa meta; todas se incluyen dentro de los Entornos Visuales de Desarrollo y se conocen como herramientas RAD (Rapid Application Development), como son el Java WorkShop de SunSoft, el entorno JBuilder de Borland, el Visual J++ de Microsoft, el Caf de Symantec, la Jfactory de Rogue Wave, el Visual Age de IBM, el Mojo de Penumbra Software, y herramientas ms sofisticadas como Netcode o FutureTense. Esto proporciona una gran progresin a los entornos de desarrollo Java. Aplicaciones efectivas y eficientes Las aplicaciones que se crean en grandes empresas deben ser ms efectivas que eficientes; es decir, conseguir que el programa funcione y el trabajo salga adelante es ms importante que el que lo haga eficientemente. Esto no es una crtica, es una realidad de la programacin corporativa. Al ser un lenguaje ms simple que cualquiera de los que ahora estn en el cajn de los programadores, Java permite a stos concentrarse en la mecnica de la aplicacin, en vez de pasarse horas y horas

incorporando APIs para el control de las ventanas, controlando minuciosamente la memoria, sincronizando los ficheros de cabecera y corrigiendo los agnicos mensajes del linker. Java tiene su propio toolkit para interfaces, maneja por s mismo la memoria que utilice la aplicacin, no permite ficheros de cabecera separados (en aplicaciones puramente Java) y solamente usa enlace dinmico. Muchas de las implementaciones de Java actuales son puros intrpretes. Los ByteCodes son interpretados por el sistema run-time de Java, la Mquina Virtual Java (JVM), sobre el ordenador del usuario. Aunque ya hay ciertos proveedores que ofrecen compiladores nativos Just-In-Time (JIT). Si la Mquina Virtual Java dispone de un compilador instalado, las secciones (clases) del ByteCode de la aplicacin se compilarn hacia la arquitectura nativa del ordenador del usuario. Los programas Java en ese momento rivalizarn con el rendimiento de programas en C++. Los compiladores JIT no se utilizan en la forma tradicional de un compilador; los programadores no compilan y distribuyen binarios Java a los usuarios. La compilacin JIT tiene lugar a partir del ByteCode Java, en el sistema del usuario, como una parte (opcional) del entorno run-time local de Java. Muchas veces, los programadores corporativos, ansiosos por exprimir al mximo la eficiencia de su aplicacin, empiezan a hacerlo demasiado pronto en el ciclo de vida de la aplicacin. Java permite algunas tcnicas innovadoras de optimizacin. Por ejemplo, Java es inherentemente multithreaded. A la vez que ofrece posibilidades de multithread como la clase Thread y mecanismos muy sencillos de usar de sincronizacin, Java en s utiliza threads. Los desarrolladores de compiladores inteligentes pueden utilizar esta caracterstica de Java para lanzar un thread que compruebe la forma en que se est utilizando la aplicacin. Ms especficamente, este thread podra detectar qu mtodos de una clase se estn usando con ms frecuencia e invocar a sucesivos niveles de optimizacin en tiempo de ejecucin de la aplicacin. Cuanto ms tiempo est corriendo la aplicacin o el applet, los mtodos estarn cada vez ms optimizados (Guava de Softway es de este tipo). Si un compilador JIT est embebido en el entorno run-time de Java, el programador no se preocupa de hacer que la aplicacin se ejecute ptimamente. Siempre he pensado que los Sistemas Operativos tendran que aplicarse esta filosofa; un optimizador progresivo es un paso ms hacia esta idea. Portabilidad para programador y programa En una empresa de relativo tamao hay una plyade diferente de ordenadores. Probablemente nos encontremos con estaciones de trabajo Sun para el desarrollo de software, hordas de PCs para cada empleado, algn Mac en el departamento de documentacin, una estacin de trabajo HP en administracin y una estacin SGI en la sala de demos. Desarrollar aplicaciones corporativas para un grupo tan diferente de plataformas es excesivamente complejo y caro. Hasta ahora era complicado convencer a los programadores de cada arquitectura que utilizasen un API comn para reducir el coste de las aplicaciones. Con un entorno run-time de Java portado a cada una de las arquitecturas de las plataformas presentes en la empresa y una buena librera de clases ("packages" en Java), los programadores pueden entenderse y encontrar muy interesante trabajar con Java. Esta posibilidad har tender a los programadores hacia Java, justo donde otros intentos anteriores con entornos universales (como Galaxy o XVT) han fracasado. Estos APIs eran simplemente inadecuados, no orientados a redes y,

verdaderamente, pesados. Una vez que los programas estn escritos en Java, otro lado interesante del asunto es que los programadores tambin son portables. El grupo de programadores de la empresa puede ahora enfrentarse a un desarrollo para cualquiera de las plataformas. La parte del cliente y del servidor de una aplicacin estarn ahora escritas en el mismo lenguaje. Ya no ser necesario tener un grupo que desarrolle en Solaris en del departamento de I+D, programadores trabajando sobre Visual Basic en el departamento de documentacin y programadores sobre GNU en proyectos especiales; ahora todos ellos podrn estar juntos y formar el grupo de software de la empresa. Costes de Desarrollo En contraste con el alto coste de los desarrollos realizados sobre estaciones de trabajo, el coste de creacin de una aplicacin Java es similar al de desarrollar sobre un PC. Desarrollar utilizando un software caro para una estacin de trabajo (ahora barata) es un problema en muchas empresas. La eficiencia del hardware y el poco coste de mantenimiento de una estaci n de trabajo Sun, por ejemplo, resulta muy atractivo para las empresas; pero el coste adicional del entorno de desarrollo con C++ es prohibitivo para la gran mayora de ellas. La llegada de Java e Intranet reducen considerablemente estos costes. Las herramientas Java ya no estn en el entorno de precios de millones de pesetas, sino a los niveles confortables de precio de las herramientas de PCs. Y con el crecimiento cada da mayor de la comunidad de desarrolladores de software freeware y shareware que incluso proporcionan el cdigo fuente, los programadores corporativos tienen un amplio campo donde moverse y muchas oportunidades de aprender y muchos recursos a su disposicin. El xito que Internet ha proporcionado a los equipos de software corporativos es un regalo. El precio del software es ahora el mismo para un poderoso equipo corriendo Unix que para un PC. Incluso Netscape tiene al mismo precio la versin Unix de su servidor Web SuiteSpot que la versin PC/NT. Esta es la filosofa de precios que parece ser ser la que se siga con las herramientas basadas en Java. Mantenimiento y Soporte Un problema bien conocido que ocurre con el software corporativo es la demanda de cuidados y alimentacin. Java no es, ciertamente, la cura para la enfermedad del mantenimiento, pero tiene varias caractersticas que harn la vida del enfermero ms fcil. Uno de los componentes del JDK es javadoc. Si se usan ciertas convenciones en el cdigo fuente (como comenzar un comentario con /** y terminarlo con */) Java, javadoc podr fcilmente generar pginas HTML con el contenido de esos comentarios, que pueden visualizarse en cualquier navegador. La documentacin del API de Java ha sido creada de este modo. Esto hace que el trabajo de documentar el cdigo de nuevas clases Java sea trivial. Y ms todava con la incorporacin de los doclets, que son pequeas aplicaciones Java que permiten configurar qu informacin y en qu formato se va a generar, con lo cual la versatilidad de la herramienta es mucho mayor. Otro gran problema del desarrollador corporativo es la creacin y control de makefiles. Leerse un makefile es como estar leyendo la historia de empresa. Normalmente se pasan de programador a

programador, quitando la informacin que no es esencial, siempre que se puede. Esto hace que muchos de los makefiles de las aplicaciones contengan docenas de libreras, una mirada de ficheros de cabecera y ultra-confusos macros. Es como mirar en el estmago de un gran tiburn. Java reduce las dependencia de complejos makefiles drsticamente. Primero, no hay ficheros de cabecera. Java necesita que todo el cdigo fuente de una clase se encuentre en un solo fichero. Java tiene la inteligencia de make en el propio lenguaje para simplificar la compilacin de ByteCodes. Por ejemplo:
public class pepe { // $uitarra flamenca; % public class $uitarra { % ic!ero: pepe"#ava

//

ic!ero: $uitarra"#ava

% #avac &verbose pepe"#ava 'parsed pepe"#ava in ()*ms+ 'loaded d:\#d,*"*"*\lib\classes"-ip(#ava/lan$/.b#ect"class) in /01ms+ 'c!ec,in$ class pepe+ 'parsed "\$uitarra"#ava in 01ms+ '2rote pepe"class+ 'c!ec,in$ class $uitarra+ '2rote "\$uitarra"class+ 'done in 0334ms+

El compilador Java se da cuenta de que necesita compilar el fichero guitarra.java. Ahora se puede forzar a que recompile pepe.java sin cambiar guitarra.java, con lo que se podr comprobar que el compilador de ByteCode Java no recompila innecesariamente el fichero guitarra.java.
% #avac &verbose pepe"#ava 'parsed pepe"#ava in 051ms+ 'loaded d:\#d,*"*"*\lib\classes"-ip(#ava/lan$/.b#ect"class) in 31ms+ 'c!ec,in$ class pepe+ 'loaded "\$uitarra"#ava in 01ms+ '2rote pepe"class+ 'done in 015(ms+

Ahora, si se modifica guitarra.java (aadiendo, por ejemplo, otro miembro a la clase) y se compila pepe.java, el compilador Java se dar cuenta de que debe recompilar tanto pepe.java como guitarra.java
% #avac &verbose pepe"#ava 'parsed pepe"#ava in 5(*ms+ 'loaded d:\#d,*"*"*\lib\classes"-ip(#ava/lan$/.b#ect"class) in 31ms+ 'c!ec,in$ class pepe+ 'parsed "\$uitarra"#ava in (*ms+ '2rote pepe"class+ 'c!ec,in$ class $uitarra+ '2rote "\$uitarra"class+ 'done in 0/45ms+

En el libro Just Java de Peter van der Linden hay un captulo excelente acerca del compilador de Java,

si el lector tiene oportunidad, no debera dejar pasarla sin leerlo. Y tambin a la hora de hablar de costes se encuentra el debate inexistente entre terminales y ordenadores. Es inexistente, porque ambos extremos no son excluyentes. Ni se trata de que haya que volver a la poca de los grandes ordenadores enclaustrados en salas especiales a temperaturas de helarse, ni de que toda la empresa tenga ordenadores que deba actualizar cada ao y medio. En general, para una empresa de investigacin y desarrollo, para un estudiante o para un simple aficionado a la informtica, es mucho ms interesante la opcin de tener un ordenador, no un terminal, por muy NetComputer que sea. Sin embargo, en el caso de empresas de no muchos empleados, en que se ejecuta como mucho Office y alguna otra aplicacin propietaria, resulta prohibitivo actualizar ordenadores con esa frecuencia, pero tambin es prohibitivo, de cara a la competitividad, el quedarse anclado en el pasado. La solucin le llega, por tanto, de la mano de los NCs, o terminales en general, conectados a un ordenador potente. De esta forma, s pueden permitirse actualizar un nico equipo y adems, actualizar las aplicaciones, puesto que stas utilizaran los recursos del servidor central para ejecutarse, con la ventaja adicional de que cualquier instalacin de software se realiza sobre un nico equipo. Esto no quiere decir que necesariamente haya que volver a los mainframes, puesto que el problema de stos no radicaba en el concepto, sino en el cose que poda suponer para una empresa, coste tanto de hardware como de aprendizaje. IBM con los PCs y Microsoft con Windows han contribuido a rebajar estos costes a niveles inimaginables, de modo que la solucin ideal de servidores con aplicaciones facilita el manejo del software al usuario, con NCs o NetPCs conectados a ellos. Aprendizaje Si la empresa est llena de programadores de C++ con alguna experiencia en el manejo de librera grficas, aprendern rpidamente lo esencial de Java. Si el equipo de ingenieros no conoce C++, pero maneja cualquier otro lenguaje de programacin orientada a objetos, les llevar pocas semanas dominar la base de Java. Lo que s que no es cierto es que haya que aprender C++ antes de aprender Java. Si los ingenieros de la empresa no conocen ningn lenguaje orientado a objetos, s que tienen que aprender los fundamentos de esta tecnologa antes de nada, y luego aplicarlos a la programacin con Java. El anlisis y diseo orientado a objetos debe ser comprendido antes de intentar nada con Java. Los programadores de Java sin un fondo de conocimientos de OOA/D producirn cdigo pobre. Adems, los libros sobre Java crecen como la espuma, ya hay ms de 200 publicados, y si se busca "Progamming in Java" en la Red, encontraremos una increble cantidad de Web sites, y lo mismo si nos dedicamos a buscar sites dedicados a "Learning Java". Y si esto no es el sustituto de un instructor humano, hay ya varias empresas que ofrecen enseanza de Java (incluso a travs de Internet), entre ellas, Sun. Resumen En base a los argumentos que acabamos de exponer, podra una empresa utilizar Java para sus aplicaciones crticas? En este instante, sera suficiente un acercamiento a Java. Porque ms importante

que la eleccin de Java o cualquier otro lenguaje de programacin es un buen diseo de la arquitectura de la aplicacin. Disear la aplicacin para que est distribuida entre servidores y clientes, y la lnea de partida debe ser el diseo modular. Algunas sugerencias para adoptar Java como tecnologa corporativa, seran: 1. Usar Java en el desarrollo de la interface del cliente; Java es suficientemente estable para desarrollar una interface portable. Utilizar herramientas de programacin ms estables en los servidores, porque son la parte crtica. 2. Portar o crear un servidor no-crtico en Java, de forma que tanto cliente como servidor estn escritos en Java. 3. Utilizar Java en proyectos de envergadura tanto en el cliente como en el servidor, para valorar la efectividad de Java. Intranet est creciendo actualmente ms rpido que Internet. Las organizaciones corporativas estn adoptando la metodologa Internet para proporcionar soluciones a sus usuarios y clientes. Java tiene todas las cartas para ser una herramienta de inestimable valor en el desarrollo de aplicaciones corporativas. Pero aunque Java convence y aporta argumentos para ello, no es todava la panacea que en ocasiones Sun pretende vender. De hecho, Java no es sencillo de dominar, y no es tan r pido como otros lenguajes. Como tantas tecnologas que superan la fase de emergencia para iniciar la de consolidacin, facilita las cosas, pero todava debe mejorarse a s mismo. De cara a la empresa y a los responsables de tecnolog a, lo que es cierto es que se encuentran ante dos mundos, Windows y Java, en parte complementarios pero tambin diferentes y, de la parte que les toca a sus respectivos fabricantes, visceralmente enfrentados. Lograr lo mejor de ambos exige la adopci n de dos arquitecturas que evolucionan muy deprisa y cada una en una direccin. Situacin que introduce una variable de complejidad para los equipos de desarrollo que si quieren estar a ambos lados, debern contemplar y seguir las evoluciones de las dos plataformas que, al menos por el momento, no parece que estn dispuestas a converger. Actualmente Java se est usando cada vez ms en las empresas, a pesar de los problemas de rendimiento, ya que ni los mejores compiladores JIT, que pueden acelerar la aplicacin entre 10 y 20 veces, suelen acercarse al 50% del rendimiento de un programa en C. Y adems se usa en los servidores, que siempre se ha dicho que tienen que ejecutar el software ms rpido. Lo que ocurre es que en la vida real, un servlet que no utiliza AWT para nada y corre en una mquina virtual con JIT tiene un rendimiento aceptable; el que sea inferior a otros componentes escritos en C y utilizando FastCGI es pura ancdota mientras no se necesite ese extra de rendimiento. Y an entonces, cabe valorar si el precio de un procesador adicional es inferior a la diferencia de coste de desarrollo y mantenimiento entre en cdigo en C y en de Java. Sin embargo Java, por otro lado, se est introduciendo muy rpidamente en los procesos de Control Distribuido, en las empresas que trabajan con sistemas de control embebidos. Sun promociona Java diciendo que es el lenguaje ideal para este tipo de aparatos, como telfonos mviles, tarjetas de crdito,

etc. Y lo cierto es que parece que tienen razn, y en este momento slo se est empezando.

La imagen reproduce un sistema de control de papel, montado por la empresa finlandesa Valmet Automation, que utiliza Java como lenguaje base para el complejo control de la produccin del papel. Sus ingenieros han embebido una Mquina Virtual Java en las estaciones de control de procesos de su sistema de control distribuido Damatic XDi. La produccin del papel involucra una comunicacin instantnea de la maquinaria con los sensores, cada cual de un fabricante. Los paquetes de software que controlan estos sensores se ejecutaban sin el control directo del sistema de control distribuido, pero ahora, los fabricantes de los sensores, utilizando Java, pueden traspasarle el conocimiento directamente al Sistema de Control. Pero tambin en otras reas se est recurriendo a Java; como por ejemplo el hospital Northern California Kaiser Permanente, que utiliza el sistema Kahuna, basado en WebChart, que emplea simultneamente Corba y Java. Este sistema, del cual la figura siguiente reproduce algunas de sus pantallas, es empleado para la gestin de datos de pacientes, doctores, medicamentos, diagnsticos; datos que residen en gran cantidad de bases de datos distintas, con servidores y clientes corriendo en gran cantidad de plataformas diferentes; es decir, es un sistema completamente concurrente y heterogneo; aunque el CDR (Clinical Data Repository) reside en Walnut Creek y Corona, al sur de California, en mainframes IBM, manejando los datos de casi tres millones de pacientes de todos los Estados Unidos de Amrica.

El sistema completo de WebChart fue desarrollado por 5 programadores durante 6 meses, empleando 45 das ms para concluir la primera versin utilizable del sistema. Este sistema fue primero portado de Cobol a C++, pero en medio del proyecto en C++, que ya se demoraba en exceso, se cambi a Java para acelerar la velocidad de desarrollo. El sistema mantiene un histrico de datos de cada paciente con grficas demogrficas, problemas mdicos significativos, alergias, inmunizaciones, histrico de visitas del paciente, hospitalizaciones del paciente, resultados del laboratorio, histrico de medicaciones, imgenes de Resonancia Magntica o Tomografa Axial Computarizada. Tambin muestra las planificaciones tanto clnicas como de los doctores, con enlaces a las tablas de paciente. Permite acceder a los mainframes del hospital y consultar las bibliotecas de diagnsticos y de referencias de frmacos de la intranet del hospital. Y para todo lo que no se pueda conseguir a travs del sistema, dispone de un emulador 3270 para acceder a los mainframes. Para acceder a toda esta informacin solamente es necesario disponer de un navegador con soporte Java y un mdem; pudiendo verse tanto la aplicacin como las complejas imgenes de radiografas o tomografas, utilizando el plug-in Amicas. 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 (plug-in) 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 inc moda 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 tambi n 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. En esta filosofa es en la que se basan los NC (Network Computer), que sern ordenadores sin disco y con mucha memoria. Sus programas residen en un servidor que se los enva cuando los solicita. Es quiz un guio al pasado y una versin futurista de lo que ha sido un Terminal-X en otros tiempos, salvando las diferencias, evidentemente (no sea que alguien me tilde de irreverente con las nuevas tecnologas). Primeros Pasos en Java Anterior | Siguiente Cap.Anterior | Cap.Siguiente 1. Una mnima aplicacin en Java HolaMundo Compilacin y Ejecucin de HolaMundo Ficheros Fuente Java Compilacin

Ejecucin Problemas de Compilacin HolaMundo en C++ 2. Un Applet bsico en Java HolaMundo Componentes Bsicos de un Applet Clases Incluidas La clase Applet Mtodos de Applet Compilacin de un Applet Llamada a Applets Prueba de un Applet 3. Argumentos en la Lnea de Comandos

Como cualquier otro lenguaje, Java se usa para crear aplicaciones. Pero, adems Java tiene la particularidad especial de poder crear aplicaciones muy especiales, son los applets, que es una mini (let) aplicacin (app) diseada para ejecutarse en un navegador. A continuacin se ver en detalle lo mnimo que se puede hacer en ambos casos, lo que permitir presentar la secuencia de edicin, compilacin, ejecucin en Java, que ser imprescindible a la hora de estudiar detalles ms concretos de Java, porque los ejemplos que se muestren sern mejor comprendidos. Hay que hacer una aclaracin antes de entrar a ver nada, porque muchos programadores que se introducen en Java piensan solamente en applets, pero Java va mucho m s all, y no hay por qu establecer una distincin entre applet como aplicacin grfica y aplicacin independiente como aplicacin de consola. No hay nada que impida a una aplicacin independiente funcionar como una aplicacin en modo grfico, lo nico que hay que hacer es tomarse la molestia de inicializar la ventana de la aplicacin a mano y aadirle el evento de que se cierre cuando el mensaje que se lo indique le llegue, cosas en el caso de los applets estn a cargo del navegador o visualizador que se est empleando. Esto es importante, porque en este Tutorial se utilizarn fundamentalmente aplicaciones Java independientes, porque los applets tienen unas medidas de seguridad tan estrictas que no permiten muchas de las opciones del lenguaje, como por ejemplo el acceso a ficheros o la impresin de documentos. Una mnima aplicacin en Java La aplicacin ms pequea posible es la que simplemente imprime un mensaje en la pantalla. Tradicionalmente, el mensaje suele ser "Hola Mundo!". Esto es justamente lo que hace el siguiente fragmento de cdigo:
// 6plicaci7n 8ola9undo de e#emplo // class 8ola9undo6pp { public static void main( :trin$ ar$s'+ ) { :;stem"out"println( "8ola 9undo<" ); % %

HolaMundo Hay que ver en detalle la aplicacin anterior, lnea a lnea. Esas lneas de cdigo contienen los componentes mnimos para imprimir Hola Mundo! en la pantalla. Es un ejemplo muy simple, que no instancia objetos de ninguna otra clase; sin embargo, accede a otra clase incluida en el JDK.
// 6plicaci7n 8ola9undo de e#emplo //

Estas dos primeras lneas son comentarios. Hay tres tipos de comentarios en Java, // es un comentario orientado a lnea.
class 8ola9undo6pp {

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 este caso, el compilador crear un fichero llamado HolaMundoApp.class.
public static void main( :trin$ ar$s'+ ) {

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:
%#ava 8ola9undo6pp ar$* ar$/ """ :;stem"out"println( "8ola 9undo<" );

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. A una variable de tipo class se puede acceder sin necesidad de instanciar ningn objeto de esa clase. Por ello ha de ser un tipo bsico o primitivo, o bien puede ser una referencia que apunta a otro objeto. En este caso, la variable out es una referencia que apunta a un objeto de otro tipo, aqu una instancia de la clase PrintStream (un objeto PrintStream), que es automticamente instanciado cuando la clase

System es cargada en la aplicacin. Esto es algo semejante al hecho de que los objetos stream de entrada/salida, cin y cout son automticamente instanciados y enlazados a los dispositivos estndar de entrada y salida cuando un programa C++ comienza su ejecucin. 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. La clase PrintStream tiene un mtodo instanciable llamado println(), que lo hace e presentar en la salida estndar del Sistema el argumento que se le pase. En este caso, se utiliza la variable o instancia de out para acceder al mtodo.
% %

Finalmente, se cierran las llaves que limitan el mtodo main() y la clase HolaMundoApp. En C++, la funcin main() en un programa puede tener cualquiera de los siguientes prototipos:
tipo=retorno main() tipo=retorno main( int ar$c,c!ar ar$v'+ )

El tipo_retorno puede ser cualquier tipo vlido, o void, para indicar que la funcin no tiene que devolver valor alguno. La lista de argumentos puede estar vaca, o contener los argumentos de soporte para pasar parmetros en la lnea de comandos. Esta forma de implementacin la funcin difiere de la que acaba de presentar para Java, que siempre habr de ser la misma, independientemente de los valores de retorno o la lista de parmetros que se pasen en la lista de argumentos a la aplicacin. Compilacin y Ejecucin de HolaMundo A continuacin se puede ver el resultado de esta primera y sencilla aplicacin Java en pantalla. Se genera un fichero con el cdigo fuente de la aplicacin, se compilar y se utilizar 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:
%#avac 8ola9undo6pp"#ava

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 en donde se haya instalado el JDK. Se ejecutar la aplicacin con la lnea:
%#ava 8ola9undo6pp

y debera aparecer en pantalla la respuesta de Java:


%8ola 9undo<

El smbolo % representa al prompt del sistema, y se utilizar aqu para presentar las respuestas que devuelva el sistema como resultado de la ejecucin de los comandos que se introduzcan por teclado o para indicar las lneas de comandos a introducir. Cuando se ejecuta una aplicacin Java, el intrprete Java busca e invoca al mtodo main() de la clase cuyo nombre coincida con el nombre del fichero .class que se indique en la lnea de comandos. En el ejemplo, se indica al Sistema Operativo que arranque el intrprete Java y luego se indica al intrprete Java que busque y ejecute el mtodo main() de la aplicacin Java almacenada en el fichero HolaMundoApp.class. Problemas de compilacin A continuacin se encuentra una lista de los errores ms frecuentes que se presentan a la hora de compilar un fichero con cdigo fuente Java, tomando como base los errores provocados sobre la mnima aplicacin Java que se est utilizando como ejemplo, pero tambin podra generalizarse sin demasiados problemas.
%#avac: Command not found

No se ha establecido correctamente la variable >6?8 del sistema para el compilador javac. El compilador javac se encuentra en el directorio bin, que cuelga del directorio donde se haya instalado el JDK (Java Development Kit).

%8ola9undo6pp"#ava:0: 9et!od printl(#ava"lan$":trin$) not found in class #ava"io">rint:tream" :;stem"out"printl( "8ola9undo< ); @

Error tipogrfico, el mtodo es println no printl.


%An class 8ola9undo6pp: main must be public and static

Error de ejecucin, se olvid colocar la palabra static en la declaracin del mtodo main de la aplicacin.
%CanBt find class 8ola9undo6pp

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 el fichero de cdigo fuente de la aplicacin HolaMundoApp.java se coloca en vez de la declaracin actual de la clase HolaMundoApp, la lnea:
class 8ola9undoapp {

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.
%Cote: prueba"#ava details" * Earnin$ uses a deprecated 6>A" Decompile 2it! "&deprecation" for

Esto es originado por otra de las cosas que ha introducido el JDK 1.1 como son los elementos obsoletos (deprecated), es decir, aquellas clases o mtodos que no se recomienda utilizar, aunque sigan siendo vlidos, porque estn destinados a desaparecer de la faz de la Tierra a partir de alguna de las versiones posteriores del JDK. Si se compila un programa que hace uso de uno de estas clases, o bien utiliza o sobrecarga un mtodo obsoleto, el compilador mostrar un mensaje de este tipo. Solamente se genera un aviso por mdulo, independientemente del nmero de mtodos obsoletos que se estn utilizanzo, por eso hay que seguir la recomendacin del aviso si se quiren saber los detalles completos de todas las clases y mtodos obsoletos que se estn utilizando. La llamada a estos mtodos rara vez tiene excusa, aunque haya casos especiales en que se escriba cdigo para que sea llamado tanto por programas generados con la versin 1.0 del JDK y con la versin 1.1 o 1.2, En este caso JavaSoft recomienda indicarle al compilador que se est haciendo uso intencionado del mtodo obsoleto, y esto se consigue colocando el comentario /** @deprecated */ justo antes del mtodo sobrecargado, por ejemplo:
/FF Gdeprecated F/ public boolean !andleEvent( Event evt ) {

if( evt"id HH Event"EACI.E=IE:?D.J ) :;stem"eKit( 1 ); return( false ); %

No obstante, en este caso y a pesar de estos avisos, el compilador genera cdigo perfectamente ejecutable. HolaMundo en C++ Para poder establecer comparaciones, y en deferencia a los programadores que dominen C++, se muestran a continuacin dos versiones C++ de la pequea aplicacin que se ha empleado para imprimir el mensaje de saludo en la pantalla. La primera versin, HolaA.cpp, presenta en pantalla el consabido mensaje "Hola Mundo!", pero en el cdigo no se utilizan clases y es significativamente diferente al programa Java que se ha discutido hasta ahora. En Java no se puede escribir nada semejante.
Linclude Miostream"!N void main() { // >resenta el mensa#e en pantalla cout MM "8ola 9undo<"; %

Cuando se compila y ejecuta el fichero ejecutable resultante, el mensaje de saludo aparece en la pantalla. Pero se puede crear una nueva versin del programa C++, HolaB.cpp, estructurada de forma semejante a lo que se hace en Java. As, esta segunda versin de la aplicacin ya contiene una clase, que tiene una funcin miembro esttica que es la encargada de presentar el mensaje de saludo en pantalla. Como en Java, las funciones miembro se pueden invocar sin necesidad de instanciar ningn objeto de la clase.
Linclude Miostream"!N // :e define la clase 8olaO class 8olaO { public: // :e define una funci7n estPtica para presentar // la cadena static void presentar9ensa#e() { // >resenta el mensa#e en la pantalla cout MM "8ola 9undo<"; % %; // :e llama a la funci7n miembro estPtica, sin nin$Qn // ob#eto, para presentar el mensa#e en pantalla void main() { 8olaO::presentar9ensa#e();

Teniendo en cuenta las tres versiones de la aplicacin a la vez, se puede observar claramente la orientacin a objetos que est incluida en Java y la forma en que esto se demuestra, incluso en una aplicacin tan sencilla como la que se limita a presentar un mensaje en pantalla. Un Applet bsico en Java Anterior | Siguiente A continuacin se trata de crear el cdigo fuente de un applet que sea sencillo y sirva para mostrar el ciclo de desarrollo de escritura del cdigo fuente Java, compilacin, ejecucin y visualizacin de resultados, es decir, un applet que presente un mensaje de saludo en la pantalla (la originalidad al poder!). Recurdese que Java utiliza la extensin .java para designar los ficheros fuente. La programacin de applets Java difiere significativamente de la aplicacin de aplicaciones Java. Se puede prever que cuando haya necesidades de un interface grfico, la programacin de applets ser bastante ms sencilla que la programacin de aplicaciones que realicen los mismos cometidos, aunque los applets necesiten de un visualizador de ficheros html con soporte Java, para poder ejecutarse. HolaMundo A continuacin est el cdigo fuente del applet HolaMundo, que es la versin applet de la mnima aplicacin Java que antes se ha presentado y desarrollado tanto como aplicacin Java como en su versin C++. Este cdigo se guardar en un fichero fuente Java como HolaMundo.java, y que como todos los ejemplos de cdigo que se incorporan en este Tutorial, se pueden encontrar ya preescritos y se pueden cargar directamente en el navegador (los .html) o compilar (los .java).
import #ava"a2t"Rrap!ics; import #ava"applet"6pplet; public class 8ola9undo eKtends 6pplet { public void paint( Rrap!ics $ ) { // >inta el mensa#e en la posici7n indicada $"dra2:trin$( "8ola 9undo<",/5,/5 ); % %

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. La descomposicin de un applet en sus piezas/objetos, sera la que se muestra a continuacin:
/F :ecci7n de importaciones F/

public class CombreIelCuevo6pplet eKtends 6pplet { /F 6SuT se declaran las variables de estado (public ; private) F/ /F Uos mVtodos para la interacci7n con los ob#etos se declaran ; definen aSuT F/ public void 9etodoWno( parPmetros ) { /F 6SuT viene para cada mVtodo, el c7di$o Xava Sue desempeYa la tarea" ZuV c7di$o se use depende del applet F/ % %

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 del 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 que se esta presentando aqu, se importa la clase java.awt.Graphics, y se podr llamar a los mtodos de esta clase desde cualquiera de los mtodos que se encuentren incluidos en el fichero HolaMundo.java. Esta clase define una rea grfica y mtodos para poder dibujar dentro de ella. La funcin, mtodo, paint() declara a $ 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, se puede lograr que lleve a cabo las funciones que se desee.
import #ava"applet"6pplet; " " " public class 8ola9undo eKtends 6pplet {

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 este caso, del applet bsico que se est gestando, lo que se hace es:
public void paint( Rrap!ics $ ) {

$"dra2:trin$( "8ola 9undo<",/5,/5 ); %

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:
dra2Uine( int K*,int ;*,int K/,int ;/ ) dra2Dect( int K,int ;,int anc!o,int alto ) dra2.val( int K,int ;,int anc!o,int alto )

Tanto para drawRect() como para drawOval(), las coordenadas (K,;) son la esquina superior izquierda del rectngulo (para drawOval(), el valo es encajado en el rectngulo que lo circunscribe). Compilacin de un Applet Ahora que ya est el cdigo del applet bsico escrito y el fichero fuente Java que lo contiene guardado en disco, es necesario compilarlo y obtener un fichero .class ejecutable. Se utiliza el compilador Java, javac, para realizar la tarea. El comando de compilacin ser:
%#avac 8ola9undo"#ava

Eso es todo. El compilador javac generar un fichero HolaMundo.class que podr ser llamado desde cualquier navegador con soporte Java y, por tanto, capaz de ejecutar applets Java. Llamada a Applets Qu tienen de especial HotJava, Microsoft Explorer o Netscape con respecto a otros navegadores? Con ellos se puede ver cdigo escrito en lenguaje html bsico y acceder a todo el texto, grfico, sonido e hipertexto que se pueda ver con cualquier otro navegador. Pero adems, y esto es lo que tienen de especial, pueden ejecutar applets, que no es html estndar. Ambos navegadores entienden cdigo html que lleve la marca M6>>UE?N:
M6>>UE? C.IEH":uCodi$o"class" EAI?8H*11 8EAR8?H51N M/6>>UE?N

Esta marca html llama al applet SuCodigo.class y establece su ancho y alto inicial. Cuando se acceda a la pgina Web donde se encuentre incluida la marca, se ejecutar el byte-code contenido en SuCodigo.class, obtenindose el resultado de la ejecucin del applet en la ventana del navegador, con soporte Java, que se est utilizando. Si no se dispone de ningn navegador, se puede utilizar el visor de applets que proporciona Sun con el JDK, el appletviewer, que adems requiere muchos menos recursos de la mquina en que se est

ejecutando, que cualquier otro de los navegadores que se acaban de citar. Prueba de un Applet El JDK, Kit de Desarrollo de Java, incluye el visor de applets bsico, appletviewer, que puede utilizarse para la visualizacin rpida y prueba de applets. La ejecucin de un applet sobre appletviewer se realiza a travs de la llamada:
%appletvie2er fichero"!tml

En este caso el fichero con el cdigo html que ejecutar el applet HolaMundo es HolaMundo.html que generar la salida que muestra la figura.

Argumentos en la Lnea de Comandos Anterior | Siguiente En las aplicaciones, tanto C++ como Java, al ejecutarlas, se pueden especificar argumentos en la lnea de llamada, y si los programas estn preparados para aceptarlos, podrn tomarlos en cuenta. Los usuarios del sistema DOS estarn muy familiarizados con comandos del tipo
cop; fic!ero6 fic!eroO

En donde copy es el nombre del programa y ficheroA y ficheroB son los argumentos de la lnea de comandos. Sin embargo, Java y C++ tratan de forma diferente los argumentos que se pasan en la lnea de llamada. A los programadores C++ les resultarn familiares las lneas de cdigo siguientes
void main( int ar$c,c!ar Far$v'+ ) { " " " %

En este caso, el sistema operativo pasa dos parmetros a la funcin principal del programa. argc es un entero que indica el nmero de argumentos en la lnea de comandos, y argv es un array de punteros, en donde cada puntero apunta a uno de los argumentos almacenados como cadena en algn lugar de la memoria. En algunos sistemas, argv[0] apunta a una cadena que contiene el nombre del programa y

en otros apunta a basura. En C++, si el programa no ha sido escrito o preparado para recibir y tratar argumentos que se indiquen en la lnea de comandos, no es necesario especificar nada en la declaracin de la funcin main(). La sintaxis utilizada por Java es la que se ha visto en la miniaplicacin inicial desarrollada al comienzo de esta seccin
public static void main( :trin$ ar$s'+ ) { " " " %

En este caso, y a diferencia de C++, los parmetros s deben aparecer en la declaracin del mtodo main(), aunque el programa Java no est preparado para aceptar ninguno. Tambin, a diferencia de C++, el nombre del programa no se proporciona en Java y el nmero de elementos en el array se puede obtener a travs del mtodo length() del array, con lo que no es necesario que el sistema operativo indique cuntos parmetros hay en la lnea de comandos. Solamente como curiosidad, y tambin como muestra de una aplicacin un poco ms complicada que la impresin de un mensaje, el siguiente ejemplo, java301.java, imprime la lista de argumentos que se pasa a una aplicacin Java.
class #ava01* { public static void main( :trin$ ar$s'+ ) { for( int iH1; i M ar$s"len$t!; i[[ ) :;stem"out"println( ar$s'i+ ); % %

Si se compila y, posteriormente, ejecuta esta aplicacin con la llamada que se muestra, lo que se obtiene en pantalla es lo que se muestra a continuacin
% #avac #ava01*"#ava % #ava #ava01* estos son los ar$umentos Sue se pasan estos son los ar$umentos Sue se pasan

Por comparacin solamente, el ejemplo java301.cpp, reproduce la versin C++ de la aplicacin anterior, para mostrar por pantalla los argumentos que se pasan a la aplicacin
Linclude Miostream"!N class #ava01* { public: static void 9iClase( int ar$c,c!ar Far$v'+ ); %;

// El bucle reSuiere Sue esta funci7n estV definida fuera de la // clase (los bucles en C[[ no permiten funciones inline) void #ava01*::9iClase( int ar$c,c!ar Far$v'+ ) { for( int iH1; i M ar$c; i[[ ) cout MM ar$v'i+ MM endl; % void main( int ar$c,c!ar Far$v'+ ) { #ava01*::9iClase( ar$c,ar$v ); %

Si se compila este cdigo y se ejecuta con la siguiente llamada


C:\N c:\pruebas\#ava01* estos son los ar$umentos Sue se pasan

La salida que se genera en pantalla es:


c:\pruebas\#ava01* estos son los ar$umentos Sue se pasan

You might also like