You are on page 1of 512

Programas a usar...

Segn vuestro sistema operativo tendris que:

Para S.O. Windows:


- JDK JAVA SUN: El software de Java para el equipo o el entorno de ejecucin Java se denomina tambin ejecucin Java, entorno de ejecucin, ejecucin, JRE, mquina virtual Java, mquina virtual, Java VM, JVM, VM o descarga de Java. - Jcreator: IDE de programacin

Para S.O. Gnu/Linux:


- OpenJDK es la versin libre de la plataforma de desarrollo Java. - Geany: un entorno ligero, para programacin. Lo puedes descargar en Centro de Software de Ubuntu - Eclipse: un entorno muy bueno, pero tambin exige una buena mquina. Lo puedes descargar en: http://www.eclipse.org/downloads/ - NetBeans : otro entorno IDE para Java, medio, hay interesantes video en internet. para mas informacion: http://es.wikipedia.org/wiki/NetBeans

I. VARIABLES Y ESTRUCTURAS DE CONTROL EN LA PROGRAMACIN ORIENTADA A OBJETOS: JAVA


Usando hilos
Objetivo especfico de aprendizaje Conocer cmo se crea y se usa un hilo

Producto a entregar Como resultado de la actividad el alumno: - Aprender cmo se crea un hilo de ejecucin. - Aprender cmo se realiza el arranque de hilos.

Descripcin de la actividad

1. Hacer la lectura titulada Por qu y cmo usar hilos. 2. Para profundizar tus conocimientos, consulta la informacin de la pgina Web 3.

4.

http://www.ibiblio.org/javafaq/course/week11/index.html. Sin utilizar hilos, desarrollar un programa (aplicacin o applet) que tenga dos botones y un TextArea. Al presionar un botn, el TextArea comenzar a parpadear entre dos colores (azul y rojo), y al presionar el segundo botn el parpadeo parar. Funciona como se tena previsto? Si la respuesta es NO. Entonces se necesitan hilos Si la respuesta es SI. Analizar, pues este caso no puede funcionar sin hilos. Hacer una reflexin sobre lo visto en esta actividad. Entrega el resultado en un documento de Word en la plataforma.

1. Introduccin a los Hilos Un hilo de ejecucin designa una porcin del programa que se puede ejecutar en paralelo con otros hilos. Esto otorga al programador en Java potentes capacidades que no estn disponibles en otros lenguajes. En esta unidad conocers los

fundamentos de este tipo de programacin concurrente.

Objetivo especfico de aprendizaje Conocer cmo se crea y se usa un hilo

Producto a entregar Como resultado de la actividad el alumno: - Aprender cmo se crea un hilo de ejecucin. - Aprender cmo se realiza el arranque de hilos.

Descripcin de la Unidad
Introduccin: La mayora de los lenguajes de programacin de propsito general populares proveen estructuras de control para la ejecucin serial de acciones, es decir, se realiza una sola accin a la vez, y luego, al terminar sta, se realiza la siguiente, y as sucesivamente. Java se distingue por poner a disposicin del programador primitivas de concurrencia para la ejecucin en paralelo de porciones de cdigo, conocidas como hilos de ejecucin. Objetivo: Que el participante conozca y comprenda la programacin multihilo.

Descripcin de la actividad

1. Hacer la lectura titulada Por qu y cmo usar hilos. 2. Para profundizar tus conocimientos, consulta la informacin de la pgina Web 3.

http://www.ibiblio.org/javafaq/course/week11/index.html. Sin utilizar hilos, desarrollar un programa (aplicacin o applet) que tenga dos

4.

botones y un TextArea. Al presionar un botn, el TextArea comenzar a parpadear entre dos colores (azul y rojo), y al presionar el segundo botn el parpadeo parar. Funciona como se tena previsto? Si la respuesta es NO. Entonces se necesitan hilos Si la respuesta es SI. Analizar, pues este caso no puede funcionar sin hilos. Hacer una reflexin sobre lo visto en esta actividad. Entrega el resultado en un documento de Word en la plataforma.

Programacin multihilo
Objetivo especfico de aprendizaje Conocer los fundamentos bsicos del manejo de hilos

Producto a entregar Como resultado de la actividad el alumno: - Conocer qu es un hilo. - Comprender la diferencia entre un multihilo y un multiproceso. - Sabr por qu se utilizan los hilos en la programacin.

Descripcin de la actividad

1. Hacer la lectura titulada Que son los hilos. 2. Leer del tutorial de SUN el captulo de Threads 3. 4. 5.

(http://java.sun.com/docs/books/tutorial/essential/threads/index.html ). En un documento en Word, con tus datos, explicar el concepto de hilo, qu diferencia existe entre multihilo y multiproceso, describir las ventajas que ofrece la programacin con hilos. Enviar el documento por la plataforma para su revisin. Comparte la informacin que encontraste con tus compaeros utilizando el foro de discusin Ventajas de la programacin con hilos que se encuentra dentro de este mismo curso.

6. Adems, dentro del foro de discusin Ventajas de la programacin con hilos,


complementa o retroalimenta una aportacin de algn compaero.

GENERALIDADES La Programacin Orientada a Objetos (OOP Object Oriented Programming) permite a los programadores escribir software, de forma que est organizado en la misma manera que el problema que trata de modelar. Este curso esta orientado a Aplicar los conocimientos ms bsicos del lenguaje Java para poder desarrollar una solucin computacional en la que se utilicen clculos, se desarrollen acciones en base a decisiones y se repitan instrucciones. Este mdulo es el primero de un grupo de cursos que forman parte del programa de formacin: Programacin Orientado a Objetos: Java .Este programa se compone de los siguientes mdulos:

I. Variables y estructuras de control en la programacin orientada a objetos : java II. Desarrollo de Aplicaciones con interfaz Grfica y manejo de clases y objetos III. Desarrollo de Aplicaciones con Manejo de Datos en la Memoria IV. Desarrollo de Aplicaciones con Manejo de Archivos de Texto y el Manejo de Excepciones en Java V. Desarrollo de Aplicaciones con Manejo de Proceso Simultaneo y uso de Mens VI. Desarrollo de Applets/Aplicaciones con uso de Base de Datos, Redes, Servlets y Multimedia

Contenidos I: Unidades Didcticas: 1. Introduccin a la Programacin Orientada a Objetos 2. Solucin a Problemas Bsicos 3. Decisiones 4. Ciclos Metodologa Competencia (s) Laboral (es) y/o profesional (es): Al finalizar el curso el alumno ser capaz de: 1. Comprender la terminologa bsica del entorno en el que trabaja Java. 2. Instalar el paquete de desarrollo de Java en cualquier computadora. 3. Compilar un applet o una aplicacin para poder utilizarla en cualquier computadora 4. Utilizar los diferentes tipos de variables en Java para poder realizar operaciones. 5. Utilizar las instrucciones necesarias de Java para tomar datos del usuario y as poder realizar operaciones con ellos, proporcionando resultados. 6. Utilizar la jerarqua de las operaciones aritmticas en Java. 7. Utilizar las condiciones en Java para implementar diferentes acciones a tomar en una decisin. 8. Utilizar la jerarqua de las operaciones lgicas en Java. 9. Utilizar las estructuras de repeticin de Java para poder implantarlos en alguna solucin que lo requiera. 10. Explicar lo que realiza un applet o aplicacin hecha, sin ejecutarla, teniendo solamente las estructuras bsicas de operaciones aritmticas, operaciones lgicas, y repeticiones.

I. Variables y estructuras de control en la programacin orientada a objetos : java


PREFACIO Cuando hace dos cursos el profesor Francisco Jos Garca Pealvo nos propuso redactar el esbozo de un tutorial sobre Java, de carcter voluntario, y aunque los alumnos siempre somos reacios a una carga de trabajo sin compensacin en la calificacin, sorprendentemente, los alumnos aceptamos. La continua apuesta de "Fran" por su alumnado, y la confianza que en nosotros deposit, realmente nos estimul a dar todo lo mejor de nosotros. Aunque desgraciadamente aquel ao no toda la clase pudiera superar la asignatura, sobre todo por la carga docente, pocas voces he odo en desacuerdo con las novedosas formas docentes que aquel ao se experimentaron. Aunque la redaccin de la primera versin, hecha por diferentes grupos de trabajo, era muy vaga, heterognea y estaba llena de erratas, ha sido el pilar de este tutorial, tanto como esquema de temas a tratar, como bibliografa a manejar. En la redaccin de este tutorial se ha pretendido abarcar el mayor nmero de aspectos posibles de la gran variedad de temas que rodean a Java. Espero no haber perdido nunca de vista que este tutorial debe de servir tanto a expertos informticos como a programadores de cualquier tipo que, aun no teniendo idea de programacin orientada a objetos, tengan inters en Java. As mismo espero que la bibliografa aportada sea suficiente para aquellos que hayis quedado prendados de la potencia de este nuevo lenguaje de programacin. Debo decir que mientras desarrollaba este tutorial me ha impresionado la potencia de Java por tres motivos principales:

Sus amplias bibliotecas multiplataforma. La posibilidad de desarrollar aplicaciones que funcionen en Internet

mediante navegadores (applets). Todo ello con un lenguaje orientado a objeto sencillo pero potente.

Esperemos que pronto los problemas de incompatibilidad entre Microsoft Explorer y Netscape Navigator se solucionen, con lo que se vivir un futuro lleno de esplendor para Java. Contenidos Este tutorial ha sido dividido en una serie de temas (cada uno de ellos compuesto de varios apartados) para una ms fcil consulta y una mayor claridad en cunto a qu se est intentando explicar. A continuacin se detalla de una forma general los contenidos de cada uno de los apartados. En el primer tema "I. Introduccin" se intenta acercar al lector el mundo Java desde una perspectiva global; su historia, sus caractersticas principales y una comparativa con otros lenguajes orientados a objeto, para que el lector pueda juzgar si le interesa aprender Java y para que vaya vislumbrando en qu puntos le va a interesar profundizar. En un primer apartado se introducen todos los conceptos necesarios para poder entender un lenguaje de programacin orientado a objeto, como es Java. Este apartado debe ser de especial inters para todos aquellos lectores que no hayan desarrollado jams programas en un lenguaje orientado a objeto, y debe facilitar la comprensin de muchos conceptos bsicos para un mejor entendimiento del resto del tutorial. El segundo tema "II. Lenguaje" define todos los conceptos bsicos y sintaxis del lenguaje Java; las estructuras que utiliza, su sintaxis, sus sistemas de control... Los cuatro primeros apartados de este tema son fundamentales para comprender cualquier fragmento de cdigo Java, y aunque sencillos son similares a los de cualquier otro lenguaje de programacin. Los temas cinco, seis y siete introducen los aspectos orientados a objeto del lenguaje Java, comenzando desde los ms sencillos como son los objetos y las clases hasta los ms complejos como pueden ser la herencia y el polimorfismo. Entre los apartados ocho y once se comentan diversos aspectos propios del

lenguaje Java, que dotan a los programas de una mayor potencia como son las excepciones, los threads, las interfaces y los paquetes. Por ltimo en el apartado doce se explican los fundamentos sobre la construccin de programas Java, aplicaciones que se pueden construir y diversos aspectos referentes a ellas. El tercer tema "III. Bibliotecas de la API de Java" trata, de una forma global, todas las bibliotecas de la API de Java que servirn para dotar a los programas de una gran potencia con multitud de clases e interfaces estndar ya programadas y distribuidas por Sun. Adems, en un par de apartados se explican las gestiones de las cadenas y de los flujos de entrada/salida que hace Java. Estas acciones se realizan de forma sensiblemente diferente a la de otros lenguajes de programacin, como por ejemplo C o C++. En el cuarto tema "IV. Bibliotecas grficas", se explican las dos bibliotecas que Java incorpora para desarrollar interfaces grficas de usuario: AWT y la nueva Swing. En el quinto tema "V. Java e Internet", se explica la potencia de Java para el desarrollo de aplicaciones en red, as como el paquete java.net, el cual da soporte a un montn de operaciones para el dilogo de diversas aplicaciones de red con aspectos como los sockets. En el sexto tema "VI. Applets" se explica el fundamento de este tipo de aplicaciones especialmente diseadas para su uso en Internet. Son caractersticas de Java y le aportan una potencia inusitada para el desarrollo de aplicaciones para Internet. Adems en este tema se acompaan una serie de ejemplos para intentar aclarar el desarrollo y funcionamiento de este tipo de aplicaciones. Por ltimo al tutorial se le adjuntan una serie de apndices que sirvan como breves reseas sobre diferentes aspectos de Java que por una u otra cuestin se ha decidido que vayan aparte de lo que es el bloque del lenguaje. As en el primer apndice "Apndice I: JDK", se explica en detalle el funcionamiento del JDK, herramienta que distribuye Sun para el desarrollo de aplicaciones Java. En el segundo apndice "Apndice II: Herramientas de desarrollo", se comentan

las diferentes herramientas disponibles en el mercado para desarrollar aplicaciones Java, depurarlas y probarlas. En un tercer apndice "Apndice III: Mtodos Nativos" se explica mediante un ejemplo de cmo Java es capaz de utilizar cdigo de aplicaciones escritas en otros lenguajes de programacin. En el cuarto apndice "Apndice IV: Gua de referencia de Java a C++" se explican las similitudes y diferencias entre estos dos lenguajes de programacin, dado que Java es un lenguaje derivado de C++, pero con notables diferencias respecto a su predecesor. Este apndice puede ser fundamental para aquellos programadores que proviniendo de C++ quieran conocer el lenguaje Java, ya que su similitud sintctica es, en muchos casos, engaosa. En el ltimo apndice "Apndice V: Gua de referencia del lenguaje", se explican, a modo de resumen, las caractersticas fundamentales del lenguaje Java Agradecimientos Me gustara aprovechar este momento para felicitar a Francisco Jos Garca Pealvo por el esfuerzo que hace por una docencia ms moderna y atractiva, as como la confianza que deposita en su alumnado, y por el agradable clima de trabajo que ha creado para la realizacin de este tutorial. As mismo me gustara agradecer al rea de Lenguajes y Sistemas Informticos de la Universidad de Burgos la confianza depositada en mi as como toda la documentacin bibliogrfica que me han facilitado. Por ltimo me gustara agradecer muy especialmente a Amelia Pajares Rojo su colaboracin espontnea en este proyecto, consiguiendo as un tutorial mucho ms claro y legible. Espero que este tutorial realmente os agrade a todos.

PRLOGO Prlogo de la primera versin de la gua de Java

Java es actualmente uno de esos trminos mgicos que revolucionan las tecnologas de la informacin cada cierto tiempo. Java es un lenguaje de programacin orientado a objetos creado por la compaa Sun Microsystems, que desde su aparicin en 1995 ha provocado una autentica conmocin en los entornos informticos. El xito del lenguaje Java viene de la mano de la filosofa y la forma de operacin de las aplicaciones escritas en Java, todo ello estrechamente ligado a Internet y al WWW. El hecho de que el lenguaje Java sea un lenguaje joven en evolucin no le ha permitido entrar a formar parte habitualmente de los currculum universitarios, poco dados a admitir innovaciones con tanta celeridad. Sin embargo, Java comienza a entrar en las Universidades Espaolas, especialmente de la mano de los proyectos de final de carrera en las titulaciones de informtica. Aprovechando la convocatoria de 1998 de la Consejera de Educacin y Cultura de la Junta de Castilla y Len para la concesin de ayudas para la elaboracin de Recursos de Apoyo a la Enseanza Universitaria en esta Comunidad Autonmica, se decidi realizar una actividad que tuviera como protagonista al lenguaje Java, a la vez que se exploraba una nueva forma de involucrar de una manera ms activa al alumnado en las actividades docentes, as como de incentivar al profesorado en aras de conseguir una docencia de mayor calidad. La actividad que se propuso llevar a cabo fue una Gua Hipermedia para el Aprendizaje del Lenguaje java. Con la realizacin de esta gua se perseguan una serie de objetivos tanto docentes como pragmticos. Los objetivos docentes estaban centrados en la bsqueda de la mejora de la calidad docente, reflejada en una mayor participacin de los alumnos y en una mejora de la relacin profesor-alumno. Los objetivos pragmticos se centraban en el acercamiento del lenguaje Java al curriculum de los alumnos matriculados en la asignatura "Programacin Avanzada" correspondiente al tercer curso de la titulacin "Ingeniera Tcnica en Informtica de Gestin en la Universidad de Burgos". A continuacin se recogen tanto los objetivos docentes como los objetivos pragmticos propuestos. Objetivos Docentes:

Establecer una nueva forma de participacin activa de los alumnos en el desarrollo de su currculum universitario, en contraposicin de la actitud

pasiva que tradicionalmente asume el alumno en las clases. Dotar a alumnos y profesores de las responsabilidades que conlleva la realizacin de una actividad en grupo. Completar los contenidos del curriculum universitario del alumno con temas novedosos que no suelen tener cabida en el programa de las asignaturas. Aumentar la cantidad y la calidad de la relacin profesor-alumno.

Objetivos Pragmticos:

Introducir el lenguaje Java dentro de la titulacin Ingeniera Tcnica en Informtica de Gestin de la Universidad de Burgos. Elaborar una gua de referencia hipermedia del lenguaje Java accesible va Internet y distribuble en CD-ROM. Esta gua podr ser utilizada tanto para el autoaprendizaje, como para material docente o como material de consulta en los proyectos de final de carrera. Aprender de la experiencia para repetir esta tcnica en otras asignaturas de la titulacin e incluso en otras Universidades.

Este proyecto se va a acometer en dos fases bien diferenciadas: Una primera fase (Enero 1998 Diciembre 1998) donde se planifica todo el proyecto y se obtiene una primera gua bsica de referencia bsica (producto que viene representado por la presente gua). Una segunda fase (Enero 1999 Diciembre 1999) donde se ampla la primera gua introductoria con los conceptos ms avanzados del lenguaje y se enriquece de los comentarios recibidos sobre la primera gua. Para la realizacin prctica de esta primera gua se ha utilizado exclusivamente HTML (Hyper Text Markup Language), debido a que sus caractersticas hipermedia lo hacen idneo para el desarrollo de este tipo de productos. La metodologa empleada para la creacin de esta gua ha consistido en formar grupos de trabajo formados por tres alumnos cada uno (los alumnos que formaban cada uno de los grupos eran alumnos de la asignatura Programacin Avanzada del tercer curso de la Ingeniera Tcnica en Informtica de Gestin de la Universidad de Burgos, que voluntariamente se ofrecieron para colaborar en esta iniciativa). Cada grupo se encargaba de elaborar una serie de temas que en su conjunto dan forma a la presente gua, siendo su trabajo coordinado por alguno de los profesores colaboradores. Una vez que los temas estaban

terminados eran revisados e integrados en la gua por el coordinador tcnico del proyecto. Burgos, 5 de Octubre de 1998 Miguel ngel Manzanedo del Campo Francisco Jos Garca Pealvo Prlogo de la segunda versin de la gua de Java En los casi dos aos en los que se ha venido desarrollando esta gua introductoria al lenguaje Java, hemos asistido al afianzamiento de Java como plataforma de desarrollo y a una constante evolucin que, aunque todava lejos de una madurez plena, ha abierto numerosos campos de aplicacin para esta plataforma (acceso a bases de datos, interaccin con CORBA, aplicaciones distribuidas...). Durante este tiempo han proliferado multitud de referencias en torno al fenmeno Java (en forma de libros, artculos, tutoriales...), sin embargo, la gua que hemos realizado no pretende sustituir a ninguno de ellos, sino ms bien completarlos presentando una forma sencilla y directa de introducirse al lenguaje Java y ofreciendo un acceso sencillo basado en la facilidad de navegacin hipermedia que aporta HTML. A parte de la gua realizada, como producto final resultado del proyecto financiado por la Consejera de Educacin y Cultura de la Junta de Castilla y Len en su convocatoria de ayudas de 1998, este proyecto ha aportado unas experiencias especialmente interesantes al verse satisfechos los objetivos docentes y pragmticos que se buscaban al iniciar este trabajo, y que se indicaban en el prlogo a la primera versin de esta gua que aqu se presenta. Si personalmente, tuviera que destacar una sola cosa de esta experiencia, no dudara en destacar el valor humano logrado al potenciar la relacin profesoralumno (hoy en da ex-alumnos) y entre compaeros de diferentes Universidades de Castilla y Len para lograr el fin extra acadmico propuesto. Tambin me gustara destacar el hecho constatado de que la elaboracin de esta gua a contribuido en gran manera a la introduccin del lenguaje Java dentro de la titulacin de Ingeniera Tcnica en Informtica de Gestin de la Universidad de Burgos, y est haciendo lo propio en la Ingeniera Tcnica en Informtica de Sistemas de la Universidad de Salamanca.

En el mbito tcnico destacar la revisin realizada de los contenidos de la primera versin de la gua, as como la ampliacin en temas relacionados con la programacin cliente/servidor en Internet, los entornos grficos de usuario o la incorporacin de mtodos nativos entre otros interesantes temas, que dan un enorme valor a esta gua como fuente de referencia prctica. No quisiera terminar este prlogo sin antes tener unas palabras de agradecimiento y recuerdo para todos aqullos que participaron de una u otra manera en la elaboracin de esta gua, especialmente para mis ex-compaeros del rea de Lenguajes y Sistemas Informticos de la Universidad de Burgos, para todos mis antiguos alumnos que se dejaron "engaar" para iniciar esta aventura y para Ignacio Cruzado cuyo trabajo en estos ltimos meses ha dotado de contenido y forma a la versin de la gua que hoy se hace realidad.

I.1. INTRODUCCIN A LA PROGRAMACIN ORIENTADA A OBJETOS A. Programacin Orientada a Objetos La orientacin a objetos es un paradigma de programacin que facilita la creacin de software de calidad por sus factores que potencian el mantenimiento, la extensin y la reutilizacin del software generado bajo este paradigma. La programacin orientada a objetos trata de amoldarse al modo de pensar del hombre y no al de la mquina. Esto es posible gracias a la forma racional con la que se manejan las abstracciones que representan las entidades del dominio del problema, y a propiedades como la jerarqua o el encapsulamiento. El elemento bsico de este paradigma no es la funcin (elemento bsico de la programacin estructurada), sino un ente denominado objeto. Un objeto es la representacin de un concepto para un programa, y contiene toda la informacin necesaria para abstraer dicho concepto: los datos que describen su estado y las operaciones que pueden modificar dicho estado, y determinan las capacidades del objeto. Java incorpora el uso de la orientacin a objetos como uno de los pilares bsicos de su lenguaje.

B. Los objetos Podemos definir objeto como el "encapsulamiento de un conjunto de operaciones (mtodos) que pueden ser invocados externamente, y de un estado que recuerda el efecto de los servicios". [Piattini et al., 1996]. Un objeto adems de un estado interno, presenta una interfaz para poder interactuar con el exterior. Es por esto por lo que se dice que en la programacin orientada a objetos "se unen datos y procesos", y no como en su predecesora, la programacin estructurada, en la que estaban separados en forma de variables y funciones. Un objeto consta de:

Tiempo de vida: La duracin de un objeto en un programa siempre est limitada en el tiempo. La mayora de los objetos slo existen durante una parte de la ejecucin del programa. Los objetos son creados mediante un mecanismo denominado instanciacin, y cuando dejan de existir se dice que son destruidos. Estado: Todo objeto posee un estado, definido por sus atributos. Con l se definen las propiedades del objeto, y el estado en que se encuentra en un momento determinado de su existencia. Comportamiento: Todo objeto ha de presentar una interfaz, definida por sus mtodos, para que el resto de objetos que componen los programas puedan interactuar con l.

El equivalente de un objeto en el paradigma estructurado sera una variable. As mismo la instanciacin de objetos equivaldra a la declaracin de variables, y eltiempo de vida de un objeto al mbito de una variable. C. Las clases Las clases son abstracciones que representan a un conjunto de objetos con un comportamiento e interfaz comn. Podemos definir una clase como "un conjunto de cosas (fsicas o abstractas) que tienen el mismo comportamiento y caractersticas... Es la implementacin de un tipo de objeto (considerando los objetos como instancias de las clases)". [Piattini et al., 1996]. Una clase no es ms que una plantilla para la creacin de objetos. Cuando se crea

un objeto (instanciacin) se ha de especificar de qu clase es el objeto instanciado, para que el compilador comprenda las caractersticas del objeto. Las clases presentan el estado de los objetos a los que representan mediante variables denominadas atributos. Cuando se instancia un objeto el compilador crea en la memoria dinmica un espacio para tantas variables como atributos tenga la clase a la que pertenece el objeto. Los mtodos son las funciones mediante las que las clases representan el comportamiento de los objetos. En dichos mtodos se modifican los valores de los atributos del objeto, y representan las capacidades del objeto (en muchos textos se les denomina servicios). Desde el punto de vista de la programacin estructurada, una clase se asemejara a un mdulo, los atributos a las variables globales de dicho mdulo, y los mtodos a las funciones del mdulo. D. Modelo de objetos Existen una serie de principios fundamentales para comprender cmo se modeliza la realidad al crear un programa bajo el paradigma de la orientacin a objetos. Estos principios son: la abstraccin, el encapsulamiento, la modularidad, la jerarqua, el paso de mensajes y el poliforfismo.
a.) Principio de Abstraccin

Mediante la abstraccin la mente humana modeliza la realidad en forma de objetos. Para ello busca parecidos entre la realidad y la posible implementacin de objetos del programa que simulen el funcionamiento de los objetos reales. Los seres humanos no pensamos en las cosas como un conjunto de cosas menores; por ejemplo, no vemos un cuerpo humano como un conjunto de clulas. Los humanos entendemos la realidad como objetos con comportamientos bien definidos. No necesitamos conocer los detalles de porqu ni cmo funcionan las cosas; simplemente solicitamos determinadas acciones en espera de una respuesta; cuando una persona desea desplazarse, su cuerpo le responde comenzando a caminar. Pero la abstraccin humana se gestiona de una manera jerrquica, dividiendo sucesivamente sistemas complejos en conjuntos de subsistemas, para as entender ms fcilmente la realidad. Esta es la forma de pensar que la orientacin a objeto intenta cubrir.

b.) Principio de Encapsulamiento

El encapsulamiento permite a los objetos elegir qu informacin es publicada y qu informacin es ocultada al resto de los objetos. Para ello los objetos suelen presentar sus mtodos como interfaces pblicas y sus atributos como datos privados e inaccesibles desde otros objetos. Para permitir que otros objetos consulten o modifiquen los atributos de los objetos, las clases suelen presentar mtodos de acceso. De esta manera el acceso a los datos de los objetos es controlado por el programador, evitando efectos laterales no deseados. Con el encapsulado de los datos se consigue que las personas que utilicen un objeto slo tengan que comprender su interfaz, olvidndose de cmo est implementada, y en definitiva, reduciendo la complejidad de utilizacin.
c.) Principio de Modularidad

Mediante la modularidad, se propone al programador dividir su aplicacin en varios mdulos diferentes (ya sea en forma de clases, paquetes o bibliotecas), cada uno de ellos con un sentido propio. Esta fragmentacin disminuye el grado de dificultad del problema al que da respuesta el programa, pues se afronta el problema como un conjunto de problemas de menor dificultad, adems de facilitar la comprensin del programa.
d.) Principio de Jerarqua

La mayora de nosotros ve de manera natural nuestro mundo como objetos que se relacionan entre s de una manera jerrquica. Por ejemplo, un perro es un mamfero, y los mamferos son animales, y los animales seres vivos... Del mismo modo, las distintas clases de un programa se organizan mediante la jerarqua. La representacin de dicha organizacin da lugar a los denominados rboles de herencia:

Imagen 1: Ejemplo de rbol de herencia Mediante la herencia una clase hija puede tomar determinadas propiedades de una clase padre. As se simplifican los diseos y se evita la duplicacin de cdigo al no tener que volver a codificar mtodos ya implementados. Al acto de tomar propiedades de una clase padre se denomina heredar.
e.) Principio del Paso de Mensajes

Mediante el denominado paso de mensajes, un objeto puede solicitar de otro objeto que realice una accin determinada o que modifique su estado. El paso de mensajes se suele implementar como llamadas a los mtodos de otros objetos. Desde el punto de vista de la programacin estructurada, esto correspondera con la llamada a funciones.
f.) Principio de Polimorfismo

Polimorfismo quiere decir "un objeto y muchas formas". Esta propiedad permite que un objeto presente diferentes comportamientos en funcin del contexto en que se encuentre. Por ejemplo un mtodo puede presentar diferentes implementaciones en funcin de los argumentos que recibe, recibir diferentes nmeros de parmetros para realizar una misma operacin, y realizar diferentes acciones dependiendo del nivel de abstraccin en que sea llamado. E. Relaciones entre objetos Durante la ejecucin de un programa, los diversos objetos que lo componen han de interactuar entre s para lograr una serie de objetivos comunes. Existen varios tipos de relaciones que pueden unir a los diferentes objetos, pero entre ellas destacan las relaciones de: asociacin, todo/parte, y

generalizacin/especializacin.
a.) Relaciones de Asociacin

Seran relaciones generales, en las que un objeto realiza llamadas a los servicios (mtodos) de otro, interactuando de esta forma con l. Representan las relaciones con menos riqueza semntica.
b.) Relaciones de Todo/Parte

Muchas veces una determinada entidad existe como conjuncin de otras entidades, como un conglomerado de ellas. La orientacin al objeto recoge este tipo de relaciones como dos conceptos; la agregacin y la composicin. En este tipo de relaciones un objeto componente se integra en un objeto compuesto. La diferencia entre agregacin y composicin es que mientras que la composicin se entiende que dura durante toda la vida del objeto componedor, en la agregacin no tiene por qu ser as. Esto se puede implementar como un objeto (objeto compuesto) que cuenta entre sus atributos con otro objeto distinto (objeto componente).
c.) Relaciones de Generalizacin/Especializacin

A veces sucede que dos clases tiene muchas de sus partes en comn, lo que normalmente se abstrae en la creacin de una tercera clase (padre de las dos) que rene todas sus caractersticas comunes. El ejemplo ms extendido de este tipo de relaciones es la herencia, propiedad por la que una clase (clase hija) recoge aquellos mtodos y atributos que una segunda clase (clase padre) ha especificado como "heredables". Este tipo de relaciones es caracterstico de la programacin orientada a objetos. En realidad, la generalizacin y la especializacin son diferentes perspectivas del mismo concepto, la generalizacin es una perspectiva ascendente (bottom-up), mientras que la especializacin es una perspectiva descendente (top-down). Para ms informacin sobre el modelo de objetos en la programacin avanzada, y las relaciones entre objetos vase [Garca, 1998] o para una informacin ms detallada consulte [Booch, 1996].

I.2. HISTORIA DE JAVA A. Por qu se dise Java? Los lenguajes de programacin C y Fortran se han utilizado para disear algunos de los sistemas ms complejos en lenguajes de programacin estructurada, creciendo hasta formar complicados procedimientos. De ah provienen trminos como "cdigo de espagueti" o "canguros" referentes a programas con mltiples saltos y un control de flujo difcilmente trazable. No slo se necesitaba un lenguaje de programacin para tratar esta complejidad, sino un nuevo estilo de programacin. Este cambio de paradigma de la programacin estructurada a la programacin orientada a objetos, comenz hace 30 aos con un lenguaje llamado Simula67. El lenguaje C++ fue un intento de tomar estos principios y emplearlos dentro de las restricciones de C. Todos los compiladores de C++ eran capaces de compilar programas de C sin clases, es decir, un lenguaje capaz de interpretar dos estilos diferentes de programacin. Esta compatibilidad ("hacia atrs") que habitualmente se vende como una caracterstica de C++ es precisamente su punto ms dbil. No es necesario utilizar un diseo orientado a objetos para programar en C++, razn por la que muchas veces las aplicaciones en este lenguaje no son realmente orientadas al objeto, perdiendo as los beneficios que este paradigma aporta. As Java utiliza convenciones casi idnticas para declaracin de variables, paso de parmetros, y dems, pero slo considera las partes de C++ que no estaban ya en C. Las principales caractersticas que Java no hereda de C++ son:

Punteros: Las direcciones de memoria son la caracterstica ms poderosa de C++. El inadecuado uso de los punteros provoca la mayora de los errores de colisin de memoria, errores muy difciles de detectar. Adems, casi todos los virus que se han escrito aprovechan la capacidad de un programa para acceder a la memoria voltil (RAM) utilizando punteros. En Java, no existen punteros, evitando el acceso directo a la memoria

voltil. Variables globales: Con ellas cualquier funcin puede producir efectos laterales, e incluso se pueden producir fallos catastrficos cuando algn otro mtodo cambia el estado de la variable global necesaria para la realizacin de otros procesos. En Java lo nico global es el nombre de las clases. goto: Manera rpida de arreglar un programa sin estructurar el cdigo. Java no tiene ninguna sentencia goto. Sin embargo Java tiene las sentencias break ycontinue que cubren los casos importantes de goto. Asignacin de memoria: La funcin malloc de C, asigna un nmero especificado de bytes de memoria devolviendo la direccin de ese bloque. La funcin freedevuelve un bloque asignado al sistema para que lo utilice. Si se olvida de llamar a free para liberar un bloque de memoria, se estn limitando los recursos del sistema, ralentizando progresivamente los programas. Si por el contrario se hace un free sobre un puntero ya liberado, puede ocurrir cualquier cosa. Ms tarde C++ aadi new y delete, que se usan de forma similar, siendo todava el programador, el responsable de liberar el espacio de memoria. Java no tiene funciones malloc ni free. Se utiliza el operador new para asignar un espacio de memoria a un objeto en el montculo de memoria. Con new no se obtiene una direccin de memoria sino un descriptor al objeto del montculo. La memoria real asignada a ese objeto se puede mover a la vez que el programa se ejecuta, pero sin tener que preocuparse de ello. Cuando no tenga ninguna referencia de ningn objeto, la memoria ocupada estar disponible para que la reutilice el resto del sistema sin tener que llamar a free o delete. A esto se le llama recogida de basura. El recolector de basura se ejecuta siempre que el sistema est libre, o cuando una asignacin solicitada no encuentre asignacin suficiente. Conversin de tipos insegura: Los moldeados de tipo (type casting) son un mecanismo poderoso de C y C++ que permite cambiar el tipo de un puntero. Esto requiere extremada precaucin puesto que no hay nada previsto para detectar si la conversin es correcta en tiempo de ejecucin. En Java se puede hacer una comprobacin en tiempo de ejecucin de la compatibilidad de tipos y emitir una excepcin cuando falla.

B. Comienzos Java fue diseado en 1990 por James Gosling, de Sun Microsystems, como software para dispositivos electrnicos de consumo. Curiosamente, todo este lenguaje fue diseado antes de que diese comienzo la era World Wide Web, puesto que fue diseado para dispositivos electrnicos como calculadoras,

microondas y la televisin interactiva.

Imagen 2: Logotipo de la empresa Sun Microsystems En los primeros aos de la dcada de los noventa, 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. Inicialmente Java se llam Oak (roble en ingls), aunque tuvo que cambiar de denominacin, debido a que dicho nombre ya estaba registrado por otra empresa. Se dice este nombre se le puso debido a la existencia de tal rbol en los alrededores del lugar de trabajo de los promotores del lenguaje. Tres de las principales razones que llevaron a crear Java son: 1. Creciente necesidad de interfaces mucho ms cmodas e intuitivas que los sistemas de ventanas que proliferaban hasta el momento. 2. Fiabilidad del cdigo y facilidad de desarrollo. Gosling observ que muchas de las caractersticas que ofrecan C o C++ aumentaban de forma alarmante el gran coste de pruebas y depuracin. Por ello en los sus ratos libres cre un lenguaje de programacin donde intentaba solucionar los fallos que encontraba en C++. 3. Enorme diversidad de controladores electrnicos. Los dispositivos electrnicos se controlan mediante la utilizacin de microprocesadores de bajo precio y reducidas prestaciones, que varan cada poco tiempo y que utilizan diversos conjuntos de instrucciones. Java permite escribir un cdigo comn para todos los dispositivos. Por todo ello, en lugar de tratar nicamente de optimizar las tcnicas de desarrollo y dar por sentada la utilizacin de C o C++, el equipo de Gosling se plante que tal vez los lenguajes existentes eran demasiado complicados como para conseguir reducir de forma apreciable la complejidad de desarrollo asociada a ese campo. Por este motivo, su primera propuesta fue idear un nuevo lenguaje de programacin lo ms sencillo posible, con el objeto de que se pudiese adaptar con facilidad a cualquier entorno de ejecucin.

Basndose en el conocimiento y estudio de gran cantidad de lenguajes, este grupo decidi recoger las caractersticas esenciales que deba tener un lenguaje de programacin moderno y potente, pero eliminando todas aquellas funciones que no eran absolutamente imprescindibles. Para ms informacin vase [Cuenca, 1997]. C. Primeros proyectos en que se aplic Java El proyecto Green fue el primero en el que se aplic Java, y consista en un sistema de control completo de los aparatos electrnicos y el entorno de un hogar. Con este fin 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 ya Duke, la actual mascota de Java.

Imagen 3: Icono de Duke, la mascota de Java Ms tarde Java se aplic a otro proyecto denominado VOD (Video On Demand) en el que se empleaba como interfaz para la televisin interactiva que se pensaba iba a ser el principal campo de aplicacin de Java. Ninguno de estos proyectos se convirti nunca en un sistema comercial, pero fueron desarrollados enteramente en un Java primitivo. Una vez que en Sun se dieron cuenta de que a corto plazo la televisin interactiva no iba a ser un gran xito, instaron a FirstPerson a desarrollar nuevas estrategias que produjeran beneficios. Entre ellas se encontraba la aplicacin de Java a Internet, la cual no se consider productiva en ese momento. Para ms informacin vase [Froufe, 1997]. D. Resurgimiento de Java Aunque muchas de las fuentes consultadas sealan que Java no lleg a caer en un olvido, lo cierto es que tuvo que ser Bill Joy (cofundador de Sun y uno de los desarrolladores principales del sistema operativo Unix de Berckley) el que sac a Java del letargo en que estaba sumido. Joy juzg que Internet podra llegar a ser

el campo adecuado para disputar a Microsoft su primaca en el terreno del software, y vio en Oak el instrumento idneo para llevar a cabo estos planes. Para poder presentarlo en sociedad se tuvo que modificar el nombre de este lenguaje de programacin y se tuvo que realizar una serie de modificaciones de diseo para poderlo adaptar al propsito mencionado. As Java fue presentado en sociedad en agosto de 1995. Algunas de las razones que llevaron a Bill Joy a pensar que Java podra llegar a ser rentable son:

Java es un lenguaje orientado a objetos: Esto es lo que facilita abordar la resolucin de cualquier tipo de problema. Es un lenguaje sencillo, aunque sin duda potente. La ejecucin del cdigo Java es segura y fiable: Los programas no acceden directamente a la memoria del ordenador, siendo imposible que un programa escrito en Java pueda acceder a los recursos del ordenador sin que esta operacin le sea permitida de forma explcita. De este modo, los datos del usuario quedan a salvo de la existencia de virus escritos en Java. La ejecucin segura y controlada del cdigo Java es una caracterstica nica, que no puede encontrarse en ninguna otra tecnologa. Es totalmente multiplataforma: Es un lenguaje sencillo, por lo que el entorno necesario para su ejecucin es de pequeo tamao y puede adaptarse incluso al interior de un navegador.

Las consecuencias de la utilizacin de Java junto a la expansin universal de Internet todava estn comenzando a vislumbrarse. Para ms informacin vase [Froufe, 1997]. E. Futuro de Java Existen muchas crticas a Java debido a su lenta velocidad de ejecucin, aproximadamente unas 20 veces ms lento que un programa en lenguaje C. Sun est trabajando intensamente en crear versiones de Java con una velocidad mayor. El problema fundamental de Java es que utiliza una representacin intermedia denominada cdigo de byte para solventar los problemas de portabilidad. Los cdigos de byte posteriormente se tendrn que transformar en cdigo mquina en cada mquina en que son utilizados, lo que ralentiza

considerablemente el proceso de ejecucin. La solucin que se deriva de esto parece bastante obvia: fabricar ordenadores capaces de comprender directamente los cdigos de byte. stas seran unas mquinas que utilizaran Java como sistema operativo y que no requeriran en principio de disco duro porque obtendran sus recursos de la red. A los ordenadores que utilizan Java como sistema operativo se les llama Network Computer, WebPC o WebTop. La primera gran empresa que ha apostado por este tipo de mquinas ha sido Oracle, que en enero de 1996 present en Japn su primer NC (Network Computer), basado en un procesador RISC con 8 Megabytes de RAM. Tras Oracle, han sido compaas del tamao de Sun, Apple e IBM las que han anunciado desarrollos similares. La principal empresa en el mundo del software, Microsoft, que en los comienzos de Java no estaba a favor de su utilizacin, ha licenciado Java, lo ha incluido en Internet Explorer (versin 3.0 y posteriores), y ha lanzado un entorno de desarrollo para Java, que se denomina Visual J++. El nico problema aparente es la seguridad para que Java se pueda utilizar para transacciones crticas. Sun va a apostar por firmas digitales, que sern clave en el desarrollo no slo de Java, sino de Internet. Para ms informacin vase [Framin, 1997]. F. Especulacin sobre el futuro de Java En opinin de los redactores de este tutorial, Java es una plataforma que le falta madurar, pero que a buen seguro lo va a hacer. La apuesta realizada por empresas con mucho peso especfico ha sido tan grande que va a dar un impulso a Java que no le permitir caer Adems, el parque de productos (entornos de desarrollo, bibliotecas, elementos de conectividad...) ya disponible en la actualidad es tan amplio que es improbable que se quede en nada. Por otra parte, la relacin simbitica que tiene con Internet (y por derivacin con las Intranets) es un punto a favor de Java de muy difcil refutacin.

I.3. CARACTERSTICAS DE JAVA A. Introduccin No es arriesgado afirmar que Java supone un significativo avance en el mundo de los entornos software, y esto viene avalado por tres elementos claves que diferencian a este lenguaje desde un punto de vista tecnolgico:

Es un lenguaje de programacin que ofrece la potencia del diseo orientado a objetos con una sintaxis fcilmente accesible y un entorno robusto y agradable. Proporciona un conjunto de clases potente y flexible. Pone al alcance de cualquiera la utilizacin de aplicaciones que se pueden incluir directamente en pginas Web (aplicaciones denominadas applets).

Java aporta a la Web una interactividad que se haba buscado durante mucho tiempo entre usuario y aplicacin. A lo largo de este apartado se estudian en detalle las principales caractersticas de Java. B. Potente
a.) Orientacin a objetos

En este aspecto Java fue diseado partiendo de cero, no siendo derivado de otro lenguaje anterior y no tiene compatibilidad con ninguno de ellos. En Java el concepto de objeto resulta sencillo y fcil de ampliar. Adems se conservan elementos "no objetos", como nmeros, caracteres y otros tipos de datos simples.
b.) Riqueza semntica

Pese a su simpleza se ha conseguido un considerable potencial, y aunque cada tarea se puede realizar de un nmero reducido de formas, se ha conseguido un gran potencial de expresin e innovacin desde el punto de vista del programador.
c.) Robusto

Java verifica su cdigo al mismo tiempo que lo escribe, y una vez ms antes de ejecutarse, de manera que se consigue un alto margen de codificacin sin errores. Se realiza un descubrimiento de la mayor parte de los errores durante el tiempo de compilacin, ya que Java es estricto en cuanto a tipos y declaraciones, y as lo que es rigidez y falta de flexibilidad se convierte en eficacia. Respecto a la gestin de memoria, Java libera al programador del compromiso de tener que controlar especialmente la asignacin que de sta hace a sus necesidades especficas. Este lenguaje posee una gestin avanzada de memoria llamada gestin de basura, y un manejo de excepciones orientado a objetos integrados. Estos elementos realizarn muchas tareas antes tediosas a la vez que obligadas para el programador.
d.) Modelo de objeto rico

Existen varias clases que contienen las abstracciones bsicas para facilitar a los programas una gran capacidad de representacin. Para ello se contar con un conjunto de clases comunes que pueden crecer para admitir todas las necesidades del programador. Adems la biblioteca de clases de Java proporciona un conjunto nico de protocolos de Internet. El conjunto de clases ms complicado de Java son sus paquetes grficos AWT (Abstract Window Toolkit) y Swing. Estos paquetes implementan componentes de una interfaz de usuario grfica bsica comn a todos los ordenadores personales modernos. C. Simple
a.) Fcil aprendizaje

El nico requerimiento para aprender Java es tener una comprensin de los conceptos bsicos de la programacin orientada a objetos. As se ha creado un lenguaje simple (aunque eficaz y expresivo) pudiendo mostrarse cualquier planteamiento por parte del programador sin que las interioridades del sistema subyacente sean desveladas. Java es ms complejo que un lenguaje simple, pero ms sencillo que cualquier otro entorno de programacin. El nico obstculo que se puede presentar es conseguir comprender la programacin orientada a objetos, aspecto que, al ser independiente del lenguaje, se presenta como insalvable.

b.) Completado con utilidades

El paquete de utilidades de Java viene con un conjunto completo de estructuras de datos complejas y sus mtodos asociados, que sern de inestimable ayuda para implementar applets y otras aplicaciones ms complejas. Se dispone tambin de estructuras de datos habituales, como pilas y tablas hash, como clases ya implementadas. Existir una interfaz Observer/Observable que permitir la implementacin simple de objetos dinmicos cuyo estado se visualiza en pantalla. El JDK (Java Development Kit) suministrado por Sun Microsystems incluye un compilador, un intrprete de aplicaciones, un depurador en lnea de comandos, y un visualizador de applets entre otros elementos. D. Interactivo y orientado a red
a.) Interactivo y animado

Uno de los requisitos de Java desde sus inicios fue la posibilidad de crear programas en red interactivos, por lo que es capaz de hacer varias cosas a la vez sin perder rastro de lo que debera suceder y cundo. Para se da soporte a la utilizacin de mltiples hilos de programacin (multithread). Las aplicaciones de Java permiten situar figuras animadas en las pginas Web, y stas pueden concebirse con logotipos animados o con texto que se desplace por la pantalla. Tambin pueden tratarse grficos generados por algn proceso. Estas animaciones pueden ser interactivas, permitiendo al usuario un control sobre su apariencia.
b.) Arquitectura neutral

Java est diseado para que un programa escrito en este lenguaje sea ejecutado correctamente independientemente de la plataforma en la que se est actuando (Macintosh, PC, UNIX). Para conseguir esto utiliza una compilacin en una representacin intermedia que recibe el nombre de cdigos de byte, que pueden interpretarse en cualquier sistema operativo con un intrprete de Java. La desventaja de un sistema de este tipo es el rendimiento; sin embargo, el hecho de que Java fuese diseado para funcionar razonablemente bien en microprocesadores de escasa potencia, unido a la sencillez de traduccin a cdigo mquina hacen que Java supere esa desventaja sin problemas.

c.) Trabajo en red

Java anima las pginas Web y hace posible la incorporacin de aplicaciones interactivas y especializadas. Aporta la posibilidad de distribuir contenidos ejecutables, de manera que los suministradores de informacin de la Web pueden crear una pgina de hipertexto (pgina Web) con una interaccin continuada y compleja en tiempo real; el contenido ejecutable es transferido literalmente al ordenador del usuario. Los protocolos bsicos para trabajar en Internet estn encapsulados en unas cuantas clases simples. Se incluyen implementaciones ampliables de los protocolos FTP, HTTP, NNTP y SMTP junto con conectores de red de bajo nivel e interfaces de nombrado. Esto le permite interactuar con esos servicios de red poderosos sin tener que comprender realmente los detalles de bajo nivel de esos protocolos. Este lenguaje est diseado para cumplir los requisitos de entrega de contenidos interactivos mediante el uso de applets insertados en sus pginas HTML. Adems, las clases de Java admiten muy bien estos protocolos y formatos. El envo de las clases de Java a travs de Internet se realiza con gran facilidad, ya que existe una interfaz unificada, resolviendo as los tpicos problemas de diferencia de versiones. Java proporciona un conjunto de clases para tratar con una abstraccin de los conectores de red (sockets) originales de la versin UNIX de Berckley, encapsular la nocin de una direccin de Internet o conectar sockets con flujos de datos de Entrada/Salida. Con todas estas posibilidades aumenta el dinamismo y competitividad de la Web, puesto que es capaz de captar el inters del usuario durante largo tiempo y permite a los programadores convertir la Web en un sistema de entrega de software.
d.) Applets

Una applet (miniaplicacin) es un pequeo programa en Java transferido dinmicamente a travs de Internet. Presentan un comportamiento inteligente, pudiendo reaccionar a la entrada de un usuario y cambiar de forma dinmica. Sin embargo, la verdadera novedad es el gran potencial que Java proporciona en este aspecto, haciendo posible que los programadores ejerzan un control sobre los programas ejecutables de Java que no es posible encontrar en otros lenguajes. E. Y mucho ms

a.) Seguridad

Existe una preocupacin lgica en Internet por el tema de la seguridad: virus, caballos de Troya, y programas similares navegan de forma usual por la red, constituyendo una amenaza palpable. Java ha sido diseado poniendo un nfasis especial en el tema de la seguridad, y se ha conseguido lograr cierta inmunidad en el aspecto de que un programa realizado en Java no puede realizar llamadas a funciones globales ni acceder a recursos arbitrarios del sistema, por lo que el control sobre los programas ejecutables no es equiparable a otros lenguajes. Los niveles de seguridad que presenta son:

Fuertes restricciones al acceso a memoria, como son la eliminacin de punteros aritmticos y de operadores ilegales de transmisin. Rutina de verificacin de los cdigos de byte que asegura que no se viole ninguna construccin del lenguaje. Verificacin del nombre de clase y de restricciones de acceso durante la carga. Sistema de seguridad de la interfaz que refuerza las medidas de seguridad en muchos niveles.

En futuras versiones se prev contar tambin con encriptacin y tcnicas similares.


b.) Lenguaje basado en C++

Java fue desarrollado basndose en C++, pero eliminando rasgos del mismo poco empleados, optndose por una codificacin comprensible. Bsicamente, encontramos las siguientes diferencias con C++:

Java no soporta los tipos struct, union ni punteros. No soporta typedef ni #define. Se distingue por su forma de manejar ciertos operadores y no permite una sobrecarga de operadores. No soporta herencia mltiple. Java maneja argumentos en la lnea de comandos de forma diversa a como lo hacen C o C++. Tiene una clase String que es parte del paquete java.lang y se diferencia de la matriz de caracteres terminada con un nulo que usan C y C++. Java cuenta con un sistema automtico para asignar y liberar memoria, con lo que no es necesario utilizar las funciones previstas con este fin en C y C++.

c.) Gestin de la Entrada/Salida

En lugar de utilizar primitivas como las de C para trabajar con ficheros, se utlizan primitivas similares a las de C++, mucho ms elegantes, que permiten tratar los ficheros, sockets, teclado y monitor como flujos de datos. De este modo se pueden utilizar dichas primitivas para cualquier operacin de Entrada/Salida.
d.) Diferentes tipos de aplicaciones

En Java podemos crear los siguientes tipos de aplicaciones:


Aplicaciones: Se ejecutan sin necesidad de un navegador. Applets: Se pueden descargar de Internet y se observan en un navegador. JavaBeans: Componentes software Java, que se puedan incorporar grficamente a otros componentes. JavaScript: Conjunto del lenguaje Java que puede codificarse directamente sobre cualquier documento HTML Servlets: Mdulos que permiten sustituir o utilizar el lenguaje Java en lugar de programas CGI (Common Gateway Interface) a la hora de dotar de interactividad a las pginas Web.

I.4. COMPARATIVA CON OTROS LENGUAJES DE PROGRAMACIN ORIENTADOS A OBJETO A. Introduccin En este apartado se va a comparar Java con otros lenguajes de programacin orientados a objeto. En principio Java fue diseado tomando C y C++ como base para la creacin de un nuevo lenguaje con la modificacin de todos aquellos aspectos que no eran tiles o dificultosos para la programacin de componentes electrnicos de bajo coste. Para ello el nuevo lenguaje deba incluir interfaces cmodas, deba ser fiable y fcil de desarrollar y los programas deban ser portables de un sistema a otro sin ningn tipo de problema.

B. Comparacin de los tipos de datos


a.) Tipos de datos simples (primitivos)

Java es muy parecido a C++ en el juego bsico de tipos de datos con algunas pequeas modificaciones. En Java se distingue entre tipos de datos primitivos y clases, aunque existen unas clases especiales (envoltorios o wrappers) que permiten modificar los tipos de datos primitivos. Los tipos de datos primitivos (o simples) pueden ser numricos, booleanos o caracteres.
b.) Datos numricos

Hay cuatro tipos numricos: byte de 1 byte, short de 2 bytes, int de 4 bytes, y los long de 8 bytes. El tipo ms habitual de los cuatro es el tipo int. El byte viene a sustituir el tipo char de C++, ya que Java introduce una interpretacin diferente al tipo de datos char. Las principales diferencias con C++ son:

No existe un tipo sin signo (unsigned) para los nmeros en Java. Los tipos numricos reales son el float (8 bytes) y el double (16 bytes). Los nmeros que utilizan coma flotante (por ejemplo 18.96) son considerados double por defecto, y habr que realiza un moldeado (casting) explcito para que sean float.

c.) Caracteres

Los datos carcter en Java se basan en los de C++ que a su vez son heredados de C. Los caracteres son Unicode de 2 bytes. Los caracteres Unicode son valores de 2 bytes sin signo, con lo que se define obtiene un rango de 65535 caracteres diferentes, que son suficientes para las los diferentes lenguajes y sistemas de representacin del planeta. El carcter de datos del lenguaje Java proviene del tradicional C. Hay que sealar que los caracteres en C++ eran de slo 1 byte, con lo que en Java podremos representar muchos ms caracteres que en C++.
d.) Datos booleanos

En Java se definen para las variables con valores Verdadero/Falso o S/No, en definitiva, valores bi-estado. Una variable booleana puede tener los valores true (verdadero) o false (falso). Son parecidos a los de C++, aunque en cualquier caso, y a diferencia de C++ estas variables no pueden ser convertidas a datos numricos, y es un tipo de datos bsico. C. Operadores relacionales y aritmticos. Se permite en Java los mismos operadores que C++, con la variacin de >>> (desplazamiento sin signo) y la utilizacin del operador + para la concatenacin de cadenas de caracteres. D. Vectores Los vectores en Java, a diferencia de C++, son una clase de objetos. Un vector es un objeto real con una representacin en tiempo real. Se pueden declarar y almacenar vectores de cualquier tipo, y almacenar tambin vectores de vectores para obtener matrices (vectores con varias dimensiones). En este ltimo aspecto no existe diferencia con C++. E. Cadenas Las cadenas en Java son objetos del lenguaje, no existen seudo-arrays de caracteres (cadenas) como era el caso de C++. Existen dos tipos de cadenas de objetos: Las que se obtienen de la clase String, para cadenas de slo lectura. Las que se obtienen de la clase StringBuffer para cadenas que se pueden modificar. Al igual que C++, el compilador de Java entiende que una cadena de caracteres rodeada de dobles comillas es una cadena, y es iniciada como un objeto de tipoString (en C++ sera como vector de caracteres con el carcter fin de cadena \0 al final de la misma). F. Otras caractersticas
a.) Introduccin

En este apartado se va a comparar Java con los lenguajes C++ y Smalltalk (primer lenguaje que presentaba un modelo de objeto).

Caracterstica Sencillez Robustez Seguridad Interpretado Dinamicidad Portabilidad Neutralidad Threads Garbage Colection Excepciones Representacin

Java S S S S S S S S S S Alta

Smalltalk S S Algo S S Algo Algo No S S Media

C++ No No No No No No No No No Algunas Alta

Tabla 1: Comparacin entre Java, SmallTalk y C++


b.) Sencillez

Java tiene una sencillez que no posee C++ aunque s Smalltalk. Esto es debido a que una de las razones de la creacin de Java es la de obtener un lenguaje parecido a C++ pero reduciendo los errores ms comunes de la programacin, algo que se logra con mucho xito puesto que Java reduce un 50% los errores que se comenten en C++ entre los que destacan:

Eliminacin de la aritmtica de punteros y de las referencias. Desaparecen los registros (struct), heredados del paradigma estructurado. No se permite ni la definicin de tipos (typedef) ni la de macros (#define). Ya no es necesario liberar memoria (free o delete).

De todas formas, lo que Java hace, en realidad, es la eliminacin de palabras reservadas, y la utilizacin de un intrprete bastante pequeo.
c.) Robustez

Java realiza verificaciones en busca de problemas tanto en tiempo de compilacin como en tiempo de ejecucin, lo que hace que se detecten errores lo antes posible, normalmente en el ciclo de desarrollo. Algunas de estas verificaciones que hacen que Java sea un lenguaje robusto son:

Verificacin del cdigo de byte. Gestin de excepciones y errores. Comprobacin de punteros y de lmites de vectores.

Se aprecia una clara diferencia con C++ quin no realiza ninguna de estas verificaciones.
d.) Seguridad

En Java no se permite los accesos ilegales a memoria, algo que s se permita en C++. Esto es algo muy importante puesto que este tipo de problema puede ocasionar la propagacin de virus y otras clases de programas dainos por la red. El cdigo Java pasa muchos tests antes de ejecutarse en una mquina. El cdigo se pasa a travs de un verificador de cdigo de byte 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. Algunos de los conocimientos que podemos obtener de los cdigos de byte si pasan la verificacin sin generar ningn mensaje de error son:

El cdigo no produce desbordamiento de operandos en la pila. El tipo de los parmetros de todos los cdigos de operacin es conocido y correcto. No ha ocurrido ninguna conversin ilegal de datos, tal como convertir enteros en punteros. El acceso a los campos de un objeto se sabe si es legal mediante las palabras reservadas public, private y protected. No hay ningn intento de violar las reglas de acceso y seguridad establecidas.

Por todo esto, y por no permitirlo mediante Java la utilizacin de mtodos de un programa sin los privilegios del ncleo (kernel) del sistema operativo, la obligacin de autentificacin por clave pblica para la realizacin de modificaciones, se considera Java un lenguaje seguro. Todo esto no lo incorporan ni C++ ni Smalltalk, por lo que Java es el nico de los tres considerable como seguro.
e.) Lenguaje interpretado

Java es un lenguaje que puede ejecutar el cdigo directamente, es decir es un

"lenguaje interpretado". Esto es una caracterstica que s que posee Smalltalk, aunque no C++. No obstante, y aunque en teora se consumen menos recursos siendo los lenguajes interpretados, el actual compilador que existe es bastante lento, unas 20 veces menos rpido que C++. Esto normalmente no es vital para la aplicacin ni demasiado apreciable por el usuario, y adems esta diferencia se est reduciendo con los nuevos compiladores JIT (Just In Time).
f.) Dinamicidad

Para la obtencin de un mayor provecho de la tecnologa orientada a objetos, Java no intenta conectar todos los mdulos que comprenden una aplicacin hasta el tiempo de ejecucin. Esta caracterstica ya es contemplada por Smalltalk, aunque no C++, que enlaza todos los mdulos cuando se compila.
g.) Portabilidad

Un programa Java puede ser ejecutado en diferentes entornos, algo imposible para C++.
h.) Neutralidad

Se dice que Java tiene una arquitectura neutra puesto que 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 (JRE o Java Runtime Enviroment) puede ejecutar ese cdigo objeto, sin importar en modo alguno la mquina en que ha sido generado. Actualmente existen sistemas de ejecucin (JRE) para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac, Apple y probablemente haya grupos de desarrollo trabajando el portado a otras plataformas. No es as para C++ y para Smalltalk, donde el cdigo generado podr ejecutarse nicamente en la plataforma en la que se gener.
i.) Threads

Java permite mltiples hilos (multithreading) antes de su ejecucin y en tiempo de ejecucin. La posibilidad de construir pequeos procesos o piezas independientes de un gran proceso permite programar de una forma ms sencilla y es una herramienta muy potente que no se ofrece en C++.

j.) Recoleccin automtica de basura ( Garbage colection )

Java modifica completamente la gestin de la memoria que se hace en C/C++. En C/C++ se utilizan punteros, reservas de memoria (con las ordenes malloc, new,free, delete...) y otra serie de elementos que dan lugar a graves errores en tiempo de ejecucin difcilmente depurables. Java tiene operadores nuevos para reservar memoria para los objetos, pero no existe ninguna funcin explcita para liberarla. La recoleccin de basura (objetos ya inservibles) es una parte integral de Java durante la ejecucin de sus programas. Una vez que se ha almacenado un objeto en el tiempo de ejecucin, el sistema hace un seguimiento del estado del objeto, y en el momento en que se detecta que no se va a volver a utilizar ese objeto, el sistema vaca ese espacio de memoria para un uso futuro. Esta gestin de la memoria dinmica hace que la programacin en Java sea ms fcil.
k.) Representacin

Uno de los objetivos perseguidos en el desarrollo de Java era la obtencin de programas con interfaces cmodas e intuitivas. Esto tambin se permite en C++, aunque con unos mtodos ms costosos, y en ningn caso con interfaces portables como los que Java crea. Tanto en Java como en C++ se logran unas interfaces con una representacin mejor que la que se puede alcanzar con Smalltalk.

II.1. FUNDAMENTOS A. Introduccin Java es un lenguaje orientado a objetos, que se deriva en alto grado de C++, de tal forma que puede ser considerado como un C++ nuevo y modernizado o bien como un C++ al que se le han amputado elementos heredados del lenguaje estructurado C.

B. Tokens Un token es el elemento ms pequeo de un programa que es significativo para el compilador. Estos tokens definen la estructura de Java. Cuando se compila un programa Java, el compilador analiza el texto, reconoce y elimina los espacios en blanco y comentarios y extrae tokens individuales. Lostokens resultantes se compilan, traducindolos a cdigo de byte Java, que es independiente del sistema e interpretable dentro de un entorno Java. Los cdigos de byte se ajustan al sistema de mquina virtual Java, que abstrae las diferencias entre procesadores a un procesador virtual nico. Los tokens Java pueden subdividirse en cinco categoras: Identificadores, palabras clave, constantes, operadores y separadores.
a.) Identificadores

Los identificadores son tokens que representan nombres asignables a variables, mtodos y clases para identificarlos de forma nica ante el compilador y darles nombres con sentido para el programador. Todos los identificadores de Java diferencian entre maysculas y minsculas (Java es Case Sensitive o Sensible a maysculas) y deben comenzar con una letra, un subrayado(_) o smbolo de dlar($). Los caracteres posteriores del identificador pueden incluir las cifras del 0 al 9. Como nombres de identificadores no se pueden usar palabras claves de Java. Adems de las restricciones mencionadas existen propuestas de estilo. Es una prctica estndar de Java denominar:

Las clases: Clase o MiClase. Las interfaces: Interfaz o MiInterfaz. Los mtodos: metodo() o metodoLargo(). Las variables: altura o alturaMedia. Las constantes: CONSTATE o CONSTANTE_LARGA. Los paquetes: java.paquete.subpaquete.

Sin entrar en ms detalle en la siguiente lnea de cdigo se puede apreciar la declaracin de una variable entera (int) con su correspondiente identificador: int alturaMedia;

b.) Palabras clave

Las palabras claves son aquellos identificadores reservados por Java para un objetivo determinado y se usan slo de la forma limitada y especfica. Java tiene un conjunto de palabras clave ms rico que C o que C++, por lo que s est aprendiendo Java con conocimientos de C o C++, asegrese de que presta atencin a las palabras clave de Java. Las siguientes palabras son palabras reservadas de Java:
abstact case const else float if int null protected static throw var boolean cast continue extends for implements interface operator public super throws void break catch default false future import long outer rest switch transient volatile byte char do final generic inner native package return syncroniced true while byvalue class double finally goto instanceof new private short this try

Tabla 2: Palabras reservadas Java Las palabras subrayadas son palabras reservadas pero no se utilizan. La definicin de estas palabras clave no se ha revelado, ni se tiene un calendario respecto a cundo estar alguna de ellas en la especificacin o en alguna de las implementaciones de Java.
c.) Literales y constantes

Los literales son sintaxis para asignar valores a las variables. Cada variables es de un tipo de datos concreto, y dichos tipos de datos tienen sus propios literales. Mediante determinados modificadores (static y final) podremos crear variables constantes, que no modifican su valor durante la ejecucin de un programa. Las constantes pueden ser numricas, booleanas, caracteres (Unicode)

o cadenas (String). Las cadenas, que contienen mltiples caracteres, an se consideran constantes, aunque estn implementadas en Java como objetos. Veamos un ejemplo de constante declarada por el usuario: final static int ALTURA_MAXIMA = 200; Se puede observar que utilizamos final static, para que la variable sea total y absolutamente invariable.
d.) Operadores

Conocidos tambin como operandos, indican una evaluacin o computacin para ser realizada en objetos o datos, y en definitiva sobre identificadores o constantes. Los operadores admitidos por Java son:
+ >>>= &= == >> ! & > ^ . <<= += >>> < ?!! <= ~ * [ ^= = *= /= ++ >= && / ] != ) >> %= << || % ( |

Tabla 3: Operadores Java As por ejemplo el siguiente fragmento de cdigo incrementa el valor de una variable en dos unidades, mediante la utilizacin del operador aritmtico + que se utiliza para la suma: int miNumero=0; miNumero = miNumero + 2; En el apartado "II.3 Operadores" de este tutorial aprenderemos que en Java hay formas ms sencillas de hacer esto mismo, y estudiaremos el significado de cada

uno de estos operadores.


e.) Separadores

Se usan para informar al compilador de Java de cmo estn agrupadas las cosas en el cdigo. Los separadores admitidos por Java son: { } , : ;
f.) Comentarios y espacios en blanco

El compilador de Java reconoce y elimina los espacios en blanco, tabuladores, retornos de carro y comentarios durante el anlisis del cdigo fuente. Los comentarios se pueden presentar en tres formatos distintos:
Formato /*comentario*/ //comentario /**comentario*/ Uso Se ignoran todos los caracteres entre /* */. Proviene del C Se ignoran todos los caracteres detrs de // hasta el fin de lnea. Proviene del C++ Lo mismo que /* */ pero se podrn utilizar para documentacin automtica.

Tabla 4: Formatos de comentarios Java Por ejemplo la siguiente lnea de cdigo presenta un comentario: int alturaMinima = 150; // No menos de 150 centmetros C. Expresiones Los operadores, variables y las llamadas a mtodos pueden ser combinadas en secuencias conocidas como expresiones. El comportamiento real de un programa Java se logra a travs de expresiones, que se agrupan para crear sentencias. Una expresin es una serie de variables, operadores y llamadas a mtodos (construida conforme a la sintaxis del lenguaje) que se evala a un nico valor. Entre otras cosas, las expresiones son utilizadas para realizar clculos, para asignar valores a variables, y para ayudar a controlar la ejecucin del flujo del programa. La tarea de una expresin se compone de dos partes: realiza el clculo indicado por los elementos de la expresin y devuelve el valor obtenido como

resultado del clculo. Los operadores devuelven un valor, por lo que el uso de un operador es una expresin. Por ejemplo, la siguiente sentencia es una expresin: int contador=1; contador++; La expresin contador++ en este caso particular se evala al valor 1, que era el valor de la variable contador antes de que la operacin ocurra, pero la variablecontador adquiere un valor de 2. El tipo de datos del valor devuelto por una expresin depende de los elementos utilizados en la expresin. La expresin contador++ devuelve un entero porque ++devuelve un valor del mismo tipo que su operando y contador es un entero. Otras expresiones devuelven valores booleanos, cadenas... Una expresin de llamada a un mtodo se evala al valor de retorno del mtodo; as el tipo de dato de la expresin de llamada a un mtodo es el mismo que el tipo de dato del valor de retorno de ese mtodo. Otra sentencia interesante sera: in.read( ) != -1 // in es un flujo de entrada Esta sentencia se compone de dos expresiones: 1. La primera expresin es una llamada al mtodo in.read(). El mtodo in.read() ha sido declarado para devolver un entero, por lo que la expresin in.read() se evala a un entero. 2. La segunda expresin contenida en la sentencia utiliza el operador !=, que comprueba si dos operandos son distintos. En la sentencia en cuestin, los operandos son in.read() y -1. El operando in.read() es vlido para el operador != porque in.read() es una expresin que se evala a un entero, as que la expresin in.read()!=-1 compara dos enteros. El valor devuelto por esta expresin ser verdadero o falso dependiendo del resultado de la lectura del ficheroin. Como se puede observar, Java permite construir sentencias (expresiones

compuestas) a partir de varias expresiones ms pequeas con tal que los tipos de datos requeridos por una parte de la expresin concuerden con los tipos de datos de la otra. D. Bloques y mbito En Java el cdigo fuente est dividido en partes separadas por llaves, denominas bloques. Cada bloque existe independiente de lo que est fuera de l, agrupando en su interior sentencias (expresiones) relacionadas. Desde un bloque externo parece que todo lo que est dentro de llaves se ejecuta como una sentencia. Pero, qu es un bloque externo?. Esto tiene explicacin si entendemos que existe una jerarqua de bloques, y que un bloque puede contener uno o ms subbloques anidados. El concepto de mbito est estrechamente relacionado con el concepto de bloque y es muy importante cuando se trabaja con variables en Java. El mbito se refiere a cmo las secciones de un programa (bloques) afectan el tiempo de vida de las variables. Toda variable tiene un mbito, en el que es usada, que viene determinado por los bloques. Una variable definida en un bloque interno no es visible por el bloque externo. Las llaves de separacin son importantes no slo en un sentido lgico, ya que son la forma de que el compilador diferencie dnde acaba una seccin de cdigo y dnde comienza otra, sino que tienen una connotacin esttica que facilita la lectura de los programas al ser humano. As mismo, para identificar los diferentes bloques se utilizan sangras. Las sangras se utilizan para el programador, no para el compilador. La sangra (tambin denominada indentacin) ms adecuada para la esttica de un programa Java son dos espacios:
{

// Bloque externo

int x = 1;

// Bloque interno invisible al exterior

int y = 2;

x = y; // Da error: Y fuera de mbito

II.2. TIPOS DE DATOS A. Tipos de datos simples Es uno de los conceptos fundamentales de cualquier lenguaje de programacin. Estos definen los mtodos de almacenamiento disponibles para representar informacin, junto con la manera en que dicha informacin ha de ser interpretada. Para crear una variable (de un tipo simple) en memoria debe declararse indicando su tipo de variable y su identificador que la identificar de forma nica. La

sintaxis de declaracin de variables es la siguiente: TipoSimple Identificador1, Identificador2; Esta sentencia indica al compilador que reserve memoria para dos variables del tipo simple TipoSimple con nombres Identificador1 e Identificador2. Los tipos de datos en Java pueden dividirse en dos categoras: simples y compuestos. Los simples son tipos nucleares que no se derivan de otros tipos, como los enteros, de coma flotante, booleanos y de carcter. Los tipos compuestos se basan en los tipos simples, e incluyen las cadenas, las matrices y tanto las clases como las interfaces, en general. Cada tipo de datos simple soporta un conjunto de literales que le pueden ser asignados, para darles valor. En este apartado se explican los tipos de datos simples (o primitivos) que presenta Java, as como los literales que soporta (sintaxis de los valores que se les puede asignar).
a.) Tipos de datos enteros

Se usan para representar nmeros enteros con signo. Hay cuatro tipos: byte, short, int y long.
Tipo byte short int long Tamao 1Byte (8 bits) 2 Bytes (16 bits) 4 Bytes (32 bits) 8 Bytes (64 bits)

Tabla 5: Tipos de datos enteros Literales enteros Son bsicos en la programacin en Java y presentan tres formatos:

Decimal: Los literales decimales aparecen como nmeros ordinarios sin ninguna notacin especial. Hexadecimal: Los hexadecimales (base 16) aparecen con un 0x 0X inicial, notacin similar a la utilizada en C y C++. Octal: Los octales aparecen con un 0 inicial delante de los dgitos.

Por ejemplo, un literal entero para el nmero decimal 12 se representa en Java como 12 en decimal, como 0xC en hexadecimal, y como 014 en octal. Los literales enteros se almacenan por defecto en el tipo int, (4 bytes con signo), o si se trabaja con nmeros muy grandes, con el tipo long, (8 bytes con signo), aadiendo una L l al final del nmero. La declaracin de variables enteras es muy sencilla. Un ejemplo de ello sera: long numeroLargo = 0xC; // Por defecto vale 12
b.) Tipos de datos en coma flotante

Se usan para representar nmeros con partes fraccionarias. Hay dos tipos de coma flotante: float y double. El primero reserva almacenamiento para un nmero de precisin simple de 4 bytes y el segundo lo hace para un numero de precisin doble de 8 bytes.
Tipo float double Tamao 4 Byte (32 bits) 8 Bytes (64 bits)

Tabla 6: Tipos de datos numricos en coma flotante Literales en coma flotante Representan nmeros decimales con partes fraccionarias. Pueden representarse con notacin estndar (563,84) o cientfica (5.6384e2). De forma predeterminada son del tipo double (8 bytes). Existe la opcin de usar un tipo ms corto (el tipo float de 4 bytes), especificndolo con una F f al final del nmero. La declaracin de variables de coma flotante es muy similar a la de las variables enteras. Por ejemplo: double miPi = 314.16e-2 ; // Aproximadamente float temperatura = (float)36.6; // Paciente sin fiebre

Se realiza un moldeado a temperatura, porque todos los literales con decimales por defecto se consideran double.
c.) Tipo de datos boolean

Se usa para almacenar variables que presenten dos estados, que sern representados por los valores true y false. Representan valores bi-estado, provenientes del denominado lgebra de Boole. Literales Booleanos Java utiliza dos palabras clave para los estados: true (para verdadero) y false (para falso). Este tipo de literales es nuevo respecto a C/C++, lenguajes en los que el valor de falso se representaba por un 0 numrico, y verdadero cualquier nmero que no fuese el 0. Para declarar un dato del tipo booleano se utiliza la palabra reservada boolean: boolean reciboPagado = false; // Aun no nos han pagado?!
d.) Tipo de datos carcter

Se usa para almacenar caracteres Unicode simples. Debido a que el conjunto de caracteres Unicode se compone de valores de 16 bits, el tipo de datos char se almacena en un entero sin signo de 16 bits. Java a diferencia de C/C++ distingue entre matrices de caracteres y cadenas. Literales carcter Representan un nico carcter (de la tabla de caracteres Unicode 1.1) y aparecen dentro de un par de comillas simples. De forma similar que en C/C++. Los caracteres especiales (de control y no imprimibles) se representan con una barra invertida ('\') seguida del cdigo carcter.
Descripcin Caracter Unicode Numero octal Barra invertida Continuacin Representacin \udddd \ddd \\ \ \u005C \ Valor Unicode

Retroceso Retorno de carro Alimentacin de formularios Tabulacin horizontal Lnea nueva Comillas simples Comillas dobles Nmeros arbigos ASCII Alfabeto ASCII en maysculas Alfabeto ASCII en minsculas

\b \r \f \t \n \ \" 0-9 A.-Z a.-z

\u0008 \u000D \u000C \u0009 \u000A \u0027 \u0022 \u0030 a \u0039 \u0041 a \u005A \u0061 a \u007A

Tabla 7: Caracteres especiales Java Las variables de tipo char se declaran de la siguiente forma: char letraMayuscula = 'A'; // Observe la necesidad de las ' ' char letraV = '\u0056'; // Letra 'V'
e.) Conversin de tipos de datos

En Java es posible transformar el tipo de una variable u objeto en otro diferente al original con el que fue declarado. Este proceso se denomina "conversin", "moldeado" o "tipado". La conversin se lleva a cabo colocando el tipo destino entre parntesis, a la izquierda del valor que queremos convertir de la forma siguiente: char c = (char)System.in.read(); La funcin read devuelve un valor int, que se convierte en un char debido a la conversin (char), y el valor resultante se almacena en la variable de tipo carcter c. El tamao de los tipos que queremos convertir es muy importante. No todos los tipos se convertirn de forma segura. Por ejemplo, al convertir un long en un int, el compilador corta los 32 bits superiores del long (de 64 bits), de forma que

encajen en los 32 bits del int, con lo que si contienen informacin til, esta se perder. Por ello se establece la norma de que "en las conversiones el tipo destino siempre debe ser igual o mayor que el tipo fuente":
Tipo Origen byte short char int long float Tipo Destino double, float, long, int, char, short double, float, long, int double, float, long, int double, float, long double, float double

Tabla 8: Conversiones sin prdidas de informacin B. Vectores y Matrices Una matriz es una construccin que proporciona almacenaje a una lista de elementos del mismo tipo, ya sea simple o compuesto. Si la matriz tiene solo una dimensin, se la denomina vector. En Java los vectores se declaran utilizando corchetes ( [ y ] ), tras la declaracin del tipo de datos que contendr el vector. Por ejemplo, esta sera la declaracin de un vector de nmeros enteros (int): int vectorNumeros[ ]; // Vector de nmeros Se observa la ausencia de un nmero que indique cuntos elementos componen el vector, debido a que Java no deja indicar el tamao de un vector vaco cuando le declara. La asignacin de memoria al vector se realiza de forma explcita en algn momento del programa. Para ello o se utiliza el operador new: int vectorNumeros = new int[ 5 ]; // Vector de 5 nmeros O se asigna una lista de elementos al vector:

int vectorIni = { 2, 5, 8}; // == int vectorIni[3]=new int[3]; Se puede observar que los corchetes son opcionales en este tipo de declaracin de vector, tanto despus del tipo de variable como despus del identificador. Si se utiliza la forma de new se establecer el valor 0 a cada uno de los elementos del vector. C. Cadenas En Java se tratan como una clase especial llamada String. Las cadenas se gestionan internamente por medio de una instancia de la clase String. Una instancia de la clase String es un objeto que ha sido creado siguiendo la descripcin de la clase. Cadenas constantes Representan mltiples caracteres y aparecen dentro de un par de comillas dobles. Se implementan en Java con la clase String. Esta representacin es muy diferente de la de C/C++ de cadenas como una matriz de caracteres. Cuando Java encuentra una constante de cadena, crea un caso de la clase String y define su estado, con los caracteres que aparecen dentro de las comillas dobles. Vemos un ejemplo de cadena declarada con la clase String de Java: String capitalUSA = "Washington D.C."; String nombreBonito = "Amelia"; Ms tarde profundizaremos con detenimiento en las cadenas Java.

II.3. OPERADORES A. Introduccin Los operadores son un tipo de tokens que indican una evaluacin o computacin para ser realizada en objetos o datos, y en definitiva sobre identificadores o

constantes. Adems de realizar la operacin, un operador devuelve un valor, ya que son parte fundamental de las expresiones. El valor y tipo que devuelve depende del operador y del tipo de sus operandos. Por ejemplo, los operadores aritmticos devuelven un nmero como resultado de su operacin. Los operadores realizan alguna funcin sobre uno, dos o tres operandos. Los operadores que requieren un operando son llamados operadores unarios. Por ejemplo, el operador "++" es un operador unario que incrementa el valor de su operando en una unidad. Los operadores unarios en Java pueden utilizar tanto la notacin prefija como la posfija. La notacin prefija indica que el operador aparece antes que su operando. ++contador // Notacin prefija, se evala a: contador+1 La notacin posfija indica que el operador aparece despus de su operando: contador++ // Notacin posfija, se evala a: contador Los operadores que requieren dos operandos se llaman operadores binarios. Por ejemplo el operador "=" es un operador binario que asigna el valor del operando del lado derecho al operando del lado izquierdo. Todas los operadores binarios en Java utilizan notacin infija, lo cual indica que el operador aparece entre sus operandos. operando1 operador operando2 Por ltimo, los operadores ternarios son aquellos que requieren tres operandos. El lenguaje Java tiene el operador ternario, "?":, que es una sentencia similar a la ifelse. Este operador ternario usa notacin infija; y cada parte del operador aparece entre operandos:

expresin ? operacin1 : operacin2 Los operadores de Java se pueden dividir en las siguientes cuatro categoras:

Aritmticos. De comparacin y condicionales. A nivel de bits y lgicos. De asignacin.

B. Operadores aritmticos El lenguaje Java soporta varios operadores aritmticos para los nmeros enteros y en coma flotante. Se incluye + (suma), - (resta), * (multiplicacin), / (divisin), y %(mdulo, es decir, resto de una divisin entera). Por ejemplo: sumaEste + aEste; //Suma los dos enteros divideEste % entreEste; //Calcula el resto de dividir 2 enteros
Operador + * / % Uso op1 + op2 op1 - op2 op1 * op2 op1 / op2 op1 % op2 Descripcin Suma op1 y op2 Resta op2 de op1 Multiplica op1 por op2 Divide op1 por op2 Calcula el resto de dividir op1 entre op2

Tabla 9: Operadores aritmticos binarios de Java El tipo de los datos devueltos por una operacin aritmtica depende del tipo de sus operandos; si se suman dos enteros, se obtiene un entero como tipo devuelto con el valor de la suma de los dos enteros. Estos operadores se deben utilizar con operandos del mismo tipo, o si no realizar una conversin de tipos de uno de los dos operandos al tipo del otro. El lenguaje Java sobrecarga la definicin del operador + para incluir la concatenacin de cadenas. El siguiente ejemplo utiliza + para concatenar la cadena "Contados ", con el valor de la variable contador y la cadena " caracteres.":

System.out.print("Contados" + contador + "caracteres."); Esta operacin automticamente convierte el valor de contador a una cadena de caracteres. Los operadores + y - tienen versiones unarias que realizan las siguientes operaciones:
Operador + Uso +op -op Descripcin Convierte op a entero si es un byte, short o char Niega aritmticamente op

Tabla 10: Versiones unarias de los operadores "+" y "-" El operador - realiza una negacin del nmero en complemento A2, es decir, cambiando de valor todos sus bits y sumando 1 al resultado final:
42 -> 00101010

-42 -> 11010110

Existen dos operadores aritmticos que funcionan como atajo de la combinacin de otros: ++ que incrementa su operando en 1, y -- que decrementa su operando en 1. Ambos operadores tienen una versin prefija, y otra posfija. La utilizacin la correcta es crtica en situaciones donde el valor de la sentencia es utilizado en mitad de un clculo ms complejo, por ejemplo para control de flujos:
Operador ++ ++ --Uso op++ ++op op---op Descripcin Incrementa op en 1; se evala al valor anterior al incremento Incrementa op en 1; se evala al valor posterior al incremento Decrementa op en 1; se evala al valor anterior al incremento Decrementa op en 1; se evala al valor posterior al incremento

Tabla 11: Operaciones con "++" y "--"

C. Operadores de comparacin y condicionales Un operador de comparacin compara dos valores y determina la relacin existente entre ambos. Por ejemplo, el operador != devuelve verdadero (true) si los dos operandos son distintos. La siguiente tabla resume los operadores de comparacin de Java:
Operador Uso > op1 > op2 >= op1 >= op2 < op1 < op2 <= op1 <= op2 == op1 == op2 != op1 != op2 Devuelve verdadero si op1 es mayor que op2 op1 es mayor o igual que op2 op1 es menor que op2 op1 es menor o igual que op2 op1 y op2 son iguales op1 y op2 son distintos

Tabla 12: Operadores de comparacin Los operadores de comparacin suelen ser usados con los operadores condicionales para construir expresiones complejas que sirvan para la toma de decisiones. Un operador de este tipo es &&, el cual realiza la operacin booleana and. Por ejemplo, se pueden utilizar dos operaciones diferentes de comparacin con && para determinar si ambas relaciones son ciertas. La siguiente lnea de cdigo utiliza esta tcnica para determinar si la variable index de una matriz se encuentra entre dos lmites (mayor que cero y menor que la constante NUMERO_ENTRADAS): ( 0 < index ) && ( index < NUMERO_ENTRADAS ) Se debe tener en cuenta que en algunos casos, el segundo operando de un operador condicional puede no ser evaluado. En caso de que el primer operando del operador && valga falso, Java no evaluar el operando de la derecha: (contador < NUMERO_ENTRADAS) && ( in.read() != -1 ) Si contador es menor que NUMERO_ENTRADAS, el valor de retorno de && puede ser determinado sin evaluar el operando de la parte derecha. En este casoin.read no ser llamado y un carcter de la entrada estndar no ser ledo. Si el programador quiere que se evale la parte derecha, deber utilizar el operador & en lugar de &&.

De la misma manera se relacionan los operadores || y | para la exclusin lgica (OR). Java soporta cinco operadores condicionales, mostrados en la siguiente tabla:
Operador && & || | ! Uso op1 && op2 op1 & op2 op1 || op2 op1 | op2 ! op Devuelve verdadero si... op1 y op2 son ambos verdaderos, condicionalmente evala op2 op1 y op2 son ambos verdaderos, siempre evala op1 y op2 op1 o op2 son verdaderos, condicionalmente evala op2 op1 o op2 son verdaderos, siempre evala op1 y op2 op es falso

Tabla 13: Operadores condicionales Adems Java soporta un operador ternario, el ?:, que se comporta como una versin reducida de la sentencia if-else: expresion ? operacion1 : operacion2 El operador ?: evala la expresion y devuelve operacin1 si es cierta, o devuelve operacin2 si expresion es falsa. D. Operadores de bit Un operador de bit permite realizar operaciones de bit sobre los datos. Existen dos tipos: los que desplazan (mueven) bits, y operadores lgicos de bit.
a.) Operadores de desplazamiento de bits

Operador >> << >>>

Uso op1 >> op2 op1 << op2 op1 >>> op2

Operacin Desplaza los bits de op1 a la derecha op2 veces Desplaza los bits de op1 a la izquierda op2 veces Desplaza los bits de op1 a la derecha op2 veces (sin signo)

Tabla 14: Operadores de desplazamiento de bits Los tres operadores de desplazamiento simplemente desplazan los bits del operando de la parte izquierda el nmero de veces indicado por el operando de la parte derecha. El desplazamiento ocurre en la direccin indicada por el operador. Por ejemplo, la siguiente sentencia, desplaza los bits del entero 13 a la derecha

una posicin: 13 >> 1; La representacin en binario del nmero 13 es 1101. El resultado de la operacin de desplazamiento es 1101 desplazado una posicin a la derecha, 110 o 6 en decimal. Se debe tener en cuenta que el bit ms a la derecha se pierde en este caso. Un desplazamiento a la derecha una posicin es equivalente a dividir el operando del lado izquierdo por 2, mientras que un desplazamiento a la izquierda de una posicin equivale a multiplicar por 2, pero un desplazamiento es ms eficiente, computacionalmente hablando, que una divisin o multiplicacin. El desplazamiento sin signo >>> funciona de la siguiente manera:

Si se desplaza con signo el nmero -1 (1111), seguir valiendo -1, dado que la extensin de signo sigue introduciendo unos en los bits ms significativos. Con el desplazamiento sin signo se consigue introducir ceros por la izquierda, obteniendo el nmero 7 (0111).

Este tipo de desplazamientos es especialmente til en la utilizacin de mscaras grficas.


b.) Operadores de lgica de bits

La lgica de bits (lgica de Bool) se utiliza para modelizar condiciones biestado y trabajar con ellas (cierto/falso, true/false, 1/0). En Java hay cuatro operadores de lgica de bits:
Operador & | ^ ~ Uso op1 & op2 op1 | op2 op1 ^ op2 ~op2 Operacin AND OR OR Exclusivo Complemento

Tabla 15: Operadores de lgica de bits El operador & realiza la operacin AND de bit. Aplica la funcin AND sobre cada par de bits de igual peso de cada operando. La funcin AND es evaluada a

cierto si ambos operandos son ciertos. Por ejemplo vamos a aplicar la operacin AND a los valores 12 y 13: 12 & 13 El resultado de esta operacin es 12. Por qu?. La representacin en binario de 12 es 1100, y de 13 es 1101. La funcin AND pone el bit de resultado a uno si los dos bits de los operandos son 1, sino, el bit de resultado es 0:
1101 & 1100 -----1100

El operador | realiza la operacin OR de bit. Aplica la funcin OR sobre cada par de bits de igual peso de cada operando. La funcin OR es evaluada a cierto si alguno de los operandos es cierto. El operador ^ realiza la operacin OR exclusivo de bit (XOR). Aplica la funcin XOR sobre cada par de bits de igual peso de cada operando. La funcin XOR es evaluada a cierto si los operandos tienen el mismo valor. Para finalizar, el operador de complemento invierte el valor de cada bit del operando. Convierte el falso en cierto, y el cierto en falso: Entre otras cosas, la manipulacin bit es til para gestionar indicadores booleanos (banderas). Supongamos, por ejemplo, que se tiene varios indicadores booleanos en nuestro programa, los cuales muestran el estado de varios componentes del programa: esVisible, esArrastrable, etc... En lugar de definir una variable booleana para cada indicador, se puede definir una nica variable para todos ellos. Cada bit de dicha variable representar el estado vigente de uno de los indicadores. Se debern utilizar entonces manipulaciones de bit para establecer y leer cada indicador. Primero, se deben preparar las constantes de cada indicador. Esos indicadores deben ser diferentes unos de otros (en sus bits) para asegurar que el bit de

activacin no se solape con otro indicador. Despus se debe definir la variable de banderas, cuyos bits deben de poder ser configurados segn el estado vigente en cada indicador. El siguiente ejemplo inicia la variable de banderas flags a 0, lo que significa que todos los indicadores estn desactivados (ninguno de los bits es 1): final int VISIBLE = 1; final int ARRASTRABLE = 2; final int SELECCIONABLE = 4; final int MODIFICABLE = 8; int flags = 0; Para activar el indicador VISIBLE, se deber usar la sentencia: flags = flags | VISIBLE; Para comprobar la visibilidad se deber usar la sentencia:
if ( (flags & VISIBLE) == 1 ) //Lo que haya que hacer

E. Operadores de asignacin El operador de asignacin bsico es el =, que se utiliza para asignar un valor a otro. Por ejemplo: int contador = 0; Inicia la variable contador con un valor 0. Java adems proporciona varios operadores de asignacin que permiten realizar un atajo en la escritura de cdigo. Permiten realizar operaciones aritmticas, lgicas, de bit y de asignacin con un nico operador.

Supongamos que necesitamos sumar un nmero a una variable y almacenar el resultado en la misma variable, como a continuacin: i = i + 2; Se puede abreviar esta sentencia con el operador de atajo +=, de la siguiente manera: i += 2; La siguiente tabla muestra los operadores de atajo de asignacin y sus equivalentes largos:
Operador += -= *= /= %= &= Uso op1 += op2 op1 -= op2 op1 *= op2 op1 /= op2 op1 %= op2 op1 &= op2 Equivalente a op1 = op1 + op2 op1 = op1 - op2 op1 = op1 * op2 op1 = op1 / op2 op1 = op1 % op2 op1 = op1 & op2

Tabla 16: Operadores de atajo de asignacin F. Precedencia de operadores Cuando en una sentencia aparecen varios operadores el compilador deber de elegir en qu orden aplica los operadores. A esto se le llama precedencia. Los operadores con mayor precedencia son evaluados antes que los operadores con una precedencia relativa menor. Cuando en una sentencia aparecen operadores con la misma precedencia:

Los operadores de asignacin son evaluados de derecha a izquierda. Los operadores binarios, (menos los de asignacin) son evaluados de izquierda a derecha.

Se puede indicar explcitamente al compilador de Java cmo se desea que se evale la expresin con parntesis balanceados ( ). Para hacer que el cdigo sea ms fcil de leer y mantener, es preferible ser explcito e indicar con parntesis que operadores deben ser evaluados primero.

La siguiente tabla muestra la precedencia asignada a los operadores de Java. Los operadores de la tabla estn listados en orden de precedencia: cuanto ms arriba aparezca un operador, mayor es su precedencia. Los operadores en la misma lnea tienen la misma precedencia:
Tipo de operadores Operadores posfijos Operadores unarios Creacin o conversin Multiplicacin Suma Desplazamiento Comparacin Igualdad AND a nivel de bit OR a nivel de bit XOR a nivel de bit AND lgico OR lgico Condicional Asignacin Operadores de este tipo [ ] . (parametros) expr++ expr-++expr --expr +expr -expr ~ ! new (tipo) expr */% +<< < <= = instanceof == != & ^ | && || ?: = += -= *= /= %= &= ^= |= <<= = =

Tabla 17: Precedencia de operadores Por ejemplo, la siguiente expresin produce un resultado diferente dependiendo de si se realiza la suma o divisin en primer lugar: x + y / 100 Si no se indica explcitamente al compilador el orden en que se quiere que se realicen las operaciones, entonces el compilador decide basndose en la precedencia asignada a los operadores. Como el operador de divisin tiene mayor precedencia que el operador de suma el compilador evaluar y/100 primero. As: x + y / 100 Es equivalente a: x + (y / 100)

II.4. ESTRUCTURAS DE CONTROL A. Introduccin Durante un programa existen acciones que se han de repetir un nmero determinado de veces. Por ejemplo, leer 3 caracteres de un flujo de entrada in se codificara: in.read(); in.read(); in.read(); Este cdigo adems de poco elegante sera inviable para una repeticin de 3000 lecturas. Por eso aparecen las estructuras de control, que facilitan que determinadas acciones se realicen varias veces, mientras que una condicin se cumpla, y en definitiva, tomar decisiones de qu hacer en funcin de las condiciones que se den en el programa en un momento dado de su ejecucin. As, nuestro ejemplo se podra indicar como:
int i=0;

for ( i=0 ; i <= 3 ; i++ )

in.read();

Donde bastara cambiar el 3 por cualquier otro nmero para que la lectura se repitiese ese nmero de veces. El lenguaje Java soporta las estructuras de control:
Sentencia Toma de decisin Clave if-else, switch-case

Bucle Miscelneo

for, while, do-while break, continue, label:, return, goto

Tabla 18: Estructuras de control Aunque goto es una palabra reservada, actualmente el lenguaje Java no soporta la sentencia goto. Se puede utilizar las sentencias de bifurcacin en su lugar. B. Las sentencias condicionales: if y switch
a.) La sentencia if - else

La sentencia if-else de Java dota a los programas de la habilidad de ejecutar distintos conjuntos de sentencias segn algn criterio. La sintaxis de la sentencia if-else es:

if ( condicin )

Bloque de cdigo a ejecutar si la condicin es cierta

else

Bloque de cdigo a ejecutar si la condicin es falsa

La parte del else es opcional, y un bloque de cdigo puede ser simplemente la sentencia vaca ; para representar que en ese caso no se ha de ejecutar nada. Supongamos que un programa debe realizar diferentes acciones dependiendo de si el usuario oprime el botn aceptar o el botn cancelar en una ventana de dialogo. Nuestro programa puede realizar esto usando la sentencia if - else:

// La respuesta es Aceptar o Cancelar

if (respuesta == Aceptar) {

// cdigo para realizar la accin Aceptar

System.out.println( "Su peticion esta siendo atendida" );

else {

// cdigo para realizar la accin Cancelar

System.out.println( "Cancelando accion" );

Se pueden anidar expresiones if-else, para poder implementar aquellos casos con mltiples acciones. Esto es lo que se suele denominar como sentencias else if. Por ejemplo, supongamos que se desea escribir un programa que clasifique segn el contenido de una variable valor, asigne una letra a una variable clasificacion: A para un valor del 100-91, B de 90-81, C para 80-71 y F si no es ninguno de los anteriores:

int valor;

char clasificacion;

if (valor > 90)

{clasificacion='A';}

else

if (valor > 80)

{clasificacion='B';}

else

if (valor > 70)

{clasificacion='C';}

else

{clasificacion='F';}

Se pueden escribir los if en las mismas lneas que los else, pero desde este tutorial se insta a utilizar la forma indentada (como se ha podido ver en el ejemplo), pues es ms clara para el lector. Este sistema de programacin (else if) no es demasiado recomendable, y por ello el lenguaje Java incluye la sentencia switch, que veremos a continuacin, para dirigir el flujo de control de variables con mltiples valores.
b.) La sentencia switch

Mediante la sentencia switch se puede seleccionar entre varias sentencias segn el valor de cierta expresin. La forma general de switch es la siguiente:
switch ( expresionMultivalor ) {

case valor1 : conjuntoDeSentencias; break;

case valor2 : conjuntoDeSentencias; break;

case valor3: conjuntoDeSentencias; break;

default: conjuntoDeSentencias; break;

La sentencia switch evala la expresinMultivalor y ejecuta el conjuntoDeSentencias que aparece junto a la clusula case cuyo valor corresponda con el de laexpresinMultivalor.

Cada sentencia case debe ser nica y el valor que evala debe ser del mismo tipo que el devuelto por la expresinMultivalor de la sentencia switch. Las sentencias break que aparecen tras cada conjuntoDeSentencias provocan que el control salga del switch y contine con la siguiente instruccin al switch. Las sentencias break son necesarias porque sin ellas se ejecutaran secuencialmente las sentencias case siguientes. Existen ciertas situaciones en las que se desea ejecutar secuencialmente algunas o todas las sentencias case, para lo que habr que eliminar algunos break. Finalmente, se puede usar la sentencia default para manejar los valores que no son explcitamente contemplados por alguna de las sentencias case. Su uso es altamente recomendado. Por ejemplo, supongamos un programa con una variable entera meses cuyo valor indica el mes actual, y se desea imprimir el nombre del mes en que estemos. Se puede utilizar la sentencia switch para realizar esta operacin:
int meses;

switch ( meses ){

case 1: System.out.println( "Enero" ); break;

case 2: System.out.println( "Febrero" ); break;

case 3: System.out.println( "Marzo" ); break;

//Demas meses

// . . .

case 12: System.out.println( "Diciembre" ); break;

default: System.out.println( "Mes no valido" ); break;

Por supuesto, se puede implementar esta estructura como una sentencia if else if:
int meses;

if ( meses == 1 ) {

System.out.println( "Enero" );

else

if ( meses == 2 ) {

System.out.println( "Febrero" );

// Y as para los dems meses

El decidir si usar la sentencia if o switch depende del criterio de cada caso. Se puede decidir cul usar basndonos en la legibilidad, aunque se recomienda utilizarswitch para sentencias con ms de tres o cuatro posibilidades. C. Sentencias de iteracin o bucles: for, do, while
a.) Bucle while

El bucle while es el bucle bsico de iteracin. Sirve para realizar una accin sucesivamente mientras se cumpla una determinada condicin. La forma general del bucle while es la siguiente:
while ( expresinBooleana ) {

sentencias;

};

Las sentencias se ejecutan mientras la expresinBooleana tenga un valor de verdadero. Se utiliza, por ejemplo para estar en un bucle del que no hay que salir hasta que no se cumpla una determinada condicin. Por ejemplo, multiplicar un nmero por 2 hasta que sea mayor que 100:
int i = 1;

while ( i <= 100 ) {

i = i * 2;

Con l se podran eliminar los bucles do-while y for por ser extensiones de ste, pero que se incluyen en el lenguaje para facilitar la programacin.
b.) Bucle do-while

El bucle do-while es similar al bucle while, pero en el bucle while la expresin se evala al principio del bucle y en el bucle do-while la evaluacin se realiza al final. La forma general del bucle do-while es la siguiente:
do {

sentencias;

} while ( expresinBooleana );

La sentencia do-while es el constructor de bucles menos utilizado en la programacin, pero tiene sus usos, cuando el bucle deba ser ejecutado por lo menos una vez. Por ejemplo, cuando se lee informacin de un archivo, se sabe que siempre se debe leer por lo menos un carcter:

int c;

do {

c = System.in.read( );

// Sentencias para tratar el carcter c

} while ( c != -1 ); // No se puede leer ms (Fin fichero)

c.) Bucle for

Mediante la sentencia for se resume un bucle do-while con una iniciacin previa. Es muy comn que en los bucles while y do-while se inicien las variables de control de nmero de pasadas por el bucle, inmediatamente antes de comenzar los bucles. Por eso el bucle for est tan extendido. La forma general de la sentencia for es la siguiente:
for ( iniciacin ; terminacin ; incremento ) sentencias;

La iniciacin es una sentencia que se ejecuta una vez antes de entrar en el bucle. La terminacin es una expresin que determina cundo se debe terminar el bucle. Esta expresin se evala al final de cada iteracin del bucle. Cuando la expresin se evala a falso, el bucle termina. El incremento es una expresin que es invocada en cada iteracin del bucle. En realidad puede ser una accin cualquiera, aunque se suele utilizar para incrementar una variable contador: for ( i = 0 ; i < 10 ; i++ )

Algunos (o todos) estos componentes pueden omitirse, pero los puntos y coma siempre deben aparecer (aunque sea sin nada entre s). Se debe utilizar el bucle for cuando se conozcan las restricciones del bucle (su instruccin de iniciacin, criterio de terminacin e instruccin de incremento). Por ejemplo, los bucles for son utilizados comnmente para iterar sobre los elementos de una matriz, o los caracteres de una cadena:
// cad es una cadena (String)

for ( int i = 0; i < cad.length() ; i++){

// hacer algo con el elemento i-simo de cad

D. Sentencias de salto: break, continue y return


a.) Sentencia break

La sentencia break provoca que el flujo de control salte a la sentencia inmediatamente posterior al bloque en curso. Ya se ha visto anteriormente la sentencia breakdentro de la sentencia switch. El uso de la sentencia break con sentencias etiquetadas es una alternativa al uso de la sentencia goto, que no es soportada por el lenguaje Java. Se puede etiquetar una sentencia poniendo una identificador Java vlido seguido por dos puntos antes de la sentencia: nombreSentencia: sentenciaEtiquetada La sentencia break se utiliza para salir de una sentencia etiquetada, llevando el flujo del programa al final de la sentencia de programa que indique:

break nombreSentencia2; Un ejemplo de esto sera el programa:


void gotoBreak() {

System.out.println("Ejemplo de break como 'goto' ");

a:

for( int i=1; i<10; i++ ){

System.out.print(" i="+i);

for( int j=1; j<10; j++ ){

if ( j==5 )

break a; //Sale de los dos bucles!!!

System.out.print(" j="+j);

System.out.print("No llega aqu");

Al interpretar break a, no solo se rompe la ejecucin del bucle interior (el de j), sino que se salta al final del bucle i, obtenindose: i=1 j=1 j=2 j=3 Nota: Se desaconseja esta forma de programacin, basada en goto, y con saltos de flujo no controlados.
b.) Sentencia continue

Del mismo modo que en un bucle se puede desear romper la iteracin, tambin se puede desear continuar con el bucle, pero dejando pasar una determinada iteracin. Se puede usar la sentencia continue dentro de los bucles para saltar a otra sentencia, aunque no puede ser llamada fuera de un bucle. Tras la invocacin a una sentencia continue se transfiere el control a la condicin de terminacin del bucle, que vuelve a ser evaluada en ese momento, y el bucle contina o no dependiendo del resultado de la evaluacin. En los bucles for adems en ese momento se ejecuta la clusula de incremento (antes de la evaluacin). Por ejemplo el siguiente fragmento de cdigo imprime los nmeros del 0 al 9 no divisibles por 3:

for ( int i = 0 ; i < 10 ; i++ ) {

if ( ( i % 3 ) == 0 )

continue;

System.out.print( " " + i );

Del mismo modo que break, en las sentencias continue se puede indicar una etiqueta de bloque al que hace referencia. Con ello podemos referirnos a un bloque superior, si estamos en bucles anidados. Si dicha etiqueta no es indicada, se presupone que nos referimos al bucle en el que la sentencia continue aparece. Por ejemplo, el siguiente fragmento de cdigo:
void gotoContinue( ) {

f: for ( int i=1; i <5; i++ ) {

for ( int j=1; j<5; j++ ) {

if ( j>i ) {

System.out.println(" ");

continue f;

System.out.print( " " + (i*j) );

En este cdigo la sentencia continue termina el bucle de j y continua el flujo en la siguiente iteracin de i. Ese mtodo imprimira: 1 2 4 3 6 9 4 8 12 16 Nota: Se desaconseja esta forma de programacin, basada en goto, y con saltos de flujo no controlados.
c.) Sentencia return

La ltima de las sentencias de salto es la sentencia return, que puede usar para salir del mtodo en curso y retornar a la sentencia dentro de la cual se realiz la llamada. Para devolver un valor, simplemente se debe poner el valor (o una expresin que calcule el valor) a continuacin de la palabra return. El valor devuelto por returndebe coincidir con el tipo declarado como valor de retorno del mtodo. Cuando un mtodo se declara como void se debe usar la forma de return sin indicarle ningn valor. Esto se hace para no ejecutar todo el cdigo del programa:
int contador;

boolean condicion;

int devuelveContadorIncrementado(){

return ++contador;

void metodoReturn(){

//Sentencias

if ( condicion == true )

return;

//Ms sentencias a ejecutar si condicin no vale true

E. Excepciones Las excepciones son otra forma ms avanzada de controlar el flujo de un programa. Con ellas se podrn realizar acciones especiales si se dan determinadas

condiciones, justo en el momento en que esas condiciones se den. Estudiaremos ms este sistema de control en el captulo "II.8. Gestin de excepciones y errores" de este tutorial.

II.5. CLASES Y OBJETOS A. Introduccin Durante los captulos anteriores se han dado unas nociones bsicas de la sintaxis de Java. A partir de ahora es cuando entramos la verdadera potencia de Java como lenguaje orientado a objetos: las clases y los objetos. Aquellas personas que nunca hayan programado en un lenguaje orientado a objeto, o que no conozcan las nociones bsicas de paradigma conviene que lean el captulo "I.1 Introduccin a la programacin orientada a objetos" de este tutorial, ya que a partir de ahora los conceptos que en l se exponen se darn por entendidos. Durante todo este captulo se va a trabajar en la construccin de una clase MiPunto, que modeliza un punto en un espacio plano:
class MiPunto{

int x, y;

int metodoSuma( int paramX, int paramY ) {

return ( paramX + paramY );

double distancia(int x, int y) {

int dx= this.x pX;

int dy = this.y pY;

return Math.sqrt(dx*dx + dy*dy);

void metodoVacio( ) { }

void inicia( int paramX, int paramY ) {

x = paramX;

y = paramY;

void inicia2( int x, int y ) {

x = x; // Ojo, no modificamos la variable de instancia!!!

this.y = y; // Modificamos la variable de instancia!!!

MiPunto( int paramX, int paramY ) {

this.x = paramX; // Este this se puede omitir

y = paramY; // No hace falta this

MiPunto() {

inicia(-1,-1); //Por defecto ; this(-1,-1) hace lo mismo

B. Definicin de una clase


a.) Introduccin

El elemento bsico de la programacin orientada a objetos en Java es la clase. Una clase define la forma y comportamiento de un objeto.

Para crear una clase slo se necesita un archivo fuente que contenga la palabra clave reservada class seguida de un identificador legal y un bloque delimitado por dos llaves para el cuerpo de la clase. class MiPunto { } Un archivo de Java debe tener el mismo nombre que la clase que contiene, y se les suele asignar la extensin ".java". Por ejemplo la clase MiPunto se guardara en un fichero que se llamase MiPunto.java. Hay que tener presente que en Java se diferencia entre maysculas y minsculas; el nombre de la clase y el de archivo fuente han de ser exactamente iguales. Aunque la clase MiPunto es sintcticamente correcta, es lo que se viene a llamar una clase vaca, es decir, una clase que no hace nada. Las clases tpicas de Java incluirn variables y mtodos de instancia. Los programas en Java completos constarn por lo general de varias clases de Java en distintos archivos fuente. Una clase es una plantilla para un objeto. Por lo tanto define la estructura de un objeto y su interfaz funcional, en forma de mtodos. Cuando se ejecuta un programa en Java, el sistema utiliza definiciones de clase para crear instancias de las clases, que son los objetos reales. Los trminos instancia y objeto se utilizan de manera indistinta. La forma general de una definicin de clase es:
class Nombre_De_Clase {

tipo_de_variable nombre_de_atributo1;

tipo_de_variable nombre_de_atributo2;

// . . .

tipo_devuelto nombre_de_mtodo1( lista_de_parmetros ) {

cuerpo_del_mtodo1;

tipo_devuelto nombre_de_mtodo2( lista_de_parmetros ) {

cuerpo_del_mtodo2;

// . . .

Los tipos tipo_de_variable y tipo_devuelto, han de ser tipos simples Java o nombres de otras clases ya definidas. Tanto Nombre_De_Clase, como losnombre_de_atributo y nombre_de_mtodo, han de ser identificadores Java vlidos.
b.) Los atributos

Los datos se encapsulan dentro de una clase declarando variables dentro de las llaves de apertura y cierre de la declaracin de la clase, variables que se conocen como atributos. Se declaran igual que las variables locales de un mtodo en concreto. Por ejemplo, este es un programa que declara una clase MiPunto, con dos atributos enteros llamados x e y.
class MiPunto {

int x, y;

Los atributos se pueden declarar con dos clases de tipos: un tipo simple Java (ya descritos), o el nombre de una clase (ser una referencia a objeto, vase el punto C.a de este mismo apartado). Cuando se realiza una instancia de una clase (creacin de un objeto) se reservar en la memoria un espacio para un conjunto de datos como el que definen los atributos de una clase. A este conjunto de variables se le denomina variables de instancia.
c.) Los mtodos

Los mtodos son subrutinas que definen la interfaz de una clase, sus capacidades y comportamiento. Un mtodo ha de tener por nombre cualquier identificador legal distinto de los ya utilizados por los nombres de la clase en que est definido. Los mtodos se declaran al mismo nivel que las variables de instancia dentro de una definicin de clase. En la declaracin de los mtodos se define el tipo de valor que devuelven y a una lista formal de parmetros de entrada, de sintaxis tipo identificador separadas por comas. La forma general de una declaracin de mtodo es:
tipo_devuelto nombre_de_mtodo( lista-formal-de-parmetros ) {

cuerpo_del_mtodo;

Por ejemplo el siguiente mtodo devuelve la suma de dos enteros:


int metodoSuma( int paramX, int paramY ) {

return ( paramX + paramY );

En el caso de que no se desee devolver ningn valor se deber indicar como tipo la palabra reservada void. As mismo, si no se desean parmetros, la declaracin del mtodo debera incluir un par de parntesis vacos (sin void): void metodoVacio( ) { }; Los mtodos son llamados indicando una instancia individual de la clase, que tendr su propio conjunto nico de variables de instancia, por lo que los mtodos se pueden referir directamente a ellas. El mtodo inicia() para establecer valores a las dos variables de instancia sera el siguiente:
void inicia( int paramX, int paramY ) {

x = paramX;

y = paramY;

C. La instanciacin de las clases: Los objetos

a.) Referencias a Objeto e Instancias

Los tipos simples de Java describan el tamao y los valores de las variables. Cada vez que se crea una clase se aade otro tipo de dato que se puede utilizar igual que uno de los tipos simples. Por ello al declarar una nueva variable, se puede utilizar un nombre de clase como tipo. A estas variables se las conoce como referencias a objeto. Todas las referencias a objeto son compatibles tambin con las instancias de subclases de su tipo. Del mismo modo que es correcto asignar un byte a una variable declarada como int, se puede declarar que una variable es del tipo MiClase y guardar una referencia a una instancia de este tipo de clase: MiPunto p; Esta es una declaracin de una variable p que es una referencia a un objeto de la clase MiPunto, de momento con un valor por defecto de null. La referencia null es una referencia a un objeto de la clase Object, y se podr convertir a una referencia a cualquier otro objeto porque todos los objetos son hijos de la clase Object.
b.) Constructores

Las clases pueden implementar un mtodo especial llamado constructor. Un constructor es un mtodo que inicia un objeto inmediatamente despus de su creacin. De esta forma nos evitamos el tener que iniciar las variables explcitamente para su iniciacin. El constructor tiene exactamente el mismo nombre de la clase que lo implementa; no puede haber ningn otro mtodo que comparta su nombre con el de su clase. Una vez definido, se llamar automticamente al constructor al crear un objeto de esa clase (al utilizar el operador new). El constructor no devuelve ningn tipo, ni siquiera void. Su misin es iniciar todo estado interno de un objeto (sus atributos), haciendo que el objeto sea utilizable inmediatamente; reservando memoria para sus atributos, iniciando sus valores... Por ejemplo:
MiPunto( ) {

inicia( -1, -1 );

Este constructor denominado constructor por defecto, por no tener parmetros, establece el valor -1 a las variables de instancia x e y de los objetos que construya. El compilador, por defecto ,llamar al constructor de la superclase Object() si no se especifican parmetros en el constructor. Este otro constructor, sin embargo, recibe dos parmetros:
MiPunto( int paraX, int paraY ) {

inicia( paramX, paramY );

La lista de parmetros especificada despus del nombre de una clase en una sentencia new se utiliza para pasar parmetros al constructor. Se llama al mtodo constructor justo despus de crear la instancia y antes de que new devuelva el control al punto de la llamada. As, cuando ejecutamos el siguiente programa: MiPunto p1 = new MiPunto(10, 20); System.out.println( "p1.- x = " + p1.x + " y = " + p1.y ); Se muestra en la pantalla: p1.- x = 10 y = 20

Para crear un programa Java que contenga ese cdigo, se debe de crear una clase que contenga un mtodo main(). El intrprete java se ejecutar el mtodo mainde la clase que se le indique como parmetro. Para ms informacin sobre cmo crear y ejecutar un programa, as como los tipos de programas que se pueden crear en Java, vase el captulo "II.12. Creacin de programas Java" de este tutorial.
c.) El operador new

El operador new crea una instancia de una clase (objetos) y devuelve una referencia a ese objeto. Por ejemplo: MiPunto p2 = new MiPunto(2,3); Este es un ejemplo de la creacin de una instancia de MiPunto, que es controlador por la referencia a objeto p2. Hay una distincin crtica entre la forma de manipular los tipos simples y las clases en Java: Las referencias a objetos realmente no contienen a los objetos a los que referencian. De esta forma se pueden crear mltiples referencias al mismo objeto, como por ejemplo: MiPunto p3 =p2; Aunque tan slo se cre un objeto MiPunto, hay dos variables (p2 y p3) que lo referencian. Cualquier cambio realizado en el objeto referenciado por p2 afectar al objeto referenciado por p3. La asignacin de p2 a p3 no reserva memoria ni modifica el objeto. De hecho, las asignaciones posteriores de p2 simplemente desengancharn p2 del objeto, sin afectarlo: p2 = null; // p3 todava apunta al objeto creado con new Aunque se haya asignado null a p2, p3 todava apunta al objeto creado por el operador new. Cuando ya no haya ninguna variable que haga referencia a un objeto, Java reclama automticamente la memoria utilizada por ese objeto, a lo que se denominarecogida de basura.

Cuando se realiza una instancia de una clase (mediante new) se reserva en la memoria un espacio para un conjunto de datos como el que definen los atributos de la clase que se indica en la instanciacin. A este conjunto de variables se le denomina variables de instancia. La potencia de las variables de instancia es que se obtiene un conjunto distinto de ellas cada vez que se crea un objeto nuevo. Es importante el comprender que cada objeto tiene su propia copia de las variables de instancia de su clase, por lo que los cambios sobre las variables de instancia de un objeto no tienen efecto sobre las variables de instancia de otro. El siguiente programa crea dos objetos MiPunto y establece los valores de x e y de cada uno de ellos de manera independiente para mostrar que estn realmente separados. MiPunto p4 = new MiPunto( 10, 20 ); MiPunto p5 = new MiPunto( 42, 99 ); System.out.println("p4.- x = " + p4.x + " y = " + p4.y); System.out.println("p5.- x = " + p5.x + " y = " + p5.y); Este es el aspecto de salida cuando lo ejecutamos. p4.- x = 10 y = 20 p5.- x = 42 y = 99 D. Acceso al objeto
a.) El operador punto (.)

El operador punto (.) se utiliza para acceder a las variables de instancia y los mtodos contenidos en un objeto, mediante su referencia a objeto: referencia_a_objeto.nombre_de_variable_de_instancia referencia_a_objeto.nombre_de_mtodo( lista-deparmetros );

Hemos creado un ejemplo completo que combina los operadores new y punto para crear un objeto MiPunto, almacenar algunos valores en l e imprimir sus valores finales: MiPunto p6 = new MiPunto( 10, 20 ); System.out.println ("p6.- 1. X=" + p6.x + " , Y=" + p6.y); p6.inicia( 30, 40 ); System.out.println ("p6.- 2. X=" + p6.x + " , Y=" + p6.y); Cuando se ejecuta este programa, se observa la siguiente salida: p6.- 1. X=10 , Y=20 p6.- 2. X=30 , Y=40 Durante las impresiones (mtodo println()) se accede al valor de las variables mediante p6.x y p6.y, y entre una impresin y otra se llama al mtodo inicia(), cambiando los valores de las variables de instancia. Este es uno de los aspectos ms importantes de la diferencia entre la programacin orientada a objetos y la programacin estructurada. Cuando se llama al mtodop6.inicia(), lo primero que se hace en el mtodo es sustituir los nombres de los atributos de la clase por las correspondientes variables de instancia del objeto con que se ha llamado. As por ejemplo x se convertir en p6.x. Si otros objetos llaman a inicia(), incluso si lo hacen de una manera concurrente, no se producen efectos laterales, ya que las variables de instancia sobre las que trabajan son distintas.
b.) La referencia this

Java incluye un valor de referencia especial llamado this, que se utiliza dentro de cualquier mtodo para referirse al objeto actual. El valor this se refiere al objeto sobre el que ha sido llamado el mtodo actual. Se puede utilizar this siempre que se requiera una referencia a un objeto del tipo de una clase actual. Si hay dos objetos que utilicen el mismo cdigo, seleccionados a travs de otras instancias, cada uno tiene su propio valor nico de this.

Un refinamiento habitual es que un constructor llame a otro para construir la instancia correctamente. El siguiente constructor llama al constructor parametrizadoMiPunto(x,y) para terminar de iniciar la instancia:
MiPunto() {

this( -1, -1 ); // Llama al constructor parametrizado

En Java se permite declarar variables locales, incluyendo parmetros formales de mtodos, que se solapen con los nombres de las variables de instancia. No se utilizan x e y como nombres de parmetro para el mtodo inicia, porque ocultaran las variables de instancia x e y reales del mbito del mtodo. Si lo hubisemos hecho, entonces x se hubiera referido al parmetro formal, ocultando la variable de instancia x:
void inicia2( int x, int y ) {

x = x; // Ojo, no modificamos la variable de instancia!!!

this.y = y; // Modificamos la variable de instancia!!!

E. La destruccin del objeto


a.) La destruccin de los objetos

Cuando un objeto no va a ser utilizado, el espacio de memoria de dinmica que utiliza ha de ser liberado, as como los recursos que posea, permitiendo al programa disponer de todos los recursos posibles. A esta accin se la da el nombre de destruccin del objeto. En Java la destruccin se puede realizar de forma automtica o de forma personalizada, en funcin de las caractersticas del objeto.
b.) La destruccin por defecto: Recogida de basura

El intrprete de Java posee un sistema de recogida de basura, que por lo general permite que no nos preocupemos de liberar la memoria asignada explcitamente. El recolector de basura ser el encargado de liberar una zona de memoria dinmica que haba sido reservada mediante el operador new, cuando el objeto ya no va a ser utilizado ms durante el programa (por ejemplo, sale del mbito de utilizacin, o no es referenciado nuevamente). El sistema de recogida de basura se ejecuta peridicamente, buscando objetos que ya no estn referenciados.
c.) La destruccin personalizada: finalize

A veces una clase mantiene un recurso que no es de Java como un descriptor de archivo o un tipo de letra del sistema de ventanas. En este caso sera acertado el utilizar la finalizacin explcita, para asegurar que dicho recurso se libera. Esto se hace mediante la destruccin personalizada, un sistema similar a los destructores de C++. Para especificar una destruccin personalizada se aade un mtodo a la clase con el nombre finalize:
class ClaseFinalizada{

ClaseFinalizada() { // Constructor

// Reserva del recurso no Java o recurso compartido

protected void finalize() {

// Liberacin del recurso no Java o recurso compartido

El intrprete de Java llama al mtodo finalize(), si existe cuando vaya a reclamar el espacio de ese objeto, mediante la recogida de basura. Debe observarse que el mtodo finalize() es de tipo protected void y por lo tanto deber de sobreescribirse con este mismo tipo.

II.6. LA HERENCIA A. Introduccin La verdadera potencia de la programacin orientada a objetos radica en su capacidad para reflejar la abstraccin que el cerebro humano realiza automticamente durante el proceso de aprendizaje y el proceso de anlisis de informacin. Las personas percibimos la realidad como un conjunto de objetos interrelacionados. Dichas interrelaciones, pueden verse como un conjunto de abstracciones y generalizaciones que se han ido asimilando desde la niez. As, los defensores de la programacin orientada a objetos afirman que esta tcnica se adecua mejor al funcionamiento del cerebro humano, al permitir descomponer un

problema de cierta magnitud en un conjunto de problemas menores subordinados del primero. La capacidad de descomponer un problema o concepto en un conjunto de objetos relacionados entre s, y cuyo comportamiento es fcilmente identificable, puede ser muy til para el desarrollo de programas informticos. B. Jerarqua La herencia es el mecanismo fundamental de relacin entre clases en la orientacin a objetos. Relaciona las clases de manera jerrquica; una clase padre o superclasesobre otras clases hijas o subclases.

Imagen 4: Ejemplo de otro rbol de herencia Los descendientes de una clase heredan todas las variables y mtodos que sus ascendientes hayan especificado como heredables, adems de crear los suyos propios. La caracterstica de herencia, nos permite definir nuevas clases derivadas de otra ya existente, que la especializan de alguna manera. As logramos definir una jerarqua de clases, que se puede mostrar mediante un rbol de herencia. En todo lenguaje orientado a objetos existe una jerarqua, mediante la que las clases se relacionan en trminos de herencia. En Java, el punto ms alto de la jerarqua es la clase Object de la cual derivan todas las dems clases. C. Herencia mltiple En la orientacin a objetos, se consideran dos tipos de herencia, simple y mltiple. En el caso de la primera, una clase slo puede derivar de una nica superclase. Para el segundo tipo, una clase puede descender de varias superclases. En Java slo se dispone de herencia simple, para una mayor sencillez del lenguaje, si bien se compensa de cierta manera la inexistencia de herencia mltiple con un concepto denominado interface, que estudiaremos ms adelante.

D. Declaracin Para indicar que una clase deriva de otra, heredando sus propiedades (mtodos y atributos), se usa el trmino extends, como en el siguiente ejemplo:
public class SubClase extends SuperClase {

// Contenido de la clase

Por ejemplo, creamos una clase MiPunto3D, hija de la clase ya mostrada MiPunto:
class MiPunto3D extends MiPunto {

int z;

MiPunto3D( ) {

x = 0; // Heredado de MiPunto

y = 0; // Heredado de MiPunto

z = 0; // Nuevo atributo

La palabra clave extends se utiliza para decir que deseamos crear una subclase de la clase que es nombrada a continuacin, en nuestro caso MiPunto3D es hija deMiPunto. E. Limitaciones en la herencia Todos los campos y mtodos de una clase son siempre accesibles para el cdigo de la misma clase. Para controlar el acceso desde otras clases, y para controlar la herencia por las subclase, los miembros (atributos y mtodos) de las clases tienen tres modificadores posibles de control de acceso:

public: Los miembros declarados public son accesibles en cualquier lugar en que sea accesible la clase, y son heredados por las subclases. private: Los miembros declarados private son accesibles slo en la propia clase. protected: Los miembros declarados protected son accesibles slo para sus subclases

Por ejemplo:
class Padre { // Hereda de Object

// Atributos

private int numeroFavorito, nacidoHace, dineroDisponible;

// Mtodos

public int getApuesta() {

return numeroFavorito;

protected int getEdad() {

return nacidoHace;

private int getSaldo() {

return dineroDisponible;

class Hija extends Padre {

// Definicin

class Visita {

// Definicin

En este ejemplo, un objeto de la clase Hija, hereda los tres atributos (numeroFavorito, nacidoHace y dineroDisponible) y los tres mtodos ( getApuesta(),getEdad() y getSaldo() ) de la clase Padre, y podr invocarlos. Cuando se llame al mtodo getEdad() de un objeto de la clase Hija, se devolver el valor de la variable de instancia nacidoHace de ese objeto, y no de uno de la clase Padre. Sin embargo, un objeto de la clase Hija, no podr invocar al mtodo getSaldo() de un objeto de la clase Padre, con lo que se evita que el Hijo conozca el estado de la cuenta corriente de un Padre. La clase Visita, solo podr acceder al mtodo getApuesta(), para averiguar el nmero favorito de un Padre, pero de ninguna manera podr conocer ni su saldo, ni su edad (sera una indiscrecin, no?). F. La clase Object La clase Object es la superclase de todas las clases da Java. Todas las clases derivan, directa o indirectamente de ella. Si al definir una nueva clase, no aparece la clusula extends, Java considera que dicha clase desciende directamente de Object. La clase Object aporta una serie de funciones bsicas comunes a todas las clases:

public boolean equals( Object obj ): Se utiliza para comparar, en valor, dos objetos. Devuelve true si el objeto que recibe por parmetro es igual, en valor, que el objeto desde el que se llama al mtodo. Si se desean comparar dos referencias a objeto se pueden utilizar los operadores de comparacin == y !=.

public int hashCode(): Devuelve un cdigo hash para ese objeto, para poder almacenarlo en una Hashtable. protected Object clone() throws CloneNotSupportedException: Devuelve una copia de ese objeto. public final Class getClass(): Devuelve el objeto concreto, de tipo Class, que representa la clase de ese objeto. protected void finalize() throws Trowable: Realiza acciones durante la recogida de basura.

Para ms informacin vase [Arnold y Gosling, 1997

II.7. OPERACIONES AVANZADAS EN LAS CLASES A. Introduccin La programacin orientada a objetos en Java va mucho ms all de las clases, los objetos y la herencia. Java presenta una serie de capacidades que enriquecen el modelo de objetos que se puede representar en un programa Java. En este captulo entraremos en ellos. Vamos a ver cmo programar conceptos avanzados de la herencia, polimorfismo y composicin, como conceptos que se pueden programar en Java. B. Operaciones avanzadas en la herencia
a.) Introduccin

En el captulo anterior ya se han estudiado los fundamentos de la herencia en Java. Sin embargo, el lenguaje tiene muchas ms posibilidades en este aspecto, como estudiaremos a continuacin. Conviene recordar que estamos utilizando el cdigo de la clase MiPunto, cuyo cdigo se puede encontrar en el apartado "II.5. Clases y Objetos" de este tutorial.
b.) Los elementos globales: static

A veces se desea crear un mtodo o una variable que se utiliza fuera del contexto de cualquier instancia, es decir, de una manera global a un programa. Todo lo que se tiene que hacer es declarar estos elementos como static. Esta es la manera que tiene Java de implementar funciones y variables globales. Por ejemplo:
static int a = 3;

static void metodoGlobal() {

// implementacin del mtodo

No se puede hacer referencia a this o a super dentro de una mtodo static. Mediante atributos estticos, todas las instancias de una clase adems del espacio propio para variables de instancia, comparten un espacio comn. Esto es til para modelizar casos de la vida real. Otro aspecto en el que es til static es en la creacin de mtodos a los que se puede llamar directamente diciendo el nombre de la clase en la que estn declarados. Se puede llamar a cualquier mtodo static, o referirse a cualquier variable static, utilizando el operador punto con el nombre de la clase, sin necesidad de crear un objeto de ese tipo:
class ClaseStatic {

int atribNoStatic = 42;

static int atribStatic = 99;

static void metodoStatic() {

System.out.println("Met. static = " + atribStatic);

static void metodoNoStatic() {

System.out.println("Met. no static = " + atribNoStatic);

El siguiente cdigo es capaz de llamar a metodoStatic y atribStatic nombrando directamente la clase (sin objeto, sin new), por haber sido declarados static. System.out.println("At. static = " + ClaseStatic.atribStatic); ClaseStatic.metodoStatic(); // Sin instancia new ClaseStatic().metodoNoStatic(); // Hace falta instancia Si ejecutamos este programa obtendramos: At. static = 99 Met. static = 99 Met. no static = 42 Debe tenerse en cuenta que en un mtodo esttico tan slo puede hacerse refernecia a variables estticas.
c.) Las clases y mtodos abstractos: abstract

Hay situaciones en las que se necesita definir una clase que represente un concepto abstracto, y por lo tanto no se pueda proporcionar una implementacin completa de algunos de sus mtodos.

Se puede declarar que ciertos mtodos han de ser sobrescritos en las subclases, utilizando el modificador de tipo abstract. A estos mtodos tambin se les llama responsabilidad de subclase. Cualquier subclase de una clase abstract debe implementar todos los mtodos abstract de la superclase o bien ser declarada tambin como abstract. Cualquier clase que contenga mtodos declarados como abstract tambin se tiene que declarar como abstract, y no se podrn crear instancias de dicha clase (operador new). Por ltimo se pueden declarar constructores abstract o mtodos abstract static. Veamos un ejemplo de clases abstractas:
abstract class claseA {

abstract void metodoAbstracto();

void metodoConcreto() {

System.out.println("En el metodo concreto de claseA");

class claseB extends claseA {

void metodoAbstracto(){

System.out.println("En el metodo abstracto de claseB");

La clase abstracta claseA ha implementado el mtodo concreto metodoConcreto(), pero el mtodo metodoAbstracto() era abstracto y por eso ha tenido que ser redefinido en la clase hija claseB. claseA referenciaA = new claseB(); referenciaA.metodoAbstracto(); referenciaA.metodoConcreto(); La salida de la ejecucin del programa es: En el metodo abstracto de claseB En el metodo concreto de claseA C. El polimorfismo
a.) Seleccin dinmica de mtodo

Las dos clases implementadas a continuacin tienen una relacin subclase/superclase simple con un nico mtodo que se sobrescribe en la subclase:
class claseAA {

void metodoDinamico() {

System.out.println("En el metodo dinamico de claseAA");

class claseBB extends claseAA {

void metodoDinamico() {

System.out.println("En el metodo dinamico de claseBB");

Por lo tanto si ejecutamos: claseAA referenciaAA = new claseBB(); referenciaAA.metodoDinamico(); La salida de este programa es: En el metodo dinamico de claseBB Se declara la variable de tipo claseA, y despus se almacena una referencia a una instancia de la clase claseB en ella. Al llamar al mtodo metodoDinamico() de claseA, el compilador de Java verifica queclaseA tiene un mtodo llamado metodoDinamico(), pero el intrprete de

Java observa que la referencia es realmente una instancia de claseB, por lo que llama al mtodo metodoDinamico() de claseB en vez de al de claseA. Esta forma de polimorfismo dinmico en tiempo de ejecucin es uno de los mecanismos ms poderosos que ofrece el diseo orientado a objetos para soportar la reutilizacin del cdigo y la robustez.
b.) Sobrescritura de un mtodo

Durante una jerarqua de herencia puede interesar volver a escribir el cuerpo de un mtodo, para realizar una funcionalidad de diferente manera dependiendo del nivel de abstraccin en que nos encontremos. A esta modificacin de funcionalidad se le llama sobrescritura de un mtodo. Por ejemplo, en una herencia entre una clase SerVivo y una clase hija Persona; si la clase SerVivo tuviese un mtodo alimentarse(), debera volver a escribirse en el nivel de Persona, puesto que una persona no se alimenta ni como un Animal, ni como una Planta... La mejor manera de observar la diferencia entre sobrescritura y sobrecarga es mediante un ejemplo. A continuacin se puede observar la implementacin de la sobrecarga de la distancia en 3D y la sobrescritura de la distancia en 2D.
class MiPunto3D extends MiPunto {

int x,y,z;

double distancia(int pX, int pY) { // Sobrescritura

int retorno=0;

retorno += ((x/z)-pX)*((x/z)-pX);

retorno += ((y/z)-pY)*((y/z)-pY);

return Math.sqrt( retorno );

Se inician los objetos mediante las sentencias: MiPunto p3 = new MiPunto(1,1); MiPunto p4 = new MiPunto3D(2,2); Y llamando a los mtodos de la siguiente forma: p3.distancia(3,3); //Mtodo MiPunto.distancia(pX,pY) p4.distancia(4,4); //Mtodo MiPunto3D.distancia(pX,pY) Los mtodos se seleccionan en funcin del tipo de la instancia en tiempo de ejecucin, no a la clase en la cual se est ejecutando el mtodo actual. A esto se le llama seleccin dinmica de mtodo.
c.) Sobrecarga de mtodo

Es posible que necesitemos crear ms de un mtodo con el mismo nombre, pero con listas de parmetros distintas. A esto se le llama sobrecarga del mtodo. La sobrecarga de mtodo se utiliza para proporcionar a Java un comportamiento polimrfico. Un ejemplo de uso de la sobrecarga es por ejemplo, el crear constructores alternativos en funcin de las coordenadas, tal y como se haca en la clase MiPunto:
MiPunto( ) { //Constructor por defecto

inicia( -1, -1 );

MiPunto( int paramX, int paramY ) { // Parametrizado

this.x = paramX;

y = paramY;

Se llama a los constructores basndose en el nmero y tipo de parmetros que se les pase. Al nmero de parmetros con tipo de una secuencia especfica se le llama signatura de tipo. Java utiliza estas signaturas de tipo para decidir a qu mtodo llamar. Para distinguir entre dos mtodos, no se consideran los nombres de los parmetros formales sino sus tipos: MiPunto p1 = new MiPunto(); // Constructor por defecto MiPunto p2 = new MiPunto( 5, 6 ); // Constructor parametrizado
d.) Limitacin de la sobreescritura: final

Todos los mtodos y las variables de instancia se pueden sobrescribir por defecto. Si se desea declarar que ya no se quiere permitir que las subclases sobrescriban las variables o mtodos, stos se pueden declarar como final. Esto se utiliza a menudo para crear el equivalente de una constante de C++.

Es un convenio de codificacin habitual elegir identificadores en maysculas para las variables que sean final, por ejemplo: final int NUEVO_ARCHIVO = 1; d. las referencias polimrficas: this y super
a.) Acceso a la propia clase: this

Aunque ya se explic en el apartado <"ii.5.="" clases="" y="" objetos"<="" a=""><"ii.5.="" clases="" y="" objetos"<="" a="">de este tutorial el uso de la referencia this como modificador de mbito, tambin se la puede nombrar como ejemplo de polimorfismo
<"ii.5.="" clases="" y="" objetos"<="" a="" style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letterspacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; textindent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "> Adems de hacer continua referencia a la clase en la que se invoque, tambin vale para sustituir a sus constructores, utilizndola como mtodo: this(); // Constructor por defecto this( int paramX, int paramY ); // Constructor parametrizado
b.) Acceso a la superclase: super

Ya hemos visto el funcionamiento de la referencia this como referencia de un objeto hacia s mismo. En Java existe otra referencia llamada super, que se refiere directamente a la superclase. La referencia super usa para acceder a mtodos o atributos de la superclase. Podamos haber implementado el constructor de la clase MiPunto3D (hija de MiPunto) de la siguiente forma: MiPunto3D( int x, int y, int z ) {

super( x, y ); // Aqu se llama al constructor de MiPunto

this.z = super.metodoSuma( x, y ); // Mtodo de la superclase

Con una sentencia super.metodoSuma(x, y) se llamara al mtodo metodoSuma() de la superclase de la instancia this. Por el contrario con super() llamamos al constructor de la superclase.

<"ii.5.="" clases="" y="" objetos"<="" a="">E. la composicin Otro tipo de relacin muy habitual en los diseos de los programas es la composicin. Los objetos suelen estar compuestos de conjuntos de objetos ms pequeos; un coche es un conjunto de motor y carrocera, un motor es un conjunto de piezas, y as sucesivamente. Este concepto es lo que se conoce como composicin. La forma de implementar una relacin de composicin en Java es incluyendo una referencia a objeto de la clase componedora en la clase compuesta. Por ejemplo, una clase AreaRectangular, quedara definida por dos objetos de la clase MiPunto, que representasen dos puntas contrarias de un rectngulo:
class AreaRectangular {

MiPunto extremo1; //extremo inferior izquierdo

MiPunto extremo2; //extremo superior derecho

AreaRectangular() {

extremo1=new MiPunto();

extremo2=new MiPunto();

boolean estaEnElArea( MiPunto p ){

if ( ( p.x>=extremo1.x && p.x<=extremo2.x ) &&

( p.y>=extremo1.y && p.y<=extremo2.y ) )

return true;

else

return false;

Puede observarse que las referencias a objeto (extremo1 y extremo2) son iniciadas, instanciando un objeto para cada una en el constructor. As esta clase mediante dos puntos, referenciados por extremo1y extremo2, establece unos lmites de su rea, que sern utilizados para comprobar si un punto est en su rea en el mtodo estaEnElArea().

II.8. GESTIN DE EXCEPCIONES Y ERRORES A. Introduccin El control de flujo en un programa Java puede hacerse mediante las ya conocidas sentencias estructuradas (if, while, return). Pero Java va mucho ms all, mediante una tcnica de programacin denominada gestin de excepciones. Mediante las excepciones se podr evitar repetir continuamente cdigo, en busca de un posible error, y avisar a otros objetos de una condicin anormal de ejecucin durante un programa. Durante este captulo estudiaremos la gestin de excepciones y errores, sin pretender profundizar demasiado, pero s fijando la base conceptual de lo que este modo de programacin supone. Mediante la gestin de excepciones se prescindir de sentencias de control de errores del tipo:
if ( error == true )

return ERROR;

B. Tipos de excepciones Existen varios tipos fundamentales de excepciones:

Error: Excepciones que indican problemas muy graves, que suelen ser no recuperables y no deben casi nunca ser capturadas. Exception: Excepciones no definitivas, pero que se detectan fuera del tiempo de ejecucin. RuntimeException: Excepciones que se dan durante la ejecucin del programa.

Imagen 5: Herencia de excepciones Java Todas las excepciones tienen como clase base la clase Throwable, que est incluida en el paquete java.lang, y sus mtodos son: Trowable( String mensaje ); Constructor. La cadena es opcional Throwable fillInStackTrace(); Llena la pila de traza de ejecucin. String getLocalizedMessage(); Crea una descripcin local de este objeto. String getMessage(); Devuelve la cadena de error del objeto. void printStackTrace( PrintStream_o_PrintWriter s ); Imprime este objeto y su traza en el flujo del parmetro s, o en la salida estndar (por defecto). String toString; Devuelve una breve descripcin del objeto. C. Funcionamiento
a.) Introduccin

Para que el sistema de gestin de excepciones funcione, se ha de trabajar en dos partes de los programas:

Definir qu partes de los programas crean una excepcin y bajo qu condiciones. Para ello se utilizan las palabras reservadas throw y throws. Comprobar en ciertas partes de los programas si una excepcin se ha producido, y actuar en consecuencia. Para ello se utilizan las palabras reservadas try, catch y finally.
b.) Manejo de excepciones: try - catch - finally

Cuando el programador va a ejecutar un trozo de cdigo que pueda provocar una excepcin (por ejemplo, una lectura en un fichero), debe incluir este fragmento de cdigo dentro de un bloque try:
try {

// Cdigo posiblemente problemtico

Pero lo importante es cmo controlar qu hacer con la posible excepcin que se cree. Para ello se utilizan las clausulas catch, en las que se especifica que accin realizar:
try {

// Cdigo posiblemente problemtico

} catch( tipo_de_excepcion e) {

// Cdigo para solucionar la excepcin e

} catch( tipo_de_excepcion_mas_general e) {

// Cdigo para solucionar la excepcin e

En el ejemplo se observa que se pueden anidar sentencias catch, pero conviene hacerlo indicando en ltimo lugar las excepciones ms generales (es decir, que se encuentren ms arriba en el rbol de herencia de excepciones), porque el intrprete Java ejecutar aquel bloque de cdigo catch cuyo parmetro sea del tipo de una excepcin lanzada. Si por ejemplo se intentase capturar primero una excepcin Throwable, nunca llegaramos a gestionar una excepcin Runtime, puesto que cualquier clase hija de Runtime es tambin hija de Throwable, por herencia. Si no se ha lanzado ninguna excepcin el cdigo contina sin ejecutar ninguna sentencia catch. Pero, y si quiero realizar una accin comn a todas las opciones?. Para insertar fragmentos de cdigo que se ejecuten tras la gestin de las excepciones. Este cdigo se ejecutar tanto si se ha tratado una excepcin (catch) como sino. Este tipo de cdigo se inserta en una sentencia finally, que ser ejecutada tras el bloque try o catch:
try {

} catch( Exception e ) {

} finally {

// Se ejecutara tras try o catch

c.) Lanzamiento de excepciones: throw - throws

Muchas veces el programador dentro de un determinado mtodo deber comprobar si alguna condicin de excepcin se cumple, y si es as lanzarla. Para ello se utilizan las palabras reservadas throw ythrows. Por una parte la excepcin se lanza mediante la sentencia throw:
if ( condicion_de_excepcion == true )

throw new miExcepcion();

Se puede observar que hemos creado un objeto de la clase miExcepcion, puesto que las excepciones son objetos y por tanto debern ser instanciadas antes de ser lanzadas. Aquellos mtodos que pueden lanzar excepciones, deben cules son esas excepciones en su declaracin. Para ello se utiliza la sentencia throws:
tipo_devuelto miMetodoLanzador() throws miExcep1, miExcep2 {

// Codigo capaz de lanzar excepciones miExcep1 y miExcep2

Se puede observar que cuando se pueden lanzar en el mtodo ms de una excepcin se deben indicar en su declaracin separadas por comas.

d.) Ejemplo de gestin de excepciones

Ahora que ya sabemos cmo funciona este sistema, conviene ver al menos un pequeo ejemplo, que ilustre al lector en el uso de las excepciones:
// Creo una excepcin personalizada

class MiExcepcion extends Exception {

MiExcepcion(){

super(); // constructor por defecto de Exception

MiExcepcion( String cadena ){

super( cadena ); // constructor param. de Exception

// Esta clase lanzar la excepcin

class Lanzadora {

void lanzaSiNegativo( int param ) throws MiExcepcion {

if ( param < 0 )

throw new MiExcepcion( "Numero negativo" );

class Excepciones {

public static void main( String[] args ) {

// Para leer un fichero

Lanzadora lanza = new Lanzadora();

FileInputStream entrada = null;

int leo;

try {

entrada = new FileInputStream( "fich.txt" );

while ( ( leo = entrada.read() ) != -1 )

lanza.lanzaSiNegativo( leo );

entrada.close();

System.out.println( "Todo fue bien" );

} catch ( MiExcepcion e ){ // Personalizada

System.out.println( "Excepcion: " + e.getMessage() );

} catch ( IOException e ){ // Estndar

System.out.println( "Excepcion: " + e.getMessage() );

} finally {

if ( entrada != null )

try {

entrada.close(); // Siempre queda cerrado

} catch ( Exception e ) {

System.out.println( "Excepcion: " + e.getMessage() );

System.out.println( "Fichero cerrado." );

class Excepciones {

public static void main( String[] args ) {

// Para leer un fichero

FileInputStream entrada = null;

Lanzadora lanza = new Lanzadora();

int leo;

try {

entrada = new FileInputStream("fich.txt");

while ( ( leo = entrada.read() ) != -1 )

lanza.lanzaSiNegativo( leo );

System.out.println( "Todo fue bien" );

} catch ( MiExcepcion e ){ // Personalizada

System.out.println( "Excepcion: " + e.getMessage() );

} catch ( IOException e ){ // Estndar

System.out.println( "Excepcion: " + e.getMessage() );

} finally {

entrada.close(); // As el fichero siempre queda cerrado

System.out.println( "Fichero cerrado" );

Este programa lee un fichero (fichero.txt), y lee su contenido en forma de nmeros. Si alguno de los nmeros ledos es negativo, lanza una excepcin MiExcepcion, Adems gestiona la excepcin IOException, que es una excepcin de las que Java incluye y que se lanza si hay algn problema en una operacin de entrada/salida. Ambas excepciones son gestionadas, imprimiendo su contenido (cadena de error) por pantalla. La salida de este programa, suponiendo un nmero negativo sera: Excepcion: Numero negativo Fichero cerrado En el caso de que no hubiera ningn nmero negativo sera: Todo fue bien Fichero cerrado

En el caso de que se produjese un error de E/S, al leer el primer nmero, sera: Excepcion: java.io.IOException Fichero cerrado
e.) Conclusiones

En cualquier caso se recomienda al programador no abusar de este sistema como control de flujos simples, sino utilizarlo slo en aquellos estados del programa que realmente creen un problema de ejecucin que pueda ser letal para el programa. Para ms informacin sobre las excepciones Java, vanse [Zolli, 1997] y [Naughton, 1996]. D. Excepciones que incorpora Java 1.2
a.) Clases de Error

LinkageError: Una clase no satisface la dependencia que tiene respecto a otra. ClassCircularityError: Se detect una herencia circular entre clases. ClassFormatError: Una clase cargada no ha sido incompletamente descrita. UnsupportedClassVersionError: La versin de una clase no es correcta. ExceptionInInitializerError: Error al iniciar un miembro static. IncompatibleClassChangeError: En una clase, su interfaz no es igual al declarado AbstractMethodError: Se ha invocado un mtodo abstracto. IllegalAccessError: La aplicacin intent acceder a algn miembro no visible. InstantiationError: Se intent instanciar una clase abstracta o interfaz. NoSuchFieldError: No se encontr determinado atributo.

NoSuchMethodError: No se encontr determinado mtodo. NoClassDefFoundError: No se encontr una clase cuando se necesitaba. UnsatisfiedLinkError: Se encontr un enlace insatisfecho en un mtodo nativo. VerifyError: Se ha producido un error de verificacin al cargar una clase. ThreadDeath: Se ha lanzado en el thread vctima tras llamar a stop(). VirtualMachineError: La mquina virtual se ha averiado o quedado sin recursos. InternalError: Error interno en tiempo de ejecucin. OutOfMemoryError: El lector ha agotado la memoria. StackOverflowError: Desbordamiento de pila. Recursin infinita?. UnknownError: Grave error desconocido.
b.) Clases de Exception

CloneNotSupportedException: No se pudo copiar un objeto mediante clone(). IllegalAccessException: Algn mtodo invocado es no visible. InstantiationException: Se ha intentado instanciar una interfaz o una clase abstracta. InterruptedException: Cuando se invoca a interrupt() sobre un thread dormido. NoSuchFieldException: La clase no tiene un atributo con ese nombre. NoSuchMethodException: La clase no tiene un mtodo con ese nombre.
c.) Clases de RuntimeException

ArithmeticException: Error de clculo (como divisin por cero...). ArrayStoreException: Intento de almacenar un objeto equivocado en un

vector. ClassCastException: Intento de conversin invlida. IllegalArgumentException: Se ha pasado un argumento invlido a un mtodo: IllegalThreadStateException: Un thread no estaba en el estado adecuado. NumberFormatException: Una cadena contenedora de un nmero, no lo contiene. IllegalMonitorStateException: Se ha usado wait/notify fuera de cdigo sincronizado. IllegalStateException: Mtodo invocado en un momento inapropiado. IndexOutOfBoundsException: Acceso a un vector fuera de sus lmites: ArrayIndexOutOfBoundsException: Idem, para una matriz. StringIndexOutOfBoundsException: Idem, para una cadena. NegativeArraySizeException: Intento de creacin de un vector de tamao negativo. NullPointerException: Se ha usado una referencia null para acceder a un campo. SecurityException: Algo ha sido vedado por el sistema de seguridad. UnsupportedOperationException: Una operacin invocada no se soporta. Para ms informacin vase la documentacin del JDK que usted vaya a utilizar. II.9. INTERFACES A. Introduccin Las interfaces Java son expresiones puras de diseo. Se trata de autnticas conceptualizaciones no implementadas que sirven de gua para definir un determinado concepto (clase) y lo que debe hacer, pero sin desarrollar un

mecanismo de solucin. Se trata de declarar mtodos abstractos y constantes que posteriormente puedan ser implementados de diferentes maneras segn las necesidades de un programa. Por ejemplo una misma interfaz podra ser implementada en una versin de prueba de manera poco ptima, y ser acelerada convenientemente en la versin definitiva tras conocer ms a fondo el problema. B. Declaracin Para declarar una interfaz se utiliza la sentencia interface, de la misma manera que se usa la sentencia class:
interface MiInterfaz {

int CONSTANTE = 100;

int metodoAbstracto( int parametro );

Se observa en la declaracin que las variables adoptan la declaracin en maysculas, pues en realidad actuarn como constantes final. En ningn caso estas variables actuarn como variables de instancia. Por su parte, los mtodos tras su declaracin presentan un punto y coma, en lugar de su cuerpo entre llaves. Son mtodos abstractos, por tanto, mtodos sin implementacin C. Implementacin de una interfaz Como ya se ha visto, las interfaces carecen de funcionalidad por no estar implementados sus mtodos, por lo que se necesita algn mecanismo para

dar cuerpo a sus mtodos. La palabra reservada implements utilizada en la declaracin de una clase indica que la clase implementa la interfaz, es decir, que asume las constantes de la interfaz, y codifica sus mtodos:
class ImplementaInterfaz implements MiInterfaz{

int multiplicando=CONSTANTE;

int metodoAbstracto( int parametro ){

return ( parametro * multiplicando );

En este ejemplo se observa que han de codificarse todos los mtodos que determina la interfaz (metodoAbstracto()), y la validez de las constantes (CONSTANTE) que define la interfaz durante toda la declaracin de la clase. Una interfaz no puede implementar otra interfaz, aunque s extenderla (extends) amplindola. D. Herencia mltiple Java es un lenguaje que incorpora herencia simple de implementacin pero que puede aportar herencia mltiple de interfaz. Esto posibilita la herencia mltiple en el diseo de los programas Java. Una interfaz puede heredar de ms de una interfaz antecesora.

interface InterfazMultiple extends Interfaz1,Interfaz2{ } Una clase no puede tener ms que una clase antecesora, pero puede implementar ms de una interfaz: class MiClase extends SuPadre implements Interfaz1,Interfaz2{ } El ejemplo tpico de herencia mltiple es el que se presenta con la herencia en diamante:

Imagen 6: Ejemplo de herencia mltiple Para poder llevar a cabo un esquema como el anterior en Java es necesario que las clases A, B y C de la figura sean interfaces, y que la clase D sea una clase (que recibe la herencia mltiple): interface A{ } interface B extends A{ } interface C extends A{ } class D implements B,C{ } E. Colisiones en la herencia mltiple En una herencia mltiple, los identificadores de algunos mtodos o atributos pueden coincidir en la clase que hereda, si dos de las interfaces padres tienen algn mtodo o atributo que coincida en nombre. A esto se le llama colisin.

Esto se dar cuando las clases padre (en el ejemplo anterior B y C) tienen un atributo o mtodo que se llame igual. Java resuelve el problema estableciendo una serie de reglas. Para la colisin de nombres de atributos, se obliga a especificar a qu interfaz base pertenecen al utilizarlos. Para la colisin de nombres en mtodos: Si tienen el mismo nombre y diferentes parmetros: se produce sobrecarga de mtodos permitiendo que existan varias maneras de llamar al mismo. Si slo cambia el valor devuelto: se da un error de compilacin, indicando que no se pueden implementar los dos. Si coinciden en su declaracin: se elimina uno de los dos, con lo que slo queda uno. F. Envolturas de los tipos simples Los tipos de datos de Java no forman parte de la jerarqua de objetos. Sin embargo a veces es necesario crear una representacin como objeto de alguno de los tipos de datos simples de Java. La API de Java contiene un conjunto de interfaces especiales para modificar el comportamiento de los tipos de datos simple. A estas interfaces se las conoce como envolturas de tipo simple. Todas ellas son hijas de la clase abstracta Number y son: Double: Da soporte al tipo double. Float: Da soporte al tipo float. Integer: Da soporte a los tipos int, short y byte. Long: Da soporte al tipo long. Character: Envoltura del tipo char. Boolean: Envoltorio al tipo boolean.

Para ms informacin sobre as envolturas de tipos simples, consltese [Naughton, 1996]. II.10. PAQUETES A. Introduccin Los paquetes son el mecanismo por el que Java permite agrupar clases, interfaces, excepciones y constantes. De esta forma, se agrupan conjuntos de estructuras de datos y de clases con algn tipo de relacin en comn. Con la idea de mantener la reutilizacin y facilidad de uso de los paquetes desarrollados es conveniente que las clases e interfaces contenidas en los mismos tengan cierta relacin funcional. De esta manera los desarrolladores ya tendrn una idea de lo que estn buscando y fcilmente sabrn qu pueden encontrar dentro de un paquete. B. Creacin de un paquete
a.) Declaracin

Para declarar un paquete se utiliza la sentencia package seguida del nombre del paquete que estemos creando: package NombrePaquete; La estructura que ha de seguir un fichero fuente en Java es: Una nica sentencia de paquete (opcional). Las sentencias de importacin deseadas (opcional). La declaracin de una (y slo una) clase pblica (public). Las clases privadas del paquete (opcional). Por lo tanto la sentencia de declaracin de paquete ha de ser la primera en un archivo fuente Java.
b.) Nomenclatura

Para que los nombres de paquete puedan ser fcilmente reutilizados en toda

una compaa o incluso en todo el mundo es conveniente darles nombres nicos. Esto puede ser una tarea realmente tediosa dentro de una gran empresa, y absolutamente imposible dentro de la comunidad de Internet. Por eso se propone asignar como paquetes y subpaquetes el nombre de dominio dentro de Internet. Se ver un ejemplo para un dominio que se llamase japon.magic.com, un nombre apropiado seracom.magic.japon.paquete.
c.) Subpaquetes

Cada paquete puede tener a su vez paquetes con contenidos parecidos, de forma que un programador probablemente estar interesado en organizar sus paquetes de forma jerrquica. Para eso se definen lossubpaquetes. Para crear un subpaquete bastar con almacenar el paquete hijo en un directorio Paquete/Subpaquete. As una clase dentro de un subpaquete como Paquete.Subpaquete.clase estar codificada en el fichero Paquete/Subpaquete.java. El JDK define una variable de entorno denominada CLASSPATH que gestiona las rutas en las que el JDK busca los subpaquetes. El directorio actual suele estar siempre incluido en la variable de entornoCLASSPATH. Para ms informacin sobre el JDK vase el "Apndice I. JDK" de este tutorial. C. Uso de un paquete Con el fin de importar paquetes ya desarrollados se utiliza la sentencia import seguida del nombre de paquete o paquetes a importar. Se pueden importar todos los elementos de un paquete o slo algunos. Para importar todas las clases e interfaces de un paquete se utiliza el metacaracter *: import PaquetePrueba.*; Tambin existe la posibilidad de que se deseen importar slo algunas de las

clases de un cierto paquete o subpaquete: import Paquete.Subpaquete1.Subpaquete2.Clase1; Para acceder a los elementos de un paquete, no es necesario importar explcitamente el paquete en que aparecen, sino que basta con referenciar el elemento tras una especificacin completa de la ruta de paquetes y subpaquetes en que se encuentra. Paquete.Subpaquetes1.Subpaquete2.Clase_o_Interfaz.elem ento En la API de Java se incluyen un conjunto de paquetes ya desarrollados que se pueden incluir en cualquier aplicacin (o applet) Java que se desarrolle. Estos paquetes son explicados con ms detalle en el captulo "III.1.Bibliotecas de la API de Java" de este tutorial. D. mbito de los elementos de un paquete Al introducir el concepto de paquete, surge la duda de cmo proteger los elementos de una clase, qu visibilidad presentan respecto al resto de elementos del paquete, respecto a los de otros paquetes... Ya en la herencia se vieron los identificadores de visibilidad public (visible a todas las clases), private (no visible ms que para la propia clase), y protected (visible a clases hijas). Por defecto se considera los elementos (clases, variables y mtodos) de un mismo paquete como visibles entre ellos (supliendo las denominadas clases amigas de C++).
Situacin del elemento En la misma clase En una clase No en el mismo paquete En una clase hija No No S S S S S private S sin modificador S protected S public S

en otro paquete En una clase no hija No en otro paquete No No S

Tabla 19: Visibilidad dentro de un paquete Todas las reglas explicadas en este apartado son igualmente vlidas para las interfaces Java. Para ms informacin vase [Naughton, 1996]. II.11. LOS THREADS O PROGRAMACIN MULTIHILO A. Introduccin Durante la ejecucin de los programas existen muchas operaciones que precisan de una espera; en busca de una interaccin con el exterior, dejando pasar el tiempo, esperando a que otro proceso acabe... Java permite que estos tiempos desaprovechados sean utilizados por el programador para realizar determinadas tareas, y as aprovechar el microprocesador durante toda la ejecucin del programa. Para ello implementa el concepto de threads, o hilos de control del programa. Mediante el uso de varios threads, se consigue ejecutar varios procesos en paralelo, de forma que cuando uno de ellos est esperando algn evento, permita que el microprocesador ejecute alguno de los otros threads en espera. Cuando el evento que el primer thread esperaba sucede, de nuevo se intercambian los threads para que el primer thread contine su ejecucin. Todo esto viene a suplir a la tcnica de exclusin mutua denominada utilizacin de semforos, extendida entre los programadores de C en UNIX. B. Utilizacin de thread Para crear un thread, se ha de implementar una clase, extendiendo la clase base Runnable, y crear un objeto de la clase Thread. Este objeto representar un nuevo hilo de control, que ser accionado cuando invoquemos al mtodo start() del thread. En ese momento este hilo se activar, ejecutando (si el planificador de hilos considera que es el momento), el mtodo run() de la clase

en que todo esto suceda. Por ejemplo, el siguiente programa utiliza dos hilos, el hilo general main, y el hilo thDemo que creamos:
import java.io.*;

import java.net.*;

class ThreadDemo implements Runnable {

ThreadDemo() {

Thread thDemo = new Thread( this, "ThDemo" );

thDemo.start();

public void run() {

try {

Thread.sleep(3000);

} catch( InterruptedException e ) { }

System.out.println("Saliendo del hilo hijo");

public static void main( String args[] ){

new ThreadDemo();

try {

for ( int i = 5 ; i >0 ; i-- ) {

System.out.println(" Seg: " + i );

Thread.sleep(1000);

} catch( InterruptedException e ) { }

System.out.println("Saliendo del main");

Ambos hilos esperan utilizando el mtodo sleep() de la clase Thread; thDemo tres segundos, y main cinco segundos. Java utilizar los tres segundos de thDemo para ir esperando los tres primeros segundos del hilo main. Por lo tanto la salida por pantalla al ejecutar el programa es: prompt> java ThreadDemo Seg: 5 Seg: 4 Seg: 3 Saliendo del hilo hijo Seg: 2 Seg: 1 Saliendo del hilo main C. Sincronizacin de threads Durante la ejecucin de un programa, muchas veces varios procesos han de realizar tareas de una forma sincronizada, actuando en un determinado orden. Para ello en Java se utilizan la palabra reservadasyncronized, en la declaracin de los procesos con este tipo de caractersticas.

Los procesos declarados como syncronized mediante la utilizacin de excepciones, y de las funciones wait() y notifiy(), respectivamente esperarn a que otro proceso acabe antes de continuar su ejecucin. A continuacin se va a ir viendo cmo implementar el clsico problema de exclusin mutua conocido como el problema del productor/consumidor, en el que dos procesos han de acceder a una cola comn, en la que el proceso productor inserta elementos en la pila, y el proceso consumidor ha de ir consumiendo los elementos en la pila, cada vez que sean insertados:
class ColaSincronizada {

int n;

boolean bandera = false;

synchronized int obten() {

if ( !bandera )

try wait(); catch( InterruptedException e );

System.out.println( "Obtenido: " + n );

bandera = false;

notify();

return n;

synchronized void coloca( int paramN ) {

if ( bandera )

try wait(); catch( InterruptedException e );

n = paramN;

bandera =true;

System.out.println( "Colocado: " + n );

notify();

class Productor implements Runnable {

ColaSincronizada colaProductor;

Productor( ColaSincronizada paramCola ) {

colaProductor = paramCola;

new Thread( this, "Producer" ).start();

public void run() {

int i = 0;

while ( true ) // Bucle infinito

colaProductor.coloca( i++ );

class Consumidor implements Runnable {

ColaSincronizada colaConsumidor;

Consumidor( ColaSincronizada paramCola ) {

colaConsumidor = paramCola;

new Thread( this, "Consumidor" ).start();

public void run() {

while ( true ) // Bucle infinito

colaConsumidor.obten( );

public static void main( String args[] ) {

ColaSincronizada colaLocal = new ColaSincronizada();

new Productor( colaLocal );

new Consumidor( colaLocal );

La salida del programa ser: Colocado: 1 Obtenido: 1 Colocado: 2 Obtenido: 2 Colocado: 3 Obtenido: 3 . . . D. Y mucho ms La utilizacin de programacin concurrente y de los hilos de Java con toda su

potencia va mucho ms all de los objetivos de este tutorial. Lo que aqu se ha visto es simplemente una introduccin para que el lector sea consciente de cul es la potencia de este tipo de programacin. La utilizacin de los threads se extiende con mtodos para que el programador controle la alternancia de los hilos. Estos mtodos son:

suspend(); Bloquea temporalmente la ejecucin de un hilo. resume(); Activa un hilo bloqueado. stop(); Finaliza la ejecucin de un hilo.

Para ms informacin sobre los threads vase [Zolli, 1997]. II.12 CREACIN DE PROGRAMAS JAVA A. Introduccin Una vez entendida la sintaxis y funcionalidad de Java, hay que explicar cmo combinar todos los elementos introducidos para desarrollar programas Java. La programacin Java va mucho ms all de lo que la definicin del lenguaje permite. Son muchos los tipos de aplicaciones que se pueden crear con Java, as como su utilizacin, especialmente gracias a la versatilidad de las bibliotecas de clases que completan el Java bsico. B. Tipos de aplicaciones
a.) Introduccin

Con Java se pueden construir varios tipos de programas, cada uno con unas caractersticas especficas, y que se ejecutan de distintas maneras. A continuacin se explican los principales tipos: Aplicaciones, Applets, JavaBeans, JavaScript y Servlets. Para ms informacin vase [Morgan, 1999] y [Zolli, 1997].
b.) Aplicaciones

Son los programas bsicos de Java. Se ejecutan en una determinada mquina, por el Java Runtime Enviroment (JRE).

Para crear una aplicacin hace falta incluir en alguna de las clases que compongan la aplicacin un mtodo denominado:
public static void main(String[] s){ }

Hay que indicar al JRE (comando java del JDK) el nombre de la clase (previamente compilada a .class), que queremos ejecutar. Cuando se ejecute el programa lo que realmente se ejecutar ser el mtodomain() de la clase indicada al JRE. Las aplicaciones soportan mtodos nativos, o sea, incluir en el programa cdigo escrito en otros lenguajes de programacin, as como violar algunas de las directrices de seguridad. En cada fichero Java (.java) slo debe haber una clase pblica.
c.) Applets

Las applets o miniaplicaciones Java, son programas que deben incluirse en pginas Web para ser observadas por otra aplicacin (visualizador de applets o navegador Web), y que se ejecutan cuando el usuario intenta visualizarlas (cargando la pgina Web). Las applets deben incluir un mtodo de nombre start(), que ser ejecutado cuando el navegador intente mostrar por pantalla la applet. Estas aplicaciones, son seguras (cumplen la especificacin Java), y al ser distribuibles por Internet no permiten incluir mtodos nativos Java.
d.) JavaBeans

Los JavaBeans son componentes grficos de Java, que se pueden incorporar a otros componentes grficos. Se incluyen en la API de Java (paquete java.beans). Existe una herramienta de Sun, denominada BDK (Beans Developer Kit), que es un conjunto de herramientas para desarrollar JavaBeans. El BDK, es el JDK para el desarrollo de JavaBeans. Existen ya multitud de bibliotecas con JavaBeans, para que puedan ser utilizados.
e.) JavaScript

JavaScript es un subconjunto del lenguaje Java que puede codificarse directamente sobre cualquier documento HTML; el cdigo fuente de JavaScript forma parte del propio documento HTML. JavaScript tiene menos potencia que Java, a cambio de ms control sobre el navegador Web que lo ejecute. Se utiliza sobre todo para dar animacin e interactividad a pginas Web. JavaScript posee una habilidad limitada para interactuar con applets Java, pero Java no puede interactuar de ningn modo con JavaScript.
f.) Servlets

Son mdulos que permiten sustituir o utilizar el lenguaje Java en lugar de programas CGI (Common Gateway Interface) a la hora de dotar de interactividad a las pginas Web. Estas aplicaciones se ejecutan como aplicaciones servidoras en Internet, y normalmente incluyen bucles infinitos a la espera de peticiones a las que atender. Los Servlets no tienen entorno grfico, ya que se ejecutan en el servidor. Reciben datos y su respuesta ms habitual suele ser cdigo HTML (pginas Web). C. Recomendaciones de programacin
a.) Introduccin

Es un hecho innegable que cada programador tiene su forma personal de programar, sus preferencias de indentacin... En cualquier caso, desde este tutorial se proponen una serie de pautas que ayudarn a que sus programas sean ms legibles, mantenibles y eficientes:
b.) Propuestas de estilo de los fuentes

Utilice nombres significativos para los identificadores, y procure respetar la siguiente notacin de maysculas y minsculas:

Las clases: Clase o MiClase. Las interfaces: Interfaz o MiInterfaz. Los mtodos: metodo() o metodoLargo(). Los mtodos de acceso: getAtributo(), setAtributo().

Las variables: altura o alturaMedia. Las constantes: CONSTATE o CONSTANTE_LARGA. Los paquetes: java.paquete.subpaquete. Cuide los nombres de sus clases y paquetes para que no coincidan con otros ya existentes, mediante la utilizacin de prefijos identificativos de usted o de su empresa.

Adems se enuncian las siguientes recomendaciones:


No utilice lneas de ms de 80 caracteres, en su lugar divida la lnea en varias. Escriba una nica operacin en cada lnea. Inserte lneas en blanco en sus fuentes cuando mejoren la legibilidad. No deje de incluir comentarios en sus clases, describiendo su funcionalidad. Si utiliza la notacin estandarizada /** */, adems podr recolectarles automticamente con javadoc.

c.) Propuestas de diseo de los programas

Para cada clase:


Cree un constructor por defecto. Los atributos de las clases no deben de ser public. Declare mtodos de acceso a los atributos. Cree mtodos de acceso a los atributos; getAtributo() y setAtributo(nuevoValor). Si no estn implementados declrelos como private. Cree un mtodo main() que valga para probar la clase. Sobre finalize(): Cree una bandera de finalizacin en cada clase, y en los finalize(), si la bandera no ha sido establecida, lance una clase derivada de RuntimeException. No olvide llamar asuper.finalize().

Adems se enuncian las siguientes recomendaciones:


Cree paquetes para agrupar clases relacionadas. Utilizar la herencia para simplificar las clases con caractersticas comunes. Utilice interfaces antes que clases abstractas. Utilice composicin cuando sea apropiado, no abuse de la herencia.

Para ms informacin vase [Johnson, 1996] y [Eckel, 1997].

D. Grandes programas Aunque con todo lo que se ha visto podramos aventurarnos a desarrollar programas Java un tanto complejos (con varias clases, paquetes, threads...), lo cierto es que el desarrollo de programas complejos es materia de la Ingeniera del Software. Desde este tutorial se apuesta por la Ingeniera del Software para el desarrollo de software de calidad, en un tiempo mnimo y con unos costes mnimos. La Ingeniera del Software hace posible que un programa sea mantenible y eficiente, y resuelva un problema de una forma adecuada. Desde aqu se recomienda el uso de una metodologa orientada a objeto para el desarrollo del software. Por ejemplo OMT de [Rambaugh et al., 1998], se ajusta bastante bien al desarrollo de Java, adems de ser la metodologa ms extendida actualmente. Todos los diagramas que se realicen siguiendo una metodologa software deben de realizarse utilizando una notacin unificada. El lenguaje de modelado UML [Rational, 1997], se presenta como estndar de modelado. III.1. BIBLIOTECAS DE LA API DE JAVA A. Introduccin Con cada una de las versiones que Sun lanza del JDK, se acompaa de una serie de bibliotecas con clases estndar que valen como referencia para todos los programadores en Java. Estas clases se pueden incluir en los programas Java, sin temor a fallos de portabilidad. Adems, estn bien documentadas (mediante pginas Web), y organizadas en paquetes y en un gran rbol de herencia. A este conjunto de paquetes (o bibliotecas) se le conoce como la API de Java (Application Programming Interface). En este apartado explicaremos los paquetes bsicos de la API de Java, aunque algunos de ellos tienen subpaquetes. B. Paquetes de utilidades

java.lang: Fundamental para el lenguaje. Incluye clases

como String o StringBuffer, que se tratan ms en detenimiento en el captulo "III.2 Cadenas" de este tutorial. java.io: Para la entrada y salida a travs de flujos de datos, y ficheros del sistema. Se estudia en el captulo "III.3 Entrada/Salida" de este tutorial. java.util: Contiene colecciones de datos y clases, el modelo de eventos, facilidades horarias, generacin aleatoria de nmeros, y otras clases de utilidad. java.math: Clases para realizar aritmtica con la precisin que se desee. java.text: Clases e interfaces para manejo de texto, fechas, nmeros y mensajes de una manera independiente a los lenguajes naturales. java.security: Clases e interfaces para seguridad en Java: Encriptacin RSA...

C. Paquetes para el desarrollo grfico

java.applet: Para crear applets y clases que las applets utilizan para comunicarse con su contexto. Se estudia en el captulo "VI. Applets" de este tutorial. java.awt: Para crear interfaces con el usuario, y para dibujar imgenes y grficos. Se estudia en el captulo "IV. Bibliotecas grficas" de este tutorial. javax.swing: Conjunto de componentes grficos que funcionan igual en todas las plataformas que Java soporta. Se estudia en el captulo "IV. Bibliotecas grficas" de este tutorial. javax.accesibility: Da soporte a clases de accesibilidad para personas discapacitadas. java.beans: Para el desarrollo de JavaBeans.

D. Paquetes para el desarrollo en red


java.net: Clases para aplicaciones de red. Se estudia en el captulo "V. Java e Internet" de este tutorial. java.sql: Paquete que contiene el JDBC, para conexin de programas Java con Bases de datos. java.rmi: Paquete RMI, para localizar objetos remotos, comunicarse con ellos e incluso enviar objetos como parmetros de un objeto a otro. org.omg.CORBA: Facilita la posibilidad de utilizar OMG CORBA, para la conexin entre objetos distribuidos, aunque est codificados en distintos lenguajes. org.omb.CosNaming : Da servicio al IDL de Java, similar al RMI pero en

CORBA E. Para ms informacin Para ms informacin consulte con la documentacin del JDK que vaya a utilizar o la direccin www.sun.com. Esta informacin ha sido extrada de la documentacin de la API de Java correspondiente al JDK 1.2 [Sun, 1998]. III.2. CADENAS A. Introduccin
a.) Introduccin a las clases String y StringBuffer

En Java las cadenas se tratan de forma diferente a C/C++, donde las cadenas son matrices de caracteres en las que se indica el final de la cadena con un carcter de valor \0. En Java las cadenas son objetos de las clases predefinida String o StringBuffer, que estn incluidas en el paquete java.lang.*. Siempre que aparecen conjuntos de caracteres entre comillas dobles, el compilador de Java crea automticamente un objeto String. Si slo existieran cadenas de slo lectura (String), durante una serie de manipulaciones sobre un objeto String habra que crear un nuevo objeto para cada uno de los resultados intermedios. El compilador es ms eficiente y usa un objeto StringBuffer para construir cadenas a partir de las expresiones, creando el String final slo cuando es necesario. Los objetos StringBuffer se pueden modificar, de forma que no son necesarios nuevos objetos para albergar los resultados intermedios. Los caracteres de las cadenas tienen un ndice que indica su posicin. El primer carcter de una cadena tiene el ndice 0, el segundo el 1, el tercero el 2 y as sucesivamente. Esto puede sonar familiar a los programadores de C/C++, pero resultar chocante para aquellos programadores que provengan de otros lenguajes.
b.) Operaciones bsicas, comunes a String y StringBuffer

Existen una serie de mtodos que son comunes a ambas clases. Los siguientes mtodos de acceso a las cadenas:

int length(); Devuelve el nmero de caracteres de la cadena. char charAt( int i ); Devuelve el carcter correspondiente de ndice i.

Los siguientes mtodos para crear cadenas derivadas:


String toString(); Devuelve una copia del objeto como una String. String substring( int i, int fin ); Devuelve una instancia de la clase String que contenga una subcadena desde la posicin ini, hasta la fin (si no se indica hasta el final de la cadena), del objeto cadena que invoque el mtodo.

Y el mtodo para transformar la cadena en un vector de caracteres:

void getChars(int ini, int fin, char[] destino, int destIni); Convierte la cadena en un vector de caracteres destino.

B. Mtodos de la clase String


a.) Constructores

La clase String proporciona cadenas de slo lectura y soporta operaciones con ellas. Se pueden crear cadenas implcitamente mediante una cadena entrecomillada o usando + += con dos objetos String. Tambin se pueden crear objetos String explcitamente con el mecanismo new. La clase String soporta multitud de constructores.

String(); Constructor por defecto. El nuevo String toma el valor "". String( String s ); Crea un nuevo String, copiando el que recibe por parmetro. String( StringBuffer s ); Crea un String con el valor que en ese momento tenga el StringBuffer que recibe como parmetro. String( char[] v ); El nuevo String toma el valor de los caracteres que tiene el vector de caracteres recibido por parmetro. String( byte[] v ); El nuevo String toma el valor de los caracteres que corresponden a los valores del vector de bytes en el sistema de caracteres

de la ordenador en que se ejecute.


b.) Bsqueda en cadenas String

Adems presenta los siguientes mtodos para buscar caracteres o subcadenas en la cadena, y devuelven el ndice que han encontrado o el valor 1 si la bsqueda no ha sido satisfactoria:

int indexOf( char ch, int start ): Devuelve el ndice correspondiente a la primera aparicin del carcter ch en la cadena, comenzando a buscar desde el carcter start (si no se especifica se busca desde el principio). int indexOf( String str ): Devuelve el ndice correspondiente al carcter en que empieza la primera aparicin de la subcadena str. int lastIndexOf( char ch, int start ): Devuelve el ndice correspondiente a la ltima aparicin del carcter ch en la cadena, comenzando a buscar desde el carcter start (si no se especifica se busca desde el final). int lastIndexOf( String str ): Devuelve el ndice correspondiente al carcter en que empieza la ltima aparicin de la subcadena str.

c.) Comparaciones de cadenas String

Java no trabaja con el cdigo ASCII habitual, sino con el cdigo avanzado Unicode. El cdigo Unicode (cdigo universal) se caracteriza, sobre todo, por el uso de dos bytes por carcter. Esto permite aumentar los caracteres hasta 65000, y as se pueden representar los caracteres que componen las lenguas, vivas o muertas, ms importantes del mundo. Hay que tener en cuenta que si nos salimos del rango 0-255 que coincide con el cdigo ASCII puede que las comparaciones no sean las esperadas. Las funciones de comparacin son las siguientes:

boolean equals( Object o ); Devuelve true si se le pasa una referencia a un objeto String con los mismos caracteres, o false si no. boolean equalsIgnoreCase( String s ); Compara cadenas ignorando las diferencias de ortografa maysculas/minsculas. boolean regionMatches( boolean b, int o, String s , int i, int n ); Compara parte de dos cadenas, carcter a carcter. boolean startsWith( String s, int i ); Comprueba si la cadena tiene el prefijo s desde i.

boolean endsWith( String s ); Comprueba si la cadena termina con el sufijo s. int compareTo( Object o ); Devuelve un entero que es menor, igual o mayor que cero cuando la cadena sobre la que se le invoca es menor, igual o mayor que la otra. Si el parmetro es un String, la comparacin es lxica. int compareToIgnoraCase( String s ); Compara lexicogrficamente, ignorando las diferencias de ortografa maysculas/minsculas.

d.) Cadenas String derivadas

En Java se devuelven nuevas cadenas cada vez que se invoca a un mtodo que crea una cadena diferente porque las cadenas String son de slo lectura:

String replace( char oldChar, char newChar ); Devuelve una nueva cadena con todos los caracteres oldChar sustituidos por el carcter newChar. String toLowerCase(); Devuelve una nueva cadena con los caracteres en minsculas, o si se especifica parmetro, siguiendo sus reglas. String toUperCase( Locale l ); Devuelve una nueva cadena con los caracteres en maysculas, o si se especifica parmetro, siguiendo sus reglas. static String trim(): Devuelve una nueva cadena del que se ha eliminado los espacios en blanco por el principio y por el final. static String copyValueOf( char[] v, int ini, int fin ); Devuelve una cadena igual que la contenida en el vector v, entre los lmites ini y fin (si no se especifican copia todo el vector). static String concat( String s ); Concatena la cadena que recibe al final de sta.

e.) Conversiones entre cadenas String y tipos simples Java

Para convertir una variable de un tipo de datos simple (char, boolean, int, long, float, double) en una cadena (String), bastar con invocar al mtodo valueOf() del objeto String correspondiente:

static String valueOf( tipo ); El parmetro tipo soporta un carcter (char) un vector de caracteres (char[]) o un objeto (Object).

Sin embargo para convertir el valor de una cadena en un tipo de datos simple deberemos utilizar los siguientes mtodos:

Tipo boolean int long float double

De String new Boolean(String).booleanValue() Integer.ParseInt(String, int base) Long.ParseLong(String, int base) new Float(String).floatValue() new Double(String).doubleValue()

Tabla 20: Conversiones de cadenas a tipos simples No hay ningn mtodo que convierta los caracteres escapados Java ( \b, \udddd ) en variables carcter (char), o a la inversa. Lo que se puede hacer es invocar valueOf() con un carcter (char) para obtener una cadena de la clase String que contenga ese carcter. As mismo no hay formas de crear o decodificar cadenas de nmeros en formatos octal (0) o hexadecimal(0x).
f.) Conversiones entre cadenas String y vectores

Tambin existen diversos constructores y mtodos de la clase String para tratar con vectores, tanto de caracteres como de bytes. En cuanto a los vectores de caracteres existen:

El constructor ya citado de String( char[] v ). Hace copia de los datos, por lo que las modificaciones posteriores del vector no afectarn a la cadena. char[] toCharArray(); Convierte la cadena en un vector de caracteres.

En cuanto a los mtodos para convertir vectores de byte (de 8 bits) en objetos String con caracteres Unicode de 16 bits existen:

El constructor ya citado de String( byte[] v ). Hace copias de los datos, por lo que las modificaciones posteriores del vector no afectarn a la cadena. byte[] getBytes( String s ); Convierte la cadena en un vector de byte, atendiendo a la tabla de caracteres especificada en s, o a la de la mquina si se omite.

C. Mtodos de la clase StringBuffer

a.) Constructores

Los constructores contenidos por la clase StringBuffer son:

StringBuffer( int lim ); Construye una cadena sin caracteres y con una capacidad inicial de lim caracteres (por defecto 16, si no se especifica otro valor). StringBuffer( String s ); Construye una cadena con el valor s.

b.) Modificacin de la cadena

Existen tres tipos de modificaciones que se pueden aplicar a la cadena. Hay mtodos de insercin:

StringBuffer insert( int i, Object o ); Desplaza los caracteres de la cadena e inserta la cadena correspondiente al segundo parmetro (de cualquier tipo). StringBuffer append( Object o ); Inserta al final de la cadena, la cadena correspondiente al segundo parmetro (de cualquier tipo).

Hay mtodos de substitucin:

void setCharAt( int i, char to ); Cambia el carcter de la posicin i por to. Si la posicin supera la longitud de la cadena, se extiende rellenndose con caracteres nulos. StringBuffer replace( int ini, int fin, String s ); Reemplaza una subcadena de esta cadena (de ini a fin) por la cadena recibida por parmetro. No se debe confundir con el mtodo replace() que incluye la clase String. StringBuffer reverse(); Invierte la cadena (de izquierda a derecha).

Y mtodos de borrado:

StringBuffer delete( int ini, int fin ); Borra la subcadena entre el carcter ini y el fin. StringBuffer deleteCharAt( int i ); Borra el carcter en la posicin i.

c.) Capacidad de la cadena

El buffer de un objeto StringBuffer tiene una capacidad que es la longitud de la cadena que puede almacenar sin tener que asignar ms espacio. El buffer crece automticamente a medida que se aaden caracteres, pero resulta ms eficiente

especificar el tamao del buffer de una sola vez:


int capacity(); Devuelve la capacidad actual del buffer. void ensureCapacity( int i );. Garantiza que la capacidad del buffer es al menos i. void setLength( int i ); Establece la longitud de esta cadena a i.

d.) Extraccin de datos

Para obtener un objeto String a partir de un objeto StringBuffer, debe invocarse el mtodo toString(), comn a ambas clases. Se debe tener en cuenta que no hay mtodos StringBuffer para eliminar una parte de un buffer. Para resolver este problema, debe crearse un vector de caracteres a partir del buffer, y construir un nuevo buffer con el contenido restante. Para esto se usa el mtodo getChars(), comn con la clase String. D. Ejemplos de uso de cadenas
a.) Ejemplo de Cadena Fija (de la clase String)

En el siguiente ejemplo se muestra la utilizacin de los principales mtodos de la clase String:


public static void main( String s[] ){

String cad = new String("Cadena Fija");

System.out.println("Ejemplo de String: '"+cad+"'");

//Mtodos comunes a StringBuffer

System.out.println("Su longitud es: "+cad.length());

System.out.println("Su tercer caracter es: "+cad.charAt(3));

System.out.print("Su subcadena del 3 al 6 es:");

System.out.println( cad.substring(2,6) );

char[] vectorcad = cad.toCharArray();

System.out.println("Creado un vector, de elemento 3: ");

System.out.print( vectorcad[2] );

// Bsqueda en cadenas

String subcad=new String("ena");

System.out.print("La subcadena '"+subcad+"'");

System.out.print(" aparece en la posicion: ");

System.out.println( cad.indexOf(subcad) );

// Comparaciones

String cadcomp=new String("CADENA Fija");

System.out.print("La cadena '"+cadcomp+"'");

if ( cad.compareTo(cadcomp) == 0 )

System.out.println(" ES igual 'Sensitive'");

else

System.out.println(" NO es igual 'Sensitive'");

System.out.print("La cadena '"+cadcomp+"'");

if ( cad.equalsIgnoreCase(cadcomp) )

System.out.println(" ES igual 'Insensitive'");

else

System.out.println(" NO = 'Insensitive'");

// Derivacin

System.out.print("Cadena derivada en minusculas: ");

System.out.println( cad.toLowerCase() );

Lo que muestra por pantalla: Ejemplo de String: 'Cadena Fija' Su longitud es: 11 Su tercer caracter es: e Su subcadena del 3 al 6 es: dena Creado un vector, de elemento 3: d La subcadena 'ena' aparece en la posicion: 3 La cadena 'CADENA Fija' NO es igual 'Sensitive' La cadena 'CADENA Fija' ES igual 'Insensitive' Cadena derivada en minusculas: cadena fija
b.) Ejemplo de Cadena Variable (de la clase StringBuffer)

En el siguiente ejemplo se muestra la utilizacin de los principales mtodos de la

clase StringBuffer:
public static void main( String s[] ){

StringBuffer cad = new StringBuffer("Cadena Variable");

System.out.println("Ejemplo de StringBuffer: '"+cad+"'");

// Modificacin de la cadena

cad.delete( 0, 6 );

System.out.println("Borrados 6 primeros caracteres: "+cad);

cad.replace( cad.length()-3, cad.length(), "da" );

System.out.println("Sutituidos ultimos caracteres: "+cad);

cad.append(" Cadena");

System.out.println("Apendizada con 'Cadena': "+cad);

// Gestin de su capacidad

System.out.println("Tiene capacidad de: "+cad.capacity());

cad.ensureCapacity( 32 );

System.out.println("Capacidad sobre 32:"+cad.capacity());

System.out.println("");

Lo que muestra por pantalla: Ejemplo de StringBuffer: 'Cadena Variable' Borrados 6 primeros caracteres: Variable Sutituidos ultimos caracteres: Variada Apendizada con 'Cadena': Variada Cadena Tiene capacidad de: 31 Capacidad sobre 32: 64 III.3. ENTRADA/SALIDA A. Introduccin Normalmente, cuando se codifica un programa, se hace con la intencin de que ese programa pueda interactuar con los usuarios del mismo, es decir, que el usuario pueda pedirle que realice cosas y pueda suministrarle datos con los que se quiere que haga algo. Una vez introducidos los datos y las rdenes, se espera que el programa manipule de alguna forma esos datos para proporcionarnos una

respuesta a lo solicitado. Adems, en muchas ocasiones interesa que el programa guarde los datos que se le han introducido, de forma que si el programa termina los datos no se pierdan y puedan ser recuperados en una sesin posterior. La forma ms normal de hacer esto es mediante la utilizacin de ficheros que se guardarn en un dispositivo de memoria no voltil (normalmente un disco). A todas estas operaciones, que constituyen un flujo de informacin del programa con el exterior, se les conoce como Entrada/Salida (E/S). Existen dos tipos de E/S; la E/S estndar que se realiza con el terminal del usuario y la E/S a travs de fichero, en la que se trabaja con ficheros de disco. Todas las operaciones de E/S en Java vienen proporcionadas por el paquete estndar de la API de Java denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de ficheros. En este tutorial slo se van a dar algunas pinceladas de la potencia de este paquete. B. Entrada/Salida estndar Aqu slo trataremos la entrada/salida que se comunica con el usuario a travs de la pantalla o de la ventana del terminal. Si creamos una applet no se utilizarn normalmente estas funciones, ya que su resultado se mostrar en la ventana del terminal y no en la ventana de la applet. La ventana de la applet es una ventana grfica y para poder realizar una entrada o salida a travs de ella ser necesario utilizar el AWT. El acceso a la entrada y salida estndar es controlado por tres objetos que se crean automticamente al iniciar la aplicacin: System.in, System.out y System.err
a.) System.in

Este objeto implementa la entrada estndar (normalmente el teclado). Los mtodos que nos proporciona para controlar la entrada son:

read(): Devuelve el carcter que se ha introducido por el teclado leyndolo del buffer de entrada y lo elimina del buffer para que en la siguiente lectura sea ledo el siguiente carcter. Si no se ha introducido ningn carcter por el teclado devuelve el valor -1.

skip(n): Ignora los n caracteres siguientes de la entrada.

b.) System.out

Este objeto implementa la salida estndar. Los mtodos que nos proporciona para controlar la salida son:

print(a): Imprime a en la salida, donde a puede ser cualquier tipo bsico Java ya que Java hace su conversin automtica a cadena. println(a): Es idntico a print(a) salvo que con println() se imprime un salto de lnea al final de la impresin de a.

c.) System.err

Este objeto implementa la salida en caso de error. Normalmente esta salida es la pantalla o la ventana del terminal como con System.out, pero puede ser interesante redirigirlo, por ejemplo hacia un fichero, para diferenciar claramente ambos tipos de salidas. Las funciones que ofrece este objeto son idnticas a las proporcionadas por System.out.
d.) Ejemplo

A continuacin vemos un ejemplo del uso de estas funciones que acepta texto hasta que se pulsa el retorno de carro e informa del nmero de caracteres introducidos.
import java.io.*;

class CuentaCaracteres {

public static void main(String args[]) throws IOException {

int contador=0;

while(System.in.read()!='\n')

contador++;

System.out.println(); // Retorno de carro "gratuito"

System.out.println("Tecleados "+contador+" caracteres.");

C. Entrada/Salida por fichero


a.) Tipos de ficheros

En Java es posible utilizar dos tipos de ficheros (de texto o binarios) y dos tipos de acceso a los ficheros (secuencial o aleatorio). Los ficheros de texto estn compuestos de caracteres legibles, mientras que los binarios pueden almacenar cualquier tipo de datos (int, float, boolean,...). Una lectura secuencial implica tener que acceder a un elemento antes de acceder al siguiente, es decir, de una manera lineal (sin saltos). Sin embargo los ficheros de acceso aleatorio permiten acceder a sus datos de una forma aleatoria, esto es indicando una determinada posicin desde la que leer/escribir.
b.) Clases a estudiar

En el paquete java.io existen varias clases de las cuales podemos crear instancias

de clases para tratar todo tipo de ficheros. En este tutorial slo vamos a trata las tres principales:

FileOutputStream: Fichero de salida de texto. Representa ficheros de texto para escritura a los que se accede de forma secuencial. FileInputStream: Fichero de entrada de texto. Representa ficheros de texto de slo lectura a los que se accede de forma secuencial. RandomAccessFile: Fichero de entrada o salida binario con acceso aleatorio. Es la base para crear los objetos de tipo fichero de acceso aleatorio. Estos ficheros permiten multitud de operaciones; saltar hacia delante y hacia atrs para leer la informacin que necesitemos en cada momento, e incluso leer o escribir partes del fichero sin necesidad de cerrarlo y volverlo a abrir en un modo distinto.

c.) Generalidades

Para tratar con un fichero siempre hay que actuar de la misma manera: 1. Se abre el fichero. Para ello hay que crear un objeto de la clase correspondiente al tipo de fichero que vamos a manejar, y el tipo de acceso que vamos a utilizar: TipoDeFichero obj = new TipoDeFichero( ruta ); Donde ruta es la ruta de disco en que se encuentra el fichero o un descriptor de fichero vlido. Este formato es vlido, excepto para los objetos de la clase RandomAccessFile (acceso aleatorio), para los que se ha de instanciar de la siguiente forma: RandomAccessFile obj = new RandomAccessFile( ruta, modo ); Donde modo es una cadena de texto que indica el modo en que se desea abrir el fichero; "r" para slo lectura o "rw" para lectura y escritura. 2. Se utiliza el fichero. Para ello cada clase presenta diferentes mtodos de acceso para escribir o leer en

el fichero. 3. Gestin de excepciones (opcional, pero recomendada) Se puede observar que todos los mtodos que utilicen clases de este paquete deben tener en su definicin una clusula throws IOException. Los mtodos de estas clases pueden lanzar excepciones de esta clase (o sus hijas) en el transcurso de su ejecucin, y dichas excepciones deben de ser capturadas y debidamente gestionadas para evitar problemas. 4. Se cierra el fichero y se destruye el objeto. Para cerrar un fichero lo que hay que hacer es destruir el objeto. Esto se puede realizar de dos formas, dejando que sea el recolector de basura de Java el que lo destruya cuando no lo necesite (no se recomienda) o destruyendo el objeto explcitamente mediante el uso del procedimiento close() del objeto: obj.close()
d.) La clase FileOutputStream

Mediante los objetos de esta clase escribimos en ficheros de texto de forma secuencial. Presenta el mtodo write() para la escritura en el fichero. Presenta varios formatos:

int write( int c ): Escribe el carcter en el fichero. int write( byte a[] ): Escribe el contenido del vector en el fichero. int write( byte a[], int off, int len ): Escribe len caracteres del vector a en el fichero, comenzando desde la posicin off.

El siguiente ejemplo crea el fichero de texto "/carta.txt" a partir de un texto que se le introduce por teclado:
import java.io.*;

class CreaCarta {

public static void main(String args[]) throws IOException{

int c;

FileOutputStream f=new FileOutputStream("/carta.txt");

while( ( c=System.in.read() ) != -1 )

f.write( (char)c );

f.close();

e.) La clase FileInputStream

Mediante los objetos de esta clase leemos de ficheros de texto de forma secuencial. Presenta el mtodo read() para la lectura del fichero. Este mtodo se puede invocar de varias formas.

int read(): Devuelve el siguiente carcter del fichero. int read( byte a[] ): Llena el vector a con los caracteres ledos del fichero. Devuelve la longitud del vector que se ha llenado si se realiz con xito o 1 si no haba suficientes caracteres en el fichero para llenar el vector.

int read( byte a[], int off, int len ): Lee len caracteres del fichero, insertndolos en el vector a.

Todos ellos devuelven -1 si se ha llegado al final del fichero (momento de cerrarle). El siguiente ejemplo muestra el fichero de texto "/carta.txt" en pantalla:
import java.io.*;

class MuestraCarta {

public static void main(String args[]) throws IOException {

int c;

FileInputStream f=new FileInputStream("/carta.txt");

while( ( c=f.read() ) != -1 )

System.out.print( (char)c );

f.close();

f.) La clase RandomAccessFile

Mediante los objetos de esta clase utilizamos ficheros binarios mediante un acceso aleatorio, tanto para lectura como para escritura. En estos ficheros hay un ndice que nos dice en qu posicin del fichero nos encontramos, y con el que se puede trabajar para posicionarse en el fichero. Mtodos de desplazamiento Cuenta con una serie de funciones para realizar el desplazamiento del puntero del fichero. Hay que tener en cuenta que cualquier lectura o escritura de datos se realizar a partir de la posicin actual del puntero del fichero.

long getFilePointer();Devuelve la posicin actual del puntero del fichero. void seek( long l ); Coloca el puntero del fichero en la posicin indicada por l. Un fichero siempre empieza en la posicin 0. int skipBytes( int n ); Intenta saltar n bytes desde la posicin actual. long length(); Devuelve la longitud del fichero. void setLength( long l); Establece a l el tamao de este fichero. FileDescriptor getFD(); Devuelve el descriptor de este fichero.

Mtodos de escritura La escritura del fichero se realiza con una funcin que depende el tipo de datos que se desee escribir.

void write( byte b[], int ini, int len ); Escribe len caracteres del vector b. void write( int i ); Escribe la parte baja de i (un byte) en el flujo. void writeBoolean( boolean b ); Escribe el boolean b como un byte. void writeByte( int i ); Escribe i como un byte. void writeBytes( String s ); Escribe la cadena s tratada como bytes, no caracteres. void writeChar( int i ); Escribe i como 1 byte. void writeChars( String s ); Escribe la cadena s. void writeDouble( double d ); Convierte d a long y le escribe como 8 bytes. void writeFloat( float f ); Convierte f a entero y le escribe como 4 bytes.

void writeInt( int i ); Escribe i como 4 bytes. void writeLong( long v ); Escribe v como 8 bytes. void writeShort( int i ); Escribe i como 2 bytes. void writeUTF( String s ); Escribe la cadena s utilizando la codificacin UTF-8.

Los mtodos que escriben nmeros de ms de un byte escriben el primero su parte alta. Mtodos de lectura La lectura del fichero se realiza con una funcin que depende del tipo de datos que queremos leer.

boolean readBoolean(); Lee un byte y devuelve false si vale 0 o true sino. byte readByte(); Lee y devuelve un byte. char readChar(); Lee y devuelve un caracter. double readDouble(); Lee 8 bytes, y devuelve un double. float readFloat(); Lee 4 bytes, y devuelve un float. void readFully( byte b[] ); Lee bytes del fichero y los almacena en un vector b. void readFully( byte b[], int ini, int len ); Lee len bytes del fichero y los almacena en un vector b. int readInt(); Lee 4 bytes, y devuelve un int. long readLong(); Lee 8 bytes, y devuelve un long. short readShort(); Lee 2 bytes, y devuelve un short. int readUnsignedByte(); Lee 1 byte, y devuelve un valor de 0 a 255. int readUnsignedShort(); Lee 2 bytes, y devuelve un valor de 0 a 65535. String readUTF(); Lee una cadena codificada con el formato UTF-8. int skipBytes(int n); Salta n bytes del fichero.

Si no es posible la lectura devuelven 1. Ejemplo Vamos a crear un pequeo programa que cree y acceda a un fichero binario, mediante acceso aleatorio. El siguiente ejemplo crear un fichero binario que contiene los 100 primeros nmeros (en orden):

// Crea un fichero binario con los 100 primeros numeros

static void creaFichBin( String ruta ) throws IOException {

RandomAccessFile f=new RandomAccessFile(ruta,"rw"); // E/S

for ( int i=1; i <= 100 ; i++ )

try{

f.writeByte( i );

} catch( IOException e){

// Gestion de excepcion de ejemplo

break; // No se puede seguir escribiendo

f.close();

El siguiente mtodo accede al elemento cual de un fichero binario, imprimiendo la longitud del fichero, el elemento cual y su 10 veces siguiente elemento:
static void imprimeEltoN(String ruta, long cual)

throws IOException{

RandomAccessFile f=new RandomAccessFile(ruta,"r"); // E/

System.out.print( "El fichero " + ruta );

System.out.println( " ocupa " + f.length() + " bytes." );

f.seek( cual-1 ); // Me posiciono (-1 porque empieza en 0)

System.out.print(" En la posicion " + f.getFilePointer() );

System.out.println(" esta el numero " + f.readByte() );

f.skipBytes( 9 ); // Salto 9 => Elemento 10 mas alla

System.out.print(" 10 elementos ms all, esta el ");

System.out.println( f.readByte() );

f.close();

Si incluimos ambos mtodos en una clase, y les llamamos con el siguiente programa principal (main()):
public static void main(String args[]) throws IOException {

String ruta="numeros.dat"; // Fichero

creaFichBin( ruta ); // Se crea

imprimeEltoN( ruta, 14 ); // Accedo al elemento 14.

Obtendremos la siguiente salida: El fichero numeros.dat ocupa 100 bytes. En la posicion 13 esta el numero 14 10 elementos ms all, esta el 24 IV.1. LOS PAQUETES GRFICOS DE LAS JFC A. Introduccin Las JFC (Java Foundation Classes) son parte de la API de Java compuesto por clases que sirven para crear interfaces grficas visuales para las aplicaciones y applets de Java. As como Sun presenta estas JFC, Microsoft ha desarrollado otro paquete propio con el nombre de AFD (Application Foundation Classes). Las JFC contienen dos paquetes grficos: AWT y Swing.

AWT presenta componentes pesados, que en cada plataforma slo pueden tener una representacin determinada. Est disponible desde la versin 1.1 del JDK como java.awt. Swing presenta componentes ligeros, que pueden tomar diferente aspecto y comportamiento pues lo toman de una biblioteca de clases. Est disponible desde la versin 1.2 del JDK comojavax.swing aunque antes se podan encontrar versiones previas como com.sun.java. o como java.awt.swing.

AWT se estudia con ms detenimiento en el apartado "IV.2.AWT" de este tutorial, mientras que Swing se estudia en el apartado "IV.3.Swing" de este tutorial. B. Modelo de eventos Tanto AWT como Swing tienen en comn un sistema para gestionar los eventos que se producen al interactuar con el usuario de la interfaz grfica; su modelo de eventos.

El funcionamiento del modelo de eventos se basa en la gestin de excepciones. Para cada objeto que represente una interfaz grfica, se pueden definir objetos "oyentes" (Listener), que esperen a que suceda un determinado evento sobre la interfaz. Por ejemplo se puede crear un objeto oyente que est a la espera de que el usuario pulse sobre un botn de la interfaz, y si esto sucede, l es avisado, ejecutando determinada accin. La clase base para todos estos eventos que se pueden lanzar es la clase AWTEvent (perteneciente al paquete java.awt). El modelo de eventos de AWT depende del paquete java.awt.event, que en Swing se ampla con el paquete javax.swing.event. Existen dos tipos bsicos de eventos:

Fsicos: Corresponden a un evento hardware claramente identificable. Ej: se ha pulsado una tecla (KeyStrokeEvent). Semnticos: Se componen de un conjunto de eventos fsicos, que sucedidos en un determinado orden tienen un significado ms abstracto: El usuario ha elegido un elemento de una lista desplegable (ItemEvent).

C. Subpaquetes de AWT A continuacin se enumeran los paquetes que componen las JFC, as como su funcionalidad, ordenados por orden de antigedad. Esto es importante, porque debe de tenerse en cuenta si se va a utilizar para crear applets, ya que normalmente los navegadores no soportan la ltima versin de la API de Java en su propia mquina virtual. Si queremos que nuestra applet se vea igual en varios navegadores, deberemos de tener en cuenta qu paquetes podemos utilizar y cules no, comprobando la versin de Java que soportan los navegadores que nos interesen.
a.) Desde la versin 1.0

java.awt: Contiene todas las clases bsicas de AWT para crear interfaces e imprimir grficos e imgenes, as como la clase base para los eventos en componentes: AWTEvent. java.awt.image: Para crear y modificar imgenes. Utiliza productores de imgenes, filtros y "consumidores de imgenes". Permite renderizar una

imagen mientras est siendo generada.


b.) Desde la versin 1.1

java.awt.datatransfer: Transferencia de datos entre aplicaciones. Permite definir clases "transferibles" entre aplicaciones, y da soporte al mecanismo del portapapeles (copiar y pegar). java.awt.event: Modelo de eventos de AWT. Contiene eventos, oyentes y adaptadores a oyentes.

c.) Desde la versin 1.2

java.awt.color: Utilizacin de colores. Contiene la implementacin de una paleta de colores basada en la especificada por el ICC (Consorcio Internacional de Color). java.awt.dnd: Operaciones de arrastrar y soltar. java.awt.font: Todo lo referente a las fuentes de texto. Soporta fuentes del tipo True Type, Type 1, Type 1 Multiple Master, y OpenType. java.awt.geom: Aporta clases de Java 2D, para crear objetos en 2 dimensiones, utilizando geometra plana (elipses, curvas, reas...). java.awt.im: Para utilizar smbolos Japoneses, Chinos o Coreanos. java.awt.image.renderable: Para producir imgenes que sean independientes de redering (animacin). java.awt.print: Para imprimir documentos. Incorpora capacidad para gestionar diversos tipos de documentos, formatos de pgina e interactuar con el usuario para controlar la impresin de trabajos.

D. Subpaquetes de Swing A continuacin se enumeran los paquetes que componen Swing, as como su funcionalidad:

javax.swing: Tiene los componentes bsicos para crear componentes ligeros Swing. javax.swing.border: Para dibujar bordes personalizados en los componentes Swing. javax.swing.colorchooser: Para utilizar el componente JColorChooser. javax.swing.event: Eventos lanzados por componentes Swing, as como oyentes para dichos eventos. Extiende los que se encuentran en el paquete AWT java.awt.event. javax.swing.filechooser: Para utilizar el componente JFileChooser. javax.swing.plaf: Permite a Swing utilizar mltiples representaciones. Se

utiliza por aquellos desarrolladores que no pueden crear un nuevo aspecto de interfaz, basado en los que Swing ya incorpora (como Basic o Metal). javax.swing.plaf.basic: Objetos que utilizan interfaces de aspecto "Basic". Este aspecto es el que presentan por defecto los componentes Swing. En este paquete se encuentran gestores de impresin, eventos, oyentes y adaptadores. Se puede crear un aspecto personalizado de interfaz utilizando este paquete. javax.swing.plaf.metal: Objetos que utilizan interfaces de aspecto "Metal". javax.swing.plaf.multi: Permite a los usuarios combinar aspectos de interfaz, entre auxiliares y los que existen por defecto. javax.swing.text: Para manejar componentes de texto (modificables o no). Soporta sintaxis resaltada, edicin, estilos... javax.swing.text.html: Contiene la clase HTMLEditorKit, basada en la versin 3.2 de la especificacin HTML, y clases para crear editores de texto HTML javax.swing.text.html.parser: Contiene analizadores de texto HTML. javax.swing.text.rtf: Contiene la clase RTFEditorKit para crear editores de documentos en formato RTF (Rich-Text-Format). javax.swing.tree: Para personalizar la forma en que son utilizados los rboles generados por la clase java.awt.swing.JTree. javax.swing.undo: Permite realizar operaciones de deshacer/rehacer en las aplicaciones que cree el usuario

IV.2. AWT (Abstract Windowing Toolkit) A. Introduccin AWT es un conjunto de herramientas GUI (Interfaz Grfica con el Usuario) diseadas para trabajar con mltiples plataformas. Este paquete viene incluido en la API de Java como java.awt ya desde su primera versin, con lo que las interfaces generadas con esta biblioteca funcionan en todos los entornos Java disponibles (incluyendo navegadores, lo que les hace especialmente eficientes para la creacin de applets Java). En el apartado "VI.3. Ejemplo de creacin de una applet" se muestra un breve ejemplo de cmo utilizar las clases del AWT para crear una applet y una aplicacin de Java. La siguiente figura muestra la jerarqua de clases para las principales clases de

AWT:

Imagen 7: Jerarqua de las clases de AWT En este apartado vamos a estudiar algunas de las clases ms importantes del AWT, as como su funcionalidad. B. Component Esta clase representa a cualquier objeto que puede ser parte de una interfaz grfica de usuario. Es la clase padre de muchas de las clases del AWT. Su propsito principal es representar algo que tiene una posicin y un tamao, que puede ser dibujado en la pantalla y que pueda recibir eventos de entrada (que responda a las interacciones con el usuario). La clase Component presenta diversos mtodos, organizados para cubrir varios propsitos. A continuacin se explican algunos de ellos.
a.) Tamao y posicin del componente

Dimension getSize(); Devuelve la anchura y altura del componente como un objeto de la clase Dimension, que tiene como campos: width (anchura)

y heigth (altura). void setSize(int ancho, int largo); Establece la anchura y altura del componente. Dimension getPreferredSize(); Devuelve el tamao que este componente debera tener. void setPreferredSize(); Establece el tamao que este componente debera tener. Dimension getMinimumSize(); Devuelve el tamao mnimo que este componente debera tener. void setMinimumSize(int ancho, int largo); Establece el tamao mnimo que este componente debera tener. Rectangle getBounds(); Devuelve las coordenadas de este componente como un objeto de la clase Rectangle, que tiene como campos: x, y, width y heigth. void setBounds(int x, int y, int ancho, int largo); Establece las coordenadas de este componente.

b.) Acciones sobre el componente

boolean getEnabled(); Comprueba si el componente est o no activo. void setEnabled(boolean); Establece el componente a activo o inactivo. boolean getVisible(); Comprueba si el componente est o no visible. void setVisible(boolean); Establece si el componente est visible o invisible. void paint(Graphics g); Indica al AWT que ha de dibujar el componente g. void repaint(); Indica al AWT que ha de volver a dibujar el componente. void update(Graphics g); Es llamado por AWT cuando se invoca el mtodo repaint(). Por defecto llama a paint().

c.) Eventos de interaccin con el usuario

A su vez hay tres tipos de mtodos, para la gestin de eventos mediante el nuevo modelo de eventos de AWT (desde la versin 1.1). Hay tres tipos de mtodos:

void add_Tipo_Listener(_Tipo_Listener l); Aade un oyente a la espera de algn tipo de eventos sobre este componente. void remove_Tipo_Listener(_Tipo_Listener l); Elimina algn oyente que estaba a la espera de algn tipo de eventos sobre este componente. void process_Tipo_Event(_Tipo_Event e); Procesa eventos del tipo _Tipo_Event envindolos a cualquier objeto _Tipo_Listener que estuviera

escuchando. En estos mtodos _Tipo_ puede ser cualquiera de los siguientes: Component, Focus, InputMethod, Key, Mouse, MouseMotion. C. Container La clase Container sabe cmo mostrar componentes embebidos (que a su vez pueden ser instancias de la clase Container). Algunos de los mtodos de la clase Container son:

Component add(Component c); Aade un componente al contenedor. void print(Graphics g); Imprime el contenedor. void printComponents(Graphics g); Imprime cada uno de los componentes de este contenedor. LayoutManager getLayout(); Devuelve el gestor de impresin (LayoutManager) asociado a este contenedor, que es el responsable de colocar los componentes dentro del contenedor. void setLayout(LayoutManager 1); Establece un gestor de impresin para este componente.

Estos objetos Container tienen un LayoutManager asociado que define la manera en que van a posicionarse los objetos componentes en su interior. D. Gestores de impresin LayoutManager y LayoutManager2 son dos interfaces encargadas de la representacin y posicionamiento en pantalla de componentes AWT. De estas interfaces se proporcionan cinco implementaciones en AWT. Cada una de ellas reparte los objetos de una forma particular:

BorderLayout: En cinco lugares: Norte, Sur, Este, Oeste y Centro (North, South, East, West y Center). CardLayout: Permite gestionar varios componentes de los que slo uno se visualiza a la vez, permaneciendo los dems invisibles debajo. FlowLayout: De izquierda a derecha horizontalmente en cada lnea. Cuando sobrepasan una lnea se comienza a la izquierda de la siguiente. GridLayout: En una tabla en la que todas las casillas tienen el mismo tamao.

GridBagLayout: En una tabla, pero las casillas no tienen que tener el mismo tamao.

E. Otras clases Por supuesto AWT no se limita a estas clases. Dentro de esta biblioteca podemos encontrar multitud de clases prefabricadas para facilitar el diseo grfico. A continuacin explicamos algunas de ellas.
a.) Clases contenedoras (hijas de Container

Panel: Permite hacer una presentacin ms avanzada que Container mediante la combinacin con subpaneles o subclases para crear contenedores personalizados. La clase Applet que sirve para crear applets Java, hereda de esta clase Panel. ScrollPane: Una barra de desplazamiento, horizontal o vertical. Window: Una ventana sin borde. Frame: Una ventana que no tiene borde. Puede tener asociado un objeto Menubar (una barra de herramientas o barra de men personalizada). Dialog: Una ventana usada para crear dilogos. Tiene la capacidad de ser modal con lo que slo este contenedor recibira entradas del usuario. Filedialog: Un dilogo que usa el selector de archivos nativo del sistema operativo.

b.) Clases componentes (hijas directas de Component)

Button: Un botn grfico para el que se puede definir una accin que suceder cuando se presione el botn. Canvas: Permite pintar o capturar eventos del usuario. Se puede usar para crear grficos o como clase base para crear una jerarqua de componentes personalizados. Checkbox: Soporta dos estados: on y off. Se pueden asociar acciones que se ejecuten (triggers) cuando el estado cambie. Choice: Men desplegable de opciones. Label: Cadena de etiqueta en una localizacin dada. List: Una lista desplegable de cadenas. Scrollbar: Desplegable de objetos Canvas. TextComponent: Cualquier componente que permita editar cadenas de texto.Tiene dos clases hijas: TextField: Componente de texto consistente en una lnea que puede ser

usada para construir formularios. TextArea: Componente para edicin de texto de tamao variable.

F. Eventos de AWT AWT tiene sus propios eventos, que se explican a continuacin.
a.) Eventos fsicos

Son todos hijos del evento ComponentEvent, que indica algn cambio en un objeto Component:

InputEvent: Se ha producido una entrada del usuario. Tiene como eventos hijos KeyEvent (pulsacin de una tecla) y MouseEvent (accin sobre el ratn). FocusEvent: Avisa al programa de que el componente ha ganado o perdido la atencin (enfoque) del usuario. Esto se deduce de la actividad del usuario (ratn y teclado). WindowEvent: Avisa al programa de que el usuario ha utilizado uno de los controles de ventana a nivel del sistema operativo, como los controles de minimizar o cerrar. ContainerEvent: Se enva cuando se aaden o eliminan componentes a un contenedor. PaintEvent: Evento especial que seala que el sistema operativo quiere dibujar de nuevo una parte de la interfaz. Un componente debe sobreescribir el mtodo paint() o el mtodo update() para gestionar este evento.

b.) Eventos semnticos

Son todos hijos del evento AWTEvent, que es el evento base de la jerarqua de eventos:

ActionEvent: Avisa al programa de acciones especficas de componentes como las pulsaciones de botones. AdjustmenteEvent: Comunica que una barra de desplazamiento ha sido ajustada. ItemEvent: Avisa al programa cuando el usuario interacciona con una eleccin, una lista o una casilla de verificacin. TextEvent: Avisa cuando un usuario cambia texto en un componente TextComponent, TextArea o TextField. InputMethodEvent: Avisa que un texto que est siendo creado utilizando

un mtodo de entrada est cambiando (se ha escrito algo ms...). InvocationEvent: Este evento ejecuta el mtodo run() en una clase Runnable cuando es tratado por el thread del despachador (dispatcher) de AWT.

IV.3. SWING A. Introduccin El paquete Swing es el nuevo paquete grfico que ha aparecido en la versin 1.2 de Java. Est compuesto por un amplio conjunto de componentes de interfaces de usuario que funcionen en el mayor nmero posible de plataformas. Cada uno de los componentes de este paquete puede presentar diversos aspectos y comportamientos en funcin de una biblioteca de clases. En la versin 1.0 de Swing, que corresponde a la distribuida en la versin 1.2 de la API de Java se incluyen tres bibliotecas de aspecto y comportamiento para Swing:

metal.jar: Aspecto y comportamiento independiente de la plataforma. motif.jar: Basado en la interfaz Sun Motif. windows.jar: Muy similar a las interfaces Microsoft Windows 95.

La siguiente imagen muestra una aplicacin de ejemplo (adjunta al JDK 1.2) que muestra las diferentes interfaces para una misma aplicacin segn se utilice una u otra biblioteca:

Imagen 8: Diferentes aspectos de una interfaz Swing Es la nueva clase denominada UiManager la que se encarga del aspecto y

comportamiento de una aplicacin Swing en un entorno de ejecucin. En el apartado "VI.3. Ejemplo de creacin de una applet" se muestra un breve ejemplo de cmo utilizar las clases de Swing para crear una aplicacin utilizando Swing. B. Nuevas caractersticas La arquitectura Swing presenta una serie de ventajas respecto a su antecedente AWT:

Amplia variedad de componentes: En general las clases que comiencen por "J" son componentes que se pueden aadir a la aplicacin. Por ejemplo: JButton. Aspecto modificable (look and feel): Se puede personalizar el aspecto de las interfaces o utilizar varios aspectos que existen por defecto (Metal Max, Basic Motif, Window Win32). Arquitectura Modelo-Vista-Controlador: Esta arquitectura da lugar a todo un enfoque de desarrollo muy arraigado en los entornos grficos de usuario realizados con tcnicas orientadas a objetos. Cada componente tiene asociado una clase de modelo de datos y una interfaz que utiliza. Se puede crear un modelo de datos personalizado para cada componente, con slo heredar de la clase Model. Gestin mejorada de la entrada del usuario: Se pueden gestionar combinaciones de teclas en un objeto KeyStroke y registrarlo como componente. El evento se activar cuando se pulse dicha combinacin si est siendo utilizado el componente, la ventana en que se encuentra o algn hijo del componente. Objetos de accin (action objects): Estos objetos cuando estn activados (enabled) controlan las acciones de varios objetos componentes de la interfaz. Son hijos de ActionListener. Contenedores anidados: Cualquier componente puede estar anidado en otro. Por ejemplo, un grfico se puede anidar en una lista. Escritorios virtuales: Se pueden crear escritorios virtuales o "interfaz de mltiples documentos" mediante las clases JDesktopPane y JInternalFrame. Bordes complejos: Los componentes pueden presentar nuevos tipos de bordes. Adems el usuario puede crear tipos de bordes personalizados. Dilogos personalizados: Se pueden crear multitud de formas de mensajes y opciones de dilogo con el usuario, mediante la clase JOptionPane. Clases para dilogos habituales: Se puede utilizar JFileChooser para elegir

un fichero, y JColorChooser para elegir un color. Componentes para tablas y rboles de datos: Mediante las clases JTable y JTree. Potentes manipuladores de texto: Adems de campos y reas de texto, se presentan campos de sintaxis oculta JPassword, y texto con mltiples fuentes JTextPane. Adems hay paquetes para utilizar ficheros en formato HTML o RTF. Capacidad para "deshacer": En gran variedad de situaciones se pueden deshacer las modificaciones que se realizaron. Soporte a la accesibilidad: Se facilita la generacin de interfaces que ayuden a la accesibilidad de discapacitados, por ejemplo en Braille.

C. Principales clases Las clases de Swing se parecen mucho a las de AWT. Todas las clases explicadas en el apartado "IV.2 AWT" de este tutorial tienen una nueva versin en Swing con el prefijo J. As la clase Panel de AWT tiene una clase JPanel en Swing. Esto se cumple para todas las clases menos para Choice, Canvas, FileDialgog y ScrollPane. De hecho todas las clases componentes de Swing (clases hijas de JComponent), son hijas de la clase Component de AWT.

ButtonGroup: Muestra una lista de elementos (JRadioButton) con solo uno seleccionable. Cada elemento tiene un crculo, que en caso del elemento seleccionado contendr un "punto". JToggleButton: Es como un botn normal, pero al ser pinchado por el usuario queda activado. JProgressBar: Representa una barra de estado de progreso, mediante la que habitualmente se muestra el desarrollo de un proceso en desarrollo (ejemplo: la instalacin de una aplicacin). JTabbedPane: Es una ventana con solapas (la que utiliza Windows). Este componente haba sido muy solicitado. JApplet: Aunque ya exista una clase Applet en AWT, esta nueva versin es necesaria para crear applets Java que utilicen interfaces Swing.

Por supuesto Swing no se limita a estas clases, sino que posee muchas ms con diversas funcionalidades. Para estudiarlas consulte la documentacin del JDK 1.2 de Java.

D. Nuevos gestores de impresin Swing incorpora nuevos gestores de impresin, ampliando los cinco que AWT incorporaba. Entre ellos conviene destacar los siguientes:

BoxLayout: Es similar al FlowLayout de AWT, con la diferencia de que con l se pueden especificar los ejes (x o y). Viene incorporada en el componente Box, pero est disponible como una opcin en otros componentes. OverlayLayout: Todos los componentes se aaden encima de cada componente previo. SpringLayout: El espacio se asigna en funcin de una serie de restricciones asociadas con cada componente. ScrollPaneLayout: Incorporado en el componente ScrollPane. ViewportLayout: Incorporado en el componente Viewport.

E. JrootPane La clase JRootPane permite colocar contenido de las applets creadas con la clase JApplet en un determinado plano de impresin (capa). Por orden de cercana al usuario, estas capas son:

glassPane: Una capa que abarca toda la parte visible (por defecto no es visible). layeredPane: Una subclase de JComponent diseada para contener cuadros de dilogo, mens emergentes y otros componentes que deben aparecer flotando entre el usuario y el contenido. menubar: Una capa opcional, que si aparece estar anclada en la parte superior. contenPane: La capa en que se dibujar la mayor parte del contenido.

As pues cada vez que se vayan a aadir componentes a una applet de clase JApplet, debe aadirse a uno de estas capas. Por ejemplo: laJApplet.getContentPane().add( unComponente ); F. Nuevos eventos de Swing Swing incorpora su nuevo conjunto de eventos para sus componentes.

a.) Eventos fsicos

Slo aparecen dos nuevos eventos fsicos, descendientes de InputEvent:


MenuKeyEvent: Un men de rbol ha recibido un evento de KeyEvent (accin sobre el ratn). MenuDragMouseEvent: Un men de rbol ha recibido un evento de MouseEvent (pulsacin de una tecla).

b.) Eventos semnticos

Son todos hijos del evento de AWT AWTEvent, que es el evento base de la jerarqua de eventos:

AncestorEvent: Antecesor aadido desplazado o eliminado. CaretEvent: El signo de intercalacin del texto ha cambiado. ChangeEvent: Un componente ha sufrido un cambio de estado. DocumentEvent: Un documento ha sufrido un cambio de estado. HyperlinkEvent: Algo relacionado con un vnculo hipermedia ha cambiado. InternalFrameEvent: Un AWTEvent que aade soporte para objetos JInternalFrame. ListDataEvent: El contenido de una lista ha cambiado o se ha aadido o eliminado un intervalo. ListSelectionEvent: La seleccin de una lista ha cambiado. MenuEvent: Un elemento de men ha sido seleccionado o mostrado o bien no seleccionado o cancelado. PopupMenuEvent: Algo ha cambiado en JPopupMenu. TableColumnModelEvent: El modelo para una columna de tabla ha cambiando. TableModelEvent: El modelo de una tabla ha cambiado. TreeExpansionEvent: El nodo de un rbol se ha extendido o se ha colapsado. TreeModelEvent: El modelo de un rbol ha cambiado. TreeSelectionEvent: La seleccin de un rbol ha cambiado de estado. UndoableEditEvent: Ha ocurrido una operacin que no se puede realizar.

G. El patrn de diseo Modelo-Vista-Controlador Muchos de los componentes Swing estn basados en un patrn de diseo denominado "Modelo-Vista-Controlador".

El concepto de este patrn de diseo se basa en tres elementos:


Modelo: Almacena el estado interno en un conjunto de clases. Vista: Muestra la informacin del modelo Controlador: Cambia la informacin del modelo (delegado).

No es menester de este tutorial explicar todo el funcionamiento de este nuevo diseo, pero si se quiere profundizar en l consulte [Morgan, 1999]. V.1 JAVA E INTERNET A. Introduccin Una de las grandes potencias del lenguaje de programacin Java es la total portabilidad de sus programas gracias a su afamada "mquina virtual". Esto adquiere una importancia an mayor en Internet donde existen tipos de computadoras muy dispares. Las siguientes bibliotecas de la API de Java contienen una serie de clases que son interesantes de cara a la creacin de aplicaciones que trabajen en red. Las ms importantes son:

java.applet: Da soporte a las applets. java.net: Clases para redes. Dan acceso a TCP/IP, sockets y URLs.

Conviene destacar la existencia de otras bibliotecas ms complejas, orientadas tambin a la programacin en red, que aunque no sern estudiadas en este tutorial, s conviene tener presente su existencia:

java.sql: Paquete que contiene el JDBC, para conexin de programas Java con Bases de datos. java.rmi: Paquete RMI, para localizar objetos remotos, comunicarse con ellos e incluso enviar objetos como parmetros de un objeto a otro. org.omg.CORBA: Facilita la posibilidad de utilizar OMG CORBA, para la conexin entre objetos distribuidos, aunque estn codificados en distintos lenguajes. org.omb.CosNaming : Da servicio al IDL de Java, similar al RMI pero en CORBA.

Una de las caractersticas de Java que lo hacen especialmente interesante para Internet es que sus programas objeto (cdigos de byte) son verificables para

poder detectar posibles virus en sus contenidos. Estos programas Cdigos de byte no necesitan ser recompilados, y una vez verificados (pues Java trabaja con nombres no con direcciones), se transforman en direcciones fsicas de la mquina destino.

Imagen 9: Ejecucin de un cdigo de byte Esta forma de trabajar cuida la seguridad sin un grave perjuicio de la eficiencia. Un programa en Java es slo unas 20 veces ms lento que uno programado en C, cifra aceptable para la mayora de las tareas, y suponiendo que no se utilice un compilador JIT. B. El paquete java.net Java ofrece un conjunto de clases que permiten utilizar los URLs (Uniform Resource Locators). Un URL es una direccin electrnica que permite encontrar una informacin en Internet especificando:

El nombre del protocolo que permitir leer la informacin. Por ejemplo HTTP. El nombre del servidor que proporciona la informacin. Por ejemplo sunsite.unc.edu o bien una direccin IP directamente. El nombre del fichero en el servidor. Por ejemplo /Javafaq/Javafaq.htm.

C. Futuro del Java en Internet Java es seguramente el lenguaje con ms futuro en cuanto a la programacin para

Internet. De hecho, podra evolucionar hasta el punto de que el navegador no interprete las applets de Java, sino que l sea un conjunto de applets que se descarguen de Internet segn se vayan necesitando. As es que en todo momento podramos estar ejecutando la ltima versin del navegador. Incluso siendo un poco ms futuristas, podramos plantearnos conectarnos a servidores que nos cobraran por el uso de sus programas (hojas de clculo, procesadores de texto...) en funcin del tiempo de uso, trabajando siempre con la ltima versin del mismo, en lugar de invertir nuestro dinero en actualizaciones. V.2 LOS SOCKETS EN JAVA A. Fundamentos Los sockets son un sistema de comunicacin entre procesos de diferentes mquinas de una red. Ms exactamente, un socket es un punto de comunicacin por el cual un proceso puede emitir o recibir informacin. Fueron popularizados por Berckley Software Distribution, de la universidad norteamericana de Berkley. Los sockets han de ser capaces de utilizar el protocolo de streams TCP (Transfer Contro Protocol) y el de datagramas UDP (User Datagram Protocol). Utilizan una serie de primitivas para establecer el punto de comunicacin, para conectarse a una mquina remota en un determinado puerto que est disponible, para escuchar en l, para leer o escribir y publicar informacin en l, y finalmente para desconectarse. Con todas primitivas se puede crear un sistema de dilogo muy completo.

Imagen 10: Funcionamiento de una conexin socket Para ms informacin vase [Rifflet, 1998]. B. Ejemplo de uso Para comprender el funcionamiento de los sockets no hay nada mejor que estudiar un ejemplo. El que a continuacin se presenta establece un pequeo dilogo entre un programa servidor y sus clientes, que intercambiarn cadenas de informacin.
a.) Programa Cliente

El programa cliente se conecta a un servidor indicando el nombre de la mquina y el nmero puerto (tipo de servicio que solicita) en el que el servidor est instalado.

Una vez conectado, lee una cadena del servidor y la escribe en la pantalla:
import java.io.*;

import java.net.*;

class Cliente {

static final String HOST = "localhost";

static final int PUERTO=5000;

public Cliente( ) {

try{

Socket skCliente = new Socket( HOST , Puerto );

InputStream aux = skCliente.getInputStream();

DataInputStream flujo = new DataInputStream( aux );

System.out.println( flujo.readUTF() );

skCliente.close();

} catch( Exception e ) {

System.out.println( e.getMessage() );

public static void main( String[] arg ) {

new Cliente();

En primer lugar se crea el socket denominado skCliente, al que se le especifican el nombre de host (HOST) y el nmero de puerto (PORT) en este ejemplo constantes. Luego se asocia el flujo de datos de dicho socket (obtenido mediante getInputStream)), que es asociado a un flujo (flujo) DataInputStream de lectura secuencial. De dicho flujo capturamos una

cadena (readUTF() ), y la imprimimos por pantalla (System.out). El socket se cierra, una vez finalizadas las operaciones, mediante el mtodo close(). Debe observarse que se realiza una gestin de excepcin para capturar los posibles fallos tanto de los flujos de datos como del socket.
b.) Programa Servidor

El programa servidor se instala en un puerto determinado, a la espera de conexiones, a las que tratar mediante un segundo socket. Cada vez que se presenta un cliente, le saluda con una frase "Hola cliente N". Este servidor slo atender hasta tres clientes, y despus finalizar su ejecucin, pero es habitual utilizar bucles infinitos ( while(true) ) en los servidores, para que atiendan llamadas continuamente. Tras atender cuatro clientes, el servidor deja de ofrecer su servicio:
import java.io.* ;

import java.net.* ;

class Servidor {

static final int PUERTO=5000;

public Servidor( ) {

try {

ServerSocket skServidor = new ServerSocket( PUERTO );

System.out.println("Escucho el puerto " + PUERTO );

for ( int numCli = 0; numCli < 3; numCli++; ) {

Socket skCliente = skServidor.accept(); // Crea objeto

System.out.println("Sirvo al cliente " + numCli);

OutputStream aux = skCliente.getOutputStream();

DataOutputStream flujo= new DataOutputStream( aux );

flujo.writeUTF( "Hola cliente " + numCli );

skCliente.close();

System.out.println("Demasiados clientes por hoy");

} catch( Exception e ) {

System.out.println( e.getMessage() );

public static void main( String[] arg ) {

new Servidor();

Utiliza un objeto de la clase ServerSocket (skServidor), que sirve para esperar las conexiones en un puerto determinado (PUERTO), y un objeto de la clase Socket (skCliente) que sirve para gestionar una conexin con cada cliente. Mediante un bucle for y la variable numCli se restringe el nmero de clientes a tres, con lo que cada vez que en el puerto de este servidor aparezca un cliente, se atiende y se incrementa el contador. Para atender a los clientes se utiliza la primitiva accept() de la clase ServerSocket, que es una rutina que crea un nuevo Socket (skCliente) para

atender a un cliente que se ha conectado a ese servidor. Se asocia al socket creado (skCliente) un flujo (flujo) de salida DataOutputStream de escritura secuencial, en el que se escribe el mensaje a enviar al cliente. El tratamiento de las excepciones es muy reducido en nuestro ejemplo, tan solo se captura e imprime el mensaje que incluye la excepcin mediante getMessage().
c.) Ejecucin

Aunque la ejecucin de los sockets est diseada para trabajar con ordenadores en red, en sistemas operativos multitarea (por ejemplo Windows y UNIX) se puede probar el correcto funcionamiento de un programa de sockets en una misma mquina. Para ellos se ha de colocar el servidor en una ventana, obteniendo lo siguiente: >java Servidor Escucho el puerto 5000 En otra ventana se lanza varias veces el programa cliente, obteniendo: >java Cliente Hola cliente 1 >java cliente Hola cliente 2 >java cliente Hola cliente 3 >java cliente connection refused: no further information Mientras tanto en la ventana del servidor se ha impreso:

Sirvo al cliente 1 Sirvo al cliente 2 Sirvo al cliente 3 Demasiados clientes por hoy Cuando se lanza el cuarto de cliente, el servidor ya ha cortado la conexin, con lo que se lanza una excepcin. Obsrvese que tanto el cliente como el servidor pueden leer o escribir del socket. Los mecanismos de comunicacin pueden ser refinados cambiando la implementacin de los sockets, mediante la utilizacin de las clases abstractas que el paquete java.net provee. VI.1. INTRODUCCIN A LAS APPLETS A. Introduccin Las applets (miniaplicacin) son programas escritos en Java que sirven para "dar vida" a las pginas Web (interaccin en tiempo real, inclusin de animaciones, sonidos...), de ah su potencia. Las applets son programas que se incluyen en las pginas Web. Las applets son ejecutadas en la mquina cliente, con lo que no existen ralentizaciones por la saturacin del mdem o del ancho de banda. Permiten cargar a travs de la red una aplicacin portable que se ejecuta en el navegador. Para que esto ocurra tan slo hace falta que el navegador sea capaz de interpretar Java. A las pginas que contienen applets se las denomina pginas Java-Powered. Las applets pueden ser visualizadas con la herramienta appletviewer, incluido en el JDK de Java. Las applets no son exactamente aplicaciones Java, ya que presentan las siguientes diferencias respecto a las aplicaciones normales Java:

Se cargan mediante un navegador, no siendo lanzados por el intrprete Java. Son cargados a travs de la red por medio de pginas HTML y no residen en el disco duro de la mquina que los ejecuta. Poseen un ciclo de vida diferente; mientras que una aplicacin se lanza

una vez, una applet se arranca (inicia) cada vez que el usuario recarga la pgina en la que se encuentra la applet. Tienen menos derechos que una aplicacin clsica, por razones de seguridad. De modo predeterminado en el puesto que los ejecuta no pueden ni leer ni escribir ficheros, ni lanzar programas, ni cargar DLLs. Slo pueden comunicarse con el servidor Web en que se encuentra la pgina Web que las contiene.

B. Consideraciones sobre la seguridad en las applets Como ya se ha dicho las applets tienen una serie de restricciones de programacin que las hacen "seguras". Estas restricciones de seguridad son especialmente importantes, ya que evitarn que se cargue por error una applet que destruya datos de la mquina, que obtenga informacin restringida, o que produzca otros daos inesperados. Las applets no dejan de ser "ejecutables" que funcionan dentro de una aplicacin, como puede ser un visualizador de pginas Web (browser). Este ejecutable puede obtenerse de una red, lo que significa que hay cdigo posiblemente no fiable que se ejecuta dentro de la aplicacin. Java tiene muchas salvaguardas de seguridad que minimizan el riesgo de la ejecucin de applets, pero estas salvaguardas tambin limitan a los programadores de applets en su capacidad de programacin. El modelo de seguridad para las applets en Java trata una applet como cdigo no fiable ejecutndose dentro de un entorno fiable. Por ejemplo, cuando un usuario instala una copia de un navegador Web en una mquina se est fiando de que su cdigo ser funcional en el entorno. Normalmente los usuarios tienen cuidado de qu instalan cuando proviene de una red. Una applet, por el contrario, se carga desde la red sin ninguna comprobacin de su fiabilidad. El lenguaje Java y las applets son escritos para que eviten las applets no fiables. Estas salvaguardas son implementadas para verificar que los cdigos de byte de las clases de los applets, no rompen las reglas bsicas del lenguaje ni las restricciones de acceso en tiempo de ejecucin. Slo cuando estas restricciones son satisfechas se le permite a la applet ejecutar su cdigo. Cuando se ejecuta, se le marca para sealar que se encuentra dentro del intrprete. Esta marca permite a las clases de tiempo de ejecucin determinar cundo a una fraccin del cdigo se

le permite invocar a cierto mtodo. Por ejemplo, una applet est restringida en los hosts en los que se puede abrir una conexin de red o en un conjunto de URLs a las que puede acceder. En su conjunto estas restricciones constituyen una poltica de seguridad. En el futuro, Java tendr polticas ms ricas, incluyendo algunas que usen encriptacin y autentificacin para permitir a las applets una mayor capacidad. La actual poltica de seguridad afecta a los recursos que una applet puede usar, cuyos principales puntos son:

Los accesos que pueden realizar las applets a los ficheros son restringidos. En particular escribir en ficheros y/o leerles no ser una capacidad estndar que se pueda realizar en los navegadores que soporten applets de Java. Las conexiones de red sern restringidas a conectar solo con el host del que proviene la applet. Una applet no es capaz de usar ningn mtodo que pueda resultar en una ejecucin arbitraria, cdigo no revisado o ambos. Esto incluye mtodos que ejecuten programas arbitrarios (mtodos nativos) as como la carga de bibliotecas dinmicas.

Se anticipa en cualquier caso que en el futuro los modelos de seguridad permitirn a las applets autentificadas superar estas restricciones. VI.2. LA CLASE APPLET A. Situacin de la clase Applet en la API de Java La clase Applet Java, de la cual han de heredar todos los programas Java que vayan a actuar como applets, es la nica clase que contiene el paquete java.applet de la API de Java. Esta clase hereda de Object (como todas las clases Java), pero adems hereda de Component y Container, que son dos clases del paquete grfico AWT. Esto ya perfila las posibilidades grficas de este tipo de aplicaciones Java. B. Mtodos del ciclo de vida Como ya se ha indicado una applet no tiene un ciclo de vida tan "sencillo" como el de una aplicacin, que simplemente se ejecuta hasta que finaliza su

mtodo main(). La siguiente figura modeliza el ciclo de vida de una applet:

Imagen 11: Ciclo de vida de una applet Cada crculo representa una fase en el ciclo de vida de la applet. Las flechas representan transiciones y el texto representa la accin que causa la transicin. Cada fase est marcada con una invocacin a un mtodo de la applet:

void init(); Es invocado cuando se carga la applet. Aqu se suelen introducir las iniciaciones que la applet necesite. void start();Es invocado cuando la applet, despus de haber sido cargada, ha sido parada (cambio de pgina Web, minimizacin del navegador,...), y de nuevo activada (vuelta a la pgina, restauracin del navegador,...). Se informa a la applet de que tiene que empezar su funcionamiento. void stop(); Es invocado para informar a la applet de que debe de parar su ejecucin. As una applet que utilice threads, debera detenerlos en el cdigo de este mtodo. void destroy();Es invocado para informar a la applet de que su espacio est siendo solicitado por el sistema, es decir el usuario abandona el navegador. La applet debe de aprovechar este momento para liberar o destruir los recursos que est utilizando.

void paint(); Es invocado cada vez que hay que el navegador redibuja la applet.

Al crear una applet no es necesario implementar todos estos mtodos. De hecho habr applets que no los necesiten. Cuando un navegador carga una pgina Web que contiene una applet, suele mostrar en su parte inferior un mensaje como: initializing... starting... Esto indica que la applet, se est cargando: 1. Una instancia de la clase applet es creada. 2. La applet es iniciada, mediante su mtodo init(). 3. La applet empieza a ejecutarse, mediante su mtodo start(). Cuando el usuario se encuentra con una pgina Web, que contiene una applet y salta a otra pgina, entonces la applet se detiene invocando a su mtodo stop(). Si el usuario retorna a la pgina donde reside la applet, sta vuelve a ejecutarse nuevamente invocando a su mtodo start(). Cuando el usuario sale del navegador la applet tiene un tiempo para finalizar su ejecucin y hacer una limpieza final, mediante el mtodo destroy(). C. La clase URL Un URL (Uniform Resource Locator) es una direccin de Internet. Cada recurso (fichero, pgina Web, imagen...) tiene uno propio. En Java existe una clase denominada URL que modeliza esta clase de objetos. La clase URL pertenece al paquete java.net, y tiene una cierta importancia en el desarrollo de las applets, puesto que muchos de los mtodos de la clase Applet la utilizan para acceder a determinado recurso de Internet o para identificarse. Podemos especificar un URL de manera absoluta: URL URLabsoluto = new URL("http://www.host.com/dir/fich.htm");

O bien podemos especificar un URL de manera relativa: URL URLhost = new URL("http://www.Javasoft.com/"); URL URLrelativo = new URL( URLhost, "dir/fich.htm"); Ambos ejemplos corresponderan al URL "http://www.host.com/dir/fich.htm". D. Inclusin de la applet en una pgina Web Para incluir una applet en una pgina Web, una vez compilada la applet, debe incluirse entre el cdigo HTML de la pgina Web una etiqueta <APPLET>, que como mnimo ha de presentar los siguientes tres parmetros:

code: Especifica el URL del fichero de clase Java (*.class) que contiene la applet. width: Especifica la anchura inicial de la applet (en pixels). heigth: Especifica la altura inicial de la applet (en pixels).

Adems, de la etiqueta inicial, una applet puede tener parmetros que se especificarn mediante etiquetas <PARAM>, que como mnimo han de presentar dos parmetros:

name: Indica el nombre del parmetro de la applet al que esta etiqueta hace referencia. value: Establece este valor al parmetro indicado en name de la misma etiqueta.

As un ejemplo de esto sera: <applet code="AppletDiagonal.class" width=200 height=200> <param name=Parametro1 value=Valor1> <param name=Parametro2 value=Valor2> </applet> En este ejemplo la applet puede entender los parmetro Parametro1 y Parametro2, mediante los mtodos que se describen en

el siguiente apartado, y obtendra Valor1 y Valor2 respectivamente. Se observa que adems de la etiqueta <applet> en el cdigo HTML tambin aparece una etiqueta </applet>. Esto sucede porque HTML es un lenguaje pareado, en el que casi todas las etiquetas de inicio de elemento (<etiq>) tienen una etiqueta de fin (</etiq>). E. Obtencin de los parmetros de la applet Cuando se incluye una applet en una pgina Web ha de hacerse mediante la etiqueta HTML <applet>. Las etiquetas HTML permiten utilizar parmetros, y la etiqueta <applet> hace lo propio, permitiendo a la applet recibir parmetros de ejecucin, tal y como una aplicacin los recibe en el parmetro s (un vector de cadenas) de su mtodo main(String[] s). Los siguientes mtodos se utilizan para extraer informacin de los parmetros que recibi la applet cuando fue llamada desde el cdigo HTML:

URL getDocumentBase(); Devuelve el URL del documento que contiene la applet. URL getCodeBase(); Devuelve el URL de la applet. String getParameter(String name); Devuelve el valor de un parmetro (etiquetas <param>) que aparezca en el documento HTML.

Si por ejemplo se llamase a una applet, con el cdigo HTML: <applet code="AppletParam.class" width=50 height=50> <param name=Color value="red"> </applet> Una llamada en esta applet al mtodo getParameter("Color") devolver "red". F. Obtencin de informacin sobre una applet Algunos mtodos de la applet se utilizan para comunicar informacin o mostrar mensajes en la pantalla referentes a la applet:

boolean isActive(); Comprueba si la applet est activa. void showStatus(String status); Muestra una cadena del estado en la pantalla.

String getAppletInfo(); Devuelve informacin relativa a la applet como el autor, Copyright o versin. String[ ][ ] getParameterInfo(); Devuelve un vector que describe algn parmetro especfico de la applet. Cada elemento en el vector es un vector de tres cadenas que tienen la forma: {nombre, tipo, comentario}.

Un ejemplo de como definir este mtodo para una applet que permita un solo parmetro, color, sera:
public String[][] getParameterInfo() {

String info[][] = { {"Color","String","foreground color"} };

return info;

G. Manipulacin del entorno de una applet Algunas applets pueden afectar al entorno en que estn ejecutndose. Para ello se utilizan los mtodos:

AppletContext getAppletContext(); Devuelve un AppletContext, que permite a la applet afectar a su entorno de ejecucin. void resize( int ancho, int largo); Solicita que se modifique el tamao de la applet. Tambin permite recibir un nico parmetro Dimension. Locale getLocale(); Devuelve el Locale de la applet si fue establecido. void setStub( AppletStub s ); Establece el stub de esta applet.

H. Soporte multimedia La clase Applet tambin incluye mtodos para trabajar con imgenes y ficheros de sonido de Internet mediante la utilizacin de URLs. Para ello implementa los

mtodos:

Image getImage(URL u, String s); Obtiene una imagen de un URL u que ser absoluto si no se especifica una ruta relativa s. AudioClip getAudioClip(URL u, String s); Obtiene un clip de sonido de un URL u que ser absoluto si no se especifica una ruta relativa s. void play(URL ur1, String name); Ejecuta directamente un fichero de sonido de un URL u que ser absoluto si no se especifica una ruta relativa s. static audioClip newAudioClip(URL u); Obtiene un nuevo fichero de sonido del URL u.

Mediante el uso adecuado de varios de estos mtodos se pueden combinar sonidos e imgenes para conseguir efectos espectaculares. VI.3. EJEMPLO DE CONSTRUCCIN DE UNA APPLET A. Cdigo Para crear una applet normalmente ser necesario importar al menos las bibliotecas java.awt.* y la java.applet.*. La clase que represente a la applet se ha de declarar como una subclase de la clase Applet, para poder sobreescribir los mtodos de la clase Applet. Siempre conviene sobreescribir al menos el mtodo paint() que ser llamado por los navegadores que soporten applets para mostrarles por pantalla. Vamos a construir una applet denominada AppletDiagonal que simplemente dibuje una lnea diagonal. Un posible cdigo para esta applet sera:
import java.awt.*;

import java.applet.*;

public class AppletDiagonal extends Applet {

public void paint(Graphics g) {

g.setColor( Color.red );

g.drawLine(0, 0, getWidth(), getHeight() );

Pasemos a comentar el funcionamiento de este cdigo: 1. El mtodo paint() recibe un objeto de la clase Graphics. La clase Graphics, incluida en el AWT, contiene mtodos para mostrar varios tipos de grficos. 2. Mediante el mtodo setColor() de la clase Graphics se establece el color de primer plano a rojo, que es uno de los colores predefinidos de la clase Color. 3. Por ltimo, mediante drawLine() se dibuja una lnea dadas las coordenadas de su esquina superior izquierda y de la inferior derecha. En este caso se indican la esquina superior izquierda de la appletmediante las coordenadas (0,0), y la esquina inferior derecha se obtiene mediante dos mtodos de la clase Dimension ( getWidth(), getHeight() ). B. Ejecucin Para ejecutar la applet, una vez compilado el fichero, se introduce la llamada a la applet en una pgina Web (por ejemplo AppletDiagonal.htm), introduciendo entre su cdigo HTML lo siguiente: <applet code="AppletDiagonal.class" width=200

height=200> </applet> Cuando se cargue esta pgina Web en un navegador compatible con Java o mediante el visualizador de applets que viene con el JDK (appletviewer) se ver algo como:

Imagen 12: Applet "Lnea" Se podra dibujar un rectngulo con cambiar la lnea de cdigo de drawLine() por otra que llamase al mtodo drawRect(): g.drawRect(10, 10, r.width 20, r.height 20); C. Creacin de applets ms avanzados La creacin de applets complejos, escapa a las intenciones de este tutorial, con lo que no se va a presentar el cdigo fuente de ms applets. El dominio de la biblioteca AWT es una condicin imprescindible para la creacin de applets de ms calidad y vistosidad. Por ltimo recordar que con el JDK se incluyen unas cuantas applets que pueden servir para el estudio de las mismas, puesto que se incluye su cdigo fuente.

Para ms informacin consulte [van Hoff et al., 1996]. D. Creacin de una aplicacin que utilice la applet (AWT) Se va a utilizar AWT para crear una aplicacin que de un resultado igual que la ejecucin de la "applet Lnea". Ser una aplicacin que crear un Frame de AWT para incluir en su interior la applet que ya fue creada. De hecho el main() de la aplicacin lo nico que har ser crear un objeto de este tipo (indicndole altura y anchura, como hacamos en la applet mediante los parmetros de la etiqueta HTML). El cdigo fuente de la aplicacin sera el siguiente:
import java.awt.*;

import java.awt.event.*;

class FrameLinea extends Frame {

private AppletDiagonal unaApplet; // Se mostrar

public static void main( String[] s ) {

new FrameLinea( 200, 230 );

public FrameLinea( int ancho, int largo ) {

super(); // Constructor de Component

// Se aade un oyente que cerrara la aplicacin

addWindowListener( new OyenteLinea() );

// Se crea una applet de diagonal

unaApplet=new AppletDiagonal();

unaApplet.init();

unaApplet.start();

// Se mete la applet en frame

add( unaApplet );

setSize(ancho,largo); // ajusta frame

setVisible(true); // muestra frame

// Clase anidada

class OyenteLinea extends WindowAdapter {

// Sobreescribo el mtodo de "cuando se cierra ventana"

public void windowClosing(WindowEvent e) {

unaApplet.stop();

unaApplet.destroy();

System.exit(0);

Vamos a crear un Frame en el que vamos a incluir la applet unaApplet que ser de la clase AppletDiagonal, creada anteriormente. La aplicacin lo que hace es crear un oyente de la clase creada OyenteLinea, que ser el encargado de capturar el evento de cerrar la ventana del Frame. En el constructor se inicia la applet (init() y start()) y se aade al Frame mediante el mtodo add() de la clase Container (Frame es hija de Container). Por ltimo se establece el tamao del Frame (recibido por parmetro) mediante setSize() y por ltimo se muestra el Frame que ya tiene en su interior la applet (setVisible()). Cuando se cierra la ventana, el OyenteLinea se encarga de cerrar la applet, mediante stop() y destroy(), y de finalizar la aplicacin mediante System.exit(). E. Creacin de una aplicacin que utilice la applet (Swing) Esta misma aplicacin se puede crear utilizando Swing con solo cambiar las siguientes cosas: 1. Se ha de incluir la biblioteca de Swing: import javax.swing.*; 2. Se han de cambiar los nombres de la clase Frame de AWT por la clase JFrame de Swing. 3. Se crea un contentPane mediante un objeto JPanel, justo antes de llamar al oyente: setContentPane( new JPanel() ); 4. Para aadir la applet se ha de aadir al contentPane: getContentPane().add( unaApplet ); VI.4. EJEMPLOS DE APPLETS

En este apartado se comentan una serie de applets que pueden servir tanto para demostrar las posibilidades de estos programas, como para clasificarles por los siguientes gneros:

Instantneas: Muestran una secuencia de imgenes. Animacin y Sonidos: Mezclan imgenes con sonidos. Grficos Interactivos: Permiten la interaccin del usuario con las imgenes, mediante respuestas a las acciones del ratn sobre la imagen. Trucos de Texto: Permiten animar texto dndole vida. Financias y Negocios: Algunos nos permiten mostrar diagramas de barras, y otros elementos ilustrativos de este gnero. Demos, Juegos y Educacionales: Muy especializados, permiten al usuario interactuar consiguiendo cotas fascinantes de diversin.

A continuacin veremos un ejemplo de cada grupo que sea lo ms significativo posible, es decir, que resalte las caractersticas de ese grupo y las diferencias con el resto de los grupos. En cada uno de ellos se ha incluido una descripcin de lo que hace la applet, los parmetros que soporta, y un ejemplo del cdigo HTML que habra que insertar en una pgina Web para incluir la applet en dicha pgina. A. Instantneas: "Tumbling Duke"

Imagen 13: Applet Instantnea "Tumbling Duke"


a.) Descripcin

Se trata de una applet en la que Duke, la mascota de Java, da volteretas en la pgina correspondiente. La animacin consta de 17 secuencias.
b.) Parmetros

maxwidth: Anchura mxima de la imagen durante la animacin. nimgs: Nmero de marcos o secuencias en la animacin. offset: Desplazamiento horizontal entre la primera y la ltima secuencia de la animacin.

img: URL del directorio donde se encuentran almacenadas las diferentes secuencias de la animacin: T1.gif, T2.gif...

c.) Ejemplo

<applet code="TumbleItem.class" width=600 height=95> <param name=maxwidth value="120"> <param name=nimgs value="16"> <param name=offset value="-57"> <param name=img value="tumble"> </applet> B. Animacin y sonido: "Animator"

Imagen 14: Applet de Animacin y sonido "Animator"


a.) Descripcin

Esta applet permite crear una animacin con sonido. Se puede especificar el orden de las secuencias, si la animacin se repite, la pista de sonido, otros sonidos para determinadas secuencias, el espacio de tiempo entre secuencias, una imagen por defecto mientras se est iniciando la applet, la posicin exacta en la que se quiere que aparezca cada secuencia... Haciendo un clic con el ratn sobre la applet se detiene la animacin. Haciendo otro contina la ejecucin.
b.) Parmetros

imagesource: URL del directorio que contiene las imgenes de la animacin: T1.gif... startup: URL de la imagen que aparecer por defecto mientras se cargan el resto de las secuencias.

background: URL de la imagen de fondo. startimage: ndice de la primera secuencia. endimage: ndice de la ltima secuencia de la animacin. pauses: Lista de las pausas en milisegundos. Permite especificar una pausa especfica para cada secuencia. Cada nmero se separa mediante el carcter |. repeat: Indicador de repeticin. Se una para repetir la secuencia de animaciones. Su valor por defecto es true. positions: Coordenadas de la posicin de cada marco o secuencia (x@y). Permite mover la animacin alrededor. Cada par de coordenadas se separa por el carcter |. images: ndices de las imgenes. Permite repetir las imgenes de la animacin. Cada nmero se encuentra separado por el carcter |. soundsource: URL del directorio que contiene los archivos de sonido. soundtrack: URL del archivo de sonido que suena "de fondo". sounds: Lista de URLs de archivos de sonido para cada secuencia de la applet. Se encuentran separados por el carcter |.

c.) Ejemplo

<applet code=Animator.class width=64 height=64> <param name=imagesource value="tower"> <param name=endimage value=2> <param name=soundsource value="audio"> <param name=soundtrack value=spacemusic.au> <param name=sounds value="1.au|2.au"> <param name=pause value=200> </applet> C. Grficos interactivos: "Link Button"

Imagen 15: Applet de grficos interactivos "Link Button"


a.) Descripcin

Esta applet permite colocar un botn en una pgina Web. Cuando se pulse el botn aparecer una nueva pgina, o se reproducir un determinado archivo de sonido,...
b.) Parmetros

href: URL del documento o archivo al que hay que llamar cuando un usuario pulsa el botn. Este URL tambin puede hacer referencia a una posicin concreta de la pgina actual. snd: URL del archivo de sonido que se va a reproducir cuando se pulse el botn.

c.) Ejemplo

<applet code=LinkButton.Java width=100 height=30> <param name=lbl value="Java"> <param name=href value=http://www.Javasoft.com/> <param name=snd value="computer.au"> </applet> D. Trucos de texto: "Nervous Text"

Imagen 16: Applet de texto animado "Nervous Text"


a.) Descripcin

Esta applet muestra una lnea de texto en la que las letras, aleatoriamente, se estn desplazando de tal forma que se superponen con las letras contiguas. Es algo muy sencillo pero, por otra parte, muy llamativo.
b.) Parmetros

text: El texto (slo una lnea) que se mostrar en la applet.

c.) Ejemplo

<applet code="NervousText.class" width=200 height=50> <param name=text value="hello World!"> </applet>


d.) Notas

Se necesitar establecer bien la anchura de la applet para que quepa toda la lnea. Puede servir para una firma en los mensajes de correo electrnico o de noticias, pero no podr verse si el navegador no soporta Java. E. Financias y negocios: "Bar Chart"

Imagen 17: Applet de financias y negocios "Bar Chart"


a.) Descripcin

Esta applet muestra un grfico de barras basado en los parmetros que recibe.
b.) Parmetros

title: Ttulo del grfico. Aparecer debajo de las grficas. colums: Nmero de columnas (barras) en el grfico. orientation: Posicin de las barras: horizontales o verticales. scale: Escala de representacin (en pixels por unidad de barra). c<N>_style: Textura de las barras: lisas o rayadas. c<N>_value: Unidades de medida: dlares, das... c<N>_label: Etiqueta de la barra: dinero, tiempo... c<N>_color: Color de la barra: verde, azul, rosa, naranja, magenta ,amarillo...

c.) Ejemplo

<applet code="Chart.class width=251 height=125> <param name=title value="Performance"> <param name=columns value="4"> <param name=orientation value="horizontal"> <param name=scale value="5"> <param name=c1_style value="striped"> <param name=c1 value="10">

<param name=c1_color value="blue"> <param name=c1_label value="Q1"> <param name=c2_color value="green"> <param name=c2_label value="Q2"> <param name=c2 value="20"> <param name=c2_style value="solid"> <param name=c3 value="5"> <param name=c3_style value="striped"> <param name=c3_color value="magenta"> <param name=c3_label value="Q3"> <param name=c4 value="30"> <param name=c4_color value="yellow"> <param name=c4_label value="Q4"> <param name=c4_style value="solid">
d.) Notas

Si se modifica la orientacin (ponindola en vertical) habr que escoger una anchura y altura adecuadas para que todo el grfico quepa dentro de la zona reservada para la applet. El usuario no puede interactuar con el grfico. Slo se muestra en pantalla. F. Juegos y educacionales: "Graph Layout"

Imagen 18: Applet de juegos y educacionales "Graph Layout"


a.) Descripcin

Es una applet que despliega un grafo, consistente en un conjunto de nodos y arcos. Se pueden definir los nodos que se van a usar as como la longitud ptima de los arcos. El grafo est construido mediante un algoritmo heurstico.
b.) Parmetros

center: Nodo central del grafo (en color rojo) que se sita en el centro de la pantalla. Los nodos se crean cuando se necesitan. edges: Arcos del grafo. Este parmetro consiste en una lista (separada por comas), de arcos. Cada arco se define mediante un par de nodos entre las etiquetas origen-destino/longitud, donde la longitud del arco (longitud) es opcional.

c.) Ejemplo

<applet code="Graph.class" width=400 height=400> <param name=edges value="joe-food, joe-dog, joe-tea,

joe-cat, joe-table, table-plate/50, plate-food/30, food-mouse/100, food-dog/100, mouse-cat/150, tab1ecup/30, cup-tea/30, dog-cat/80, cup-spoon/50, plate-fork, dog-fleal, dog-f1ea2, f1ea1-f1ea2/20, p1ate-knive"> <param name=center value="joe"> </applet>
d.) Notas

El usuario puede recoger nodos y distorsionar el grafo para acelerar el proceso del esquema. APNDICE I. EL JDK (Java Development Kit) A. Introduccin JDK es el acrnimo de "Java Development Kit", es decir Kit de desarrollo de Java. Se puede definir como un conjunto de herramientas, utilidades, documentacin y ejemplos para desarrollar aplicaciones Java. Para la realizacin de este tutorial se ha trabajado con la versin 1.2.0 del JDK. B. Componentes del JDK
a.) Introduccin

JDK consta de una serie de aplicaciones y componentes, para realizar cada una de las tareas de las que es capaz de encargarse A continuacin se explican ms en profundidad cada uno de ellos, as como su sintaxis, indicando entre corchetes aquellos elementos que sean opcionales. Se observar que todos los programas permiten la inclusin de una serie de opciones sobre su ejecucin antes del primer argumento. Estas opciones se indican precedidas de un menos(-):

programa -opcion1 -opcion2 Parametro1 Todas las opciones que los ejecutables del JDK presentan se muestran llamando al programa sin parmetros o con las opciones -? o -help: programa programa -help programa -?
b.) Intrprete en tiempo de ejecucin (JRE)

Permite la ejecucin de los programas Java (*.class) no grficos (aplicaciones). La sintaxis para su utilizacin es la siguiente: java [Opciones] ClaseAEjecutar [Argumentos]

Opciones: Especifica opciones relacionadas con la forma en que el intrprete Java ejecuta el programa. ClaseAEjecutar: Especifica el nombre de la clase cuyo mtodo main() se desea ejecutar como programa. Si la clase reside en un paquete se deber especificar su ruta mediante en formapaquete.subpaquete.clase_a_ejecutar. Argumentos: Especifica los argumentos que se recibirn en el parmetro s del mtodo main(String s), por si el programa necesita de parmetros de ejecucin. Si por ejemplo el programa realiza el filtrado de un archivo, probablemente nos interese recibir como argumento la ruta del fichero a filtrar, y una ruta destino.

c). Compilador

Se utiliza para compilar archivos de cdigo fuente Java (habitualmente *.java), en archivos de clases Java ejecutables (*.class). Se crea un archivo de clase para cada clase definida en un archivo fuente. Este compilador es una utilidad en lnea de comandos con la siguiente sintaxis: javac [Opciones] ArchivoACompilar

Opciones: Especifica opciones de cmo el compilador ha de crear las

clases ejecutables. ArchivoACompilar: Especifica la ruta del archivo fuente a compilar, normalmente una fichero con extensin ".java".

d.) Visualizador de applets

Es una herramienta que sirve como campo de pruebas de applets, visualizando cmo se mostraran en un navegador, en lugar de tener que esperar. Al ser activado desde una lnea de rdenes abre una ventana en la que muestra el contenido de la applet. Se activa con la sintaxis: appletviewer [Opciones] Applet

Opciones: Especifica cmo ejecutar la applet Java. Applet: Indica un URL o una ruta de disco que contiene una pgina HTML con una applet Java empotrada.

e.) Depurador

Es una utilidad de lnea de comandos que permite depurar aplicaciones Java. No es un entorno de caractersticas visuales, pero permite encontrar y eliminar los errores de los programas Java con mucha exactitud. Es parecido en su funcionamiento al depurador gdb que se incluye con las distribuciones del compilador gcc/g++ para C/C++. Se activa con la sintaxis: jdb [Opciones]

Opciones: Se utiliza para especificar ajustes diferentes dentro de una sesin de depuracin.

f.) Desensamblador de archivo de clase

Se utiliza para desensamblar un archivo de clase. Su salida por defecto, muestra los atributos y mtodos pblicos de la clase desensamblada, pero con la opcin c tambin desensambla los cdigos de byte, mostrndolos por pantalla. Es til cuando no se tiene el cdigo fuente de una clase de la que se quisiera saber cmo

fue codificada. La sintaxis es la siguiente: javap [Opciones] [NombresClases]


Opciones: Especifica la forma en la que se han de desensamblar las clases. NombresClase: Especifica la ruta de las clases a desensamblar, separadas por espacios.

g.) Generador de cabecera y archivo de apndice

Se utiliza para generar archivos fuentes y cabeceras C para implementar mtodos Java en C (cdigo nativo). Esto se consigue mediante la generacin de una estructura C cuya distribucin coincide con la de la correspondiente clase Java. El generador de cabeceras javah, crea los ficheros de cabecera C/C++ para implementar en esos lenguajes los mtodos nativos que presente un programa Java. La sintaxis es la siguiente: javah [Opciones] NombreClase

NombreClase: Nombre de la clase desde la cul se van a generar archivos fuente C. Opciones: Forma en la que se generarn los archivos fuente

h.) Generador de documentacin

Es una herramienta til para la generacin de documentacin API directamente desde el cdigo fuente Java. Genera pginas HTML basadas en las declaraciones y comentarios javadoc, con el formato /** comentarios */:
/** Comentarios sobre la clase

@autor: Ignacio Cruzado

*/

class MiClase {

La documentacin que genera es del mismo estilo que la documentacin que se obtiene con el JDK. Las etiquetas, que se indican con una arroba (@), aparecern resaltadas en la documentacin generada. Su sintaxis es: javadoc Opciones NombreArchivo

Opciones: Opciones sobre qu documentacin ha de ser generada. NombreArchivo: Paquete o archivo de cdigo fuente Java, del que generar documentacin.

i.) Applets de demostracin

El JDK incluye una serie de applets de demostracin, con su cdigo fuente al completo.
j.) Cdigo fuente la API

El cdigo fuente de la API se instala de forma automtica, cuando se descomprime el JDK, aunque permanece en formato comprimido en un archivo llamado "scr.zip" localizado en el directorio Java que se cre durante la instalacin. C. Uso del JDK Ya se han visto las diferentes partes de que est compuesto el JDK, pero para el desarrollo de una aplicacin final Java (ya sea una aplicacin o una applet),

deberemos utilizar las diferentes herramientas que nos proporciona el JDK en un orden determinado. En el siguiente diagrama podemos ver la sucesin de pasos para generar un programa final Java:

Imagen 19: Utilizacin del JDK

D. Obtencin e instalacin del JDK El JDK se puede obtener de las pginas de Sun (http://java.sun.com), y existen versiones disponibles para varias plataformas entre las que se encuentran:

Microsoft Windows 95 y NT 4.0 Sun Solaris 2.4 SPARC o 2.5 al 2.6 sobre x86 o SPARC. IBM AIX, OS/400 y OS/390 Linux

Si su sistema operativo no ha sido enumerado, por favor consulte a su fabricante, pues Sun tiene previsto desarrollar su JDK para ms plataformas. La instalacin es diferente para cada sistema operativo, pero en general muy sencilla. Se recomienda observar y establecer los valores de las variables de entorno:

PATH: Variable de entorno que indica desde qu ruta (adems del directorio actual) se pueden ejecutar los programas CLASSPATH: Indica al compilador Java en qu rutas se encuentran los ficheros de clase.

E. Novedades en la versin 1.2 del JDK (Java 2) La aparicin de la versin 1.2 del JDK (diciembre de 1997) significa un salto importante en las capacidades de Java, hasta tal punto que comercialmente se conoce a esta evolucin como "Java 2".
a.) Clases

Se ampla el paquete de clases de JFC(Java Foundation Classes) pasando de 23 a 70 clases. Aparecen nuevos paquetes de la API de Java:

Swing: Nuevo paquete de grficos. Java 2D: Ampliacin de AWT. Java Collections: Incluye nuevas clases que representan estructuras de datos clsicas de la programacin: Vector, ArrayList, ArraySet, TreeMap...

b.) Eficiente ejecucin

Compatible con programas realizados en otras versiones, tanto en cdigo como en ejecucin.

Compilador ms estricto y que genera un cdigo ms optimizado. Entorno de ejecucin ms rpido y estable (mquina virtual), prximo a la velocidad de ejecucin de C++, especialmente utilizando los nuevos compiladores Just In Time (JIT), incorporados en las nuevas JRE, que compilan las clases para las plataformas locales, aumentando su velocidad de ejecucin. Mejora en la gestin de la seguridad: Control de acceso basado en el plan de accin, soporte para certificados X509v3 y nuevas herramientas y certificados de seguridad. Mejor tratamiento de sonido. Ms velocidad de las clases que utilizan RMI. Y por supuesto se solventan errores de versiones pasadas.

c.) JavaBeans

Java Plug-in: Permite que las applets y los JavaBeans de una red utilicen el JRE 1.2, en vez de la mquina virtual del navegador en que se muestren. Se permite a los JavaBeans interactuar con applets y se les da un mejor soporte en tiempo de diseo y en tiempo de ejecucin. Los JavaBeans se pueden incluir unos en otros.

d.) Otros

IDL (Interface Definition Language): Para interactuar con CORBA de una forma simple y prctica se utiliza Java. JCE (Java Criptography Extensions): Se ofrecen mejores posibilidades para el tratamiento seguro de la informacin. RMI (Remote Method Invocation): Permite realizar acciones sobre objetos remotos, incluso mediante SSL (Security Socket Layer) un conocido sistema de seguridad de comunicacin. Tecnologa de ayuda. Mejor soporte de arrastrar y soltar. Otros servicios varios.

e.) Observaciones

Aunque no existen incompatibilidades importantes, s que se pueden observar que algunas cosas que en otras versiones no funcionaban bien o se permitan ahora se desaprueban. Entre otros conviene destacar:

No se pueden declarar mtodos abstractos como native, private, final ni syncronzed.

No se recomienda la utilizacin de finalize{} en la gestin de excepciones. El paquete Swing en algunas versiones intermedias apareca colgando de com.sun.java.* o de java.awt.swing.* y ahora pasa a ser javax.swing.*

APNDICE II: HERRAMIENTAS DE DESARROLLO A. Programas de navegacin


a.) Introduccin

Las applets Java no seran de mucha utilidad sin programas de navegacin compatibles con Java. Por lo tanto, para que Java funcione necesita de estos programas de navegacin, que afortunadamente se han comprometido a apoyarlo.
b.) Netscape Navigator

Es un programa de navegacin con apoyo completo a Java. Adems del simple apoyo al lenguaje y sistema de tiempo de ejecucin, tambin ha ayudado en el desarrollo de JavaScript, que es un lenguaje de comandos basado en objetos Java. El objetivo de JavaScript es permitir el desarrollo rpido de aplicaciones distribuidas cliente servidor. Para ms informacin consultar http://home.es.netscape.com/
c.) Microsoft Internet Explorer

Microsoft tard un poco en desarrollar una herramienta para Java: Internet Explorer. Est estrechamente ligado al sistema operativo Microsoft Windows 95, y est completamente integrado en la versin Windows 98 del mismo. Para ms informacin consultar http://www.microsoft.com/
d.) HotJava

Es el contendiente de Sun. Se dise inicialmente como un experimento en el desarrollo del programa de navegacin de Java. Se ha convertido en un prometedor modelo de lo que depara el futuro para los programas de navegacin de la Web. Ser el programa de navegacin existente ms compatible con Java. Constituye un til campo de pruebas para los programadores de Java. Es capaz de gestionar e interactuar de forma dinmica con nuevos tipos de objeto y protocolos Internet.

Para ms informacin consultar http://www.sun.com/


e.) Spyglass Mosaic

Fue el primer navegador de Internet, y ya est disponible con apoyo a Java. Para ms informacin consultar http://www.spyglass.com/ B. Entornos de desarrollo
a.) Introduccin

Los desarrolladores se han acostumbrado a las herramientas grficas de programacin, y aunque el JDK es suficiente para desarrollar Java, se han creado muchos entornos de desarrollo (IDEs) para este lenguaje. La mayor parte de los participantes en el negocio de herramientas de programacin han anunciado algn tipo de entorno de desarrollo para Java. Parte de ese apoyo ha llegado en forma de mdulos adicionales para productos ya existentes, mientras que otra parte consistir en productos totalmente nuevos. En este apartado se comentan algunos de los ms valorados, y se indican otros por si el lector desea buscar algo con unas caractersticas muy especficas.
b.) Visual Caf de Symantec

La empresa Symantec, dura competidora en los IDE de Java ofrece el entorno visual de desarrollo Java Visual Caf, que ya goza de una gran reputacin entre los desarrolladores de Java. Integra de forma transparente las herramientas del JDK, presentndolas en formato grfico. Las principales funciones que soporta son las siguientes:

Editor de programacin grfica: Posee todas las caractersticas de un moderno editor de programacin: sintaxis a todo color, resaltado de palabras clave, lenguaje macro integrado para ampliar el editor... Editor de clases y jerarquas: Navega con rapidez a travs del cdigo Java, permitiendo trabajar directamente con clases o miembros de clases en lugar de archivos individuales; este editor localiza el cdigo fuente correspondiente y lo carga. Adems gestiona y visualiza las relaciones

lgicas entre clases. Depurador grfico: Gran ventaja sobre el jdb que es modo lnea. Gestor de proyectos: Permite organizar proyectos Java con mayor efectividad. Soporta proyectos dentro de proyectos, por lo que puede mantenerse al da con bibliotecas anidadas y dependencias de proyectos. Asistentes: Para creacin de eventos, bases de datos, applets...

Para ms informacin, consltese http://cafe.symantec.com/


c.) Visual J++ de Microsoft

Es la nueva herramienta de Microsoft para desarrollar Java en sus sistemas operativos Microsoft Windows. Se encuentra incluido en el paquete de desarrollo Microsoft Visual Studio, y es directo heredero del tan extendido Microsoft Visual C++. Presenta el serio problema de que no respeta las especificaciones de clases de Sun, lo que ha llevado a ambas compaas a juicio; en lugar de utilizar las clases del JFC, Microsoft se ha inventado un nuevo paquete WFC(Windows Foundation Classes), para el desarrollo en la plataforma Windows, rompiendo la portabilidad. Para ms informacin consultar http://www.microsoft.com/
d.) JBuilder de Borland

La empresa Borland es la desarrolladora de populares entornos de desarrollo de C++ y Delphi para Windows. Borland ha optado por desarrollar un producto totalmente nuevo para los desarrolladores de Java; JBuilder. JBuilder ha sido desarrollado totalmente en Java, lo que permite a Borland salir del mercado del PC y comercializar JBuilder en todas las plataformas soportadas por Java. Presenta gran conectividad con las bases de datos, soportando incluso CORBA. Tiene un programa de desarrollo de JavaBeans con ms de 200 prediseados. Realmente es un producto muy completo de desarrollo de Java, y se distribuye en dos versiones (standard y Cliente/Servidor). Para ms informacin, consltese http://www.borland.com/jbuilder/

e.) Java Studio de Sun

Entorno muy intuitivo y prctico, en el que casi la mayora de las tareas se realizan mediante el ratn. Es muy fcil crear aplicaciones sencillas con este IDE, pero se necesita tener una versin del JDK previamente, y tiene unos requisitos hardware bastante altos. Para ms informacin consltese http://www.sun.com/
f.) VisualAge for Java de IBM

Es una RAD (Rapid Aidded Design), que aunque tiene muchas de las caractersticas del Visual Caf, con una interfaz un poco ms limpia. Permite disear la interfaz de la aplicacin o applet, y definiendo el sistema de eventos, la herramienta puede crear cdigo Java. Es muy sencillo de manejar y uno de los ms potentes del mercado. Para ms informacin, consltese http://www.ibm.com/ad/vajava/
g.) Y muchos ms...

Los IDE estn en continuo desarrollo, y seguro que tras la finalizacin de este tutorial ya han aparecido muchos ms en el mercado. Algunos de ellos son:

CodeWarrior de Metrowerks: Entorno de desarrollo Java para Macintosh, basado en Codewarrior C++. http://www.metrowerks.com/ Roaster de Natural Intelligence: Entorno de desarrollo Java para Power Macintosh. http://www.natural.com/page/products/roaster/ Cosmo de Silicon Graphics: Conjunto de herramientas de desarrollo Cosmo con dos bibliotecas propias. http://www.sgi.com/products/cosmo/ SuperCede de Asymetrix: Un producto a bajo precio, con algunos tutoriales. http://www.asymetrix.com/sales/ Java Maker: Sencillo entorno de desarrollo que funciona bajo Windows 95/NT, creado por Heechang Choi. http://net.info.samsung.com.kr/~hcchio/Javamaker.html Ed de Soft As It Gets: Editor muy potente para Windows, aunque flojo en otros aspectos. http://www.ozwmail.com.au/~saig Mojo de Penumbra Software: Entorno visual para crear applets, fcil de

usar. http://www.PenumbraSoftware.com Jamba de AimTech: Constructor grfico de applets, con mucha documentacin. http://www.aimtech.com/prodjahome.html

La informacin de este apartado ha sido extrada de [Rojo, 1998], [Morgan, 1999] y [Zolli, 1997]. Se recomienda al lector que busque en Internet en las direcciones: http://www.developer.com/news/userchice/n_userframe.html: Lista de los entornos de desarrollo preferidos por los desarrolladores de Java. http://www.yahoo.com/Business_and_Economy/Companies/Computes/Software/ PRogramming_Tools/Languages/Java: Lista de ltimas herramientas Java. C. Bibliotecas de programacin Java est orientado a objetos, por lo que es importante no ignorar el potencial de volver a utilizar objetos Java. De hecho ya estn apareciendo algunas bibliotecas comerciales de objetos Java. Por ejemplo, la empresa Dimensin X cuenta con tres bibliotecas de clases Java:

Ice: Paquete de representacin de grficos tridimensionales. Liquid Reality: Kit de herramientas VRML. JACK: Herramienta para crear applets Java a travs de una interfaz sencilla.

APNDICE III: MTODOS NATIVOS JAVA (JNI) A. Introduccin Aunque la potencia de la API de Java es ms que suficiente para casi todo tipo de aplicaciones, algunas de ellas necesitan utilizar la potencia especfica de una plataforma en concreto, por ejemplo para conseguir un poco ms de velocidad y eficiencia. Java permite incorporar en sus programas fragmentos de cdigo nativo es decir, cdigo compilado para una determinada plataforma, generalmente escrito en C/C++. As se puede utilizar cdigo especfico de una plataforma, bibliotecas ya escritas...

Para ello Java cuenta con el JNI (Java Native Invocation). Hay que tener en cuenta que una aplicacin que utilice este tipo de mtodos estar violando las directrices de seguridad de la mquina virtual Java, motivo por el que no se permite incluir mtodos nativos en applets de Java. Para agregar mtodos nativos Java a una clase de Java han de seguirse los siguiente pasos: 1. Escritura del programa Java, invocando mtodos nativos como native. 2. Compilacin del programa Java. 3. Creacin de un archivo de cabecera nativo (.h) 4. Escritura de los mtodos nativos. 5. Creacin de una biblioteca con esos mtodos nativos. 6. Ejecucin del programa Java. B. Ejemplo de uso de mtodos nativos Para mostrar cmo utilizar los mtodos nativos, vamos a crear un pequeo programa, escrito con mtodos nativos, que lo nico que hace es imprimir "Hola Mundo!!!". Para ello vamos a utilizar el JDK y un compilador de C. Se advierte al lector que no se deje engaar por la simpleza del ejemplo que se va a desarrollar, porque la potencia del JNI va mucho ms all de lo que estas lneas dejan entrever. Para ms informacin consulte [Morgan, 1999].
a.) Escritura del programa Java

Escribimos el programa Java en un fichero denominado HolaNativo.java. El cdigo Java que vamos a utilizar ser:
public class HolaNativo{

public native void diHola();

static {

System.loadLibrary("LibHola");

public static void main( String[] args ) {

new HolaNativo().diHola();

El mtodo nativo diHola() no tiene cuerpo porque ser aadido mediante una biblioteca nativa denominada LibHola. Dicha biblioteca nativa es cargada mediante la sentencia loadLibrary(), sentencia que ha sido incluida como static para que sea ejecutada cada vez que se cree una instancia (objeto) de esta clase. El programa principal tan slo instancia un objeto de esta clase y utiliza el mtodo nativo que imprime la cadena de "Hola Mundo!!!".
b.) Compilacin del programa Java

Ahora ya es posible compilar la clase Java HolaNativo que fue creada mediante la sentencia (utilizando el JDK):

javac HolaNativo.java
c.) Creacin de un fichero de cabecera nativo (.h)

Un fichero de cabecera nativo es un fichero que habitualmente tiene la extensin ".h". En un fichero de este tipo se definen en C/C++ las interfaces pblicas (clases, mtodos o funciones, variables globales, constantes...). La herramienta javah incluida en el JDK es capaz de crear automticamente un fichero de cabecera para mtodos nativos Java, con slo invocarla indicando el nombre de la clase de la que extraer las cabeceras nativas: javah HolaNativo Esta operacin crea un fichero HolaNativo.h que ser til para crear los mtodos nativos. Hay dos lneas importantes dentro de este fichero: #include <jni.h> JNIEXPORT void JNICALL Java_HolaNativo_diHola(JNIEnv*,jobject); La primera lnea importa una biblioteca JNI que valdr a C/C++ para saber cmo crear los mtodos nativos. La segunda lnea corresponde al mtodo nativo que definimos. Los mtodos nativos suelen denominarse siempre como Java_Paquete_Clase_Metodo() aunque en este caso al no haber paquete esta parte se ha omitido. As mismo los mtodos nativos reciben como parmetros JNIEnv* y jobject que permitirn al mtodo nativo comunicarse con su entorno.
d.) Escritura de los mtodos nativos

Se ha de crear un fichero fuente nativo, en el que se defina el cuerpo de la funcin que actuar como mtodo nativo. Este fichero lo denominaremos HolaNativo.c:
#include <jni.h>

#include "HolaNativo.h"

#include <stdio.h>

JNIEXPORT void JNICALL Java_HolaNativo_DiHola( JNIEnv* e, jobject o ){

printf("Hola Mundo!!!\n");

En este programa se incluyen tres bibliotecas: La de JNI (jni.h), el fichero de cabecera ya creado (HolaNativo.h) y una biblioteca de C para imprimir (stdio.h). Ser puede observar que el cuerpo del mtodo nativo lo que hace es invocar a la funcin de C printf() que imprimir por pantalla la cadena "Hola Mundo!!!".
e.) Creacin de una biblioteca con esos mtodos nativos

Cada compilador de C o C++ tiene su propia herramienta para crear bibliotecas compartidas (DLL en Windows o SO en UNIX). Para crear la biblioteca se ha de compilar el fichero fuente nativo, y luego crear la biblioteca compartida mediante el programa correspondiente a su compilador. Para esto cada compilador tiene su propia sintaxis, con lo que se tendr que consultar la documentacin del compilador en lo referente a la creacin de bibliotecas. En cualquier caso algunos ejemplos de compilacin en bibliotecas son: Para el GCC de Solaris:

cc -G HolaNativo.c -o libHola.so Para Microsoft Visual C++ para Windows: cl -LD HolaNativo.c -Fe libHola.dll En cualquier caso asegrese que la biblioteca creada tiene el mismo nombre con que se la invoca desde el archivo de clase Java en el mtodo loadLibrary().
f.) Ejecucin del programa Java

Para ejecutar este programa, debe invocarse: java HolaNativo Con lo que se muestra por pantalla: Hola Mundo Se puede observar que la forma de creacin, compilacin y ejecucin de la clase Java es igual que la utilizada para crear una aplicacin Java normal, solo que al incluir mtodos nativos, han de crearse bibliotecas y ficheros de cabecera antes de ejecutar el programa. APNDICE IV: GUA DE REFERENCIA DE C++ A JAVA A. Introduccin La sintaxis de Java resulta muy familiar a los programadores de C++, debido mayoritariamente a que Java proviene de C++. Sin embargo Java pretende mejorar a C++ en muchos aspectos (sobre todo en los aspectos orientados a objeto del lenguaje), aunque prohibe muchas de las tareas por las que C++ fue tan extendido. Se observa que las diferencias han sido diseadas como mejoras del lenguaje, ya que uno de los aspectos ms criticado (y defendido) de C++ es su capacidad para hacer cosas "no orientadas a objetos", as como acceder a los recursos de las mquinas (lo que le permita atacar sistemas, siendo uno de los lenguajes ms difundidos entre los programadores de virus). En este apndice pretendemos mostrar aquellas diferencias significativas, para que los programadores familiarizados con C++ puedan programar en Java,

conociendo sus posibilidades y limitaciones. B. Diferencias sintticas


a.) Elementos similares

Uso de bibliotecas (paquetes): Como no existen macros como #include, se utiliza import. Operador de herencia: La herencia en Java se especifica con la palabra clave extends, en lugar del operador :: de C++. Constantes: En lugar de const de C++ las variables constantes se declaran como static final.
b.) Elementos equivalentes

Miembros estticos: No es necesaria declaracin previa (fuera de las clases) de los miembros estticos (static). Mtodos inline: En Java no existen (hay que incluir el cuerpo de los mtodos junto a su definicin), aunque los compiladores Java suelen intentar expandir en lnea (a modo de los mtodos inline) los mtodos declarados como final. Mtodos virtuales: Todos los mtodos no estticos (static) se consideran virtual en Java. Forward: No existe en Java. Simplemente se llama el mtodo, y el compilador se encarga de buscarlo. Clases anidadas: Aunque Java no permite anidar clases, s que se puede modelizar este concepto mediante los paquetes Java y la composicin. No existen "amigos" (friend): Es su lugar se considera amigas a todas las clases y elementos que componen un paquete.
c.) Elementos aadidos

Comentarios: Java soporta los dos tipos de comentarios de C++, e incorpora un tercero, con la sintaxis /** comentario */, para la documentacin automtica. Operador >>> : Java aade este operador para desplazamientos a la derecha sin

signo. Iniciacin: Todos las variables de tipo simple y las referencias a objeto se inician a un valor 0 (o equivalente), y null para las referencias a objeto. Referencia super: En Java super hace referencia a la superclase (clase padre) de la clase actual. Dicha clase slo puede ser una, porque Java solo soporta herencia simple.
d.) Elementos suprimidos

goto: No existe en Java, aunque con break y continue, combinados con etiquetas de bloque, se puede suplir. Condiciones: Deben utilizarse expresiones booleanas y nunca nmeros. Argumentos por defecto: Java no los soporta. C. Diferencias de diseo
a.) Tipos de datos

Tipos simples: Soporta los mismos que C++, aadiendo boolean (true/false), y ampliando el tipo char, para soportar caracteres Unicode de 16 bits. Punteros: En Java no hay punteros, permitiendo as programacin segura. En su lugar se crean las referencias a objeto, que pueden ser reasignadas (como si fueran un puntero a objeto de C++). Vectores: Son objetos de slo lectura, con un mtodo length() para averiguar su longitud, y que lanzan una excepcin si se intenta acceder a un elemento fuera del vector. Clases: Todo debe de estar includo en clases; no existen enumeraciones (enum) ni registros (struct). Elementos globales: No existen variables o funciones globales, aunque se puede utilizar static para simularlas.
b.) Diseo de las clases

Cuerpo de los mtodos: Todos los cuerpos de las clases han de estar codificados en las definiciones de las clases. No se pueden separa como se hace en C++

mediante ficheros de cabecera (".h"). Constructores: Aunque existen constructores, como en C++, no existen constructores copia, puesto que los argumentos son pasados por referencia. Destructores: No existen destructores en Java, ya que tiene recoleccin automtica de basura, aunque en su lugar se pueden escribir mtodos finalize(), que sern ejecutados cuando el recolector de basura de Java destruya el objeto. rbol de herencia: En Java todas las clases se relacionan en un nico rbol de herencia, en cuya cspide se encuentra la clase Object, con lo que todas las clases heredan de ella. En C++ sin embargo se pueden declarar clases que no tengan padre. Herencia no restrictiva: Al heredar, no se puede reducir las ocultaciones del padre: En C++ s se podra ampliar la visibilidad de uno de los elementos heredados. En todo caso s se puede restringir. Herencia simple de clases: No existe la herencia mltiple de clases. An as se puede implementar una herencia mltiple utilizando interfaces, dado que ellas s la soportan. Sobrecarga de mtodos: Es exactamente igual que la de C++. Sobrecarga de operadores: No existe. En los objetos String el operador + y += se permiten para la comparacin de cadenas.
c.) Nuevos diseos

Plantillas (templates): En Java no se soportan plantillas p clases genricas de C++, aunque existen una serie de clases en la API de Java que tratan objetos genricos (clase Object) como Vector o Stack. Interfaces (interface): Que son unas especies de clases abstractas con mtodos abstractos, y que permiten herencia mltiple, utilizando la palabra reservada implements. Diferente gestin de excepciones: Todas las excepciones de Java heredan de la clase Throwable, que las dota de una interfaz comn. D. Diferencias de ejecucin

a.) Aspectos modificados:

Cadenas: Las cadenas entrecomilladas se convierten en objetos String, no en vectores estticos de caracteres. Instanciacin: Los objetos se crean en el montculo (new) y nunca en la pila (malloc), y los tipos simples no permiten new (excepto los vectores de tipos simples, iguales que los de C++). Intrprete: Los intrpretes Java son unas 20 veces ms lentos que los de C, aunque esta diferencia se est reduciendo con lo compiladores JIT(Just In Time) para Java que estn apareciendo en el mercado. Bibliotecas estndar: En C++ exista casi una biblioteca por plataforma (si exista) para hacer cosas como: Trabajo en red, conexin a bases de datos, uso de mltiples hilos de control, uso de objetos distribudos o compresin. Java incorpora bibliotecas estndar multiplataforma para todas estas tareas en su API. Excepciones por fallos de descriptores: Java lanza excepciones cuando hay errores en el acceso a un descriptor, permitiendo al programador gestionar dichos fallos, y recuperar al programa de ellos. Gestin de errores al compilar: Adems comprobar el lanzamiento de excepciones en tiempo de compilacin, comprueba el cumplimiento del lanzamiento de excepciones por los mtodos sobreescritos.
b.) Aspectos eliminados:

Preprocesador: Java no tiene preprocesador, por lo que las macros (#include, #define,...) no existen. Acceso directo al hardware: En Java est restringido, aunque para eso permite la utilizacin de mtodos nativos, escritos para la plataforma (normalmente C/C++). En cualquier caso las applets no pueden utilizar estos mtodos nativos, slo las aplicaciones Java pueden hacerlo.
c.) Aspectos introducidos

Multiples hilos de control (multithreating): Java permite la utilizacin de mltiples hilos de control y la ejecucin en paralelo (y sincronizada) de mltiples tareas, mediante la clase Thread.

Applets Java: Este tipo de aplicaciones son seguras, distribubles por Internet y ejecutables por los navegadores, aunque tienen restricciones (como la escritura en disco). Extraccin automtica de documentacin: Un nuevo tipo de comentario (/**com_doc*/) permite a los programadores extraer de manera automtica comentarios de sus fuentes, generando automticamente documentacin estandarizada. JavaBeans: Mediante esta biblioteca se permite crear elementos visuales multiplataforma, algo impensable en C++. APNDICE V: GUA DE REFERENCIA DEL LENGUAJE JAVA A. Fundamentos Palabras reservadas (funcionales):
abstact catch do final implements long private static throw volatile boolean char double finally import native protected super throws while break class else float instanceof new public switch transient byte continue extends for int null return syncroniced try case default false if interface package short this void

Tipos de comentarios:
/*comentario*/ // Hasta fin de lnea //* javadoc */

Bloques de cdigo: { // conjunto de sentencias

} Separadores Java: { } , : ; Propuestas de estilo de nombres de identificadores:


Las clases: Clase o MiClase. Los mtodos: metodo() o metodoLargo(). Las variables: altura o alturaMedia. Las constantes: CONSTATE o CONSTANTE_LARGA. Los paquetes: java.paquete.subpaquete.

B. Tipos de datos
Tipo byte short int long float double char boolean bytes 1 2 4 8 4 8 2 1 Tipo Datos Entero Entero Entero Entero Coma flotante Coma flotante Caracter Booleano Rango (positivo) 127 32767 2.147.483.647 9.233e15 1.4e-45 a 3.4e38 4.9e-324 a 1.7e308 Unicode true o false Literal 14 14 14 14 36,6 3,14e2 'a' o \064 true o false

Vectores: int vectorNumeros[]=new int[numero]; Cadenas Constates: String nombreBonito = "Amelia"; Cadenas Variables: StringBuffer cadenaVariable = "Cambiante";

C. Operadores Operadores Unarios:


Operador + Descripcin (prefija) Convierte el operador a int Niega aritmticamente oper. Operador ++ -Descripcin (pre o posfija) Incrementa operador Decrementa operador

Operadores aritmticos (binarios):


Operador + * / % Uso op1 + op2 op1 - op2 op1 * op2 op1 / op2 op1 % op2 Atajo op1 += op2 op1 -= op2 op1 *= op2 op1 /= op2 op1 %= op2 Descripcin Suma op1 y op2 Resta op2 de op1 Multiplica op1 por op2 Divide op1 por op2 Resto de op1 / op2

Operadores de comparacin (binarios):


Operador > >= < <= == != && & || | ! Uso Devuelve verdadero si op1 > op2 op1 es mayor que op2 op1 >= op2 op1 es mayor o igual que op2 op1 < op2 op1 es menor que op2 op1 <= op2 op1 es menor o igual que op2 op1 == op2 op1 y op2 son iguales op1 != op2 op1 y op2 son distintos op1 && op2 AND, condicionalmente evala op2 op1 & op2 AND, siempre evala op1 y op2 op1 || op2 OR, condicionalmente evala op2 op1 | op2 OR, siempre evala op1 y op2 ! op op es falso

Operadores de bit (binarios):


Operador >> << >>> Uso op1 >> op2 op1 << op2 op1 >>> op2 Operacin Desplaza los bits de op1 a la derecha op2 veces Desplaza los bits de op1 a la izquierda op2 veces Desplaza los bits de op1 a la derecha op2 veces (sin

& | ^ ~

op1 & op2 op1 | op2 op1 ^ op2 ~op2

signo) AND OR "XOR" Complemento

Operador terciario: expresion ? sentencia_si : sentencia_si_no Precedencia de operadores:


Tipo de operadores Operadores posfijos Operadores unarios Creacin o conversin Multiplicacin Suma Desplazamiento Comparacin Igualdad AND a nivel de bit OR a nivel de bit XOR a nivel de bit AND lgico OR lgico Condicional Asignacin Operadores de este tipo [ ] . (parametros) expr++ expr-++expr --expr +expr -expr ~ ! new (tipo) expr */% +<< < <= = instanceof == != & ^ | && || ?: = += -= *= /= %= &= ^= |= <<= = =

D. Estructuras de control Toma de decisin (if-else y switch):


if ( condicin ) {

Bloque de cdigo a ejecutar si la condicin es cierta

else {

Bloque de cdigo a ejecutar si no

switch ( expresionMultivalor ) {

case valor1 : conjuntoDeSentencias; break;

case valor2 : conjuntoDeSentencias; break;

case valor3 : conjuntoDeSentencias; break;

default : conjuntoDeSentencias; break;

Bucles iterativos (while, do-while, for):


while ( expresinBooleana ) {

sentencias;

};

do {

sentencias;

} while ( expresinBooleana );

for(inicio; condicion_continuacion; sentencia_actualizacion) {

sentencias;

Sentencias de saltos: etiquetaSentencia: sentenciaEtiquetada break nombreEtiqueta; // Sale del ltimo bucle continue; // Hace otra pasada al ltimo bucle return valor; // Sale del mtodo devolviendo valor

E. Clases Definicin de clase:


acceso class NombreDeClase herencia{

acceso tipo nombreAtributo1;

NombreDeClase{ // Constructor

// . . .

finalize { //Recogida de basura

acceso tipo_devuelto nombreMtodo1( parmetros ) {

cuerpo_del_mtodo1;

Tipos de acceso de las clases:


final: Sin subclases abstract: Clase abstracta, luego no se permiten instancias de esta clase. public: Accesible desde fuera de su paquete

Herencia:

extends: Clase padre. La clase Object es superclase de todas las clases Java (raz del rbol de herencia). implements: Interfaces padres, separadas por comas; Interface1, Interface2.

class MiClase extends SuPadre implements Interface0,Interface1; F. Atributos Acceso (igual que para mtodos):

public: Los miembros declarados public son accesibles en cualquier lugar en que sea accesible la clase, y son heredados por las subclases. private: Los miembros declarados private son accesibles slo en la propia clase. protected: Los miembros declarados protected son accesibles slo para sus subclases

Composicin:
class claseCompuesta {

claseComponente referenciaAObjetoComponente.

G. Mtodos Referencias vlidas en los mtodos:


this: Referencia al objeto actual. super: Referencia a la clase padre en el rbol de herencia.

Modificadores permitidos:

Acceso: public private o protected. Igual que para los atributos. abstract: Mtodo abstractos, sin cuerpo. Slo se permiten en clases abstractas. final: No se puede sobreescribir el mtodo. static: Mtodo de la clase (no de los objetos). native: Mtodo implementado con mtodos nativos (especficos de una plataforma). synchronized: Solamente permite un hilo de ejecucin.

Sobrecarga del mtodo: Varias implementaciones en funcin de los parmetros. Sobreescritura del mtodo: Un cuerpo en cada nivel de herencia. H. Objetos Instanciacin: NombreDeClase referenciaAObjeto = new NombreDeClase(); Acceso al objeto: referenciaAObjeto.mtodo( parmetros ); referenciaAObjeto.atributo; Destruccin: Cuando la referencia a objeto sale de mbito en el programa.

I. Interfaces Declaracin de una interfaz:


interface MiInterfaz {

int CONSTANTE = 100;

int metodoAbstracto( int p ); // Por definir

Implementacin de interfaces:
class ImplementaInterfaz implements MiInterfaz{

int m=CONSTANTE;

int metodoAbstracto( int p ){ return ( p*m ); }

Herencia mltiple entre interfaces: interface InterfazMultiple extends Interfaz0,Interfaz1; Clases de envoltura de tipos simples:

Clases de envoltura de tipos simples Double Float Integer Long Character Boolean double float int, short, byte long char boolean

J. Paquetes Creacin de un paquete (primera sentencia de un fichero fuente): package NombrePaquete; Importacin de un paquete o parte de l: import Paquete.Subpaquete1.Subpaquete2.Clase1; Paquete.Subpaquetes1.Subpaquete2.Clase_o_Interfaz.elem ento Visibilidad en los paquetes:
Situacin del elemento En la misma clase En una clase No en el mismo paquete En una clase hija No en otro paquete En una clase no hija No en otro paquete No No S No S S S S S private S por defecto protected S S public S

K. Excepciones

Tipos de excepciones:

Error: Excepciones que indican problemas muy graves, que suelen ser irrecuperables y no deben casi nunca ser capturadas. Exception: Excepciones no definitivas, pero que se detectan fuera del tiempo de ejecucin. RuntimeException: Excepciones que se dan durante la ejecucin del programa.

Lanzamiento de una excepcin:


metodoLanzador() throws MiException{

throw MiException:

Tratamiento de una excepcin:


try {

// Cdigo posiblemente problematico

} catch( tipo_de_excepcion e) {

// Cdigo para solucionar la excepcion e

} catch( tipo_de_excepcion_mas_general e)

// Cdigo para solucionar la excepcion e

} finally {

// Se ejecutara tras try o catch

L. Threads Creacin: 1. Para crear un thread, se ha de implementar una clase, extendiendo la clase base Runnable, y crear un objeto de la clase Thread. 2. Este objeto representar un nuevo hilo de control, que ser accionado cuando invoquemos al mtodo start() del thread. 3. En ese momento este hilo se activar, ejecutando (si el planificador de hilos considera que es el momento), el mtodo run() de la clase en que todo esto suceda. Sincronizacin de procesos: 1. Durante la ejecucin de un programa, muchas veces varios procesos han de realizar tareas de una forma sincronizada, actuando en un determinado orden. 2. Para ello se han de declarar mtodos como syncronized. 3. Mediante la utilizacin de excepciones, y de las funciones wait() y notifiy(), respectivamente esperarn a que otro proceso acabe antes de continuar su ejecucin. GLOSARIO Abstract Windowing Toolkit (AWT).- Biblioteca de mdulos pera representar

interfaces grficos provisto por Sun en la API de Java. Administrador de Seguridad.- Parte de la mquina virtual Java responsable de velar por el cumplimiento de las polticas y reglas de seguridad. mbito.- Parte de un programa en el que es vlida una referencia a una variable. American Standard Code for Information Interchange (ASCII).- Sistema de codificacin que convierte caracteres a nmeros en el rango de 0 a 127. Es una parte del cdigo ANSI que se ampla hasta los 257 caracteres. Anlisis.- Proceso de conocer los requerimientos de software que tienen el cliente y el usuario final. API.- Application Programming Interface. Aplicacin.- Programa informtico, que se ejecuta sin necesidad de otro programa Applet.- Programa informtico que se ejecuta necesitando de otro programa, normalmente un navegador. Application Programming Interface (API).- Conjunto de paquetes y clases Java, incluidos en el JDK que utilizan los programadores Java para realizar sus aplicaciones. rbol.- Estructura de datos, grafo no cclico, con forma de rbol (nodos padres e hijos). Argumentos.- Parmetros. Array.- Vector. ASCII.- American Standard Code for Information Interchange. AWT.- Abstract Windowing Toolkit. BDK.- Beans Developer Kit. Beans Developer Kit (BDK).- Conjunto de herramientas para desarrollar JavaBeans.

Bit.- Unidad mnima de informacin digital que puede tomar los valores lgicos de 0 o de 1. Bloque.- Cdigo localizado entre corchetes. Boolean.- Tipo de datos bi-estado, que puede tomar valor de cierto (true) o falso (false). Byte.- Secuencia de 8 bits. Cadena.- Secuencia de caracteres. Carcter.- Smbolo que representa informacin, o la codificacin en una computadora. Normalmente letras de alfabeto, nmeros o signos ASCII. Cargador de clases.- Parte del JRE de Java responsable de encontrar archivos de clase y cargarlos en la mquina virtual Java. Casting.- Moldeado. CGI.- Common Gateway Interfaz. Clase.- Unidad fundamental de programacin en Java, que sirve como plantilla para la creacin de objetos. Una clase define datos y mtodos y es la unidad de organizacin bsica de un programa Java. Common Gateway Interfaz (CGI).- Es un lenguaje de programacin que permite dotar a las pginas Web de interactividad, construyendo una pgina Web correspondiente a un enlace de hipertexto en el mismo momento en que se hace "clic" sobre el enlace. Los script cgi pueden estar escritos en cualquier lenguaje de programacin. Common Object Requeset Broker Architecture (CORBA).- Estndar para la conexin entre objetos distribuidos, aunque est codificados en distintos lenguajes. Compilador.- Programa de software que traduce cdigo fuente en un lenguaje de programacin legible por una persona a cdigo mquina interpretable por un ordenador. Constante.- Valor utilizado en un programa de computadoras con la garanta de no cambiar en tiempo de ejecucin. La garanta es a menudo reforzada por el

compilador. En Java las constantes se declaran como static final. Constructor.- Mtodo que tiene el mismo nombre que la clase que inicia. Toma cero o ms parmetros y proporciona unos datos u operaciones iniciales dentro de una clase, que no se pueden expresar como una simple asignacin. Contenedor.- En diseo de interfaces de usuario, es un objeto que contiene los componentes (como botones, barras de deslizamiento y campos de texto). Conversin de tipos de datos.- Modificacin de una expresin de un tipo de datos a otro. CORBA.- Common Object Requeset Broker Architecture. Entero.- Un nmero entero, sin parte decimal, positivo o negativo. Estructura de datos.- Una construccin de software (en memoria o en disco duro) que contiene datos y las relaciones lgicas entre ellos. Evento.- Un mensaje que significa n incidente importante, normalmente desde fuera del entorno de software. Excepcin.- Un evento que ocurre durante la ejecucin de un programa que interrumpe el flujo normal de las instrucciones. Flujo.- Stream. Graphical User Inteface (GUI).- Interfaz grfica de usuario. Hardware.- El aspecto fsico de un sistema de computadora, como el procesador, disco duro e impresora. Herencia mltiple.- La prctica (permitida en lenguajes como C++ pero no en Java) de derivar una clase de ms de una clase base. Herencia.- Mecanismo encargado de relacionar clases entre s de una manera jerrquica. En Java, slo existe herencia simple. Hilo.- Thread. HTML (HyperText Markup Languaje).- Lenguaje que se utiliza para crear pginas Web. Los programas de navegacin de la Web muestran estas pginas de

acuerdo con un esquema de representacin definido por el programa de navegacin. IDE.- Integral Development Environment. IDL.- Java Interface Definition Language. Ingeniera del software.- Rama de la ingeniera concerniente con el anlisis, diseo, implementacin, prueba, y mantenimiento de programas de computadoras. Instancia.- Objeto de software construido desde una clase. Por ejemplo, puede tener una clase avin, pero una flota de quince instancias de avin. Integral Development Enviroment (IDE).- Una herramienta de desarrollo visual en la que un programa puede ser construido, ejecutado y depurado. Interbloqueo.- Condicin en la que dos o ms entidades de software se bloquean mutuamente, cada una esperando los recursos que est utilizando la otra. Interface Definition Language (IDL).- Herramienta mediante la cual los objetos pueden invocar mtodos de otros objetos que se encuentren en mquinas remotas, mediante CORBA. Interfaz grfica de usuario (GUI).- Una interfaz entre la mquina y el hombre como el Windows de Microsoft, el Mac OS, o el Sistema X Windows, que depende de pantallas de alta resolucin, un recurso grfico de puntero como un ratn y una coleccin de controles en pantalla (denominados Widgets) que el usuario puede manejar directamente. Interfaz.- Mecanismo Java para decirle al compilador que un conjunto de mtodos sern definidos en futuras clases. (Esas clases estarn definidas para implementar la interfaz). Java 2D.- Paquete que permite a los desarrolladores incorporar texto, imgenes y grficos en dos dimensiones de gran calidad. Java 3D.- Conjunto de clases para crear aplicaciones y applets con elementos en tres dimensiones. Es parte del JMF. Java DataBase Connectivity (JDBC).- Lenguaje estndar de Java para interactuar con bases de datos, similar al SQL. Es independiente no slo de la

plataforma sino tambin de la base de datos con que interacte. Desde la versin 1.2 del JDK se permite interactuar con ODBC. Java Developer Connection (JDC).- Conexin de desarrollo en la que se publican las versiones beta de las biliotecas de Java que se estn desarrollando. Java Foundation Classes (JFC).- Conjunto de componentes y caractersticas para construir programas con interfaces grficas. Java Media Framework (JMF).- Protocolo de transmisin de datos para la reproduccin multimedia (vdeo y sonido). Java Native Invocation (JNI).- Capacidad de Java para ejecutar cdigo nativo, es decir, cdigo compilado al lenguaje mquina de un determinado ordenador. Permite a la Mquina Virtual Java (JVM) interactuar con programas o bibliotecas escritos en otros lenguajes (C/C++, ensamblador...). No se puede utilizar en applets, pues viola las directrices de seguridad. Java Runtime Environment (JRE).- Software suministrado por Sun que permite a los programas de Java ejecutarse en una mquina de usuario. El JRE incluye la Mquina Virtual Java (JVM). JRE.- Java Runtime Environment. JVM.- Java Virtual Machine. Java Virtual Machine (JVM).- El intrprete de Java que ejecuta los cdigos de byte en una plataforma particular. JavaBeans.- Paquete que permite escribir componentes software Java, que se puedan incorporar grficamente a otros componentes. JDBC.- Java DataBase Connectivity. JDC.- Java Developer Connection. JFC.- Java Foundation Classes. JMF.- Java Media Framewok JNI.- Java Native Invocation.

JVM.- Java Virtual Machine. Llamada por referencia.- Una forma de transferir parmetros a una subrutina en la que se pasa un puntero o referencia a un elemento, de esta forma, la subrutina puede leer y cambiar el valor del elemento referenciado. Llamada por valor.- Una forma de transferir parmetros a una subrutina en la que se pasa la copia del elemento; las modificaciones de la copia no afectan al elemento original. Mtodo.- Conjunto de sentencias que operan sobre los datos de la clase para manipular su estado. Miniaplicacin.- Applet. Modelo.- En diseo orientado a objetos, una representacin del mundo real en unas abstracciones de software denominadas clases y la relacin entre ellas. Moldeado.- Suplantacin del tipo de un objeto o variable por otro nuevo tipo. Multiproceso.- En sistemas operativos, la habilidad de efectuar dos o ms programas independientes, comnmente en un procesador solo (a travs de Multitarea). Navegador Web.- Software que permite al usuario conectarse a un servidor de Web utilizando Hypertext Transfer Protocol (HTTP). Microsoft Internet Explorer, Netscape Navigator, HotJava de Sun, son populares navegadores de Web. Navegador.- Navegador Web. null.- Valor de Java que significa vaco. Object DataBase Conectivity (ODBC). Lenguaje estndar de Microsoft; que utiliza un driver del fabricante de una base de datos, para interactuar con ella, ms orientado a C/C++ que a Java. ODBC.- Object DataBase Conectivity. Paquete.- Nombre de Java para una biblioteca de clases. Parmetros formales.- Nombres utilizados dentro de una subrutina por sus

parmetros. Parmetros.- Valores u objetos pasados entre una subrutina y la rutina de llamada. Plug-in.- Un programa de una plataforma especfica diseado para ser llamado por un navegador Web. Utilizado con frecuencia para mostrar informacin que el mismo navegador no puede mostrar. Poliforfismo.- En diseo orientado a objetos, la habilidad de utilizar una clase derivada en lugar de su clase base. Por ejemplo, un programador puede escribir un mtodo expresarse() para la clase Mamfero. Un Perro, una Vaca y un Gato se derivan de Mamfero, y todos pueden expresarse(), aunque sus voces sean bastantes diferentes. Proceso.- Instancia de un programa ejecutable. Por ejemplo, si inicia dos copias de un intrprete de Java, tiene dos procesos de la mquina virtual de Java ejecutndose en su computadora. Seudocdigo.- Documentacin de diseo que describe el trabajo de un programa en ingls estructurado (o en otro lenguaje) en lugar de un lenguaje de computadora. Recolector de basura.- En Java, el mecanismo por el cual se recobra y libera la memoria asociada con objetos no utilizados. Remote Method Invocation (RMI).- Herramienta que incorpora mtodos Java ara localizar objetos remotos, comunicarse con ellos e incluso enviar objetos como parmetros de un objeto a otro. RMI.- Remote Method Invocation. Secure Sockets Layer (SSL).- Sistema para la creacin de conexiones seguras en red. Servlets.- Mdulos que permiten sustituir o utilizar el lenguaje Java en lugar de programas CGI. Shell.- Intrprete de rdenes de un sistema operativo. Sistema operativo.- Software responsable de asignar a los usuarios los recursos de sistemas de computadoras (incluyendo procesos). UNIX, Windows, NT y Mac

OS, son ejemplos de sistemas operativos. SQL.- Structured Query Language. SSL.- Secure Sockets Layer. Esttico.- En diseo orientado a objetos, representa la pertenencia a la clase, en vez de a una instancia. Es un espacio compartido por todas las instancias de una clase. Stream.- Flujo de datos. Por ejemplo las entradas y salidas de un programa. String.- Objeto Java estandarizado en el lenguaje, que representa una cadena de caracteres. Structured Query Language (SQL).- Lenguaje para realizar consultas a Bases de Datos relacionales. Subclase.- Clase descendiente de otra clase de la que hereda mtodos y variables. Superclase.- Clase de la cual heredan sus mtodos y variables otras clases denominadas subclases. Swing.- Paquete que permite incorporar elementos grficos en las aplicaciones, de una manera ms potente que con el AWT. Aparece en la versin 1.2 del JDK. Es no de los componentes que estn incluidos en las Java Fundation Classes, o JFC. Thread.- Un "proceso ligero" que puede ser arrancado y utilizado ms rpidamente que por un fork o spawn. Vase tambin: fork, spawn y Proceso. Tiempo de vida.- El nmero de lneas sobre las que una variable es activa, esto es, el nmero de lneas entre la primera y la ltima referencia a la variable. Tipo primitivo.- En Java, un tipo de dato que no es un objeto. Los tipos primitivos incluyen caracteres, enteros, nmero de coma flotante y booleanos. UML.- Unified Modeling Language. Unicode.- Conjunto de caracteres de 16 bits, en lugar de los 8 que soportaba ASCII. As se pueden representar la mayor parte de los lenguajes del mundo.

Unified Modeling Language (UML).- Notacin estndar de facto utilizada en el anlisis y diseo orientado a objetos, basado en el trabajo de Grady Booch, James Rumbaugh, e Ivar Jacobson. Vector.- Estructura de datos que coloca un tipo de datos en celdas continuas. Verificador de cdigo de byte.- Rutinas en la mquina virtual de Java, que aseguran que las instrucciones en el archivo de clase no violan ciertas restricciones de seguridad. BIBLIOGRAFA Se ha dividido este apartado en diversos puntos, intentando explicar qu referencias bibliogrficas han sido utilizadas en mayor o menor medida para realizar este tutorial. En cada resea bibliogrfica se indican el nmero de pginas que tiene, y un comentario personal indicando su utilidad para una mayor profundizacin en Java. A. Bibliografa consultada para la actual versin:

[Arnold y Gosling, 1997] Ken Arnold y James Gosling. AddisonWesley/Domo. "El lenguaje de Programacin Java". Wesley Iberoamericana. 1997. 334 pginas. (Muy bsico, escrito por el desarrollador del lenguaje). [Eckel, 1997] Bruce Eckel. "Hands -on Java Seminar". Presindent MindView Inc. 1997. 577 pginas. (Tutorial completo en Ingls en formato PDF). [Garca et al., 1999]. Javier Garci de Jaln, Jos Ignacio Rodrguez, Iigo Mingo, Aitor Imaz, Alfonso Brazlez, Alberto Larzabal, Jess Calleja y Jon Garca. "Aprenda Java como si estuviera en primero". Universidad de Navarra. 1999. 140 pginas. (Tutorial muy bsico, en el que se trata la potencia de Java, pero sin profundizar en ningn tema en particular). [Garca, 1997] Francisco Jos Garca Pealvo. "Apuntes de teora de la asignatura Programacin Avanzada del tercer curso de Ingeniera Tcnica en Informtica de Gestin". Universidad de Burgos. 1997. 216 pginas. (Comentan la teora de la programacin orientacin al objeto. Han sido resumidos para dar una visin de la programacin orientada a objeto en el apartado I.1).

[Johnson, 1996] Jeff Johnson. "Coding Standards for C, C++, and Java". Vision 2000 CCS Package and Application Team. 1996. 14 pginas. (Consejos para el formato de los fuentes Java, C y C++). [Morgan, 1999] Mike Morgan. "Descubre Java 1.2". Prentice Hall. 1999. 675 pginas. (Sin duda muy interesante, sobre todo por su actualidad al tratar con Java 2, y por su extensin al tratar todas las bibliotecas de Java). [Naughton, 1996] Patrick Naughton. "Manual de Java". Mc. Graw Hill 1996. 395 pginas. (Introduce todos los aspectos de la programacin bsica en Java). [Rojo, 1998] Ignacio Rojo Fraile. "Comparativa de herramientas Java". Artculo de la revista Solo Programadores n49. Tower. Octubre 1998. (Compara 5 IDEs Java). [Sanz, 1998] Javier Sanz Alamillo. "Novedades y cambios con Java 2". Artculo de la revista Solo Programadores n55. Tower. Marzo 1999. (Buen resumen de los cambios que han surgido en el JDK 1.2). [Sun, 1998] Sun Microsystems Inc. "JDK 1.2 Documentation". www.sun.com. 1997. (Documentacin de la API de Java del JDK). [van Hoff et al., 1996] Arthur van Hoff, Sami Shaioi y Orca Starbuck. "Hooked on Java". Addison-Weslet. 1996. (Todo lo que hace falta saber para crear applets, con muchos ejemplos. En ingls). [Zolli, 1997] Andrew Zolli. "La biblia de Java". Anaya multimedia. 1997. 814 pginas. (Completo en lo a que biliotecas del JDK 1.1 se refiere).

B. Bibliografa adicional o citada en la actual versin:

[Piattini et al., 1996] Mario G. Piattini, Jos A. Calvo-Manzano, Joaqun Cervera y Luis Fernndez. "Anlisis y diseo detallado de Aplicaciones informticas de gestin". Ra-Ma. 1996. [Rambaugh et al., 1998] J. Rambaugh J., M. Blaha, W. Premerlani, F. Eddy y W. Lorensen. "Modelado y Diseo Orientados a Objetos. Metodologa OMT". Prentice Hall, 2 reimpresin. 1998. [Rational, 1997] Rational Software Corporation. "The Unified Modeling Language Documentation Set 1.1". www.rational.com. Septiembre de 1997. [Rifflet, 1998] Jean-Marie Rifflet "Comunicaciones en UNIX". McGraw Hill. 1998.

C. Bibliografa adicional que se utiliz en la versin 1.0

[Corts et al.,1996] Jos Luis Corts, Nuria Gonzlez, Virginia Prez,

Paqui Villena y Ana Rosa Freire. "Java, el lenguaje de programacin de Internet". Data Becker 1996. [Cuenca, 1996] Pedro Manuel Cuenca Jimnez. "Programacin en Java para Internet". Anaya Multimedia. 1996. [Cuenca, 1997] Pedro Manuel Cuenca Jimnez,. "Programacin en Java". Ediciones Anaya Multimedia. 1997. [Framin, 1997] Jos Manuel Framin Torres. "Manual Imprescindible de Java". Ediciones Anaya Multimedia. 1997. [Lalani, 1997] Suleiman 'Sam' Lalani. "Java, biblioteca del programador". Ediciones McGraw Hill. 1997. [Froufe, 1997] Agustn Froufe. "Tutorial de Java". Facultad de Informtica de Sevilla. 1997. http://www.fie.us.es/info/internet/JAVA/.

D. Direcciones de inters Se recomienda suscribirse a la lista de correo de Sun sobre Java, cuya direccin es: javanews@US.IBM.COM

1.1. Introduccin a los elementos bsicos de Java


En esta unidad temtica se te presentan los elementos bsicos de Java para empezar a trabajar, conocer sobre el ambiente, instalar el software, hacer la distincin entre applets y aplicaciones y poder compilar y ejecutarlos.

DESCRIPCIN
La orientacin a objetos es un paradigma de programacin que facilita la creacin de software de calidad por sus factores que potencian el mantenimiento, la extensin y la reutilizacin del software generado bajo este paradigma.

La programacin orientada a objetos trata de amoldarse al modo de pensar del hombre y no al de la mquina. Esto es posible gracias a la forma racional con la que se manejan las abstracciones que representan las entidades del dominio del problema, y a propiedades como la jerarqua o el encapsulamiento. El elemento bsico de este paradigma no es la funcin (elemento bsico de la programacin estructurada), sino un ente denominado objeto. Un objeto es la representacin de un concepto para un programa, y contiene toda la informacin necesaria para abstraer dicho concepto: los datos que describen su estado y las operaciones que pueden modificar dicho estado, y determinan las capacidades del objeto. Java incorpora el uso de la orientacin a objetos como uno de los pilares bsicos de su lenguaje.

01.01 Manuales: Instalando Bajo Windows


Bajando el Software de Java
Utiliza la pgina http://www.java.com/es/download/ para bajar el software. Debes utiliza el Botn descarga gratuita

de Java

Despus de esto oprimimos el botn descarga Gratuita Que contiene el Java Runtime, el cual nos ayuda a ejecutar cdigo byte con el JVM (Java Virtual Machine), adems de tener la API que representa todas las clases que pertenecen a Java y que pueden ser utilizadas por cualquier clase de Java, as como elementos que le permiten al desarrollador, compilar, visualizar un applet, etc. Graba el archivo en tu computadora y sigue los pasos para instalar el software.

Instalacin 1. Abrir el archivo que descargo. (doble click en su icono) 2. 3. 4. 5. 6.


Click en el boton Next.

Click en el boton next.> Click en el boton next.> Debes esperar unos minutos. Por Ultimo, clic en Finalizar (Finish)

En este momento queda instalado Java.

BAJAR E INSTALAR Jcreator Como descargar el software


1. Ingresar al siguiente sitio web http://www.jcreator.org/download.htm 2. Presionar click en el botn Download de la segunda opcin.

3. Se activara un formulario donde: 1. Ingresa t nombre y apellidos. 2. Ingresa tu direccin de correo electrnico valido. (el sistema inviara a t correo el Link de descarga del Programa) 3. Abre t correo electrnico y abre el archivo que te enviaron de Jcreator
4. En el mensaje, dar click en el primer link.

Se activara la ventana de descargas Guarda el archivo en tu disco local. INSTALAR Jcreator 1. Doble click en el archivo que descargo 1. Clic en ejecutar. 1. Click en siguiente (Next). 1. Seleccionar la primera opcin (I accept the agreement) 2. Click en siguiente (Next). 1. Click en siguiente (Next). 1. Click en el botn Si. 1. Click en siguiente (Next). 1. Click en siguiente (Next).

1. Click en Instalar (Install). Debes esperar unos minutos. Por ultimo click en finalizar.
Descripcin de la actividad 1. Hacer la lectura definida de la Introduccin al Lenguaje. 2. Entrar a internet y busca tutoriales de Java 3. Una vez adentro lee sobre la arquitectura de Java. 4. Describe la importancia de Java y el porque se dice que es portable y como se utiliza la JVM y la API en un desarrollo en Java en un documento en Word, con tus datos. 5. Publique sus comentarios en el foro destinado para esta semana, recuerde realizar por lo menos dos intervenciones.

01.03 Programacion Orientada a Objetos y Java


Programacin Orientada a Objetos La Programacin Orientada a Objetos es un paradigma de programacin diferente a la Programacin Estructurada o a la misma Programacin Procedural al que la mayora de los programadores estn acostumbrados a utilizar. En la Programacin Estructurada y la Programacin Procedural lo mas importante es el procedimiento que se esta desarrollando a travs de un

lenguaje de programacin. En Programacin Orientada a Objetos, se hace un gran nfasis a los datos, y todo gira alrededor de ellos. Cada vez que alguien quiere hacer una aplicacin, debe de pensar en los elementos (datos) que va a utilizar para programar, y la relacin que existe entre estos datos, en su forma de interactuar entre si. Cuando queremos hacer una aplicacin de alumnos que estan inscritos en algunas materias con ciertos profesores, entonces debemos de pensar en los diferentes datos a manejar: Alumnos, Materias, Profesores, etc. Pensar en estos elementos y pensar en todo lo que esta alrededor de ellos para poder tipificarlos en los elementos que definen la Programacin Orientada a Objetos. El mundo esta lleno de objetos y estos objetos tienen ciertas caractersticas que los hacen nicos y esas caractersticas se derivan de atributos que agrupadas representan a una clase que compone a los objetos definidos. Java es un lenguaje que nos ayuda a entender mucho mejor el paradigma Orientado a Objetos de una manera mas sencilla y natural. Antecedentes del Lenguaje Java

Java se cre como parte de un proyecto de investigacin para el desarrollo de software avanzado para una amplia variedad de dispositivos de red y sistemas embebidos. La meta era disear una plataforma operativa sencilla, segura, portable, distribuida y de tiempo real.

Cuando se inici el proyecto, C++ era el lenguaje del momento. Pero a lo largo del tiempo, las dificultades encontradas con C++ crecieron hasta el punto en que se pens que los problemas podran resolverse mejor creando una plataforma de lenguaje completamente nueva.

Se hizo uso de la arquitectura y diseo de una amplia variedad de lenguajes como Eiffel, SmallTalk, Objetive C y Cedar/Mesa. El resultado es un lenguaje que se ha mostrado ideal para desarrollar aplicaciones de usuario final seguras, distribuidas y basadas en red en un amplio rango de entornos desde los dispositivos de red embebidos hasta su uso para soluciones en Internet.

Caractersticas en el Diseo de Java - Sencillo, orientado a objetos y familiar: Sencillo, para que no requiera grandes esfuerzos de entrenamiento para los desarrolladores. Orientado a objetos, porque la tecnologa de objetos se considera madura y es el enfoque ms adecuado para las necesidades de los sistemas distribuidos y/o cliente/servidor. Familiar, porque aunque se rechaz C++, se mantuvo Java lo ms parecido posible a C++, eliminando sus complejidades innecesarias, para facilitar la migracin al nuevo lenguaje. - Robusto y seguro: Robusto, simplificando la administracin de memoria y eliminando las complejidades del uso de apuntadores y aritmtica de apuntadores del C. Seguro para que pueda operar en un entorno de red. - Independiente de la arquitertura y portable: Java est diseado para soportar aplicaciones que sern instaladas en un entorno de red heterogneo, con hardware y sistemas operativos diversos. Para hacer esto posible el compilador Java genera un cdigo llamado 'bytecodes' o comnmente conocido como cdigo byte, un formato de cdigo independiente de la plataforma diseado para transportar cdigo eficientemente a travs de mltiples plataformas de hardware y software. Es adems portable en el sentido de que es rigurosamente el mismo lenguaje en todas las plataformas. El 'bytecode' es traducido a cdigo mquina y ejecutado por la Java Virtual Machine, que es la implementacin Java para cada plataforma hardwaresoftware concreta. - Alto rendimiento: A pesar de ser interpretado, Java tiene en cuenta el rendimiento, y particularmente en las ltimas versiones dispone de diversas herramientas para su optimizacin. Cuando se necesitan capacidades de proceso intensivas, pueden usarse llamadas a cdigo nativo. - Interpretado, multi-hilo y dinmico: El intrprete Java puede ejecutar codigo byte en cualquier mquina que disponga de una Mquina Virtual Java (JVM). Adems Java incorpora capacidades avanzadas de ejecucin multi-hilo (ejecucin simultnea de ms de un flujo de programa) y proporciona mecanismos de carga dinmica de clases en tiempo de ejecucin. Caractersticas del Lenguaje Lenguaje de propsito general. Lenguaje Orientado a Objetos. Sintaxis inspirada en la de C/C++. Lenguaje multiplataforma: Los programas Java se ejecutan sin variacin (sin recompilar) en cualquier plataforma soportada (Windows, UNIX, Mac, etc.) Lenguaje interpretado: El intrprete a cdigo mquina (dependiente de la plataforma) se llama Java Virtual Machine (JVM). El compilador produce un cdigo intermedio independiente del sistema denominado bytecode cdigo byte. Lenguaje gratuito: Creado por SUN Microsystems, que distribuye

gratuitamente el producto base, denominado JDK (Java Development Toolkit) o actualmente J2SE (Java 2 Standard Edition). API distribuida con el J2SE muy amplia. Cdigo fuente de la API disponible. Facilidades del J2SE (Java 2 Estndar Edition)

Herramientas para generar programas Java. Compilador, depurador, herramienta para documentacin, etc. La JVM, necesaria para ejecutar programas Java. La API de Java (jerarqua de clases). Cdigo fuente de la API (Opcional). Documentacin. Java Runtime Environment (JRE)

JRE es el entorno mnimo para ejecutar programas Java 2. Incluye la JVM y la API. Est incluida en el J2SE aunque puede descargarse e instalarse separadamente. En aquellos sistemas donde se vayan a ejecutar programas Java, pero no compilarlos, el JRE es suficiente. El JRE incluye el Java Plug-in, que es el 'aadido' que necesitan lo navegadores (Explorer o Netscape) para poder ejecutar programas Java 2. Es decir que instalando el JRE se tiene soporte completo Java 2, tanto para aplicaciones normales (denominadas 'standalone') como para Applets (programas Java que se ejecutan en una pgina Web, cuando esta es accedida desde un navegador).

Objetivo especfico de aprendizaje Entender como se compila y ejecuta un applet y una aplicacin.

Duracin de la actividad

Producto a entregar

Forma de entrega

3.5 horas

Como resultado de la actividad el alumno:

Participacin en el foro definido para esta actividad.

Sabr compilar y ejecutar un applet en su computadora

Podr compilar y ejecutar cualquier aplicacin de java en su computadora

Tendr una mejor idea del porque un applet o aplicacin no se puede ejecutar en la computadora - Participar en un foro en donde se comparan applets vs aplicaciones y tratar de solucionar dudas de sus compaeros a travs de este mismo foro

Actividad previa Applets .vs. Aplicaciones

Recursos de apoyo Unidad 1. Tema 4. Compilando y Ejecutando

Descripcin de la actividad

1. Hacer la lectura definida Compilar y Ejecutar. 2. Probar los ejemplos que tiene la lectura 3. Buscar en Internet dos ejemplos de applets con sus documentos de 4. 5.
html y utlizarlos en su computadora. Buscar en Internet dos ejemplos de aplicaciones de java (sencillos) y compilarlos y ejecutarlos en su computadora Participa en el foro para esta actividad, contestando las siguientes preguntas:

Cual es la diferencia entre applets y aplicaciones en java ? Cuando se usan applets, cuando se usan aplicaciones 6. Si tienes alguna duda, coloca en este mismo foro tu pregunta para que algn compaero del curso te la responda. 7. En el mismo foro, trata de contestar dudas de tus compaeros

01.04 Utilizando Clases Definidas en Java


La manera de utilizar una clase previamente definida en Java es a travs de una Aplicacin modo texto o Aplicacin modo grfico (clase Frame) o un Applet (clase Applet).

Una aplicacin es una clase de Java que corre como una especfica aplicacin en cualquier ambiente operativo, puede tener referencias a archivos, interfaz grfica (si se desea), etc.

Un applet es una clase de Java que corre dentro de un navegador y que no puede

hacer referencias a archivos, tambin posee su interfaz grfica.

Una aplicacin debe compilarse con el archivo ejecutable javac que es el que compila dentro del paquete de java y ejecutarse con el archivo ejecutable java, se genera un archivo de cdigo byte (extensin .class) que es el que se interpreta por la Java Virtual Machine, que es la que depende de la mquina que utilices y de esa manera se ejecuta en cualquier ambiente, como se muestra en la figura:

El comando que aparece despus del prompt > es el que se teclea dentro de una ventana de comandos del DOS.

Un applet sigue un camino parecido pero para poder visualizarse se requiere que este applet este inmerso en una pgina de Web, lo cual se puede hacer a travs de algun editor de pginas Web, insertando un java applet en alguna opcin avanzada o incrustando dentro del cdigo de HTML las siguientes instrucciones: <applet width="500" height="700" code="nombreapplet"> </applet> Donde nombreapplet es el nombre del applet a utilizar, se sugiere que cuando se pruebe un applet para revisar su operacin, se utilice el visualizador de applets provisto por java, tal como se muestra la figura:

Esta recomendacin de la prueba de applets obedece a que si se prueba bajo un navegador de Web, aunque se hagan cambios al applet, el navegador mostrara el codigo cargado en el momento que se ejecut por primera vez el navegador, por lo cual tendria que abandonarse la aplicacin del navegador y volver a abrirla para poder ver los cambios en el applet que se este trabajando. Aplicacin La manera de definir una Aplicacin es muy sencilla, es una clase que tiene un mtodo llamado main, dentro del cual se escriben las instrucciones que se requiere sean ejecutadas por el tiempo que dure la aplicacin, muy parecido como pasa con el lenguaje de programacin C++. A continuacin se muestra una aplicacin muy sencilla: public class Hola { public static void main(String args[]) { System.out.println("Hola a todos"); } } Esta clase es tecleada en un editor de textos, compilada con el comando javac Hola.java en una ventana de comandos del DOS y es ejecutada con el comando java Hola Un ejemplo de la presentacin de esta clase sera:

Esto sera una aplicacin con interfaz modo texto para desplegar un Hola. Toda aplicacin en Java utiliza clases ya creadas anteriormente, y a travs de definir y crear objetos de esas clases, es como puede llevar a cabo las funciones necesarias y propias de la aplicacin. La aplicacin anterior utiliza un mtodo llamado println(), el cual se utiliza para desplegar algo en la ventana en modo texto, su uso ms sencillo sin tener que crear un objeto de una clase es a travs de llamarlo mediante la clase System.out. Posteriormente revisaremos alguna aplicacin donde el mtodo println() es utilizado a travs de un objeto que maneja el flujo de salida, lo cual sera la manera ms adecuada de hacerlo. La manera de hacer lo mismo en forma grfica sera que la clase Hola fuera una clase que herede de la clase Frame, la cual en Java es utilizada para manejar una aplicacin con Interfaz Grfica. A continuacin se muestra un ejemplo de esta misma clase de aplicacin con Interfaz Grfica: Nota Importante: el archivo lo debes de llamar "Holag.java", ya que la clase que defines se llama Holag, sino lo haces asi, te dara problemas al compilar. El texto que quieras poner import java.awt.*; import java.awt.event.*; public class Holag extends Frame implements WindowListener { public static void main(String[] args) { Holag x = new Holag(); x.setSize(400,500); x.setTitle("Aplicacin Grfica Hola"); x.setVisible(true); }

public Holag() { addWindowListener(this); } public void paint(Graphics g) { g.drawString("Hola", 100, 100); } public void windowClosing(WindowEvent e) { System.exit(0); } public void windowOpened(WindowEvent e){} public void windowClosed(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowDeactivated(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} } Dicha clase mostrar la siguiente ventana: En windows:

En gnu/linux:

Mientras que tambien estar activa (atrs) la ventana de comandos del DOS. Algunas cosas que puedes entender por ahora es que cuando se trabaja en POO (Programacin Orientada a Objetos) la mejor manera de hacer esto es a travs de definir y crear objetos de clases, por lo mismo se esta creando un objeto de la misma aplicacin, lo cual es muy comn cuando hacemos aplicaciones grficas. Observars varios mtodos que estn vacios, esto es porque esta clase aplicacin est heredando de una clase llamada Frame y existe una clausula llamada implements WindowListener, lo cual nos permite implementar algunos mtodos de otras clases (ya que como mencionamos anteriormente no hay herencia mltiple), esta es la mejor manera de utilizar los mtodos de otras clases. Todos los mtodos que se nombran con la palabra window al principio pertenecen a esta clase y al implementar la clase debemos escribir todos los mtodos de la clase que implementamos, aunque no tengan instrucciones en

el. Posteriormente se explicarn algunos detalles que ahora no comprenders de la clase mostrada anteriormente, la idea aqu es que conozcas las dos diferentes maneras de mostrar una aplicacin: texto y grfica. Applet Un applet es una clase que posee interfaz grfica y que est inmerso en un navegador, de manera que para poderlo utilizar requieres ejecutar el navegador o el visualizador de applets de Java. Un applet (que es el que manejaremos ms en este curso) esta compuesto por varios mtodos que utlizamos de acuerdo a lo que deseamos realizar en nuestra aplicacin en Web. Como puedes revisar en la clase anterior la Holag, las primeras instrucciones son de import, estas sirven para poder incluir en nuestra aplicacin de Java, otras clases que han sido codificadas anteriormente, como lo hace cualquier otro lenguaje, como el include de C++.

En la carpeta de java, existen algunas carpetas que tienen clases que estan separadas por paquetes, de acuerdo a la funcin de estas clases, todas las clases que tienen que ver con interfaz grfica estan dentro del paquete awt, es por eso que necesitamos incluir todas las clases que estan dentro de este paquete, para eso utilizamos la instruccin de java import java.awt.*; lo cual le dice a Java que si se requiere alguna clase que no se encuentre en el directorio en el cual esta la clase actual, la busque en el paquete descrito, en este caso dentro de java, la carpeta awt. Existe una clase de java muy peculiar llamada Applet, esta clase se encarga de mostrar una aplicacin en Web, esta clase ya esta previamente definida, y para poder hacer un applet es necesario que se defina una clase que herede de la clase Applet, de manera que el usuario solo se encarga de reescribir los mtodos necesarios para definir su nueva aplicacin en Web. Veamos un ejemplo de un applet sencillo Hola y analicemos este applet (AppletHola.java): import java.awt.*; import java.applet.*;

public class AppletHola extends Applet { public void paint(Graphics g) { g.drawString("Hola", 100, 100); } } La manera de visualizar este applet es a traves de una pgina de Web, como la siguiente (AppletHola.html): <html> <head> <title>Applet Hola </title> </head> <body> <applet width="200" height="400" code="AppletHola"></applet> </body> </html> La forma de visualizar este applet es compilando y ejecutando el visualizador de applets de java, como se muestra a continuacin:

Una muestra del applet en pantalla inmerso en la pagina de Web seria:

A diferencia de una aplicacin, un applet debe heredar de la clase Applet, en ella existen algunos mtodos predefinidos a travs de los cuales vamos a dibujar o desplegar los elementos grficos en nuestra ventana, es por esto que utilizamos el mtodo paint, en este mtodo desplegamos lo que deseamos aparezca en la pantalla, y eso es a travs de un objeto de la clase Graphics, entonces ahora entendemos que solo a travs de este objeto es que podemos dibujar. Normalmente se define el objeto de la clase Graphics como g, pero puede ser que tu uses otro, dentro del mtodo paint, la manera de dibujar es utilizando los mtodos de la clase Graphics, en este caso para dibujar letras podemos usar el mtodo drawString(), el cual requiere se le defina un string (cadena de caracteres) y la coordenada en la cual se desea dibujar, empezando por la coordenada x y siguiendo la

coordenada y. Existen una serie de mtodos posibles a utilizar con el objeto grfico de la clase Graphics, como por ejemplo el drawLine(), el cual dibuja una lnea, tiene los parmetros coordenadas iniciales "x" y "y", y coordenadas finales "x" y "y". Una ejemplo pudiera ser g.drawLine(10,10, 100, 100); el cual dibuja una linea de la coordenada 10, 10 a la coordenada 100,100. A continuacin utilizaremos un ejemplo de un applet dibujando lneas, rectngulos y crculos:

Dibujo de lineas rectngulos circulo Esto se hace a travs de utilizar el mtodo mencionado drawLine() y los mtodos nuevos drawRect() y drawOval(), como se observa en el cdigo siguiente: import java.awt.*; import java.applet.*;

public class AppletDibujos1 extends Applet { public void paint(Graphics g) { g.drawString("Hola", 100, 100); g.drawLine(10,10, 100, 100); g.drawRect(0, 0, 150, 150); g.drawOval(100, 100, 100, 100); } }

A partir de este momento es importante que aprendas a conocer y utilizar la definicin de las clases descritas en la API (App) , cada vez que utilices una clase nueva que no conoces es importante que visites su documentacin en la java API, ya que de esa manera puedes saber que constructores tienen, que mtodos pueden ser utilizados y cuales son los parmetros a utilizar en cada uno. Como ejercicio entra a revisar la clase Graphics y reconoce como estn definidos los parmetros de los mtodos drawString(), drawLine(), drawRect() y drawOval() utilizados en el applet anterior. Enlace de inters: http://sunsite.dcc.uchile.cl/java/docs/jdk1.2.2/docs/index.html

01.05 Compilando y Ejecutando


Toma el siguiente cdigo correspondiente a un applet y grbalo en tu computadora como AppletReloj con la extensin java, es decir AppletReloj.java

import java.applet.Applet; import java.util.Date;

public class AppletReloj extends Applet implements Runnable { Date d; Thread t; boolean activo;

public void run() { while ( activo ) { repaint(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }

public void init() { t = new Thread(this); }

public void start() { activo = true; t.start(); } public void stop() { activo = false;

public void paint(java.awt.Graphics g) { d = new Date(); g.drawString( d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds(), 10, 10); } } Ahora toma el siguiente cdigo en html y grbalo en tu computadora como Ejemplo.html

<html> <title>Ejemplo de reloj digital sencillo</title>

<body>

<H1 align="center">Ejemplo de reloj digital sencillo</h1> <hr> <br> <div align="center">

<applet code="AppletReloj.class" width=100 height=50> </applet>

</div>

</body> </html>

Para compilar el applet en tu computadora y generar el cdigo byte, puedes utilizar la ventana de comandos del DOS y usar el comando javac

javac es un archivo ejecutable que al cargar el J2SE lo debio haber bajado a tu computadora, dicho archivo debe estar dentro de la carpeta /bin dentro de la carpeta de java, cercirate de tenerlo, antes de utilizar el comando

javac AppletReloj.java

Despus de utilizar dicho comando en la ventana del DOS, como lo muestra la grfica:

El applet ser compilado y nicamente as podrs visualizar la pgina html en el navegador browser, o con el visualizador de applets que tambin se te debi haber instalado con el J2SE, dicho visualizador lo puedes utilizar con el comando

Appletviewer Ejemplo.html

Como se muestra en la figura anexa:

O puedes dar un doble clic en el documento Ejemplo.html y el navegador que tengas definido en tu computadora lo abrir.

Notas: -Como veis me dio unos cuantos "warnings" al compilar, pero el programa se ejecuto correctamente.
-Asegrate que ambos archivos 1) Ejemplo.hmtl y 2) AppletReloj.class estn en la misma carpeta.

Si al compilar o al tratar de visualizar un applet te marca que no reconoce el comando debes asegurarte de dos cosas:

1. Que si hayas instalado el java con todas sus carpetas incluyendo la /bin 2. Que tengas en el path y classpath (variables del sistema operativo) definido el
path donde se encuentra el java, para que el sistema reconozca donde esta el archivo que ests tratando de ejecutar (javac, appletviewer, etc.). S no esta configurado el path siga los siguientes pasos: 1. Inicialice el cuadro de dialogo de Propiedades del sistema (tecla Windows pausa o mipc propiedades) 2. Seleccione la pestaa de opciones avanzadas

3. 4. 5. 6. 7.

Seleccione la opcin de variables de entorno Ubique la variable path en la sesin variable del sistema Seleccione la opcin modificar Agregue al final de la variable la ruta en donde se encuentra instalado java ej: c:\java\bin Inicie una consola de dos y verifique que el path ha sido agregado ej: c:\javac

Para ejecutar una aplicacin en Java, podemos usar el siguiente ejemplo sencillo:

Toma la siguiente clase y grbala como Hola.java

Public class Hola { public static void main(String[] args) { System.out.println(" Hola "); } } Despus de esto complala utilizando el comando javac como lo vimos anteriormente:

Para ejecutarla debers utilizar el comanda java Hola, es decir el comando java ejecuta el cdigo byte generado al compilar el archivo Hola.java (es decir el archivo Hola.class). La aplicacin se ejecuta entonces de la siguiente manera:

ACTIVIDAD 1 SEMANA 1
1. Hacer la lectura titulada Que son los hilos. 2. Leer del tutorial de SUN el captulo de Threads (http://download.oracle.com/javase/tutorial/essential/concurrency/ ). 3. En un documento en Word, con tus datos, explicar el concepto de hilo, qu diferencia
existe entre multihilo y multiproceso, describir las ventajas que ofrece la programacin con hilos. 4. Enviar el documento por la plataforma para su revisin. 5. Comparte la informacin que encontraste con tus compaeros utilizando el foro de discusin Ventajas de la programacin con hilos que se encuentra dentro de este mismo curso. 6. Adems, dentro del foro de discusin Ventajas de la programacin con hilos, complementa o retroalimenta una aportacin de algn compaero.

1. IDENTIFICACIN DE LA GUA DE APRENDIZAJE


Duracin Mdulo: 40 horas

Semana 1: Excepciones. Duracin tema de estudio: 10 horas Modalidad(es) de formacin: Desescolarizada (Ambiente virtual) Equipo Ejecutor Competencia: Resultados de Aprendizaje Duracin en horas
Entender el concepto y los fundamentos de los hilos de ejecucin. Conocer el ciclo de vida de los hilos de ejecucin. Aplicar el concepto de hilos en la ejecucin concurrente de cdigo. Utilizar mens de opciones en la interfaz de un programa Que el participante conozca y comprenda la programacin

multihilo.

10 Criterios de Evaluacin:
El participante debe comprender de manera clara el proceso de la programacin multihilo
Sistema de Gestin de la Calidad

Servicio Nacional de Aprendizaje SENA Regional Caquet Centro Tecnolgico de la Amazona Programa de formacin: DESARROLLO DE APLICACIONES CON MANEJO DE PROCESO SIMULTNEO Y USO DE MENS GUIA DE APRENDIZAJE
Fecha: Septiembre 2011 Versin 1.0 Pgina 2 de 5

2. PRESENTACION Amigo Participante: Esta gua tiene como finalidad, orientar su proceso de enseanza-aprendizaje-evaluacin (E-A-E), amigo estudiante, permitindole as Desarrollar en el Personal los conocimientos para el planteamiento y aplicacin de herramientas en la implementacin de Planeacin y
DESARROLLO DE APLICACIONES CON MANEJO DE PROCESO SIMULTNEO Y USO DE MENS.

El desarrollo de sta gua, requiere de su parte una lectura a fondo de los textos propuestos para cada una de las cuatro semanas que conforman este curso. El material lo podr consultar en la Plataforma de Ambientes Virtuales de Aprendizaje AVA. Como estrategias metodolgicas aplicaremos: la exploracin de saberes previos, la apropiacin del aprendizaje y la aplicacin del conocimiento, herramientas que los conducirn a alcanzar los Resultados de aprendizaje, planteados en ste Mdulo, y reunir as las Evidencias de Aprendizaje requeridas. 3. CONOCIMIENTOS PREVIOS En esta fase indagaremos aquellos presaberes con que usted llega a esta actividad EA-E (Actividades de Enseanza-Aprendizaje): Las siguientes preguntas son para que usted. Determine el grado de conocimiento que posee sobre el tema de esta actividad de E-A-E, y as organice su estudio teniendo en cuenta sus saberes previos, con el fin de lograr resultados ptimos. Las respuestas que usted d, no sern evaluables por parte del tutor. Que es Java? Para que sirve la programacin multihilo? 4. MATERIAL DE CONSULTA Realiza la lectura de textos sugeridos en el link MATERIALES DEL CURSO, de la semana 1y
Sistema de Gestin de la Calidad

Servicio Nacional de Aprendizaje SENA

Regional Caquet Centro Tecnolgico de la Amazona Programa de formacin: DESARROLLO DE APLICACIONES CON MANEJO DE PROCESO SIMULTNEO Y USO DE MENS GUIA DE APRENDIZAJE
Fecha: Septiembre 2011 Versin 1.0 Pgina 3 de 5

5. ACTIVIDADES Y ESTRATEGIAS DE APRENDIZAJE ACTIVIDAD DE APRENDIZAJE : Semana 1 Actividades 1 Ejercicio 1:

1. Hacer la lectura titulada Que son los hilos. 2. Leer del tutorial de SUN el captulo de Threads (http://download.oracle.com/javase/tutorial/essential/concurrency/ ). 3. En un documento en Word, con tus datos, explicar el concepto de hilo, qu
diferencia existe entre multihilo y multiproceso, describir las ventajas que ofrece la programacin con hilos. 4. Enviar el documento por la plataforma para su revisin. 5. Comparte la informacin que encontraste con tus compaeros utilizando el foro de discusin Ventajas de la programacin con hilos que se encuentra dentro de este mismo curso. 6. Adems, dentro del foro de discusin Ventajas de la programacin con hilos, complementa o retroalimenta una aportacin de algn compaero.
Sistema de Gestin de la Calidad

Servicio Nacional de Aprendizaje SENA Regional Caquet Centro Tecnolgico de la Amazona Programa de formacin: DESARROLLO DE APLICACIONES CON MANEJO DE PROCESO SIMULTNEO Y USO DE MENS GUIA DE APRENDIZAJE
Fecha: Septiembre 2011 Versin 1.0 Pgina 4 de 5

6. EVIDENCIAS Y EVALUACION Actividades 2 Ejercicio 1:

1. Hacer la lectura titulada Por qu y cmo usar hilos. 2. Para profundizar tus conocimientos, consulta la informacin de la pgina Web
http://www.ibiblio.org/javafaq/course/week11/index.html. 3. Sin utilizar hilos, desarrollar un programa (aplicacin o applet) que tenga dos botones y un TextArea. Al presionar un botn, el TextArea comenzar a parpadear entre dos colores (azul y rojo), y al presionar el segundo botn el parpadeo parar. Funciona como se tena previsto? Si la respuesta es NO. Entonces se necesitan hilos Si la respuesta es SI. Analizar, pues este caso no puede funcionar sin hilos. 4. Hacer una reflexin sobre lo visto en esta actividad. Entrega el resultado en un documento de Word en la plataforma.

Ambiente(s) requerido: Externo Material (es) requerido: Plugin Java , JCreator Instructor (es): JUAN MANUEL MORA PATIO Desempeo Comente sus actividades realizadas en el foro de integracin es un foro de ustedes De Producto Actividad 1. Resuelve cada tem de la ACTIVIDAD DE APRENDIZAJE. Para enviarlo, ingresa al link de Actividades gua 1, dispuesto en el link Actividades semana 1. Una vez Desarrollado envelo por el link Ver/Completar actividad: Actividad 1 |. 10 puntos
Sistema de Gestin de la Calidad

Servicio Nacional de Aprendizaje SENA Regional Caquet Centro Tecnolgico de la Amazona Programa de formacin: DESARROLLO DE APLICACIONES CON MANEJO DE PROCESO SIMULTNEO Y USO DE MENS GUIA DE APRENDIZAJE
Fecha: Septiembre 2011 Versin 1.0 Pgina 5 de 5

8. BIBLIOGRAFIA La bibliografa se encuentra relacionada en el Material del curso dentro del aula virtual . CONTROL DEL DOCUMENTO Nombre Cargo Dependencia Adaptado por JUAN MANUEL MORA PATIO Tutor Ava Coord. Acadmica Actividad 2. Resuelve cada tem de la ACTIVIDAD DE APRENDIZAJE. Para enviarlo, ingresa al link de Actividades gua 1 dispuesto en el link Actividades semana 1. Una vez Desarrollado envelo por el link Ver/Completar actividad: Actividad 2. 15 puntos Producto entregable: Taller escrito, acerca de las actividades propuestas, donde desarrolle cada uno de los puntos sugeridos. Forma de entrega: Virtual Criterios de Evaluacin: Desempeo:
Lectura y escrito sobre la programacin multihilo Lectura y prctica sobre el uso de hilos

Producto: Elabora un taller con los tems sugeridos, envalos por el link correspondiente.

1.2. Solucin de problemas bsicos con aplicaciones que involucran clculo.


Esta unidad te permite desarrollar soluciones bsicas que implican el uso de variables, aplicando la definicin de los diferentes tipos primitivos de variables, utilizando los operadores aritmticos para el clculo, tomando datos desde el teclado en una aplicacin o a travs de un texto dentro de un applet y permitindote manejar la jerarqua de los operadores para el desarrollo de una operacin matemtica compleja.

02.01. Variables y Operaciones


Variables, Operaciones y Jerarqua en las Operaciones En Java existen dos categoras de tipos de datos: Tipos Primitivos. Los cuales se definen abajo. Referencias. Las cuales corresponden a clases y objetos que se tratarn posteriormente.

Tipos primitivos Los tipos primitivos son los que permiten manipular valores numricos (con distintos grados de precisin), caracteres y valores bolanos (verdadero / falso). Los Tipos Primitivos son: boolean: Puede contener los valores true o false. byte: Enteros. Tamao 8-bits. Valores entre -128 y 127. short: Enteros. Tamao 16-bits. Entre -32768 y 32767. int: Enteros. Tamao 32-bits. Entre -2147483648 y 2147483647. long: Enteros. Tamao 64-bits. Entre -9223372036854775808 y 9223372036854775807. float: Nmeros en coma flotante. Tamao 32-bits. double: Nmeros en coma flotante. Tamao 64-bits. char: Caracteres. Tamao 16-bits. Unicode.

Desde '\u0000' a '\uffff'inclusive. Esto es desde 0 a 65535 Variables Una variable es un rea en memoria que tiene un nombre y un Tipo asociado. El Tipo es o bien un Tipo primitivo o una Referencia. Es obligatorio declarar las variables antes de usarlas. Para declararlas se indica su nombre y su Tipo, de la siguiente forma: tipo_variable nombre ; Ejemplos: int i; // Declaracion de un entero char letra; // Declaracion de un caracter boolean flag; // Declaracion de un booleano El; es el separador de instrucciones en Java. El smbolo // indica comentarios de lnea, se ponen despus de una instruccin para comentarla, el compilador no las toma al detectarlas. En Java las maysculas y minsculas son significativas. No es lo mismo el nombre letra que Letra. Todas las palabras reservadas del lenguaje van en minsculas.

Se pueden asignar valores a las variables mediante la instruccin de asignacin (=). Por ejemplo: i = 5; // a la variable i se le asigna el valor 5 letra = 'c'; // a la variable letra se le asigna el valor 'c' flag = false; // a la variable flag se le asigna el valor false La declaracin y la asignacin se pueden combinar en una sola expresin: int i = 5; char letra = 'c'; boolean flag = false; Operaciones Bsicas En java al igual que en C++ se tienen una serie de operadores que ayudan a obtener clculos, dependiendo de los valores a utilizar, Java trabaja con los siguientes operadores: Operadores Aritmticos Operador en Java + Significado suma

* / %

resta multiplicacin divisin residuo

Todos los operadores que se muestran en esta tabla son binarios; es decir, trabajan con dos operandos. Los operadores +, - y * funcionan de la manera conocida. El operador / funciona de diferente manera si trabaja con datos de tipo entero o de tipo flotante. Con datos de tipo flotante funciona de la manera tradicional; pero al realizarse una divisin entre dos nmeros enteros, el operador / regresa el cociente de la divisin entera; es decir, regresa la parte entera del resultado (si hay fraccin la elimina). Por ejemplo: 2/3 da como resultado 0 pero 2.0/3.0 da como resultado 0.66666 Una manera de visualizar esto es a travs de un applet que dibuje el resultado de una operacin entera, en este caso utilizaremos el mtodo drawString() como lo hicimos antes, y hacemos uso del operador + que cuando es utilizado despus de un String (cadena de caracteres) en Java funciona como concatenacin. Tenemos entonces que la siguiente codificacin: Creamos el archivo pru.java y escribimos: import java.awt.*; import java.applet.*; // <applet width="200" height="200" code="pru"></applet> public class pru extends Applet { public void paint(Graphics g) { int x; x = 2 / 3; g.drawString("2 / 3 = "+x, 100, 100); } } Dar como resultado:

Observa como utilizamos dentro del applet pru.java el comentario // <applet width="200" height="200" code="pru"></applet>

Esto lo hacemos para no tener que hacer un archivo de tipo HTML aparte, ya que un navegador o visualizador de applets lo que requiere para ejecutar el applet es solamente la directiva <applet>, hacemos uso de esta lnea como comentario dentro del applet, de manera que al compilar no da un error por esta instruccin. Al estar haciendo operaciones, si hay operandos de diferentes tipos de datos, se convierten al tipo de datos ms amplio y el tipo del valor resultante es del tipo ms amplio. Por ejemplo, si hay enteros y flotantes, todos los nmeros se convierten a flotantes y el resultado se calcula como flotante. Por ejemplo: 4/3.0 da como resultado 1.3333

import java.awt.*; import java.applet.*; // <applet width="200" height="200" code="pru"></applet>

public class pru extends Applet { public void paint(Graphics g) { double x; x = 4 / 3.0; g.drawString("4 / 3.0 = "+x, 100, 20); } }

El operador % calcula el residuo de la divisin entera y slo existe para datos de tipo entero Por ejemplo: 10%3

da como resultado 1

Otros operadores de Asignacin En Java, como en C++, es posible abreviar algunas expresiones de asignacin como se muestra en la siguiente tabla: Operador v+=e v-=e v*=e v/=e v%=e Expresin equivalente v=v+e v=ve v=v*e v=v/e v=v%e

Otros Operadores aritmticos En Java, al igual que en C++, existen tambin los siguientes operadores

aritmticos: ++ incremento -- decremento Es decir: x++ ++x es equivalente a x = x+1 x-- --x es equivalente a x = x-1 Estos operadores son unitarios, es decir, trabajan con un solo operando y solamente se pueden utilizar con variables de tipo entero. Los operadores se pueden utilizar antes o despus del nombre de la variable y funcionan de diferente manera: Si se ponen antes, primero se realiza la operacin (incremento o decremento) y luego se utiliza el valor de la variable en la expresin en la que se encuentre. Si se pone despus, primero se utiliza el valor de la variable en la expresin y luego se lleva a cabo la operacin (incremento o decremento).

Por ejemplo: Supn que a = 10 y c = 4 La operacin el valor de 5 La operacin el valor de 5 v = a * c++; v toma el valor de 40 y c queda con

v = a * ++c;

v toma el valor de 50 y c queda con

Jerarqua de los operadores aritmticos Prioridad 1 2 Operadores () ++, --, +(positivo), - (negativo) *,/,% +, =,+=,-=,*=, /=,%= Asociatividad Empezando por los parntesis ms internos De derecha a izquierda, ++ y -- dependiendo de la posicin De izquierda a derecha De izquierda a derecha De derecha a izquierda

3 4 5

Algunos Mtodos Matemticos Predefinidos Java contiene una serie de mtodos matemticos que puedes utilizar en tus clases, para realizar algn clculo, son tomados de la clase Math, esta viene dentro del paquete java.lang, entonces para poder tomarlos dentro de una clase debes de usar la instruccin import java.lang.Math; Antes de iniciar tu applet o aplicacin. Algunos de los mtodos a utilizar son:

public final static double e public final static double PI public static int abs(int a)

da el valor del numero Euler (e). da el valor del numero pi. da el valor absoluto de un entero dado.

public static long abs(float a) da el valor absoluto de un numero de punto flotante. public static double cos(double a) de doble precisin. public static double exp(double a) a de doble precisin. que te da el coseno de un valor

te da el valor de ea para un valor

public static double pow(double a, double b) te da el valor de ab para a y b de doble precisin. public static double sqrt(double a) obtiene el valor de la raz cuadrada de un valor a de doble precisin. Cmo se utilizan? Lo anterior es la definicin de cada uno de los mtodos de la clase Math, tu aun no estas familiarizado con esta definicin, pero poco a poco entenders su uso, vamos a entender el uso de uno de ellos. public static double sqrt(double a) obtiene el valor de la raz cuadrada de un valor a de doble precisin. La definicin anterior describe que sqrt es un mtodo de tipo double y el parmetro que toma es un double, entonces algunos ejemplos de su uso son: Ejemplo1 double a, b; a = 25.0 b = Math.sqrt(a); Ejemplo 2 int a; double b; a = 25;

b = Math.sqrt(a); En ejemplo 1 vemos claramente como a b le ser asignado el valor real 5.0, ya que esa es la raz cuadrada de 25.0

En ejemplo 2 pensaramos que sera un error el tener el uso de una variable entera en lugar de una real, pero es valido asignarle a una variable real un valor entero, pero lo contrario es un error (si fuera b entero, ya que la funcin devuelve un numero real )

Ejemplo Completo de Raices Cuadradas: import java.awt.*; import java.applet.*; import java.lang.Math; // <applet width="200" height="200" code="pru"></applet> public class pru extends Applet { public void paint(Graphics g) { double a,b,c,d,e,f; a=25.0; b=36; c=81; d=Math.sqrt(a); e=Math.sqrt(b); f=Math.sqrt(c); g.drawString("La raiz cuadrada de 25="+d,100, 20); g.drawString("La raiz cuadrada de 36="+e,100,50); g.drawString("la raiz cuadrada de 81="+f,100,80); } }

GUIA actividad N1 autoaprendizaje

Programa: Programacin Curso: Variables y Estructuras de Control en la Programacin Orientada a Objetos: JAVA Unidad didctica: Solucin de Problemas Bsicos con Aplicaciones que involucran clculo Nombre de la actividad: Manejo de Variables y Operaciones Bsicas y su prctica

Objetivo especfico de aprendizaje Entender el uso y manejo de las variables y operaciones aritmticas con variables.

Duracin de la actividad 3 horas

Producto a entregar

Forma de entrega

Como resultado de la actividad el alumno:

En la plataforma

Conocer los diferentes tipos de variables que puede utilizar en Java.

Entendera la manera de asignar valores a variables y utilizar los operadores aritmticos.

Actividad previa Saber compilar y ejecutar un applet o una aplicacin.

Recursos de apoyo Unidad 2. Tema 1. Variables y Operaciones

Descripcin de la actividad 1. Hacer la lectura definida de Variables y Operaciones.

2. Utilizar los ejemplos de la lectura, compilarlo y ejecutarlo. 3. Modificar los ejemplos anterior para practicar las operaciones. 4. Practicar haciendo un applet llamado ConversionApplet.html que despliegue 30 grados centgrados y calcule y despliegue los grados farenheit correspondientes, utilizando internamente un clculo para la conversin. El applet deber presentar algo parecido a lo siguiente.

Debes enviar por medio del enlace de la actividad lo siguiente:

Carpeta comprimida con el siguiente nombre: nombre del aprendriz_actividad1 Dicha carpeta debe contener la carpeta del proyecto que has creado en Jcreator. (ConversionApplet.html, ConversionApplet.class, ConversionApplet.java)

02.02 Lectura de Datos


Lectura de Datos Dentro de un applet es sencillo tomar algn dato del usuario para realizar algn clculo. Es difcil explicar detalladamente los diferentes objetos en este momento que requieres para tomar un dato de la ventana del applet, cada objeto utilizado ser explicado detalladamente en unidades posteriores, pero es importante que ya empieces a tomar datos del usuario, es por eso que te daremos los

objetos ms simples en este momento. Esto se hace a travs de crear un objeto de la clase TextField, el cual sirve para que el usuario teclee algn dato dentro del objeto, en la clase TextField existen diferentes mtodos, es necesario utilizar el mtodo getText() para tomar el dato del usuario y este mtodo regresa un objeto de la clase String (cadena de caracteres), el cual se debe pasar a entero o nmero de punto flotante, utilizando la clase Integer o utilizando la clase Double (revisar ejemplo abajo). Dentro de un Applet el mtodo paint nos sirve para dibujar. En el mtodo constructor (mtodo con el mismo nombre de la clase) creamos objetos de la clase de elementos de interfaz grfica, como TextField, TextArea, Label, Button, etc., y se aaden a la ventana del applet con el mtodo add. Cuando tomamos un dato del usuario, la manera que este le dice al applet que ya ha introducido el dato y quiere hacer el clculo es dando un clic a un botn, el cual es creado dentro del applet por medio de la clase Button, para poder introducir las instrucciones para hacer algn clculo cuando el usuario ya dio clic en el botn, debemos introducir stas en el mtodo actionPerformed, este mtodo pertenece a la clase ActionListener, es entonces que la clase que estamos escribiendo que hereda de la clase Applet (clase AppletDaCuadrado en este caso), debe implementar la clase ActionListener para poder utilizar este mtodo y dar instrucciones para cuando se da clic en el botn. Es decir cuando queremos utilizar un Applet debemos heredar de la clase Applet, esto lo hacemos en la misma declaracin de la clase: public class AppletDaCuadrado extends Applet { Habiendo definido previamente la instruccin import java.applet.*; el cual toma la clase Applet previamente definida por Java en la API. Si un applet requiere utilizar elementos grficos que el usuario utilizar para definir que requiere una accin como la de dar un clic en un botn, entonces ese Applet necesita implementar la interface ActionListener, la cual tiene mtodos que ayudan a definir acciones para cuando el usuario da un clic en un botn, quedando entonces la declaracin del applet como: public class AppletDaCuadrado extends Applet implements ActionListener {

Es importante que no te sientas muy presionado por tener una serie de mtodos nuevos, dentro de la clase Applet, pero pronto entre ms ejercicios realices, ms fcil te ser entender estos nuevos mtodos. Presentaremos un applet sencillo en el que se toma un nmero del usuario y cuando el de un clic aparecer el cuadrado de ese nmero dibujado: import java.awt.*; import java.applet.*; import java.awt.event.*;

// <applet width="200" height="200" code="AppletDaCuadrado"></applet>

public class AppletDaCuadrado extends Applet implements ActionListener { TextField t; Button b;

//mtodo constructor,donde se crean los objetos a dibujar en el applet public AppletDaCuadrado() { t = new TextField("", 20); // se crea el objeto texto // parte aadida para que se vea 20 espacios en el TextField b = new Button("Calcula"); // se crea el boton para calcular add(t); // se aade el texto a la pantalla add(b); // se aade el botn a la pantalla b. addActionListener(this); // se le aade al boton la facilidad de

// ser escuchado } //mtodo paint en el cual se pone lo que se quiere dibujar public void paint(Graphics g) { int num = Integer.parseInt(t.getText()); // pasa texto al numero entero g.drawString("Cuadrado = "+num*num, 100, 100); //dibuja el cuadrado } // mtodo para realizar las opciones al oprimir un botn public void actionPerformed(ActionEvent ae) { repaint(); // se le pide que se repinte la ventana } } La manera en la que se presenta este applet es la siguiente:

Nota: he revisado el programa original y lo he corregido porque no se creaba sitio suficiente para escribir en el TextField() http://download.oracle.com/javase/1.4.2/docs/api/java/awt/TextField.html Analicemos un poco esto a detalle, la clase Applet tiene el mtodo paint para dibujar, y el mtodo actionPerformed() para llevar a cabo las instrucciones cuando alguna accin se de, en este caso se haga clic en un botn. Para poder hacer que un applet tenga elementos de interfaz grfica, estos deben ser creados utilizando la clase deseada (TextField, TextArea, Button, etc) y deben ser aadidos a la aplicacin a travs del mtodo add (para que aparezcan en la ventana del applet), todo esto se hace en el constructor del applet, de esa manera cuando se ejecute el applet, se crean los objetos de interfaz grfica y se presentan en la ventana del applet. La manera en la que se pueda hacer para que se ejecute alguna instruccin, con la accin de un botn, es primero aadirlo, pero adems hacer que este elemento pueda ser escuchado, es decir saber cuando el usuario da un clic en el, al momento de estar ejecutando el applet, esto se hace a travs del

mtodo addActionListener(this), en la lnea b.addActionListener(this); Aqui estamos diciendo que el botn debe ser escuchado en este clase de aplicacin, de este manera cuando el usuario de un clic, entonces el control de la aplicacin pasara al mtodo actionPerformed() y se ejecutarn las intrucciones puestas en el. repaint(); Esta instruccin lo que hace es hacer que se vuelva a ejecutar el mtodo paint(), para que aparezca el mensaje Cuadrado = y el valor del cuadrado del nmero dado. Ahora porque tenemos que hacer esto, debido a que el mtodo paint() solo se ejecuta cuando se mueve la ventana del applet, cuando se abre y se cierra, pero no en todo momento, entonces el mtodo repaint() nos sirve para que se repinte lo que queremos y en este caso cuando el usuario de un clic en el botn. Utilizamos el mtodo parseInt() de la clase Integer para poder pasar el valor String (cadena de caracteres) del texto que tiene el nmero dado por el usuario, a un nmero entero que pueda servirnos posteriormente para hacer algn clculo. Ahora la realidad es que el mtodo paint es para dibujar y no para dar respuestas a clculos, entonces lo mejor seria no utilizar el mtodo paint() en este caso, sino utilizar otros elementos de interfaz grfica para mostrar los clculos, esto ser en el siguiente applet: import java.awt.*; import java.applet.*; import java.awt.event.*; import java.lang.Math;

// <applet width="200" height="200" code="AppletCuadrado"></applet>

public class AppletCuadrado extends Applet implements ActionListener { Label l1, l2; TextField t1, t2; Button b;

public AppletCuadrado() { l1 = new Label("Numero"); // se crea una etiqueta t1 = new TextField("",5); // se crea un texto, el nmero entre parntesis es el tamao // aado "" para que se muestre espacios l2 = new Label("Cuadrado"); // se crea una etiqueta t2 = new TextField("",10); // se crea un texto, el nmero entre parntesis es el tamao // aado "" para que se muestre espacios b = new Button("Calcula"); // se crea un boton add(l1); // se aade la etiqueta a la ventana add(t1); // se aade un texto a la ventana add(l2); // se aade la segunda etiqueta a la ventana add(t2); // se aade el segundo texto a la ventana add(b); // se aade el boton a la ventana b. addActionListener(this); // el botton ahora tiene la facilidad de // ser escuchado }

public void actionPerformed(ActionEvent ae) { // se toma el numero del texto y se pasa a la variable num double num = Double.parseDouble(t1.getText()); // al texto 2 se le pone el valor del numero al cuadrado t2.setText(""+Math.pow(num,2.0)); } } El cual al ejecutar muestra lo siguiente:

Utilizamos el mtodo parseDouble de la clase Double, para pasar de un String a un valor primitivo de doble precisin (como lo hicimos en el ejemplo anterior con un entero), usamos un valor de doble precisin, porque ahora hicimos uso del mtodo pow() de la clase Math, para hacer el clculo del cuadrado. Ahora no hacemos uso del mtodo paint(), y utilizamos el mtodo setText() para poder pasar el valor calculado al objeto de la clase TextField, todo esto se hace dentro del mtodo actionPerformed() y como no se esta dibujando el resultado, no tenemos que hacer uso del mtodo paint() o repaint(). El uso del mtodo pow() se hace tomando solo el nombre de la clase Math, haciendo Math.pow(num, 2.0), esto se hace debido a que el mtodo es esttico, lo cual significa que el mtodo se usa sin tener que crear un objeto

de la clase Math, solo haciendo uso del nombre de la clase antes del mtodo. En esta clase tambin hicimos uso de objetos de la clase Label, para poder definir que es lo que estar en el texto de enseguida.

Otro ejemplo: suma de dos nmeros import java.awt.*; import java.applet.*; import java.awt.event.*; import java.lang.Math; // <applet width="200" height="200" code="AppletSuma"></applet> public class AppletSuma extends Applet implements ActionListener { Label l1, l2, l3; TextField t1, t2,t3; Button b; public AppletSuma() { l1 = new Label("Numero 1"); // se crea una etiqueta t1 = new TextField("",5); // se crea un texto l2 = new Label("Numero 2"); // se crea una etiqueta t2 = new TextField("",10); // se crea un texto l3 = new Label("Resultado"); // se crea una etiqueta t3 = new TextField("",10); // se crea un texto

b = new Button("Sumar"); // se crea un boton add(l1); // se aade la etiqueta a la ventana add(t1); // se aade un texto a la ventana add(l2); // se aade la segunda etiqueta a la ventana add(t2); // se aade el segundo texto a la ventana add(l3); // se aade la tercera etiqueta a la ventana add(t3); // se aade el tercer texto a la ventana add(b); // se aade el boton a la ventana b. addActionListener(this); // el botton ahora tiene la facilidad de // ser escuchado } public void actionPerformed(ActionEvent ae) { // se toma el numero del texto y se pasa a la variable num double num = Double.parseDouble(t1.getText()); double num2= Double.parseDouble(t2.getText()); // al texto 2 se le pone el valor de la suma double num3; num3=num+num2; t3.setText(""+num3); } }

Nota: Recuerda que estamos utilizando la primera etiqueta del applet para no tener que hacer un archivo html y poder utilizar el applet, pero cuando hagas un applet y lo quieras liberar, debes de escribir un documento html y poner la etiqueta del applet en el cuerpo del documento.

Actividades n 02.02
GUIA actividad N2 autoaprendizaje Programa: Programacin Curso: Variables y Estructuras de Control en la Programacin Orientada a Objetos: JAVA Unidad didctica: Solucin de problemas bsicos con aplicaciones que involucran clculo Nombre de la actividad: Tomando datos y desplegando informacin en un applet

Objetivo especfico de aprendizaje Tomar datos en un applet para poder trabajar con valores que el usuario de.

Duracin de la actividad 3 horas

Producto a entregar

Forma de entrega

Como resultado de la actividad el alumno:

A travs de la plataforma

Podr definir un applet que maneja objetos que permiten tomar datos del usuario.

Podr desplegar resultados de operaciones para que el usuario las observe.

Actividad previa Saber compilar y ejecutar un applet o una aplicacin.

Recursos de apoyo Unidad 2. Tema 2. Lectura de Datos

Descripcin de la actividad

1.

Hacer la lectura de Lectura de Datos. en la computadora.

2. Tomar los ejemplos que estn definidos en la lectura, grabndolos 3. Compilar y ejecutar los ejemplos. 4. Debes crear un aplicativo, en el cual el usuario ingrese 6 nmeros y el sistema le debe retornar la suma de todos. 5. Debes crear un aplicativo, en el cual el usuario ingrese 2 nmeros y el sistema le debe retornar el producto. 6. Debes crear un aplicativo, en el cual el usuario ingrese 2 nmeros y el sistema le debe retornar la resta.

Debes enviar por medio del enlace de la actividad lo siguiente:

Carpeta comprimida con el siguiente nombre: nombre del aprendriz_actividad_2 Dicha carpeta debe contener la carpeta del proyecto 1(suma), proyecto 2 (producto) y proyecto 3 (resta)

02.03 Jerarqua de los operadores aritmticos


Jerarqua de los operadores aritmticos Prioridad 1 Operadores () Asociatividad Empezando por los parntesis ms internos

2 3 4 5

++, --, +(positivo), (negativo) *,/,% +, =,+=,-=,*=, /=,%=

De derecha a izquierda, ++ y -dependiendo de la posicin De izquierda a derecha De izquierda a derecha De derecha a izquierda

La jerarqua en los operadores nos ayudan a poder definir la manera adecuada en la que una instruccin de clculo debe ser escrita en el lenguaje de programacin, por ejemplo si deseamos llevar a cabo la frmula

La instruccin de asignacin que quisiramos definir quedara como:

e = ((a*b*c) / d) / f

Ejemplo:

import java.awt.*; import java.applet.*;

// <applet width="200" height="200" code="pru"></applet>

public class pru extends Applet { public void paint(Graphics g) { double e,a,b,c,d,f;

a=20; b=12; c=2; d=5; f=10; e = ((a*b*c) / d) / f; g.drawString("((a*b*c) / d) / f = "+e, 100, 20); } }

Pero esto no significa que es la nica manera de escribirla, ya que si aplicamos la jerarqua de los operadores la siguiente instruccin tambin sera valida: e=a*b*c/d/f La operacin anterior sera ejecutada de la siguiente manera:

Primero, se multiplicar a por b. Segundo, el resultado ya obtenido de a*b se multiplicar por c. Tercero, el resultado ya obtenido de a*b*c se dividir entre d. Finalmente, el resultado ya obtenido de a*b*c/d se dividir entre f para asignarse a e.

Cul sera la manera de codificar la siguiente frmula?

La respuesta es: e = 4/((a+b)/(c/d)) + v/w/p + 5*m*n*q

Aplicando las reglas de jerarqua de los operadores aritmticos queda de la siguiente manera: Primero, se sumar a ms b. Segundo, se dividir c entre d. Tercero, el resultado ya obtenido de a+b se dividir entre el resultado ya obtenido de c/d. Cuarto, se dividir 4 entre el resultado ya obtenido de ((a+b)/(c/d)) Quinto, se dividir v entre w. Sexto, se dividir el resultado ya obtenido de v/w entre p. Sptimo, se multiplicar 5 por m. Octavo, se multiplicar el resultado ya obtenido de 5*m por n. Noveno, se multiplicar el resultado ya obtenido de 5*m*n por q. Dcimo, se sumar el resultado ya obtenido de 4/((a+b)/(c/d)) ms el resultado ya obtenido de v/w/p. Finalmente, se sumar el resultado ya obtenido de 4/((a+b)/(c/d)) + v/w/p ms el resultado ya obtenido de 5*m*n*q y se asignar a e.

Actividades n 02.03
GUIA DE actividad N3 autoaprendizaje

Programa: Programacin

Curso: Variables y Estructuras de Control en la Programacin Orientada a Objetos: JAVA Unidad didctica: Solucin de problemas bsicos con aplicaciones que involucran clculo Nombre de la actividad: Operaciones y su Jerarqua

Objetivo especfico de aprendizaje

Utilizar la jerarqua de los operadores aritmticos para poder hacer clculos complejos.

Duracin de la actividad

Producto a entregar

Forma de entrega

3 horas

Como resultado de la actividad el alumno:

Por la plataforma

Dada una frmula poder desarrollar la instruccin necesaria en Java para hacer el clculo.

Entender el uso de la jerarqua en una instruccin que maneja operaciones en Java.

Actividad previa

Recursos de apoyo

Tomando datos y desplegando informacin en un applet.

Unidad 2. Tema 3. Operaciones Aritmticas y su Jerarqua

Descripcin de la actividad

1. 2.

Hacer la lectura de Operaciones y Jerarqua. Practicar desarrollando un Applet que tome los coeficientes de una ecuacin

cuadrtica de la forma:

y d como resultado las dos races utilizando las frmulas

http://es.wikipedia.org/wiki/Ecuaci%C3%B3n_de_segundo_grado
La solucin debe tener un applet como el que se muestra

NOTA: OJO con ciertos valores puede dar soluciones imaginarias y el Applet mandar un error de ejecucin, esto lo arreglaremos posteriormente.

Debes enviar por medio del enlace de la actividad lo siguiente:

Carpeta comprimida con el siguiente nombre: nombre del aprendriz_actividad_3 Dicha carpeta debe contener la carpeta del proyecto que has creado en Jcreator. (AppleteEcuacion.html, AppleteEcuacion.class, AppleteEcuacion.java)

1.3. Decisiones
Introduccin: Las decisiones son parte de nuestra vida diaria, ya que en todo momento el ser humano toma decisiones en base a la informacin que tiene, para llegar a tomar una accin y determinado rumbo en su vida. En la programacin las decisiones forman parte de la mayora de los programas, pues siempre hay al menos una decisin en la que se compare el valor de alguna variable.

Objetivo: Entender que es una decisin en el lenguaje de programacin Java y como se puede implementar. Manejar los diferentes tipos de decisiones y usar la lgica para implementarlas en una solucin.

03.01 If
Estatuto if Este estatuto nos sirve para realizar alguna(s) instruccin(es) en vez de otra(s) de acuerdo a alguna condicin que resulte verdadera, analizaremos la sintaxis de las decisiones en Java y despus utilizaremos algunos ejemplos. Sintaxis if ( condicin estatuto; else estatuto; En caso de requerir ms de un estatuto es necesario usar llaves. if ( condicin ) { bloque de estatutos; } else { bloque de estatutos; } // la parte else es opcional // la parte else es opcional

Una condicin es la comparacin de una variable/constante/expresinnumerica contra otra variable/constante/expresin-numrica. A este tipo de condicin se le llama condicin simple , la condicin compleja se manejar en la ultima unidad. La condicin simple utiliza los siguientes operadores de relacin:

Operadores Relacionales Los operadores relacionales que tiene Java son : Operador en Java == != < > <= >= Significado Igual Diferente Menor que Mayor que Menor o igual que Mayor o igual que

Un ejemplo puede ser que X sea igual a 10 la condicin quedara como If (x == 10) .. Otro podra ser checar si el rea del crculo con radio r es menor a 100 If (Math.PI() * Math.pow(r, 2) < 100) . Etc. Ejecucin del if La estructura if (sin else), ejecuta el estatuto solo cuando la condicin es verdadera; en caso de que sea falsa brinca el estatuto (o estatutos en caso de tener ms de uno entre llaves)

La estructura de seleccin if / else , ejecuta la(s) accin(es) despus de la parte if cuando la condicin es verdadera; en caso de que sea falsa ejecuta la(s) accin(es) que est(n) despus del else. Ejemplo if (promedio >= 70) t.setText(" Aprobado");

else t.setText("Reprobado");

ifs anidados Se dice que hay if anidados cuando existe un if/else dentro de otra estructura if/else Ejemplo: Determinar si un nmero es positivo, cero o negativo. if (num > 0) t.setText("El nmero es positivo"); else if (num == 0) t.setText("El nmero es cero"); else t.setText("El nmero es negativo"); El applet quedaria como sigue: import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="200" height="200" code="AppletDecisiones1"></applet> public class AppletDecisiones1 extends Applet implements ActionListener { Label l1, l2; TextField t1, t2; Button b;

public AppletDecisiones1() { l1 = new Label("Numero"); t1 = new TextField(6);

l2 = new Label("Resultado"); t2 = new TextField(18); b = new Button("Calcula"); add(l1); add(t1); add(l2); add(t2); add(b); b. addActionListener(this); } public void actionPerformed(ActionEvent ae) { int num = Integer.parseInt(t1.getText()); if (num > 0) t2.setText("El nmero es positivo"); else if (num == 0) t2.setText("El nmero es cero"); else t2.setText("El nmero es negativo"); } }

El applet en ejecucin se muestra como sigue:

En el applet anterior hicimos uso del constructor TextField(entero) donde entero es un nmero entero para definir el nmero de espacios que se quieren usar en el campo de texto creado.

Si tenemos el siguiente fragmento de cdigo: if (condicin 1) if (condicin 2) estatuto; else // este else pertenece al if de la condicin 2, pues se asocia al if ms cercano estatuto; Y queremos que el else pertenezca al primer if debemos poner {} para determinar donde termina el segundo if: if (condicin 1) { if (condicin 2) estatuto; } else // con el uso de llaves cerramos el if anidado y el else estatuto; // pertenece al primer if

Ejemplos de Programas A continuacin tendrs algunos ejemplos de programas en Java:

Ejemplo I: Programa que calcula la energa necesaria para la combustin de un compuesto dada la cantidad de tomos "x" y "y" de dos diferentes elementos, de acuerdo a la siguiente frmula: 4x + 3x2y - 2y si x > 0 , y >= 0 e(x,y) = x2 - 4(y - x) + y2 si x < 0 , y >= 0

x2 + y + y (x- 2) en cualquier otro caso import java.awt.*; import java.applet.*; import java.awt.event.*; import java.lang.Math; // <applet width="200" height="200" code="AppletDecisiones2"></applet> public class AppletDecisiones2 extends Applet implements ActionListener { Label l1, l2, l3; TextField t1, t2, t3; Button b;

public AppletDecisiones2() { l1 = new Label("VALOR x"); t1 = new TextField(6); l2 = new Label("VALOR y"); t2 = new TextField(6); l3 = new Label("Resultado"); t3 = new TextField(6); b = new Button("Calcula");

add(l1); add(t1); add(l2); add(t2); add(l3); add(t3); add(b); b. addActionListener(this); } public void actionPerformed(ActionEvent ae) { double x = Double.parseDouble(t1.getText()); double y = Double.parseDouble(t2.getText()); double res; if (y >= 0) if ( x > 0) res = 4 * x + 3 * Math.pow (x,2) * y - 2 * y; else res = Math.pow(x,2) - 4* (y - x) + Math.pow (y,2); else res = Math.pow (x,2) + y + y * (x-2); t3.setText("" + res); }

Ejemplo II: Programa que lee 3 nmeros enteros diferentes y los despliega de mayor a menor. import java.awt.*; import java.applet.*; import java.awt.event.*;

// <applet width="200" height="200" code="AppletDecisiones3"></applet> public class AppletDecisiones3 extends Applet implements ActionListener { Label l1, l2, l3,l4; TextField t1, t2, t3,t4; Button b;

public AppletDecisiones3() { l1 = new Label("VALOR 1");

t1 = new TextField(6); l2 = new Label("VALOR 2"); t2 = new TextField(6); l3 = new Label("VALOR 2"); t3 = new TextField(6); l4 = new Label("Resultado"); t4 = new TextField(16); b = new Button("Calcula"); add(l1); add(t1); add(l2); add(t2); add(l3); add(t3); add(b); add(l4); add(t4); b. addActionListener(this); } public void actionPerformed(ActionEvent ae) { double a = Double.parseDouble(t1.getText()); double b = Double.parseDouble(t2.getText());

double c = Double.parseDouble(t3.getText()); double res; if (a >= b) if ( a >= c) t4.setText(""+ a + " es el mayor"); else t4.setText(""+ c + " es el mayor"); else if ( b >= c) t4.setText(""+ b + " es el mayor"); else t4.setText(""+ c + " es el mayor"); } } La aplicacin ejecutando funcionara como se observa:

Actividades n 03.01
Guia actividad 1 unidad 3 autoaprendizaje

Programa: Programacin Curso: Variables y Estructuras de Control en la Programacin Orientada a Objetos: JAVA Unidad didctica: Decisiones Nombre de la actividad: Manejo de condiciones en Java

Objetivo especfico de aprendizaje Aplicar el uso de las condiciones en soluciones que requieran su uso.

Duracin de la actividad

Producto a entregar

Forma de entrega

3 horas

Como resultado de la actividad el alumno:

Por la plataforma

Entender la manera en la que las decisiones se pueden utilizar en Java para tener soluciones con varias acciones diferentes utilizando el if.

Manejar el estatuto switch para las soluciones anidadas.

Actividad previa Uso de las Operaciones y Jerarqua de Operaciones.

Recursos de apoyo Unidad 3. Tema 1. Condiciones en Java.

Descripcin de la actividad

1.

Hacer la lectura definida de Condiciones en Java.

2. Utilizar los ejemplos de la lectura, compilarlos y ejecutarlos. 3. Practicar haciendo un applet llamado ImpuestoApplet que tome el precio de un producto y calcule el impuesto a pagar de acuerdo a la tabla siguiente: Precio del artculo Menor a 10,000 Mayor o igual a 10,000 y menor a 25,000 Mayor o igual a 25,000 % impuesto 5% 10% 15%

El applet deber presentar algo parecido a lo siguiente:

03.02 Switch
Estatuto Switch Se utiliza para ejecutar acciones diferentes segn el valor de una expresin o variable. Este estatuto sustituye al uso de ifs dentro de ifs, concepto conocido como ifs anidados. Consiste en una serie de de etiquetas case

y un case por omisin (default)

Sintaxis switch ( variable) la variable es de tipo entero o carcter { case valor1 : accion1; break; case valor2 : accion2; break; . . case valor n : accionn; break; default: accionD; }; La accin 1 se ejecuta si la variable adquiere el valor1. La accin 2 se ejecuta si la variable adquiere el valor 2. La accin n se ejecuta si la variable adquiere el valor n. Cualquier otro valor de la variable conduce a la realizacin de la secuencia accionD, indicada por la palabra reservada default. La secuencia default puede omitirse

Estatuto break Cuando se encuentra una sentencia case que concuerda con el valor del switch se ejecutan las sentencias que le siguen y todas las dems a partir de ah, a no ser que se introduzca una sentencia break para salir de la sentencia switch. Ejemplo : Programa que pide un nmero de mes y escribe la cantidad de das que tiene. import java.awt.*; import java.applet.*; import java.awt.event.*;

// <applet width="200" height="200" code="AppletDecisiones4"></applet> public class AppletDecisiones4 extends Applet implements ActionListener {

Label l1, l2; TextField t1, t2; Button b;

public AppletDecisiones4() { l1 = new Label("mes"); t1 = new TextField(3); l2 = new Label("Resultado"); t2 = new TextField(16); b = new Button("VER MES"); add(l1); add(t1); add(b); add(l2); add(t2); b. addActionListener(this); } public void actionPerformed(ActionEvent ae) { int mes = Integer.parseInt(t1.getText()); switch (mes) { case 1:

t2.setText("Enero"); break; case 2: t2.setText("Febrero"); break; case 3: t2.setText("Marzo"); break; case 4: t2.setText("Abril"); break; case 5: t2.setText("Mayo"); break; case 6: t2.setText("Junio"); break; case 7: t2.setText("Julio"); break; case 8: t2.setText("Agosto");

break; case 9: t2.setText("Septiembre"); break; case 10: t2.setText("Octubre"); break; case 11: t2.setText("Noviembre"); break; case 12: t2.setText("Diciembre"); break; default: t2.setText("Error en el mes"); } } }

Algunos ejemplos de esta aplicacin son:

Actividades n 03.02
GUIA actividad 2 UNIDAD 3 autoaprendizaje

Programa: Programacin Curso: Variables y Estructuras de Control en la Programacin Orientada a Objetos: JAVA Unidad didctica: Decisiones

Nombre de la actividad: Uso del Switch

Objetivo especfico de aprendizaje Hacer uso del estatuto switch para facilitar el desarrollo de soluciones que requieren ifs anidados.

Duracin de la actividad 3 horas

Producto a entregar

Forma de entrega

Como resultado de la actividad el alumno:

A travs de la plataforma

Conocer el uso del estatuto switch para el desarrollo de soluciones que requieren de ifs anidados..

Aplicar el uso del estatuto switch a soluciones que ya tienen el uso de ifs anidados.

Actividad previa Manejo de condiciones.

Recursos de apoyo Unidad 3. Tema 2. Manejo del Switch.

Descripcin de la actividad

1. Hacer la lectura definida del Uso del Switch. 2. Utilizar el ejemplos de la lectura, compilarlo y ejecutarlo. 3. Practicar haciendo un applet llamado FechaApplet que tome el

nmero de da y el nmero de mes y despliegue el dia en letras (1Lunes, 2-Martes, etc) y el mes con letras (1-Enero, 2-Febrero,etc).

Debes utilizar la instruccin switch. El applet deber presentar algo parecido a lo siguiente:

03.03 Operaciones Lgicas


Una condicin compuesta es aquella que utiliza los operadores lgicos para comparar condiciones sencillas.

Operadores Lgicos Los operadores lgicos que maneja Java son: Operador Lgico || && ! Significado or and not

El uso y de estos operadores es en conjuncin con condiciones simples, por ejemplo si quiero revisar si x esta entre el rango de 1 a 100 incluyendo los lmites sera:

If (x >= 1 && x <= 100)

Las tablas de verdad, es decir cuando es verdadera o falsa toda la condicin se muestran a continuacin: Tabla de verdad del and if (condicion-simple-1 && condicin-simple-2) .

Condicin simple 1 Condicin simple 2 Verdadera Verdadera Falsa Falsa Verdadera Falsa Verdadera Falsa

Condicin resultante Verdadera Falsa Falsa Falsa

Ejemplos: Dados x = 10 y z = 5 Evaluemos cada una de las siguientes condiciones

If ( x != 3 && z % 2 == 0).. x!= 3 es verdadera z % 2 == 0 es falsa toda la condicin es falsa

If ( x >= 2 && z % 5 == 0).. x >= 2 es verdadera z % 5 == 0 es verdadera toda la condicin es verdadera

Tabla de verdad del or if (condicion-simple-1 || condicin-simple-2) .

Condicin simple 1 Condicin simple 2 Verdadera Verdadera Falsa Falsa Verdadera Falsa Verdadera Falsa

Condicin resultante Verdadera Verdadera Verdadera Falsa

Ejemplos: Dados x = 10 y z = 5 Evaluemos cada una de las siguientes condiciones

If ( x != 3 || z % 2 == 0).. x!= 3 es verdadera z % 2 == 0 es falsa toda la condicin es verdadera

If ( x >= 2 || z % 5 == 0)..

x >= 2 es verdadera z % 5 == 0 es verdadera toda la condicin es verdadera

Tabla de verdad del not if (! condicin-simple) .

Condicin simple Condicin resultante Verdadera Falsa Falsa Verdadera

Ejemplos: Dados x = 10 y z = 5 Evaluemos cada una de las siguientes condiciones

If ( ! x > 10).. x > 10 es falsa toda la condicin es verdadera

If ( ! z <= 20).. z <= 20 es verdadera toda la condicin es falsa

Jerarqua de Operadores Lgicos

La jerarqua de los operadores lgicos es como se muestra:

Operador Lgico () ! && ||

Significado

not and or

La jerarqua primero revisa en una condicin lo que existe entre parntesis, para despus revisar el not, despus el and y finalmente el or.

Ejemplos: Dados x = 10 y z = 5 Evaluemos cada una de las siguientes condiciones

if ( x > = 1 && x <= 100 || z >0 ) ..

Primero ser revisa x >=1 && x <= 100 , lo cual es verdadero, ya que con un and ambos tienen que ser verdaderos, y en este caso x es mayor o igual a 1 y menor o igual a 100 Despus esa condicin verdadera se compara con el or con Z>0 la cual es verdadera y como en el or con que una condicin sea verdadera entonces todo se hace verdadero, al condicin completa es verdadera

if ( x % 2 == 0 || ! z >= 4 && z <= 8)

Primero ser ! z >= 4 , ya que z >= 4 es verdadero, con el not se cambia a

falso Despus sigue el && como ahora del lado izquierdo tenemos un falso, la comparacin del !z>=4 && z <= 8 resulta ser falso, pues tenemos falso && verdadero. Posteriormente hacemos el || tenemos que x % 2 == 0 es verdadero y como estamos con un or, entonces toda la condicin es verdadera, pues con que una de las condiciones sea verdadera en el or, todo se hace verdadero.

Actividades n 03.03
GUIA actividad 3 UNIDAD 3 autoaprendizaje

Programa: Programacin Curso: Variables y Estructuras de Control en la Programacin Orientada a Objetos: JAVA Unidad didctica: Decisiones Nombre de la actividad: Operaciones Lgicas y su Jerarqua

Objetivo especfico de aprendizaje Utilizar la jerarqua de los operadores lgicos para poder tener instrucciones de decisiones complejas.

Duracin de la actividad

Producto a entregar

Forma de entrega

3 horas

Como resultado de la actividad el alumno:

Por la plataforma

Dada una condicin compleja poder desarrollar la instruccin de decisin que pueda implementarla.

Entender el uso de la jerarqua de los operadores lgicos en una instruccin que maneja condiciones en Java.

Actividad previa Switch.

Recursos de apoyo Unidad 3. Tema 3. Operaciones Lgicas y su Jerarqua

Descripcin de la actividad

1. Hacer la lectura de Operaciones Lgicas y Jerarqua. 2. Practicar desarrollando un Applet 1. Haz un applet que te pida el

nmero de dias trancurridos en el ao y el ao en el que se trate (mediante dos campos de texto) y que te calcule el da y mes que se trate y te deje el mismo ao (tres campos de texto resultantes), por ejemplo si tiene 70 dias del ao 2004, entonces deber de escribir en el campo resultante de dias la cantidad de 10, en el mes la cantidad de 3, y el mismo ao en el ao resultante, entonces para 2004,70 deber de dar 10, 3, 2004, como se muestra en el ejemplo:

1.4. Ciclos
Las repeticiones o los ciclos es el concepto nuevo que aprenders al revisar y aprobar los conceptos de esta unidad. Las repeticiones es uno de los conceptos ms utilizados en el desarrollo de aplicaciones, cuando trabajas con algn lenguaje de programacin, ya que permiten el repetir una serie de instrucciones sin tener que copiarlas varias veces.

04.01 Ciclos Fijos: while y do..while


Estatuto while Sintaxis while ( condicin ) estatuto; Si se requiere realizar ms de un estatuto se deben utilizar llaves. while ( condicin ) { bloque de estatutos;

} Aqu se ejecuta el (los) estatuto (s) mientras la condicin es verdadera; al momento de ser falsa termina el ciclo. Si la condicin es falsa la primera vez nunca se ejecuta(n) el (los) estatuto(s). Ejemplo: Applet que toma la cantidad de dinero a invertir, el porcentaje de inversin mensual y el dinero que se quiere tener invertido finalmente y va desplegando en un campo (TextArea) el nuevo saldo mes tras mes. import java.awt.*; import java.applet.*; import java.awt.event.*;

// <applet width="300" height="400" code="AppletCiclos1"></applet> public class AppletCiclos1 extends Applet implements ActionListener { Label l1, l2, l3,l4; TextField t1, t2,t3; TextArea ta; Button b;

public AppletCiclos1() { l1 = new Label("Inversin Inicial"); t1 = new TextField(8); l2 = new Label("% interes mensual"); t2 = new TextField(5); l3 = new Label("Inversin Final"); t3 = new TextField(8); l4 = new Label("Resultados de la Inversin");

ta = new TextArea(20,30); b = new Button("VER MES"); add(l1); add(t1); add(l2); add(t2); add(l3); add(t3); add(b); add(l4); add(ta); b. addActionListener(this); }

public void actionPerformed(ActionEvent ae) { double invinicial = Double.parseDouble(t1.getText()); double interes = Double.parseDouble(t2.getText()); double invfinal = Double.parseDouble(t3.getText()); ta.setText(""); int mes = 1; double saldo = invinicial; while (saldo < invfinal) { saldo = saldo * (1 + interes/100); ta.append(" mes " + mes + " Saldo = " + saldo + "\n");

mes ++; } } } Un ejemplo de la ejecucin de este applet es:

En este applet hemos utilizado el texto de rea TextArea t, el cual nos ayuda a mostrar la informacin por lnea, haciendo uso del mtodo append(), es importante tambin notar que dentro del mtodo append hemos concatenado el caracter "\n", el cual nos sirve para saltar de lnea dentro del objeto TextArea, ya que con el append aadimos caracteres que son concatenados, pero nunca se salta de lnea. Estatuto do .. while Sintaxis do estatuto; while ( condicin );

Si se requiere realizar ms de un estatuto se deben utilizar llaves. do { bloque de estatutos; } while ( condicin ); // nota que lleva ;

Se realizan los estatutos y se verifica la condicin, mientras sea verdadera se sigue ejecutando; al momento de ser falsa termina el ciclo. Dado que la condicin se revisa al final del ciclo el (los) estatuto (s) se realizan al menos una vez a diferencia del while Ejemplo: Dado un nmero en un campo texto, desplegar en otro el nmero de dgitos del primero import java.awt.*; import java.applet.*; import java.awt.event.*;

// <applet width="300" height="400" code="AppletCiclos2"></applet> public class AppletCiclos2 extends Applet implements ActionListener { Label l1, l2; TextField t1, t2; Button b;

public AppletCiclos2() { l1 = new Label("Numero"); t1 = new TextField(8);

l2 = new Label("Digitos"); t2 = new TextField(20); b = new Button("SABER DIGITOS"); add(l1); add(t1); add(b); add(l2); add(t2); b. addActionListener(this); }

public void actionPerformed(ActionEvent ae) { int x = Integer.parseInt(t1.getText()); int cant = 0; do { x = x / 10; cant++; } while (x > 0); t2.setText("El numero tiene " + cant + " digitos"); } } La visualizacin de este applet queda de la siguiente manera:

Actividades n 04.01
Objetivo especfico de aprendizaje Entender la forma en la que se manejan los ciclos variables para la solucin de problemas que lo requieran.

Duracin de la actividad 4.5 horas

Producto a entregar

Forma de entrega

Como resultado de la actividad el alumno:

Por plataforma

Entender la manera en la que se utiliza el estatuto while para el desarrollo de ciclos variables en Java.

Aplicar el uso del estatuto while a soluciones que requieran un ciclo variable.

Actividad previa Jeraqua de los Operadores Lgicos.

Recursos de apoyo Unidad 4. Tema 1. Ciclos Variables

Descripcin de la actividad

1. Hacer la lectura definida de Ciclos Variables. 2. Utilizar los ejemplos de la lectura, complalos y ejectalos. 3. El laboratorio "Dr. Morelos" desea hacer un estudio para determinar
cuantos das requiere una bacteria para duplicar su poblacin. Por favor ayuda al laboratorio en esta importante actividad que le permitir determinar este parmetro y considerarlo en su anlisis para combatir bacterias. Desarrolla un applet llamado SimulacionApplet que toma la poblacin de una bacteria y un % de aumento diario y utilizando un botn desplegar (en un Texto de rea) como va aumentando la bacteria da con da (utilizando el % de aumento para la poblacin del da siguiente) , la simulacin terminar cuando la poblacin alcance a doblar la poblacin inicial.

El applet deber presentar algo parecido a lo siguiente:

04.02. Ciclos Variables: For


Estatuto for Sintaxis for (inicializacin ; condicin ; accin ) estatuto; Si se requiere realizar ms de un estatuto se deben utilizar llaves. for (inicializacin ; condicin ; accin ) { } bloque de estatutos;

Funcionamiento del For

1. 2.

Ejecuta el o los estatutos de inicializacin Evala la condicin, si es verdadera entra al ciclo

3. 4.

Ejecuta el o los estatutos Ejecuta la o las acciones y regresa al paso 2

Notas sobre el For Las 3 partes del for son opcionales, si no se pone condicin se toma como verdadero. Si no se incluye la inicializacin o condicin, los ; deben de ir. Ejemplo: for ( ; a > 10 ; a--) Si la primera vez la condicin es falsa no se ejecuta ningn estatuto y termina el for Una variable puede declararse en la seccin de inicializacin, solo hay que tomar en cuenta que esta variable solo es reconocida dentro del ciclo. Ejemplo: for (int num = 1; num < = 10; num++)

Ejemplo I: Mostrar los N primeros nmeros de la serie de Fibonacci. La serie es 1,1,2,3,5,8,13....

import java.awt.*; import java.applet.*; import java.awt.event.*;

// <applet width="300" height="400" code="AppletCiclos3"></applet> public class AppletCiclos3 extends Applet implements ActionListener { Label l1, l2; TextField t1; TextArea t; Button b;

public AppletCiclos3() { l1 = new Label("Numero"); t1 = new TextField(8); l2 = new Label("Serie"); t = new TextArea(20,10); b = new Button("Fibonacci"); add(l1); add(t1); add(b); add(l2); add(t); b. addActionListener(this); }

public void actionPerformed(ActionEvent ae) { int n = Integer.parseInt(t1.getText()); t.setText("1" + "\n"); t.append("1" + "\n"); int a = 1, b = 1, fibo; for (int i = 3; i<= n; i++) // empiezo i en 3 porque ya mostre los 2 primeros { fibo = a + b;

t.append("" + fibo + "\n"); a = b; b = fibo; } } } El applet ejecutado se visualizara as:

Ejemplo II: Sumar todos los nmeros nones desde 1 hasta el nmero dado por el usuario import java.awt.*; import java.applet.*;

import java.awt.event.*;

// <applet width="200" height="200" code="AppletCiclos4"></applet> public class AppletCiclos4 extends Applet implements ActionListener { Label l1, l2; TextField t1,t2; Button b;

public AppletCiclos4() { l1 = new Label("Numero"); t1 = new TextField(8); l2 = new Label("Suma"); t2 = new TextField(8); b = new Button("Suma"); add(l1); add(t1); add(b); add(l2); add(t2); b. addActionListener(this); }

public void actionPerformed(ActionEvent ae) { int n = Integer.parseInt(t1.getText());

int suma = 0; for (int i = 1; i<= n; i++) { suma += i; } t2.setText("" + suma); } }

La ejecucin del siguiente applet quedara como:

Ciclo infinito Cuando en un ciclo la condicin siempre es verdadera se dice que es un ciclo infinito, pues nunca saldr del ciclo y el programa no termina. Para evitarlos hay que estar seguros que en el bloque de estatutos haya un estatuto que modifique el valor de la condicin de tal modo que llegue a ser falsa. Ejemplos de ciclos infinitos Ejemplo I En este ejemplo supongamos que en el applet de las inversiones, nos equivocamos en la condicin del while y en lugar de tener (saldo < invfinal), tuviramos (invinicial < invfinal), en este caso, la condicin siempre hubiera sido verdadera, pues a quien le estamos acumulando es a la variable saldo, no

a invinicial. Este es un error de ejecucin difcil de encontrar. Ejemplo II En este ejemplo supongamos que en el applet de los dgitos, donde usamos el do while, en la condicin del while no tenemos (x > 0) sino que utilizamos por error la variable cant, teniendo while (cant > 0) en lugar de while (x > 0), obviamente esto siempre seria verdad, ya que cant siempre se est incrementando. A su vez este error es difcil de ver. El applet seguir ejecutndose (por siempre) y no nos daremos cuenta, es importante observar que el botn sigue seleccionado, lo cual indica que el applet esta procesando las instruccines puestas en el actionPerformed, como se observa en la siguiente figura: Nunca pondr nada en el segundo campo de texto y habr que cancelarlo.

Actividades n 04.02
Objetivo especfico de aprendizaje Tomar datos en un applet para poder trabajar con valores que el usuario de.

Duracin de la actividad 3 horas

Producto a entregar

Forma de entrega

Como resultado de la actividad el alumno:

A travs de la plataforma

Podr definir un applet que maneja objetos que permiten tomar datos del usuario.

Podr desplegar resultados de operaciones para que el usuario las observe.

Actividad previa Saber compilar y ejecutar un applet o una aplicacin.

Recursos de apoyo Unidad 2. Tema 2. Lectura de Datos

Descripcin de la actividad

1. Hacer la lectura definida de Ciclos Fijos. 2. Utilizar los ejemplos de la lectura, complalos y ejectalos.
Haz un applet que te calcule el factorial de un nmero N, el cual te dar el usuario, el factorial de un nmero N, definido matemticamente como N! se obtiene como la multiplicacin de todos los nmeros que estn desde el 1 hasta el N = 1 * 2 * 3 * ..... (N-2) * (N-1) * N, como se muestra en la figura, por definicin el factorial de 0 es 1. El applet deber presentar algo parecido a lo siguiente

04.03 Ciclos Infinitos


Ciclo infinito Cuando en un ciclo la condicin siempre es verdadera se dice que es un ciclo infinito, pues nunca saldr del ciclo y el programa no termina. Para evitarlos hay que estar seguros que en el bloque de estatutos haya un estatuto que modifique el valor de la condicin de tal modo que llegue a ser falsa. Ejemplos de ciclos infinitos Ejemplo I En este ejemplo supongamos que en el applet de las inversiones, nos equivocamos en la condicin del while y en lugar de tener (saldo < invfinal), tuviramos (invinicial < invfinal), en este caso, la condicin siempre hubiera sido verdadera, pues a quien le estamos acumulando es a la variable saldo, no a invinicial. Este es un error de ejecucin difcil de encontrar. Ejemplo II En este ejemplo supongamos que en el applet de los dgitos, donde usamos el do while, en la condicin del while no tenemos (x > 0) sino que utilizamos por error la variable cant, teniendo while (cant > 0) en lugar de while (x > 0), obviamente esto siempre seria verdad, ya que cant siempre se est incrementando. A su vez este error es difcil de ver. El applet seguir ejecutndose (por siempre) y no nos daremos cuenta, es importante observar que el botn sigue seleccionado, lo cual indica que el applet esta procesando las instruccines puestas en el actionPerformed, como se observa en la siguiente figura: Nunca pondr nada en el segundo campo de texto y habr que cancelarlo.

1.5. Ampliacin
Del foro del curso he visto varias respuestas muy interesantes que nos pueden aportar a todos: 1) public class factorial extends Applet implements Explicacin de LORENZO ANTONIO LINCE HERRERA Cuando haces extends estas extendiendo el tipo de interfaz o por decirlo as el tipo de ventana , ejemplos: extend Applet extend Panel extend Frame extend Dialog

etc.

2) Zona import al principio de un programa java: Por ejemplo: import java.awt.*; import java.applet.*; import java.awt.event.*;

Los import son paquetes que contienen las clases a la cual tienes que acudir para poder utilizar los objetos Si no tendras que hacer as: java.applet.Applet java.awt. Button cada ves que quieras instanciar un botn lo tendras que escribir as (java.awt. Button b1 = New Button) pero si haces el import no , todo se trabaja de forma jerrquica

3) Poner dos botones en un formulario y que cada uno haga una cosa distinta: (respuesta de: LORENZO ANTONIO LINCE HERRERA ) constructor() { Button b1=new Button("nombre"); Button b2=new Button("nombre"); b1.addActionListener(this);

b2.addActionListener(this); } public void actionPerformed(ActionEvent ae) { if (ae.getSource() == b1) { // la accin que quieres que haga del botn 1 } else if (ae.getSource() == b2) { // la accin que quieres que haga del botn 2 }

Esquema Programa en Java (I)


He creado este esquema para descomponer las partes de un fichero .java, que llevamos hasta ahora en el curso:

Si lo quereis descargar en .pdf, pulsa en este enlace. Nota: Vereis 5 anuncios,cuando se muestre cada anuncio, en el lado superior derecho aparecera:

Skip This Ap>


pulsar alli para terminar de ver el anuncio. Asi me ayudais, ya que cobro 0.0001 $ por cada anuncio que se vea. Gracias.

Ide para Java realizado para Gnu/Linux

Os dejo el enlace de un programa que he realizado, que funciona como un pequeo Ide para Java en Gnu/Linux. El programa esta realizado en Gambas2, y proporciono su cdigo fuente, al ser softwarelibre y con licencia GPL.

Enlace a mi blog para ver y descargar el programa.

II. Desarrollo de Aplicaciones con interfaz Grfica y manejo de clases y objetos


Manejo de los Hilos En esta unidad veremos los diversos mtodos que se relacionan con el manejo de hilos. Utilizaremos muchos de estos mtodos en ejemplos de cdigo

En esta unidad aprenders cmo unar mens en tus programas de Java. Los mens permiten al usuario realizar acciones directas o indirectas a travs de un conjunto de elementos u opciones del men. Un elemento de un men puede ser un comando para ejecutar un mtodo o puede ser otro men, es decir, un submen.

Desarrollo de un programa con hilos

Objetivo especfico de aprendizaje Aplicar la programacin con hilos en el desarrollo de programas.

Duracin de la actividad 5 horas

Producto a entregar Como resultado de la actividad el alumno: - Crear programas donde se aplique la programacin con hilos.

Forma de entrega

Descripcin de la actividad

1. Hacer la lectura titulada Un ejemplo. 2. Compilar y ejecutar los dos ejemplos vistos en la lectura: Hilos1.java e Hilos2.java.
Es importante que antes de ejecutar cada programa lo compiles porque ambos utilizan la clase Hilo1 que es diferente en cada ejemplo, tiene el mismo nombre pero est codificada en forma diferente por las razones expuestas en la presentacin. Modificar el cdigo de Hilos1.java para que ahora cree 4 hilos de ejecucin diferentes en lugar de dos. Enviar por la plataforma el archivo de java con las modificaciones para su revisin.

3.

4. Utilizando Objetos con Hilos Los hilos de un programa compiten por el tiempo de procesador, esperan mientras otros hilos tambin tratan de entrar en ejecucin. Es necesario sincronizar el acceso a los objetos compartidos para evitar inconsistencias. En esta unidad entenders la forma en como este proceso se lleva a cabo.

Introduccin: Los hilos pueden ser ejecutados en forma asncrona es decir, una vez que es iniciado un hilo, este vive de forma independiente de los otros hilos, no existe ninguna relacin entre ellos, ni tampoco ningn conflicto, dado que no comparten nada. Sin embargo, hay ocasiones que distintos hilos en un programa si necesitan establecer alguna relacin entre s o compartir objetos. Se requiere entonces de algn mecanismo que permita sincronizar hilos as como establecer las polticas para acceder a recursos (objetos)

compartidos. En esta unidad aprenderemos sobre las prioridades que tienen los hilos y la forma en la que se puede sincronizarlos a fin de no producir aplicaciones con resultados inconsistentes por la forma en la que acceden al objeto compartido.

Objetivo: Utilizar las herramientas que proporciona Java para sincronizar procesos que comparten objetos.

Descripcin de la actividad

1. 2.

Hacer la lectura del tema Prioridades y Sincronizacin. Leer el artculo Achieve strong performance with threads, Part 2 que se encuentra en la pgina: http://www.javaworld.com/javaworld/jw-06-2002/jw0607-java101.html? 3. Escribir un documento en el que respondas las siguientes preguntas. Incluye en tus respuestas cdigos que representan la situacin planteada. Pueden mltiples hilos acceder la misma variable local o parmetro? Por qu es importante la sincronizacin? El artculo previene acerca de sincronizar el mtodo run(). Escribe un programa que demuestre el porque no debes sincronizarlo.

Introduccin: Un men dentro de una aplicacin es una forma sencilla de ahorrar espacio adems de permitir al usuario de una manera elegante seleccionar una de las diferentes opciones a realizar. El lenguaje de programacin Java proporciona las herramientas necesarias para la creacin de mens de distintos tipos. As mismo, cuenta con manejadores de eventos que permiten detectar el origen del evento y manejarlo. Objetivo: Utilizar las herramientas que proporciona Java para creacin y manejo de mens.

Descripcin de la actividad

1. 2.

Hacer la lectura del tema Manejo de eventos en Mens. Utilizar el ejemplo descrito en la lectura para compilarlo, ejecutarlo y entender su funcionamiento. 3. Practicar agregando al applet que se hizo anteriormente en esta unidad la deteccin de eventos producidos por los mens. 4. Entregar el applet generado. Utilizando objetos con hilos.

Los hilos de un programa compiten por el tiempo de procesador, esperan mientras otros hilos tambin tratan de entrar en ejecucin. Es necesario sincronizar el acceso a los objetos compartidos para evitar inconsistencias. En esta unidad entenders la forma en como este proceso se lleva a cabo.

Introduccin: Los hilos pueden ser ejecutados en forma asncrona es decir, una vez que es iniciado un hilo, este vive de forma independiente de los otros hilos, no existe ninguna relacin entre ellos, ni tampoco ningn conflicto, dado que no comparten nada. Sin embargo, hay ocasiones que distintos hilos en un programa si necesitan establecer alguna relacin entre s o compartir objetos. Se requiere entonces de algn mecanismo que permita sincronizar hilos as como establecer las polticas para acceder a recursos (objetos) compartidos. En esta unidad aprenderemos sobre las prioridades que tienen los hilos y la forma en la que se puede sincronizarlos a fin de no producir aplicaciones con resultados inconsistentes por la forma en la que acceden al objeto compartido.

Objetivo: Utilizar las herramientas que proporciona Java para sincronizar procesos que comparten objetos.

Estados de un hilo
Objetivo especfico de aprendizaje Aplicar lo aprendido sobre los estados de un hilo en el desarrollo de programas.

Duracin de la actividad 4 horas

Producto a entregar Como resultado de la actividad el alumno: - Crear programas donde se aplique la programacin con hilos.

Forma de entrega

Descripcin de la actividad

1. Hacer la lectura titulada Estados de un hilo. 2. Leer el siguiente artculo de JavaWorld que te dar un perspectiva diferente del 3. 4.

uso de Hilos: "Achieve strong performance with Threads, Part 1" (http://www.javaworld.com/javaworld/jw-05-2002/jw-0503-java101.html?). Compilar el applet Hilos3.java, y crear la pgina que lo manda llamar para poder ejecutarlo. Modificar Hilos3.java para que ahora tengas 5 contadores en lugar de 3, los dos que se agregarn deben de contar a una velocidad de 3 y 5 segundos.

Descripcin de la Unidad
Introduccin: En cualquier momento, un hilo puede estar en uno de varios estados (nuevo, ejecutable, detenido, muerto). Un hilo en ejecucin pasa de un estado a otro, en respuesta a las circunstancias presentes o cuando se invoca a ciertos mtodos. En esta unidad se aplicar el conocimiento sobre los estados de los hilos en la construccin de programas. Objetivo: Que el participante conozca los diversos estados en los que puede estar un hilo y aplique esto en la programacin.

Utilizando Objetos con Hilos Los hilos de un programa compiten por el tiempo de procesador, esperan mientras otros hilos tambin tratan de entrar en ejecucin. Es necesario sincronizar el acceso a los objetos compartidos para evitar inconsistencias. En esta unidad entenders la forma en como este proceso se lleva a cabo. Descripcin de la Unidad
Introduccin: Los hilos pueden ser ejecutados en forma asncrona es decir, una vez que es iniciado un hilo, este vive de forma independiente de los otros hilos, no existe ninguna relacin entre ellos, ni tampoco ningn conflicto, dado que no comparten nada. Sin embargo, hay ocasiones que distintos hilos en un programa si necesitan establecer alguna relacin entre s o compartir objetos. Se requiere entonces de algn mecanismo que permita sincronizar hilos as como establecer las polticas para acceder a recursos (objetos) compartidos. En esta unidad aprenderemos sobre las prioridades que tienen los hilos y la forma en la que se puede sincronizarlos a fin de no producir aplicaciones con resultados inconsistentes por la forma en la que acceden al objeto compartido.

Objetivo: Utilizar las herramientas que proporciona Java para sincronizar procesos que comparten objetos.

Prioridades y Sincronizacin

Objetivo especfico de aprendizaje

Conocer el concepto de sincronizacin de procesos.


Duracin de la actividad Producto a entregar Forma de entrega

4 horas

Como resultado de la actividad el alumno: Conocer cmo se manejan las prioridades de los hilos Conocer la necesidad de sincronizar hilos.

Descripcin de la actividad

1. 2.

Hacer la lectura del tema Prioridades y Sincronizacin. Leer el artculo Achieve strong performance with threads, Part 2 que se encuentra en la pgina: http://www.javaworld.com/javaworld/jw-06-2002/jw0607-java101.html? 3. Escribir un documento en el que respondas las siguientes preguntas. Incluye en tus respuestas cdigos que representan la situacin planteada. Pueden mltiples hilos acceder la misma variable local o parmetro? Por qu es importante la sincronizacin? El artculo previene acerca de sincronizar el mtodo run(). Escribe un programa que demuestre el porque no debes sincronizarlo.

Clases y Objetos Cada vez que se analiza un problema a resolver utilizando la computadora y en este casodesarrollando una solucin con una herramienta Orientada a Objetos, el anlisis se debehacer sobre los objetos involucrados en la solucin y la interaccin que entre ellos existe. El diseo orientado a objetos nos ayuda a construir un modelo de objetos para un sistema que ser desarrollado. Un modelo de objetos especifica las clases, sus atributos y mtodos y sus relaciones con otras clases. Por ejemplo al hablar de clientes, artculos, proveedores, inmediatamente debemos analizar cada uno por separado yla interaccin que entre ellos existe y sobre todo la que tiene relacin al problema en cuestin. Analizando primero las piezas aisladas y luego entrelazando sus relaciones. Por ejemplo debemos tomar en cuenta primero las caractersticas que competen a los artculos y sobre estas las que competen al problema en cuestin o posibles problemas futuros que pudieran ser relacionados a los datos ahora analizados.

Vienen a la mente sobre el artculo: el nmero, el nombre, el precio, la cantidad en inventario, el proveedor, etc. As mismo nos debemos preocupar por las conductas que reportan estos artculos, sobre todo las que afectan a nuestro problema en cuestin, por ejemplo un artculo se da de alta en nuestro inventario, tambin se vende, puede ser que se regrese por el cliente, puede ser que se regrese por la empresa si es que esta en malas condiciones, etc. De esta manera empezamos a definir las variables de instancia que contendr cada uno de los objetos de todas las clases posibles que estamos analizando, y as de esa manera tambin empezamos a definir los mtodos que hacen uso de esas variables de instancia y que reflejan la problemtica analizada. Una vez que tenemos las clases definida con sus caractersticas o atributos(variables) y susconductas (mtodos), entonces es que empezamos a desarrollar la aplicacin que har usode estas clases. Esto puede ser a travs de una aplicacin no grfica, una aplicacin grfica o un applet. A continuacin se presentan una serie de pasos necesarios para crear un modelo de objetos a partir de la especificacin de un problema a resolver: 1.Identificar clases de objetos a partir de la especificacin del problema( ver sustantivos y verbos). Una manera sencilla de hacer esto es empezar por identificarlas clases al analizar la descripcin textual en la especificacin del problema. En esteanlisis textual, los sustantivos y las frases de sustantivos nos ayudan a entender confrecuencia los objetos y sus clases. Los sustantivos en singular ("cuenta", "carro" y"alumno") y los sustantivos en plural ("puntos",

"carros" y "cuentas") indican clases.Los sustantivos propios ("la cuenta de Juan") y los sustantivos de referencia directa("el individuo que tenia la cuenta") indican objetos. 2.Identificar relaciones entre clases. Aqu se sugiere que se cree una tablan x n donden es el nmero de clases. Se deben nombrar las filas y las columnas con los nombres de las clases y despus se debe escribir en cada celda de interseccin, una relacin de asociacin, donde se define una especializacin, si es que la clase del rengln es aun ms especializada que la clase de la columna, o se escribe una generalizacin si la clase de la columna es una especializacin aun ms especfica que
Mens En esta unidad aprenders cmo unar mens en tus programas de Java. Los mens permiten al usuario realizar acciones directas o indirectas a travs de un conjunto de elementos u opciones del men. Un elemento de un men puede ser un comando para ejecutar un mtodo o puede ser otro men, es decir, un submen. Descripcin de la Unidad
Introduccin: Un men dentro de una aplicacin es una forma sencilla de ahorrar espacio adems de permitir al usuario de una manera elegante seleccionar una de las diferentes opciones a realizar. El lenguaje de programacin Java proporciona las herramientas necesarias para la creacin de mens de distintos tipos. As mismo, cuenta con manejadores de eventos que permiten detectar el origen del evento y manejarlo. Objetivo: Utilizar las herramientas que proporciona Java para creacin y manejo de mens.

Contenidos Tema1: Creacin de Mens Tema 2: Manejo de eventos en Mens

Creacin de Mens

Objetivo especfico de aprendizaje

Realizar aplicaciones que incluyan mens.


Duracin de la actividad Producto a entregar Forma de entrega

4 horas

Como resultado de la actividad el alumno: Conocer la forma en la que se pueden crear mens. Aplicar los conceptos aprendidos para disear aplicaciones que contengan mens.

Descripcin de la actividad

1. 2.

Hacer la lectura del tema Creacin de Mens. Utilizar el ejemplo descrito en la lectura para compilarlo, ejecutarlo y entender cmo se lleva a cabo la creacin de mens. 3. Practicar haciendo un applet llamado AppletMenu que cree una barra de mens que incluya los siguientes mens: Men Archivo o Opcin Nuevo o Submen Guardar 1. Opcin Guardar 2. Opcin Guardar Como o Separador o Opcin Salir Men Ayuda o Opcin AcercaDe o Opcin Ayuda 4. Entregar el applet desarrollado.

Manejo de eventos en mens

Objetivo especfico de aprendizaje

Realizar aplicaciones que manejen los eventos generados por un men.


Duracin de la actividad Producto a entregar Forma de entrega

5 horas

Como resultado de la actividad el alumno: Conocer la forma en la que se detectan y manejan los eventos producidos por lo elementos del men.

Descripcin de la actividad

1. 2.

Hacer la lectura del tema Manejo de eventos en Mens. Utilizar el ejemplo descrito en la lectura para compilarlo, ejecutarlo y entender su funcionamiento. 3. Practicar agregando al applet que se hizo anteriormente en esta unidad la deteccin de eventos producidos por los mens. 4. Entregar el applet generado.

2.1 Manejo de Eventos


En esta unidad entenders como manejar los eventos de un applet para cuando el usuario desee utilizar algun elemento que permita que el applet realice acciones, como un botn, un deslizador de barra, etc.
Evento Un evento se refiere a alguna accin que puede ser realizada por el usuario para que el applet realice alguna serie de instrucciones. Ente algunos eventos dentro de un applet tenemos: oprimir en un botn especfico mover una barra de desplazamiento oprimir una tecla especfica

Cuando un applet esta ejecutndose, ste puede estar esperando que el usuario active alguna secuencia de instrucciones mediante la seleccin de algn elemento de interfaz grfica definida para esto, como lo hemos hecho anteriormente con el objeto de la clase Button. Cuando creamos un objeto de interfaz grfica que nos servir para que el usuario indique alguna accin, es importante definirle a este objeto que ser escuchado por la clase especfica que se encarga de revisar si hay algn evento que ha sido realizado. Escuchadores de eventos (Listeners) Un Escuchador (Listener) es un objeto que es notificado cuando un evento ocurre. Este tiene dos requerimientos: 1) Debi haber sido registrado con una o ms fuentes que reciben notificaciones sobre tipos de eventos especficos, y 2) Debe implementar mtodos que reciban y procesen stas notificaciones. Los mtodos que reciben y procesan estas notificaciones estn definidos en un grupo de interfaces encontradas en java.awt.event. Por ejemplo la clase MouseMotionListener define dos mtodos que reciben notificaciones cuando el ratn es arrastrado o movido. Algn objeto puede recibir y procesar uno o ambos de estos eventos si ste provee una implementacin de esta interfase. Eventos de Botn Analicemos lo que se hace para manejar ms de un botn, usemos el applet utilizado anteriormente para dar la suma de todos los nmeros desde el 1 hasta el N:

Supongamos que ahora queremos tener un botn que limpie los valores de los campos, para volver a dar nuevos valores.

El applet quedara muy parecido al anterior hecho, solo que ahora en el mtodo action Performed debemos revisar cual fue el botn que se seleccion, y esto ser a travs de la instruccin de decisin IF, y el mtodo getSource() que es tomado de la clase ActionEvent, que es el parmetro que nos pasa el mtodo actionPerformed. Dentro de este parmetro es donde se guarda la informacin sobre cual es el elemento grfico que fue seleccionado. Es importante no olvidar que todos las clases para poder usar eventos se toman utilizando import java.awt.event.*; El applet quedara como el siguiente: import java.awt.*; import java.applet.*; import java.awt.event.*;

// <applet width="150" height="200" code="AppletEventos1"></applet> public class AppletEventos1 extends Applet implements ActionListener { Label l1, l2; TextField t1,t2; Button b1,b2;

public AppletEventos1() { l1 = new Label("Numero"); t1 = new TextField(8); l2 = new Label("Suma"); t2 = new TextField(8); b1 = new Button("Suma"); b2 = new Button("Limpia"); add(l1);

add(t1); add(b1); add(b2); add(l2); add(t2); b1. addActionListener(this); b2. addActionListener(this); }

public void actionPerformed(ActionEvent ae) { if (ae.getSource() == b1) { int n = Integer.parseInt(t1.getText()); int suma = 0; for (int i = 1; i<= n; i++) { suma += i; } t2.setText("" + suma); } if (ae.getSource() == b2) { t1.setText(""); t2.setText(""); }

} } La ejecucin del applet quedara como el siguiente:

Donde lo mas importante aqu es entender el uso del mtodo getSource() y el objeto ae perteneciente a la clase ActionEvent, que es el que nos esta pasando el evento de que se trata, la instruccin if (ae.getSource() == b1) { Lo que revisa es si el evento que fue el tomado corresponde al objeto del botn b1, si esto es cierto, entonces se realizan las intrucciones dentro del if, de otra manera se salta a continuar con el siguiente if. La misma accin la podemos realizar, pero utilizando el mtodo getActionCommand, pero aqui el cambio sera tomar el String que aparece en el elemento del botn, no el nombre del objeto botn, la instruccin pudiera ser : if (ae.getActionCommand() == "Suma") Ambas maneras son utilizadas para revisar cual fue el botn seleccionado. De tal manera que el applet podra quedar como el siguiente y funcionara igual:

import java.awt.*; import java.applet.*;

import java.awt.event.*;

// <applet width="150" height="200" code="AppletEventos1"></applet> public class AppletEventos1 extends Applet implements ActionListener { Label l1, l2; TextField t1,t2; Button b1,b2;

public AppletEventos1() { l1 = new Label("Numero"); t1 = new TextField(8); l2 = new Label("Suma"); t2 = new TextField(8); b1 = new Button("Suma"); b2 = new Button("Limpia"); add(l1); add(t1); add(b1); add(b2); add(l2); add(t2); b1. addActionListener(this); b2. addActionListener(this);

public void actionPerformed(ActionEvent ae) { if (ae.getActionCommand() == "Suma") { int n = Integer.parseInt(t1.getText()); int suma = 0; for (int i = 1; i<= n; i++) { suma += i; } t2.setText("" + suma); } if (ae. getActionCommand() == "Limpia") { t1.setText(""); t2.setText(""); } } }

Otro EJEMPLO

Ahora mostramos un ejemplo en el que utilizamos dos botones, un botn para dibujar crculos en el applet al azar (empezando ms debajo de la coordenada 60, 80), el otro botn es para limpiar el applet.

import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="150" height="200" code="AppletCirculos"></applet> public class AppletCirculos extends Applet implements ActionListener { Label l1; TextField t1; Button b1,b2; boolean dibuja = false; // se inicializa dibuja en falso para no dibujar public AppletCirculos() { l1 = new Label("Circulos"); t1 = new TextField(8); b1 = new Button("Dibuja"); b2 = new Button("Limpia"); add(l1); add(t1); add(b1); add(b2); b1. addActionListener(this); b2. addActionListener(this); } public void actionPerformed(ActionEvent ae) { if (ae.getSource() == b1) { dibuja = true; // si el usuario selecciona dibujar se pone verdadero

} if (ae.getSource() == b2) { dibuja = false; // si el usuario selecciona limpiar se pone en falso } repaint(); } public void paint(Graphics g) { if (dibuja) { // si dibuja es verdadero se dibuja g.setColor(Color.red); // se cambia a rojo el color de dibujo int circulos = Integer.parseInt(t1.getText()); // se toma el numero del texto for (int i = 1; i <= circulos ; i++) { // ciclo de circulos int x1 = (int) (Math.random()*100)+60; int y1 = (int) (Math.random()*100)+80; g.drawOval(x1,y1, 50, 50); // se dibuja un circulo en // una posicin al azar } } else { // si dibuja es falso se limpia el applet g.setColor(Color.white); g.fillRect(0,0,200,200); } } }

Algunos ejemplos de la vista del applet son:

2.1.1 Eventos de botn


Eventos de Botn Analicemos lo que se hace para manejar ms de un botn, usemos el applet utilizado anteriormente para dar la suma de todos los nmeros desde el 1 hasta el N:

Supongamos que ahora queremos tener un botn que limpie los valores de los campos, para volver a dar nuevos valores. El applet quedara muy parecido al anterior hecho, solo que ahora en el mtodo action Performed debemos revisar cual fue el botn que se seleccion, y esto ser a travs de la instruccin de decisin IF, y el mtodo getSource() que es tomado de la clase ActionEvent, que es el parmetro que nos pasa el mtodo actionPerformed. Dentro de este parmetro es donde se guarda la informacin sobre cual es el elemento grfico que fue seleccionado. Es importante no olvidar que todos las clases para poder usar eventos se toman utilizando import java.awt.event.*; El applet quedara como el siguiente: import java.awt.*; import java.applet.*; import java.awt.event.*;

// <applet width="150" height="200" code="AppletEventos1"></applet> public class AppletEventos1 extends Applet implements ActionListener { Label l1, l2; TextField t1,t2;

Button b1,b2;

public AppletEventos1() { l1 = new Label("Numero"); t1 = new TextField(8); l2 = new Label("Suma"); t2 = new TextField(8); b1 = new Button("Suma"); b2 = new Button("Limpia"); add(l1); add(t1); add(b1); add(b2); add(l2); add(t2); b1. addActionListener(this); b2. addActionListener(this); }

public void actionPerformed(ActionEvent ae) { if (ae.getSource() == b1) { int n = Integer.parseInt(t1.getText());

int suma = 0; for (int i = 1; i<= n; i++) { suma += i; } t2.setText("" + suma); } if (ae.getSource() == b2) { t1.setText(""); t2.setText(""); } } } La ejecucin del applet quedara como el siguiente:

Donde lo mas importante aqu es entender el uso del mtodo getSource() y el objeto ae perteneciente a la clase ActionEvent, que es el que nos esta pasando el evento de que se trata, la instruccin if (ae.getSource() == b1) { Lo que revisa es si el evento que fue el tomado corresponde al objeto del

botn b1, si esto es cierto, entonces se realizan las intrucciones dentro del if, de otra manera se salta a continuar con el siguiente if. La misma accin la podemos realizar, pero utilizando el mtodo getActionCommand, pero aqui el cambio sera tomar el String que aparece en el elemento del botn, no el nombre del objeto botn, la instruccin pudiera ser : if (ae.getActionCommand() == "Suma") Ambas maneras son utilizadas para revisar cual fue el botn seleccionado. De tal manera que el applet podra quedar como el siguiente y funcionara igual:

import java.awt.*; import java.applet.*; import java.awt.event.*;

// <applet width="150" height="200" code="AppletEventos1"></applet> public class AppletEventos1 extends Applet implements ActionListener { Label l1, l2; TextField t1,t2; Button b1,b2;

public AppletEventos1() { l1 = new Label("Numero"); t1 = new TextField(8); l2 = new Label("Suma"); t2 = new TextField(8);

b1 = new Button("Suma"); b2 = new Button("Limpia"); add(l1); add(t1); add(b1); add(b2); add(l2); add(t2); b1. addActionListener(this); b2. addActionListener(this); }

public void actionPerformed(ActionEvent ae) { if (ae.getActionCommand() == "Suma") { int n = Integer.parseInt(t1.getText()); int suma = 0; for (int i = 1; i<= n; i++) { suma += i; } t2.setText("" + suma); } if (ae. getActionCommand() == "Limpia") {

t1.setText(""); t2.setText(""); } } }

Otro EJEMPLO

Ahora mostramos un ejemplo en el que utilizamos dos botones, un botn para dibujar crculos en el applet al azar (empezando ms debajo de la coordenada 60, 80), el otro botn es para limpiar el applet.

import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="150" height="200" code="AppletCirculos"></applet> public class AppletCirculos extends Applet implements ActionListener { Label l1; TextField t1; Button b1,b2; boolean dibuja = false; // se inicializa dibuja en falso para no dibujar public AppletCirculos() { l1 = new Label("Circulos"); t1 = new TextField(8);

b1 = new Button("Dibuja"); b2 = new Button("Limpia"); add(l1); add(t1); add(b1); add(b2); b1. addActionListener(this); b2. addActionListener(this); } public void actionPerformed(ActionEvent ae) { if (ae.getSource() == b1) { dibuja = true; // si el usuario selecciona dibujar se pone verdadero } if (ae.getSource() == b2) { dibuja = false; // si el usuario selecciona limpiar se pone en falso } repaint(); } public void paint(Graphics g) { if (dibuja) { // si dibuja es verdadero se dibuja g.setColor(Color.red); // se cambia a rojo el color de dibujo int circulos = Integer.parseInt(t1.getText()); // se toma el numero del texto for (int i = 1; i <= circulos ; i++) { // ciclo de circulos int x1 = (int) (Math.random()*100)+60;

int y1 = (int) (Math.random()*100)+80; g.drawOval(x1,y1, 50, 50); // se dibuja un circulo en // una posicin al azar } } else { // si dibuja es falso se limpia el applet g.setColor(Color.white); g.fillRect(0,0,200,200); } } }

Algunos ejemplos de la vista del applet son:

2.1.2 Distintas clases de Eventos


Distintas clases de Eventos El paquete java.awt.event define varios tipos de eventos que son generados por varios elementos de interfase de usuario. Entre los ms comunes eventos utilizados estn las siguientes clases: Clase de Evento Descripcin

ActionEvent

Generado cuando un botn es seleccionado, una lista (vista mas adelante) tiene un doble clic o un men es seleccionado

AdjustmentEvent Generado cuando un barra de desplazamiento es manipulada ComponentEvent Generado cuando un componente es escondido, movido, cambiado de tamao, o se hace visible. ItemEvent Generado cuando una caja de chequeo (vista mas adelante) es seleccionada con el ratn. Distintas clases de Escuchadores Los escuchadores son creados para implementar una o ms de las interfases definidas por el paquete java.awt.event. Cuando un evento ocurre el evento fuente invoca el mtodo apropiado definido por el escuchador y provee un objeto tipo evento como su argumento. Entre los ms comunes estan: Clase de Interfase ActionListener Descripcin Define un mtodo para recibir eventos de accin (ActionEvent) AdjustmentListener Define un mtodo para recibir eventos de deslizadores (AdjustmentEvent) ComponentListener Define cuatro mtodo para reconocer cuando un componente es escondido, movido, cambiado de tamao o mostrado (ComponentEvent). ItemListener Define un mtodo para reconocer cuando el estado De un campo cambia (ItemEvent).

Es importante que si queremos revisar los mtodos que requerimos entremos a revisar en la documentacin de Java (www.java.sun.com) las clases mostradas anteriormente para saber que mtodos podemos utilizar para implementar el evento deseado. A continuacin mostramos algunos eventos diferentes a los de botn. Eventos de Barra de Desplazamiento En estos eventos hacemos uso de barras de desplazamiento para realizar alguna instruccin o grupo de instrucciones, y para esto es importante tomar eventos de la clase Scrollbar. Los objetos de la clase Srollbar son escuchados a travs de implementar una interfaz llamada AdjustmentListener, la cual utiliza el mtodo adjustmentValueChanged, un mtodo muy parecido al actionPerformed, pero trabaja sobre diferentes elementos de interfaz grfica. Para entender este applet debemos consultar la clase ScrollBar que se encuentra en el paquete java.awt. Esta clase tiene diferentes constructores que pueden ser utilizados para crear el objeto de la barra deslizadora, tomemos uno de los disponibles en la siguiente tabla que aparece en las clases de la API de Java:

Tomemos el tercer constructor, el cual es utilizado en este ejemplo, primero esta la orientacin, que es un entero y en este caso utilizaremos uno definido en la misma clase Scrollbar.HORIZONTAL, despus viene un valor que es el valor inicial con el que queremos que empiece la barra deslizadora, despus esta el valor visible, si queremos que se vea definimos un 1, posteriormente el valor mnimo de la barra, y el mximo numero de nmeros a tener. Veamos el applet: import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="150" height="200" code="AppletEventos2"></applet>

public class AppletEventos2 extends Applet implements AdjustmentListener { Label l; Scrollbar s; TextField t;

public AppletEventos2() { l = new Label("Valor de la barra de Scroll"); t = new TextField(3); s = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 100); add(s); add(l); add(t); s.addAdjustmentListener(this); }

public void adjustmentValueChanged(AdjustmentEvent ae) { int valor = s.getValue(); t.setText(""+valor); } } Dicho applet muestra una barra de scroll que al ser deslizada muestra un valor en el campo texto, como aparece en seguida:

Utilizamos el mtodo getValue de la clase Scrollbar para tomar el valor de la barra deslizadora en base al movimiento que el usuario hizo en ella. Otro ejemplo que puede ilustrar mejor el uso de una barra deslizadora es el siguiente: import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="150" height="200" code="AppletEventos3"></applet> public class AppletEventos3 extends Applet implements AdjustmentListener { Scrollbar s; int barra = 0;

public AppletEventos3() { s = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 100); add(s); s.addAdjustmentListener(this); }

public void paint(Graphics g) { g.drawRect(40, 80, 60, 100);

g.fillRect(40, 80, 60, barra); }

public void adjustmentValueChanged(AdjustmentEvent ae) { barra = s.getValue(); repaint(); } } En este ejemplo al mover la barra deslizadora se ve como va cambiando el llenado del rectngulo, utilizando para ello el mtodo fillRect de la clase Graphics, el cual tiene como parmetros la coordenada en x, la coordenada en y, el ancho y el alto en pixeles, rellenando de color negro dependiendo del valor de la barra, es por esto que en el mtodo paint() se utiliza la variable barra:

En el caso de este applet recurrimos a utilizar el mtodo paint() para que se redibuje cada vez que se mueve la barra deslizadora, utilizando el metodo fillRect() rellenamos la parte del rectngulo. Es importante hacer notar que la variable barra se defini al inicio de la clase, para que cualquier mtodo la pueda utilizar sin problemas. Eventos del Ratn Para implementar este tipo de eventos debemos implementar la interfaz MouseListener y MouseMotionListener.

A continuacin se muestra un ejemplo de applet que los utiliza. Cada vez que el botn es presionado la palabra Abajo es desplegada en el lugar donde est el apuntador del ratn. Cada vez que el ratn es liberado, la palabra Arriba es mostrada. Si un botn es oprimido el mensaje Ratn oprimido es desplegado en la esquina superior izquierda del rea del applet.

Cada vez que el ratn entra o sale del rea del applet, un mensaje es desplegado. Cuando el ratn es arrastrado, un asterisco es mostrado, el cual es arrastrado con el apuntador del ratn. Es importante notar las dos variablesmouseX y mouseY que guardan los lugares del ratn, cuando ocurre uno de los siguientes eventos del ratn: presionado, liberado, o arrastrado. Estas coordenadas son utilizadas dentro del mtodo paint().

import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="150" height="200" code="MouseEvents"></applet> public class MouseEvents extends Applet implements MouseListener, MouseMotionListener { String msg = ""; int mouseX = 0; int mouseY = 0; public void init() { addMouseListener(this); // se aade el escuchador del ratn //a este applet addMouseMotionListener(this); // se aande el escuchador del movimiento // del raton a este applet } public void mouseClicked(MouseEvent me) { mouseX = 0; mouseY = 10; msg = "Ratn Oprimido"; repaint(); } // cuando el ratn entra public void mouseEntered(MouseEvent me) { mouseX = 0; mouseY = 10; msg = "Ratn Entra";

repaint(); } // cuando sale el ratn public void mouseExited(MouseEvent me) { mouseX = 0; mouseY = 10; msg = "Ratn Sale"; repaint(); } // cuando se presiona el ratn public void mousePressed(MouseEvent me) { mouseX = me.getX(); // se toma el valor de la coordenada de x mouseY = me.getY(); // se toma el valor de la coordenada de y msg = "Abajo"; repaint(); } // cuando se libera el ratn public void mouseReleased(MouseEvent me) { mouseX = me.getX(); mouseY = me.getY(); msg = "Arriba"; repaint(); } // cuando se arrastra el ratn

public void mouseDragged(MouseEvent me) { mouseX = me.getX(); mouseY = me.getY(); msg = "*"; showStatus("Moviendo el raton en " + mouseX + "," + mouseY); repaint(); } // moviendo el ratn public void mouseMoved(MouseEvent me) { showStatus("Moviendo el raton en " + mouseX + "," + mouseY); } // desplegando el mensaje en el applet public void paint(Graphics g) { g.drawString(msg, mouseX, mouseY); } }

Algunas vistas del applet se dan a continuacin:


Vdeo de YouTube

Mouse Events en java

Actividades 2.1. Descripcin de la Unidad


UNIDADES DIDCTICAS DEL CURSO EN LNEA

Programa: Programacin

Clave del curso en lnea:

Nombre del curso: Desarrollo de Aplicaciones con Interfaz Grfica y Manejo de Clases y Objetos

Nombre de la Unidad didctica 1: Manejo de Eventos.

Introduccin: En la Programacin Orientada a Objetos el manejo de eventos es un concepto muy importante, pues la Interfaz Grfica requiere de eventos que sucedan en el Applet o Aplicacin Grfica que el usuario este utilizando. El oprimir un botn, el seleccionar un men, el deslizar un barra de control en una Interfaz Grfica, requieren de un manejo y control interno en el Applet o Aplicacin Grfica que se trate.

Objetivo: Conocer el uso de eventos en un Applet o Aplicacin Grfica y entender como se utilizan para el manejo de los eventos.

Nombre de la Unidad didctica 1: Manejo de Eventos.

Contenidos

Tema1: Eventos de un Botn

Tema2: Otro tipo de eventos

Actividades 2.1.1 Eventos de Botn


ACTIVIDAD AUTOAPRENDIZAJE Programa: Programacin Curso: Desarrollo de Aplicaciones con Interfaz Grfica y Manejo de Clases y Objetos Unidad didctica: Manejo de Eventos Nombre de la actividad: Eventos de un Botn

Objetivo especfico de aprendizaje

Aplicar el concepto de evento de un botn para poder realizar operaciones en un Applet cuando el usuario oprime un botn.

Duracin de la actividad

Producto a entregar

Forma de entrega

4.5 horas

Como resultado de la actividad el alumno: Entender la manera en la que se utilizan los eventos de un botn para la realizacin de instrucciones cuando se acciona el botn. Aplicar el uso de eventos del botn para soluciones que requieran de ellos.

Por plataforma

Actividad previa

Recursos de apoyo

Ciclos Fijos

Unidad 1. Tema 1. Eventos de Botn

Descripcin de la actividad

1. Hacer la lectura definida de Eventos de Botn. 2. Utilizar los ejemplos de la lectura, complalos y ejectalos. 3. Practicar haciendo un applet llamado BotonesApplet que toma dos nmeros y

hace las operaciones expresadas en los botones: 1. Suma el primer y el segundo nmero dejando el valor en resultado. 2. Resta el segundo nmero del primero dejando el valor en resultado. 3. Multiplica el primer y el segundo numero dejando el valor en resultado. 4. Divide el primer nmero entre el segundo dejando el valor en resultado. 5. Deja la raz del primer nmero en resultado. 6. Deja la raz del segundo nmero en resultado. 7. Deja el valor mayor de ambos nmeros en resultado. 8. Limpia el contenido de todos los campos.

El applet deber presentar algo parecido a lo siguiente:

http://sena.blackboard.com /courses/1/238993/content /_7335442_1/dir_%2145766 56e746f7320646520426f74 6f6e.zip/Eventos%20de%20 Boton_archivos/image002.j pg

Actividades 2.1.2 Otros Eventos


Objetivo especfico de aprendizaje Entender el uso de otro tipo de eventos diferentes a los causados por un botn.

Duracin de la actividad

Producto a entregar

Forma de entrega

4.5 horas

Como resultado de la actividad el alumno: Entender la manera en la que se utilizan los eventos de otro tipo de elementos de interfaz grfica diferente a un botn, como un deslizador, el ratn, etc. Aplicar el uso de eventos diferentes a los del botn para soluciones que requieran de ellos.

Por plataforma

Actividad previa

Recursos de apoyo

Eventos de botn

Unidad 1. Tema 2. Eventos de Otros Elementos Grficos

Descripcin de la actividad

1. Hacer la lectura definida de Eventos de Otros Elementos Grficos. 2. Utilizar los ejemplos de la lectura, complalos y ejectalos. 3. En la clase Color existe un constructor que utiliza 3 nmeros enteros para
crear un color, como se muestra:

Utiliza este constructor para que se pueda crear un objeto de la clase Color y este se pueda utilizar para definir el color de un rectngulo con relleno que sea dibujado dentro del applet en el mtodo paint(). g.setColor ( new Color (deslizador1, deslizador2, deslizador3) ) ; Definiendo para cada parmetro el valor que se tome de un deslizador (teniendo 3 deslizadores de barra), como se muestra en el applet. Una vez dibujado el rectngulo con el color definido por los deslizadores, vuelve a poner el color en negro para dibujar los valores de los deslizadores: g.setColor (Color.black); El applet deber presentar algo parecido a lo siguiente (se muestran varios ejemplos):

2.2. Elementos Bsicos de la Interfaz Grfica


En esta unidad encontrars los elementos bsicos para desarrollar una Interfaz Grfica amigable, de manera que tu applet pueda resultar interesante y ms vistozo y el usuario pueda entenderlo mejor. La unidad tambien muestra la manera de colocar los elementos de la interfaz en la ventana y su distribucin, mediante el uso de manejadores de espacio y paneles.
Introduccin: Da a da las aplicaciones que utilizan los usuarios requieren ser ms vistosas y obtener su atencin. La Interfaz Grfica es el concepto que ayuda al programador a realizar aplicaciones que le sean interesantes al usuario y le ayuden a entender mejor la solucin al problema que tratan de resolver con la

computadora.

Objetivo: Conocer los elementos bsicos de la Interfaz Grfica: Label, Button, TextField, TextArea, List, etc. Conocer los administradores de espacio: FlowLayout, GridLayout, y BorderLayout que permitan hacer una mejor distribucin de los elementos grficos. Conocer el uso de Paneles: Panel.

Tema1: Conociendo los elementos bsicos de la Interfaz Grfica.

Tema2: Conociendo los Administradores de Espacio.

Tema3: Haciendo uso de Paneles.

2.2.1 Elementos de la Interfaz Grfica


Elementos de una Interfaz Una interfaz grfica debe contener elementos en los que se puedan definir etiquetas, campos de texto, botones, barras deslizadoras, etc. A continuacin mostraremos algunos elementos de la interfaz grfica y las diferentes maneras de utilizarlos:

Etiqueta (Label)
La etiqueta nos ayuda a definir los campos de texto que teclear el usuario, la clase para definida para esto es Label y existen diferentes maneras de construir una etiqueta: Label (), Label (String str), Label (String str, int alignment).

El primer constructor crea una etiqueta en blanco, el segundo crea una etiqueta con el String mandado como parmetro y el tercero crea una etiqueta con el String mandado y definiendo con how la manera en la que se alinear esta etiqueta, siendo how uno de : Label.LEFT, Label.RIGHT oLabel.CENTER. Un ejemplo de el uso de etiquetas pudiera ser: import java.awt.*; import java.applet.*; // <applet width="200" height="100" code="AppletInterfaz1"></applet> public class AppletInterfaz1 extends Applet { Label l1, l2, l3; public AppletInterfaz1() { l1 = new Label(); l2 = new Label("etiqueta 2"); l3 = new Label("etiqueta 3", Label.CENTER); add(l1); add(l2); add(l3); }

Mostrando el applet:

Observamos como es difcil entender que existe una etiqueta en blanco ah, y que la tercera etiqueta est alineada al centro. Mas adelante mostraremos de nuevo este applet, pero utilizando clases que nos pueden servir para mejorar nuestra interfaz haciendo uso de administradores de distribucin que son llamados Layout Managers. Por ahora continuemos con otros elementos. Pudiera quedarnos la duda de si ya creamos l1 como un objeto de la clase Label, pero sin etiqueta, como la pudiramos cambiar, esto lo hacemos a travs del mtodo setText() ya manejado anteriormente, de tal manera que pudiramos utilizar l1.setText("etiqueta 1"); y as cambiar nuestra etiqueta.

Campo Texto (TextField)


Un campo texto nos sirve para introducir un dato del usuario a nuestra aplicacin, teniendo diferentes maneras de introducir un campo texto: TextField(), TextField(int numChars), str), TextField(String str, int numChars). TextField(String

El primer constructor crea un campo texto, como ya lo hemos utilizado anteriormente, el segundo constructor nos sirve para definir el numero de caracteres que queremos puedan verse al introducir algn dato, el tercer constructor nos sirve para definir algn texto inicial que queramos le aparezca al usuario y el ltimo constructor es para usar ambas opciones, que le aparezca al usuario un cierto texto inicialmente y tener un campo texto con una cantidad especfica de caracteres a ver. Un ejemplo del uso de estos constructores puede ser: import java.awt.*; import java.applet.*; // <applet width="300" height="100" code="AppletInterfaz2"></applet> public class AppletInterfaz2 extends Applet { TextField t1, t2, t3, t4; public AppletInterfaz2() { t1 = new TextField(); t2 = new TextField(10); t3 = new TextField("Texto3"); t4 = new TextField("Texto4",10); add(t1); add(t2); add(t3); add(t4); } } Y la manera de visualizar esto sera:

De esta forma observamos como el segundo y cuarto texto son ms grandes debido al tamao que le pusimos al constructor.

Botn (Button)
Con esta clase podemos definir algn botn para que el usuario de alguna accin que posteriormente pueda ser escuchada como un evento. La forma de crear botones son: Button (), Button(String str).

Crear un botn sin etiqueta o crear un botn con etiqueta. La manera de cambiar la etiqueta a un botn o de asignar una si no la tiene seria utilizando el mtodo setLabel(). Una aplicacin que muestra el uso de estos dos constructores seria: import java.awt.*; import java.applet.*; // <applet width="200" height="100" code="AppletInterfaz3"></applet> public class AppletInterfaz3 extends Applet {

Button b1, b2; public AppletInterfaz3() { b1 = new Button(); b2 = new Button("boton2"); add(b1); add(b2); } } La forma de visualizar esto es:

De esta manera podemos revisar las dos formas de crear un botn.

Opciones (Choice)
Esta clase nos ayuda a utilizar mens de opciones, donde el usuario fcilmente puede seleccionar una opcin. La manera de hacer esto es con el constructor: Choice().

Al crear un objeto de este tipo se le aaden las opciones que se desea aparezcan en el men, utilizando el mtodo add() o addItem() y de esta manera se van aadiendo las opciones al men. Para saber que valor se selecciono se utiliza el mtodo getSelectedItem() o el mtodo getSelectedIndex(), el primero toma el String del elemento seleccionado y el segundo te da el ndice del elemento seleccionado. Veamos una aplicacin de este elemento grfico: import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="200" height="200" code="AppletInterfaz4"></applet> public class AppletInterfaz4 extends Applet implements ItemListener{ Choice ch1, ch2; public AppletInterfaz4() { ch1 = new Choice(); ch2 = new Choice(); ch1.add("Primero"); ch1.add("Segundo"); ch1.add("Tercero"); ch1.add("Cuarto"); ch2.add("Uno"); ch2.add("Dos"); ch2.add("Tres"); ch2.add("Cuatro"); ch2.add("Cinco"); ch1.select("Cuarto");

add(ch1); add(ch2); ch1.addItemListener(this); ch2.addItemListener(this); }

public void itemStateChanged(ItemEvent ie) { repaint(); }

public void paint(Graphics g) { String msg = "Primer menu = "; msg += ch1.getSelectedItem(); g.drawString(msg, 0,100); msg = "Segundo menu = "; msg += ch2.getSelectedItem(); g.drawString(msg, 0,140); } }

Algunos ejemplos utilizando este applet serian (inicial y seleccionando otros valores):

Adems de los mtodos mencionados para esta clase estn getItemCount() que te da el nmero de elementos en la lista y hay otros ms que te conviene revisar en la clase Choice.

Lista (List)
Esta clase provee una compacta lista de mltiples opciones con el uso de la barra deslizadora. Los constructores de esta clase son: List(), List( int lineas) , List (int lineas, boolean seleccionmultiple).

El primer constructor crea una lista con el poder de seleccin de un dato a la vez, el segundo constructor especifica el nmero de lneas que sern visibles al mismo tiempo y el tercero con la opcin de seleccin mltiple en true, permitir que se puedan seleccionar mas de un elemento a la vez. El mtodo add() puede ser utilizado para aadir elementos a la lista, pero tiene dos opciones, la de aadir un String o la de aadir un String en una cierta posicin. La siguiente es una aplicacin que lo utiliza: import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="300" height="200" code="AppletInterfaz5"></applet> public class AppletInterfaz5 extends Applet implements ItemListener{ List ch1, ch2; public AppletInterfaz5() { ch1 = new List(); ch2 = new List(); ch1.add("Primero"); ch1.add("Segundo"); ch1.add("Tercero",0);

ch1.add("Cuarto",0); ch2.add("Uno"); ch2.add("Dos"); ch2.add("Tres"); ch2.add("Cuatro"); ch2.add("Cinco"); add(ch1); add(ch2); ch1.addItemListener(this); ch2.addItemListener(this); }

public void itemStateChanged(ItemEvent ie) { repaint(); }

public void paint(Graphics g) { String msg = "Primera lista = "; msg += ch1.getSelectedItem(); g.drawString(msg, 0,100); msg = "Segunda lista = "; msg += ch2.getSelectedItem();

g.drawString(msg, 0,140); } }

Y esto se mostrar de la siguiente manera (al inicio y con valores seleccionados):

rea de Texto (TextArea)


Este elemento sirve para tomar datos o desplegar datos que tendrn ms de una lnea. Existen varios constructores: TextArea(), TextArea(int lineas, int caracteres), TextArea(String str),

TextArea(String, str, int lineas, int caracteres), TextArea(String str, int lineas, int caracteres, int barra)

Donde lneas es el nmero de lneas, caracteres es el nmero de caracteres, str es el String que deseamos aparezca y barra puede ser uno de los siguientes: SCROLLBARS_BOTH, SCROLLBARS_HORIZONTAL_ONLY, SCROLLBARS_VERTICAL_ONLY, SCROLLBARS_NONE, donde estos se deben utilizar con el nombre de la clase como sufijo, ya que son constantes estticas, ejemplo: TextArea.SCROLLBARS_BOTH. Un ejemplo de aplicacin que use esto seria: import java.awt.*; import java.applet.*; // <applet width="400" height="400" code="AppletInterfaz6"></applet> public class AppletInterfaz6 extends Applet { TextArea ta1, ta2, ta3; public AppletInterfaz6() { ta1 = new TextArea(); ta2 = new TextArea("",10,12,TextArea.SCROLLBARS_HORIZONTAL_ONLY);

ta3 = new TextArea("",5,5,TextArea.SCROLLBARS_BOTH); add(ta1); add(ta2); add(ta3); } } La manera en la que se visualizara es:

Existen otros elementos grficos, es importante que entres a la biblioteca de clases de la awt en java para que te familiarices con ellas.

Enlaces: Biblioteca de clases de awt en java documentacin oficial en ingles.

http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap4/awt.html

(en espaol)

2.2.2 Manejadores de Espacio


Administradores del Espacio En Java se hace uso de los administradores de espacio LayoutManager, para poder presentar una buena distribucin de los elementos grficos y no tener necesidad de estar preocupndose por el tamao de los botones, textos, etc. A continuacin explicamos los ms utilizados comnmente. FlowLayout(). Esta clase es la que se define como administrador de espacio por default al hacer un applet y al aadir un elemento grfico a la ventana del applet este se va creando de izquierda a derecha, de manera que se acomodan en la ventana. Cuando se crea un applet se le puede definir que este es el Layout que se quiere con el mtodo setLayout, ejemplo: setLayout( new FlowLayout());

Y de esta manera es como se van aadiendo los elementos en la ventana. Todos los ejemplos que hemos hecho hasta ahora han utilizado este tipo de administrador de espacio. GridLayout(). Esta clase permite que se definan elementos en la ventana a manera de renglones y columnas, como si fuera una cuadrcula, se definen el nmero de renglones y columnas y los espacios que se quiere dejar en pxeles entre los renglones y las columnas, cada vez que se aade algn elemento este aparece al lado derecho de la hilera en la que va, acomodndose por hilera, a continuacin un ejemplo: import java.awt.*; import java.applet.*; // <applet width="400" height="400" code="AppletInterfaz7"></applet> public class AppletInterfaz7 extends Applet { Button b1, b2, b3, b4, b5; TextField t1, t2, t3, t4, t5; public AppletInterfaz7() { setLayout(new GridLayout(4, 3, 10, 10)); t1 = new TextField("a"); t2 = new TextField("b"); t3 = new TextField("c"); t4 = new TextField("d"); t5 = new TextField("e"); b1 = new Button("b1"); b2 = new Button("b2"); b3 = new Button("b3"); b4 = new Button("b4"); b5 = new Button("b5");

add(t1); add(t2); add(t3); add(t4); add(t5); add(b1); add(b2); add(b3); add(b4); add(b5); } } El cual se visualiza:

De esta manera vemos como se van acomodando los elementos de 3 en 3 por rengln, teniendo 4 renglones y 3 columnas. BorderLayout(). Este nos sirve para poner los elementos por zonas, teniendo el Centro, Sur, Norte, Este y Oeste. Cada vez que aadimos un elemento debemos decir a que lugar lo mandamos, de la siguiente manera: add(elemento, BorderLayout.NORTH), o en lugar de NORTH puede ser SOUTH, EASTH, WEST, o CENTER. Un ejemplo de esto sera: import java.awt.*; import java.applet.*; // <applet width="400" height="400" code="AppletInterfaz8"></applet> public class AppletInterfaz8 extends Applet { Button b1, b2, b3; TextField t1, t2;

public AppletInterfaz8() { setLayout(new BorderLayout()); t1 = new TextField("a"); t2 = new TextField("b"); b1 = new Button("b1"); b2 = new Button("b2"); b3 = new Button("b3"); add(t1, BorderLayout.NORTH); add(t2, BorderLayout.EAST); add(b1, BorderLayout.WEST); add(b2, BorderLayout.SOUTH); add(b3, BorderLayout.CENTER); } } En forma visual quedara:

En el applet anterior se muestra como al cambiar de tamao el applet los elementos grficos se ajustan para esto, lo cual es una facilidad del Layout

GridLayout y el BorderLayout.

2.2.3 Paneles
Panel Para la ayuda al manejar los elementos grficos tenemos el Panel, que es la clase que nos permite tomar elementos grficos en forma agrupada y se manejan como si fuera un solo elemento a la hora de aadirlos en una distribucin (Layout). Para crear un Panel solo se define este y al crearse se le define internamente la distribucin de los elementos a mostrar, por ejemplo podemos decir que el panel 1 tiene un GridLayout como distribucin y el panel 2 tiene un BorderLayout y que estos pertenecen a un FlowLayout como distribucin general, tal como se muestra en el siguiente ejemplo: import java.awt.*; import java.applet.*;

// <applet width="400" height="200" code="AppletInterfaz9"></applet>

public class AppletInterfaz9 extends Applet { Button b1, b2, b3, b4, b5; TextField t1, t2, t3, t4, t5; Panel p1, p2;

public AppletInterfaz9() { setLayout(new FlowLayout()); p1 = new Panel(new GridLayout(2,2,10,10)); p2 = new Panel(new BorderLayout()); t1 = new TextField("a"); t2 = new TextField("b"); t3 = new TextField("c"); t4 = new TextField("d"); t5 = new TextField("e"); b1 = new Button("b1"); b2 = new Button("b2"); b3 = new Button("b3"); b4 = new Button("b4"); b5 = new Button("b5"); p1.add(t1); p1.add(t2); p1.add(t3); p1.add(t4); p1.add(t5); p2.add(b1,BorderLayout.NORTH); p2.add(b2, BorderLayout.EAST);

p2.add(b3, BorderLayout.WEST); p2.add(b4, BorderLayout.SOUTH); p2.add(b5, BorderLayout.CENTER); add(p1); add(p2); } }

El cual se visualiza asi:

Es importante observar que una vez que definimos los paneles y aadimos los elementos a ellos, es importante NO OLVIDAR que debemos aadir los paneles al applet al final, por eso tenemos add(p1); y add(p2); al final.

Los paneles se pueden utilizar como nosotros mejor dispongamos, cada uno

de ellos puede ser tratado como la ventana del applet, de tal manera que podemos definir un diferente manejador de espacio para cada uno, como lo estamos observando en el ejemplo pasado.

Inclusive podemos tener un panel cuyo manejador de espacio es un GridLayout, pero hacia adentro, uno de los elementos que le aadimos a ese panel puede ser otro panel que contiene elementos aadidos con un manejador de espacio de FlowLayout, o BorderLayout, en fin, podemos utilizar la imaginacin para definir diferentes presentaciones de nuestro applet.

Pudiramos inclusive manejar un panel dentro de otro, teniendo cuidado de utilizar el mtodo add correctamente en el panel adecuado, cuando usamos p1.add( objeto); lo que estamos haciendo es aadir el objeto grfico al panel p1, pero esa instruccin aun no aade algo al applet, es por esto que debemos tener cuidado de aadir finalmente al applet el panel, o los paneles finales, es decir los que ya contengan la informacin deseada, con los correspondientes objetos creados.

Actividades 2.2 Actividad 2.2.1 Elementos de la Interfaz Grfica


Objetivo especfico de aprendizaje Conocer los elementos ms bsicos de la interfaz grfica en Java para y utilizarlos en aplicaciones que resulten ms vistosas.

Duracin de la actividad

Producto a entregar

Forma de entrega

4.5 horas

Como resultado de la actividad el alumno: Conocer los elementos ms bsicos de la interfaz grfica y la forma de utilizarlos. Aplicar los conceptos de los elementos de la interfaz grfica en aplicaciones que lo requieran.

Por plataforma

Actividad previa

Recursos de apoyo

Otros eventos diferentes a los de botn.

Unidad 2. Tema 1. Elementos de Interfaz Grfica

Descripcin de la actividad

1. Hacer la lectura definida de Elementos de Interfaz Grfica. 2. Utilizar los ejemplos de la lectura, complalos y ejectalos. 3. Practicar haciendo un applet llamado AppletInterfaz que despliega una

lista con diferentes colores y que al seleccionar uno de los elementos de la lista, se dibuje un rectngulo con el color seleccionado de la lista.

El applet deber presentar algo parecido a lo siguiente:

Actividad 2.2.2 Manejadores de Espacio


Objetivo especfico de aprendizaje Comprender la manera de utilizar los manejadores de espacio para mostrar los elementos de la interfaz grfica de una manera ms adecuada para el problema.

Duracin de la actividad

Producto a entregar

Forma de entrega

4.5 horas

Como resultado de la actividad el alumno: Conocer los diferentes manejadores de espacio y la forma de utilizarlos. Aplicar los conceptos de los manejadores de espacio en aplicaciones que lo requieran.

Por plataforma

Actividad previa

Recursos de apoyo

Elementos de Interfaz Grfica

Unidad 2. Tema 2. Manejadores de Espacio

Descripcin de la actividad

1. Hacer la lectura definida de Manejadores de Espacio. 2. Utilizar los ejemplos de la lectura, complalos y ejectalos. 3. Practicar haciendo un applet llamado AppletManejadores que

despliega 3 campos texto y varios botones para realizar operaciones con los campos texto. Los campos son X, Y y RESULTADO, cada operacin aritmetica sera de X como primer operando y Y como segundo operando. El texto que corresponde a resultado debera de quitarse la facilidad de ser editable, utilice el mtodo setEditable para ese texto (investigue como hacerlo).

El applet deber presentar algo parecido a lo siguiente, este ejemplo asume que el botn x a la y fue seleccionado:

Actividad 2.2.3 Paneles


Objetivo especfico de aprendizaje

Comprender la manera de utilizar los paneles para mostrar los elementos de la interfaz grfica de una manera ms adecuada para el problema.

Duracin de la actividad

Producto a entregar

Forma de entrega

4.5 horas

Como resultado de la actividad el alumno: Conocer los diferentes paneles y la forma de utilizarlos. Aplicar los conceptos de los paneles en aplicaciones que lo requieran.

Por plataforma

Actividad previa

Recursos de apoyo

Manejadores de Espacio

Unidad 2. Tema 2. Paneles

Descripcin de la actividad

1. Hacer la lectura definida de Paneles. 2. Utilizar los ejemplos de la lectura, complalos y ejectalos. 3. Practicar haciendo un applet llamado AppletCalculadora que tenga

un texto de desplegado y que se comporte como una calculadora, de manera que al ir oprimiendo un botn de dgito el nmero se vaya agrandando en el texto de desplegado, al darle un botn de operacin (+, -, *, /) se guarde para que al volver a poner dgitos y dar el botn = se haga el clculo, el botn C es para borrar todo y el boton CE es para limpiar el texto de desplegado nada ms. El botn (.) es para ponerle punto decimal al numero, solo se pondr una vez, si el usuario lo sigue poniendo no se le aadir mas al texto de desplegado.

El applet deber presentar algo parecido a lo siguiente:

2.3 Modularizacion
En esta unidad entenders mejor la manera de utilizar los mtodos y poder partir un applet o aplicacin en pequeas soluciones a travs de mtodos mas refinados,

reutilizar mtodos ya existentes, entender los diferentes tipos de mtodos y sobrecargarlos.

Programa: Programacin

Clave del curso en lnea:

Nombre del curso: Desarrollo de Aplicaciones con Interfaz Grfica y Manejo de Clases y Objetos

Nombre de la Unidad didctica 3: Modularizacin

Introduccin: La modularizacin es la manera de partir un problema en pequeos problemas, de manera que se puedan resolver pequeos problemas ms fcilmente. En Java la modularizacin se realiza teniendo clases que se encarguen del manejo de los objetos que correspondan a esa clase, a su vez, dentro de una clase, el uso de mtodos es importante para poder resolver un pequeo problema.

Objetivo: Conocer el uso de los mtodos dentro de una clase, as como los tipos de mtodos que se pueden definir y la sobre escritura de los mtodos.

Contenidos

Tema1: Manejo de Mtodos

Tema2: Tipos de Mtodos

Tema3: Sobrecarga de Mtodos

2.3.1 Mtodos
Mtodos Los mtodos son utilizados para definir un grupo de instrucciones que son separadas y que definen un comportamiento, que requieren en algunos casos de valores para su proceso. Un mtodo es algo muy utilizado en la programacin de Java y en POO representa las conductas de los objetos que se traten. El mtodo nos ayuda a definir un cambio en algn objeto y es importante que entendamos como funciona un mtodo ya definido y como utilizarlo al hacer alguna aplicacin o un applet, pues el mtodo es clave, pieza principal de la programacin orientada a objetos. Los mtodos pueden ser de un tipo especfico como int, double, String, Cuenta,

etc. o simplemente no tener algn tipo como void. Cuando un mtodo es void, este mtodo no se espera que regrese algn valor a la aplicacin que utiliz algn objeto que tenga es mtodo como parte de la definicin de la clase. Si un mtodo es definido como int, entonces debe utilizar la instruccin return y el valor int calculado. Algunos ejemplos son: public int obtenValor() { return valor; // donde valor es de tipo entero } public double obtenSaldo() { return saldo; // donde saldo es de tipo double } public void cambiaSaldo(saldo) { this.saldo = saldo; //igualando la variable de la clase al parmetro }

Paso de Parmetros Al utilizar un parmetro, la manera en la que el mtodo utiliza el parmetro que le es pasado es la que define que tipo de paso de parmetro es. Por valor Cuando a un mtodo se le pasa un parmetro de algn tipo de datos primitivo (char, int, double, etc), lo que hace el mtodo internamente en memoria es sacar una copia del valor que se est pasando para no afectar a la variable que ha sido enviada a travs del mtodo, por ejemplo: Si tenemos la variable int x en un mtodo llamado uno y este mtodo llama al mtodo dos y este mtodo dos tambin tiene una variable x, el mtodo dos saca una copia de x, y aunque es bautizada con el mismo nombre, se respeta el valor de x en el mtodo uno. Veamos el caso:

public void uno() { int x = 10; dos(x); System.out.println( x en uno = + x); } public void dos (int x) { x = x + 2; System.out.println( x en dos = + x); } Al ejecutar estos mtodos en alguna aplicacin, observaramos como se despliega: x en dos = 12 x en uno = 10 Mientras que la x que se mando a dos se copio con el valor 10 y se le sumaron 2, dando 12, la x que esta en uno sigue valiendo 10, porque se saca una copia del valor para mandarse a dos. Paso de parmetros por Referencia Esto se ver en la siguiente unidad temtica, donde se explica Clases y Objetos. Utilicemos en este momento la definicin de la clase Punto, esta clase nos ayuda a visualizar el comportamiento de cualquier objeto Punto, con sus diferentes tipos de mtodos: public class Punto { private int x; // variable para la coordenada en x private int y; // variable para la coordenada en y public Punto() { // mtodo para construir un objeto sin parmetros x = 0;

y = 0; } // mtodo para construir un objeto con parmetros public Punto(int x, int y) { this.x = x; this.y = y; } public int obtenX() { return x; } public int obtenY() { return y; } // mtodo que sirve para cambiar el valor //de la coordenada x public void cambiaX(int x) { this.x = x; // this se utiliza porque se esta utilizando (x) // mtodo que te d el valor de la coordenada y // mtodo que te d el valor de la coordenada x

// como parmetro y como // variable de instancia y esto es para que no se confunda } // mtodo que te sirve para cambiar el valor de la coordenada y public void cambiaY(int y) { this.y = y; // this se utiliza porque se esta utilizando (y) //como parmetro y como

// variable de instancia y esto es para que no se confunda Java } } Variables de Instancia Esta clase utiliza primero que nada las variables de la clase, llamadas variables de instancia, ya que con cada objeto que se cree de la clase, se crea una instancia de estas variables para cada objeto diferente. Estas variables se deben definir como privadas. Mtodos Constructores Posteriormente revisamos que tiene dos mtodos que se llaman igual a la clase, pero que no manejan algn tipo, es decir o int, o double o String, etc., solamente se dice son pblicos. A estos mtodos se les llama constructores y son los que se utilizan cuando se crea un objeto de la clase. Es muy importante que un mtodo constructor tenga definido internamente la asignacin para cada una de las variables de instancia. Mtodos de Acceso. los Getter Posteriormente se definen los mtodos obtenVariable(), llamados mtodos de acceso, es decir se define un mtodo por cada variable de instancia (de acuerdo al tipo de cada variable), esto es algo que nos permite obtener el valor de cada variable, ya que las variables han sido definidas como privadas, para que alguien de otra clase no las pueda modificar directamente. Mtodos Modificadores. Los Setter Luego se definen los mtodos modificadores cambiaVariable(), de tipo void (ya que no regresan valor), estos mtodos deben cambiar el valor de cada variable, y solo a travs de ellos es que se deben cambiar los valores de las variables de instancia, ya que ellas son privadas. Por convencin de Java , inclusive dentro de la misma clase, si se desea cambiar el valor de una variable debern utilizarse para esto los mtodos modificadores y de acceso, es decir, aunque sabemos que si queremos incrementar la x en 1, podemos hacer: x++; O x = x + 1;

Para respetar las normas de convencin de cdigo Java, debemos utilizar los mtodos modificadores y de acceso, de tal manera que quedara de la siguiente manera: cambiaX ( obtenX() + 1 ); Aunque se ve mucho ms largo o mucho ms difcil de entender, tiene su porque, el porque es debido a que si algo se debe de hacer cuando se modifique el valor de x o cuando se obtenga el valor de x, por ejemplo, entonces se hace en el mtodo modificar o el mtodo de acceso, correspondientemente, de esta manera no se pierde el control del comportamiento de las variables de instancia del objeto y es as como se mantiene la intregridad, este es un muy buen hbito de programacin. *** Solo los mtodos constructores y mtodos de acceso o mtodos de modificacin pueden acceder directamente las variables de instancia de la clase.*** Esta clase queremos que contenga un mtodo que nos sirva para dibujar un punto en la coordenada (x,y), entonces crearemos un nuevo mtodo llamado dibujaPunto(), el cual requerir un elemento grfico como el que hasta ahora hemos utilizado con un applet public void paint(Graphics g) Si el mtodo dibujaPunto() de la clase Punto no recibe como parmetro el objeto grfico de la clase Graphics, no habr manera que pueda dibujar el punto. Veamos como quedara ahora nuestra clase Punto modificada: public class Punto { private int x; // variable para la coordenada en x private int y; // variable para la coordenada en y public Punto() { // mtodo para construir un objeto sin parmetros x = 0; y = 0; } // mtodo para construir un objeto con parmetros public Punto(int x, int y) {

this.x = x; this.y = y; } public int obtenX() { return x; } public int obtenY() { return y; } // mtodo que sirve para cambiar el valor //de la coordenada x public void cambiaX(int x) { this.x = x; // this se utiliza porque se esta utilizando (x) // mtodo que te d el valor de la coordenada y // mtodo que te d el valor de la coordenada x

// como parmetro y como // variable de instancia y esto es para que no se confunda } // mtodo que te sirve para cambiar el valor de la coordenada y public void cambiaY(int y) { this.y = y; // this se utiliza porque se esta utilizando (y) //como parmetro y como // variable de instancia y esto es para que no se confunda Java }

public void dibujaPunto(Graphics g) {

g.fillOval(obtenX() , obtenY(), 5, 5); } }

Es importante aqu hacer notar que para dibujar el Punto, se utiliza el mtodo obtenX() y el mtodo obtenY(), aun y cuando se pudieran utilizar directamente x y y, directamente, se usan los mtodos, ya que esto representa una norma de la programacin orientada a objetos. Esta clase se utiliza creando un objeto de ella dentro de un applet y haciendo uso de sus mtodos: import java.awt.*; import java.applet.*; import java.awt.event.*; // <applet width="200" height="200" code="AppletMetodos1"></applet> public class AppletMetodos1 extends Applet implements ActionListener { Label l1, l2, l3,l4; TextField t1, t2, t3,t4; Button b; Punto p;

public AppletMetodos1() { l1 = new Label("X"); t1 = new TextField(4); l2 = new Label("Y"); t2 = new TextField(4);

b = new Button("DIBUJA PUNTO"); add(l1); add(t1); add(l2); add(t2); add(b); b. addActionListener(this); }

public void paint(Graphics g) { p.dibujaPunto(g); }

public void actionPerformed(ActionEvent ae) { int x = Integer.parseInt(t1.getText()); // lee el valor TextField t1 y se lo pasa a x int y = Integer.parseInt(t2.getText()); // lee el valor TextField t2 y se lo pasa a y p = new Punto(x, y); repaint(); } }

Nota: Para ejecutar el ejemplo en Consola / Terminal 1) Hay que crear dos archivos. Uno llamado Punto.java, con el cdigo de la clase Punto, (aadiendole import java.awt.*; import java.applet.*; import java.awt.event.*; delante de la definicin de clase) y otro llamado archivo con el nombre AppletMetodos1.java , y se le pone el cdigo del Applet 2) Se compilan: javac Punto.java y javac AppletMetodos1.java

3) Y se ejecuta con comando: AppletViewer AppletMetodos1.java

En el se puede observar un punto grande en la coordenada 100, 100, ahora hicimos este punto grande con el mtodo fillOval y mandndole un dimetro de

mas de un pixel para que se viera la diferencia. Al utilizar un mtodo, o al llamar (invocar) un mtodo, nosotros le podemos pasar valores al mtodo y a su vez, el mtodo puede utilizar aquellos valores que han sido definidos en forma global, por ejemplo, nosotros en la clase Punto, dentro del mtodo paint(), podemos utilizar x, o y, ya que ambas son variables de instancia definidas arriba de todos los mtodos, por lo tanto todos los mtodos pueden utilizar el valor de x o el valor de y. Por otro lado la clase Punto no es un applet y no tiene la capacidad de dibujar en un elemento grfico por si solo, por eso desde el mtodo paint() del applet, le pasamos al mtodo paint de la clase Punto, el parmetro grfico g, y de esa manera dentro del mtodo paint() de la clase Punto es como este mtodo puede dibujar. Es importante tambin que notes que en la clase Punto al introducir el mtodo paint(), se hizo el import java.awt.*; ya que ahora que se dibuja, se requiere utilizar el mtodo fillRect() el cual pertenece a los elementos de la clase Graphics que est dentro de ese paquete. Un mtodo es definido como void cuando no requiere regresar un valor a quien lo llam. En caso de requerir regresar un valor este puede ser de los mismos tipos que las variables definidas al principio:

Tipo de mtodo Byte Short int long float double char boolean NombreClase

descripcin formato/tamao entero de tamao byte 8-bits a complementos a dos entero corto 16-bits a complementos a dos entero 32-bits a complementos a dos entero grande 64-bits a complementos a dos punto flotante de precision sencilla 32-bits IEEE 754 punto flotante de doble precision 64-bits IEEE 754 un solo caracter caracter de 16-bits de tipo Unicode valor boleano (true o false) true o false Alguna clase existente representar un objeto de alguna clase conocida

Las variables y objetos definidos y creados dentro de un mtodo se consideran locales al mtodo y solo pueden ser utilizados dentro de l. Si al llamar a otro mtodo se quiere que el mtodo llamado utilice alguna variable o algn objeto, dicho mtodo debe de tomarlo a travs de un parmetro para tal efecto. Es muy importante que los mtodos se llamen con el nmero exacto de variables y/o objetos definidos como parmetros, asi como el tipo

correspondiente de cada uno de ellos. Posibles Problemas con la creacin de un objeto. Es muy comn que cuando se ejecute el mtodo paint() en el applet anterior, el applet no haya creado aun el objeto punto p, de tal manera que no hay objeto creado para dibujar, una modificacin a este applet para que funcionara sin problemas es revisar que el objeto p haya sido creado para poder dibujarlo, entonces el mtodo recomendado para paint() sera: public void paint(Graphics g) { if (p != null) { p.dibujaPunto(g); } }

Esto entonces revisara primero si el objeto no es null (o sea que ya tiene algo adentro) y entonces se dibujara el punto p, utilizando para ello el mtodo dibujaPunto de la clase Punto.

2.3.2. Tipo de Mtodos


Identificadores de Acceso de un Mtodo De acuerdo a la manera de acceder a un mtodo, ste puede ser declarado como : public. Cualquier objeto de otra clase puede utilizar el mtodo sobre un objeto de esta clase. Ejemplos: g.drawString(" Hola ", 100, 100); t.setText(""); p.paint(g); private. Solo un elemento de la clase lo puede utilizar al mtodo, ningn objeto de

otra clase puede utilizar este mtodo. protected. Solo elementos de la clase o los descendientes (por herencia) pueden utilizar este mtodo, este mtodo lo usaremos mucho cuando veamos herencia. static. La mejor manera de acceder al mtodo static es a travs de utilizar la clase, ya que este mtodo pertenece a la clase y no se liga como comportamiento de algn objeto de la clase, sino con el comportamiento de la clase en s. Un ejemplo del uso de este mtodo es el Integer.parseInt( t.getText() ); que hemos usado anteriormente, el mtodo parseInt es declarado como static dentro de la clase Integer, pues su servicio no esta supeditado a un objeto, esta clausula static puede ir combinada con public o private o protected. A continuacin utilizaremos la clase Cuenta que representar una cuenta bancaria, dicha clase manejar una sola variable de instancia que se referir al saldo y entonces tendremos la siguiente clase: public class Cuenta { private double saldo; // variable para manejar el saldo public Cuenta() { // mtodo para construir una cuenta vaca saldo = 0.0; }

// mtodo para construir una cuenta con un saldo inicial public Cuenta(double saldo) { this.saldo = saldo; }

// mtodo que te d el saldo de una cuenta public double obtenSaldo() { return x; }

// mtodo que sirve para cambiar el valor del saldo public void cambiaSaldo(double saldo) { // this se utiliza porque se esta utilizando (saldo) como parmetro y como this.saldo = saldo; // variable de instancia y esto es para que no se confunda } } En esta clase estamos utilizando todos los mtodos como pblicos, ya que nos interesara que desde cualquier applet se pudieran crear objetos de la clase Cuenta, simplemente definiendo algun objeto y creandolo con algno de los constructores, por ejemplo: Cuenta juan = new Cuenta(); Cuenta pedro = new Cuenta(1500.00); Ambas instrucciones crean objetos de la clase Cuenta, el objeto juan tiene un saldo en ceros, pero el objeto pedro tiene un saldo con 1500. Ahora haremos uso de un mtodo privado que en realidad no tiene sentido, pero para ejemplificar el uso de esto, con la siguiente definicin de clase: public class Cuenta { private double saldo; // variable para manejar el saldo public Cuenta() { // mtodo para construir una cuenta vaca saldo = 0.0; }

// mtodo para construir una cuenta con un saldo inicial public Cuenta(double saldo) {

this.saldo = saldo; }

// mtodo que te d el saldo de una cuenta public double obtenSaldo() { return saldo; }

// metodo privado para poner a cero el saldo private void conCero() { saldo = 0.0; }

// mtodo que sirve para cambiar el valor del saldo public void cambiaSaldo(double saldo) { // this se utiliza porque se esta utilizando (saldo) como parmetro y como this.saldo = saldo; // variable de instancia y esto es para que no se confunda } } El mtodo privado conCero() pone en cero el saldo que se tiene, pero en realidad no se necesita, pues el mtodo cambiaSaldo() que es quien lo llama, esta cambiando el valor del saldo, pero aqui lo que queremos hacer ver es que si hicieramos algun uso de este mtodo como por ejemplo:

Cuenta juan = new Cuenta(700.00); juan.conCero(); Esto nos daria un error, pues el mtodo conCero() es privado y no hay manera de utilizarlo, sino solamente desde la clase, como se esta haciendo. Un ejemplo de un mtodo esttico sera cuando necesitamos hacer uso de este mtodo solo a travs del nombre de la clase y no a travs de ningn objeto. Haremos un mtodo que nos regrese un String (cadena de caracteres), cuando se utilizado el mtodo, por ejemplo: public class Cuenta { private double saldo; // variable para manejar el saldo public Cuenta() { // mtodo para construir una cuenta vaca saldo = 0.0; }

// mtodo para construir una cuenta con un saldo inicial public Cuenta(double saldo) { this.saldo = saldo; }

// mtodo que te d el saldo de una cuenta public double obtenSaldo() { return saldo; }

// metodo privado para poner a cero el saldo

private void conCero() { saldo = 0.0; }

// solo para ensear el uso del mtodo esttico public static String mensaje() { return "Uso del mtodo esttico"; }

// mtodo que sirve para cambiar el valor del saldo public void cambiaSaldo(double saldo) { // this se utiliza porque se esta utilizando (saldo) como parmetro y como this.saldo = saldo; // variable de instancia y esto es para que no se confunda } } En este caso el mtodo mensaje que es pblico y esttico, puede ser utilizado desde fuera de la clase y no es necesario que sea referenciado por algun objeto, sino con el nombre de la clase, por ejemplo: Cuenta pedro = new Cuenta(1500.00);

t.setText("El mensaje esttico es = " + Cuenta.mensaje() ); De esta manera al hacer uso del mtodo mensaje regresar el mensaje definido en la clase. Observemos el siguiente ejemplo de aplicacin:

public class PruebaCuenta { public static void main(String[] args) { Cuenta cuenta1, cuenta2; cuenta1 = new Cuenta(); cuenta2 = new Cuenta(1200.00); System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo()); System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo()); } }

En este ejemplo se crean dos objetos de la clase cuenta y se despliegan, una ejecucin de esta aplicacin sera:

Ahora si utilizamos el mtodos conCero() con la siguiente aplicacin:

public class PruebaCuenta { public static void main(String[] args) { Cuenta cuenta1, cuenta2; cuenta1 = new Cuenta();

cuenta2 = new Cuenta(1200.00); System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo()); System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo()); cuenta2.conCero(); System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo()); System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo()); } }

Encontramos que esta aplicacin NO COMPILA, ya que el mtodo conCero() nos dira que tiene acceso privado en la clase, por lo tanto solo puede ser utilizado en la clase, una manera de usarlo es dentro de la clase como sigue:

La clase Cuenta quedaria:

public class Cuenta { private double saldo; // variable para manejar el saldo public Cuenta() { // mtodo para construir una cuenta vaca saldo = 0.0; } // mtodo para construir una cuenta con un saldo inicial

public Cuenta(double saldo) { this.saldo = saldo; } // mtodo que te d el saldo de una cuenta public double obtenSaldo() { return saldo; } // metodo privado para poner a cero el saldo private void conCero() { saldo = 0.0; } // solo para ensear el uso del mtodo esttico public static String mensaje() { return "Uso del mtodo esttico"; } // borra el saldo public void borra() { conCero(); } // mtodo que sirve para cambiar el valor del saldo public void cambiaSaldo(double saldo) { // this se utiliza porque se esta utilizando (saldo) como parmetro y como this.saldo = saldo; // variable de instancia y esto es para que no se confunda

} }

Y la Aplicacin sera:

public class PruebaCuenta { public static void main(String[] args) { Cuenta cuenta1, cuenta2; cuenta1 = new Cuenta(); cuenta2 = new Cuenta(1200.00); System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo()); System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo()); cuenta2.borra(); System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo()); System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo()); } }

Una ejecucin de esta aplicacin sera:

Si recordamos lo que se mencion anteriormente sobre la convencin de Java, una de las convenciones no ha sido respetada en la clase Cuenta, la de borrar el saldo, es decir para hacer saldo cero, para que quede como debiera sera:

La clase Cuenta quedara como:

public class Cuenta { private double saldo; // variable para manejar el saldo public Cuenta() { // mtodo para construir una cuenta vaca saldo = 0.0; } // mtodo para construir una cuenta con un saldo inicial public Cuenta(double saldo) { this.saldo = saldo; } // mtodo que te d el saldo de una cuenta public double obtenSaldo() { return saldo; } // metodo privado para poner a cero el saldo private void conCero() { cambiaSaldo(0.0); } // solo para ensear el uso del mtodo esttico public static String mensaje() { return "Uso del mtodo esttico"; }

// borra el saldo public void borra() { conCero(); } // mtodo que sirve para cambiar el valor del saldo public void cambiaSaldo(double saldo) { // this se utiliza porque se esta utilizando (saldo) como parmetro y como this.saldo = saldo; // variable de instancia y esto es para que no se confunda } }

La aplicacin sera la misma, con la misma ejecucin:

Utilizando ahora el mtodo esttico podemos observar que la aplicacin cambia a la siguiente:

public class PruebaCuenta { public static void main(String[] args) { Cuenta cuenta1, cuenta2;

cuenta1 = new Cuenta(); cuenta2 = new Cuenta(1200.00); System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo()); System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo()); cuenta2.borra(); System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo()); System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo()); System.out.println("Mensaje = " + Cuenta.mensaje()); System.out.println("Mensaje = " + cuenta1.mensaje()); } }

En esta aplicacin obervamos el uso del mensaje de dos maneras:

System.out.println("Mensaje = " + Cuenta.mensaje()); System.out.println("Mensaje = " + cuenta1.mensaje());

En la primera, se est utilizando la clase Cuenta, como lo hemos hecho anteriormente con otros mtodos estticos, como Math.pow(), o Integer.parseInt(). Vemos tambien que el mismo mtodo se est utilizando con el objeto cuenta1, lo cual tambin es posible, ya que un objeto de la clase Cuenta puede tambin tener acceso al mtodo esttico

2.3.3 Sobrecarga de Mtodos

Sobrecarga de mtodos El encabezado o firma de un mtodo (la primera lnea en el) nos dice que modificador tiene el mtodo (publico, protegido, privado), su tipo de retorno (void o alguno de los tipos previamente vistos) y los parmetros que requiere para trabajar. Pero ya que se define un mtodo, ste puede definirse varias veces (sobrecargarse) en la misma clase, pero cambiando su encabezado de manera que sean otros los parmetros a utilizar, en C++ se pueden sobrecargar operadores, como el +, el - , etc., pero en Java no, en Java el operador + se puede utilizar para sumar nmeros o para concatenar Strings solamente, la sobrecarga se puede realizar en mtodos constructores o mtodos no constructores. Para ejemplificar la sobrecarga de mtodos supongamos que tenemos alguna clase en la que se lleva el control del inventario de un artculo y puede ser que la cantidad que se reciba sea un entero, pero tambin pueda ser un nmero de doble precisin, o un objeto tipo String, entonces podemos tener el mismo mtodo definido tres veces: public void cambia( int numero) { inventario = numero; }

public void cambia( double numero) { // esto es la conversin de tipos usado tambin en C++ inventario = (int) numero; }

public void cambia( String numero) { // asumiendo que inventario es entero inventario = Integer.parseInt(numero); } Cuando el mtodo sea llamado, Java revisar cual es el mtodo a utilizar dependiendo de la firma y el parmetro pasado. Esto es muy utilizado tambin en los constructores de los objetos, por ejemplo

pensemos en la clase Punto, en la que podemos construir un objeto Punto a partir de dos valores enteros, pero supongamos que tambin quisieran ser construidos a travs de dos valores de precisin doble (double) o que se quisiera construir un objeto a partir de otro objeto Punto, veamos como quedara la clase Punto: public class Punto { private int x; // variable para la coordenada en x private int y; // variable para la coordenada en y

// metodo para construir un objeto sin parmetros public Punto() { x = 0; y = 0; }

// mtodo para construir un objeto con parmetros enteros public Punto(int x, int y) { this.x = x; this.y = y; }

// mtodo para construir un objeto con parmetros double public Punto(double x, double y) { this.x = (int) x; this.y = (int) y; }

// mtodo para construir un objeto con parmetro objeto Punto public Punto(Punto obj) { this.x = obj.x; this.y = obj.y; }

// mtodo que te d el valor de la coordenada x public int obtenX() { return x; }

// mtodo que te d el valor de la coordenada y public int obtenY() { return y; }

// mtodo que sirve para cambiar el valor de la coordenada x public void cambiaX(int x) { // this se utiliza porque se esta utilizando (x) como parmetro y como // variable de instancia y esto es para que no se confunda this.x = x; }

// mtodo que sirve para cambiar el valor de la coordenada y public void cambiaY(int y) { // this se utiliza porque se esta utilizando (y) como parmetro y como // variable de instancia y esto es para que no se confunda this.y = y; } } En esta clase, ahora manejamos diferentes constructores para la clase, esto ya lo habamos hecho antes, y es entonces que tambin los constructores se pueden definir de varias maneras. De la misma manera pudiramos redefinir algn o algunos mtodos. Supongamos que los valores de x o de y, sean tomados no solamente de enteros sino de valores tipo double, entonces tendramos una clase como la siguiente: public class Punto { private int x; // variable para la coordenada en x private int y; // variable para la coordenada en y

// metodo para construir un objeto sin parmetros public Punto() { x = 0; y = 0; }

// mtodo para construir un objeto con parmetros enteros

public Punto(int x, int y) { this.x = x; this.y = y; }

// mtodo para construir un objeto con parmetros double public Punto(double x, double y) { this.x = (int) x; this.y = (int) y; }

// mtodo para construir un objeto con parmetro objeto Punto public Punto(Punto obj) { this.x = obj.x; this.y = obj.y; }

// mtodo que te d el valor de la coordenada x public int obtenX() { return x; }

// mtodo que te d el valor de la coordenada y

public int obtenY() { return y; }

// mtodo que sirve para cambiar el valor de la coordenada x public void cambiaX(int x) { // this se utiliza porque se esta utilizando (x) como parmetro y como // variable de instancia y esto es para que no se confunda this.x = x; }

// mtodo que toma un double para cambiar a x public void cambiaX(double x) { // this se utiliza porque se esta utilizando (x) como parmetro y como // variable de instancia y esto es para que no se confunda this.x = (int) x; }

// mtodo que sirve para cambiar el valor de la coordenada y public void cambiaY(int y) { // this se utiliza porque se esta utilizando (y) como parmetro y como // variable de instancia y esto es para que no se confunda this.y = y;

// mtodo que toma un double para cambiar a y public void cambiaY(double y) { // this se utiliza porque se esta utilizando (y) como parmetro y como // variable de instancia y esto es para que no se confunda this.y = (int) y; }

// metodo para obtener el objeto en formato String public String toString() { return "(" + obtenX() + "," + obtenY() + ")"; } }

Una aplicacin no grfica que use esta clase para entender su manejo pudiera ser: public class AplicacionPunto { private static Punto a, b, c, d, e;

public static void main(String[] args) { a = new Punto(); b = new Punto(1, 2);

c = new Punto(3.0, 4.0); d = new Punto(b); e = new Punto(c); System.out.println(" Punto a = " + a.toString()); System.out.println(" Punto b = " + b.toString()); System.out.println(" Punto c = " + c.toString()); System.out.println(" Punto d = " + d.toString()); System.out.println(" Punto e = " + e.toString()); a.cambiaX(5.0); c.cambiaY(-3.0); System.out.println("Valores cambiados"); System.out.println(" Punto a = " + a.toString()); System.out.println(" Punto c = " + c.toString()); } }

Ambas clases deben estar en la misma carpeta para que se pueda utilizar la aplicacin La forma en la que se puede visualizar esto es compilando como una aplicacin no grfica y ejecutndola, de la siguiente manera:

De esta manera observamos la manera de crear diferentes objetos de la clase Punto, y tambin observamos como es posible cambiar el valor de alguna de las variables de instancia de esos objetos utilizando un nmero de punto flotante en vez de un nmero entero. Hemos hecho uso de una aplicacin no grfica para que se enfatice el uso de este concepto solamente. Notars que en la clase Punto utilizamos el mtodo toString(), este mtodo es muy utilizado en todas las clases Singulares, ya que es la manera de representar cualquier objeto de la clase en formato String

Actividad 2.3 Actividad 2.3.1 Mtodos


Descripcin de la actividad

1. Hacer la lectura definida de Mtodos. 2. Utiliza los ejemplos de la lectura, complalos y ejectalos. 3. Practicar haciendo un applet llamado AppletMtodos que tome los

datos de una cuenta bancaria (numero, nombre y saldo), y al oprimir el botn debe crear un objeto de la clase Cuenta y desplegarlo en el rea de texto llamado resultado. El applet deber de utilizar un objeto de la clase Cuenta, para esto habr que definir la clase Cuenta de la siguiente manera: Manejar numero, nombre y saldo de la cuenta

Tener un constructor que cree una cuenta sin parmetros Tener un constructor que cree una cuenta con los 3 parmetros Tener los mtodos de acceso correspondiente Tener los mtodos modificadores correspondientes

El applet deber presentar algo parecido a lo siguiente:

Actividad 2.3.2 Tipos de Metodos


Descripcin de la actividad

1. Hacer la lectura definida de Tipos de Mtodos. 2. Utiliza los ejemplos de la lectura, complalos y ejectalos.

3. Practicar haciendo una aplicacin llamada PruebaLaptop que utilice una


clase Laptop, dicha clase deber de tener los siguientes descriptores: Manejar como variables de instancia: Marca (String), Modelo (String), Tamao de Memoria (integer) y Precio (double) Menejar como variable esttica : cuenta (integer. Investiga esto, se comporta igual que un mtodo esttico). Tener un constructor que cree un objeto Laptop sin parmetros

Tener un constructor que cree un objeto Laptop con los 4 parmetros Tener los mtodos de acceso correspondiente Tener los mtodos modificadores correspondientes

Tener un mtodo esttico que regresa el valor de la variable cuenta (integer) La variable cuenta debe ser definida como esttica, junto con las dems variables de instancia y con un valor de cero: private static int cuenta = 0;

Cada constructor deber incrementar esta variable en uno. Crea una aplicacin como las definidas en la lectura, que cree al menos 3 objetos de la clase Laptop y que muestre el uso de todos los mtodos de la clase, utilizando para ello, los diferentes objetos creados, cada vez que modifiques algn valor de algun objeto, es importante que despliegues todos los objetos utilizados. Debers utilizar el mtodo esttico. Para esta aplicacin no se muestra ejemplo, pues para entender el ejemplo ejecutado se tendra que mostrar la clase Laptop y es lo que se est pidiendo tambin

Actividad 2.3.3 Sobrecarga de Mtodos


Descripcin de la actividad

1. Hacer la lectura definida de Sobrecarga de Mtodos. 2. Utiliza los ejemplos de la lectura, complalos y ejectalos. 3. Practicar haciendo una aplicacin llamada PruebaLaptop2 que utilice
una clase Laptop, dicha clase deber de tener los siguientes descriptores:

Manejar como variables de instancia: Marca (String), Modelo (String), Tamao de Memoria (integer) y Precio (double) Menejar como variable esttica : cuenta (integer. Investiga esto, se comporta igual que un mtodo esttico). Tener un constructor que cree un objeto Laptop sin parmetros Tener un constructor que cree un objeto Laptop con los 4 parmetros Sobrecargar el constructor con 4 parmetros para que utilice el precio (integer) Tener los mtodos de acceso correspondiente Tener los mtodos modificadores correspondientes

Sobrecargar los mtodos modificadores de memoria y de precio para que acepten double e int correspondientemente Tener un mtodo esttico que regresa el valor de la variable cuenta (integer) Sobrecargar el mtodo esttico para que rergrese un valor double. La variable cuenta debe ser definida como esttica, junto con las dems variables de instancia y con un valor de cero: private static int cuenta = 0;

Cada constructor deber incrementar esta variable en uno. Crea una aplicacin como las definidas en la lectura, que cree al menos 3 objetos de la clase Laptop y que muestre el uso de todos los mtodos de la clase, utilizando para ello, los diferentes objetos creados, cada vez que modifiques algn valor de algun objeto, es importante que despliegues todos los objetos utilizados. Debers utilizar el mtodo esttico.

Para esta aplicacin no se muestra ejemplo, pues para entender el ejemplo ejecutado se tendra que mostrar la clase Laptop y es lo que se est pidiendo tambin.

2.4. Clases y Objetos


Esta unidad te permite entender mejor la modelacin, definicin y uso de las clases y los objetos, entendiendo tambin los conceptos de Herencia, Polimorfismo y Encapsulacin

2.4.1. Clases y Objetos


Clases y Objetos Cada vez que se analiza un problema a resolver utilizando la computadora y en este caso desarrollando una solucin con una herramienta Orientada a Objetos, el anlisis se debe hacer sobre los objetos involucrados en la solucin y la interaccin que entre ellos existe. El diseo orientado a objetos nos ayuda a construir un modelo de objetos para un sistema que ser desarrollado. Un modelo de objetos especifica las clases, sus atributos y mtodos y sus relaciones con otras clases. Por ejemplo al hablar de clientes, artculos, proveedores, inmediatamente debemos analizar cada uno por separado y la interaccin que entre ellos existe y sobre todo la que tiene relacin al problema en cuestin. Analizando primero las piezas aisladas y luego entrelazando sus relaciones. Por ejemplo debemos tomar en cuenta primero las caractersticas que competen a los artculos y sobre estas las que competen al problema en cuestin o posibles problemas futuros que pudieran ser relacionados a los datos ahora analizados. Vienen a la mente sobre el artculo: el nmero, el nombre, el precio, la cantidad en inventario, el proveedor, etc. As mismo nos debemos preocupar por las conductas que reportan estos artculos, sobre todo las que afectan a nuestro problema en cuestin, por ejemplo un artculo se da de alta en nuestro inventario, tambin se vende, puede ser que se regrese por el cliente, puede ser que se regrese por la empresa si es que esta en malas condiciones, etc. De esta manera empezamos a definir las variables de instancia que contendr cada uno de los objetos de todas las clases posibles que estamos analizando, y as de esa manera tambin empezamos a definir los mtodos que hacen uso de esas variables de instancia y que reflejan la problemtica analizada. Una vez que tenemos las clases definida con sus caractersticas o atributos (variables) y sus conductas (mtodos), entonces es que empezamos a desarrollar la aplicacin que har uso de estas clases. Esto puede ser a travs de una aplicacin no grfica, una aplicacin grfica o un applet.

A continuacin se presentan una serie de pasos necesarios para crear un modelo de objetos a partir de la especificacin de un problema a resolver:

1. Identificar clases de objetos a partir de la especificacin del

problema (ver sustantivos y verbos). Una manera sencilla de hacer esto es empezar por identificar las clases al analizar la descripcin textual en la especificacin del problema. En este anlisis textual, los sustantivos y las frases de sustantivos nos ayudan a entender con frecuencia los objetos y sus clases. Los sustantivos en singular ("cuenta", "carro" y "alumno") y los sustantivos en plural ("puntos", "carros" y "cuentas") indican clases. Los sustantivos propios ("la cuenta de Juan") y los sustantivos de referencia directa ("el individuo que tenia la cuenta") indican objetos.

2. Identificar relaciones entre clases. Aqu se sugiere que se cree una


tabla n x n donde n es el nmero de clases. Se deben nombrar las filas y las columnas con los nombres de las clases y despus se debe escribir en cada celda de interseccin, una relacin de asociacin, donde se define una especializacin, si es que la clase del rengln es aun ms especializada que la clase de la columna, o se escribe una generalizacin si la clase de la columna es una especializacin aun ms especfica que la clase del rengln (vase ejemplo), si hay alguna relacin entre las clases se escribe esta relacin.

3. Identificar los atributos de cada clase. Enumerar aqu aquellos


datos propios de cada una de las clases mencionadas.

4. Identificar los mtodos de cada clase. Aqu se deben de identificar

las acciones que deben ser realizadas por los objetos de la clase ya sea acciones que no tengan relacin con otras clases o acciones en donde involucren otras clases, y asi modificar mtodos en ambas clases.

5. Modelar el problema utilizando UML(Unified Modeling

Language). La modelacin del problema se hace despus de haber hecho estas asociaciones entre clases. El propsito de este curso no es que definas la modelacin de las clases que representan a un problema planteado, pero es importante que destaques las relaciones entre clases para que ests preparado posteriormente en algn curso adicional sobre modelacin de objetos.

A continuacin presentamos una manera en la que se pudieran establecer una relacin especfica de un enunciado de "un cliente es una persona que tiene una o ms cuentas". Persona Persona Cliente Cuenta no especializacin no Cliente generalizacin no X Cuenta no posee alguna cuenta no

Cuando trabajamos con un problema especfico, en relacin a este curso, se debe trabajar con los puntos 1, 3 y 4, para poder entonces crear las clases en Java, como hemos visto anteriormente. Despus escribimos la aplicacin que utilice estas clases. Definicin de una Clase La definicin de una clase se entiende mejor al utilizar el diagrama de clase, que es la notacin que se usa en UML. As como se muestra abajo, una clase est representada por un rectngulo con tres secciones. La primera seccin es donde se define el nombre de la clase; la segunda seccin describe los atributos de la clase y la tercera seccin es para los mtodos de la clase.

Esto nos ayuda a entender visualmente la manera en la que una clase esta compuesta. El tipo de una variable y el tipo de retorno de un mtodo estn especificados por dos puntos ( : ) seguidos por el nombre de un tipo. La especificacin de un atributo o mtodo comienza con un smbolo que indica la vista de dicho atributo o mtodo: - indica vista privada + indica vista pblica

La vista privada no permite que otras clases tengan acceso a este atributo o mtodo, mientras que la vista pblica permite que otras clases tengan acceso a este atributo o mtodo. Normalmente, como lo hemos mencionado, los atributos se deben definir como privados, de esta manera se maneja el concepto llamado como

encapsulamiento, en el que el objeto mantiene el control de la informacin que maneja. Los mtodos se definen comnmente como pblicos, para que cualquiera pueda hacer uso de ellos, a menos que sean mtodos privados definidos para algn clculo que ser propio de la clase donde se definen. Los atributos privados son entonces utilizados (accedidos o modificados) a travs de mtodos pblicos, el mtodo que sirve para tomar algn valor de un atributo privado es llamado de acceso (accesor) y el que sirve para modificar un valor del atributo privado es llamado modificador (mutator). A continuacin mostramos la representacin de UML para la clase Alumno, en la que tenemos tres atributos privados: matricula, nombre y saldo. Y los mtodos pblicos: mtodo de acceso para matricula, nombre y saldo, mtodos modificadores para matrcula, nombre y saldo. Definimos tambin un mtodo privado para hacer el clculo del saldo, y es privado porque no requerimos usarlo fuera de la clase.

Clases de Envoltura (Wrapper Classes) Existen una serie de clases llamadas clases de envoltura o wrapper classes, que son las clases que utiliza Java para manejar los datos primitivos, pero a travs de objetos, es decir, en la mayora de las clases de Java se tienen mtodos que utilizan objetos, son pocos los mtodos o mtodos constructores que toman como parmetros los datos primitivos (int, float, double, char, etc). Es por esto que en Java se han definido estas clases de envoltura.

Existe una clase de envoltura para cada diferente tipo de dato primitivo, dentro de ellas se tienen una serie de constructores utilizados para crear objetos de la clase a partir de diferentes valores primitivos. Hasta ahora hemos utilizado mucho el mtodo parseInt y el mtodo parseDouble de las clases Integer y Double correspondientemente, es importante que analices los constructores que se tienen en cada una de estas clases, as como de las dems clases de envoltura para que puedas utilizarlas eficientemente de acuerdo a tus necesidades. Es importante que las consultes estas clases son:

Tipo de dato primitivo Byte Short Integer Char Flota Double Bolean

Clase de Envoltura (Wrapper Class) java.lang.Byte java.lang.Short java.lang.Integer java.lang.Char java.lang.Float java.lang.Double java.lang.Boolean

2.4.2. Variables de Instancia y Variables de Clase


Cuando se define una clase en POO, las variables que se definen dentro de ella son variables que tendrn diferentes valores con cada una de las instancias que se generan al crear objetos nuevos de la clase.

Una variable de instancia normalmente se define como privada, para que no se pueda modificar desde otra clase, solo a travs de los mtodos (como lo vimos en la clase Punto con el obtenX() y el cambiaX()), pero puede ser definida como pblica y en ese caso no se requiere de hacer uso de algn mtodo para tomar su valor o modificarla (no es recomendable por el control de la variable por la misma clase).

Una variable de clase es aquella que solamente tiene un valor para toda la clase y debe ser definida como static (esttica) para que no se cree un nuevo

valor con cada instancia.

La palabra static nos sirve para definir algo que no tiene que ver con las instancias de la clase, sino con toda la clase.

Cuando a alguna variable o a algn mtodo le anteponemos la palabra static, esto define que ser nica (variable) o nico (mtodo) para toda la clase.

Las variables de instancia se utilizan a travs de los mtodos de la clase y estos son utilizados por objetos. Es decir si tenemos la clase Cuenta, para utilizar la cuenta bancaria, con el constructor vacio Cuenta() y el Constructor(double saldo) con parmetro y definimos algunos objetos como lo siguiente:

Cuenta juan, pedro, luis; juan = new Cuenta(); pedro = new Cuenta(1500.0); luis = new Cuenta(3000.0);

Al usar la palabra new estamos creando un nuevo objeto de la clase y con esto estamos utilizando una nueva plantilla de variables de instancia para el objeto creado, juan, pedro y luis son objetos nuevos de la clase Cuenta y por cada variable que tiene definida Cuenta en la clase, cada uno de estos objetos podr tener un valor diferente.

IMPORTANTE. Es sumamente importante que despus de declarar un objeto para una clase (Cuenta objeto;) hagamos la creacin del objeto, es decir utilicemos la instruccin new Cuenta() para ese objeto ( objeto = new Cuenta(); ) de otra manera el objeto no ha sido creado y no se pueden utilizar los mtodos, pues Java marcar el error NullPointerException.

En el ejemplo anterior, si tenemos el mtodo setSaldo(double saldo), para modificar el saldo de la cuenta y el mtodo getSaldo(), para acceder al saldo de la cuenta, las siguientes pudieran ser instrucciones vlidas:

luis.setSaldo(2200.0); juan.setSaldo(350.50); System.out.println("Saldo de pedro = " + pedro.getSaldo()); La manera de utilizar un mtodo por un objeto es utilizando el formato objeto.mtodo(parmetros); . El siguiente es un ejemplo que muestra el uso de las variables de instancia y variables estticas. Supongamos que tenemos en la clase Punto una variable de clase llamada puntos, esta variable nos servir para saber el nmero de objetos que se han creado en la clase, la clase Punto a usar sera: public class Punto { private int x; // variable para la coordenada en x private int y; // variable para la coordenada en y private static int puntos=0;

public Punto() { // metodo para construir un objeto sin parmetros x = 0; y = 0; puntos++; }

// mtodo para construir un objeto con valores enteros public Punto(int x, int y) {

this.x = x; this.y = y; puntos++; }

// mtodo para construir un objeto con valores double public Punto(double x, double y) { this.x = (int) x; this.y = (int) y; puntos++; }

// mtodo para construir un objeto con otro objeto public Punto(Punto obj) { this.x = obj.obtenX(); this.y = obj.obtenY(); puntos++; }

// mtodo que te d el valor de la coordenada x public int obtenX() { return x; }

// mtodo que te d el valor de la coordenada y public int obtenY() { return y; } // mtodo que sirve para cambiar el valor //de la coordenada x public void cambiaX(int x) { this.x = x; // this se utiliza porque se esta utilizando (x)

// como parmetro y como // variable de instancia y esto es para que no se confunda } // mtodo que te sirve para cambiar el valor de la coordenada y public void cambiaY(int y) { this.y = y; // this se utiliza porque se esta utilizando (y) //comoparmetro y como // variable de instancia y esto es para que no se confunda Java }

// dibuja un punto public void dibujaPunto(Graphics g) { g.fillOval(x,y, 5, 5); }

// para obtener un objeto Punto en formato String public String toString() { return "(" + obtenX() + "," + obtenY() + ")"; } // para acceder a la cantidad de objetos creados public static int getPuntos() { return puntos; }

Nota que la variable puntos y el mtodo getPuntos() ambos fueron definidos como estticos, esto implica que ser un solo valor de esto para toda la clase, no un valor diferente por instancia (objeto) creada de la clase. Tambin observa como la variable puntos es incrementada en uno cada vez que se crea un objeto de la clase (en cualquier constructor). Esta clase la podemos utilizar con la aplicacin: public class AplicacionPunto1 { private static Punto a, b, c, d, e; public static void main(String[] args) { a = new Punto(); System.out.println(" Punto a = " + a.toString()); System.out.println("Puntos creados =" + Punto.getPuntos()); b = new Punto(1, 2); c = new Punto(3.0, 4.0);

System.out.println(" Punto b = " + b.toString()); System.out.println(" Punto c = " + c.toString()); System.out.println("Puntos creados =" + Punto.getPuntos()); d = new Punto(b); e = new Punto(c); System.out.println(" Punto d = " + d.toString()); System.out.println(" Punto e = " + e.toString()); System.out.println("Puntos creados =" + Punto.getPuntos()); } } El resultado que nos mostrara sera:

Observamos como es que despus de crear el elemento a y desplegar el valor de puntos creados, solo despliega 1, despus al crear b y c, se tienen 3 y al final ya se tienen los 5. Tambin es importante hacer notar que el mtodo getPuntos() fue utilizado a travs de la clase Punto, ya que es un mtodo esttico y debe ser utilizado a travs de la clase.

Lo anterior no es un requisito, pero es lo ms comn, ya que podemos tener una llamada a un mtodo esttico, pero a travs de un objeto de la clase y funciona exactamente igual, veamos ahora una aplicacin que est ligeramente cambiada, pero nos da el mismo resultado que la anterior:

public class AplicacionPunto1 { private static Punto a, b, c, d, e; public static void main(String[] args) { a = new Punto(); System.out.println(" Punto a = " + a.toString()); System.out.println("Puntos creados =" + a.getPuntos()); b = new Punto(1, 2); c = new Punto(3.0, 4.0); System.out.println(" Punto b = " + b.toString()); System.out.println(" Punto c = " + c.toString()); System.out.println("Puntos creados =" + b.getPuntos()); d = new Punto(b); e = new Punto(c); System.out.println(" Punto d = " + d.toString()); System.out.println(" Punto e = " + e.toString()); System.out.println("Puntos creados =" + e.getPuntos()); } } En esta aplicacin podemos observar como es que el mtodo esttico getPuntos() tambin puede ser usado a travs de un objeto de la clase, pero es importante recordar que es una sola variable para toda la clase. Recoleccin de Basura En Java cada vez que utilizamos la palabra new, estamos creando una nueva referencia a memoria y mas tarde cuando ya no la usemos, no necesitamos borrarla (como se hara normalmente en C++), ya que Java automticamente los borra debido a una clase llamada

GarbageCollector, la cual se encarga de estar revisando los objetos que ya son obsoletos y no se vuelven a utilizar. La recoleccin de memoria es una facilidad que permite a Java reutilizar la memoria que se tena bloqueada para el uso de algn dato primitivo (int, double, etc) o algn objeto. Gracias a esta facilidad de Java, el programador se olvida de tener que estar liberando la memoria y se enfoca ms a la mejor utilizacin de las variables y objetos de la clase

2.4.3 Herencia, Sobreescritura de mtodos , Polimorfismo y clases Abstractas


Herencia Al definir una clase, se definen las caractersticas o variables y los mtodos y conductas que pueden poseer todos los objetos que sean creados a partir de la clase. Sin embargo existen clases que requieren de una definicin ms especializada, para poder definir atributos o variables y conductas o mtodos que son especficos de los objetos de esas clases ms especializadas. Un ejemplo puede ser la clase Persona, esta clase puede tener solamente el nombre de la persona y posiblemente el sexo, con sus respectivos constructores y mtodos de acceso y modificacin de las variables de instancia, la siguiente pudiera ser una definicin de esta clase: public class Persona { private String nombre; private char sexo; public Persona() { nombre = new String(); sexo = ' '; }

public String obtenNombre() { return nombre; } public void cambiaNombre(String nombre) { this.nombre = nombre; } public char obtenSexo() { return sexo; } public void cambiaSexo(char sexo) { this.sexo = sexo; } public String toString() { return "" + nombre + " " + sexo; } } Supongamos que queremos definir la clase Alumno, en la cual obviamente tendremos que definir el nombre y sexo del alumno. Cuando realizamos esto no debemos empezar desde cero, podemos decir que la clase Alumno sera una clase que hereda de la clase Persona. Solamente que la clase Alumno ahora aadir ciertos atributos que sean solo especficos de la clase Alumno y a su vez, aadiremos los mtodos especficos de la clase Alumno, tendramos lo siguiente: public class Alumno extends Persona { private int matricula; public Alumno() { super();

matricula = 0; } public int obtenMatricula() { return matricula; } public void cambiaMatricula(int matricula) { this.matricula = matricula; } public String toString() { return "" + super.toString() + " " + matricula; } } Podemos observar en esta clase Hija (clase que hereda), que en el constructor se utiliza el mtodo super(), pero en ninguna parte est definido este mtodo, la palabra super() es utilizada para llamar al constructor vaco de la clase Padre (clase de la cual se est heredando). La palabra extends nos permite dentro de Java definir la herencia, entonces cuando decimos public class Alumno extends Persona, estamos diciendo que la clase Alumno hereda de la clase Persona. Una aplicacin que utiliza estas clases sera la siguiente: import java.io.*;

public class AplicacionHerencia1 { public static void main(String[] args) { Persona osvel = new Persona(); osvel.cambiaNombre("Osvel"); osvel.cambiaSexo('M');

System.out.println("Persona = " + osvel.toString()); Alumno israel = new Alumno(); israel.cambiaNombre("Israel"); israel.cambiaSexo('M'); israel.cambiaMatricula(12345); System.out.println("Alumno = " + israel.toString()); } } La cual muestra lo siguiente en ejecucin:

De esta manera podemos observar como la clase Alumno est heredando de la clase Persona y todos los atributos y mtodos de la Persona, estn siendo utilizados por el Alumno, ya que automticamente son de el al heredarlos. Cuando utilizamos clases y sabemos que vamos a utilizar la herencia, es entonces que utilizamos la palabra protected en lugar de private. protected es utilizada para definir que la variable o mtodo donde es usada, ser privada para cualquier clase externa, pero ser utilizada como si fuera pblica para cualquier clase hija. De esta manera la mejor manera de utilizar las clases anteriores serian: Clase Persona: public class Persona { protected String nombre; protected char sexo; public Persona() { nombre = new String();

sexo = ' '; } public String obtenNombre() { return nombre; } public void cambiaNombre(String nombre) { this.nombre = nombre; } public char obtenSexo() { return sexo; } public void cambiaSexo(char sexo) { this.sexo = sexo; } public String toString() { return "" + nombre + " " + sexo; } } Clase Alumno: public class Alumno extends Persona { protected int matricula; public Alumno() { super(); matricula = 0;

} public int obtenMatricula() { return matricula; } public void cambiaMatricula(int matricula) { this.matricula = matricula; } public String toString() { return "" + super.toString() + " " + matricula; } } Sobreescritura de Mtodos Una clase puede definir la manera en la que se har un especfico comportamiento para todos los objetos de la clase que le componen. Cuando una clase Hija quiere cambiar el comportamiento de la manera en la que est definida en la clase Padre, lo puede hacer solamente volviendo a definir el mtodo (comportamiento) dentro de la clase que hereda, a este concepto se le denomina Sobreescritura de un Mtodo. En el ejemplo anterior supongamos que en la clase Alumno se desea modificar la manera en la que se cambia el nombre, de manera que al cambiar el nombre al alumno se le anteponga las letras "al ", entonces la clase Alumno quedara de la siguiente manera: public class Alumno extends Persona { protected int matricula; public Alumno() { super(); matricula = 0; }

public int obtenMatricula() { return matricula; } public void cambiaMatricula(int matricula) { this.matricula = matricula; } public void cambiaNombre(String nombre) { this.nombre = "al " + nombre; } public String toString() { return "" + super.toString() + " " + matricula; } } La ejecucion quedaria:

Polimorfismo Se le llama polimorfismo al tener la llamada a un mtodo por diferentes objetos, esto significa que si por ejemplo tenemos el mtodo crecer() para una clase Animal, tambin tendremos el mtodo crecer() para una clase Persona, lo mismo para una clase Bacteria, esto quiere decir que la misma conducta puede ser desarrollada por diferentes objetos de diferentes clases. Java sabe a cual mtodo tomar de acuerdo a la declaracin del objeto de la clase que esta haciendo la llamada al mtodo. El polimorfismo tambin acta por tener un objeto definido como un tipo de clase y creado como un objeto de la clase hija. Por ejemplo supongamos que tenemos la clase Animal y algunas clases hijas que heredan de esta clase

como: Vaca, Cerdo y Serpiente, con la siguiente definicin: Clase Animal public class Animal { private int peso = 0; public void cambiaPeso(int peso) { this.peso = peso; } public int obtenPeso() { return peso; } public String habla() { return "Los animales no hablan"; } } Clase Vaca public class Vaca extends Animal { public String habla() { return "MUU"; } } Clase Cerdo public class Cerdo extends Animal { public String habla() { return "OINC";

} } Clase Serpiente public class Serpiente extends Animal { } Aplicacin Herencia con Polimorfismo import java.io.*;

public class AplicacionHerencia1 { public static void main(String[] args) { Vaca daisy = new Vaca(); Animal animal = new Vaca(); Serpiente serpiente = new Serpiente(); System.out.println("Daisy dice : " + daisy.habla() ); System.out.println("Animal dice : " + animal.habla() ); System.out.println("Serpiente dice : " + serpiente.habla() ); } } La ejecucin de esta aplicacin muestra lo siguiente:

En esta aplicacin observamos como vaca pertenece a la clase Vaca y el mtodo habla() dice MUU como correspondera a una vaca, luego animal es un objeto de la clase Animal (clase Padre) y al ser creado como Vaca y llamar al

mtodo habla() vemos como aunque la clase Animal tiene en el mtodo habla() el decir "Los animales no hablan", dice "MUU" porque fue creado como un objeto de la clase Vaca. Vemos tambin como el objeto serpiente que es creado como objeto de la clase Serpiente al usar el mtodo habla() dice "Los animales no hablan", ya que no reescribe el mtodo habla() y as es como esta definido en la clase Animal. Al utilizar la herencia debemos tener cuidado cuando creamos los objetos con diferentes clases que la que definimos el objeto, por ejemplo si definimos el objeto serpiente como tipo Serpiente, pero lo creamos con el constructor de Animal() nos dar el siguiente error: Entonces debemos entender que un objeto padre puede ser creado con un constructor del hijo, pero no se puede hacer lo contrario.

Clases Abstractas Existen algunas clases que no pueden definir todos los detalles de los comportamientos de todos los objetos que conforman la clase, pero si pueden saber que existe el comportamiento, entonces estas clases se definen como abstractas, ya que los mtodos que definen esas conductas sern definidos como abstractos con la palabra abstract. Una aplicacin no puede crear instancias (objetos) de una clase que esta definida como abstracta. Cuando se tiene una clase abstracta se espera que haya al menos una clase que herede de esta clase abstracta y defina todos los mtodos necesarios para la clase. Por ejemplo la clase Figura, que define los mtodos permetro y rea como abstractos, entonces podemos tener la clase Cuadrado y la clase Rectangulo que hereden de esta clase Figura pero que definan ambos mtodos. Veamos las clases implicadas en este ejemplo: Clase Figura public abstract class Figura{ protected int x, y, ancho, alto; public void cambiaX(int x) {

this.x = x; } public void cambiaY(int y) { this.y = y; } public void cambiaAncho(int ancho) { this.ancho = ancho; } public void cambiaAlto(int alto) { this.alto = alto; } public abstract float obtenPerimetro(); public abstract float obtenArea(); } Clase Cuadrado public class Cuadrado extends Figura {

public float obtenPerimetro() { return 4 * ancho; } public float obtenArea() { return ancho * ancho; } }

Clase Rectangulo public class Rectangulo extends Figura {

public float obtenPerimetro() { return 2 * ancho + 2 * alto; } public float obtenArea() { return ancho * alto; } } Aplicacion Herencia 2 public class AplicacionHerencia2 { public static void main(String[] args) { Cuadrado c = new Cuadrado(); c.cambiaAncho(10); c.cambiaAlto(10); Rectangulo r = new Rectangulo(); r.cambiaAncho(20); r.cambiaAlto(30); System.out.println("Perimetro Cuadrado = " + c.obtenPerimetro()); System.out.println("Area Cuadrado = " + c.obtenArea()); System.out.println("Perimetro Rectangulo = " + r.obtenPerimetro()); System.out.println("Area Rectangulo = " + r.obtenArea()); }

} La ejecucin de esta aplicacin muestra lo siguiente:

De esta manera observamos como al definir ambos mtodos en la clase Particular esta quita la abstraccin

Actividad 2.4
Programa: Programacin

Clave del curso en lnea:

Nombre del curso: Desarrollo de Aplicaciones con Interfaz Grfica y Manejo de Clases y Objetos

Nombre de la Unidad didctica 4: Clases y Objetos

Introduccin: En la Programacin Orientada a Objetos el manejo de las Clases y Objetos es parte de la base fundamental de este paradigma de programacin. Existen diferentes tipos de clases que no corresponde ver en este curso, pero entendiendo las clases que en este curso se cubren, ayudara a estudios mas avanzados sobre modelacin de soluciones con la Programacin Orientada a Objetos.

Objetivo: Entender la definicin de una clase, sus variables y mtodos y como se puede implementar la herencia de una Clase a otra.

Actividad 2.4.1 Clases y Objetos


Descripcin de la actividad

1. Hacer la lectura definida de Modelacin de Clases. 2. Entender los conceptos de modelacin, buscando en el Internet

3.

4.

ejemplos de definicin de clases con el uso de UML, revisando: 1. Modelacin de Clases 2. Definicin de variables de instancia y de clase 3. Comportamientos de objetos de la clase 4. Diagrama de Clases Busca en Internet herramientas para UML (define las ligas como referencia), de tal manera que conozcas al menos dos herramientas que estn en el mercado que te permitan modelar las clases utilizando UML. Escribe un documento donde expliques que es UML, para que sirve, escribas las herramientas que encontraste para diseo de clases con UML y que modeles las clases para el siguiente problema:

En un banco se manejan cuentas bancarias, que pertenecen a un cliente, cada vez que el cliente realiza un deposito o un retiro, ste debe de dar su numero de cliente para poder realizar ambas operaciones, claro en el caso de un retiro, debe mostrar alguna identificacin que compruebe que el es el poseedor de la cuenta y si hay dinero suficiente en la cuenta para el retiro, este se realiza. El banco cuenta con una serie de empleados que tienen una identificacin para cobrar su sueldo, es importante manejar los

aos que llevan trabajando, pues de esto dependen sus vacaciones (se dan 5 das por el primer ao y se aumentan 2 das por cada ao cumplido hasta llegar al mximo que son 20 das) un empleado del banco puede ser Cajero, Supervisor, Recepcionista, en fin, existen una serie de puestos que se deben cubrir para poder realizar las funciones del banco satisfactoriamente. El banco tiene contacto con algunas casas de inversin con las que sus clientes pueden tener sus inversiones, manejando diferentes niveles de riesgo, el banco identifica una clave de casa inversionista, para el banco es muy importante que ten confiable ha sido la casa inversionista, teniendo un historial de las inversiones manejadas, los porcentajes de retorno de inversin, los montos de las inversiones y los plazos, esto para poder ofrecerle al cliente una gama de inversiones que puedan realizar por medio del banco.

Actividad 2.4.2 Variables de Instancia y de Clase


Descripcin de la actividad

1. Hacer la lectura definida de Variables de Instancia y Clase. 2. Tomar la retroalimentacin de la tarea de modelacin de clases, para
ver los problemas en la modelacin de las clases.

3. Escribir las clases, definiendo las variables y los mtodos necesarios

para el problema planteado de la actividad anterior el problema fue:

En un banco se manejan cuentas bancarias, que pertenecen a un cliente, cada vez que el cliente realiza un deposito o un retiro, ste debe de dar su numero de cliente para poder realizar ambas operaciones, claro en el caso de un retiro, debe mostrar alguna identificacin que compruebe que el es el poseedor de la cuenta y si hay dinero suficiente en la cuenta para el retiro, este se realiza. El banco cuenta con una serie de empleados que tienen una identificacin para cobrar su sueldo, es importante manejar los aos que llevan trabajando, pues de esto dependen sus vacaciones (se dan 5 das por el primer ao y se aumentan 2 das por cada ao cumplido hasta llegar al mximo que son 20 das) un empleado del banco puede ser Cajero, Supervisor, Recepcionista, en fin, existen una serie de puestos que se deben cubrir para poder realizar las funciones del banco satisfactoriamente. El banco tiene contacto con algunas casas de inversin con las que sus clientes pueden tener sus inversiones, manejando diferentes niveles de riesgo, el banco identifica una clave de casa inversionista, para el banco es muy importante que ten confiable ha sido la casa inversionista, teniendo un historial de las inversiones manejadas, los porcentajes de retorno de inversin, los montos de las inversiones y los plazos, esto para poder

ofrecerle al cliente una gama de inversiones que puedan realizar por medio del banco. Utiliza al menos una variable y un mtodo de clase para cada una de las clases definidas.

Actividad 2.4.3 Herencia y Polimorfismo


Descripcin de la actividad

1. Hacer la lectura definida de Herencia, Polimorfismo y Clases Abstractas. 2. Escribir las clases Parde, Hijo y si hay necesidad abstractas, definiendo
las variables y los mtodos necesarios para siguiente problema planteado:

En un banco las cuentas pueden ser de dos tipos: cuentas de ahorro y cuentas de inversin. Un cliente puede depositar o retirar de una cuenta de ahorro, el primer deposito que hace debe ser de $1,000 invariablemente, para cada retiro el cliente pude retirar lo que desee, pero la cuenta nunca puede quedarse en ceros, al menos debe haber $500. Dependiendo de la cuenta, se maneja un porcentaje de ahorro anual, esto es definido en el momento que se crea la cuenta de ahorro, y cada mes se deben calcular los intereses debidos para incrementar el saldo de la cuenta. Para una cuenta de inversin la inversin inicial debe ser de $25,000 y en el caso de retiro el retiro no puede dejar la cuenta de inversin en ceros, debe al menos de haber $10,000 en la cuenta a menos que se cancele y se quiera retirar todo. Los empleados del banco al igual que cualquier cliente del banco poseen un nmero y nombre, el nmero nos ayuda a diferenciarlos de los dems, cada empleado tiene un puesto especfico por el que recibe un salario, antigedad y das de vacaciones al ao.

3. Escribir una aplicacin que muestre el uso de las clases anteriores,


mostrando el uso de los objetos de clase que tienen herencia, polimorfismo y abstraccin

III. DESARROLLO DE APLICACIONES CON MANEJO DE DATOS EN LA MEMORIAJAVA

You might also like