Vous êtes sur la page 1sur 45

I INTRODUCCIN A LA POO

Actualmente una de las reas ms candentes en la industria y en el mbito acadmico es la orientacin a objetos. La orientacin a objetos promete mejoras de amplio alcance en la forma de diseo, desarrollo y mantenimiento del software ofreciendo una solucin a largo plazo a los problemas y preocupaciones que han existido desde el comienzo en el desarrollo de software: la falta de portabilidad del cdigo y reusabilidad, cdigo que es difcil de modificar, ciclos de desarrollo largos y tcnicas de codificacin no intuitivas. Un lenguaje orientado a objetos ataca estos problemas. Tiene tres caractersticas bsicas: debe estar basado en objetos, basado en clases y capaz de tener herencia de clases. Muchos lenguajes cumplen uno o dos de estos puntos; muchos menos cumplen los tres. La barrera ms difcil de sortear es usualmente la herencia. El concepto de programacin orientada a objetos (OOP) no es nuevo, lenguajes clsicos como SmallTalk se basan en ella. Dado que la POO se basa en la idea natural de la existencia de un mundo lleno de objetos y que la resolucin del problema se realiza en trminos de objetos, un lenguaje se dice que est basado en objetos si soporta objetos como una caracterstica fundamental del mismo. Este tipo de programacin considera como unidad central a los objetos. Entendiendo que un objeto es una encapsulacin de un conjunto de datos y de mtodos para manipular stos. Por ejemplo, si usted ha trabajado con Microsoft Windows, una ventana Windows es un objeto. Este objeto posee unas determinadas caractersticas o datos, como son tamao, color, barras de desplazamiento, titulo, etc., y unas determinadas funciones o mtodos que permiten manipular esos datos. Por ejemplo, cuando el usuario apunta con el cursor del ratn al botn de maximizar la ventana y hace clic sobre l, se produce un mensaje dirigido a la propia ventana que provoca la ejecucin del mtodo que produce su maximizacin.

A su vez, los objetos pueden establecer una comunicacin entre ellos. Por ejemplo, un clic de ratn en un determinado botn puede originar un mensaje dirigido a la propia ventana, que, a su

vez, origine un mensaje a otra ventana que haga que sta se visualice y genere un mensaje a si misma, produciendo sobre ella la presentacin de una determinada informacin. La POO es una forma de programacin que utiliza objetos que responden a sucesos. Estos sucesos producen un flujo de mensajes entre los objetos, lo que origina cambios en el estado del objeto que recibe el mensaje. Como ejemplo, piense en el problema de que un objeto caja de texto visualice un comunicado cuando se haga clic en otro objeto botn de pulsacin. La estructura del programa bsicamente estar formada por dos objetos y un mapa de mensajes; uno de los mensajes relacionar el clic sobre el botn con el mtodo que tiene que ejecutarse para poner el comunicado en la caja de texto. As, la POO es un enfoque sumamente natural, puesto que la estructura de los programas refleja directamente la estructura del problema.

1.1 CONCEPTOS BSICOS DE LA PROGRAMACIN ORIENTADA A OBJETOS MECANISMOS BSICOS DE LA POO Los mecanismos bsicos de la programacin orientada a objetos son: objetos, mensajes, mtodos, clases y subclases.

Objetos Un programa tradicional se compone de procedimientos y de datos. Un programa orientado a objetos se compone solamente de objetos. Un objeto es una encapsulacin genrica de datos y de los mtodos para manipularlos. Dicho de otra forma, un objeto es una entidad que tiene unos atributos particulares, los datos, y unas formas de operar sobre ellos, los mtodos. Por lo tanto, un objeto contiene por una parte, operaciones que definen su comportamiento y por otra, variables,
manipuladas por esas operaciones, que definen su estado. Por ejemplo, una ventana Windows contiene operaciones como maximizar y minimizar (los mtodos) y variables como ancho y alto (los atributos).

Mensajes Cuando se ejecuta un programa orientado a objetos, los objetos estn recibiendo, interpretando y respondiendo a mensajes de otros objetos. Esto marca una clara diferencia con respecto a los elementos de datos pasivos de los sistemas tradicionales; esto es, en la POO el flujo de control funcional es reemplazado por el paso de mensajes entre objetos, lo que origina cambios en el estado del objeto. Por ejemplo, cuando un usuario enva un mensaje a un objeto denominado printer para que escriba un documento, printer puede enviar un mensaje a otro objeto denominado cola_impre para que le asigne un lugar en la cola de trabajos de impresin. A su vez, cola_impre puede enviar un mensaje a printer para requerirle informacin que posibilite dar formato al documento, y as sucesivamente. Un mensaje puede incluir informacin para clarificar una peticin. Por ejemplo, el mensaje enviado a printer puede incluir el nombre de la impresora. Finalmente, cuando un objeto recibe un mensaje, debe conocer perfectamente lo que tiene que hacer, y cuando un objeto enva un mensaje, no necesita conocer cmo se desarrolla, sino simplemente que se est desarrollando.

El conjunto de mensajes a los que un objeto puede responder se denomina protocolo.

Mtodos Un mtodo (que en otros lenguajes se denomina funcin miembro) se implementa en una clase, y determina cmo tiene que actuar el objeto cuando recibe un mensaje. En adicin, las variables asociadas o atributos permitirn almacenar informacin para dicho objeto. Un mtodo puede tambin enviar mensajes a otros objetos solicitando una accin o informacin. La descripcin o signatura de un mtodo se denomina operacin.
Objeto

mensajes

atributos Mtodos

La estructura ms interna de un objeto est oculta para otros usuarios y la nica conexin que tiene con el exterior son los mensajes. Los atributos (datos) que oculta un objeto, solamente pueden ser manipulados por los mtodos asociados al propio objeto. Segn 10 expuesto, la ejecucin de un programa orientado a objetos realizar fundamentalmente tres cosas: 1. Crear los objetos necesarios. 2. Los mensajes enviados a unos y otros objetos darn lugar a que se procese internamente la informacin. 3. Finalmente, cuando los objetos no son necesarios, sern borrados, liberndose la memoria ocupada por los mismos.

Clases Una clase se puede considerar como una plantilla para crear objetos de esa clase o tipo. Una clase describe los mtodos y atributos que definen las caractersticas comunes a todos los objetos de esa clase. Precisamente la clave de la programacin orientada a objetos est en abstraer los mtodos y atributos clase. comunes a un conjunto de objetos y encapsularlos en una

Una clase es un tipo de objeto definido por el usuario. En otras palabras, una clase equivale a

la generalizacin de un tipo especfico de objeto. Un objeto es la concrecin de una clase (algunos autores utilizan el trmino instancia, traduccin directa de instance). Por ejemplo, un objeto de la clase C sera un ejemplar O de esa clase. Entonces, para disponer de un objeto, primero se abstraen las caractersticas comunes de ese grupo de objetos, despus se delimitan esas caractersticas comunes (clase) y por ltimo se pone nombre a uno o ms ejemplares de la clase (objetos).

Aunque en las definiciones anteriores hemos utilizado el trmino objeto como sinnimo de instancia, en general, cuando hablamos de objetos nos referimos, dependiendo del contexto, a clases o a instancias. Esto es as, porque un objeto es, por una parte, un principio de organizacin, y por otra, una regin de almacenamiento que contiene una copia del elemento especificado por una clase. Desde este segundo punto de vista, los trminos objeto e instancia son sinnimos; no sucediendo lo mismo desde el primer punto de vista, por lo que no conviene popularizar el trmino instancia. Como ejemplo, consideremos el diseo de un procesador de textos utilizando la programacin orientada a objetos. Primeramente, identificamos entidades de inters, como son prrafos, cabeceras, pies, etc., las cuales pueden ser objetos potenciales. A continuacin analizamos estas entidades; por ejemplo, un prrafo normalmente est justificado, lo que quiere decir que podemos pensar en un mtodo, que podemos llamar justificacin, comn a todos los prrafos. Normalmente, en un documento, todos los prrafos se escriben con el mismo tipo de letra, entonces fuente es un atributo comn para todos los prrafos. Un prrafo est formado por su propio texto, entonces texto es un atributo que tendr un valor especfico para cada prrafo. Podemos agrupar la descripcin comn a los prrafos, formando as la clase prrafo, la cual nos permitir construir objetos de esta clase; esto es, prrafos.

Un atributo asociado con una clase representa un valor que es compartido por todos los objetos de esa clase; esto es, slo existe una copia de ese atributo (en Java este tipo de atributo es static). En cambio, un atributo asociado a un objeto de una clase representa un valor particular a ese objeto; esto es, cada objeto tiene su propio copia.

Para crear un objeto de una determinada clase simplemente hay que declarar una variable de

dicha clase. Por ejemplo, la siguiente declaracin en Java crea un objeto de la clase prrafo: el objeto prrafo1.

Parrafo parrafo1;

Si ms adelante quisiramos justificar el texto de parrafo1, tendramos que enviarle el mensaje justificacin.

Parrafo1.justificacin();

