0% encontró este documento útil (0 votos)
184 vistas149 páginas

Introducción al Lenguaje Java

Java es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems en los años 90. Java toma su sintaxis de C y C++ pero tiene un modelo de objetos más simple y elimina herramientas de bajo nivel como punteros. Las aplicaciones Java se compilan a bytecode que es interpretado por la máquina virtual Java para ejecutarse en cualquier plataforma. Java ha evolucionado a través de múltiples versiones y especificaciones gestionadas por el Java Community Process.

Cargado por

Orumila Iroso
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
184 vistas149 páginas

Introducción al Lenguaje Java

Java es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems en los años 90. Java toma su sintaxis de C y C++ pero tiene un modelo de objetos más simple y elimina herramientas de bajo nivel como punteros. Las aplicaciones Java se compilan a bytecode que es interpretado por la máquina virtual Java para ejecutarse en cualquier plataforma. Java ha evolucionado a través de múltiples versiones y especificaciones gestionadas por el Java Community Process.

Cargado por

Orumila Iroso
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 149

Lenguaje de programacin Java

De Wikipedia, la enciclopedia libre


Saltar a navegacin, bsqueda

Java
Paradigma: Apareci en: Diseado por: Tipo de dato: Implementaciones: Influido por: Ha influido: Sistema operativo: Orientado a objetos 1991 Sun Microsystems Fuerte, Esttico Numerosas Objective-C, C++, Smalltalk, Eiffel C#, J#, JavaScript Multiplataforma

Licencia de software: GNU GPL / Java Community Process

Java es un lenguaje de programacin orientado a objetos desarrollado por Sun Microsystems a principios de los aos 90. El lenguaje en s mismo toma mucha de su sintaxis de C y C++, pero tiene un modelo de objetos ms simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores, como la manipulacin directa de punteros o memoria. Las aplicaciones Java estn tpicamente compiladas en un bytecode, aunque la compilacin en cdigo mquina nativo tambin es posible. En el tiempo de ejecucin, el bytecode es normalmente interpretado o compilado a cdigo nativo para la ejecucin, aunque la ejecucin directa por hardware del bytecode por un procesador Java tambin es posible. La implementacin original y de referencia del compilador, la mquina virtual y las libreras de clases de Java fueron desarrollados por Sun Microsystems en 1995. Desde entonces, Sun ha controlado las especificaciones, el desarrollo y evolucin del lenguaje a travs del Java Community Process, si bien otros han desarrollado tambin implementaciones alternativas de estas tecnologas de Sun, algunas incluso bajo licencias de software libre. Entre noviembre de 2006 y mayo de 2007, Sun Microsystems liber la mayor parte de sus tecnologas Java bajo la licencia GNU GPL, de acuerdo con las especificaciones del Java Community Process, de tal forma que prcticamente todo el Java de Sun es ahora

software libre (aunque la biblioteca de clases de Sun que se requiere para ejecutar los programas Java todava no es software libre).

Contenido
[ocultar] 1 Historia 2 Filosofa o 2.1 Orientado a Objetos o 2.2 Independencia de la plataforma o 2.3 El recolector de basura 3 Sintaxis o 3.1 Hola Mundo 3.1.1 Aplicaciones autnomas 3.1.2 Applets 3.1.3 Servlets 3.1.4 Aplicaciones con ventanas 4 Entornos de funcionamiento o 4.1 En dispositivos mviles y sistemas empotrados o 4.2 En el navegador web o 4.3 En sistemas de servidor o 4.4 En aplicaciones de escritorio o 4.5 Plataformas soportadas 5 Industria relacionada 6 Crticas o 6.1 General o 6.2 El lenguaje o 6.3 Apariencia o 6.4 Rendimiento 7 Recursos o 7.1 JRE o 7.2 Componentes o 7.3 APIs o 7.4 Extensiones y arquitecturas relacionadas 8 Java en cdigo abierto o 8.1 Hasta donde Java es Software libre? o 8.2 Compromiso de Sun Microsystems con el cdigo abierto o 8.3 Alternativas libres o 8.4 Crticas referentes a Java y el software libre o 8.5 Software libre basado en Java 9 Vase tambin 10 Referencias 11 Ejemplos De Programacin Dinmica 12 Notas 13 Enlaces externos o 13.1 Sun o 13.2 Tutoriales
o

13.3 Crticas

Historia [editar]
La tecnologa Java se cre como una herramienta de programacin para ser usada en un proyecto de set-top-box en una pequea operacin denominada the Green Project en Sun Microsystems en el ao 1991. El equipo (Green Team), compuesto por trece personas y dirigido por James Gosling, trabaj durante 18 meses en Sand Hill Road en Menlo Park en su desarrollo. El lenguaje se denomin inicialmente Oak (por un roble que haba fuera de la oficina de Gosling), luego pas a denominarse Green tras descubrir que Oak era ya una marca comercial registrada para adaptadores de tarjetas grficas y finalmente se renombr a Java. El trmino Java fue acuado en una cafetera frecuentada por algunos de los miembros del equipo. Pero no est claro si es un acrnimo o no, aunque algunas fuentes sealan que podra tratarse de las iniciales de sus creadores: James Gosling, Arthur Van Hoff, y Andy Bechtolsheim. Otros abogan por el siguiente acrnimo, Just Another Vague Acronym ("slo otro acrnimo ambiguo ms"). La hiptesis que ms fuerza tiene es la que Java debe su nombre a un tipo de caf disponible en la cafetera cercana, de ah que el icono de java sea una taza de cafe caliente. Un pequeo signo que da fuerza a esta teora es que los 4 primeros bytes (el nmero mgico) de los archivos .class que genera el compilador, son en hexadecimal, 0xCAFEBABE. Otros simplemente dicen que el nombre fue sacado al parecer de una lista aleatoria de palabras. Los objetivos de Gosling eran implementar una mquina virtual y un lenguaje con una estructura y sintaxis similar a C++. Entre junio y julio de 1994, tras una sesin maratoniana de tres das entre John Gaga, James Gosling, Joy Naughton, Wayne Rosing y Eric Schmidt, el equipo reorient la plataforma hacia la Web. Sintieron que la llegada del navegador web Mosaic, propiciara que Internet se convirtiese en un medio interactivo, como el que pensaban era la televisin por cable. Naughton cre entonces un prototipo de navegador, WebRunner, que ms tarde sera conocido como HotJava. En 1994, se les hizo una demostracin de HotJava y la plataforma Java a los ejecutivos de Sun. Java 1.0a pudo descargarse por primera vez en 1994, pero hubo que esperar al 23 de mayo de 1995, durante las conferencias de SunWorld, a que vieran la luz pblica Java y HotJava, el navegador Web. El acontecimiento fue anunciado por John Gage, el Director Cientfico de Sun Microsystems. El acto estuvo acompaado por una pequea sorpresa adicional, el anuncio por parte de Marc Andreessen, Vicepresidente Ejecutivo de Netscape, que Java sera soportado en sus navegadores. El 9 de enero del ao siguiente, 1996, Sun fund el grupo empresarial JavaSoft para que se encargase del desarrollo tecnolgico. [2] Dos semanas ms tarde la primera versin de Java fue publicada. La promesa inicial de Gosling era Write Once, Run Anywhere (Escrbelo una vez, ejectalo en cualquier lugar), proporcionando un lenguaje independiente de la plataforma y un entorno de ejecucin (la JVM) ligero y gratuito para las plataformas ms populares de forma que los binarios (bytecode) de las aplicaciones Java pudiesen ejecutarse en cualquier plataforma.

El entorno de ejecucin era relativamente seguro y los principales navegadores web pronto incorporaron la posibilidad de ejecutar applets Java incrustadas en las pginas web. Java ha experimentado numerosos cambios desde la versin primigenia, JDK 1.0, as como un enorme incremento en el nmero de clases y paquetes que componen la librera estndar. Desde J2SE 1.4, la evolucin del lenguaje ha sido regulada por el JCP (Java Community Process), que usa Java Specification Requests (JSRs) para proponer y especificar cambios en la plataforma Java. El lenguaje en s mismo est especificado en la Java Language Specification (JLS), o Especificacin del Lenguaje Java. Los cambios en los JLS son gestionados en JSR 901.

JDK 1.0 (23 de enero de 1996) Primer lanzamiento.

comunicado de prensa

JDK 1.1 (19 de febrero de 1997) Principales adiciones incluidas: comunicado de prensa o una reestructuracin intensiva del modelo de eventos AWT (Abstract Windowing Toolkit) o clases internas (inner classes) o JavaBeans o JDBC (Java Database Connectivity), para la integracin de bases de datos o RMI (Remote Method Invocation) J2SE 1.2 (8 de diciembre de 1998) Nombre clave Playground. Esta y las siguientes versiones fueron recogidas bajo la denominacin Java 2 y el nombre "J2SE" (Java 2 Platform, Standard Edition), reemplaz a JDK para distinguir la plataforma base de J2EE (Java 2 Platform, Enterprise Edition) y J2ME (Java 2 Platform, Micro Edition). Otras mejoras aadidas incluan: comunicado de prensa o la palabra reservada (keyword) strictfp o reflexin en la programacin o la API grfica ( Swing) fue integrada en las clases bsicas o la mquina virtual (JVM) de Sun fue equipada con un compilador JIT (Just in Time) por primera vez o Java Plug-in o Java IDL, una implementacin de IDL (Interfaz para Descripcin de Lenguaje) para la interoperabilidad con CORBA o Colecciones (Collections) J2SE 1.3 (8 de mayo de 2000) Nombre clave Kestrel.

Los cambios ms notables fueron:comunicado de prensa lista completa de cambios

o o o o o

la inclusin de la mquina virtual de HotSpot JVM (la JVM de HotSpot fue lanzada inicialmente en abril de 1999, para la JVM de J2SE 1.2) RMI fue cambiado para que se basara en CORBA JavaSound se incluy el Java Naming and Directory Interface (JNDI) en el paquete de libreras principales (anteriormente disponible como una extensin) Java Platform Debugger Architecture (JPDA)

J2SE 1.4 (6 de febrero de 2002) Nombre Clave Merlin. Este fue el primer lanzamiento de la plataforma Java desarrollado bajo el Proceso de la Comunidad Java como JSR 59. Los cambios ms notables fueron: comunicado de prensalista completa de cambios o Palabra reservada assert (Especificado en JSR 41.) o Expresiones regulares modeladas al estilo de las expresiones regulares Perl o Encadenacin de excepciones Permite a una excepcin encapsular la excepcin de bajo nivel original. o non-blocking NIO (New Input/Output) (Especificado en JSR 51.) o Logging API (Specified in JSR 47.) o API I/O para la lectura y escritura de imgenes en formatos como JPEG o PNG o Parser XML integrado y procesador XSLT (JAXP) (Especificado en JSR 5 y JSR 63.) o Seguridad integrada y extensiones criptogrficas (JCE, JSSE, JAAS) o Java Web Start incluido (El primer lanzamiento ocurri en Marzo de 2001 para J2SE 1.3) (Especificado en JSR 56.) J2SE 5.0 (30 de septiembre de 2004) Nombre clave: Tiger. (Originalmente numerado 1.5, esta notacin an es usada internamente.[3]) Desarrollado bajo JSR 176, Tiger aadi un nmero significativo de nuevas caractersticas comunicado de prensa o Plantillas (genricos) provee conversion de tipos (type safety) en tiempo de compilacin para colecciones y elimina la necesidad de la mayora de conversion de tipos (type casting). (Especificado por JSR 14.) o Metadatos tambin llamados anotaciones, permite a estructuras del lenguaje como las clases o los mtodos, ser etiquetados con datos adicionales, que puedan ser procesados posteriormente por utilidades de proceso de metadatos. (Especificado por JSR 175.) o Autoboxing/unboxing Conversiones automticas entre tipos primitivos (Como los int) y clases de envoltura primitivas (Como Integer). (Especificado por JSR 201.) o Enumeraciones la palabra reservada enum crea una typesafe, lista ordenada de valores (como [Link], [Link], etc.). Anteriormente, esto solo poda ser llevado a cabo por constantes enteras o clases construidas manualmente (enum pattern). (Especificado por JSR 201.) o Varargs (nmero de argumentos variable) El ltimo parmetro de un mtodo puede ser declarado con el nombre del tipo seguido por tres

puntos (e.g. void drawtext(String... lines)). En la llamada al mtodo, puede usarse cualquier nmero de parmetros de ese tipo, que sern almacenados en un array para pasarlos al mtodo. Bucle for mejorado La sintaxis para el bucle for se ha extendido con una sintaxis especial para iterar sobre cada miembro de un array o sobre cualquier clase que implemente Iterable, como la clase estndar Collection, de la siguiente forma:

void displayWidgets (Iterable<Widget> widgets) { for (Widget w : widgets) { [Link](); } }

Este ejemplo itera sobre el objeto Iterable widgets, asignando, en orden, cada uno de los elementos a la variable w, y llamando al mtodo display() de cada uno de ellos. (Especificado por JSR 201.) |}

Java SE 6 (11 de diciembre de 2006) Nombre clave Mustang. Estuvo en desarrollo bajo la JSR 270. En esta versin, Sun cambi el nombre "J2SE" por Java SE y elimin el ".0" del nmero de versin.[4]. Est disponible en [Link] Los cambios ms importantes introducidos en esta versin son: o Incluye un nuevo marco de trabajo y APIs que hacen posible la combinacin de Java con lenguajes dinmicos como PHP, Python, Ruby y JavaScript. o Incluye el motor Rhino, de Mozilla, una implementacin de Javascript en Java. o Incluye un cliente completo de Servicios Web y soporta las ltimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP. o Mejoras en la interfaz grfica y en el rendimiento. Java SE 7 Nombre clave Dolphin. En el ao 2006 an se encontraba en las primeras etapas de planificacin. Se espera que su desarrollo d comienzo en la primavera de 2006, y se estima su lanzamiento para 2008. o Soporte para XML dentro del propio lenguaje. o Un nuevo concepto de superpaquete. o Soporte para closures. o Introduccin de anotaciones estndar para detectar fallos en el software. No oficiales: o NIO2 o Java Module System. o Java Kernel. o Nueva API para el manejo de Dias y Fechas, la cual reemplazara las antiguas clases Date y Calendar. o Posibilidad de operar con clases BigDecimal usando operandos.

[5]

Adems de los cambios en el lenguaje, con el paso de los aos se han efectuado muchos ms cambios dramticos en la librera de clases de Java (Java class library) que ha crecido de unos pocos cientos de clases en JDK 1.0 hasta ms de tres mil en J2SE 5.0. APIs completamente nuevas, como Swing y Java2D, han sido introducidas y muchos de los mtodos y clases originales de JDK 1.0 estn obsoletas. En el 2005 se calcula en 4,5 millones el nmero de desarrolladores y 2.500 millones de dispositivos habilitados con tecnologa Java. Entre noviembre de 2006 y mayo de 2007, Sun Microsystems liber la mayor parte de sus tecnologas Java bajo la Licencia pblica general de GNU, de acuerdo con las especificaciones del Java Community Process, de tal forma que prcticamente todo el Java de Sun es ahora software libre (aunque la biblioteca de clases de Sun que se requiere para ejecutar los programas Java todava no es software libre).

Filosofa [editar]
El lenguaje Java se cre con cinco objetivos principales: 1. Debera usar la metodologa de la programacin orientada a objetos. 2. Debera permitir la ejecucin de un mismo programa en mltiples sistemas operativos. 3. Debera incluir por defecto soporte para trabajo en red. 4. Debera disearse para ejecutar cdigo en sistemas remotos de forma segura. 5. Debera ser fcil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como C++. Para conseguir la ejecucin de cdigo remoto y el soporte de red, los programadores de Java a veces recurren a extensiones como CORBA (Common Object Request Broker Architecture), Internet Communications Engine o OSGi respectivamente.

Orientado a Objetos [editar]


La primera caracterstica, orientado a objetos (OO), se refiere a un mtodo de programacin y al diseo del lenguaje. Aunque hay muchas interpretaciones para OO, una primera idea es disear el software de forma que los distintos tipos de datos que use estn unidos a sus operaciones. As, los datos y el cdigo (funciones o mtodos) se combinan en entidades llamadas objetos. Un objeto puede verse como un paquete que contiene el comportamiento (el cdigo) y el estado (datos). El principio es separar aquello que cambia de las cosas que permanecen inalterables. Frecuentemente, cambiar una estructura de datos implica un cambio en el cdigo que opera sobre los mismos, o viceversa. Esta separacin en objetos coherentes e independientes ofrece una base ms estable para el diseo de un sistema software. El objetivo es hacer que grandes proyectos sean fciles de gestionar y manejar, mejorando como consecuencia su calidad y reduciendo el nmero de proyectos fallidos. Otra de las grandes promesas de la programacin orientada a objetos es la creacin de entidades ms genricas (objetos) que permitan la reutilizacin del software entre proyectos, una de las premisas fundamentales de la Ingeniera del Software. Un objeto genrico cliente, por ejemplo, debera en teora tener el mismo conjunto de comportamiento en diferentes proyectos,

sobre todo cuando estos coinciden en cierta medida, algo que suele suceder en las grandes organizaciones. En este sentido, los objetos podran verse como piezas reutilizables que pueden emplearse en mltiples proyectos distintos, posibilitando as a la industria del software a construir proyectos de envergadura empleando componentes ya existentes y de comprobada calidad; conduciendo esto finalmente a una reduccin drstica del tiempo de desarrollo. Podemos usar como ejemplo de objeto el aluminio. Una vez definidos datos (peso, maleabilidad, etc.), y su comportamiento (soldar dos piezas, etc.), el objeto aluminio puede ser reutilizado en el campo de la construccin, del automvil, de la aviacin, etc. La reutilizacin del software ha experimentado resultados dispares, encontrando dos dificultades principales: el diseo de objetos realmente genricos es pobremente comprendido, y falta una metodologa para la amplia comunicacin de oportunidades de reutilizacin. Algunas comunidades de cdigo abierto (open source) quieren ayudar en este problema dando medios a los desarrolladores para diseminar la informacin sobre el uso y versatilidad de objetos reutilizables y libreras de objetos.

Independencia de la plataforma [editar]


La segunda caracterstica, la independencia de la plataforma, significa que programas escritos en el lenguaje Java pueden ejecutarse igualmente en cualquier tipo de hardware. Es lo que significa ser capaz de escribir un programa una vez y que pueda ejecutarse en cualquier dispositivo, tal como reza el axioma de Java, write once, run everywhere. Para ello, se compila el cdigo fuente escrito en lenguaje Java, para generar un cdigo conocido como bytecode (especficamente Java bytecode)instrucciones mquina simplificadas especficas de la plataforma Java. Esta pieza est a medio camino entre el cdigo fuente y el cdigo mquina que entiende el dispositivo destino. El bytecode es ejecutado entonces en la mquina virtual (VM), un programa escrito en cdigo nativo de la plataforma destino (que es el que entiende su hardware), que interpreta y ejecuta el cdigo. Adems, se suministran libreras adicionales para acceder a las caractersticas de cada dispositivo (como los grficos, ejecucin mediante hebras o threads, la interfaz de red) de forma unificada. Se debe tener presente que, aunque hay una etapa explcita de compilacin, el bytecode generado es interpretado o convertido a instrucciones mquina del cdigo nativo por el compilador JIT (Just In Time). Hay implementaciones del compilador de Java que convierten el cdigo fuente directamente en cdigo objeto nativo, como GCJ. Esto elimina la etapa intermedia donde se genera el bytecode, pero la salida de este tipo de compiladores slo puede ejecutarse en un tipo de arquitectura. La licencia sobre Java de Sun insiste que todas las implementaciones sean compatibles. Esto dio lugar a una disputa legal entre Microsoft y Sun, cuando ste ltimo aleg que la implementacin de Microsoft no daba soporte a las interfaces RMI y JNI adems de haber aadido caractersticas dependientes de su plataforma. Sun demand a Microsoft y gan por daos y perjuicios (unos 20 millones de dlares) as como una orden judicial forzando la acatacin de la licencia de Sun. Como respuesta, Microsoft no ofrece Java con su versin de sistema operativo, y en recientes versiones de Windows, su navegador Internet Explorer no admite la ejecucin de applets sin un

conector (o plugin) aparte. Sin embargo, Sun y otras fuentes ofrecen versiones gratuitas para distintas versiones de Windows. Las primeras implementaciones del lenguaje usaban una mquina virtual interpretada para conseguir la portabilidad. Sin embargo, el resultado eran programas que se ejecutaban comparativamente ms lentos que aquellos escritos en C o C++. Esto hizo que Java se ganase una reputacin de lento en rendimiento. Las implementaciones recientes de la JVM dan lugar a programas que se ejecutan considerablemente ms rpido que las versiones antiguas, empleando diversas tcnicas, aunque sigue siendo mucho ms lento que otros lenguajes. La primera de estas tcnicas es simplemente compilar directamente en cdigo nativo como hacen los compiladores tradicionales, eliminando la etapa del bytecode. Esto da lugar a un gran rendimiento en la ejecucin, pero tapa el camino a la portabilidad. Otra tcnica, conocida como compilacin JIT (Just In Time, o compilacin al vuelo), convierte el bytecode a cdigo nativo cuando se ejecuta la aplicacin. Otras mquinas virtuales ms sofisticadas usan una recompilacin dinmica en la que la VM es capaz de analizar el comportamiento del programa en ejecucin y recompila y optimiza las partes crticas. La recompilacin dinmica puede lograr mayor grado de optimizacin que la compilacin tradicional (o esttica), ya que puede basar su trabajo en el conocimiento que de primera mano tiene sobre el entorno de ejecucin y el conjunto de clases cargadas en memoria. La compilacin JIT y la recompilacin dinmica permiten a los programas Java aprovechar la velocidad de ejecucin del cdigo nativo sin por ello perder la ventaja de la portabilidad. La portabilidad es tcnicamente difcil de lograr, y el xito de Java en ese campo ha sido dispar. Aunque es de hecho posible escribir programas para la plataforma Java que acten de forma correcta en mltiples plataformas de distinta arquitectura, el gran nmero de estas con pequeos errores o inconsistencias llevan a que a veces se parodie el eslogan de Sun, "Write once, run anywhere" como "Write once, debug everywhere" (o Escrbelo una vez, ejectalo en cualquier parte por Escrbelo una vez, depralo en todas partes) El concepto de independencia de la plataforma de Java cuenta, sin embargo, con un gran xito en las aplicaciones en el entorno del servidor, como los Servicios Web, los Servlets, los Java Beans, as como en sistemas empotrados basados en OSGi, usando entornos Java empotrados.

El recolector de basura [editar]


Un argumento en contra de lenguajes como C++ es que los programadores se encuentran con la carga aadida de tener que administrar la memoria solicitada dinmicamente de forma manual: En C++, el desarrollador puede asignar memoria en una zona conocida como heap (montculo) para crear cualquier objeto, y posteriormente desalojar el espacio asignado cuando desea borrarlo. Un olvido a la hora de desalojar memoria previamente solicitada puede llevar a una fuga de memoria, ya que el sistema operativo seguir pensando que esa zona de memoria est siendo usada por una aplicacin cuando en realidad no es as. As, un programa mal diseado podra consumir una cantidad desproporcionada de

memoria. Adems, si una misma regin de memoria es desalojada dos veces el programa puede volverse inestable y llevar a un eventual cuelgue. No obstante, se debe sealar que C++ tambin permite crear objetos en la pila de llamadas de una funcin o bloque, de forma que se libere la memoria (y se ejecute el destructor del objeto) de forma automtica al finalizar la ejecucin de la funcin o bloque. En Java, este problema potencial es evitado en gran medida por el recolector automtico de basura (o automatic garbage collector). El programador determina cundo se crean los objetos y el entorno en tiempo de ejecucin de Java (Java runtime) es el responsable de gestionar el ciclo de vida de los objetos. El programa, u otros objetos pueden tener localizado un objeto mediante una referencia a ste (que, desde un punto de vista de bajo nivel es una direccin de memoria). Cuando no quedan referencias a un objeto, el recolector de basura de Java borra el objeto, liberando as la memoria que ocupaba previniendo posibles fugas (ejemplo: un objeto creado y nicamente usado dentro de un mtodo slo tiene entidad dentro de ste; al salir del mtodo el objeto es eliminado). Aun as, es posible que se produzcan fugas de memoria si el cdigo almacena referencias a objetos que ya no son necesarioses decir, pueden an ocurrir, pero en un nivel conceptual superior. En definitiva, el recolector de basura de Java permite una fcil creacin y eliminacin de objetos, mayor seguridad y puede que ms rpida que en C++ [cita requerida]. La recoleccin de basura de Java es un proceso prcticamente invisible al desarrollador. Es decir, el programador no tiene conciencia de cundo la recoleccin de basura tendr lugar, ya que sta no tiene necesariamente que guardar relacin con las acciones que realiza el cdigo fuente. Debe tenerse en cuenta que la memoria es slo uno de los muchos recursos que deben ser gestionados.

Sintaxis [editar]
La sintaxis de Java se deriva en gran medida de C++. Pero a diferencia de ste, que combina la sintaxis para programacin genrica, estructurada y orientada a objetos, Java fue construido desde el principio para ser completamente orientado a objetos. Todo en Java es un objeto (salvo algunas excepciones), y todo en Java reside en alguna clase (recordemos que una clase es un molde a partir del cual pueden crearse varios objetos).

Hola Mundo [editar]


Artculo principal: Hola mundo

Aplicaciones autnomas [editar]


// [Link] public class Hola { public static void main(String[] args) { [Link]("Hola, mundo!"); } }

Este ejemplo necesita una pequea explicacin.


Todo en Java est dentro de una clase, incluyendo programas autnomos. El cdigo fuente se guarda en archivos con el mismo nombre que la clase que contienen y con extensin .java. Una clase (class) declarada pblica (public) debe seguir este convenio. En el ejemplo anterior, la clase es Hola, por lo que el cdigo fuente debe guardarse en el fichero [Link] El compilador genera un archivo de clase (con extensin .class) por cada una de las clases definidas en el archivo fuente. Una clase annima se trata como si su nombre fuera la concatenacin del nombre de la clase que la encierra, el smbolo $, y un nmero entero. Los programas que se ejecutan de forma independiente y autnoma, deben contener el mtodo main(). La palabra reservada void indica que el mtodo main no devuelve nada. El mtodo main debe aceptar un array de objetos tipo String. Por acuerdo se referencia como args, aunque puede emplearse cualquier otro identificador. La palabra reservada static indica que el mtodo es un mtodo de clase, asociado a la clase en vez de a instancias de la misma. El mtodo main debe ser esttico o de clase. La palabra reservada public significa que un mtodo puede ser llamado desde otras clases, o que la clase puede ser usada por clases fuera de la jerarqua de la propia clase. Otros tipos de acceso son private o protected. La utilidad de impresin (en pantalla por ejemplo) forma parte de la librera estndar de Java: la clase System define un campo pblico esttico llamado out. El objeto out es una instancia de PrintStream, que ofrece el mtodo println(String) para volcar datos en la pantalla (la salida estndar). Las aplicaciones autnomas se ejecutan dando al entorno de ejecucin de Java el nombre de la clase cuyo mtodo main debe invocarse. Por ejemplo, una lnea de comando (en Unix o Windows) de la forma java cp . Hola ejecutar el programa del ejemplo (previamente compilado y generado [Link]) . El nombre de la clase cuyo mtodo main se llama puede especificarse tambin en el fichero MANIFEST del archivo de empaquetamiento de Java (.jar).