Subclases Una caracterstica primaria que define un sistema orientado a objetos es la manera en que trata las relaciones estructurales y semnticas entre clases de objetos y elimina la redundancia de almacenar el mismo atributo o mtodo ms veces de lo necesario. La idea clave es la de una clasificacin jerrquica en la que la clase hija o subclase hereda los atributos y mtodos de su clase padre. Por ejemplo, supongamos una clase persona, clase persona atributos Nombre Direccin mtodos CambiarNombre CambiarDireccin ListarDatos

Podemos considerar las clases alumno y empleado en un nivel inferior. De este modo alumno y empleado heredarn los atributos y los mtodos de su clase padre persona a los que podemos aadir los atributos y mtodos propios de la clase hija. Esto es,

clase alumno subclase de persona atributos

Estudios Curso mtodos CambiarEstudios CambiarCurso ListarDatos

La declaracin anterior supone que la clase alumno herede los atributos y mtodos de la clase persona. Entonces un objeto de la clase alumno tendra los atributos Nombre, Direccin, Estudios y Curso y los mtodos CambiarNombre, CambiarDireccn, Cambiar Estudios, CambiarCurso y ListarDatos. As mismo sucede que hemos redefinido el mtodo ListarDatos en la clase alumno para adaptarlo a las nuevas necesidades. Anlogamente podemos considerar las clases administrativo y profesor como subclases de la clase empleado. La jerarqua de clases resultante se muestra en la figura siguiente:

Persona

Alumno

Empleado

Administrativo

Profesor

CARACTERSTICAS DE LA POO

Las caractersticas fundamentales de la POO son: abstraccin, encapsulamiento, herencia y polimorfismo.

Abstraccin El trmino abstraccin significa "accin de separar mentalmente". Otra definicin podra ser: "representacin de las caractersticas esenciales de algo sin incluir antecedentes o detalles irrelevantes". Esto es, por medio de la abstraccin conseguimos no detenemos en los detalles concretos de las cosas que no interesen en cada momento, sino generalizar y centrarse en los aspectos que permitan tener una visin global del tema. Por ejemplo, el estudio de un ordenador podemos realizarlo a nivel de funcionamiento de sus circuitos electrnicos, en trminos de comente, tensin, etc., o a nivel de transferencia entre registros, centrndose as el estudio en el flujo de informacin entre las unidades que lo componen (memoria, unidad aritmtica, unidad de control, registros, etc.), sin importamos el comportamiento de los circuitos electrnicos que componen estas unidades.

Segn lo expuesto, la abstraccin consiste en la generalizacin conceptual de los atributos y propiedades de un determinado conjunto de objetos. Precisamente la clave de la programacin orientada a objetos est en abstraer los mtodos y los datos comunes a un conjunto de objetos y almacenados en una clase. Desde este nivel de abstraccin, la introduccin o eliminacin de un objeto en una determinada aplicacin supondr un trabajo mnimo o nulo.

Una abstraccin que describa un conjunto de objetos en trminos de una estructura de datos encapsulada u oculta y las operaciones sobre esa estructura, la denominaremos tipo abstracto de datos.

Encapsulamiento El encapsulamiento u ocultamiento de informacin se refiere a la prctica de incluir dentro de un objeto todo lo que necesita, de tal forma que ningn otro objeto necesite conocer nunca su estructura interna. Esta caracterstica permite ver un objeto como una caja negra, en la que se ha

metido de alguna manera toda la informacin relacionada con dicho objeto. Esto nos permitir manipular los objetos como unidades bsicas, permaneciendo oculta su estructura interna.

En Java abstraccin y la encapsulacin estn representadas por la clase. La clase es una abstraccin, porque en ella se definen las propiedades y los atributos genricos de un determinado conjunto de objetos con caractersticas comunes, y es una encapsulacin, porque constituye una caja negra que encierra tanto los datos de que constan los objetos como los mtodos que permiten manipularlos.

Herencia La herencia es el mecanismo para compartir automticamente mtodos y atributos entre clases y subclases. Por ejemplo, como vimos anteriormente, si declaramos la clase profesor como una subclase de empleado, todos los mtodos y variables asociadas con la clase empleado son automticamente heredados por la subclase profesor. Si la clase empleado contiene mtodos inapropiados para la subclase profesor, stos pueden obviarse, escribiendo nuevos mtodos y almacenndolos como parte de la clase profesor, o tambin pueden redefinirse para que respondan de forma distinta a como lo hacen en la clase base.

En Java, herencia equivale a derivacin de clases; la clase padre (empleado) recibe el nombre de clase base y la clase hija (profesor) se denomina clase derivada. Esta caracterstica de la POO est fuertemente ligada a la reutilizacin del cdigo. Esto es, el cdigo de cualquiera de las clases existentes puede ser utilizado sin ms que crear una clase derivada de ella.

El concepto de herencia conduce a una estructura jerarquizada de clases, lo cual no significa que en POO todas las relaciones entre clases deban ajustarse a una estructura jerrquica.

La herencia puede ser tambin mltiple; esto es, una clase puede derivarse de dos o ms clases base. (Java no lo contempla).

Polimorfismo

Esta caracterstica permite implementar mltiples formas de un mismo mtodo, dependiendo cada una de ellas de la clase sobre la que se realice la implementacin. Esto hace que se pueda acceder a una variedad de mtodos distintos (todos con el mismo nombre) utilizando exactamente el mismo medio de acceso.

1.2 LENGUAJES ALGORTMICOS FRENTE A LOS LENGUAJES OO.

En la historia de la programacin ha habido varias evoluciones sucesivas. Una de las principales fue la programacin estructurada, cuyo principio fundamental era dividir un programa en subprogramas ms pequeos y fciles de resolver, hasta llegar a niveles de complejidad elementales, siempre apoyndonos en la idea de qu debe hacer el programa?.
Subprogramas

Programa Principal

Funcion1 Funcion2

Este mtodo de diseo, a pesar de haber dado resultados satisfactorios, tiene limitaciones. Algunas de ellas son: No favorece la reutilizacin del cdigo. Si en la figura anterior funcion1 y funcio2 fueran idnticas, este hecho seguramente pasara desapercibido y no se compartira una nica funcin. Si dos subprogramas comparten una misma funcion fnX. Reutilizando as el cdigo que define la misma, y ms adelante queremos modificar fnX porque hay un cambio en uno de los subprogramas que la utilizan, la modificacin afectar tambin al otro subprograma, razn por la que ahora tendremos que realizar dos funciones. De lo expuesto se deduce que la programacin tradicional se desarrolla a partir de procedimientos y datos, sin delimitar qu procedimientos actan sobre qu datos. Los datos se estructuran con el fin de que puedan ser procesados por un conjunto de procedimientos diferentes, por lo que ambos, estructuras de datos y procedimientos, estn sujetos a cambios.

Procedimiento 1 Procedimiento 2 Procedimiento 3

D A T T O S

Si la programacin estructurada se interesa primero por los procedimientos y despus por los datos, el diseo orientado a objetos se interesa en primer lugar por los datos, a los que se asocian posteriormente procedimientos. Esto es, ahora la idea principal es de qu trata el programa? Entonces se organizan los desarrollos alrededor de los datos manipulados, y no alrededor de las funcionalidades. Esta forma de construir el programa resulta mucho ms eficaz puesto que en la vida de un programa los elementos ms estables son los datos.

Por lo tanto, en la programacin orientada a objetos, un programa es una coleccin de una sola entidad bsica, el objeto, el cual combina los datos con los procedimientos que actan sobre ellos. Durante la ejecucin, los objetos reciben y envan mensajes a otros objetos para ejecutar las acciones requeridas. La programacin orientada a objetos puede llevarse a cabo con lenguajes convencionales pero esto exige al programador la construccin de los mecanismos de que disponen los lenguajes orientados a objetos. Por ello, lo ms apropiado es utilizar directamente un lenguaje orientado a objetos, ya que stos soportan los mecanismos y las caractersticas que anteriormente se han expuesto, tales como objetos, clases, mtodos, mensajes, herencia, etc. La herencia constituye uno de los mecanismos ms potentes de la programacin orientada a objetos.

1.3 HISTORIA DE LOS LENGUAJES ORIENTADOS A OBJETOS

Son varios los lenguajes que han contribuido a la evolucin de los lenguajes orientados a objetos de hoy: LlSP en la dcada de los 50, Simula en la dcada de los 60 Y ms tarde Pascal, e, Modula y Ada. Si bien estos lenguajes no incluyen mecanismos para la programacin orientada a objetos, sus caractersticas sirvieron de base para la construccin de estos mecanismos; por ejemplo, Simula contribuye con el concepto de clase.