Applets [editar] Las applets de Java son programas incrustados en otras aplicaciones, normalmente una pgina Web que se muestra en un navegador.
// [Link] import [Link]; import [Link]; public class Hola extends Applet { public void paint(Graphics gc) { [Link]("Hola, mundo!", 65, 95); } } <!-- [Link] --> <html> <head> <title>Applet Hola Mundo</title> </head>

<body> <applet code="Hola" width="200" height="200"> </applet> </body> </html>

La sentencia import indica al compilador de Java que incluya las clases [Link]. Applet y [Link]. Graphics, para poder referenciarlas por sus nombres, sin tener que anteponer la ruta completa cada vez que se quieran usar en el cdigo fuente. La clase Hola extiende (extends) a la clase Applet, es decir, es una subclase de sta. La clase Applet permite a la aplicacin mostrar y controlar el estado del applet. La clase Applet es un componente del AWT (Abstract Windowing Toolkit), que permite al applet mostrar una inteterfaz grfica de usuario o GUI (Graphical User Interface), y responder a eventos generados por el usuario. La clase Hola sobrecarga el mtodo paint(Graphics) heredado de la superclase contenedora (Applet en este caso), para acceder al cdigo encargado de dibujar. El mtodo paint() recibe un objeto Graphics que contiene el contexto grfico para dibujar el applet. El mtodo paint() llama al mtodo drawString(String, int, int) del objeto Graphics para mostrar la cadena de caracteres Hola, mundo! en la posicin (65, 96) del espacio de dibujo asignado al applet. La referencia al applet es colocada en un documento HTML usando la etiqueta <applet>. Esta etiqueta o tag tiene tres atributos: code="Hola" indica el nombre del applet, y width="200" height="200" establece la anchura y altura, respectivamente, del applet. Un applet tambin pueden alojarse dentro de un documento HTML usando los elementos object, o embed, aunque el soporte que ofrecen los navegadores Web no es uniforme.[6][7] Servlets [editar] Los servlets son componentes de la parte del servidor de Java EE, encargados de generar respuestas a las peticiones recibidas de los clientes.
// [Link] import [Link].*; import [Link].*; public class Hola extends GenericServlet { public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { [Link]("text/html"); PrintWriter pw = [Link](); [Link]("Hola, mundo!"); [Link](); } }

Las sentencias import indican al compilador de Java la inclusin de todas las clases pblicas e interfaces de los paquetes [Link] y [Link] en la compilacin. La clase Hola extiende (extends), es heredera de la clase GenericServlet. Esta clase proporciona la interfaz para que el servidor le pase las peticiones al servlet y el mecanismo para controlar el ciclo de vida del servlet. La clase Hola sobrecarga el mtodo service(ServletRequest, ServletResponse), definido por la interfaz servlet para acceder al manejador de la peticin de servicio. El mtodo service() recibe un objeto de tipo ServletRequest que contiene la peticin del cliente y un objeto de tipo ServletResponse, usado para generar la respuesta que se devuelve al cliente. El mtodo service() puede lanzar (throws) excepciones de tipo ServletException e IOException si ocurre algn tipo de anomala. El mtodo setContentType(String) en el objeto respuesta establece el tipo de contenido MIME a "text/html", para indicar al cliente que la respuesta a su peticin es una pgina con formato HTML. El mtodo getWriter() del objeto respuesta devuelve un objeto de tipo PrintWriter, usado como una tubera por la que viajarn los datos al cliente. El mtodo println(String) escribe la cadena "Hola, mundo!" en la respuesta y finalmente se llama al mtodo close() para cerrar la conexin, que hace que los datos escritos en la tubera o stream sean devueltos al cliente. Aplicaciones con ventanas [editar] Swing es la librera para la interfaz grfica de usuario avanzada de la plataforma Java SE.
// [Link] import [Link].*; public class Hola extends JFrame { Hola() { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); add(new JLabel("Hola, mundo!")); pack(); } public static void main(String[] args) { new Hola().setVisible(true); } }

Las instrucciones import indican al compilador de Java que las clases e interfaces del paquete [Link] se incluyan en la compilacin. La clase Hola extiende (extends) la clase [Link], que implementa una ventana con una barra de ttulo y un control para cerrarla. El constructor Hola() inicializa el marco o frame llamando al mtodo setDefaultCloseOperation(int) heredado de JFrame para establecer las operaciones por defecto cuando el control de cierre en la barra de ttulo es seleccionado al valor WindowConstants.DISPOSE_ON_CLOSE. Esto hace que se liberen los recursos

tomados por la ventana cuando es cerrada, y no simplemente ocultada, lo que permite a la mquina virtual y al programa acabar su ejecucin. A continuacin se crea un objeto de tipo JLabel con el texto "Hola, mundo!", y se aade al marco mediante el mtodo add(Component), heredado de la clase Container. El mtodo pack(), heredado de la clase Window, es invocado para dimensionar la ventana y distribuir su contenido. El mtodo main() es llamado por la JVM al comienzo del programa. Crea una instancia de la clase Hola y hace la ventana sea mostrada invocando al mtodo setVisible(boolean) de la superclase (clase de la que hereda) con el parmetro a true. Vase que, una vez el marco es dibujado, el programa no termina cuando se sale del mtodo main(), ya que el cdigo del que depende se encuentra en un hilo de ejecucin independiente ya lanzado, y que permanecer activo hasta que todas las ventanas hayan sido destruidas.

Entornos de funcionamiento [editar]


El diseo de Java, su robustez, el respaldo de la industria y su fcil portabilidad han hecho de Java uno de los lenguajes con un mayor crecimiento y amplitud de uso en distintos mbitos de la industria de la informtica.

En dispositivos mviles y sistemas empotrados [editar]


Desde la creacin de la especificacin J2ME (Java 2 Platform, Micro Edition), una versin del entorno de ejecucin Java reducido y altamente optimizado, especialmente desarrollado para el mercado de dispositivos electrnicos de consumo se ha producido toda una revolucin en lo que a la extensin de Java se refiere. Es posible encontrar microprocesadores especficamente diseados para ejecutar bytecode Java y software Java para tarjetas inteligentes (JavaCard), telfonos mviles, buscapersonas, set-top-boxes, sintonizadores de TV y otros pequeos electrodomsticos. El modelo de desarrollo de estas aplicaciones es muy semejante a las applets de los navegadores salvo que en este caso se denominan MIDlets. Vase Sun Mobile Device Tecnology

En el navegador web [editar]


Desde la primera versin de java existe la posibilidad de desarrollar pequeas aplicaciones (Applets) en Java que luego pueden ser incrustadas en una pgina HTML para que sean descargadas y ejecutadas por el navegador web. Estas mini-aplicaciones se ejecutan en una JVM que el navegador tiene configurada como extensin (plug-in) en un contexto de seguridad restringido configurable para impedir la ejecucin local de cdigo potencialmente malicioso. El xito de este tipo de aplicaciones (la visin del equipo de Gosling) no fue realmente el esperado debido a diversos factores, siendo quizs el ms importante la lentitud y el reducido ancho de banda de las comunicaciones en aquel entonces que limitaba el

tamao de las applets que se incrustaban en el navegador. La aparicin posterior de otras alternativas (aplicaciones web dinmicas de servidor) dej un reducido mbito de uso para esta tecnologa, quedando hoy relegada fundamentalmente a componentes especficos para la intermediacin desde una aplicacin web dinmica de servidor con dispositivos ubicados en la mquina cliente donde se ejecuta el navegador. Las applets Java no son las nicas tecnologas (aunque s las primeras) de componentes complejos incrustados en el navegador. Otras tecnologas similares pueden ser: ActiveX de Microsoft, Flash, Java Web Start, etc.

En sistemas de servidor [editar]


En la parte del servidor, Java es ms popular que nunca, desde la aparicin de la especificacin de Servlets y JSP (Java Server Pages). Hasta entonces, las aplicaciones web dinmicas de servidor que existan se basaban fundamentalmente en componentes CGI y lenguajes interpretados. Ambos tenan diversos inconvenientes (fundamentalmente lentitud, elevada carga computacional o de memoria y propensin a errores por su interpretacin dinmica). Los servlets y las JSPs supusieron un importante avance ya que:

El API de programacin es muy sencilla, flexible y extensible. Los servlets no son procesos independientes (como los CGIs) y por tanto se ejecutan dentro del mismo proceso que la JVM mejorando notablemente el rendimiento y reduciendo la carga computacional y de memoria requeridas. Las JSPs son pginas que se compilan dinmicamente (o se pre-compilan previamente a su distribucin) de modo que el cdigo que se consigue una ventaja en rendimiento substancial frente a muchos lenguajes interpretados.

La especificacin de Servlets y JSPs define un API de programacin y los requisitos para un contenedor (servidor) dentro del cual se puedan desplegar estos componentes para formar aplicaciones web dinmicas completas. Hoy da existen multitud de contenedores (libres y comerciales) compatibles con estas especificaciones. A partir de su expansin entre la comunidad de desarrolladores, estas tecnologas han dado paso a modelos de desarrollo mucho ms elaborados con frameworks (pe Struts, Webwork) que se sobreponen sobre los servlets y las JSPs para conseguir un entorno de trabajo mucho ms poderoso y segmentado en el que la especializacin de roles sea posible (desarrolladores, diseadores grficos, ...) y se facilite la reutilizacin y robustez de cdigo. A pesar de todo ello, las tecnologas que subyacen (Servlets y JSPs) son substancialmente las mismas. Este modelo de trabajo se ha convertido en un estndar de-facto para el desarrollo de aplicaciones web dinmicas de servidor y otras tecnologas (pe. ASP) se han basado en l.

En aplicaciones de escritorio [editar]

Hoy en da existen multitud de aplicaciones grficas de usuario basadas en Java. El entorno de ejecucin Java (JRE) se ha convertido en un componente habitual en los PCs de usuario de los sistemas operativos ms usados en el mundo. Adems, muchas aplicaciones Java lo incluyen dentro del propio paquete de la aplicacin de modo que se ejecuten en cualquier PC. En las primeras versiones de la plataforma Java existan importantes limitaciones en las APIs de desarrollo grfico (AWT). Desde la aparicin de la librera Swing la situacin mejor substancialmente y posteriormente con la aparicin de libreras como SWT hacen que el desarrollo de aplicaciones de escritorio complejas y con gran dinamismo, usabilidad, etc. sea relativamente sencillo.

Plataformas soportadas [editar]


Una versin del entorno de ejecucin Java JRE (Java Runtime Environment) est disponible en la mayora de equipos de escritorio. Sin embargo, Microsoft no lo ha incluido por defecto en sus sistemas operativos. En el caso de Apple, ste incluye una versin propia del JRE en su sistema operativo, el Mac OS. Tambin es un producto que por defecto aparece en la mayora de las distribuciones de Linux. Debido a incompatibilidades entre distintas versiones del JRE, muchas aplicaciones prefieren instalar su propia copia del JRE antes que confiar su suerte a la aplicacin instalada por defecto. Los desarrolladores de applets de Java o bien deben insistir a los usuarios en la actualizacin del JRE, o bien desarrollar bajo una versin antigua de Java y verificar el correcto funcionamiento en las versiones posteriores.

Industria relacionada [editar]


Sun Microsystem, como creador del lenguaje de programacin Java y de la plataforma JDK, mantiene fuertes polticas para mantener una especificacin del lenguaje1 as como de la mquina virtual2 a travs del JCP. Es debido a este esfuerzo que se mantiene un estndar de facto. Son innumerables las compaas que desarrollan aplicaciones para Java y/o estn volcadas con esta tecnologa:

La industria de la telefona mvil est fuertemente influenciada por la tecnologa Java. El entorno de desarrollo Eclipse ha tomado un lugar importante entre la comunidad de desarrolladores Java. La fundacin Apache tiene tambin una presencia importante en el desarrollo de libreras y componentes de servidor basados en Java. IBM, BEA, IONA, Oracle,... son empresas con grandes intereses y productos creados en y para Java.

Crticas [editar]

Harold dijo en 1995 que Java fue creado para abrir una nueva va en la gestin de software complejo, y es por regla general aceptado que se ha comportado bien en ese aspecto. Sin embargo no puede decirse que Java no tenga grietas, ni que se adapta completamente a todos los estilos de programacin, todos los entornos, o todas las necesidades.

General [editar]

Java no ha aportado capacidades estndares para aritmtica en punto flotante. El estndar IEEE 754 para Estndar para Aritmtica Binaria en Punto Flotante apareci en 1985, y desde entonces es el estndar para la industria. Y aunque la aritmtica flotante de Java (cosa que cambi desde el 13 de Noviembre de 2006, cuando se abri el cdigo fuente y se adopt la licencia GNU, aparte de la ya existente) se basa en gran medida en la norma del IEEE, no soporta an algunas caractersticas. Ms informacin al respecto puede encontrarse en la seccin final de enlaces externos.

El lenguaje [editar]

En un sentido estricto, Java no es un lenguaje absolutamente orientado a objetos, a diferencia de, por ejemplo, Ruby o Smalltalk. Por motivos de eficiencia, Java ha relajado en cierta medida el paradigma de orientacin a objetos, y as por ejemplo, no todos los valores son objetos. El cdigo Java puede ser a veces redundante en comparacin con otros lenguajes. Esto es en parte debido a las frecuentes declaraciones de tipos y conversiones de tipo manual (casting). Tambin se debe a que no se dispone de operadores sobrecargados, y a una sintaxis relativamente simple. Sin embargo, J2SE 5.0 introduce elementos para tratar de reducir la redundancia, como una nueva construccin para los bucles foreach. A diferencia de C++, Java no dispone de operadores de sobrecarga definidos por el usuario. Sin embargo esta fue una decisin de diseo que puede verse como una ventaja, ya que esta caracterstica puede hacer los programas difciles de leer y mantener.

Apariencia [editar]
La apariencia externa (el look and feel) de las aplicaciones GUI (Graphical User Interface) escritas en Java usando la plataforma Swing difiere a menudo de la que muestran aplicaciones nativas. Aunque el programador puede usar el juego de herramientas AWT (Abstract Windowing Toolkit) que genera objetos grficos de la plataforma nativa, el AWT no es capaz de funciones grficas avanzadas sin sacrificar la portabilidad entre plataformas; ya que cada una tiene un conjunto de APIs distinto, especialmente para objetos grficos de alto nivel. Las herramientas de Swing, escritas completamente en Java, evitan este problema construyendo los objetos grficos a partir de los mecanismos de dibujo bsicos que deben estar disponibles en todas las plataformas. El inconveniente es el trabajo extra requerido para conseguir la misma apariencia de la plataforma destino. Aunque esto es posible (usando GTK+ y el Lookand-Feel de Windows), la mayora de los usuarios no saben cmo cambiar la apariencia que se proporciona por defecto por aquella que se adapta a la de la plataforma.

Rendimiento [editar]
El rendimiento de una aplicacin est determinado por multitud de factores, por lo que no es fcil hacer una comparacin que resulte totalmente objetiva. En tiempo de ejecucin, el rendimiento de una aplicacin Java depende ms de la eficiencia del compilador, o la JVM, que de las propiedades intrnsecas del lenguaje. El bytecode de Java puede ser interpretado en tiempo de ejecucin por la mquina virtual, o bien compilado al cargarse el programa, o durante la propia ejecucin, para generar cdigo nativo que se ejecuta directamente sobre el hardware. Si es interpretado, ser ms lento que usando el cdigo mquina intrnseco de la plataforma destino. Si es compilado, durante la carga inicial o la ejecucin, la penalizacin est en el tiempo necesario para llevar a cabo la compilacin. Algunas caractersticas del propio lenguaje conllevan una penalizacin en tiempo, aunque no son nicas de Java. Algunas de ellas son el chequeo de los lmites de arrays, chequeo en tiempo de ejecucin de tipos, y la indireccin de funciones virtuales. El uso de un recolector de basura para eliminar de forma automtica aquellos objetos no requeridos, aade una sobrecarga que puede afectar al rendimiento, o ser apenas apreciable, dependiendo de la tecnologa del recolector y de la aplicacin en concreto. Las JVM modernas usan recolectores de basura que gracias a rpidos algoritmos de manejo de memoria, consiguen que algunas aplicaciones puedan ejecutarse ms eficientemente. El rendimiento entre un compilador JIT y los compiladores nativos puede ser parecido, aunque la distincin no est clara en este punto. La compilacin mediante el JIT puede consumir un tiempo apreciable, un inconveniente principalmente para aplicaciones de corta duracin o con gran cantidad de cdigo. Sin embargo, una vez compilado, el rendimiento del programa puede ser comparable al que consiguen compiladores nativos de la plataforma destino, inclusive en tareas numricas. Aunque Java no permite la expansin manual de llamadas a mtodos, muchos compiladores JIT realizan esta optimizacin durante la carga de la aplicacin y pueden aprovechar informacin del entorno en tiempo de ejecucin para llevar a cabo transformaciones eficientes durante la propia ejecucin de la aplicacin. Esta recompilacin dinmica, como la que proporciona la mquina virtual HotSpot de Sun, puede llegar a mejorar el resultado de compiladores estticos tradicionales, gracias a los datos que slo estn disponibles durante el tiempo de ejecucin. Java fue diseado para ofrecer seguridad y portabilidad, y no ofrece acceso directo al hardware de la arquitectura ni al espacio de direcciones. Java no soporta expansin de cdigo ensamblador, aunque las aplicaciones pueden acceder a caractersticas de bajo nivel usando libreras nativas (JNI, Java Native Interfaces).

Recursos [editar]
JRE [editar]
El JRE (Java Runtime Environment, o Entorno en Tiempo de Ejecucin de Java) es el software necesario para ejecutar cualquier aplicacin desarrollada para la plataforma

Java. El usuario final usa el JRE como parte de paquetes software o plugins (o conectores) en un navegador Web. Sun ofrece tambin el SDK de Java 2, o JDK (Java Development Kit) en cuyo seno reside el JRE, e incluye herramientas como el compilador de Java, Javadoc para generar documentacin o el depurador. Puede tambin obtenerse como un paquete independiente, y puede considerarse como el entorno necesario para ejecutar una aplicacin Java, mientras que un desarrollador debe adems contar con otras facilidades que ofrece el JDK.

Componentes [editar]

Bibliotecas de Java, que son el resultado de compilar el cdigo fuente desarrollado por quien implementa la JRE, y que ofrecen apoyo para el desarrollo en Java. Algunos ejemplos de estas libreras son: o Las bibliotecas centrales, que incluyen: Una coleccin de bibliotecas para implementar estructuras de datos como listas, arrays, rboles y conjuntos. Bibliotecas para anlisis de XML. Seguridad. Bibliotecas de internacionalizacin y localizacin. o Bibliotecas de integracin, que permiten la comunicacin con sistemas externos. Estas libreras incluyen: La API para acceso a bases de datos JDBC (Java DataBase Conectivity). La interfaz JNDI (Java Naming and Directory Interface) para servicios de directorio. RMI (Remote Method Invocation) y CORBA para el desarrollo de aplicaciones distribuidas. o Bibliotecas para la interfaz de usuario, que incluyen: El conjunto de herramientas nativas AWT (Abstract Windowing Toolkit), que ofrece componentes GUI (Graphical User Interface), mecanismos para usarlos y manejar sus eventos asociados. Las Bibliotecas de Swing, construidas sobre AWT pero ofrecen implementaciones no nativas de los componentes de AWT. APIs para la captura, procesamiento y reproduccin de audio. Una implementacin dependiente de la plataforma en que se ejecuta de la mquina virtual de Java (JVM), que es la encargada de la ejecucin del cdigo de las libreras y las aplicaciones externas. Plugins o conectores que permiten ejecutar applets en los navegadores Web. Java Web Start, para la distribucin de aplicaciones Java a travs de Internet. Documentacin y licencia.

APIs [editar]
Sun define tres plataformas en un intento por cubrir distintos entornos de aplicacin. As, ha distribuido muchas de sus APIs (Application Program Interface) de forma que pertenezcan a cada una de las plataformas:

Java ME (Java Platform, Micro Edition) o J2ME orientada a entornos de limitados recursos, como telfonos mviles, PDAs (Personal Digital Assistant), etc. Java SE (Java Platform, Standard Edition) o J2SE para entornos de gama media y estaciones de trabajo. Aqu se sita al usuario medio en un PC de escritorio. Java EE (Java Platform, Enterprise Edition) o J2EE orientada a entornos distribuidos empresariales o de Internet.

Las clases en las APIs de Java se organizan en grupos disjuntos llamados paquetes. Cada paquete contiene un conjunto de interfaces, clases y excepciones relacionadas. La informacin sobre los paquetes que ofrece cada plataforma puede encontrarse en la documentacin de sta. El conjunto de las APIs es controlado por Sun Microsystems junto con otras entidades o personas a travs del programa JCP (Java Community Process). Las compaas o individuos participantes del JCP pueden influir de forma activa en el diseo y desarrollo de las APIs, algo que ha sido motivo de controversia. En 2004, IBM y BEA apoyaron pblicamente la idea de crear una implementacin de cdigo abierto (open source) de Java, algo a lo que Sun, a fecha de 2006, se ha negado.

Extensiones y arquitecturas relacionadas [editar]


Las extensiones de Java estn en paquetes que cuelgan de la raz javax: javax.*. No se incluyen en la JDK o el JRE. Algunas de las extensiones y arquitecturas ligadas estrechamente al lenguaje Java son:

Java EE (Java Platform, Enterprise Edition; antes J2EE) para aplicaciones distribuidas orientadas al entorno empresarial Java ME (Java Platform, Micro Edition; antes J2ME)para dispositivos de recursos limitados como telfonos mviles y PDAs JMF (Java Media Framework) JavaHelp JavaMail JNDI (Java Naming and Directory Interface) JSML (Java Speech API Markup Language) JDBC (Java Database Connectivity) JDO (Java Data Objects) JAI (Java Advanced Imaging) JAIN (Java API for Integrated Networks) JDMK (Java Dynamic Management Kit) Jini (una arquitectura de red para la construccin de sistemas distribuidos Jiro Java Card JavaSpaces JML (Java Modeling Language) JMI (Java Metadata Interface) JMX (Java Management Extensions)

JSP (JavaServer Pages) JSF (JavaServer Faces) JNI (Java Native Interface) JXTA (Protocolos abiertos para redes virtuales Peer-to-Peer o P2P) Java 3D (Una API de alto nivel para programacin grfica en 3D) JOGL (Java OpenGLUna API de bajo nivel para programacin grfica usando OpenGL) LWJGL (Light Weight Java Game LibraryUna API de bajo nivel para acceso a OpenGL, OpenAL y varios dispositivos de entrada) MARF (Modular Audio Recognition Framework) OSGi (Dynamic Service Management and Remote Maintenance)

Java en cdigo abierto [editar]


Java se ha convertido en un lenguaje con una implantacin masiva en todos los entornos (personales y empresariales). El control que mantiene Sun sobre ste genera reticencias en la comunidad de empresas con fuertes intereses en Java (IBM, Oracle) y obviamente en la comunidad de desarrolladores de software libre. La evolucin basada en un comit en el que participen todos los implicados no es suficiente y la comunidad demandaba desde hace tiempo la liberacin de las APIs y libreras bsicas de la JDK.

Hasta donde Java es Software libre? [editar]


En diciembre de 2006, Sun est en pleno relanzamiento de su plataforma Java3 bajo la licencia GPL de GNU.

Compromiso de Sun Microsystems con el cdigo abierto [editar]


La importancia del cdigo abierto en relacin con Java puede verse entre otras cosas, en que el presidente y CEO de Sun, Jonathan Schwartz, ha retado a la compaa a que ofrezca cdigo abierto para todo el software que produce Sun (fuente), Sun ya hace mucho tiempo que empez a apostar por el cdigo abierto cuando liber StarOffice (Llamado ahora OpenOffice). Sun ha aportado ms lneas de cdigo abierto que cualquier otra organizacin (fuente) Tambin Richard Stallman opina eso mismo (fuente)

El xito del cdigo abierto - Artculo puesto en el sito oficial en Espaol de Sun Microsystems, en el que habla de la apuesta de Sun Microsystems por el cdigo abierto.

Alternativas libres [editar]


Existen alternativas suficientemente maduras para el entorno de ejecucin y de desarrollo de Java con una gran cobertura de funcionalidades con respecto a las implementaciones comerciales de Sun, IBM, Bea, ...

Blackdown Java para Linux, incluye un plugin para Mozilla GNU Classpath de GNU - actualmente est siendo fusionado con libgcj del Compilador para Java de GNU Apache Harmony de Apache

Crticas referentes a Java y el software libre [editar]

Free But Shackled The Java Trap, de Richard Stallman, 12 de abril, 2004. (respuesta de James Gosling) o Traduccin al Espaol de este artculo: Libre pero encadenado. La trampa del Java. (Ntese que hay una nota en un recuadro amarillo que habla de la situacin actual con respecto a lo que se dice en ese artculo)

Notar que este artculo fue escrito antes de la liberacin del cdigo fuente de Java. En la actualidad la postura de la Free Software Foundation y de Richard Stallman han cambiado, mostrndose partidarios ambos por su uso en software libre.

Software libre basado en Java [editar]


Azureus Eclipse Limewire iRATE Radio Java Source dispone de una lista de software libre (licencias GNU, LGNU, Apache, BSD, ...) hecho en Java.

Vase tambin [editar]


Java syntax Java keywords Java virtual machine Java platform Java applet Java Platform, Standard Edition (Java SE, J2SE) JavaOS Comparison of Java and C++ Comparison of C# and Java Java User Group Java Community Process JavaOne Join Java programming language Javapedia Inferno operating system

Referencias [editar]

Jon Byous, Java technology: The early years. Sun Developer Network, sin fecha[ca. 1998]. Recuperado 21 de abril de 2005.

James Gosling, A brief history of the Green project. [Link], sin fecha [ca. Q1/1998]. Recuperado 22 abril de 2005. James Gosling, Bill Joy, Guy Steele, y Gilad Bracha, The Java language specification, tercera edicin. Addison-Wesley, 2005. ISBN 0-321-24678-0. Tim Lindholm y Frank Yellin. The Java Virtual Machine specification, segunda edicin. Addison-Wesley, 1999. ISBN 0-201-43294-3.

Ejemplos De Programacin Dinmica [editar]


Ejecucin de n tareas en tiempo mnimo en un sistema de dos procesadores A y B Programas en disco Problema de los sellos con programacin dinmica Problema de la mochila con programacin dinmica Problema del producto de una secuencia de matrices con programacin dinmica Problema de las monedas con programacin dinmica Camino de coste mnimo entre dos nodos de un grafo dirigido Problema de la divisin de peso Problema de las vacas con programacin dinmica Problema del Cambio de Palabra Programacin Dinmica en JAVA

Notas [editar]
1. Especificacin del lenguaje Java 2. Especificacin de la mquina virtual Java 3. [1]

Enlaces externos [editar]

Wikilibros alberga un libro o manual sobre Programacin en Java.

Sun [editar]

Sitio oficial de Java para desarrolladores, etc The Java Language Specification, Tercera edicin Especificacin oficial del lenguaje Java Tutorial de Sun sobre el Lenguaje de programacin Java Libro blanco original de Java, 1996

Tutoriales [editar]

The Java Tutorial de Sun Microsystems (online) Thinking in Java, de Bruce Eckel (online) An introduction to Computer Science using Java por Bradley Kjell. Java Course, de A.B. Downey. [Link] Coleccin de libros sobre Java disponibles para descarga gratuita.

En castellano: o Tutorial de Java bsico o Coleccin Java a tope de libros electrnicos (Universidad de Mlaga. Espaa) o Tutoriales de Java avanzados, bsicos y preguntas de certificacin para practicar.

Crticas [editar]

Softpanorama Java Critique Page: Java vs Scripting Languages, de Nikolai Bezroukov How Javas Floating-Point Hurts Everyone Everywhere, de W. Kahan und Joseph D. Darcy en el ACM 1998 Workshop on Java for HighPerformance Network Computing

Introduccin a Java
1.1 Origen de Java Sun Microsystems, lder en servidores para Internet, uno de cuyos lemas desde hace mucho tiempo es "the network is the computer" (lo que quiere dar a entender que el verdadero ordenador es la red en su conjunto y no cada mquina individual), es quien ha desarrollado el lenguaje Java, en un intento de resolver simultneamente todos los problemas que se le plantean a los desarrolladores de software por la proliferacin de arquitecturas incompatibles, tanto entre las diferentes mquinas como entre los diversos sistemas operativos y sistemas de ventanas que funcionaban sobre una misma mquina, aadiendo la dificultad de crear aplicaciones distribuidas en una red como Internet. He podido leer ms de cinco versiones distintas sobre el origen, concepcin y desarrollo de Java, desde la que dice que este fue un proyecto que rebot durante mucho tiempo por distintos departamentos de Sun sin que nadie le prestara ninguna atencin, hasta que finalmente encontr su nicho de mercado en la aldea global que es Internet; hasta la ms difundida, que justifica a Java como lenguaje de pequeos electrodomsticos. Hace algunos aos, Sun Microsystems decidi intentar introducirse en el mercado de la electrnica de consumo y desarrollar programas para pequeos dispositivos electrnicos. Tras unos comienzos dudosos, Sun decidi crear una filial, denominada FirstPerson Inc., para dar margen de maniobra al equipo responsable del proyecto. El mercado inicialmente previsto para los programas de FirstPerson eran los equipos domsticos: microondas, tostadoras y, fundamentalmente, televisin interactiva. Este mercado, dada la falta de pericia de los usuarios para el manejo de estos dispositivos, requera unos interfaces mucho ms cmodos e intuitivos que los sistemas de ventanas que proliferaban en el momento. Otros requisitos importantes a tener en cuenta eran la fiabilidad del cdigo y la facilidad de desarrollo. James Gosling, el miembro del equipo con ms experiencia en lenguajes de programacin, decidi que las ventajas aportadas por la eficiencia de C++ no compensaban el gran coste de pruebas y depuracin. Gosling haba estado trabajando en su tiempo libre en un lenguaje de programacin que l haba llamado Oak, el cual, an partiendo de la sintaxis de C++, intentaba remediar las deficiencias que iba observando. Los lenguajes al uso, como C o C++, deben ser compilados para un chip, y si se cambia el chip, todo el software debe compilarse de nuevo. Esto encarece mucho los desarrollos y el problema es especialmente acusado en el campo de la electrnica de consumo. La aparicin de un chip ms barato y, generalmente, ms eficiente, conduce inmediatamente a los fabricantes a incluirlo en las nuevas series de sus cadenas de produccin, por pequea que sea la diferencia en precio ya que,

multiplicada por la tirada masiva de los aparatos, supone un ahorro considerable. Por tanto, Gosling decidi mejorar las caractersticas de Oak y utilizarlo. El primer proyecto en que se aplic este lenguaje recibi el nombre de proyecto Green y consista en un sistema de control completo de los aparatos electrnicos y el entorno de un hogar. Para ello se construy un ordenador experimental denominado *7 (Star Seven). El sistema presentaba una interfaz basada en la representacin de la casa de forma animada y el control se llevaba a cabo mediante una pantalla sensible al tacto. En el sistema apareca Duke, la actual mascota de Java. Posteriormente se aplic a otro proyecto denominado VOD (Video On Demand) en el que se empleaba como interfaz para la televisin interactiva. Ninguno de estos proyectos se convirti nunca en un sistema comercial, pero fueron desarrollados enteramente en un Java primitivo y fueron como su bautismo de fuego. Una vez que en Sun se dieron cuenta de que a corto plazo la televisin interactiva no iba a ser un gran xito, urgieron a FirstPerson a desarrollar con rapidez nuevas estrategias que produjeran beneficios. No lo consiguieron y FirstPerson cerr en la primavera de 1994. Pese a lo que pareca ya un olvido definitivo, Bill Joy, cofundador de Sun y uno de los desarrolladores principales del Unix de Berkeley, juzg que Internet podra llegar a ser el campo de juego adecuado para disputar a Microsoft su primaca casi absoluta en el terreno del software, y vio en Oak el instrumento idneo para llevar a cabo estos planes. Tras un cambio de nombre y modificaciones de diseo, el lenguaje Java fue presentado en sociedad en agosto de 1995. Lo mejor ser hacer caso omiso de las historias que pretenden dar carta de naturaleza a la clarividencia industrial de sus protagonistas; porque la cuestin es si independientemente de su origen y entorno comercial, Java ofrece soluciones a nuestras expectativas. Porque tampoco vamos a desechar la penicilina aunque haya sido su origen fruto de la casualidad. 1.2 Caractersticas de Java Las caractersticas principales que nos ofrece Java respecto a cualquier otro lenguaje de programacin, son: 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. 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. 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. 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 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 runtime 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 runtime, 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 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: %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 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. 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 byte-code. 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 runtime, 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.

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. 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.

Java, para evitar que los mdulos de byte-codes o los objetos o nuevas clases, haya que estar trayndolos 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. Cul es la ventaja de todo esto?Qu gano con Java?

Primero: No debes volver a escribir el cdigo si quieres ejecutar el programa en otra mquina. Un solo cdigo funciona para todos los browsers compatibles con Java o donde se tenga una Mquina Virtual de Java (Mac's, PC's, Sun's, etc). Segundo: Java es un lenguaje de programacin orientado a objetos, y tiene todos los beneficios que ofrece esta metodologa de programacion (ms adelante doy una pequea introduccin a la filosofa de objetos). Tercero: Un browser compatible con Java deber ejecutar cualquier programa hecho en Java, esto ahorra a los usuarios tener que estar insertando "plug-ins" y dems programas que a veces nos quitan tiempo y espacio en disco. Cuarto: Java es un lenguaje y por lo tanto puede hacer todas las cosas que puede hacer un lenguaje de programacin: Clculos matemticos, procesadores de palabras, bases de datos, aplicaciones grficas, animaciones, sonido, hojas de clculo, etc. Quinto: Si lo que me interesa son las pginas de Web, ya no tienen que ser estticas, se le pueden poner toda clase de elementos multimedia y permiten un alto nivel de interactividad, sin tener que gastar en paquetes carsimos de multimedia.

Todo esto suena muy bonito pero tambien se tienen algunas limitantes:

La velocidad. Los programas hechos en Java no tienden a ser muy rpidos, supuestamente se est trabajando en mejorar [Link] los programas de Java son interpretados nunca alcanzan la velocidad de un verdadero ejecutable. Java es un lenguaje de programacin. Esta es otra gran limitante, por ms que digan que es orientado a objetos y que es muy fcil de aprender sigue siendo un lenguaje y por lo tanto aprenderlo no es cosa fcil. Especialmente para los no programadores.

Java es nuevo. En pocas palabras todava no se conocen bien todas sus capacidades.

Pero en general Java posee muchas ventajas y se pueden hacer cosas muy interesantes con esto. Hay que prestar especial atencin a lo que est sucediendo en el mundo de la computacin, a pesar de que Java es relativamente nuevo, posee mucha fuerza y es tema de moda en cualquier medio computacional. Muchas personas apuestan a futuro y piensan en Java. La pregunta es : Estarn en lo correcto? La verdad es que no se, pero este manual no es para filosofar sobre el futuro del lenguaje sino para aprender a programarlo. 1.3 HotJava HotJava, en pocas palabras, es un navegador con soporte Java (Java-enabled), desarrollado en Java. Como cualquier navegador de Web, HotJava puede decodificar HTML estndar y URLs estndares, aunque no soporta completamente el estndar HTML 3.0. La ventaja sobre el resto de navegadores, sin soporte Java, es que puede ejecutar programas Java sobre la red. La diferencia con Netscape, es que tiene implementado completamente los sistemas de seguridad que propone Java, esto significa que puede escribir y leer en el disco local, aunque esto hace disminuir la seguridad, ya que se pueden grabar en nuestro disco programas que contengan cdigo malicioso e introducirnos un virus, por ejemplo. No obstante, el utilizar esta caracterstica de HotJava es decisin del usuario. 1.4 Java para aplicaciones corporativas 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 y voy a proponer argumentos para esa afirmacin. 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 desarrolla 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 estn 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 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 una acelerada demanda de software de calidad para muy diferentes aplicaciones. Sin embargo, 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 otras partes 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 beta, que apuntan hacia esa meta, como son el Java WorkShop de SunSoft, el entorno Java de Borland, el Caf de Symantec, y pronto, 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 byte-codes 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 byte-code 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 byte-code 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 en los Sistemas Operativos tendra 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 en 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 estacin 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 realimentacin. 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 Java (como comenzar un comentario con /** y terminarlo con */), javadoc se puede 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. 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 la ballena de Jons. 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 byte-codes. Por ejemplo: public class pepe { // Fichero: [Link] Guitarra flamenca ; }

public class guitarra { // Fichero: [Link] } % javac -verbose [Link] [parsed [Link] in 720ms] [loaded C:\JAVA\BIN\..\classes\java\lang\[Link] in 220ms] [checking class pepe] [parsed .\\[Link] in 50ms] [wrote [Link]] [checking class Guitarra] [wrote .\\[Link]] [done in 2300ms] El compilador Java se da cuenta de que necesita compilar el fichero [Link]. Ahora vamos a forzarlo a que recompile [Link] sin cambiar [Link], podremos comprobar que el compilador de byte-code Java no recompila innecesariamente el fichero [Link]. % javac -verbose [Link] [parsed [Link] in 440ms] [loaded C:\JAVA\BIN\..\classes\java\lang\[Link] in 160ms] [checking class pepe] [loaded .\\[Link] in 0ms] [wrote [Link]] [done in 1860ms] Ahora, si modificamos [Link] (aadiendo, por ejemplo, otro miembro a la clase) y compilamos [Link], el compilador Java se dar cuenta de que debe recompilar tanto [Link] como [Link] % javac -verbose [Link] [parsed [Link] in 710ms] [loaded C:\JAVA\BIN\..\classes\java\lang\[Link] in 220ms] [checking class pepe] [parsed .\\[Link] in 0ms] [wrote [Link]] [checking class Guitarra] [wrote .\\[Link]] [done in 2640ms] En el libro Just Java de Peter van der Linden hay un captulo excelente acerca del compilador de Java, si tienes oportunidad, no dejes de leerlo.

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 25 publicados, y si buscas "Progamming in Java" en la Red, encontrars 312 Web sites, y 30 ms dedicados a "Learning Java". Y si esto, evidentemente, no es el sustituto de un instructor humano, hay ya varias empresas que ofrecen enseanza de Java, entre ellas, Sun. 2. INSTALACIN DEL JDK Actualmente ya hay entornos de desarrollo integrados completos para Java, diferentes del JDK de Sun. Symantec dispone de un compilador de Java para Windows 95 y Windows NT, con las ventajas del aumento de velocidad de proceso y capacidades multimedia que esto proporciona, Symantec Caf. Borland tambin est trabajando en ello y la nueva versin de su entorno de desarrollo soporta Java. Sun ha lanzado la versin comercial de su propio entorno de desarrollo para Java, el Java Workshop, enteramente escrito en Java. Y Microsoft ha puesto en el mercado Visual J++, que sigue el estilo de todas sus herramientas de desarrollo. No obstante, trataremos solamente el JDK, que hasta el momento es lo ms conocido. 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. HotJava, es un navegador Web escrito completamente en Java. 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. Tan es as, que disponiendo del navegador Netscape 2.0 no se necesita ni

tan siquiera el JDK (a peticin de varios amigos que disfrutan del uso de Linux pero no disponen de soporte ELF para poder utilizar el JDK portado por Randy Chapman, les indicar como conseguir utilizar el compilador embebido en Netscape). 2.1 Windows La versin del JDK para Windows es un archivo autoextraible. Se necesitan alrededor de 6 Mb de espacio libre en disco. Ejecutar el fichero, que desempaquetar el contenido del archivo. El directorio donde se instale no es importante, pero supondremos que se instala en el raiz del disco C:, en cuyo caso los archivos colgarn de c:\java. Es necesario aadir c:\java\bin a la variable de entorno PATH. Adems de los ficheros java, el JDK incluye dos libreras dinmicas, [Link] y [Link], que se instalarn en el directorio de Java. Si tienes ninguna copia de estos ficheros en tu ordenador (probablemente en el directorio system de Windows) copia estos ficheros en el directorio c:\java\bin. Si estos ficheros ya estn en tu ordenador, elimina las copias extra que instala el JDK. 2.2 Solaris La versin del JDK para Solaris es un fichero tar comprimido. Se necesitan alrededor de 9 Mb de disco para descomprimir el JDK, aunque el doble de espacio sera una cifra ms cmoda. Ejecutar los siguientes comandos: % uncompress [Link].Z % tar xvf JDK-beta-solaris2-sparc-tar Puedes descomprimir el archivo en tu directorio home, o, si tienes privilegios de supervisor, en algn sitio ms conveniente de /usr/local para que todos los usuarios tengan acceso a los ficheros. Sin embargo, los privilegios del supervisor no son necesarios para instalar y ejecutar Java. Por simplicidad, supondr que has descomprimido el JDK en /usr/local, aunque el path completo donde se haga no tiene relevancia (tambin es posible colocarlo en /opt que es donde residen todas las aplicaciones de Solaris). Si lo has colocado en un sitio diferente, simplemente sustituye /usr/local por ese directorio (si lo has descomprimido en tu home, puedes utilizar ~/java y ~/hotjava, en vez del path completo). Es necesario aadir /usr/local/java/bin a la variable de entorno PATH. Utiliza el siguiente comando (suponiendo que tengas el shell csh o tcsh): set path=($PATH /usr/local/java/bin) Tambin puedes aadir esta lnea al final del fichero .profile y .cshrc, y ya tienes el sistema listo para ejecutar applets. Si quieres desembarazarte de la ventana que aparece cada vez que lances el appletviewer con la licencia de Sun, crea un directorio que se llame .hotjava en el directorio java/bin y ya no volvers a verla. 2.3 Linux Necesitas un kernel que soporte binarios ELF, por lo tanto tu Linux debe ser la versin 1.2.13 o superior, las anteriores tienen un bug que hacen que javac no funcione. Necesitas tambin Netscape, versin 2.0b4 o posterior. Sobre la

versin 1.2.13 del kernel de Linux, hay que seguir los pasos que indico para conseguir que JDK funcione:

Bajarse el JDK, [Link] y

[Link]-1.0 [Link] a /usr/local, descomprimirlo y hacer 'tar xvf'

En el fichero .java_wrapper (si no existe, crearlo) cambiar las variable J_HOME y PRG, para que queden como:

J_HOME=/usr/local/java PRG=/usr/local/java/bin

Bajarse la librera [Link] a /, descomprimirla, hacer 'tar xvf'. Asegurarse de que /lib/[Link].5 es un link simblico a este nuevo [Link] no lo es, hacer el /lib 'ln -s [Link].5.2.18 [Link].5' Bajarse [Link] a un directorio temporal, descomprimirlo y hacer 'tar xvf'. Ejecutar '[Link]' y eliminar el directorio temporal. Aadir /usr/local/java a la variable de entorno PATH. Si se desea que est fijada para todos los usuarios, incorporar el directorio a la varible PATH que se fija en el fichero /etc/profile. Bajarse [Link].z a usr/local/netscape, descomprimirlo y hacer 'tar xvf' Crear un link en /usr/local/bin a /usr/local/netscape/netscape

Esto debera ser suficiente para compilar cualquier cosa en Java/Linux. En caso de tener problemas, es el momento de recurrir a las FAQ. Siguiendo los pasos indicados ya se puede ejecutar el ejemplo del Tic-Tac-Toe que propone la hoja de instalacin que Sun ha incluido en todas sus versiones y que en Linux consistira en cambiarse al directorio de la demo: % cd /usr/local/java/demo/TicTacToe ejecutar el visualizador de applets sobre la pgina html: % appletviewer [Link] y a jugar a las tres en raya. Por cierto, que el algoritmo que usa el ordenador est falseado por lo que es posible ganarle. 2.4 Compilacin sin JDK

Parece raro, pero se puede conseguir. Lo nico necesario es el navegador Netscape 2.0. Este navegador, junto con la mquina virtual Java (JVM) y el sistema run-time, tiene un compilador Java. Si no se dispone del Java Development Kit (JDK), que no est disponible para todas las plataformas, pero s de la versin de Netscape para nuestra plataforma, aqu van los pasos a seguir para utilizar el compilador de Java embebido en Netscape. Como necesito partir de algn punto para tomarlo como referencia, voy a suponer que estamos sobre Linux y que vamos a prescindir del JDK de Randy Chapman. Lo que habra que hacer sera lo siguiente.

Primero. Instalar Netscape en el ordenador. Asegurarse de entender perfectamente y leerse hasta el final el fichero README, para seguir las instrucciones especficas de la instalacin de Netscape en la plataforma y que Netscape funcione perfectamente. En nuestro caso, en que vamos a intentar compilar cdigo Java con Netscape sobre Linux, la pieza clave es la situacin del fichero moz2_0.zip, que en mi mquina est en /usr/local/netscape/java/classes. Segundo. Extraer de una copia cualquiera del JDK (aunque sea de otra plataforma), el fichero java/lib/[Link] y guardarlo en el mismo sitio que el fichero moz2_0.zip; esta localizacin no es necesaria, pero simplifica la estructura. Tercero. Fijar la variable de entorno CLASSPATH para que Netscape pueda encontrar sus propias clases adems de las clases del Java de Sun. Asegurarse de incluir el "directorio actual", para poder compilar a la vez que se usan los ficheros .zip de Netscape y Sun. Por ejemplo:

setenv CLASSPATH .:/usr/local/netscape/java/classes/moz2_0.zip : /usr/local/netscape/java/classes/[Link]

Cuarto. Compilar el cdigo Java (applet o aplicacin) con el comando: netscape -java [Link] [fichero].java (sustituir el nombre del fichero con el cdigo Java en vez de [fichero]). Esto convertir el cdigo fuente Java en byte-code, generndose el archivo [fichero].class. Quinto. Comprobar si se puede ejecutar la aplicacin con el comando:

netscape -java [clase] (sustituir el nombre de la clase de la aplicacin -la que contiene la rutina mainen vez de [clase]).

Sexto. Si se ha compilado un applet Java, construir una pgina html que lo utilice para visualizarlo con el navegador en su forma normal. O tambin se puede visualizar utilizando el appletviewer, ejecutando:

netscape -java [Link] [clase] Desgraciadamente, la sentencia anterior no parece funcionar en todos los

sistemas. Hay amigos mos que no han sido capaces de visualizar applets con este mtodo. Para aprovechar el tiempo, se puede crear un script que recoja los pasos 3, 4 y 6. Si estamos utilizando el csh, el contenido del script sera: #/bin/csh -f setenv CLASSPATH .:/usr/local/netscape/java/classes/moz2_0.zip: /usr/local/netscape/java/classes/[Link] netscape -java [Link] $1 y lo almacenaramos como javac. Se ha de hacer el script ejecutable y cambiar /bin/csh por el path completo donde est situado el csh. De forma semejante podemos definir el intrprete java y el appletviewer, sustituyendo la lnea adecuada de llamada a Netscape. 3. CONCEPTOS BSICOS DE JAVA 3.1 Programacin en Java 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 new switch boolean default goto null synchronized break do if package this byte double implements private threadsafe byvalue else import protected throw case extends instanceof public transient catch false int return true char final interface short try class finally long static void const float native super while Palabras Reservadas Adems, el lenguaje se reserva unas cuantas palabras ms, pero que hasta ahora no tienen un cometido especfico. Son: cast future generic inner operator outer rest var 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 8 bits complemento a dos short 16 bits complemento a dos int 32 bits complemento a dos long 64 bits complemento a dos Por ejemplo: 21 077 0xDC00 Reales en coma flotante: float 32 bits IEEE 754 double 64 bits IEEE 754 Por ejemplo: 3.14 2e12 3.1E12 Booleanos: 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]; [Link]; /* 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( "Juan" ); nombres[1] = new String( "Pepe" ); nombres[2] = new String( "Pedro" ); nombres[3] = new String( "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: . [] () ++ -! ~ instanceof */% +<< >> >>> < > <= >= == != &^| && || ?: = op= (*= /= %= += -= etc.) , esperamos: Los operadores numricos se comportan como

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. 3.2 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( [Link] ); break; case 1: setColor( [Link] ); break; case 2: setColor( [Link] ); break; } [Link]( 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 } 3.3 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. 3.4 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(); } 3.5 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. 3.6 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. 3.7 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.

3.8 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. 3.9 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 ); 3.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. 3.11 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-y-pegar 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> } 3.12 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 { [Link]( "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 [Link] 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. 3.13 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: [Link], [Link], [Link], [Link] contienen en su cdigo la lnea: package [Link]; 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 [Link]; import [Link].*; 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: [Link] Este paquete contiene clases diseadas para usar con applets. Hay una clase Applet y tres interfaces: AppletContext, AppletStub y AudioClip. [Link] 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. [Link]

El paquete de entrada/salida contiene las clases de acceso a ficheros: FileInputStream y FileOutputStream. [Link] Este paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread, Exception, System, Integer, Float, Math, String, etc. [Link] Este paquete da soporte a las conexiones del protocolo TCP/IP y, adems, incluye las clases Socket, URL y URLConnection. [Link] 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). 3.14 Referencias Java se asemeja mucho a C y C++. Esta similitud, evidentemente intencionada, es la mejor herramienta para los programadores, ya que facilita en gran manera su transicin a Java. Desafortunadamente, tantas similitudes hacen que no nos paremos en algunas diferencias que son vitales. La terminologa utilizada en estos lenguajes, a veces es la misma, pero hay grandes diferencias subyacentes en su significado. C tiene tipos de datos bsicos y punteros. C++ modifica un poco este panorama y le aade los tipos referencia. Java tambin especifica sus tipos primitivos, elimina cualquier tipo de punteros y tiene tipos referencia mucho ms claros. Todo este maremgnum de terminologa provoca cierta consternacin, as que vamos a intentar aclarar lo que realmente significa. Conocemos ya ampliamente todos los tipos bsicos de datos: datos base, integrados, primitivos e internos; que son muy semejantes en C, C++ y Java; aunque Java simplifica un poco su uso a los desarrolladores haciendo que el chequeo de tipos sea bastante ms rgido. Adems, Java aade los tipos boolean y hace imprescindible el uso de este tipo booleano en sentencias condicionales. 4. PROGRAMAS BSICOS EN JAVA 4.1 Una mnima aplicacin en java 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[] ) { [Link]( "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 [Link] en el directorio en el que se compila la aplicacin. En nuestro caso, el compilador crear un fichero llamado [Link]. 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 ... [Link]( "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. Compilacion y Ejecucion de HolaMundo 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 [Link]. 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 [Link], se puede compilar con la lnea siguiente: %javac [Link] 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 [Link] 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). %[Link][Link] Method printl([Link]) not found in class [Link]. [Link]( "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 [Link] colocamos en vez de la declaracin actual de la clase HolaMundoApp, la lnea: class HolaMundoapp { se crear un fichero [Link], que es diferente del [Link], que es el nombre esperado de la clase; la diferencia se encuentra en la a minscula y mayscula. 4.2 El Visor de applets de Sun (appletviewer) El visualizador de applets (appletviewer) es una aplicacin que permite ver en funcionamiento applets, sin necesidad de la utilizacin de un navegador WorldWide-Web como HotJava, Microsoft Explorer o Nescape. En adelante, recurriremos muchas veces a l, ya que el objetivo del tutorial es el lenguaje Java.

Applet La definicin ms extendida de applet, muy bien resumida por Patrick Naughton, indica que un applet es "una pequea aplicacin accesible en un servidor Internet, que se transporta por la red, se instala automticamente y se ejecuta in situ como parte de un documento web". Claro que as la definicin establece el entorno (Internet, Web, etc.). En realidad, un applet es una aplicacin pretendidamente corta (nada impide que ocupe ms de un gigabyte, a no ser el pensamiento de que se va a transportar por la red y una mente sensata) basada en un formato grfico sin representacin independiente: es decir, se trata de un elemento a embeber en otras aplicaciones; es un componente en su sentido estricto. Un ejemplo en otro mbito de cosas podra ser el siguiente: Imaginemos una empresa, que cansada de empezar siempre a codificar desde cero, disea un formulario con los datos bsicos de una persona (nombre, direccin, etc.). Tal formulario no es un dilogo por s mismo, pero se podra integrar en dilogos de clientes, proveedores, empleados, etc. El hecho de que se integre esttica (embebido en un ejecutable) o dinmicamente (intrpretes, DLLs, etc.) no afecta en absoluto a la esencia de su comportamiento como componente con que construir dilogos con sentido autnomo. Pues bien, as es un applet. Lo que ocurre es que, dado que no existe una base adecuada para soportar aplicaciones industriales Java en las que insertar nuestras miniaplicaciones (aunque todo se andar), los applets se han construido mayoritariamente, y con gran acierto comercial (parece), como pequeas aplicaciones interactivas, con movimiento, luces y sonido... en Internet. Llamadas a Applets con appletviewer Un applet es una mnima aplicacin Java diseada para ejecutarse en un navegador Web. Por tanto, no necesita preocuparse por un mtodo main() ni en dnde se realizan las llamadas. El applet asume que el cdigo se est ejecutando desde dentro de un navegador. El appletviewer se asemeja al mnimo navegador. Espera como argumento el nombre del fichero html que debe cargar, no se le puede pasar directamente un programa Java. Este fichero html debe contener una marca que especifica el cdigo que cargar el appletviewer: <HTML> <APPLET CODE=[Link] WIDTH=300 HEIGHT=100> </APPLET> </HTML> El appletviewer crear un espacio de navegacin, incluyendo un rea grfica, donde se ejecutar el applet, entonces llamar a la clase applet apropiada. En el

ejemplo anterior, el appletviewer cargar una clase de nombre HolaMundo y le permitir trabajar en su espacio grfico. Arquitectura de appletviewer El appletviewer representa el mnimo interfaz de navegacin. En la figura se muestran los pasos que seguira appletviewer para presentarnos el resultado de la ejecucin del cdigo de nuestra clase. Esta es una visin simplificada del appletviewer. La funcin principal de esta aplicacin es proporcionar al usuario un objeto de tipo Graphics sobre el que dibujar, y varias funciones para facilitar el uso del objeto Graphics. Ciclo de vida de un Applet Cuando un applet se carga en el appletviewer, comienza su ciclo de vida, que pasara por las siguientes fases:

Se crea una instancia de la clase que controla el applet. En el ejemplo de la figura anterior, sera la clase HolaMundo.

El applet se incializa. El applet comienza a ejecutarse. El applet empieza a recibir llamadas. Primero recibe una llamada init (inicializar), seguida de un mensaje start (empezar) y paint (pintar). Estas llamadas pueden ser recibidas asncronamente. 4.3 Escribir Applets Java Para escribir applets Java, hay que utilizar una serie de mtodos, algunos de los cuales ya se hay sumariado al hablar de los mtodos del appletviewer, que es el visualizador de applets de Sun. Incluso para el applet ms sencillo necesitaremos varios mtodos. Son los que se usan para arrancar (start) y detener (stop) la ejecucin del applet, para pintar (paint) y actualizar (update) la pantalla y para capturar la informacin que se pasa al applet desde el fichero HTML a travs de la marca APPLET. init ( ) Esta funcin miembro es llamada al crearse el applet. Es llamada slo una vez. La clase Applet no hace nada en init(). Las clases derivadas deben sobrecargar este mtodo para cambiar el tamao durante su inicializacin, y cualquier otra inicializacin de los datos que solamente deba realizarse una vez. Deberan realizarse al menos las siguientes acciones: Carga de imgenes y sonido El resize del applet para que tenga su tamao correcto Asignacin de valores a las variables globales Por ejemplo: public void init() { if( width < 200 || height < 200 ) resize( 200,200 ); valor_global1 = 0; valor_global2 = 100; // cargaremos imgenes en memoria sin mostrarlas // cargaremos msica de fondo en memoria sin reproducirla } destroy ( ) Esta funcin miembro es llamada cuando el applet no se va a usar ms. La clase Applet no hace nada en este mtodo. Las clases derivadas deberan sobrecargarlo para hacer una limpieza final. Los applet multithread debern usar destroy() para "matar" cuanquier thread del applet que quedase activo. start ( ) Llamada para activar el applet. Esta funcin miembro es llamada cuando se visita el applet. La clase Applet no hace nada en este mtodo. Las clases derivadas deberan sobrecargarlo para comenzar una animacin, sonido, etc.

public void start() { estaDetenido = false; // comenzar la reproduccin de la msica [Link](); } Tambin se puede utilizar start() para eliminar cualquier thread que se necesite. stop ( ) Llamada para detener el applet. Se llama cuando el applet desaparece de la pantalla. La clase Applet no hace nada en este mtodo. Las clases derivadas deberan sobrecargarlo para detener la animacin, el sonido, etc. public void stop() { estaDetenido = true; if( /* se est reproduciendo msica? */ ) [Link](); } resize ( int width,int height ) El mtodo init() debera llamar a esta funcin miembro para establecer el tamao del applet. Puede utilizar las variables ancho y alto, pero no es necesario. Cambiar el tamao en otro sitio que no sea init() produce un reformateo de todo el documento y no se recomienda. En el navegador Netscape, el tamao del applet es el que se indica en la marca APPLET del HTML, no hace caso a lo que se indique desde el cdigo Java del applet. width Variable entera, su valor es el ancho definido en el parmetro WIDTH de la marca HTML del APPLET. Por defecto es el ancho del icono. height Variable entera, su valor es la altura definida en el parmetro HEIGHT de la marca HTML del APPLET. Por defecto es la altura del icono. Tanto width como height estn siempre disponibles para que se puede chequear el tamao del applet. Podemos retomar el ejemplo de init(): public void init() { if( width < 200 || height < 200 ) resize( 200,200 ); ... paint( Graphics g )

Se llama cada vez que se necesita refrescar el rea de dibujo del applet. La clase Applet simplemente dibuja una caja con sombreado de tres dimensiones en el rea. Obviamente, la clase derivada debera sobrecargar este mtodo para representar algo inteligente en la pantalla. Para repintar toda la pantalla cuando llega un evento Paint, se pide el rectngulo sobre el que se va a aplicar paint() y si es ms pequeo que el tamao real del applet se invoca a repaint(), que como va a hacer un update(), se actualizar toda la pantalla. Podemos utilizar paint() para imprimir nuestro mensaje de bienvenida: void public paint( Graphics g ) { [Link]( "Hola Java!",25,25 ); // Dibujaremos la imgenes que necesitemos } update( Graphics g ) Esta es la funcin que se llama realmente cuando se necesita actualizar la pantalla. La clase Applet simplemente limpia el rea y llama al mtodo paint(). Esta funcionalidad es suficiente en la mayora de los casos. De cualquier forma, las clases derivadas pueden sustituir esta funcionalidad para sus propsitos. Podemos, por ejemplo, utilizar update() para modificar selectivamente partes del rea grfica sin tener que pintar el rea completa: public void update( Graphics g ) { if( estaActualizado ) { [Link](); // garantiza la pantalla limpia repaint(); // podemos usar el mtodo padre: [Link]() } else // Informacin adicional [Link]( "Otra informacin",25,50 ); } repaint() A esta funcin se la debera llamar cuando el applet necesite ser repintado. No debera sobrecargarse, sino dejar que Java repinte completamente el contenido del applet. Al llamar a repaint(), sin parmetros, internamente se llama a update() que borrar el rectngulo sobre el que se redibujar y luego se llama a paint(). Como a repaint() se le pueden pasar parmetros, se puede modificar el rectngulo a repintar. getParameter ( String attr )

Este mtodo carga los valores parados al applet va la marca APPLET de HTML. El argumento String es el nombre del parmetro que se quiere obtener. Devuelve el valor que se le haya asignado al parmetro; en caso de que no se le haya asignado ninguno, devolver null. Para usar getParameter(), se define una cadena genrica. Una vez que se ha capturado el parmetro, se utilizan mtodos de cadena o de nmeros para convertir el valor obtenido al tipo adecuado. public void init() { String pv; pv = getParameter( "velocidad" ); if( pv == null ) velocidad = 10; else velocidad = [Link]( pv ); } getDocumentBase ( ) Indica la ruta http, o el directorio del disco, de donde se ha recogido la pgina HTML que contiene el applet, es decir, el lugar donde est la hoja en todo Internet o en el disco. getCodeBase ( ) Indica la ruta http, o el directorio del disco, de donde se ha cargado el cdigo bytecode que forma el applet, es decir, el lugar donde est el fichero .class en todo Internet o en el disco. print ( Graphics g ) Para imprimir en impresora, al igual que paint() se puede utilizar print(), que pintar en la impresora el mapa de bits del dibujo. 5. EL DEPURADOR DE JAVA - jdb El depurador de Java, jdb es un depurador de lnea de comandos, similar al que Sun proporciona en sus Sistemas, dbx. Es complicado de utilizar y un tanto crptico, por lo que, en principio, tiene escasa practicidad y es necesaria una verdadera emergencia para tener que recurrir a l. Trataremos por encima los comandos que proporciona el jdb, pero sin entrar en detalles de su funcionamiento, porque no merece la pena. Casi es mejor esperar a disponer de herramientas visuales para poder depurar con cierta comodidad nuestro cdigo Java. Para poder utilizar el depurador, las aplicaciones Java deben estar compiladas con la opcin de depuracin activada, -g. Posteriormente se puede lanzar appletviewer con la opcin de depuracin, debug, y habremos puesto en marcha jdb. 5.1 Depurar HolaMundo

Hemos modificado nuestro applet de ejemplo para utilizarlo en nuestra sesin de ejemplo con el depurador. Se compilara con el comando: %javac -g [Link] y el contenido de nuestro applet HolaMundo modificado y guardado en el fichero [Link] sera el siguiente: // // Applet HolaMundo de ejemplo, para depurar // import [Link]; import [Link]; public class hm extends Applet { int i; public void paint( Graphics g ) { i = 10; [Link]( "Hola Mundo!",25,25 ); } } Una vez compilado, iniciamos la sesin lanzando el visor de applets de Sun con la opcin de depuracin, utilizando el comando: %appletviewer -debug [Link] El fichero [Link] contiene las lneas mnimas para poder activar el applet, estas lneas son las que reproducimos: <html> <applet code=[Link] width=100 height=100> </applet> </html> Se inicia pues la sesin con el depurador y vamos a ir reproduciendo lo que aparece en la pantalla a medida que vamos introduciendo comandos: %appletviewer -debug [Link] Loading jdb... 0xee301bf0:class([Link]) > 5.2 Comando help El comando help proporciona una lista de los comandos que estn disponibles en la sesin de jdb. Esta lista es la que sigue, en donde hemos aprovechado la presencia de todos los comandos para comentar la accin que cada uno de ellos lleva a cabo.

>help ** command list ** threads [threadgroup] -- lista threads thread <thread id> -- establece el thread por defecto suspend [thread id(s)] -- suspende threads (por defecto, todos) resume [thread id(s)] -- contina threads (por defecto, todos) where [thread id]|all -- muestra la pila de un thread threadgroups -- lista los grupos de threads threadgroup <name> -- establece el grupo de thread actual print <id> [id(s)] -- imprime un objeto o campo dump <id> [id(s)] -- imprime toda la informacin del objeto locals -- imprime las variables locales de la pila actual classes -- lista las clases conocidas methods <class id> -- lista los mtodos de una clase stop in <class id>.<method> -- fija un punto de ruptura en un mtodo stop at <class id>:<line> -- establece un punto de ruptura en una lnea up [n frames] -- ascender en la pila de threads down [n frames] -- descender en la pila de threads clear <class id>:<line> -- eliminar un punto de ruptura step -- ejecutar la lnea actual cont -- continuar la ejecucin desde el punto de ruptura catch <class id> -- parar por la excepcin especificada ignore <class id> -- ignorar la excepcin especificada list [line number] -- imprimir cdigo fuente use [source file path] -- ver o cambiar la ruta del fichero fuente memory -- informe del uso de la memoria load <classname> - carga la clase Java a ser depurada run <args> - comienza la ejecucin de la clase cargada !! - repite el ltimo comando help (or ?) - lista los comandos exit (or quit) - salir del depurador > 5.3 Comando threadgroups

El comando threadgroups permite ver la lista de threads que se estn ejecutando. Los grupos system y main deberan estar siempre corriendo. >threadgroups 1.([Link])0xee300068 system 2.([Link])0xee300a98 main > 5.4 Comando threads El comando threads se utiliza para ver la lista completa de los threads que se estn ejecutando actualmente. >threads Group system: 1.([Link])0xee300098 clock handler cond 2.([Link])0xee300558 Idle thread run 3.([Link])0xee3005d0 sync Garbage Collector cond 4.([Link])0xee300620 Finalizer thread cond 5.([Link])0xee300a20 Debugger agent run 6.([Link])0xee300b58) Breakpoint handler cond Group main: 7.([Link])0xee300048 main suspended > 5.5 Comando run El comando run es el que se utiliza para arrancar el appletviewer en la sesin de depuracin. Lo teclearemos y luego volveremos a listar los threads que hay en ejecucin. >run run [Link] [Link] running... main[1]threads threads Group [Link]: 1.([Link])0xee3000c0 AWT-Motif running 2.([Link])0xee302ed0 ScreenUpdater cond. Waiting Group [Link]: 3.([Link])0xee302f38 Thread-6 cond. Waiting main[1]

El visor de applets de Sun aparecer en la pantalla y mostrar el conocido mensaje de saludo al Mundo. Ahora vamos a rearrancar el appletviewer con un punto de ruptura, para detener la ejecucin del applet, y podamos seguir mostrando los comandos disponibles en el jdb. main[1]exit %appletviewer -debug [Link] Loading jdb... 0xee3009c8:class([Link]) >stop in [Link] Breakpoint set in [Link] >run run [Link] [Link] running... Breakpoint hit: [Link]([Link]) AWT-Motif[1] 5.6 Comando where El comando where mostrar la pila de ejecucin del applet. AWT-Motif[1]where [1][Link]([Link]) [2][Link]([Link]) [3][Link]([Link] ) AWT-Motif[1] 5.7 Comando use El comando use nos informa del camino donde jdb va a buscar los ficheros fuentes que contienen el cdigo Java de las clases que se estn depurando. Por defecto, utilizar el camino que se especifique en la variable de entorno CLASSPATH. AWT-Motif[1]use /usr/local/java/classes: AWT-Motif[1] 5.8 Comando list El comando list mostrar el cdigo fuente actual al comienzo del punto de ruptura que hayamos fijado. AWT-Motif[1]list 9 public void paint( Graphics g ) { 10 => i = 10;

11 [Link]( "Hola Mundo!",25,25 ) ; 12 } 13 } AWT-Motif[1] 5.9 Comando dump El comando dump nos permitir ahora ver el valor del objeto g pasado desde el appletviewer. AWT-Motif[1]dump g g = ([Link].X11Graphics)0xee303df8 { int pData = 1342480 Color foreground = ([Link])0xee302378 Font font = ([Link])0xee302138 int originX = 0 int originY = 0 float scaleX = 1 float scaleY = 1 Image image = null } AWT-Motif[1] 5.10 Comando step El comando step nos porporciona el mtodo para ejecutar la lnea actual, que estar siendo apuntada por el indicador si hemos utilizado el comando list. AWT-Motif[1]step Breakpoint hit: [Link]([Link]) AWT-Motif[1]list 9 public void paint( Graphics g ) { 10 i = 10; 11 => [Link]( "Hola Mundo!",25,25 ); 12 } 13 } AWT-Motif[1] 6. AWT 6.1 Introduccin al AWT AWT es el acrnimo del X Window Toolkit para Java, donde X puede ser cualquier cosa: Abstract, Alternative, Awkward, Another o Asqueroso; aunque

parece que Sun se decanta por Abstracto, seriedad por encima de todo. Se trata de una biblioteca de clases Java para el desarrollo de Interfaces de Usuario Grficas. La versin del AWT que Sun proporciona con el JDK se desarroll en slo dos meses y es la parte ms dbil de todo lo que representa Java como lenguaje. El entorno que ofrece es demasiado simple, no se han tenido en cuenta las ideas de entornos grficos novedosos, sino que se ha ahondado en estructuras orientadas a eventos, llenas de callbacks y sin soporte alguno del entorno para la construccin grfica; veremos que la simple accin de colocar un dibujo sobre un botn se vuelve una tarea harto complicada. Quiz la presin de tener que lanzar algo al mercado haya tenido mucho que ver en la pobreza de AWT. JavaSoft, asegura que esto slo era el principio y que AWT ser multi-idioma, tendr herramientas visuales, etc. En fin, al igual que dicen los astrlogos, el futuro nos deparar muchas sorpresas. La estructura bsica del AWT se basa en Componentes y Contenedores. Estos ltimos contienen Componentes posicionados a su respecto y son Componentes a su vez, de forma que los eventos pueden tratarse tanto en Contenedores como en Componentes, corriendo por cuenta del programador (todava no hay herramientas de composicin visual) el encaje de todas las piezas, as como la seguridad de tratamiento de los eventos adecuados. Nada trivial. No obstante y pese a ello, vamos a abordar en este momento la programacin con el AWT para tener la base suficiente y poder seguir profundizando en las dems caractersticas del lenguaje Java, porque como vamos a ir presentando ejemplos grficos es imprescindible el conocimiento del AWT. Mientras tanto, esperemos que JavaSoft sea fiel a sus predicciones y lo que ahora veamos nos sirva de base para migrar a un nuevo y maravilloso AWT. 6.2 Interface de Usuario La interface de usuario es la parte del programa que permite a ste interactuar con el usuario. Las interfaces de usuario pueden adoptar muchas formas, que van desde la simple lnea de comandos hasta las interfaces grficas que proporcionan las aplicaciones ms modernas. La interface de usuario es el aspecto ms importante de cualquier aplicacin. Una aplicacin sin un interfaz fcil, impide que los usuarios saquen el mximo rendimiento del programa. Java proporciona los elementos bsicos para construir decentes interfaces de usuario a travs del AWT. Al nivel ms bajo, el sistema operativo transmite informacin desde el ratn y el teclado como dispositivos de entrada al programa. El AWT fue diseado pensando en que el programador no tuviese que preocuparse de detalles como controlar el movimiento del ratn o leer el teclado, ni tampoco atender a detalles como la escritura en pantalla. El AWT constituye una librera de clases orientada a objeto para cubrir estos recursos y servicios de bajo nivel. Debido a que el lenguaje de programacin Java es independiente de la plataforma en que se ejecuten sus aplicaciones, el AWT tambin es independiente de la plataforma en que se ejecute. El AWT proporciona un conjunto de herramientas para la construccin de interfaces grficas que tienen

una apariencia y se comportan de forma semejante en todas las plataformas en que se ejecute. Los elementos de interface proporcionados por el AWT estn implementados utilizando toolkits nativos de las plataformas, preservando una apariencia semejante a todas las aplicaciones que se creen para esa plataforma. Este es un punto fuerte del AWT, pero tambin tiene la desventaja de que una interface grfica diseada para una plataforma, puede no visualizarse correctamente en otra diferente. 6.3 Estructura del AWT La estructura de la versin actual del AWT podemos resumirla en los puntos que exponemos a continuacin:

Los Contenedores contienen Componentes, que son los controles bsicos No se usan posiciones fijas de los Componentes, sino que estn situados a travs de una disposicin controlada (layouts) El comn denominador de ms bajo nivel se acerca al teclado, ratn y manejo de eventos Alto nivel de abstraccin respecto al entorno de ventanas en que se ejecute la aplicacin (no hay reas cliente, ni llamadas a X, ni hWnds, etc.) La arquitectura de la aplicacin es dependiente del entorno de ventanas, en vez de tener un tamao fijo Es bastante dependiente de la mquina en que se ejecuta la aplicacin (no puede asumir que un dilogo tendr el mismo tamao en cada mquina) Carece de un formato de recursos. No se puede separar el cdigo de lo que es propiamente interface. No hay ningn diseador de interfaces (todava)

6.4 Componentes y Contenedores Una interface grfica est construida en base a elementos grficos bsicos, los Componentes. Tpicos ejemplos de estos Componentes son los botones, barras de desplazamiento, etiquetas, listas, cajas de seleccin o campos de texto. Los Componentes permiten al usuario interactuar con la aplicacin y proporcionar informacin desde el programa al usuario sobre el estado del programa. En el AWT, todos los Componentes de la interface de usuario son instancias de la clase Component o uno de sus subtipos. Los Componentes no se encuentran aislados, sino agrupados dentro de Contenedores. Los Contenedores contienen y organizan la situacin de los Componentes; adems, los Contenedores son en s mismos Componentes y como tales pueden ser situados dentro de otros Contenedores. Tambin contienen el cdigo necesario para el control de eventos, cambiar la forma del cursor o modificar el icono de la aplicacin. En el AWT, todos los Contenedores son instancias de la clase Container o uno de sus subtipos. Los Componentes deben circunscribirse dentro del Contenedor que los contiene. Esto hace que el anidamiento de Componentes (incluyendo Contenedores) en Contenedores crean rboles de elementos, comenzando con un Contenedor en la raiz del rbol y expandindolo en sus ramas. 7. GRAFICOS 7.1 Objetos Grficos

En pginas anteriores ya se ha mostrado cmo escribir applets, cmo lanzarlos y los fundamentos bsicos de la presentacin de informacin sobre ellos. Ahora, pues, querremos hacer cosas ms interesantes que mostrar texto; ya que cualquier pgina HTML puede mostrar texto. Para ello, Java proporciona la clase Graphics, que permite mostrar texto a travs del mtodo drawString(), pero tambin tiene muchos otros mtodos de dibujo. Para cualquier programador, es esencial el entendimiento de la clase Graphics, antes de adentrarse en el dibujo de cualquier cosa en Java. Esta clase proporciona el entorno de trabajo para cualquier operacin grfica que se realice dentro del AWT. Juega dos importantes papeles: por un lado, es el contexto grfico, es decir, contiene la informacin que va a afectar a todas las operaciones grficas, incluyendo los colores de fondo y texto, la fuente de caracteres, la localizacin y dimensiones del rectngulo en que se va a pintar, e incluso dispone de informacin sobre el eventual destino de las operaciones grficas (pantalla o imagen). Por otro lado, la clase Graphics proporciona mtodos que permiten el dibujo de primitivas, figuras y la manipulacin de fonts de caracteres y colores. Tambin hay clases para la manipulacin de imgenes, doble-buffering, etc. Para poder pintar, un programa necesita un contexto grfico vlido, representado por una instancia de la clase Graphics. Pero, como esta clase es abstracta, no se puede instanciar directamente; as que debemos crear un componente y pasarlo al programa como un argumento a los mtodos paint() o update(). Los dos mtodos anteriores, paint() y update(), junto con el mtodo repaint() son los que estn involucrados en la presentacin de grficos en pantalla. El AWT, para reducir el tiempo que necesitan estos mtodos para realizar el repintado en pantalla de grficos, tiene dos axiomas:

Primero, el AWT repinta solamente aquellos Componentes que necesitan ser repintados, bien porque estuviesen cubiertos por otra ventana o porque se pida su repintado directamente Segundo, si un Componente estaba tapado y se destapa, el AWT repinta solamente la porcin del Componente que estaba oculta

En la ejecucin del applet que aparece a continuacin, [Link], podemos observar como se realiza este proceso. Ignorar la zona de texto de la parte superior del applet de momento, y centrar la mirada en la parte coloreada. Utilizando otra ventana, tapar y destapar parte de la zona que ocupa el applet. Se observar que solamente el trozo de applet que estaba cubierto es el que se repinta. Yendo un poco ms all, solamente aquellos componentes que estn ocultos y se vuelvan a ver sern los que se repinten, sin tener en cuenta su posicin dentro de la jerarqua de componentes.

La pantalla en Java se incrementa de izquierda a derecha y de arriba hacia abajo, tal como muestra la figura:

Los pixels de la pantalla son pues: posicin 0 + ancho de la pantalla - 1. En los textos, el punto de insercin se encuentra en la lnea base de la primera letra. 7.2 Mtodos para Dibujos Vamos a presentar mtodos para dibujar varias figuras geomtricas. Como estos mtodos funcionan solamente cuando son invocados por una instancia vlida de la clase Graphics, su mbito de aplicacin se restringe a los componentes que se utilicen en los mtodos paint() y update(). Normalmente los mtodos de dibujo de primitivas grficas funcionan por pares: un mtodo pinta la figura normal y el otro pinta la figura rellena. drawLine( x1,y1,x2,y2 ) drawRect( x,y,ancho,alto ) fillRect( x,y,ancho,alto ) clearRect( x,y,[Link] ) drawRoundRect( x,y,ancho,alto,anchoArco,altoArco ) fillRoundRect( x,y,ancho,alto,anchoArco,altoArco )

draw3DRect( x,y,ancho,alto,boolean elevado ) fill3DRect( x,y,ancho,alto,boolean elevado ) drawOval( x,y,ancho,alto ) fillOval( x,y,ancho,alto ) drawArc( x,y,ancho,alto,anguloInicio,anguloArco ) fillArc( x,y,ancho,alto,anguloInicio,anguloArco ) drawPolygon( int[] puntosX,int[] puntosY[],numPuntos ) fillPolygon( int[] puntosX,int[] puntosY[],numPuntos ) drawString( string s,x,y ) drawChars( char data[],offset,longitud,x,y ) drawBytes( byte data[],offset,longitud,x,y ) copyArea( xSrc,ySrc,ancho,alto,xDest,yDest ) 7.3 Mtodos para Imagenes Los objetos Graphics pueden mostrar imgenes a travs del mtodo: drawImage( Image img,int x,int y,ImageObserver observador ); Hay que tener en cuenta que el mtodo drawImage() necesita un objeto Image y un objeto ImageObserver. Podemos cargar una imagen desde un fichero de dibujo (actualmente slo se soportan formatos GIF y JPEG) con el mtodo getImage(): Image img = getImage( getDocumentBase(),"[Link]" ); La forma de invocar al mtodo getImage() es indicando un URL donde se encuentre el fichero que contiene la imagen que queremos presentar y el nombre de ese fichero: getImage( URL directorioImagen,String ficheroImagen ); Un URL comn para el mtodo getImage() es el directorio donde est el fichero HTML. Se puede acceder a esa localizacin a travs del mtodo getDocumentBase() de la clase Applet, como ya se ha indicado. Normalmente, se realiza el getImage() en el mtodo init() del applet y se muestra la imagen cargada en el mtodo paint(), tal como se muestra en el ejemplo siguiente: public void init() { img = getImage( getDocumentBase(),"[Link]" ); } public void paint( Graphics g ) { [Link]( img,x,y,this ); }

En el applet [Link], podemos ver el ejemplo completo. Su ponemos en l la existencia del fichero "Imagenes/[Link]": import [Link].*; import [Link]; import [Link]; public class Imagen extends Applet { Imagen pepe; public void init() { pepe = getImage( getDocumentBase(),"Imagenes/[Link]" ); } public void paint( Graphics g ) { [Link]( pepe,25,25,this ); } } 7.4 Sonido en Java Java tambin posee mtodos predefinidos para reproducir sonido. El ordenador remoto no necesita tener un reproductor de audio; Java realizar la reproduccin (evidentemente, el ordenador remoto, en donde se ejecuta el applet, necesitar disponer de hardware de sonido). Reproduccin de sonido La forma ms fcil de reproducir sonido es a travs del mtodo play(): play( URL directorioSonido,String ficheroSonido ); o, simplemente: play( URL unURLdeSonido ); Un URL comn para el mtodo play() es el directorio donde est el fichero HTML. Se puede acceder a esa localizacin a travs del mtodo getDocumentBase() de la clase Applet: play( getDocumentBase(),"[Link]" ); para que esto funcione, el fichero de la clase y el fichero [Link] deberan estar en el mismo directorio. Reproduccin Repetitiva Se puede manejar el sonido como si de imgenes se tratara. Se pueden cargar y reproducir ms tarde. Para cargar un clip de sonido, se utiliza el mtodo getAudioClip(): AudoClip sonido; sonido = getAudioClip( getDocumentBase(),"[Link]" ); Una vez que se carga el clip de sonido, se pueden utilizar tres mtodos:

[Link](); para reproducir el clip de sonido. [Link](); para iniciar la reproduccin del clip de sonido y que entre en un blucle de reproduccin, es decir, en una repeticin automtica del clip. [Link](); para detener el clip de sonido que se encuentre en ese instante en reproduccin. 7.5 Entrada por Ratn Una de las caractersticas ms tiles que ofrece Java es el soporte directo de la interactividad. La aplicacin puede reaccionar a los cambios producidos en el ratn, por ejemplo, sin necesidad de escribir ninguna lnea de cdigo para su control, solamente indicando qu se quiere hacer cuando el ratn haga algo. El evento ms comn en el ratn es el click. Este evento es gobernado por dos mtodos: mouseDown() (botn pulsado) y mouseUp() (botn soltado). Ambos mtodos son parte de la clase Applet, pero se necesita definir sus acciones asociadas, de la misma forma que se realiza con init() o con paint(). 8. EXCEPCIONES EN JAVA 8.1 Manejo de Excepciones Vamos a mostrar como se utilizan las excepciones, reconvirtiendo nuestro applet de saludo a partir de la versin iterativa de [Link]: import [Link].*; import [Link]; public class HolaIte extends Applet { private int i = 0; private String Saludos[] = { "Hola Mundo!", "HOLA Mundo!", "HOLA MUNDO!!" }; public void paint( Graphics g ) { [Link]( 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 { [Link]( Saludos[i],25,25 ); } catch( ArrayIndexOutOfBoundsException e ) { [Link]( "Saludos desbordado",25,25 ); } catch( Exception e ) { // Cualquier otra excepcin [Link]( [Link]() ); } finally { [Link]( "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! 8.2 Generar Excepciones en Java 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 [Link] > java melon [Link]: / by zero at [Link]([Link]) 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. 8.3 Excepciones Predefinidas Las excepciones predefinidas y su jerarqua de clases es la que se muestra en la figura:

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 ) { [Link]( 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 [Link] class A { native void kk(); } y se llama a [Link](), cuando debera llamar a [Link](). 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.

8.4 Crear Excepciones Propias Tambin podemos lanzar nuestras propias excepciones, extendiendo la clase [Link]. 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 timeout: 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. 8.5 Capturar Excepciones Las excepciones lanzadas por un mtodo que pueda hacerlo deben recoger en bloque try/catch o try/finally. 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. 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. 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. 8.6 Propagacion 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. 9. Threads y Multithreading Considerando el entorno multithread, cada thread (hilo, flujo de control del programa) representa un proceso individual ejecutndose en un sistema. A veces se les llama procesos ligeros o contextos de ejecucin. Tpicamente, cada thread controla un nico aspecto dentro de un programa, como puede ser supervisar la entrada en un determinado perifrico o controlar toda la

entrada/salida del disco. Todos los threads comparten los mismos recursos, al contrario que los procesos en donde cada uno tiene su propia copia de cdigo y datos (separados unos de otros). Grficamente, los threads se parecen en su funcionamiento a lo que muestra la figura siguiente:

9.1 Flujo en Programas Programas de flujo nico Un programa de flujo nico o mono-hilvanado (single-thread) utiliza un nico flujo de control (thread) para controlar su ejecucin. Muchos programas no necesitan la potencia o utilidad de mltiples flujos de control. Sin necesidad de especificar explcitamente que se quiere un nico flujo de control, muchos de los applets y aplicaciones son de flujo nico. Programas de flujo mltiple En nuestra aplicacin de saludo, no vemos el thread que ejecuta nuestro programa. Sin embargo, Java posibilita la creacin y control de threads explcitamente. La utilizacin de threads en Java, permite una enorme flexibilidad a los programadores a la hora de plantearse el desarrollo de aplicaciones. La simplicidad para crear, configurar y ejecutar threads, permite que se puedan implementar muy poderosas y portables aplicaciones/applets que no se puede con otros lenguajes de tercera generacin. En un lenguaje orientado a Internet como es Java, esta herramienta es vital. Si se ha utilizado un navegador con soporte Java, ya se habr visto el uso de mltiples threads en Java. Habr observado que dos applet se pueden ejecutar al mismo tiempo, o que puede desplazarla pgina del navegador mientras el applet contina ejecutndose. Esto no significa que el applet utilice mltiples threads, sino que el navegador es multithreaded. Las aplicaciones (y applets) multithreaded utilizan muchos contextos de ejecucin para cumplir su trabajo. Hacen uso del hecho de que muchas tareas contienen subtareas distintas e independientes. Se puede utilizar un thread para cada subtarea. Mientras que los programas de flujo nico pueden realizar su tarea ejecutando las subtareas secuencialmente, un programa multithreaded permite que cada thread comience y termine tan pronto como sea posible. Este comportamiento presenta una mejor respuesta a la entrada en tiempo real. 9.2 Creacion y Control de threads Creacin de un Thread

Hay dos modos de conseguir threads en Java. Una es implementando la interface Runnable, la otra es extender la clase Thread. La implementacin de la interface Runnable es la forma habitual de crear threads. Las interfaces proporcionan al programador una forma de agrupar el trabajo de infraestructura de una clase. Se utilizan para disear los requerimientos comunes al conjunto de clases a implementar. La interface define el trabajo y la clase, o clases, que implementan la interface realizan ese trabajo. Los diferentes grupos de clases que implementen la interface tendrn que seguir las mismas reglas de funcionamiento. Hay una cuantas diferencias entre interface y clase. Primero, una interface solamente puede contener mtodos abstractos y/o variables estticas y finales (constantes). Las clases, por otro lado, pueden implementar mtodos y contener variables que no sean constantes. Segundo, una interface no puede implementar cualquier mtodo. Una clase que implemente una interface debe implementar todos los mtodos definidos en esa interface. Una interface tiene la posibilidad de poder extenderse de otras interfaces y, al contrario que las clases, puede extenderse de mltiples interfaces. Adems, una interface no puede ser instanciada con el operador new; por ejemplo, la siguiente sentencia no est permitida: Runnable a = new Runnable(); // No se permite El primer mtodo de crear un thread es simplemente extender la clase Thread: class MiThread extends Thread { public void run() { ... } El ejemplo anterior crea una nueva clase MiThread que extiende la clase Thread y sobrecarga el mtodo [Link]() por su propia implementacin. El mtodo run() es donde se realizar todo el trabajo de la clase. Extendiendo la clase Thread, se pueden heredar los mtodos y variables de la clase padre. En este caso, solamente se puede extender o derivar una vez de la clase padre. Esta limitacin de Java puede ser superada a travs de la implementacin de Runnable: public class MiThread implements Runnable { Thread t; public void run() { // Ejecucin del thread una vez creado } } En este caso necesitamos crear una instancia de Thread antes de que el sistema pueda ejecutar el proceso como un thread. Adems, el mtodo abstracto run() est definido en la interface Runnable tiene que ser implementado. La nica diferencia entre los dos mtodos es que este ltimo es mucho ms flexible. En el ejemplo anterior, todava tenemos oportunidad de extender la clase MiThread,

si fuese necesario. La mayora de las clases creadas que necesiten ejecutarse como un thread , implementarn la interface Runnable, ya que probablemente extendern alguna de su funcionalidad a otras clases. No pensar que la interface Runnable est haciendo alguna cosa cuando la tarea se est ejecutando. Solamente contiene mtodos abstractos, con lo cual es una clase para dar idea sobre el diseo de la clase Thread. De hecho, si vemos los fuentes de Java, podremos comprobar que solamente contiene un mtodo abstracto: package [Link]; public interface Runnable { public abstract void run() ; } Y esto es todo lo que hay sobre la interface Runnable. Como se ve, una interface slo proporciona un diseo para las clases que vayan a ser implementadas. En el caso de Runnable, fuerza a la definicin del mtodo run(), por lo tanto, la mayor parte del trabajo se hace en la clase Thread. Un vistazo un poco ms profundo a la definicin de la clase Thread nos da idea de lo que realmente est pasando: public class Thread implements Runnable { ... public void run() { if( tarea != null ) [Link]() ; } } ... } De este trocito de cdigo se desprende que la clase Thread tambin implemente la interface Runnable. [Link]() se asegura de que la clase con que trabaja (la clase que va a ejecutarse como un thread) no sea nula y ejecuta el mtodo run() de esa clase. Cuando esto suceda, el mtodo run() de la clase har que corra como un thread. Arranque de un Thread Las aplicaciones ejecutan main() tras arrancar. Esta es la razn de que main() sea el lugar natural para crear y arrancar otros threads. La lnea de cdigo: t1 = new TestTh( "Thread 1",(int)([Link]()*2000) ); crea un nuevo thread. Los dos argumentos pasados representan el nombre del thread y el tiempo que queremos que espere antes de imprimir el mensaje. Al tener control directo sobre los threads, tenemos que arrancarlos explcitamente. En nuestro ejemplo con: [Link]();

start(), en realidad es un mtodo oculto en el thread que llama al mtodo run(). Manipulacin de un Thread Si todo fue bien en la creacin del thread, t1 debera contener un thread vlido, que controlaremos en el mtodo run(). Una vez dentro de run(), podemos comenzar las sentencias de ejecucin como en otros programas. run() sirve como rutina main() para los threads; cuando run() termina, tambin lo hace el thread. Todo lo que queramos que haga el thread ha de estar dentro de run(), por eso cuando decimos que un mtodo es Runnable, nos obliga a escribir un mtodo run(). En este ejemplo, intentamos inmediatamente esperar durante una cantidad de tiempo aleatoria (pasada a travs del constructor): sleep( retardo ); El mtodo sleep() simplemente le dice al thread que duerma durante los milisegundos especificados. Se debera utilizar sleep() cuando se pretenda retrasar la ejecucin del thread. sleep() no consume recursos del sistema mientras el thread duerme. De esta forma otros threads pueden seguir funcionando. Una vez hecho el retardo, se imprime el mensaje "Hola Mundo!" con el nombre del thread y el retardo. Suspensin de un Thread Puede resultar til suspender la ejecucin de un thread sin marcar un lmite de tiempo. Si, por ejemplo, est construyendo un applet con un thread de animacin, querr permitir al usuario la opcin de detener la animacin hasta que quiera continuar. No se trata de terminar la animacin, sino desactivarla. Para este tipo de control de thread se puede utilizar el mtodo suspend(). [Link](); Este mtodo no detiene la ejecucin permanentemente. El thread es suspendido indefinidamente y para volver a activarlo de nuevo necesitamos realizar una invocacin al mtodo resume(): [Link](); Parada de un Thread El ltimo elemento de control que se necesita sobre threads es el mtodo stop(). Se utiliza para terminar la ejecucin de un thread: [Link](); Esta llamada no destruye el thread, sino que detiene su ejecucin. La ejecucin no se puede reanudar ya con [Link](). Cuando se desasignen las variables que se usan en el thread, el objeto thread (creado con new) quedar marcado para eliminarlo y el garbage collector se encargar de liberar la memoria que utilizaba. En nuestro ejemplo, no necesitamos detener explcitamente el thread. Simplemente se le deja terminar. Los programas ms complejos necesitarn un control sobre cada uno de los threads que lancen, el mtodo stop() puede utilizarse en esas situaciones.

Si se necesita, se puede comprobar si un thread est vivo o no; considerando vivo un thread que ha comenzado y no ha sido detenido. [Link](); Este mtodo devolver true en caso de que el thread t1 est vivo, es decir, ya se haya llamado a su mtodo run() y no haya sido parado con un stop() ni haya terminado el mtodo run() en su ejecucin. 9.3 Estados de un thread Durante el ciclo de vida de un thread, ste se puede encontrar en diferentes estados. La figura siguiente muestra estos estados y los mtodos que provocan el paso de un estado a otro. Este diagrama no es una mquina de estados finita, pero es lo que ms se aproxima al funcionamiento real de un thread .

Nuevo Thread Cuando un thread est en este estado, es simplemente un objeto Thread vaco. El sistema no ha destinado ningn recurso para l. Desde este estado solamente puede arrancarse llamando al mtodo start(), o detenerse definitivamente, llamando al mtodo stop(); la llamada a cualquier otro mtodo carece de sentido y lo nico que provocar ser la generacin de una excepcin de tipo IllegalThreadStateException. Ejecutable La llamada al mtodo start() crear los recursos del sistema necesarios para que el thread puede ejecutarse, lo incorpora a la lista de procesos disponibles para ejecucin del sistema y llama al mtodo run() del thread. En este momento nos encontramos en el estado "Ejecutable" del diagrama. Y este estado es Ejecutable y no En Ejecucin, porque cuando el thread est aqu no esta corriendo. Muchos ordenadores tienen solamente un procesador lo que hace imposible que todos los threads estn corriendo al mismo tiempo. Java implementa un tipo de scheduling o lista de procesos, que permite que el procesador sea compartido entre todos los procesos o threads que se encuentran en la lista. Sin embargo, para nuestros propsitos, y en la mayora de los casos, se puede considerar que este estado es realmente un estado "En Ejecucin", porque la impresin que produce ante nosotros es que todos los procesos se ejecutan al mismo tiempo.

Cuando el thread se encuentra en este estado, todas las instrucciones de cdigo que se encuentren dentro del bloque declarado para el mtodo run(), se ejecutarn secuencialmente. Parado El thread entra en estado "Parado" cuando alguien llama al mtodo suspend(), cuando se llama al mtodo sleep(), cuando el thread est bloqueado en un proceso de entrada/salida o cuando el thread utiliza su mtodo wait() para esperar a que se cumpla una determinada condicin. Cuando ocurra cualquiera de las cuatro cosas anteriores, el thread estar Parado. Para cada una de los cuatro modos de entrada en estado Parado, hay una forma especfica de volver a estado Ejecutable. Cada forma de recuperar ese estado es exclusiva; por ejemplo, si el thread ha sido puesto a dormir, una vez transcurridos los milisegundos que se especifiquen, l solo se despierta y vuelve a estar en estado Ejecutable. Llamar al mtodo resume() mientras est el thread durmiendo no servira para nada. Los mtodos de recuperacin del estado Ejecutable, en funcin de la forma de llegar al estado Parado del thread, son los siguientes:

Si un thread est dormido, pasado el lapso de tiempo Si un thread est suspendido, luego de una llamada al mtodo resume() Si un thread est bloqueado en una entrada/salida, una vez que el comando E/S concluya su ejecucin Si un thread est esperando por una condicin, cada vez que la variable que controla esa condicin vare debe llamarse a notify() o notifyAll()

Muerto Un thread se puede morir de dos formas: por causas naturales o porque lo maten (con stop()). Un thread muere normalmente cuando concluye de forma habitual su mtodo run(). Por ejemplo, en el siguiente trozo de cdigo, el bucle while es un bucle finito -realiza la iteracin 20 veces y termina-: El mtodo isAlive() La interface de programacin de la clase Thread incluye el mtodo isAlive(), que devuelve true si el thread ha sido arrancado (con start()) y no ha sido detenido (con stop()). Por ello, si el mtodo isAlive() devuelve false, sabemos que estamos ante un "Nuevo Thread" o ante un thread "Muerto". Si nos devuelve true, sabemos que el thread se encuentra en estado "Ejecutable" o "Parado". No se puede diferenciar entre "Nuevo Thread" y "Muerto", ni entre un thread "Ejecutable" o "Parado". 9.4 Comunicacion entre threads Otra clave para el xito y la ventaja de la utilizacin de mltiples threads en una aplicacin, o aplicacin multithreaded, es que pueden comunicarse entre s. Se pueden disear threads para utilizar objetos comunes, que cada thread puede manipular independientemente de los otros threads.

El ejemplo clsico de comunicacin de threads es un modelo productor/consumidor. Un thread produce una salida, que otro thread usa (consume), sea lo que sea esa salida. Vamos entonces a crear un productor, que ser un thread que ir sacando caracteres por su salida; crearemos tambin un consumidor que ira recogiendo los caracteres que vaya sacando el productor y un monitor que controlar el proceso de sincronizacin entre los threads. Funcionar como una tubera, insertando el productor caracteres en un extremos y leyndolos el consumidor en el otro, con el monitor siendo la propia tubera.

[Link] NATIVOS Un mtodo nativo es un mtodo Java (una instancia de un objeto o una clase) cuya implementacin se ha realizado en otro lenguaje de programacin, por ejemplo, C. Vamos a ver cmo se integran mtodos nativos en clases Java. Actualmente, el lenguaje Java solamente proporciona mecanismos para integrar cdigo C en programas Java. Veamos pues los pasos necesarios para mezclar cdigo nativo C y programas Java. Recurriremos (Cmo no!) a nuestro saludo; en este caso, el programa HolaMundo tiene dos clases Java: la primera implementa el mtodo main() y la segunda, HolaMundo, tiene un mtodo nativo que presenta el mensaje de saludo. La implementacin de este segundo mtodo la realizaremos en C. 10.1 Escribir Cdigo Java En primer lugar, debemos crear una clase Java, HolaMundo, que declare un mtodo nativo. Tambin debemos crear el programa principal que cree el objeto HolaMundo y llame al mtodo nativo. Las siguientes lneas de cdigo definen la clase HolaMundo, que consta de un mtodo y un segmento esttico de cdigo: class HolaMundo { public native void presentaSaludo(); static { [Link]( "hola" ); } }

Podemos decir que la implementacin del mtodo presentaSaludo() de la clase HolaMundo est escrito en otro lenguaje, porque la palabra reservada native aparece como parte de la definicin del mtodo. Esta definicin, proporciona solamente la definicin para presentaSaludo() y no porporciona ninguna implementacin para l. La implementacin la proporcionaremos desde un fichero fuente separado, escrito en lenguaje C. La definicin para presentaSaludo() tambin indica que el mtodo es un mtodo pblico, no acepta argumentos y no devuelve ningn valor. Al igual que cualquier otro mtodo, los mtodos nativos deben estar definidos dentro de una clase Java. El cdigo C que implementa el mtodo presentaSaludo() debe ser compilado en una librera dinmica y cargado en la clase Java que lo necesite. Esta carga, mapea la implementacin del mtodo nativo sobre su definicin. El siguiente bloque de cdigo carga la librera dinmica, en este caso hola. El sistema Java ejecutar un bloque de cdigo esttico de la clase cuando la cargue. Todo el cdigo anterior forma parte del fichero [Link], que contiene la clase HolaMundo. En un fichero separado, [Link], vamos a crear una aplicacin Java que instancie a la clase HolaMundo y llame al mtodo nativo presentaSaludo(). class Main { public static void main( String args[] ) { new HolaMundo().presentaSaludo(); } } Como se puede observar, llamamos al mtodo nativo del mismo modo que a cualquier otro mtodo Java; aadimos el nombre del mtodo al final del nombre del objeto con un punto ("."). El conjunto de parntesis que sigue al nombre del mtodo encierra los argumentos que se le pasen. En este caso, el mtodo presentaSaludo() no recibe ningn tipo de argumento. 10.2 Compilar el Cdigo Java Utilizaremos ahora el compilador javac para compilar el cdigo Java que hemos desarrollado. Compilaremos los dos ficheros fuentes de cdigo Java que hemos creado, tecleando los siguientes comandos: > javac [Link] > javac [Link] 10.3 Crear el Fichero de Cabecera Ahora debemos utilizar la aplicacin javah para conseguir el fichero de cabecera .h. El fichero de cabecera define una estructura que representa la clase HolaMundo sobre cdigo C y proporciona la definicin de una funcin C para la implementacin del mtodo nativo presentaSaludo() definido en ese clase. Ejecutamos javah sobre la clase HolaMundo, con el siguiente comando: > javah HolaMundo

Por defecto, javah crear el nuevo fichero .h en el mismo directorio en que se encuentra el fichero .class, obtenido al compilar con javac el cdigo fuente Java correspondiente a la clase. El fichero que crear, ser un fichero de cabecera del mismo nombre que la clase y con extensin .h. Por ejemplo, el comando anterior habr creado el fichero HolaMundo.h, cuyo contenido ser el siguiente: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <native.h> /* Header for class HolaMundo */ #ifndef _Included_HolaMundo #define _Included_HolaMundo typedef struct ClassHolaMundo { char PAD; /* ANSI C requires structures to have a least one member */ } ClassHolaMundo; HandleTo(HolaMundo); #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) void HolaMundo_presentaSaludo(struct HHolaMundo *); #ifdef __cplusplus } #endif #endif Este fichero de cabecera contiene la definicin de una estructura llamada ClassHolaMundo. Los miembros de esta estructura son paralelos a los miembros de la clase Java correspondiente; es decir, los campos en la estructura corresponden a las variables de la clase. Pero como HolaMundo no tiene ninguna variable, la estructura se encuentra vaca. Se pueden utilizar los miembros de la estructura para referenciar a variables instanciadas de la clase desde las funciones C. Adems de la estructura C similar a la clase Java, vemos que la llamada de la funcin C est declarada como: extern void HolaMundo_presentaSaludo( struct HHolaMundo *); Esta es la definicin de la funcin C que deberemos escribir para implementar el mtodo nativo presentaSaludo() de la clase HolaMundo. Debemos utilizar esa definicin cuando lo implementemos. Si HolaMundo llamase a otros mtodos nativos, las definiciones de las funciones tambin apareceran aqu. El nombre de la funcin C que implementa el mtodo nativo est derivado del nombre del paquete, el nombre de la clase y el nombre del mtodo nativo. As, el mtodo nativo presentaSaludo() dentro de la clase HolaMundo es

HolaMundo_presentaSaludo(). En este ejemplo, no hay nombre de paquete porque HolaMundo se considera englobado dentro del paquete por defecto. La funcin C acepta un parmetro, aunque el mtodo nativo definido en la clase Java no acepte ninguno. Se puede pensar en este parmetro como si fuese la variable this de C++. En nuestro caso, ignoramos el parmetro this. 10.4 Crear el Fichero de stubs Volvemos a utilizar la aplicacin javah para crear el fichero de stubs, que contiene todas las declaraciones de mtodos, con sus llamadas y argumentos, listos para que nosotros rellenemos el cuerpo de los mtodos con los algoritmos que necesitemos implementar. Proporciona la unin entre la clase Java y su estructura C paralela. Para generar este fichero, debemos indicar el parmetro .stubs al ejecutar la aplicacin javah sobre la clase HolaMundo, de la siguiente forma: > javah -stubs HolaMundo Del mismo modo que se generaba el fichero .h; el nombre del fichero de stubs ser el nombre de la clase con la extensin .c. En nuestro ejemplo, ser HolaMundo.c, y su contenido ser el siguiente: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <StubPreamble.h> /* Stubs for class HolaMundo */ /* SYMBOL: "HolaMundo/presentaSaludo()V", Java_HolaMundo_presentaSaludo_stub */ __declspec(dllexport) stack_item *Java_HolaMundo_presentaSaludo_stub(stack_item *_P_,struct execenv *_EE_) { extern void HolaMundo_presentaSaludo(void *); (void) HolaMundo_presentaSaludo(_P_[0].p); return _P_; } 10.5 Escribir la funcion C Escribiremos la funcin C para el mtodo nativo en un fichero fuente de cdigo C. La implementacin ser una funcin habitual C, que luego integraremos con la clase Java. La definicin de la funcin C debe ser la misma que la que se ha generado con javah en el fichero HolaMundo.h. La implementacin que proponemos la guardaremos en el fichero HolaImp.c, y contendr las siguientes lnea de cdigo: #include <StubPreamble.h> #include "HolaMundo.h> #include <stdio.h>

void HolaMundo_presentaSaludo( struct HHolaMundo *this ) { printf( "Hola Mundo, desde el Tutorial de Java\n" ); return; } Como se puede ver, la implementacin no puede ser ms sencilla: hace una llamada a la funcin printf() para presentar el saludo y sale. En el cdigo se incluyen tres ficheros de cabecera: StubsPreamble.h Proporciona la informacin para que el cdigo C pueda interactuar con el sistema Java. Cuando se escriben mtodos nativos, siempre habr que incluir este fichero en el cdigo fuente C. HolaMundo.h Es el fichero de cabecera que hemos generado para nuestra clase. Contiene la estructura C que representa la clase Java para la que estamos escribiendo el mtodo nativo y la definicin de la funcin para ese mtodo nativo. stdio.h Es necesario incluirlo porque utilizamos la funcin printf() de la librera estndar de C, cuya declaracin se encuentra en este fichero de cabecera. 10.6 Crear la Libreria Dinmica Utilizaremos el compilador C para compilar el fichero .h, el fichero de stubs y el fichero fuente .c; para crear una librera dinmica. Para crearla, utilizaremos el compilador C de nuestro sistema, haciendo que los ficheros HolaMundo.c y HolaImp.c generen una librera dinmica de nombre hola, que ser la que el sistema Java cargue cuando ejecute la aplicacin que estamos construyendo. Vamos a ver cmo generamos esta librera en Unix y en Windows '95. Unix Teclearemos el siguiente comando: % cc -G HolaMundo.c HolaImp.c -o [Link] En caso de que no encuentre el compilador los ficheros de cabecera, se puede utilizar el flag -I para indicarle el camino de bsqueda, por ejemplo: % cc -G -I$JAVA_HOME/include HolaMundo.c HolaImp.c -o [Link] donde $JAVA_HOME es el directorio donde se ha instalado la versin actual del Java Development Kit. Windows '95 El comando a utilizar en este caso es el siguiente: [Link] c:\>cl HolaMundo.c HolaImp.c -[Link] -MD -LD

Este comando funciona con Microsoft Visual C++ 2.x y posteriores. Si queremos indicar al compilador donde se encuentran los ficheros de cabecera y las libreras, tendremos que fijar dos variables de entorno: c:\>SET INCLUDE=%JAVAHOME%\include;%INCLUDE% c:\>SET LIB=%JAVAHOME%\lib;%LIB% donde %JAVAHOME% es el directorio donde se ha instalado la versin actual del Java Development Kit. 10.7 Ejecutar el Programa Y, por fin, utilizaremos el intrprete de Java, java, para ejecutar el programa que hemos construido siguiendo todos los pasos anteriormente descritos. Si tecleamos el comando: > java Main obtendremos el resultado siguiente: % Hola Mundo, desde el Tutorial de Java Si no aparece este mensaje de saludo y lo que aparece en pantalla son expresiones como UnsatisfiedLinkError, es porque no tenemos fijado correctamente el camino de la librera dinmica que hemos generado. Este camino es la lista de directorios que el sistema Java utilizar para buscar las libreras que debe cargar. Debemos asegurarnos de que el directorio donde se encuentra nuestra librera hola recin creada, figura entre ellos. Si fijamos el camino correcto y ejecutamos de nuevo el programa, veremos que ahora s obtenemos el mensaje de saludo que esperbamos. Con ello, hemos visto como integrar cdigo C en programas Java. Quedan muchas cuestiones por medio, como la equivalencia de tipos entre Java y C, el paso de parmetros, el manejo de cadenas, etc. Pero eso supondra entrar en mucha ms profundidad dentro de Java de la que aqu pretendemos (por ahora). 11. 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. 11.1 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

[Link] implementa stdin como una instancia de la clase InputStream. Con [Link], 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 [Link] 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 [Link] implementa stderr de la misma forma que stdout. Como con [Link], se tiene acceso a los mtodos de PrintStream. Vamos a ver un pequeo ejemplo de entrada/salida en Java. El cdigo siguiente, [Link], reproduce, o funciona como la utilidad cat de Unix o type de DOS: import [Link].*; class miType { public static void main( String args[] ) throws IOException { int c; int contador = 0; while( (c = [Link]() ) != '\n' ) { contador++; [Link]( (char)c ); } [Link](); // Lnea en blanco [Link]( "Contados "+ contador +" bytes en total." ); } } 11.2 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 12. FICHEROS EN JAVA 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. 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. 12.1 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. 12.2 Ficheros de Acceso Aleatorio A menudo, no se desea leer un fichero de principio a fin; sino acceder al fichero como una base de datos, donde se salta de un registro a otro; cada uno en diferentes partes del fichero. Java proporciona una clase RandomAccessFile para este tipo de entrada/salida. Creacin de un Fichero de Acceso Aleatorio

Hay dos posibilidades para abrir un fichero de acceso aleatorio: Con el nombre del fichero: miRAFile = new RandomAccessFile( String nombre,String modo ); Con un objeto File: miRAFile = new RandomAccessFile( File fichero,String modo ); El argumento modo determina si se tiene acceso de slo lectura (r) o de lectura/escritura (r/w). Por ejemplo, se puede abrir un fichero de una base de datos para actualizacin: RandomAccessFile miRAFile; miRAFile = new RandomAccessFile( "/tmp/[Link]","rw" ); Acceso a la Informacin Los objetos RandomAccessFile esperan informacin de lectura/escritura de la misma manera que los objetos DataInput/DataOutput. Se tiene acceso a todas las operaciones read() y write() de las clases DataInputStream y DataOutputStream. Tambin se tienen muchos mtodos para moverse dentro de un fichero: long getFilePointer(); Devuelve la posicin actual del puntero del fichero void seek( long pos ); Coloca el puntero del fichero en una posicin determinada. La posicin se da como un desplazamiento en bytes desde el comienzo del fichero. La posicin 0 marca el comienzo de ese fichero. long length(); Devuelve la longitud del fichero. La posicin length() marca el final de ese fichero. Actualizacin de Informacin Se pueden utilizar ficheros de acceso aleatorio para aadir informacin a ficheros existentes: miRAFile = new RandomAccessFile( "/tmp/[Link]","rw" ); [Link]( [Link]() ); // Cualquier write() que hagamos a partir de este punto del cdigo // aadir informacin al fichero Vamos a ver un pequeo ejemplo, [Link], que aade una cadena a un fichero existente: import [Link].*; // Cada vez que ejecutemos este programita, se incorporara una nueva // linea al fichero de log que se crea la primera vez que se ejecuta

// // class Log { public static void main( String args[] ) throws IOException { RandomAccessFile miRAFile; String s = "Informacion a incorporar\nTutorial de Java\n"; // Abrimos el fichero de acceso aleatorio miRAFile = new RandomAccessFile( "/tmp/[Link]","rw" ); // Nos vamos al final del fichero [Link]( [Link]() ); // Incorporamos la cadena al fichero [Link]( s ); // Cerramos el fichero [Link](); } } 13. COMUNICACIONES EN JAVA 13.1 Modelo de Comunicaciones con Java En Java, crear una conexin socket TCP/IP se realiza directamente con el paquete [Link]. A continuacin mostramos un diagrama de lo que ocurre en el lado del cliente y del servidor:

El modelo de sockets ms simple es: El servidor establece un puerto y espera durante un cierto tiempo (timeout segundos), a que el cliente establezca la conexin. Cuando el cliente solicite una conexin, el servidor abrir la conexin socket con el mtodo accept().

El cliente establece una conexin con la mquina host a travs del puerto que se designe en puerto# . El cliente y el servidor se comunican con manejadores InputStream y OutputStream. Hay una cuestin al respecto de los sockets, que viene impuesta por la implementacin del sistema de seguridad de Java. Actualmente, los applets slo pueden establecer conexiones con el nodo desde el cual se transfiri su cdigo. Esto est implementado en el JDK y en el intrprete de Java de Netscape. Esto reduce en gran manera la flexibilidad de las fuentes de datos disponibles para los applets. El problema si se permite que un applet se conecte a cualquier mquina de la red, es que entonces se podran utilizar los applets para inundar la red desde un ordenador con un cliente Netscape del que no se sospecha y sin ninguna posibilidad de rastreo. 13.2 Clases Utiles en Comunicaciones Vamos a exponer otras clases que resultan tiles cuando estamos desarrollando programas de comunicaciones, aparte de las que ya se han visto. El problema es que la mayora de estas clases se prestan a discusin, porque se encuentran bajo el directorio sun. Esto quiere decir que son implementaciones Solaris y, por tanto, especficas del Unix Solaris. Adems su API no est garantizada, pudiendo cambiar. Pero, a pesar de todo, resultan muy interesantes y vamos a comentar un grupo de ellas solamente que se encuentran en el paquete [Link]. Socket Es el objeto bsico en toda comunicacin a travs de Internet, bajo el protocolo TCP. Esta clase proporciona mtodos para la entrada/salida a travs de streams que hacen la lectura y escritura a travs de sockets muy sencilla. ServerSocket Es un objeto utilizado en las aplicaciones servidor para escuchar las peticiones que realicen los clientes conectados a ese servidor. Este objeto no realiza el servicio, sino que crea un objeto Socket en funcin del cliente para realizar toda la comunicacin a travs de l. DatagramSocket La clase de sockets datagrama puede ser utilizada para implementar datagramas o fiables (sockets UDP), no ordenados. Aunque la comunicacin por estos sockets es muy rpida porque no hay que perder tiempo estableciendo la conexin entre cliente y servidor. DatagramPacket Clase que representa un paquete datagrama conteniendo informacin de paquete, longitud de paquete, direcciones Internet y nmeros de puerto. MulticastSocket Clase utilizada para crear una versin multicast de las clase socket datagrama. Mltiples clientes/servidores pueden transmitir a un grupo multicast (un grupo de direcciones IP compartiendo el mismo nmero de puerto). NetworkServer

Una clase creada para implementar mtodos y variables utilizadas en la creacin de un servidor TCP/IP. NetworkClient Una clase creada para implementar mtodos y variables utilizadas en la creacin de un cliente TCP/IP. SocketImpl Es un Interface que nos permite crearnos nuestro propio modelo de comunicacin. Tendremos que implementar sus mtodos cuando la usemos. Si vamos a desarrollar una aplicacin con requerimientos especiales de comunicaciones, como pueden se la implementacin de un cortafuegos (TCP es un protocolo no seguro), o acceder a equipos especiales (como un lector de cdigo de barras o un GPS diferencial), necesitaremos nuestra propia clase Socket. 14. ARQUITECTURA Modelo/Vista/Controlador La arquitectura MVC (Model/View/Controller) fue introducida como parte de la versin Smalltalk-80 del lenguaje de programacin Smalltalk. Fue diseada para reducir el esfuerzo de programacin necesario en la implementacin de sistemas mltiples y sincronizados de los mismos datos. Sus caractersticas principales son que el Modelo, las Vistas y los Controladores se tratan como entidades separadas; esto hace que cualquier cambio producido en el Modelo se refleje automticamente en cada una de las Vistas. Adems del programa ejemplo que hemos presentado al principio y que posteriormente implementaremos, este modelo de arquitectura se puede emplear en sistemas de representacin grfica de datos, como se ha citado, o en sistemas CAD, en donde se presentan partes del diseo con diferente escala de aumento, en ventanas separadas. En la figura siguiente, vemos la arquitectura MVC en su forma ms general. Hay un Modelo, mltiples Controladores que manipulan ese Modelo, y hay varias Vistas de los datos del Modelo, que cambian cuando cambia el estado de ese Modelo.

Este modelo de arquitectura presenta varias ventajas: Hay una clara separacin entre los componentes de un programa; lo cual nos permite implementarlos por separado. Hay un API muy bien definido; cualquiera que use el API, podr reemplazar el Modelo, la Vista o el Controlador, sin aparente dificultad.

La conexin entre el Modelo y sus Vistas es dinmica; se produce en tiempo de ejecucin, no en tiempo de compilacin. Al incorporar el modelo de arquitectura MVC a un diseo, las piezas de un programa se pueden construir por separado y luego unirlas en tiempo de ejecucin. Si uno de los Componentes, posteriormente, se observa que funciona mal, puede reemplazarse sin que las otras piezas se vean afectadas. Este escenario contrasta con la aproximacin monoltica tpica de muchos programas Java. Todos tienen un Frame que contiene todos los elementos, un controlador de eventos, un montn de clculos y la presentacin del resultado. Ante esta perspectiva, hacer un cambio aqu no es nada trivial. 14.1 Definicin de las partes El Modelo es el objeto que representa los datos del programa. Maneja los datos y controla todas sus transformaciones. El Modelo no tiene conocimiento especfico de los Controladores o de las Vistas, ni siquiera contiene referencias a ellos. Es el propio sistema el que tiene encomendada la responsabilidad de mantener enlaces entre el Modelo y sus Vistas, y notificar a las Vistas cuando cambia el Modelo. La Vista es el objeto que maneja la presentacin visual de los datos representados por el Modelo. Genera una representacin visual del Modelo y muestra los datos al usuario. Interacta con el Modelo a travs de una referencia al propio Modelo. El Controlador es el objeto que proporciona significado a las ordenes del usuario, actuando sobre los datos representados por el Modelo. Cuando se realiza algn cambio, entra en accin, bien sea por cambios en la informacin del Modelo o por alteraciones de la Vista. Interacta con el Modelo a travs de una referencia al propio Modelo. Vamos a mostrar un ejemplo concreto. Consideremos como tal el sistema descrito en la introduccin a este captulo, una pieza geomtrica en tres dimensiones, que representamos en la figura siguiente:

En este caso, la pieza central de la escena en tres dimensiones es el Modelo. El Modelo es una descripcin matemtica de los vrtices y las caras que componen la escena. Los datos que describen cada vrtice o cara pueden modificarse (quizs como resultado de una accin del usuario, o una distorsin de la escena, o un algoritmo de sombreado). Sin embargo, no tiene nocin del punto de vista, mtodo de presentacin, perspectiva o fuente de luz. El Modelo es una representacin pura de los elementos que componen la escena. La porcin del programa que transforma los datos dentro del Modelo en una presentacin grfica es la Vista. La Vista incorpora la visin del Modelo a la

escena; es la representacin grfica de la escena desde un punto de vista determinado, bajo condiciones de iluminacin determinadas. El Controlador sabe que puede hacer el Modelo e implementa el interface de usuario que permite iniciar la accin. En este ejemplo, un panel de datos de entrada es lo nico que se necesita, para permitir aadir, modificar o borrar vrtices o caras de la figura. Trabajo enviado por: Lucas email: lucas[arroba][Link]

definicion de java

El Entorno de Programacin Java es un proyecto de la compaa Sun Microsystems que presenta una posible aproximacin a lo que sern los lenguajes de programacin de los prximos aos. Sus objetivos se resumen en dotar de herramientas de programacin adecuadas para desarrollar aplicaciones que se ejecuten en entornos heterogneos, conectados a travs de redes de comunicaciones. Estas aplicaciones deben ser eficientes, podrn crecer dinmicamente, en funcin de las necesidades, y sern operativas en una gran variedad de ordenadores. Los principales resultados del proyecto Java son:

* Se ha desarrollado un nuevo lenguaje de programacin, denominado Java, que utiliza desarrollo orientado a objetos. Su sintaxis est basada en C++ (para simplificar el aprendizaje), pero elimina la mayora de los aspectos oscuros de este lenguaje: se elimina el preprocesador de C, los typedefs, las funciones, y los punteros (casi todo lo heredado de C). El programador de Java exclusivamente puede utilizar desarrollo orientado a objetos; no existen las funciones, salvo como mtodos de acceso a una clase. Las variables siempre estn incluidas dentro de clases, para favorecer la encapsulacin del cdigo.

Sus libreras de objetos predefinidas (el equivalente a las libreras de funciones) proporcionan herramientas para las comunicaciones a travs de la red, diseo de interfaces de usuario,

* El programador queda liberado del manejo de memoria, que tantos problemas produce en lenguajes como C. Los objetos obtienen un espacio de almacenamiento durante su creacin, que es recuperado automticamente cuando se destruyen. Las aplicaciones Java pueden tener varias lneas de ejecucin (threads) concurrente. La multitarea por threads est implementada en el propio lenguaje. * Se ha modificado el proceso tradicional de compilacin. Los programas Java se compilan y traducen a un formato denominado bytecodes un formato intermedio de representacin de las aplicaciones, que es independiente de la arquitectura del ordenador y de su sistema operativo. Para ejecutar aplicaciones Java en cualquier sistema, es necesario disponer de un software que interprete los bytecodes (un runtime de Java); sin embargo, el cdigo de las aplicaciones es siempre el mismo. Con Java se pueden desarrollar aplicaciones completas independientes (al estilo de los entornos de programacin tradicionales), o bien applets, mdulos que pueden ser insertados en otra aplicacin (por ejemplo, en un cliente Web), para realizar una funcin concreta. En cualquier caso, se dispone de la capacidad de incorporar mdulos (objetos) dinmicamente, a travs de una red de comunicaciones, sin necesidad de repetir el proceso de enlazado de la aplicacin global. Los dos ltimos puntos constituyen uno de los aspectos ms novedosos de Java. Cualquier sistema que disponga de un runtime de Java es capaz de ejecutar sus aplicaciones. Por tanto, la nica parte dependiente de la mquina es este mdulo, que se desarrolla y optimiza en funcin de sus caractersticas. La posibilidad de incorporar dinmicamente objetos a una aplicacin activa elimina muchos de los problemas derivados de actualizar software, ya que se puede disponer de un servidor central de aplicaci ones, del que se recogen mdulos a medida que se necesitan.

____________________________________________________________________ DEFINICION DE JAVA

Un programa java es una coleccion de clases. Algunas clases se escriben y algunas forman parte del lenguaje java. Un programa java debe contener un metodo estatido denominado main (). La evolucin de la tecnologa informtica de la ltima dcada ha sido espectacular: ordenadores cada vez ms rpidos, con enormes cantidades de memoria, redes de comunicaciones que permiten intercambios de informacin con cualquier lugar del mundo, aplicaciones cada vez ms fciles y potentes Sin embargo, desde el punto de vista de la programacin, las cosas no han cambiado demasiado; los principales problemas de un programador de nuestros das se pueden resumir en los siguientes puntos: * Los lenguajes de programacin no han evolucionado al mismo ritmo que la potencia de los ordenadores; se dispone de herramientas ms potentes, sobre todo en la generacin de interfaces de usuario, pero estn lejos de las necesidades reales de un programador. Se necesita aumentar la capacidad de abstraccin y mejorar la reutilizacin del cdigo desarrollado. * Las herramientas de depuracin de cdigo disponibles no son capaces de dar soluciones adecuadas cuando el tamao y la complejidad de los programas crecen. Se producen muchos errores, y stos son difciles de localizar. Las tecnologas orientadas a objetos, utilizadas en lenguajes como C++, Ada o Visual Basic, son una posible solucin, pero a menudo son difciles de utilizar, ya que es necesario un cambio en la mentalidad del programador. * Las redes informticas de empresas y centros de investigacin estn basadas, cada vez en mayor medida, en entornos heterogneos, con sistemas operativos y herramientas de programacin muy diversas. El esfuerzo de portar una aplicacin entre diferentes entornos es casi tan grande como el de reescribirla de nuevo. * Las aplicaciones basadas en sistemas centralizados son todava muy utilizadas. Sin embargo, la descentralizacin de los puestos de trabajo, y la demanda de mayor potencia de clculo slo tiene una respuesta: el uso de varios sistemas informticos que colaboran en un fin comn. * El mantenimiento de las aplicaciones instaladas en un sistema heterogneo y distribuido es muy costosa, ya que implica operaciones de desarrollo, instalacin y recompilacin de programas, dependientes de cada entorno, que siempre producen efectos difciles de prever.

HISTORIA DE JAVA
Java es un lenguaje de programacin orientado a objetos desarrollado por Sun Microsystems a principio de los aos 90s. En Diciembre de 1950 Patrick Naughton, ingeniero de Sun Microsystems, reclut a varios colegas entre ellos James Gosling y Mike Sheridan para trabajar sobre un nuevo proyecto conocido como "El proyecto verde". Con la ayuda de otros ingenieros, empezaron a trabajar en una pequea oficina en Sand Hill Road en Menlo Park, California. Y as interrumpi todas las comunicaciones regulares con Sun y trabaj sin descanso durante 18 meses. Intentaban desarrollar una nueva tecnologa para programar la siguiente generacin de dispositivos inteligentes, en los que Sun vea un campo nuevo a explorar. Crear un lenguaje de programacin fcil de aprender y de usar. En un principio se consideraba C++ como lenguaje a utilizar, pero tanto Gosling como Bill Joy lo encontraron inadecuado. Gosling intent primero extender y modificar C++ resultando el lenguaje C++ ++ - (++ - porque se aadan y eliminaban caractersticas a C++), pero lo abandon para crear un nuevo lenguaje desde cero al que llamo Oak (roble en ingls, segn la versin mas aceptada, por el roble que vea atravs de la ventana de su despacho). El resultado fue un lenguaje que tena similitudes con C, C++ y Objetive C y que no estaba ligado a un tipo de CPU concreta. Mas tarde, se cambiara el nombre de Oak a Java, por cuestiones de propiedad intelectural, al existir ya un lenguaje con el nombre de Oak. Se supone que le pusieron ese nombre mientras tomaban caf (Java es nombre de un tipo de caf, originario de Asia), aunque otros afirman que el nombre deriva de las siglas de James Gosling, Arthur Van Hoff, y Andy Bechtolsheim. En Agosto de 1991 Oak ya corra sus primeros programas. Para 1992, el equipo ya haba desarrollado un sistema en un prototipo llamado Star7 (*7), dispositivo parecido a una PDA, cuyo nombre vena de la combinacin de teclas del telfono de la oficina del Proyecto Green que permita a los usuarios responder al telfono desde cualquier lugar. Por su parte, el presidente de la compaa Sun, Scott McNealy, se dio cuenta de forma oportuna y estableci el Proyecto Verde como una subsidiaria de Sun. Despus de mostrar a Scott McNealy y Bill Joy los prototipos de bajo nivel del sistema, continun con el desarrollo, incluyendo sistema operativo, Green OS; el lenguaje Oak, las libreras, alguna aplicacin bsica y el hardware, hasta que el 3 de septiembre de 1992 se termina el desarrollo y con ello el Proyecto Verde. De 1993 a 1994, el equipo de Naughton se lanz en busca de nuevas oportunidades en el mercado, mismas que se fueron dando mediante el sistema operativo base. La incipiente subsidiaria fracas en sus intentos de ganar una oferta con Time-Warner, sin embargo el equipo concluy que el mercado para consumidores electrnicos smart y las cajas Set-Up en particular, no eran del todo eficaces. La subsidiaria Proyecto verde fue amortizada por la compaa Sun a mediados de 1994. Afortunadamente, el cese del Proyecto Verde coincidi con el nacimiento del fenmeno mundial WEB. Al examinar las dinmicas de Internet, lo realizado por el ex equipo verde se adecuaba a este nuevo ambiente. Patrick Naughton procedi a la construccin del lenguaje de programacin Java que se accionaba con un browser prototipo. El 29 de septiembre de 1994 se termina el desarrollo del

prototipo de HotJava. Cuando se hace la demostracin a los ejecutivos de Sun, esta vez, se reconoce el potencial de Java y se acepta el proyecto. Con el paso del tiempo HotJava se convirti en un concepto prctico dentro del lenguaje Java y demostr que podra proporcionar multiplataformas para que el cdigo pueda ser bajado y corrido del Host del World Wide Web y que de otra forma no son seguros. Una de las caractersticas de HotJava fue su soporte para los "applets", que son las partes de Java que pueden ser cargadas mediante una red de trabajo para despus ejecutarlo localmente y as lograr soluciones dinmicas en computacin acordes al rpido crecimiento del ambiente WEB. El 23 de mayo de 1995, en la conferencia SunWorld `95, John Gage, de Sun Microsystems, y Marc Andreessen, cofundador y vicepresidente de Netscape, anunciaban la versin alpha de Java, que en ese momento solo corra en Solaris, y el hecho de que Java iba a ser incorporado en Netscape Navigator, el navegador mas utilizado de Internet. Con la segunda alpha de Java en Julio, se aade el soporte para Windows NT y en la tercera, en Agosto, para Windows 95. En enero de 1995 Sun form la empresa Java Soft para dedicarse al desarrollo de productos basados en la tecnologas Java, y as trabajar con terceras partes para crear aplicaciones, herramientas, sistemas de plataforma y servicios para aumentar las capacidades del lenguaje. Ese mismo mes aparece la versin 1.0 del JDK. Netscape Communications decide apoyar a Java applets en Netscape Navigator 2.0. Ese fue el factor clave que lanz a Java a ser conocido y famoso. Y como parte de su estrategia de crecimiento mundial y para favorecer la promocin de la nueva tecnologa, Java Soft otorg permisos para otras compaas para que pudieran tener acceso al cdigo fuente y al mismo tiempo mejorar sus navegadores. Tambin les permita crear herramientas de desarrollo para programacin Java y los facultaba para acondicionar mquinas virtuales Java (JVM), a varios sistemas operativos. Muy pronto las licencias o permisos contemplaban prestigiosas firmas como: IBM, Microsoft, Symantec, Silicon Graphics, Oracle, Toshiba y Novell. Los apples Java (basados en JDK 1.02) son apoyados por los dos ms populares navegadores web (Nestcape Navigator 3.0 y Microsoft Internet Explorer 3.0 . I.B.M./Lotus, Computer Asociates, Symantec, Informix, Oracle, Sybase y otras poderosas empresas de software estn construyendo Software 100% puro JAVA, por ejemplo el Corel Office que actualmente est en versin Beta. Los nuevos proyectos de Java son co-patrocinados por cientos de millones de dlares en capital disponible de recursos tales como la Fundacin Java, un fondo comn de capital formado el verano pasado por 11 compaas, incluyendo Cisco Systems, IBM, Netscape y Oracle. Hoy en da, puede encontrar la tecnologa Java en redes y dispositivos que comprenden desde Internet y superordenadores cientifcos hasta porttiles y telfonos mviles; desde simuladores de mercado en Wall Street hasta juegos de uso domstico y tarjetas de crdito: Java est en todas partes.

Versiones del lenguaje Java


VERSIONES DE JAVA:

JDK 1.0 (23 de enero de 1996) JDK 1.1 (19 de febrero de 1997). Una reestructuracin intensiva del modelo de eventos AWT (Abstract Windowing Toolkit), clases internas (inner classes), JavaBeans, JDBC (Java Database Connectivity), para la integracin de bases de datos, RMI (Remote Method Invocation). J2SE 1.2 (8 de dieciembre de 1998 - Nombre clave Playground. Esta y las siguientes versiones fueron recogidas bajo la denominacin Java 2 y el nombre "J2SE" (Java 2 Platform, Standard Edition), reemplaz a JDK para distinguir la plataforma base de J2EE (Java 2 Platform, Enterprise Edition) y J2ME (Java 2 Platform, Micro Edition). La palabra reservada (keyword) strictfp. Reflexin en la programacin. La API grfica ( Swing) fue integrada en las clases bsicas. La mquina virtual (JVM) de Sun fue equipada con un compilador JIT (Just in Time) por primera vez. Java Plug-in. Java IDL, una implementacin de IDL (Interfaz para Descripcin de Lenguaje) para la interoperabilidad con CORBA Colecciones (Collections) 2SE 1.3 (8 de mayo de 2000) - Nombre clave Kestrel. La inclusin de la mquina virtual de HotSpot JVM (la JVM de HotSpot fue lanzada inicialmente en abril de 1999, para la JVM de J2SE 1.2) RMI fue cambiado para que se basara en CORBA. JavaSound Se incluy el Java Naming and Directory Interface (JNDI) en el paquete de libreras principales (anteriormente disponible como una extensin). Java Platform Debugger Architecture (JPDA) J2SE 1.4 (6 de febrero de 2002) - Nombre Clave Merlin. Este fue el primer lanzamiento de la plataforma Java desarrollado bajo el Proceso de la Comunidad Java como JSR 59. Los cambios ms notables fueron: comunicado de prensalista completa de cambios. Palabra reservada assert (Especificado en JSR 41.) Expresiones regulares modeladas al estilo de las expresiones regulares Perl. Encadenacin de excepciones Permite a una excepcin encapsular la excepcin de bajo nivel original. Non-blocking NIO (New Input/Output) (Especificado en JSR 51.) Logging API (Specified in JSR 47.) API I/O para la lectura y escritura de imgenes en formatos como JPEG o PNG Parser XML integrado y procesador XSLT (JAXP) (Especificado en JSR 5 y JSR 63.) Seguridad integrada y extensiones criptogrficas (JCE, JSSE, JAAS) Java Web Start incluido (El primer lanzamiento ocurri en Marzo de 2001 para J2SE 1.3) (Especificado en JSR 56.) J2SE 5.0 (30 de septiembre de 2004) - Nombre clave: Tiger. (Originalmente numerado 1.5, esta notacin an es usada internamente.[4]) Desarrollado bajo JSR 176, Tiger aadi un nmero significativo de nuevas caractersticas comunicado de prensa. Plantillas (genricos) - provee conversion de tipos (type safety) en tiempo de compilacin para colecciones y elimina la necesidad de la mayora de conversion de tipos (type casting). (Especificado por JSR 14.) Metadatos - tambin llamados anotaciones, permite a estructuras del lenguaje como las clases o los mtodos, ser etiquetados con datos adicionales, que puedan ser procesados posteriormente por utilidades de proceso de metadatos. (Especificado por JSR 175.)

Autoboxing/unboxing - Conversiones automticas entre tipos primitivos (Como los int) y clases de envoltura primitivas (Como Integer). (Especificado por JSR 201.) Enumeraciones - la palabra reservada enum crea una typesafe, lista ordenada de valores (como [Link], [Link], etc.). Anteriormente, esto solo poda ser llevado a cabo por constantes enteras o clases construidas manualmente (enum pattern). (Especificado por JSR 201.) Varargs (nmero de argumentos variable) - El ltimo parmetro de un mtodo puede ser declarado con el nombre del tipo seguido por tres puntos (e.g. void drawtext(String... lines)). En la llamada al mtodo, puede usarse cualquier nmero de parmetros de ese tipo, que sern almacenados en un array para pasarlos al metodo. Bucle for mejorado - La sintaxis para el bucle for se ha extendido con una sintaxis especial para iterar sobre cada miembro de un array o sobre cualquier clase que implemente Iterable, como la clase estndar Collection, de la siguiente forma: void displayWidgets (Iterable widgets) { for (Widget w : widgets) { [Link](); } } Este ejemplo itera sobre el objeto Iterable widgets, asignando, en orden, cada uno de los elementos a la variable w, y llamando al mtodo display() de cada uno de ellos. (Especificado por JSR 201.) Java SE 6 (11 de diciembre de 2006) - Nombre clave Mustang. Estuvo en desarrollo bajo la JSR 270. En esta versin, Sun cambi el nombre "J2SE" por Java SE y elimin el ".0" del nmero de versin.[5]. Est disponible en [Link] Los cambios ms importantes introducidos en esta versin son: Incluye un nuevo marco de trabajo y APIs que hacen posible la combinacin de Java con lenguajes dinmicos como PHP, Python, Ruby y JavaScript. Incluye el motor Rhino, de Mozilla, una implementacin de Javascript en Java. Incluye un cliente completo de Servicios Web y soporta las ltimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP. Mejoras en la interfaz grfica y en el rendimiento. Java SE 7 - Nombre clave Dolphin. En el ao 2006 an se encontraba en las primeras etapas de planificacin. Se espera que su desarrollo d comienzo en la primavera de 2006, y se estima su lanzamiento para 2008. Soporte para XML dentro del propio lenguaje Un nuevo concepto de superpaquete Soporte para closures Introduccin de anotaciones estndar para detectar fallos en el software.

Adems de los cambios en el lenguaje, con el paso de los aos se han efectuado muchos ms cambios dramticos en la librera de clases de Java (Java class library) que ha crecido de unos pocos cientos de clases en JDK 1.0 hasta ms de tres mil en J2SE 5.0. APIs completamente nuevas, como Swing y Java2D, han sido introducidas y muchos de los mtodos y clases originales de JDK 1.0 estn desaprobados.

Los elementos del lenguaje Java


Introduccin

Identificadores

Comentarios Sentencias Bloques de cdigo Expresiones Variables Los tipos bsicos de datos Las cadenas de caractares o strings Palabras reservadas

La sintxis de un lenguaje define los elementos de dicho lenguaje y cmo se combinan para formar un programa. Los elementos tpicos de cualquier lenguaje son los siguientes:

Identificadores: los nombres que se dan a las variables Tipos de datos Palabras reservadas: las palabras que utiliza el propio lenguaje Sentencias Bloques de cdigo Comentarios Expresiones Operadores

A lo largo de las pginas que siguen examinaremos en detalle cada uno de estos elementos.

Identificadores
Un identificador es un nombre que identifica a una variable, a un mtodo o funcin miembro, a una clase. Todos los lenguajes tienen ciertas reglas para componer los identificadores:

Todos los identificadores han de comenzar con una letra, el carcter subrayado ( _ ) o el carcter dollar ( $ ). Puede incluir, pero no comenzar por un nmero No puede incluir el carcter espacio en blanco Distingue entre letras maysculas y minsculas No se pueden utilizar las plabras reservadas como identificadores

Adems de estas restricciones, hay ciertas convenciones que hacen que el programa sea ms legible, pero que no afectan a la ejecucin del programa. La primera y fundamental es la de encontrar un nombre que sea significativo, de modo que el programa sea lo ms legible posible. El tiempo que se pretende ahorrar eligiendo nombres cortos y poco significativos se pierde con creces cuando se revisa el programa despus de cierto tiempo. Tipo de identificador nombre de una clase nombre de funcin nombre de variable nombre de constante Convencin Comienza por letra mayscula comienza con letra minscula comienza por letra minscula En letras maysculas Ejemplo String, Rectangulo, CinematicaApplet calcularArea, getValue, setColor area, color, appletSize PI, MAX_ANCHO

Comentarios
Un comentario es un texto adicional que se aade al cdigo para explicar su funcionalidad, bien a otras personas que lean el programa, o al propio autor como recordatorio. Los comentarios son una parte importante de la documentacin de un programa. Los comentarios son ignorados por el compilador, por lo que no incrementan el tamao del archivo ejecutable; se pueden por tanto, aadir libremente al cdigo para que pueda entenderse mejor. La programacin orientada a objetos facilita mucho la lectura del cdigo, por lo que lo que no se precisa hacer tanto uso de los comentarios como en los lenguajes estructurados. En Java existen tres tipos de comentarios

Comentarios en una sola lnea Comentarios de varias lneas Comentarios de documentacin

Como podemos observar un comentario en varias lneas es un bloque de texto situado entre el smbolo de comienzo del bloque /*, y otro de terminacin del mismo */. Teniendo encuentra este hecho, los programadores disean comentarios como el siguiente:
/*--------------------------------| | (C) Angel Franco Garca | | fecha: Marzo 1999 | | programa: [Link] | |---------------------------------*/

Los comentarios de documentacin es un bloque de texto situado entre el smbolo de comienzo del bloque /**, y otro de terminacin del mismo */. El programa javadoc utiliza estos comentarios para generar la documentacin del cdigo.
/** Este es el primer programa de una serie dedicada a explicar los fundamentos del lenguaje Java */

Habitualmente, usaremos comentarios en una sola lnea //, ya que no tiene el inconveniente de aprendernos los smbolos de comienzo y terminacin del bloque, u olvidarnos de poner este ltimo, dando lugar a un error en el momento de la compilacin. En la ventana de edicin del Entorno Integrado de Desarrollo (IDE) los comentarios se distinguen del resto del cdigo por el color del texto.
public class PrimeroApp{ public static void main(String[] args) { //imprime un mensaje [Link]("El primer programa"); } }

Un procedimiento elemental de depuracin de un programa consiste en anular ciertas sentencias de un programa mediante los delimitadores de comentarios. Por ejemplo, se puede modificar el programa y anular la sentencia que imprime el mensaje, poniendo delante de ella el delimitador de comentarios en una sola lnea.
//[Link]("El primer programa");

Al correr el programa, observaremos que no imprime nada en la pantalla. La sentencia [Link]() imprime un mensaje en la consola, una ventana DOS que se abre en el escritorio de Windows 95. La funcin println tiene un slo argumento una cadena de caracteres u objeto de la clase String.

Sentencias
Una sentencia es una orden que se le da al programa para realizar una tarea especfica, esta puede ser: mostrar un mensaje en la pantalla, declarar una variable (para reservar espacio en memoria), inicializarla, llamar a una funcin, etc. Las sentencias acaban con ;. este carcter separa una sentencia de la siguiente. Normalmente, las sentencias se ponen unas debajo de otras, aunque sentencias cortas pueden colocarse en una misma lnea. He aqu algunos ejemplos de sentencias
int i=1; import [Link].*; [Link]("El primer programa"); [Link](10, 20);

En el lenguaje Java, los caracteres espacio en blanco se pueden emplear libremente. Como podremos ver en los sucesivos ejemplos, es muy importante para la legibilidad de

un programa la colocacin de unas lneas debajo de otras empleando tabuladores. El editor del IDE nos ayudar plenamente en esta tarea sin apenas percibirlo.

Bloques de cdigo
Un bloque de cdigo es un grupo de sentencias que se comportan como una unidad. Un bloque de cdigo est limitado por las llaves de apertura { y cierre }. Como ejemplos de bloques de cdigo tenemos la definicin de una clase, la definicin de una funcin miembro, una sentencia iterativa for, los bloques try ... catch, para el tratamiento de las excepciones, etc.

Expresiones
Una expresin es todo aquello que se puede poner a la derecha del operador asignacin =. Por ejemplo:
x=123; y=(x+100)/4; area=[Link](2.5); Rectangulo r=new Rectangulo(10, 10, 200, 300);

La primera expresin asigna un valor a la variable x. La segunda, realiza una operacin La tercera, es una llamada a una funcin miembro calcularArea desde un objeto circulo de una clase determinada La cuarta, reserva espacio en memoria para un objeto de la clase Rectangulo mediante la llamada a una funcin especial denominada constructor.

Variables
Una variable es un nombre que se asocia con una porcin de la memoria del ordenador, en la que se guarda el valor asignado a dicha variable. Hay varios tipos de variables que requieren distintas cantidades de memoria para guardar datos. Todas las variables han de declararse antes de usarlas, la declaracin consiste en una sentencia en la que figura el tipo de dato y el nombre que asignamos a la variable. Una vez declarada se le podr asignar valores. Java tiene tres tipos de variables:

de instancia de clase locales

Las variables de instancia o miembros dato como veremos ms adelante, se usan para guardar los atributos de un objeto particular. Las variables de clase o miembros dato estticos son similares a las variables de instancia, con la excepcin de que los valores que guardan son los mismos para todos los objetos de una determinada clase. En el siguiente ejemplo, PI es una variable de clase y radio es una variable de instancia. PI guarda el mismo valor para todos los objetos de la clase Circulo, pero el radio de cada crculo puede ser diferente
class Circulo{ static final double PI=3.1416; double radio; //... }

Las variables locales se utilizan dentro de las funciones miembro o mtodos. En el siguiente ejemplo area es una variable local a la funcin calcularArea en la que se guarda el valor del rea de un objeto de la clase Circulo. Una variable local existe desde el momento de su definicin hasta el final del bloque en el que se encuentra.
class Circulo{ //... double calcularArea(){ double area=PI*radio*radio; return area; } }

En el lenguaje Java, las variables locales se declaran en el momento en el que son necesarias. Es una buena costumbre inicializar las variables en el momento en el que son declaradas. Veamos algunos ejemplos de declaracin de algunas variables
int x=0; String nombre="Angel"; double a=3.5, b=0.0, c=-2.4; boolean bNuevo=true; int[] datos;

Delante del nombre de cada variable se ha de especificar el tipo de variable que hemos destacado en letra negrita. Las variables pueden ser

Un tipo de dato primitivo El nombre de una clase Un array

El lenguaje Java utiliza el conjunto de caracteres Unicode, que incluye no solamente el conjunto ASCII sino tambin carateres especficos de la mayora de los alfabetos. As, podemos declarar una variable que contenga la letra

int ao=1999;

Se ha de poner nombres significativos a las variables, generalmente formados por varias palabras combinadas, la primera empieza por minscula, pero las que le siguen llevan la letra inicial en maysculas. Se debe evitar en todos los casos nombres de variables cortos como xx, i, etc.
double radioCirculo=3.2;

Las variables son uno de los elementos bsicos de un programa, y se deben


Declarar Inicializar Usar

Tipos de datos primitivos


Tipo boolean char byte short int long float double Descripcion Tiene dos valores true o false. Caracteres Unicode de 16 bits Los caracteres alfa-numricos son los mismos que los ASCII con el bit alto puesto a 0. El intervalo de valores va desde 0 hasta 65535 (valores de 16-bits sin signo). Tamao 8 bits. El intervalo de valores va desde -27 hasta 27 -1 (-128 a 127) Tamao 16 bits. El intervalo de valores va desde -215 hasta 215-1 (-32768 a 32767) Tamao 32 bits. El intervalo de valores va desde -231 hasta 231-1 (-2147483648 a 2147483647) Tamao 64 bits. El intervalo de valores va desde -263 hasta 263-1 (9223372036854775808 a 9223372036854775807) Tamao 32 bits. Nmeros en coma flotante de simple precisin. Estndar IEEE 7541985 (de 1.40239846e45f a 3.40282347e+38f) Tamao 64 bits. Nmeros en coma flotante de doble precisin. Estndar IEEE 7541985. (de 4.94065645841246544e324d a 1.7976931348623157e+308d.)

Los tipos bsicos que utilizaremos en la mayor parte de los programas sern boolean, int y double.

Caracteres
En Java los caracteres no estn restringidos a los ASCII sino son Unicode. Un carcter est siempre rodeado de comillas simples como 'A', '9', '', etc. El tipo de dato char sirve para guardar estos caracteres. Un tipo especial de carcter es la secuencia de escape, similares a las del lenguaje C/C+ +, que se utilizan para representar caracteres de control o caracteres que no se

imprimen. Una secuencia de escape est formada por la barra invertida (\) y un carcter. En la siguiente tabla se dan las secuencias de escape ms utilizadas. Carcter retorno de carro tabulador horizontal nueva lnea barra invertida Secuencia de escape \r \t \n \\

Variables booleanas
En el lenguaje C/C++ el valor 0 se toma como falso y el 1 como verdadero. En el lenguaje Java existe el tipo de dato boolean. Una variable booleana solamente puede guardar uno de los dos posibles valores: true (verdadero) y false (falso).
boolean encontrado=false; {...} encontrado=true;

Variables enteras
Una variable entera consiste en cualquier combinacin de cifras precedidos por el signo ms (opcional), para los positivos, o el signo menos, para los negativos. Son ejemplos de nmeros enteros: 12, -36, 0, 4687, -3598 Como ejemplos de declaracin de variable enteras tenemos:
int numero=1205; int x,y; long m=30L;

int es la palabra reservada para declarar una variable entera. En el primer caso, el compilador reserva una porcin de 32 bits de memoria en el que guarda el nmero 1205. Se accede a dicha porcin de memoria mediante el nombre de la variable, numero. En el segundo caso, las porciones de memoria cuyos nombres son x e y, guardan cualquier valor entero si la variable es local o cero si la variable es de instancia o de clase. El uso de una variaable local antes de ser convenientemente inicializada puede conducir a consecuencias desastrosas. Por tanto, declarar e inicializar una variable es una prctica aconsejable.

En la tercera lnea 30 es un nmero de tipo int por defecto, le ponemos el sufijo L en maysculas o minsculas para indicar que es de tipo long. Existen como vemos en la tabla varios tipos de nmeros enteros (byte, short, int, long), y tambin existe una clase denominada BigInteger cuyos objetos pueden guardar un nmero entero arbitrariamente grande.

Variables en coma flotante


Las variables del tipo float o double (coma flotante) se usan para guardar nmeros en memoria que tienen parte entera y parte decimal.
double PI=3.14159; double g=9.7805, c=2.9979e8;

El primero es una aproximacin del nmero real , el segundo es la aceleracin de la gravedad a nivel del mar, el tercero es la velocidad de la luz en m/s, que es la forma de escribir 2.9979 108. El carcter punto '.', separa la parte entera de la parte decimal, en vez del carcter coma ',' que usamos habitualmente en nuestro idioma. Otras ejemplos son los siguientes
float a=12.5f; float b=7f; double c=7.0; double d=7d;

En la primera lnea 12.5 lleva el sufijo f, ya que por defecto 12.5 es double. En la segunda lnea 7 es un entero y por tanto 7f es un nmero de tipo float. Y as el resto de los ejemplos. Conceptualmente, hay infinitos nmeros de valores entre dos nmeros reales. Ya que los valores de las variables se guardan en un nmero prefijado de bits, algunos valores no se pueden representar de forma precisa en memoria. Por tanto, los valores de las variables en coma flotante en un ordenador solamente se aproximan a los verdaderos nmeros reales en matemticas. La aproximacin es tanto mejor, cuanto mayor sea el tamao de la memoria que reservamos para guardarlo. De este hecho, surgen las variables del tipo float y double. Para nmeros de precisin arbitararia se emplea la clase BigDecimal.

Valores constantes
Cuando se declara una variable de tipo final, se ha de inicializar y cualquier intento de modificarla en el curso de la ejecucin del programa da lugar a un error en tiempo de compilacin.

Normalmente, las constantes de un programa se suelen poner en letras maysculas, para distinguirlas de las que no son constantes. He aqu ejemplos de declaracin de constantes.
final double PI=3.141592653589793; final int MAX_DATOS=150;

Las cadenas de caracteres o strings


Adems de los ocho tipos de datos primitivos, las variables en Java pueden ser declaradas para guardar una instancia de una clase, como veremos en el siguiente captulo (Clases y objetos). Las cadenas de caracteres o strings son distintas en Java y en el lenguaje C/C++, en este ltimo, las cadenas son arrays de caracteres terminados en el carcter '\0'. Sin embargo, en Java son objetos de la clase String.
String mensaje="El primer programa";

Empleando strings, el primer programa quedara de la forma equivalente


public class PrimeroApp{ public static void main(String[] args) { //imprime un mensaje String mensaje="El primer programa"; [Link](mensaje); } }

En una cadena se pueden insertar caracteres especiales como el carcter tabulador '\t' o el de nueva lnea '\n'
String texto="Un string con \t un carcter tabulador y \n un salto de lnea";

Palabras reservadas
En el siguiente cuadro se listan las palabras reservadas, aquellas que emplea el lenguaje Java, y que el programador no puede utilizar como identificadores. Algunas de estas palabras le resultarn familiares al programador del lenguaje C/C++. Las palabras reservadas sealadas con un arterisco (*) no se utilizan. abstract case const* boolean cast* continue break catch default byte char do byvalue* class double

else float if int null protected satatic throw void

extends for implements interface operator* public super transient volatile

false future* import long outer* rest* switch true while

final generic* inner* native package return synchronized try

finally goto* instanceof new private short this var*

Las palabras reservadas se pueden clasificar en las siguientes categoras:


Tipos de datos: boolean, float, double, int, char Sentencias condicionales: if, else, switch Sentencias iterativas: for, do, while, continue Tratamiento de las excepciones: try, catch, finally, throw Estructura de datos: class, interface, implements, extends Modificadores y control de acceso: public, private, protected, transient Otras: super, null, this.

Los operadores (aritmticos)


Introduccin
Los operadores aritmticos Concatenacin de strings La precedencia de operadores La conversin automtica y promocin Los operadores unarios

Todos los lenguajes de programacin permiten realizar operaciones entre los tipos de datos bsicos: suma, resta, producto, cociente, etc., de dos nmeros. Otros lenguajes como el BASIC y Java permiten "sumar", concatenar cadenas de caracteres. En la pgina titulada "La primera aplicacin", hemos aprendido a crear un poyecto nuevo, y la clase que describe la aplicacin mnima que contiene la funcin esttica main. Luego, le hemos aadido cdigo para dar cierta funcionalidad a la aplicacin, que ha consistido en imprimir un mensaje en la consola o mostrarlo en la ventana denominada Execution Log. Recordaremos que la imagen del disquette significa un proyecto nuevo cuyo nombre aparece en letra negrita, y cuyos componentes son archivos cdigo fuente en el que se guardan las clases.

Los operadores aritmticos


operador: [Link] Java tiene cinco operadores aritmticos cuyo significado se muestra en la tabla adjunta Operador Nombre Ejemplo + * / % Suma Diferencia Producto Cociente Mdulo 3+4 3-4 3*4 20/7 20%7

El cociente entre dos enteros da como resultado un entero. Por ejemplo, al dividir 20 entre 7 nos da como resultado 2. El operador mdulo da como resultado el resto de la divisin entera. Por ejemplo 20%7 da como resultado 6 que es el resto de la divisin entre 20 y 7. El operador mdulo tambin se puede emplear con nmeros reales. Por ejemplo, el cociente entre 7.5 y 3.0 es 2.5 y el resto es cero, es decir, 7.5=3.0 x 2.5+ 0. El operador mdulo, funciona de la siguiente forma 7.5=3.0 x 2+1.5, calcula la diferencia entre el dividendo (7.5) y el producto del divisor (3.0) por la parte entera (2) del cociente, devolviendo 1.5. As pues, la operacin 7.5%3.0 da como resultado 1.5.

El operador asignacin

Nos habremos dado cuenta que el operador ms importante y ms frecuentemente usado es el operador asignacin =, que hemos empleado para la inicializacin de las variables. As,
int numero; numero=20;

la primera sentencia declara una variable entera de tipo int y le da un nombre (numero). La segunda sentencia usa el operador asignacin para inicializar la variable con el nmero 20. Consideremos ahora, la siguiente sentencia.
a=b;

que asigna a a el valor de b. A la izquierda siempre tendremos una variable tal como a, que recibe valores, a la derecha otra variable b, o expresin que tiene un valor. Por tanto, tienen sentido las expresiones
a=1234; double area=calculaArea(radio); superficie=ancho*alto;

Sin embargo, no tienen sentido las expresiones


1234=a; calculaArea(radio)=area;

Las asignaciones mltiples son tambin posibles. Por ejemplo, es vlida la sentencia
c=a=b; //equivalente a c=(a=b);

la cual puede ser empleada para inicializar en la misma lnea varias variables
c=a=b=321; //asigna 321 a a, b y c

El operador asignacin se puede combinar con los operadores aritmticos Expresin x+=y x-=y x*=y x/=y As, la sentencia
x=x+23;

Significado x=x+y x=x-y x=x*y x=x/y

evala la expresin x+23, que es asignada de nuevo a x. El compilador lee primero el contenido de la porcin de memoria nombrada x, realiza la suma, y guarda el resultado

en la misma porcin de memoria. Se puede escribir la sentencia anterior de una forma equivalente ms simple
x+=23;

Concatenacin de strings
En Java se usa el operador + para concatenar cadenas de carcateres o strings. Veremos en el siguiente apartado una sentencia como la siguiente:
[Link]("la temperatura centgrada es "+tC);

El operador + cuando se utiliza con strings y otros objetos, crea un solo string que contiene la concatenacin de todos sus operandos. Si alguno de los operandos no es una cadena, se convierte automticamente en una cadena. Por ejemplo, en la sentencia anterior el nmero del tipo double que guarda la variable tC se convierte en un string que se aade al string "la temperatura centgrada es ". Como veremos ms adelante, un objeto se convierte automticamente en un string si su clase redefine la funcin miembro toString de la clase base Object. Como vemos en el listado, para mostrar un resultado de una operacin, por ejemplo, la suma de dos nmeros enteros, escribimos
iSuma=ia+ib; [Link]("El resultado de la suma es "+iSuma);

Concatena una cadena de caracteres con un tipo bsico de dato, que convierte automticamente en un string. El operador += tambin funciona con cadenas.
String nombre="Juan "; nombre+="Garca"; [Link](nombre);

public class OperadorAp { public static void main(String[] args) { [Link]("Operaciones con enteros"); int ia=7, ib=3; int iSuma, iResto; iSuma=ia+ib; [Link]("El resultado de la suma es "+iSuma); int iProducto=ia*ib; [Link]("El resultado del producto es "+iProducto); [Link]("El resultado del cociente es "+(ia/ib)); iResto=ia%ib; [Link]("El resto de la divisin entera es "+iResto);

} }

[Link]("**********************************"); [Link]("Operaciones con nmeros decimales"); double da=7.5, db=3.0; double dSuma=da+db; [Link]("El resultado de la suma es "+dSuma); double dProducto=da*db; [Link]("El resultado del producto es "+dProducto); double dCociente=da/db; [Link]("El resultado del cociente es "+dCociente); double dResto=da%db; [Link]("El resto de la divisin es "+dResto);

La precedencia de operadores
precede: [Link] El lector conocer que los operadores aritmticos tienen distinta precedencia, as la expresin
a+b*c

es equivalente a
a+(b*c)

ya que el producto y el cociente tienen mayor precedencia que la suma o la resta. Por tanto, en la segunda expresin el parntesis no es necesario. Sin embargo, si queremos que se efecte antes la suma que la multiplicacin tenemos de emplear los parntesis
(a+b)*c

Para realizar la operacin


a/(b*c);

escribiremos

o bien,
a/b/c;

En la mayora de los casos, la precedencia de las operaciones es evidente, sin embargo, en otros que no lo son tanto, se aconseja emplear parntesis. Como ejemplo, estudiemos un programa que nos permite convertir una temperatura en grados Fahrenheit en su equivalente en la escala Celsius. La frmula de conversin es

cuya codificacin es
tC=(tF-32)*5/9;

Las operaciones se realizan como suponemos, ya que si primero se realizase el cociente 5/9, el resultado de la divisin entera sera cero, y el producto por el resultado de evaluar el parntesis sera tambin cero. Si tenemos dudas sobre la precedencia de operadores podemos escribir
tC=((tF-32)*5)/9; public class PrecedeApp { public static void main(String[] args) { int tF=80; [Link]("la temperatura Fahrenheit es "+tF); int tC=(tF-32)*5/9; [Link]("la temperatura centgrada es "+tC); } }

La conversin automtica y promocin (casting)


Cuando se realiza una operacin, si un operando es entero (int) y el otro es de coma flotante (double) el resultado es en coma flotante (double).
int a=5; double b=3.2; double suma=a+b;

Cuando se declaran dos variables una de tipo int y otra de tipo double.
int entero; double real=3.20567;

qu ocurrir cuando asignamos a la variable entero el nmero guardado en la variable real?. Como hemos visto se trata de dos tipos de variables distintos cuyo tamao en memoria es de 32 y 64 bits respectivamente. Por tanto, la sentencia
entero=real;

convierte el nmero real en un nmero entero eliminando los decimales. La variable entero guardar el nmero 3. Se ha de tener cuidado, ya que la conversin de un tipo de dato en otro es una fuente frecuente de error entre los programadores principiantes. Ahora bien, supongamos que deseamos calcular la divisin 7/3, como hemos visto, el resultado de la divisin entera es 2, an en el caso de que tratemos de guardar el resultado en una variable del tipo double, como lo prueba la siguiente porcin de cdigo.

int ia=7; int ib=3; double dc=ia/ib;

Si queremos obtener una aproximacin decimal del nmero 7/3, hemos de promocionar el entero ia a un nmero en coma flotante, mediante un procedimiento denominado promocin o casting.
int ia=7; int ib=3; double dc=(double)ia/ib;

Como aplicacin, consideremos el clculo del valor medio de dos o ms nmeros enteros
int edad1=10; int edad2=15; double media=(double)(edad1+edad2)/2;

El valor medio de 10 y 15 es 12.5, sin la promocin se obtendra el valor errneo 12. Imaginemos ahora, una funcin que devuelve un entero int y queremos guardarlo en una variable de tipo float. Escribiremos
float resultado=(float)retornaInt();

Existen tambin conversiones implcitas realizadas por el compilador, por ejemplo cuando pasamos un entero int a una funcin cuyo nico parmetro es de tipo long.

Los operadores unarios


unario: [Link] Los operadores unarios son:

++ Incremento -- Decremento

actan sobre un nico operando. Se trata de uno de los aspecto ms confusos para el programador, ya que el resultado de la operacin depende de que el operador est a la derecha i++ o a la izquierda ++i. Conoceremos, primero el significado de estos dos operadores a partir de las sentencias equivalentes:
i=i+1; i++; //aadir 1 a i

Del mismo modo, lo son

i=i-1; i--;

//restar 1 a i

Examinemos ahora, la posicin del operador respecto del operando. Consideremos en primer lugar que el operador unario ++ est a la derecha del operando. La sentencia
j=i++;

asigna a j, el valor que tena i. Por ejemplo, si i vala 3, despus de ejecutar la sentencia, j toma el valor de 3 e i el valor de 4. Lo que es equivalente a las dos sentencias
j=i; i++;

Un resultado distinto se obtiene si el operador ++ est a la izquierda del operando


j=++i;

asigna a j el valor incrementado de i. Por ejemplo, si i vala 3, despus de ejecutar la sentencia j e i toman el valor de 4. Lo que es equivalente a las dos sentencias
++i; j=i; public class UnarioApp { public static void main(String[] args) { int i=8; int a, b, c; [Link]("\tantes\tdurante\tdespus"); i=8; a=i; b=i++; c=i; [Link]("i++\t"+a+'\t'+b+'\t'+c); i=8; a=i; b=i--; c=i; [Link]("i--\t"+a+'\t'+b+'\t'+c); i=8; a=i; b=++i; c=i; [Link]("++i\t"+a+'\t'+b+'\t'+c); i=8; a=i; b=--i; c=i; [Link]("--i\t"+a+'\t'+b+'\t'+c); } }

La salida del programa es, la siguiente


i++ i-++i --i antes 8 8 8 8 durante 8 8 9 7 despus 9 7 9 7

La primera columna (antes) muestra el valor inicial de i, la segunda columna (durante) muestra el valor de la expresin, y la ltima columna (despus) muestra el valor final de i, despus de evaluarse la expresin.

Se deber de tener siempre el cuidado de inicializar la variable, antes de utilizar los operadores unarios con dicha variable.

Los operadores (relacionales)


Introduccin
Los operadores relacionales Los operadores lgicos

Los operadores relacionales


relacion: [Link] Los operadores relacionales son smbolos que se usan para comparar dos valores. Si el resultado de la comparacin es correcto la expresin considerada es verdadera, en caso contrario es falsa. Por ejemplo, 8>4 (ocho mayor que cuatro) es verdadera, se representa por el valor true del tipo bsico boolean, en cambio, 8<4 (ocho menor que cuatro) es falsa, false. En la primera columna de la tabla, se dan los smbolos de los operadores relacionales, el la segunda, el nombre de dichos operadores, y a continuacin su significado mediante un ejemplo. Operador nombre < > == != <= >= menor que mayor que igual a no igual a menor que o igual a mayor que o igual a ejemplo a<b a>b a==b a!=b a<=5 a>=b significado a es menor que b a es mayor que b a es igual a b a no es igual a b a es menor que o igual a b a es menor que o igual a b

Se debe tener especial cuidado en no confundir el operador asignacin con el operador relacional igual a. Las asignaciones se realizan con el smbolo =, las comparaciones con ==.

En el programa RelacionApp, se compara la variable i que guarda un 8, con un conjunto de valores, el resultado de la comparacin es verdadero (true), o falso (false).
public class RelacionApp { public static void main(String[] args) { int x=8; int y=5; boolean compara=(x<y); [Link]("x<y es "+compara); compara=(x>y); [Link]("x>y es "+compara); compara=(x==y); [Link]("x==y es "+compara); compara=(x!=y); [Link]("x!=y es "+compara); compara=(x<=y); [Link]("x<=y es "+compara); compara=(x>=y); [Link]("x>=y es "+compara); } }

Los operadores lgicos


Los operadores lgicos son:

&& AND (el resultado es verdadero si ambas expresiones son verdaderas) || OR (el resultado es verdadero si alguna expresin es verdadera) ! NOT (el resultado invierte la condicin de la expresin)

AND y OR trabajan con dos operandos y retornan un valor lgico basadas en las denominadas tablas de verdad. El operador NOT acta sobre un operando. Estas tablas de verdad son conocidas y usadas en el contexto de la vida diaria, por ejemplo: "si hace sol Y tengo tiempo, ir a la playa", "si NO hace sol, me quedar en casa", "si llueve O hace viento, ir al cine". Las tablas de verdad de los operadores AND, OR y NOT se muestran en las tablas siguientes El operador lgico AND x true true y true resultado true

false false false

false true

false false false El operador lgico OR

x true true

y true

resultado true

false true true

false true

false false false El operador lgico NOT x true resultado false

false true Los operadores AND y OR combinan expresiones relacionales cuyo resultado viene dado por la ltima columna de sus tablas de verdad. Por ejemplo:
(a<b) && (b<c)

es verdadero (true), si ambas son verdaderas. Si alguna o ambas son falsas el resultado es falso (false). En cambio, la expresin
(a<b) ||(b<c)

es verdadera si una de las dos comparaciones lo es. Si ambas, son falsas, el resultado es falso. La expresin " NO a es menor que b"
!(a<b)

es falsa si (a<b) es verdadero, y es verdadera si la comparacin es falsa. Por tanto, el operador NOT actuando sobre (a<b) es equivalente a
(a>=b)

La expresin "NO a es igual a b"


!(a==b)

es verdadera si a es distinto de b, y es falsa si a es igual a b. Esta expresin es equivalente a


(a!=b)

El flujo de un programa (sentencias condicionales)


Introduccin
La sentencia if La sentencia if...else La sentencia switch

Del mismo modo que en la vida diaria, en un programa es necesario tomar decisiones basadas en ciertos hechos y actuar en consecuencia. El lenguaje Java tiene una sentencia bsica denominada if (si condicional) que realiza un test y permite responder de acuerdo al resultado.

La sentencia if
La sentencia if, acta como cabra esperar. Si la condicin es verdadera, la sentencia se ejecuta, de otro modo, se salta dicha sentencia, continuando la ejecucin del programa con otras sentencias a continuacin de sta. La forma general de la sentencia if es:
if (condicin) sentencia;

Si el resultado del test es verdadero (true) se ejecuta la sentencia que sigue a continuacin de if, en caso contrario, falso (false), se salta dicha sentencia, tal como se indica en la figura. La sentencia puede consistir a su vez, en un conjunto de sentencias agrupadas en un bloque.
if (condicin){ sentencia1; sentencia2; }

En el siguiente ejemplo, si el nmero del boleto que hemos adquirido coincide con el nmero aparecido en el sorteo, nos dicen que hemos obtenido un premio.
if(numeroBoleto==numeroSorteo) [Link]("has obtenido un premio");

La sentencia if...else
La sentencia if...else completa la sentencia if, para realizar una accin alternativa
if (condicin) sentencia1; else sentencia2

Las dos primeras lneas indican que si la condicin es verdadera se ejecuta la sentencia 1. La palabra clave else, significa que si la condicin no es verdadera se ejecuta la sentencia 2, tal como se ve en la figura.. Dado que las sentencias pueden ser simples o compuestas la forma general de if...else es
if (condicin){ sentencia1; sentencia2; }else{

sentencia3 sentencia4; sentencia5; }

Existe una forma abreviada de escribir una sentencia condicional if...else como la siguiente:
if (numeroBoleto==numeroSoreteo) premio=1000; else premio=0;

en una sola lnea


premio=(numeroBoleto==numeroSoreteo) ? 1000 : 0;

Un ejemplo significativo es el siguiente: el signo de un nmero elevado a una potencia par es positivo, y es negativo cuando est elevado a una potencia impar.
int signo=(exponente%2==0)?1:-1;

La condicin entre parntesis es la siguiente: un nmero es par, cuando el resto de la divisin entera de dicho nmero entre dos vale cero.

La sentencia switch
switch1: [Link] switch2: [Link] Como podemos ver en la figura del apartado anterior, la sentencia if...else tiene dos ramas, el programa va por una u otra rama dependiendo del valor verdadero o falso de la expresin evaluada. A veces, es necesario, elegir entre varias alternativas, como se muestra en la siguiente figura

Por ejemplo, considrese las siguientes series de sentencias if...else


if(expresion==valor1) sentencia1; else if(expresion==valor2) sentencia2; else if(expresion==valor3) sentencia3; else sentencia4;

El cdigo resultante puede ser difcil de seguir y confuso incluso para el programador avanzado. El lenguaje Java proporciona una solucin elegante a este problema mediante la sentencia condicional switch para agrupar a un conjunto de sentencias if...else.
switch(expresion){ case valor1: sentencia1; break; case valor2: sentencia2; break; case valor3: sentencia3; break; default: sentencia4; }

//sale de switch //sale switch //sale de switch

En la sentencia switch, se compara el valor de una variable o el resultado de evaluar una expresin, con un conjunto de nmeros enteros valor1, valor2, valor3, .. o con un conjunto de caracteres, cuando coinciden se ejecuta el bloque de sentencias que estn asociadas con dicho nmero o carcter constante. Dicho bloque de sentencias no est entre llaves sino que empieza en la palabra reservada case y termina en su asociado break. Si el compilador no encuentra coincidencia, se ejecuta la sentencia default, si es que est presente en el cdigo. Veamos ahora un ejemplo sencillo: dado el nmero que identifica al mes (del 1 al 12) imprimir el nombre del mes.

public class SwitchApp1 { public static void main(String[] args) { int mes=3; switch (mes) { case 1: [Link]("Enero"); break; case 2: [Link]("Febrero"); break; case 3: [Link]("Marzo"); break; case 4: [Link]("Abril"); break; case 5: [Link]("Mayo"); break; case 6: [Link]("Junio"); break; case 7: [Link]("Julio"); break; case 8: [Link]("Agosto"); break; case 9: [Link]("Septiembre"); break; case 10: [Link]("Octubre"); break; case 11: [Link]("Noviembre"); break; case 12: [Link]("Diciembre"); break; default: [Link]("Este mes no existe"); break; } } }

Ahora un ejemplo ms complicado, escribir un programa que calcule el nmero de das de un mes determinado cuando se da el ao. Anotar primero, los meses que tienen 31 das y los que tienen 30 das. El mes de Febrero (2 mes) es el ms complicado ya que tiene 28 das excepto en los aos que son bisiestos que tiene 29. Son bisiestos los aos mltiplos de cuatro, que no sean mltiplos de 100, pero si son bisiestos los mltiplos de 400.
public class SwitchApp2 { public static void main(String[] args) { int mes=2; int ao=1992; int numDias=30; switch (mes) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDias = 31; break; case 4: case 6: case 9: case 11: numDias = 30; break; case 2: if ( ((ao % 4 == 0) && !(ao % 100 == 0)) || (ao % 400 == 0) ) numDias = 29; else numDias = 28; break; default:

} [Link]("El mes "+mes+" del ao "+ao+" tiene "+numDias+" das"); } }

[Link]("Este mes no existe"); break;

El flujo de un programa (sentencias iterativas)


Introduccin
La sentencia for La sentencia while La sentencia do...while La sentencia break La sentencia continue Ejemplo: los nmeros primos

Tan importantes como las sentencias condiciones son las sentencias iterativas o repetitivas. Normalmente, las sentencias de un programa son ejecutadas en el orden en el que aparecen. Cada sentencia es ejecutada una y solamente una vez. El lenguaje Java, como la mayora de los lenguajes, proporciona sentencias que permiten realizar una tarea una y otra vez hasta que se cumpla una determinada condicin, dicha tarea viene definida por un conjunto de sentencias agrupadas en un bloque. Las sentencias iterativas son for, while y do...while

La sentencia for
factorial: [Link] Esta sentencia se encuentra en la mayora de los lenguajes de programacin. El bucle for se emplear cuando conocemos el nmero de veces que se ejecutar una sentencia o

un bloque de sentencias, tal como se indica en la figura. La forma general que adopta la sentencia for es
for(inicializacin; condicin; incremento) sentencia;

El primer trmino inicializacin, se usa para inicializar una variable ndice, que controla el nmero de veces que se ejecutar el bucle. La condicin representa la condicin que ha de ser satisfecha para que el bucle contine su ejecucin. El incremento representa la cantidad que se incrementa la variable ndice en cada repeticin. Ejemplo: Escribir un programa que imprima los primeros 10 primeros nmeros enteros empezando por el cero
for (int i = 0; i < 10; i++) { [Link](i); }

El resultado ser: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 La variable ndice i se declara y se inicializa en el trmino inicializacin, la condicin se expresa de modo que i se debe mantener estrictamente menor que 10; la variable i se incrementa una unidad en cada repeticin del bucle. La variable i es local al bucle, por lo que deja de existir una vez que se sale del bucle. Ejemplo: Escribir un programa que imprima los nmeros pares positivos menores o iguales que 20
for (int i=2; i <=20; i += 2) { [Link](i); }

Ejemplo: Escribir un programa que imprima los nmeros pares positivos menores o iguales que 20 en orden decreciente
for (int i=20; i >= 2; i -= 2) { [Link](i); }

Ejemplo: Escribir un programa que calcule el factorial de un nmero empleando la sentencia iterativa for. Guardar el resultado en un nmero entero de tipo long . Definicin: el factorial de un nmero n es el resultado del producto 1*2*3* .... *(n-1)*n.
public class FactorialApp { public static void main(String[] args) { int numero=4; long resultado=1; for(int i=1; i<=numero; i++){ resultado*=i; } [Link]("El factorial es "+resultado); } }

La sentencia while
factorial1: [Link] A la palabra reservada while le sigue una condicin encerrada entre parntesis. El bloque de sentencias que le siguen se ejecuta siempre que la condicin sea verdadera tal como se ve en la figura. La forma general que adopta la sentencia while es:
while (condicin) sentencia;

Ejemplo: Escribir un programa que imprima los primeros 10 primeros nmeros enteros empezando por el cero, empleando la sentencia iterativa while.
int i=0; while (i<10) { [Link](i); i++; }

El valor inicial de i es cero, se comprueba la condicin (i<10), la cual resulta verdadera. Dentro del bucle, se imprime i, y se incrementa la variable contador i, en una unidad. Cuando i vale 10, la condicin (i<10) resulta falsa y el bucle ya no se ejecuta. Si el valor inicial de i fuese 10, no se ejecutara el bucle. Por tanto, el bucle while no se ejecuta si la condicin es falsa. Ejemplo: escribir un programa que calcule el factorial de un nmero empleando la sentencia iterativa while
public class FactorialApp1 { public static void main(String[] args) { int numero=4; long resultado=1; while(numero>0){ resultado*=numero; numero--; } [Link]("El factorial es "+resultado); } }

La sentencia do...while
Como hemos podido apreciar las sentencias for y while la condicin est al principio del bucle, sin embargo, do...while la condicin est al final del bucle, por lo que el bucle se ejecuta por lo menos una vez tal como se ve en la figura. do marca el comienzo del bucle y while el final del mismo. La forma general es:
do{ sentencia; }while(condicin);

Ejemplo: Escribir un programa que imprima los primeros 10 primeros nmeros enteros empezando por el cero, empleando la sentencia iterativa do..while.

int i=0; do{ [Link](i); i++; }while(i < 10);

El bucle do...while, se usa menos que el bucle while, ya que habitualmente evaluamos la expresin que controla el bucle al comienzo, no al final.

La sentencia break
A veces es necesario interrumpir la ejecucin de un bucle for, while, o do...while.
for(int i = 0; i < 10; i++){ if (i == 8) break; [Link](i); }

Consideremos de nuevo el ejemplo del bucle for, que imprime los 10 primeros nmeros enteros, se interrumpe la ejecucin del bucle cuando se cumple la condicin de que la variable contador i valga 8. El cdigo se leer: "salir del bucle cuando la variable contador i, sea igual a 8". Como podemos apreciar, la ejecucin del bucle finaliza prematuramente. Quizs el lector pueda pensar que esto no es de gran utilidad pues, el cdigo anterior es equivalente a
for(int i = 0; i <=8; i++) [Link](i);

Sin embargo, podemos salir fuera del bucle prematuramente si se cumple alguna condicin de finalizacin.
while(true){ if (condicionFinal) //...otras sentencias } break;

Como podemos apreciar en esta porcin de cdigo, la expresin en el bucle while es siempre verdadera, por tanto, tiene que haber algn mecanismo que nos permita salir del bucle. Si la condicion de finalizacin es verdadera, es decir la variable condicionFinal del tipo boolean toma el valor true, se sale del bucle, en caso contrario se continua el procesmiento de los datos.

La sentencia continue

La sentencia continue, fuerza al bucle a comenzar la siguiente iteracin desde el principio. En la siguiente porcin de cdigo, se imprimen todos los nmeros del 0 al 9 excepto el nmero 8.
for(int i = 0; i < 10; i++){ if (i == 8) continue; [Link](i); }

Etiquetas
Tanto break como continue pueden tener una etiqueta opcional que indica a Java hacia donde dirigirse cuando se cumple una determinada condicin.
salida: for(int i=0; i<20; i++){ while(j<70){ if(i*j==500) //... } //... } break salida;

La etiqueta en este ejemplo se denomina salida, y se aade antes de la parte inicial del ciclo. La etiqueta debe terminar con el carcter dos puntos :. Si no disponemos de etiqueta, al cumplirse la condicin i*j==500, se saldra del bucle interno while, pero el proceso de clculo continuara en el bucle externo for.

Ejemplo: los nmeros primos


primos: [Link] Escribir un programa que calcule los nmeros primos comprendidos entre 3 y 100. Los nmeros primos tienen la siguiente caracterstica: un nmero primo es solamente divisible por s mismo y por la unidad, por tanto, un nmero primo no puede ser par excepto el 2. Para saber si un nmero impar es primo, dividimos dicho nmero por todos los nmeros impares comprendidos entre 3 y la mitad de dicho nmero. Por ejemplo, para saber si 13 es un nmero primo basta dividirlo por 3, y 5. Para saber si 25 es nmero primo se divide entre 3, 5, 7, 9, y 11. Si el resto de la divisin (operacin mdulo %) es cero, el nmero no es primo.
public class PrimosApp { public static void main(String[] args) { boolean bPrimo; [Link]("Nmeros primos comprendidos entre 3 y 100"); for(int numero=3; numero<100; numero+=2){

} } }

bPrimo=true; for(int i=3; i<numero/2; i+=2){ if(numero%i==0){ bPrimo=false; break; } } if(bPrimo){ [Link](numero+" - "); }

En primer lugar, hacemos un bucle for para examinar los nmeros impares comprendidos entre 3 y 100. Hacemos la suposicin de que numero es primo, es decir, de que la variable de control bPrimo toma el valor true. Para confirmarlo, se halla el resto de la divisin entera entre numero, y los nmeros i impares comprendidos entre 3 y numero/2. (Se recordar que todo nmero es divisible por la unidad). Si el nmero numero es divisible por algn nmero i (el resto de la divisin entera numero%i es cero), entonces el nmero numero no es primo, se abandona el bucle (break) con la variable de control bPrimo tomando el valor false. En el caso de que numero sea un nmero primo, se completa el bucle interno, tomando la variable de control bPrimo el valor inicial true. Por ltimo, si el nmero es primo, bPrimo es true, se imprime en la ventana, uno a continuacin del otro separados por un guin. En este programa podemos observar la diferencia entre print y println. El sufijo ln en la segunda funcin indica que se imprime el argumento y a continuacin se pasa a la lnea siguiente. Ventajas y desventajas 1) Ventajas a) Aumento de la productividad: Los usuarios pueden utilizar herramientas que le son familiares, como hojas de clculo y herramientas de acceso a bases de datos. Mediante la integracin de las aplicaciones cliente / servidor con las aplicaciones personales de uso habitual, los usuarios pueden construir soluciones particularizadas que se ajusten a sus necesidades cambiantes. Una interface grfica de usuario consistente, reduce el tiempo de aprendizaje de las aplicaciones. b) Menores costos de operacin: La existencia de plataformas de hardware cada vez ms baratas. Esta constituye a su vez una de las ms palpables ventajas de este esquema, la posibilidad de utilizar mquinas considerablemente ms baratas que las requeridas por una solucin centralizada, basada en sistemas grandes.

Permiten un mejor aprovechamiento de los sistemas existentes, protegiendo la inversin. Por ejemplo, la comparticin de servidores (habitualmente caros) y dispositivos perifricos (como impresoras) entre mquinas clientes, permite un mejor rendimiento del conjunto. Se pueden utilizar componentes, tanto de hardware como de software, de varios fabricantes, lo cual contribuye considerablemente a la reduccin de costos y favorece la flexibilidad en la implantacin y actualizacin de soluciones. Proporcionan un mejor acceso a los datos. La interface de usuario ofrece una forma homognea de ver el sistema, independientemente de los cambios o actualizaciones que se produzcan en l y de la ubicacin de la informacin. El movimiento de funciones desde un ordenador central hacia servidores o clientes locales, origina el desplazamiento de los costos de ese proceso hacia mquinas ms pequeas y por tanto, ms baratas.

c) Mejora en el rendimiento de la red: Las arquitecturas cliente/servidor eliminan la necesidad de mover grandes bloques de informacin por la red hacia los ordenadores personales o estaciones de trabajo para su proceso. Los servidores controlan los datos, procesan peticiones y despus transfieren slo los datos requeridos a la mquina cliente. Entonces, la mquina cliente presenta los datos al usuario mediante interfaces amigables. Todo esto reduce el trfico de la red, lo que facilita que pueda soportar un mayor nmero de usuarios. Se puede integrar PCs con sistemas medianos y grandes, sin que todas las mquinas tengan que utilizar el mismo sistema operacional. Si se utilizan interfaces grficas para interactuar con el usuario, el esquema Cliente/Servidor presenta la ventaja, con respecto a uno centralizado, de que no es siempre necesario transmitir informacin grfica por la red, pues sta puede residir en el cliente, lo cual permite aprovechar mejor el ancho de banda de la red. Tanto el cliente como el servidor pueden escalar para ajustarse a las necesidades de las aplicaciones. Las UCPs utilizadas en los respectivos equipos, pueden dimensionarse a partir de las aplicaciones y el tiempo de respuesta que se requiera. La existencia de varias UCPs proporciona una red ms fiable: una falla en uno de los equipos, no significa necesariamente que el sistema deje de funcionar. En una arquitectura como sta, los clientes y los servidores son independientes los unos de los otros, con lo que pueden renovarse para aumentar sus funciones y capacidad de forma independiente, sin afectar al resto del sistema. La arquitectura modular de los sistemas cliente / servidor, permite el uso de ordenadores especializados (servidores de base de datos, servidores de ficheros, estaciones de trabajo para CAD, etc.). Permite centralizar el control de sistemas que estaban descentralizados, como por ejemplo la gestin de los ordenadores personales que antes estuvieron aislados.

Es ms rpido el mantenimiento y el desarrollo de aplicaciones, pues se pueden emplear las herramientas existentes (por ejemplo los servidores de SQL o las herramientas de ms bajo nivel como los sockets o el RPC ). El esquema Cliente/Servidor contribuye adems a proporcionar a las diferentes direcciones de una institucin soluciones locales, pero permitiendo adems la integracin de la informacin relevante a nivel global. 2) Desventajas Hay una alta complejidad tecnolgica al tener que integrar una gran variedad de productos. Por una parte, el mantenimiento de los sistemas es ms difcil pues implica la interaccin de diferentes partes de hardware y de software, distribuidas por distintos proveedores, lo cual dificulta el diagnstico de fallas. Requiere un fuerte rediseo de todos los elementos involucrados en los sistemas de informacin (modelos de datos, procesos, interfaces, comunicaciones, almacenamiento de datos, etc.). Adems, en la actualidad existen pocas herramientas que ayuden a determinar la mejor forma de dividir las aplicaciones entre la parte cliente y la parte servidor. Por un lado, es importante que los clientes y los servidores utilicen el mismo mecanismo (por ejemplo sockets o RPC), lo cual implica que se deben tener mecanismos generales que existan en diferentes plataformas. Adems de lo anterior, se cuenta con muy escasas herramientas para la administracin y ajuste del desempeo de los sistemas. Es ms difcil asegurar un elevado grado de seguridad en una red de clientes y servidores que en un sistema con un nico ordenador centralizado. Se deben hacer verificaciones en el cliente y en el servidor. Tambin se puede recurrir a otras tcnicas como el encriptamiento. Un aspecto directamente relacionado con el anterior, es el de cmo distribuir los datos en la red. En el caso de una empresa, por ejemplo, ste puede ser hecho por departamentos, geogrficamente, o de otras maneras. Adems, hay que tener en cuenta que en algunos casos, por razones de confiabilidad o eficiencia se pueden tener datos replicados, y que puede haber actualizaciones simultneas. A veces, los problemas de congestin de la red pueden degradar el rendimiento del sistema por debajo de lo que se obtendra con una nica mquina (arquitectura centralizada). Tambin la interface grfica de usuario puede a veces ralentizar el funcionamiento de la aplicacin. El quinto nivel de esta arquitectura (bases de datos distribuidas) es tcnicamente muy complejo y en la actualidad, hay muy pocas implantaciones que garanticen un funcionamiento totalmente eficiente. Existen multitud de costos ocultos (formacin en nuevas tecnologas, licencias, cambios organizativos, etc.) que encarecen su implantacin.

También podría gustarte