En la dcada de los 70, aparece Smalltalk como un lenguaje orientado a objetos puro, con lo que queda introducido definitivamente este tipo de programacin. En los aos siguientes, los avances experimentados en la programacin orientada a objetos fueron pocos. Es en la dcada de los 80 cuando los avances son mayores, debido fundamentalmente a la disponibilidad de extensiones orientadas a objetos en dos de los lenguajes ms populares, C y Pascal. Esto da lugar a la aparicin de los lenguajes orientados a objetos hbridos, entre los que destacan C++ y Pascal orientado a objetos. Estos lenguajes tienen una caracterstica muy importante, y es que guardan la compatibilidad con sus antecesores. En la dcada de los 90s Sun Microsystem patrocin un proyecto interno de investigacin sobre el uso de microprocesadores en los dispositivos electrnicos para uso domstico. El proyecto desemboc en el desarrollo de un lenguaje basado en C++ al que su creador, James Gosling, llam Oak debido a un roble que tena 1 la vista desde su ventana en las oficinas de Sun. Posteriormente se descubri que ya exista un lenguaje de Programacin con el mismo nombre. Cuando un grupo de gente de Sun visit una cafetera local, sugirieron el nombre Java (una variedad de caf) y as se qued. Pero el proyecto Green tuvo algunas dificultades. El mercado para los dispositivos electrnicos inteligentes de uso domstico no se desarrollaba tan rpido como Sun haba anticipado. Peor an, un contrato importante por el que Sun haba competido se le otorg a otra empresa. De manera que el proyecto corra el riesgo de cancelarse. Pero para su buena fortuna, la popularidad de World Wide Web explot en 1993 y la gente de Sun se dio cuenta inmediatamente del potencial de Java para agregar contenido dinmico y animaciones a las pginas Web. Esto trajo nueva vida al proyecto.

Sun anunci formalmente a Java en una conferencia importante que tuvo lugar en mayo de 1995. Por lo general, un evento como ste no habra generado mucha atencin. Sin embargo, Java gener un inters inmediato en la comunidad de negocios, debido al fenomenal inters en World Wide Web. En la actualidad, Java se utiliza para desarrollar aplicaciones empresariales a gran escala, para mejorar la funcionalidad de los servidores de World Wide Web (las computadoras que proporcionan el contenido que vemos en nuestros navegadores Web), para proporcionar aplicaciones para los dispositivos domsticos (como telfonos celulares, radiolocalizadores y asistentes digitales personales) y para muchos otros propsitos.

1.4 VENTAJAS DE LOS LENGUAJES ORIENTADOS A OBJETOS. Un lenguaje de programacin que soporte programacin orientada a objetos beneficia el desarrollo de software. Esto es as, porque:

Los objetos bien diseados son la base para sistemas que se construyen a partir de mdulos reutilizables, dando lugar a una mayor productividad. La reutilizacin de la clases que han sido probadas en circunstancias reales, en proyectos anteriores, dan lugar a sistemas de mayor calidad y con menos errores. La herencia hace posible definir sistemas ms fiables, ms fciles de ampliar y menos costosos de mantener. Un diseo orientado a objetos es una herramienta clave para enfrentarse a problemas complejos porque favorece el paso de pequeos a grandes sistemas. Las aplicaciones requieren escribir menos lneas de cdigo, menos sentencias de bifurcacin y por lo tanto, los mdulos son ms comprensibles. La encapsulacin ayuda a construir sistemas ms seguros. En contraste con la programacin tradicional, donde siempre existe la posibilidad de que una modificacin de un procedimiento o de una estructura de datos afecte a otros procedimientos, la programacin orientada a objetos no necesita examinar todo el cdigo fuente para ver si un cambio local afecta a otras partes.

Segn lo expuesto, las ventajas de la programacin orientada a objetos son sustanciales. Sin embargo, tambin presenta algunas desventajas que citamos a continuacin:

La ejecucin de una aplicacin orientada a objetos resulta mas lenta. Es preciso desarrollar bibliotecas de clases, lo que obliga al usuario a tomar conocimientos de las mismas. Hay costos inevitables, asociados al entrenamiento y aprendizaje. La administracin de bibliotecas de componentes es difcil y costosa.

II FUNDAMENTOS DEL LENGUAJE

2.1 INTRODUCCIN AL LENGUAJE Y A SU ENTORNO DE DESARROLLO. A travs del tiempo muchos programadores aprendieron la metodologa de programacin conocida como Programacin estructurada. En nuestro caso adems de aprender esa tcnica, nos introduciremos al aprendizaje de la metodologa de Programacin Orientada a Objetos, razn por la cual en la unidad anterior se analizaron varios conceptos que son de suma importancia para esta forma de programacin. Esta tcnica la aplicaremos utilizando el lenguaje Java. Este lenguaje se ha convertido en el lenguaje de eleccin de muchos programadores para implementar aplicaciones basadas en Internet e intranets, y para desarrollar software para dispositivos que se comunican a travs de una red. No se sorprenda si su nuevo equipo de sonido y otros dispositivos en su hogar pueden conectarse entre si mediante el uso de tecnologa Java!. Tampoco se sorprenda cuando sus dispositivos inalmbricos, como los telfonos celulares, radiolocalizadores y asistentes personales digitales (PDAs) se comuniquen a travs de la denominada Internet inalmbrica, a travs del tipo de aplicaciones de red basadas en Java. Este lenguaje ha evolucionado rpidamente en el mbito de las aplicaciones a gran escala, Ya no es un lenguaje que se utiliza simplemente para hacer que las pginas de la World Wide Web cobren vida. Java se ha convertido en el lenguaje preferido para satisfacer las necesidades de programacin de muchas organizaciones. Caractersticas de Java Gran nmero de clases preexistentes. Java incorpora en el propio lenguaje muchos aspectos que en cualquier otro lenguaje son extensiones propiedad de empresas de software o fabricantes de ordenadores (threads, ejecucin remota, componentes, seguridad, acceso a bases de datos, etc.). Sun describe el lenguaje Java como simple, orientado a objetos, distribuido, interpretado, robusto, seguro, de arquitectura neutra, portable, de altas prestaciones, multitarea y dinmico. La ejecucin de programas en Java tiene muchas posibilidades: o Ejecucin como aplicacin independiente. Es anloga a los programas desarrollados con otros lenguajes. o Ejecucin como applet, Es una aplicacin especial que se ejecuta dentro de un navegador o browser (por ejemplo Netscape Navigator o Internet Explorer) al cargar una pgina HTML desde un servidor Web. El applet se descarga desde el servidor y no requiere instalacin en la computadora donde se encuentra el browser. o Ejecucin como servlet. Es una aplicacin sin interfaz grfica que se ejecuta en un servidor de Internet.

La compaa Sun, creadora de Java, distribuye gratuitamente el Java Development Kit (JDK). Es un conjunto de programas y libreras que permiten desarrollar, compilar y ejecutar programas en

Java. Existe tambin una versin reducida del JDK, denominada JRE (Java Runtime Environment) que nicamente ejecuta cdigo Java (no permite compilar).

Nomenclatura Habitual Los nombres de Java son sensibles a las letras maysculas y minsculas. Las reglas del lenguaje respecto a los nombres de variables son flexibles. Seguir ciertas normas que facilitan la lectura y el mantenimiento del cdigo: 1. En Java es habitual utilizar nombres con minsculas, con las excepciones que se indican en los puntos siguientes. 2. Cuando un nombre consta de varias palabras es habitual poner una a continuacin de otra, poniendo con mayscula la primera letra de la palabra que sigue a otra (Ejemplos: elMayor()) 3. Los nombres de clases e interfaces comienzan siempre por mayscula (Ejemplos: Rectngulo, Empleado). 4. Los nombres de objetos, los nombres de mtodos y variables miembro, y los nombres de las variables locales de los mtodos, comienzan siempre por minscula (Ejemplos: main(), dibujar(), codUnico). 5. Los nombres de las variables finales, es decir de las constantes, se definen siempre con maysculas (Ejemplo: PI)

Estructura General de un Programa en Java Normalmente se cuenta con una clase que contiene el programa principal (aqul que contiene la funcin main()) y algunas clases de usuario que son utilizadas por el programa principal. Los archivos fuente tienen la extensin *.java, mientras que los compilados tienen la extensin *.class. Un fichero fuente (*.java) puede contener ms de una clase, pero slo una puede ser public. El nombre del fichero fuente debe coincidir con el de la clase public (con la extensin *.java). Es importante que coincidan maysculas y minsculas ya que MiClase.java y miclase.java seran clases diferentes para Java. Si la clase no es public, no es necesario que su nombre coincida con el del fichero. Una clase puede ser public o package (default), pero no private o protected. Generalmente una aplicacin est constituida por varios archivos *.class que son ubicados a travs de la definicin de la variable de sistema classpath. Es importante que se adicione la ruta del directorio \bin de la instalacin de Java al PATH del sistema. Las clases de Java se agrupan en packages, que son libreras de clases. Si las clases no se definen como pertenecientes a un package, se utiliza un package por defecto (default) que es el directorio activo.

Mediante un ejemplo muestro la estructura general de un programa bsico en Java: public class Suma { public static void main(String args[]) { int num1=10, num2=123, res; res=num1+num2; System.out.println("La suma de " + num1 + " + " + num2 + " Es:" + res); } } Programa 1. Suma.java Donde Suma es el nombre de la Clase (Coincide con el nombre del programa fuente Suma.java). En este caso indica que realizar una suma de 2 nmeros. El cdigo est insertado en un mtodo llamado main, el cual es el que se inicia al ejecutar el programa. Mas adelante explicar como se compila y ejecuta este programa.

2.2 COMENTARIOS. Los comentarios, son lneas que se utilizan para incrustar la documentacin del programa. Es decir se escriben como un medio de explicacin para indicar que hace el programa. Los comentarios no son lneas ejecutables. Existen dos formas de comentar un programa en Java. Los comentarios tradicionales (tambin conocidos como comentarios de mltiples lneas), como el que se muestra a continuacin: /* Este es un comentario tradicional. Puede dividirse en muchas lneas */ Se distribuyen en varias lneas. Este tipo de comentario comienza con el delimitador / y termina con /. Comentario de fin de lnea: Comienza con //. Solo se aplica para comentar una lnea dentro de un programa. Puede comenzar en cualquier parte de una lnea y continuar solamente hasta el final de esa lnea.

Es conveniente que todo programa comience con un comentario que explique su propsito, el autor, la fecha y la hora de su creacin.

2.3 VARIABLES Y CONSTANTES. Variables Una variable es una localidad de memoria representado por un nombre conteniendo un valor y que puede cambiar a lo largo del programa. Los nombres de variables en Java se pueden crear con mucha libertad. Pueden ser cualquier conjunto de caracteres numricos y alfanumricos, sin algunos caracteres especiales utilizados por Java como operadores o separadores ( ,.+-*/ etc.). Adems sugiero que los nombres de variables representen al tipo de informacin que almacenaran. Por ejemplo: num1, sumaEnteros, porcentajeMujeres. De acuerdo con el tipo de informacin que contienen, en Java hay dos tipos principales de variables: 1. Variables de tipos primitivos. Estn definidas mediante un valor nico que puede ser entero, de punto flotante, carcter o booleano. Java permite distinta precicin y distintos rangos de valores para estos tipos de variables (char, byte, short, int, long, float, double, boolean). Ejemplos de variables de tipos primitivos podran ser: 123, 3456754, 3.1415, 12e-09, 'A', True, etc. Ejemplo: int edad; 2. Variables referencia. Las variables referencia son referencias o nombres de una informacin ms compleja: arrays u objetos de una determinada clase. Ejemplo: Persona administrativo; Desde el punto de vista del papel o misin en el programa, las variables pueden ser: 1. Variables miembro de una clase: Se definen en una clase, fuera de cualquier mtodo; pueden ser tipos primitivos o referencias. class Persona { String nombre; int edad; char sexo; // Mtodos ....................... };

2. Variables locales: Se definen dentro de un mtodo o ms en general dentro de cualquier bloque entre llaves {}. Se crean en el interior del bloque y se destruyen al finalizar dicho bloque. Pueden ser tambin tipos primitivos o referencias. void static imprimir() { int contador, suma; }

Constantes En Java, se utiliza la palabra clave final para indicar que una variable debe comportarse como si fuese constante, significando con esto que no se permite su modificacin una vez que haya sido declarada e inicializada. Como es una constante, se le ha de proporcionar un valor en el momento en que se declare, por ejemplo: class Elipse { final float PI = 3.14159; ... } Si se intenta modificar el valor de una variable final desde el cdigo de la aplicacin, se generar un error de compilacin. Si se usa la palabra clave final con una variable o clase esttica, se pueden crear constantes de clase, haciendo de esto modo un uso altamente eficiente de la memoria, porque no se necesitaran mltiples copias de las constantes. La palabra clave final tambin se puede aplicar a mtodos, significando en este caso que los mtodos no pueden ser sobrescritos.

2.4 OBJETOS QUE PERMITEN E/S POR CONSOLA. 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 archivos 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 un archivo, en la que se trabaja con archivos de disco. Todas las operaciones de E/S en Java vienen proporcionadas por el paquete estndar de la API (del ingls Application Programming Interface - Interfaz de Programacin de Aplicaciones) de Java denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de archivos. Aqu slo trataremos la entrada/salida que se comunica con el usuario a travs de la pantalla. 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. Ejemplo: Captura el siguiente programa, complalo y ejectalo. /* Programa suma dos numeros version 1 Benedicto R. S. Diciembre 2005 */

public class Suma { public static void main(String args[]) { int num1=10, num2=123, res; res=num1+num2; System.out.println("La suma de " + num1 + " + " + num2 + " Es:" + res); } } Programa 3. Suma.Java Nota: no es necesario importar ningn paquete de Java.

En java para poder escribir se emplea el objeto System.out, pero para leer del teclado es necesario emplear System.in. Este objeto pertenece a la clase InputStream, esto significa que para leer tenemos que emplear sus mtodos, el ms bsico es read, que permite leer un carcter: char caracter = (char) System.in.read(); Pero como podemos comprobar es muy incmodo leer de letra en letra, por ello para poder leer una lnea completa emplearemos el siguiente cdigo: BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String lnea = br.readLine(); Comentando las lneas anteriores: Primero se construye el objeto br ( atraves del uso del operador new) del tipo de clase BufferedReader. Despus se declara una variable (linea) de tipo String, quien recibe la cadena de texto proporcionada por el mtodo readLine(). Sin embargo existe otra forma de lectura/escritura de datos, utilizando un paquete grfico (swing). A continuacin mostramos el ejemplo anterior pero ahora con entrada de datos. /* Programa suma dos numeros version 2 Benedicto R. S. Diciembre 2011 */ import javax.swing.JOptionPane; //Es requerido por showInputDialog() y showMessageDialog() public class Sumav2 { public static void main(String args[]) { int num1, num2, res; String entrada; entrada=JOptionPane.showInputDialog("Primer Numero:"); // Entrada grfica (String)

num1=Integer.parseInt(entrada); //Convertir un dato String a Entero entrada=JOptionPane.showInputDialog("Segundo Numero:"); num2=Integer.parseInt(entrada); res=num1+num2; //System.out.println("La suma de " + num1 + " + " + num2 + " Es:" + res); //Se sustituye por JOptionPane.showMessageDialog(null,"Resuldato"+ res); System.exit(0); //Permite el termino de un programa } } Programa 4. Sumav2.java Comentando el programa: JoptionPane es la clase que contiene los mtodos grficos que utilizamos en el ejemplo anterior, por ejemplo showInputDialog(); que nos permite capturar una cadena desde el teclado (Solo regresa ese tipo de dato). Tambin tenemos a showMessageDialog(), enva una cadena a pantalla. Cabe hacer notar que puede hacer una concatenacin de varios datos utilizando el operador +. La concatenacin puede contener datos numricos y alfanumricos. Java automticamente hace una conversin de tipos as el resultado siempre ser una cadena. Ms adelante seguiremos tratando a esta clase JOptionPane, por lo pronto estos mtodos son elementales para iniciar con nuestros primeros programas.

2.5 OPERADORES.

Operadores Aritmticos La mayora de los programas realizan clculos aritmticos. Los operadores aritmticos se sintetizan en la siguiente figura. Operacin en Java Suma Resta Multiplicacin Divisin Residuo Operador aritmtico + * / % Expresin algebraica f+7 pc bm x/y r mod s Expresin en Java f+7 pc b*m x/y r%s

El asterisco (*) indica la multiplicacin, y el signo de porcentaje (%) es el operador residuo (conocido como mdulo en algunos lenguajes), el cual describiremos en breve. Los operadores

aritmticos son operadores binarios, ya que funcionan con dos operandos. Por ejemplo, la expresin suma + valor contiene el operador binario + y los dos operandos suma y valor. La divisin de enteros produce un cociente entero: por ejemplo, la expresin 7/4 da como resultado 1, y la expresin 17/5 da como resultado 3. cualquier parte fraccionaria en una divisin de enteros simplemente se descarta (es decir, se trunca); no ocurre un redondeo. Java proporciona l operador residuo, % el cual produce el residuo despus de la divisin. La expresin x % y produce el residuo despus de que x se divide entre y. Por tanto 7%4 produce 3, y 17%5 produce 2. este operador se utiliza ms comnmente con operandos enteros, pero tambin puede usarse con otros tipos aritmticos, se considera despus para muchas aplicaciones posteriores el uso de este operador, como determinar si un nmero es mltiplo de otro. No hay un operador aritmtico para la potencia de un nmero en Java. Las expresiones aritmticas en Java deben escribirse en formato de lnea recta para facilitar la escritura de programas en la computadora. Por lo tanto, las expresiones como a dividida entre b deben escribirse como a/b, de manera que todas las constantes, variables y operadores parezcan en una lnea recta. Los parntesis se utilizan para agrupar trminos en las expresiones de Java, de la misma manera que en las expresiones algebraicas. Por ejemplo, para multiplicar a por la cantidad b + c, escribimos a*(b+c) Java aplica los operadores en expresiones aritmticas en una secuencia precisa, determinada por las siguientes reglas de procedencia de operadores, que generalmente son las mismas que las que utilizan en lgebra: 1. Las operaciones de multiplicacin, divisin y residuo se aplican primero. Si una expresin contiene varias operaciones de multiplicacin, divisin o residuo, los operadores se aplican de izquierda a derecha. Los operadores de multiplicacin, divisin y residuo tienen el mismo nivel de precedencia. 2. Las operaciones de suma y resta se aplican a continuacin. Si una expresin contiene varias operaciones de suma y resta, los operadores se aplican de izquierda a derecha. Los operadores de suma y resta tienen el mismo el nivel de precedencia. Las reglas de precedencia de operadores permiten a Java aplicar los operadores en orden correcto. Cuando decimos que los operadores se aplican de izquierda a derecha, nos referimos a la asociatividad de los operadores.

Operadores relacionales Los operadores relacionales sirven para realizar comparaciones de igualdad, desigualdad y relacin de menor o mayor. El resultado de estos operadores es siempre un valor boolean (true o false) segn se cumpla o no la relacin considerada. La siguiente Tabla muestra los operadores relacionales de Java.

Operador > < >= <= == !=

Nombre Mayor Menor Maor o igual Menor o igual Igual Diferente

Utilizacin op1 > op2 op1 < op2 op1 >= op2 op1 <= op2 op1 = = op2 op1 != op2

Resultado es true
si op1 es mayor que op2 si op1 es menor que op2

Si op1 es mayor o igual que op2 Si op1 es menor o igual que op2 Si op1 es igual a op2 Si op1 es distinto a op2

Estos operadores se utilizan con mucha frecuencia en las bifurcaciones y en los bucles.

Operadores Lgicos Los operadores lgicos se utilizan para construir expresiones lgicas, combinando valores lgicos (true y/o false) o los resultados de los operadores relacionales. La Tabla siguiente muestra los operadores lgicos de Java. Debe notarse que en ciertos casos el segundo operando no se evala porque ya no es necesario (si ambos tienen que ser true y el primero es false, ya se sabe que la condicin de que ambos sean true no se va a cumplir). Esto puede traer resultados no deseados y por eso se han aadido los operadores (&) y (|) que garantizan que los dos operandos se evalan siempre.

Operador && || ! & |

Nombre And Or Negacion And Or

Utilizacin op1 && op2 op1 || op2 ! op op1 & op2 op1 | op2

Resultado
true si op1 y op2 son true. Si op1 es false ya no se evala op2 true si op1 u op2 son true. Si op1 es true ya no se evala op2 true si op es false y false si op es true true si op1 y op2 son true. Siempre se evala op2 true si op1 u op2 son true. Siempre se evala op2

Operadores incrementales Java dispone del operador incremento (++) y decremento (--). El operador (++) incrementa en una unidad la variable a la que se aplica, mientras que (--) la reduce en una unidad. Estos operadores se pueden utilizar de dos formas: 1. Precediendo a la variable (por ejemplo: ++i). En este caso primero se incrementa la variable y luego se utiliza (ya incrementada) en la expresin en la que aparece. 2. Siguiendo a la variable (por ejemplo: i++). En este caso primero se utiliza la variable en la expresin (con el valor anterior) y luego se incrementa. En muchas ocasiones estos operadores se utilizan para incrementar una variable fuera de una expresin. En este caso ambos operadores son equivalente. Si se utilizan en una expresin ms complicada, el resultado de utilizar estos operadores en una u otra de sus formas ser diferente.

La actualizacin de contadores en bucles for es una de las aplicaciones ms frecuentes de estos operadores. Operador de concatenacin de cadenas de caracteres (+) El operador ms (+) se utiliza tambin para concatenar cadenas de caracteres. Por ejemplo, para escribir una cantidad con un rtulo y unas unidades puede utilizarse la sentencia: System.out.println("El total asciende a " + result + " unidades"); donde el operador de concatenacin se utiliza dos veces para construir la cadena de caracteres que se desea imprimir por medio del mtodo println(). La variable numrica result es convertida automticamente por Java en cadena de caracteres para poderla concatenar. En otras ocasiones se deber llamar explcitamente a un mtodo para que realice esta conversin. En ejemplos pasados tambin ya fue empleado este operador. Operador instanceof El operador instanceof permite saber si un objeto pertenece o no a una determinada clase. Es un operador binario cuya forma general es, objectName instanceof ClassName y que devuelve true o false segn el objeto pertenezca o no a la clase. Operador condicional ?: Este operador, tomado de C/C++, permite realizar bifurcaciones condicionales sencillas. Su forma general es la siguiente: booleanExpression ? res1 : res2 donde se evala booleanExpression y se devuelve res1 si el resultado es true y res2 si el resultado es false. Es el nico operador ternario (tres argumentos) de Java. Como todo operador que devuelve un valor puede ser utilizado en una expresin. Por ejemplo las sentencias: x=1 ; y=10; z = (x<y)?x+3:y+8; asignaran a z el valor 4, es decir x+3. Operadores de asignacin Los operadores de asignacin permiten asignar un valor a una variable. El operador de asignacin por excelencia es el operador igual (=). La forma general de las sentencias de asignacin con este operador es: variable = expression;

Java dispone de otros operadores de asignacin. Se trata de versiones abreviadas del operador (=) que realizan operaciones acumulativas sobre una variable. La siguiente Tabla muestra estos operadores y su equivalencia con el uso del operador igual (=).
Operador += -= *= /= %= Utilizacin op1+=op2 op1-=op2 op1*=op2 op1/=op2 op1%=op2 Expresin equivalente op1 = op1+ op2 op1 = op1- op2 op1 = op1* op2 op1 = op1/ op2 op1 = op1% op2

Precedencia de los operadores El orden en que se realizan las operaciones es fundamental para determinar el resultado de una expresin. Por ejemplo, el resultado de x/y*z depende de qu operacin (la divisin o el producto) se realice primero. La siguiente lista muestra el orden en que se ejecutan los distintos operadores en un sentencia, de mayor a menor precedencia:
. ++ ! * + < & && ?: = [] -~ / > ^ || *= () instanceof % <= | /= %= >= == !=

+=

-= ....etc.

2.6 TIPOS DE DATOS. La mayora de los programas en Java tienen datos de entrada o datos de salida. Cuando decimos que un programa imprime un resultado, generalmente queremos decir que el programa muestra ese resultado en el monitor de la computadora. Los datos pueden enviarse a otros dispositivos, como son disco e impresoras.

Tipos Primitivos de Variables Se llaman tipos primitivos de variables de Java a aquellas variables sencillas que contienen los tipos de informacin ms habituales: valores boolean, caracteres y valores numricos enteros o de punto flotante. Java dispone de ocho tipos primitivos de variables: un tipo para almacenar valores true y false (boolean); un tipo para almacenar caracteres (char), y 6 tipos para guardar valores numricos, cuatro tipos para enteros (byte, short, int y long) y dos para valores reales de punto flotante (float

y double). Los rangos y la memoria que ocupa cada uno de estos tipos se muestran en la siguiente Tabla.
Tipo boolean char byte short int long float double Descripcin 1 byte. Valores true y false 2 bytes. Unicode. Comprende el cdigo ASCII 1 byte. Valor entero entre -128 y 127 2 bytes. Valor entero entre -32768 y 32767 4 bytes. Valor entero entre -2.147.483.648 y 2.147.483.647 8 bytes. Valor entre -9.223.372.036.854.775.808 y 9.223.372.036.854.775.807 4 bytes (entre 6 y 7 cifras decimales equivalentes). De -3.402823E38 a -1.401298E-45 y de 1.401298E-45 a 3.402823E38 8 bytes (unas 15 cifras decimales equivalentes). De -1.79769313486232E308 a -4.94065645841247E-324 y de 4.94065645841247E-324 a 1.79769313486232E308

Los tipos primitivos de Java tienen algunas caractersticas importantes que se resumen a continuacin: 1. El tipo boolean no es un valor numrico: slo admite los valores true o false. El tipo bolean no se identifica con el igual o distinto de cero, como en C/C++. El resultado de la expresin lgica que aparece como condicin en un bucle o en una bifurcacin debe ser boolean. 2. El tipo char contiene caracteres en cdigo UNICODE (que incluye el cdigo ASCII), y ocupan 16 bits por carcter. Comprende los caracteres de prcticamente todos los idiomas. 3. Los tipos byte, short, int y long son nmeros enteros que pueden ser positivos o negativos, con distintos valores mximos y mnimos. A diferencia de C/C++, en Java no hay enteros unsigned. 4. Los tipos float y double son valores de punto flotante (nmeros reales) con 6-7 y 15 cifras decimales equivalentes, respectivamente. 5. Se utiliza la palabra void para indicar la ausencia de un tipo de variable determinado. 6. A diferencia de C/C++, los tipos de variables en Java estn perfectamente definidos en todas y cada una de las posibles plataformas. Por ejemplo, un int ocupa siempre la misma memoria y tiene el mismo rango de valores, en cualquier tipo de ordenador. 7. Existen extensiones de Java 1.2 para aprovechar la arquitectura de los procesadores Intel, que permiten realizar operaciones de punto flotante con una precisin extendida de 80 bits. 2.7 PALABRAS RESERVADAS. Existe una serie de palabras reservadas las cuales tienen un significado especial para Java y por lo tanto no se pueden utilizar como nombres de variables. Dichas palabras son:
abstract boolean break byte byvalue continue default do double else for goto* if implements import new null package private protected switch synchronized this threadsafe throw

case catch char class const*

extends false final finally float

instanceof int interface long native

public return short static super

transient true try void while

(*) son palabras reservadas, pero no se utilizan en la actual implementacin del lenguaje Java.

2.8 EXPRESIONES Una expresin es un conjunto variables unidos por operadores. Son rdenes que se le dan al computador para que realice una tarea determinada. Una sentencia es una expresin que acaba en punto y coma (;). Se permite incluir varias sentencias en una lnea, aunque lo habitual es utilizar una lnea para cada sentencia. Por ejemplo: i = 0; j = 5; x = i + j;// Lnea compuesta de tres sentencias Podemos formar expresiones aritmticas, relacionales y lgicas con los operadores anteriores. 2.9 ESTRUCTURAS DE CONTROL. Por lo general, en un programa las instrucciones se ejecutan una despus de otra en el orden en que estn escritas. Este proceso se conoce como ejecucin secuencial. Varias instrucciones en Java permiten al programador especificar que la siguiente instruccin a ejecutarse tal vez no sea la siguiente en secuencia. Esto se conoce como transferencia de control. Las estructuras de programacin o estructuras de control permiten tomar decisiones y realizar un proceso repetidas veces. Son los denominados bifurcaciones y bucles. En la mayora de lenguajes de programacin, este tipo de estructuras son comunes en cuanto a concepto, aunque en sintaxis vara de un lenguaje a otro. La sintaxis de Java coincide prcticamente con la utilizada C/C++, lo que hace que para un programador de C/C++ no suponga ninguna dificultad adicional. 2.9.1 Asignacin. Los operadores de asignacin permiten asignar un valor a una variable. El operador de asignacin por excelencia es el operador igual (=). La forma general de las sentencias de asignacin con este operador es: variable = expresin; Esta sentencia de asignacin fue ya analizada en el punto de operadores.

2.9.2 Seleccin. Las bifurcaciones permiten ejecutar una de entre varias acciones en funcin del valor de una expresin lgica o relacional. Se tratan de estructuras muy importantes ya que son las encargadas de controlar el flujo de ejecucin de un programa. Existen dos bifurcaciones diferentes: if y switch. Bifurcacin if Esta estructura permite ejecutar un conjunto de sentencias en funcin del valor que tenga la expresin de comparacin (se ejecuta si la expresin de comparacin tiene valor true). Tiene la forma siguiente: if (booleanExpression) { sentencias; } Las llaves {} sirven para agrupar en un bloque las sentencias que se han de ejecutar, y no son necesarias si slo hay una sentencia dentro del if.

Los programas utilizan las estructuras de seleccin para elegir entre los cursos alternativos de accin. Por ejemplo, suponga que la calificacin para aprobar un examen es de 60. La instruccin en seudocdigo Si la calificacin del estudiante es mayor o igual a 60 Imprimir "Aprobado" determina si la condicin "la calificacin del estudiante es mayor o igual a 60" es verdadera o falsa. Si la condicin es verdadera se imprime "Aprobado", y se "ejecuta" en orden la siguiente instruccin en seudocdigo. (Recuerde que el seudocdigo no es un verdadero lenguaje de programacin.). Si la condicin es falsa se ignora la instruccin Imprimir, y se ejecuta en orden la siguiente instruccin en seudocdigo. La sangra de la segunda lnea de esta estructura de seleccin es opcional, pero se recomienda ya que enfatiza la estructura inherente de los programas estructurados. La instruccin anterior if en seudocdigo puede escribirse en Java de la siguiente manera: if ( calificacionEstudiante >= 60 ) System.out.println( "Aprobado" }; Observe que el cdigo en Java corresponde en gran medida con el seudocdigo. sta es una de las propiedades que hace del seudocdigo una herramienta de programacin tan til.

Bifurcacin if else La instruccin if de seleccin simple realiza una accin indicada solamente cuando la condicin es verdade(true): de no ser as, se evita dicha accin. La instruccin if . . el se de seleccin doble permite al programador especificar una accin a realizar cuando la condicin es verdadera, y otra distinta cuando la condin es falsa. Su formato es el siguiente: if (booleanExpression) { sentencias1; } else { sentencias2; } Por ejemplo, la instruccin en seudocdigo: Si la calificacin del estudiante es mayor o igual a 60 Imprimir "Aprobado" De lo contrario Imprimir "Reprobado" imprime "Aprobado" si la calificacin del estudiante es mayor o igual a 60 e imprime "Reprobado" si la calificacin del estudiante es menor a 60. En cualquier caso, despus de que ocurre la impresin se "ejecuta" la siguiente instruccin en seudocdigo en la secuencia. La instruccin anterior if..,else en seudocdigo puede escribirse en Java como: if ( calificacin >= 60 ) System.out.println{ "Aprobado" ); el se System.out.println{ "Reprobado" ); Observe que el cuerpo de la instruccin el se tambin tiene sangra. Cualquiera que sea la convencin de sangra que usted elija, debe aplicarla consistentemente en todos sus programas. Es difcil leer programas que no obedecen las convenciones de espaciado uniformes. Bifurcacin if else if.. else Permite introducir ms de una expresin de comparacin. Si la primera condicin no se cumple, se compara la segunda y as sucesivamente. En el caso de que no se cumpla ninguna de las comparaciones se ejecutan las sentencias correspondientes al else. if (booleanExpression1) { sentencias1; } else if (booleanExpression2) { sentencias2; } else if (booleanExpression3) { sentencias3; } else {

sentencias4; } Veamos un ejemplo: if ( calificacionEstudiante >= 90 ) System.out.println( "A" ); else if ( calificacionEstudiante >= 80 System.out.println( "B" ); else if ( calificacionEstudiante >= 70 System.out .println( "C" ); else if ( calificacionEstudiante >= 60 System.out.println( "D" ); el se System.out.println( "F" ); O de esta forma (Anidada): if ( calificacionEstudiante >= 90 System.out.println( "A" ); else if ( calificacionEstudiante >= 80 ) System.out.println( "B" ); else if ( calificacionEstudiante >= 70 ) System.out.println( "C" ); else if ( calificacionEstudiante >= 60 ) System.out.println( "D" ); else System.out.println( "F" ); Si calificacionEstudiante es mayor o igual a 90, las primeras cuatro condiciones sern verdaderas, pero slo se ejecutar la instruccin en la parte if de la primera instruccin if . . . else. Despus de que se ejecute esa instruccin, se evita la parte else de la instruccin if . . . el se ms "externa". Las dos formas son idnticas, excepto por el espaciado y la sangra, que el compilador ignora. La primer forma es ms popular ya que evita usar mucha sangra hacia la derecha en el cdigo. Dicha sangra a menudo deja poco espacio en una lnea de cdigo, forzando a que las lneas se dividan y empeorando la legibilidad del programa.

Problema del else suelto El compilador de Java siempre asocia un else con el if que le precede inmediatamente, a menos que se le modifique otra cosa mediante la colocacin de llaves ( { } ). Este comportamiento puede ocasionar lo que se conoce como el problema del else suelto. Por ejemplo:

if (x > 5) if (y > 5) System.out.println( "x e y son > 5" ); else System.out.println( "x es <= 5" ); Parece indicar que si x es mayor que 5, la instruccin if anidada determina si y es tambin mayor que 5. De ser as se produce como resultado la cadena "x e y son> 5". De lo contrario, parece ser que si x no es mayor que 5, la instruccin else que es parte del if. . . else produce como resultado la cadena "x es <= 5". Cuidado! Esta instruccin if. . . else anidada no se ejecuta como parece ser. El compilador en realidad interpreta la instruccin as: if (x > 5) if ( y > 5 ) System.out.println( "x e y son> 5" ); else System.out.println( "x es <= 5" ); En donde el cuerpo del primer if es un if. . . else anidado. Esta instruccin evala si x es mayor que 5. De ser as, la ejecucin contina evaluando si y es tambin mayor que 5. Si la segunda condicin es verdadera, muestra la cadena apropiada ("x e y son> 5"). No obstante, si la segunda condicin es falsa se muestra la cadena "x es < = 5", an y cuando sabemos que x es mayor que 5. Para forzar a que la instruccin if ... else anidada se ejecute como se tena pensado originalmente, debe escribirse de la siguiente manera: if(x>5){ if(y>5) System.out.println( "x e y son> 5" ); } else System.out.println( "x es <= 5" ); Las llaves ({}) indican al compilador que la segunda instruccin if se encuentra en el cuerpo del primer if y que el else est asociado con el primer if.

Bloques La instruccin if normalmente espera slo una instruccin en su cuerpo. Para incluir varias instrucciones el cuerpo de un if (o en el cuerpo del else en una instruccin if... else), encierre las instrucciones entre llaves ({ y }). A un conjunto de instrucciones contenidas dentro de un par de llaves se le llama bloque. El siguiente ejemplo incluye un bloque en la parte else de una instruccin if . . . else:

if ( calificacion >= 60 ) System.out.println( "Aprobado" ); else { System.out.println( "Reprobado." ); System.out.println( "Debe tomar este curso otra vez." ); } En este caso, si calificacion es menor que 60, el programa ejecuta ambas instrucciones en el cuerpo else e imprime Reprobado. Debe tomar este curso otra vez. Observe las llaves que rodean a las dos instrucciones en la clusula else. Estas llaves son importantes. Sin ellas, la instruccin System.out.println ( "Debe tomar este curso otra vez." ); estara fuera del cuerpo de la parte else de la instruccin if... else y se ejecutara sin importar que la calificacin fuera menor a 60. Los errores de sintaxis (como cuando se omite una llave en un bloque del programa) los atrapa el Compilador. Un error lgico (como cuando se omiten ambas llaves en un bloque del programa) tiene su efecto en tiempo de ejecucin. Un error lgico fatal hace que un programa falle y termine antes de tiempo. Un error lgico no fatal permite que un programa siga ejecutndose, pero ste produce resultados incorrectos. Veamos un ejemplo. Vamos a desarrollar una calculadora totalmente elemental. Sin muchas caractersticas salvo de realizar operaciones aritmticas con dos operandos. Disponemos de una variable de tipo char que nos indicar que tipo de operacin se debe efectuar. Realizamos la operacin y mostramos el resultado en la pantalla.
public class MiniCalculadora { public static void main(String args[]){ int a = 1; int b = 1; char op = '/'; System.out.print("El resultado es : "); if ( op == '+' ) { System.out.println( a + b); } else if ( op == '-') { System.out.println( a - b); } else if ( op == '*') { System.out.println( a * b); } else if ( op == '/') { System.out.println( a / b); } } }

Sentencia switch Se trata de una alternativa a la bifurcacin if else ifelse cuando se compara la misma expresin con distintos valores (Mas de dos). Es una instruccin de decisin mltiple, donde el compilador prueba o busca el valor contenido en una variable contra una lista de constantes ints o chars, cuando el computador encuentra el valor de igualdad entre variable y constante, entonces ejecuta el grupo de instrucciones asociados a dicha constante, si no encuentra el valor de igualdad entre variable y constante, entonces ejecuta un grupo de instrucciones asociados a un default, aunque este ultimo es opcional. Su forma general es la siguiente: switch (expression) { case value1: sentencias1; break; case value2: sentencias2; break; case value3: sentencias3; break; case value4: sentencias4; break; case value5: sentencias5; break; case value6: sentencias6; break; [default: sentencias7;] } Las caractersticas ms relevantes de switch son las siguientes: 1. Cada sentencia case se corresponde con un nico valor de expression. No se pueden establecer rangos o condiciones sino que se debe comparar con valores concretos. 2. Los valores no comprendidos en ninguna sentencia case se pueden gestionar en default, que es opcional. 3. En ausencia de break, cuando se ejecuta una sentencia case se ejecutan tambin todas las case que van a continuacin, hasta que se llega a un break o hasta que se termina el switch. 4.

A continuacin muestro un cdigo de ejemplo de esta sentencia. int mes; ... switch (mes) { case 1: System.out.println("Enero"); break; case 2: System.out.println("Febrero"); break; case 3: System.out.println("Marzo"); break; case 4: System.out.println("Abril"); break; case 5: System.out.println("May0"); break; case 6: System.out.println("Junio"); break;

case 7: System.out.println("Julio"); break; case 8: System.out.println("Agosto"); break; case 9: System.out.println("Septiembre"); break; case 10: System.out.println("Octubre"); break; case 11: System.out.println("Noviembre"); break; case 12: System.out.println("Diciembre"); break; default: System.out.println("Error nmero de da no valido"); } En este ejemplo hay mas de dos alternativas por esta razn se debe usar switch para solucionar un programa. Tal es el caso tambin del programa que hicimos en la sentencia if, ese programa quedara as:
public class MiniCalculadora{ public static void main(String args[]){ int a = 1; int b = 1; char op = '/'; System.out.print("El resultado es : "); switch ( op ) { case '+': System.out.println( a + b ); break; case '-': System.out.println( a - b ); break; case '*': System.out.println( a * b ); break; case '/': System.out.println( a / b ); break; default: System.out.println("error" ); break; } } }

2.9.3 Iteracin. Estructura de repeticin while Una estructura de repeticin (tambin llamada estructura de ciclo) permite al programador especificar que un programa debe repetir una accin mientras cierta condicin sea verdadera. La instruccin en seudocdigo Mientras existan ms artculos en mi lista de compras Comprar el siguiente artculo y quitarlo de mi lista

describe la repeticin que ocurre durante una salida de compras. La condicin "existan ms artculos en mi lista de compras" puede ser verdadera o falsa. Si es verdadera, entonces se realiza la accin "Comprar el siguiente artculo y quitarlo de mi lista". Esta accin se realizar en forma repetida mientras la condicin sea verdadera. La instruccin (o instrucciones) contenida en la estructura de repeticin while constituye el cuerpo de esta esructura. el cual puede ser una sola instruccin o un bloque. En algn momento, la condicin ser falsa (cuando el ltimo artculo de la lista de compras sea adquirido y eliminado de la lista). En este punto la repeticin terminar y se ejecutar la primera instruccin que est despus de la estructura de repeticin. Su formato es el siguiente: while( expresionBoolean ) { sentencias; } Veamos unos ejemplos prcticos. Ejemplo 1. Ciclo while controlado por un contador. Analicemos el siguiente enunciado del problema: A una clase de diez estudiantes se les aplic un examen. Las calificaciones (enteros en el rango de 0 a 100) de este examen estn disponibles para su anlisis. Determine el promedio de la clase para este examen. // Fig. 4.7: Promedio.java // Programa del promedio de una clase mediante la repeticin controlada por contador. import javax.swing.JOptionPane; public class Promedio1 { public static void main( String args[] ) { int total; // suma de calificaciones introducidas por el usuario int Contadorcalif; // nmero de calificacin a introducir a continuacin int calificacin; // valor de la calificacin int promedio; // promedio de calificaciones String cadenaCalif; // calificacin introducida por el usuario // fase de inicializacin total = 0; // inicializar total contadorCalif = 1; // Inicializar contador del ciclo // fase de procesamiento while (contadorCalif <= 10 ) { // iterar 10 veces // pedir la entrada y leer la calificacin del usuario cadnaCalif = JOptionPane.showInputDialog(

"Escriba la calificacin como un entero: " ); // convertir cadenaCalif en int calificacin = Integer.parseInt( cadenaCalif ); total = total + calificacion; // sumar calificacin al total contadroCalif = contadorCalif + 1; // incrementa el contador } // fin de la instruccin while // fase de terminacion promedio = total / 10; // divisin de enteros // mostrar el promedio de las calificaciones del examen JOptionPane.showMessageDialog( null, "el promedio de la clase es " + promedio, "Promedio de la clase", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); // terminar el programa } // fin del main } // fin de la clase Promedio1 Programa 5. Average1.java

Ejemplo 2. Ciclo while controlado por un valor centinela Analicemos el siguiente enunciado del problema: Desarrollar un programa que calcule el promedio de una clase y que procese las calificaciones, para un nmero arbitrario de estudiantes cada vez que se ejecute. En el ejemplo anterior del promedio de una clase, el enunciado del problema especific el nmero de estudiantes (10) por adelantado. En este ejemplo no se indica cuntas calificaciones va a introducir el usuario durante la ejecucin del programa. El programa debe procesar un nmero arbitrario de calificaciones. Cmo puede el programa determinar cundo terminar de introducir calificaciones? Cmo sabr cundo calcular e imprimir el promedio de la clase? Una manera de resolver este problema es utilizar un valor especial denominado valor centinela (tambin llamado valor de seal, valor de prueba o bandera) para indicar el "fin de la introduccin de datos". E usuario escribe calificaciones hasta que se haya introducido el nmero correcto de ellas. Despus, el usuario escribe el valor centinela para indicar que no se van a introducir ms calificaciones. A la repeticin controlada por centinela a menudo se le llama repeticin indefinida, ya que el nmero de repeticiones no se conoce, antes que comience la ejecucin del ciclo. Evidentemente, el valor centinela debe elegirse de tal forma que no pueda confundirse con un valor de entrada permitido. En este caso por ejemplo el -1).

// Fig. 4.9: Promedio2.java // Programa del promedio de una clase mediante la repeticn controlada por centinela. import java.text.DecimalFormat; // clase para dar formato a los nmeros import javax.swing.JOptionPane; public class Promedio2{ public static void main( String args[] ) { int total; // suma de las calificaciones int contadorCalif; // numero de calificaciones introducidas int calificacion; // valor de la calificacion double promedio; // numero con punto decimal para el promedio String cadenaclif; // calificacion introducida por el usuario // fase de inicializacin total = 0; // inicializar el total contadorCalif = 0; // inciailizar el contador de ciclo // fase de procesamiento // obtener la primera calificacion del usuario cadenaCalif = JOptionPane.showInputDialog( Escriba la calificacion como entero o -1 para salir:" ); // convertir cadenaCalif enint calificacion = Integer.parseInt( cadenaCalif ); // iterar hasta que el usuario introduzca el valor centinela while ( calificacion != -1 ) { total = total + calificacion; // sumar calificacion al total contadorCalif = contadorCalif + 1; // incrementar el contador // obtener siguiente calificacion del usuario cadenaCalif = JOptionPane.showInputDialog( "Escriba la calificacion como entero o -1 para salir:" ); // convertir cadenaCalif en int calificacion = Integer.parseInt( cadenaCalif ); } // fin de instruccin while // fase de terminacin DecimalFormat dosDigitos = new DecimalFormat( "0.00" );

// si el usuario introdujo al menos una calificacin... if ( contadorCalif != 0 ) { // calcular el promedio de todas las calificaciones introducidas promedio = (double) total / contadorCalif; // mostrar el promedio con dos dgitos de precisin JOptionPane.showMessageDialog( null, "El promedio de la clase es " + dosDigitos.format( promedio ), "Promedio de la clase", JOptionPane.INFORMATION_MESSAGE ); } // fin de la parte if de la instruccin ifelse else // sino se introdujeron calificaciones, imprimir el mensaje apropiado JOptionPane.showMessageDialog( null, "No se introdujeron calificaciones", "Promedio de la clase", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); // terminar la aplicacin } // fin de main } // fin de la clase Promedio2 Programa 6. Average2.java

Ejemplo 3. Estructuras de control anidadas. Analicemos el siguiente enunciado del problema: Una universidad ofrece un curso que prepara a los estudiantes para el examen estatal de certificacin del estado como corredores de bienes races. El ao pasado, diez de los estudiantes que completaron este curso tomaron el examen. La universidad desea saber qu tan bien se desempearon sus estudiantes en el examen. A usted se le ha pedido que escriba un programa para sintetizar los resultados. Se le dio una lista de estos 10 estudiantes; junto a lada nombre hay un 1 escrito, si el estudiante aprob el examen, o un 2 si lo reprob. Su programa debe analizar los resultados del examen de la siguiente manera:

1. Introducir cada resultado de la prueba (es decir, un 1 o un 2). Mostrar el .mensaje "Escriba el resultado" en la pantalla, cada vez que el programa solicite otro resultado de la prueba. 2. Contar el nmero de resultados de la prueba, de cada tipo. 3. Mostrar un resumen de los resultados de la prueba, indicando el nmero de estudiantes que aprobaron y el nmero de estudiantes que reprobaron. 4. Si ms de ocho estudiantes aprobaron el examen, imprimir el mensaje "Aumentar la colegiatura".

Despus de leer el enunciado del programa cuidadosamente, hacemos las siguientes observaciones: 1. El programa debe procesar los resultados de la prueba para 1 O estudiantes. Puede usarse un ciclo controlado por contador, ya que el nmero de resultados de la prueba se conoce de antemano. 2. Cada resultado de la prueba tiene un valor numrico, ya sea 1 o 2. Cada vez que el programa lee un resultado de la prueba, debe determinar si el nmero es 1 o 2. Nosotros evaluamos un 1 en nuestro algoritmo. Si el nmero no es 1, suponemos que es un 2. 3. Dos contadores se utilizan para llevar el registro de los resultados de los exmenes: uno para contar el nmero de estudiantes que aprobaron el examen y uno para contar el nmero de estudiantes que reprobaron el examen. 4. Una vez que el programa ha procesado todos los resultados, debe decidir si ms de ocho estudiantes aprobaron el examen Veamos el programa completo: // Fig. 4.11: Analisis.java // Anlisis de los resultados de un examen import javax.swing.JOptionPane; public class Analisis { public static void main( String args[] ) { // inicializar variables en las declaraciones int aprobados = 0; // nmero de aprobados int reprobados = 0; // nmero de reprobados int contadorEstudiantes = 1; // contador de estudiantes int resultado; // resultado de un examen String entrada; String salida; // valor introducido por el usuario // cadena de salida

// procesar 10 estudiantes utilizando un ciclo controlado por contador while ( contadorEstudiantes <= 10 ) { // pedir al usuario la entrada y obtener el valor del usuario entrada = JOptionPane.showInputDialog( "Escriba el resultado (1 = aprobado, 2 = reprobado)" ); // convertir resultado en int resultado = Integer.parseInt( entrada ); // si el resultado es 1, incrementar aprobados; ifelse anidado en while if ( resultado == 1 )

aprobados = aprobados + 1; else // si el resultado no es 1; incrementar reprobados reprobados = reprobados + 1; // incrementar contadorEstudiantes para que el cilo termine eventualmente contadorEstudiantes = contadorEstudiantes + 1; } // fin de la instruccion while // fase de terminacin; preparar y mostrar resultados salida = "Aprobados: " + aprobados + "\nReprobados: " + reprobados; // determinar si aprobaron ms de 8 estudiantes if ( aprobados > 8 ) salida = salida + "\naumentar colegiatura"; JOptionPane.showMessageDialog( null, salida, "Anlisis de reultados del exmen", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); // terminar la aplicacin } // fin de main } // fin de la clase Analisis

SENTENCIA do....while(); La sentencia de iteracin do-while es de tipo posprueba. Primero realiza las acciones luego pregunta. La sintaxis es la siguiente:
do{ sentencia(s) }while ( condicin );

Observamos que es como un while pero al revs. Primeramente se ejecuta la sentencia y luego evala la condicin. Si la expresin de la condicin es verdadera vuelve a dar un ciclo. De lo contrario, termina. Esto nos garantiza que la sentencia se ejecute al menos una vez. Resulta til para los casos en donde tendremos que realizar ciertas acciones antes de verificar una condicin. Realicemos un programa que cuente la cantidad de dgitos que posee un nmero. Para ello tendremos que dividir por diez el nmero que nos han dado, hasta que el resultado se vuelva cero. Entonces recurrimos al while para realice los ciclos necesarios

public class CuentaDigitos{ public static void main(String args[]){ int nmero = 4557888; int dgitos = 0; while ( nmero > 0 ) { nmero /=10; dgitos++; } System.out.println(dgitos); } }

Qu ocurre si el nmero que nos dan es el cero? El resultado nos dar cero. Obviamente es errneo, debera devolver un dgito. Pero no entra en el ciclo debido a que de entrada no satisface la condicin. Podramos implementar una solucin.
nmero /=10; dgitos++; while ( nmero > 0 ) { nmero /=10; dgitos++; }

Realizamos primeramente las operaciones y luego entramos en el bucle si se verifica la condicin. Pero no hace falta mirar mucho para darnos cuenta que es una solucin poco elegante. En realidad quedar mejor con la sentencia do-while
public class CuentaDigitos{ public static void main(String args[]){ int nmero = 4557888; int dgitos = 0; do { nmero /=10; dgitos++; } while ( nmero > 0 ); System.out.println(dgitos); } }

SENTENCIA for Esta sentencia permite ejecutar un nmero determinado de sentencias cierto nmero de veces. Esta sentencia es comn utilizarla en programas que ya de antemano se sabe el nmero de veces que se va a ejecutar el ciclo. Su formato el siguiente: Punto y coma requerido como separador
Valor final de la variable de control para el cual la condicin es verdadera

Palabra clave for

Variable de control

Punto y coma requerida como separador

for

( int contador = 1; contador < = 10 ; contador ++) Sentencia(s); Incremento de la variable de control

Valor inicial de la variable de control

Condicin de continuidad de ciclo

La variable contador es una variable de tipo numrica entera que debe inicializarse a un valor. El ciclo for asa una sola vez por esta parte de inicializacin. La condicin permite evaluar la ejecucin del ciclo. Cuando se cumple la sentencia o sentencias se ejecutan, en caso contrario el ciclo termina. En la parte de Incremento, es donde la variable contador debe ir aumentando su valor. Para que permita que al evaluarse la condicin esta pueda convertirse en falsa. Por lo tanto si no existiera el incremento la condicin nunca seria falsa y el ciclo seria infinito. Por ejemplo. El siguiente cdigo imprime del 1 al 10.
for (int i = 1; i <= 10; i++) System.out.println("i = " + i);

Sin embargo esta forma de aplicar la sentencia for se conoce como Sentencia for ascendente (Incrementa la variable contador). Una sentencia for descendente es cuando en los programas se aplica decrementando la variable contador. Por ejemplo. El siguiente cdigo imprime del 10 al 1.
for (int i = 10; i >= 1; i--) System.out.println("i = " + i);

La sentencia for tambin soporta el operador coma (,) Por ejemplo: for( a=0,b=0; a < 7; a++,b+=2 ) Veamos otro ejemplo: Imprimir una tabla de multiplicar.
public class TablaDel3{ public static void main(String args[]){ for ( int factor = 1; factor <= 10; factor++) { System.out.println("3 x " + factor + " = " + 3*factor ); } }