You are on page 1of 62

Leccin: Conceptos de la programacin orientada a objetos Si nunca antes ha utilizado un lenguaje de programacin orientado a objetos deber aprender unos

cuantos conceptos bsicos antes de empezar a escribir cdigo. Esta leccin le servir de introduccin a los objetos, clases, herencia, interfaces y paquetes. Cada seccin se centra en cmo estos conceptos estn relacionados con el mundo real mientras que proporcionan una introduccin a la sintaxis del lenguaje de programacin Java.

Qu es un objeto?
Un objeto es una parte de software de estado y comportamiento relacionado. A menudo se utilizan los objetos software para modelar objetos del mundo real que podr encontrar en su vida diaria. Esta leccin explica cmo se representan el estado y el comportamiento dentro de un objeto, presenta el concepto de encapsulacin de datos y explica los beneficios de disear su propio software de esta manera.

Qu es una clase?
Una clase es como los planos o el prototipo del que se crean los objetos. Esta seccin define una clase que modela el estado y comportamiento de un objeto de la vida real. Enfoca intencionadamente lo bsico, mostrando como hasta una clase sencilla puede modelar limpiamente estado y comportamiento.

Qu es la herencia?
La herencia proporciona un mecanismo potente y natural para organizar y estructurar su software. Esta seccin explica cmo las clases heredan el estado y el comportamiento de sus superclases y cmo derivar una clase de otra usando la sintaxis sencilla del lenguaje de programacin Java.

Qu es una interfaz?
Una interfaz es un contrato entre una clase y el mundo exterior. Cuando una clase implementa una interfaz, se compromete a proporcionar el comportamiento publicado por esa interfaz. Esta seccin define una interfaz sencilla y explica los cambios necesarios para cualquier clase que la implemente.

Qu es un paquete?
Un paquete es un espacio de nomenclatura para organizar clases e interfaces de una manera lgica. Colocando su cdigo en paquetes permite facilitar la gestin de grandes proyectos de software. Esta seccin explica por qu esto es til y le presenta la Interfaz de Programacin de Aplicaciones (API) proporcionada por la plataforma Java.

Qu es un objeto?

Los objetos son la clave para entender la tecnologa orientada a objetos. Si mira a su alrededor ahora mismo se encontrar con muchos ejemplos de objetos del mundo real: su perro, su escritorio, su televisor, su bicicleta. Los objetos del mundo real comparten dos caractersticas: Todos tienen estado y comportamiento. Los perros tienen estado (nombre, color, raza, hambriento) y comportamiento (ladrando, buscando, meneando la cola). Las bicicletas tambin tienen un estado (marcha actual, cadencia de pedaleo actual, velocidad actual) y comportamiento (cambio de marcha, cambio de cadencia de pedaleo, frenar). Identificar el estado y el comportamiento de los objetos del mundo real es una gran ayuda para empezar a pensar en trminos de programacin orientada a objetos. Tmese un momento ahora mismo para observar los objetos del mundo real que hay a su alrededor. Para cada uno de los objetos que ve, hgase dos preguntas: En qu posibles estados puede estar este objeto? y Qu posibles comportamientos puede realizar?". Asegrese de escribir sus observaciones. Mientras lo haga, ver que los objetos del mundo real varan en complejidad, su lmpara de escritorio puede tener solo dos estados (encendido y apagado) y dos posibles comportamientos (encender y apagar), pero su radio tendr ms estados (encendido, apagado, volumen actual, emisora actual) y comportamientos (encender, apagar, subir volumen, bajar volumen, buscar y sintonizar). Tambin observar que algunos objetos, a su vez, tambin contendrn otros objetos. Todas estas observaciones del mundo real son reproducibles en el mundo de la programacin orientada a objetos. Los objetos software son conceptualmente similares a los objetos del mundo real: tambin consisten de estado y comportamiento. Un objeto almacena su estado en campos (variables en algunos lenguajes de programacin) y muestra su comportamiento a travs de mtodos (funciones en algunos lenguajes de programacin). Los mtodos operan sobre el estado interno del objeto y sirven como el mecanismo principal para la comunicacin entre objetos. La ocultacin del estado interno y requerir que toda interaccin se realice a travs de los mtodos de un objeto se conoce como encapsulacin de datos un principio fundamental de la programacin orientada a objetos. Piense, por ejemplo, en una bicicleta: Al atribuir el estado (velocidad actual, cadencia de pedaleo actual y marcha actual) y proporcionar mtodos para cambiar ese estado, el objeto mantiene el control sobre cmo se permite al mundo exterior usarlo. Por ejemplo, si la bicicleta solamente tiene 6 marchas, un mtodo que cambie de marcha podr rechazar cualquier valor que sea inferior a 1 o superior a 6. Al agrupar cdigo en objetos software individuales se obtienen ciertos beneficios: 1. Modularidad: El cdigo fuente de un objeto se puede escribir y mantener independientemente del cdigo fuente de otros objetos. Una vez creado, un objeto se puede pasar fcilmente de un lado al otro del sistema. 2. Ocultacin de informacin: Al interactuar solamente con los mtodos de un objeto los detalles de su implementacin interna permanecen ocultas al mundo exterior. 3. Reutilizacin de cdigo: Si un objeto ya existe (quizs escrito por otro desarrollador de software), puede utilizar ese objeto en su programa. Esto permite que un especialista implemente/compruebe/depure objetos especficos para una tarea, en los que luego podr confiar en su propio cdigo. 4. Conectividad y facilidad de depuracin: Si un objeto en concreto resulta ser problemtico

podr simplemente eliminarlo de su aplicacin y conectar un objeto distinto para reemplazarlo. Esto es anlogo a la reparacin de problemas mecnicos en el mundo real. Si rompe un tornillo, reemplaza el tornillo, no la mquina entera. Qu es una clase? En el mundo real a menudo se encontrar con muchos objetos individuales del mismo tipo. Puede haber miles de otras bicicletas, todas de la misma marca y modelo. Cada bicicleta ha sido fabricada a partir de los mismos planos y, por lo tanto contiene los mismos componentes. En trminos de orientacin a objetos decimos que su bicicleta es una instancia de la clase de objetos conocida como bicicletas. Una clase es el plano del que se crean objetos individuales. La siguiente clase Bicycle es una posible implementacin de una bicicleta:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class Bicycle { int cadence = 0; int speed = 0; int gear = 1; void changeCadence(int newValue) { cadence = newValue; } void changeGear(int newValue) { gear = newValue; } void speedUp(int increment) { speed = speed + increment; } void applyBrakes(int decrement) { speed = speed - decrement; } void printStates() { System.out.println("cadence:"+cadence+" speed:"+speed+" gear:"+gear); } }

La sintaxis del lenguaje Java le podr resultar nueva, pero el diseo de esta clase est basada en la anterior discusin sobre los objetos bicicleta. Los campos cadence, speed y gear representan el estado del objeto, y los mtodos (changeCadence, changeGear, speedUp etc.) definen su interaccin con el mundo exterior. Quizs se habr fijado en que la clase Bicycle no contiene un mtodo main. Eso es porque no es una aplicacin completa, solamente es el plano para bicicletas que se podra utilizar en una aplicacin. La responsibilidad de crear y usar nuevos objetos Bicycle pertenece a otra clase de su aplicacin. A continuacin hay una clase BicycleDemo que crea dos objetos Bicycle distintos e invoca sus mtodos:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright

* notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class BicycleDemo { public static void main(String[] args) { // Create two different Bicycle objects Bicycle bike1 = new Bicycle(); Bicycle bike2 = new Bicycle(); // Invoke methods on those objects bike1.changeCadence(50); bike1.speedUp(10); bike1.changeGear(2); bike1.printStates(); bike2.changeCadence(50); bike2.speedUp(10); bike2.changeGear(2); bike2.changeCadence(40); bike2.speedUp(10); bike2.changeGear(3); bike2.printStates();

} }

La salida de esta prueba muestra la cadencia de pedaleo, velocidad y marcha para las dos bicicletas:
cadence:50 speed:10 gear:2 cadence:40 speed:20 gear:3

Qu es la herencia? A menudo diferentes tipos de objetos tienen algunas cosas en comn. Por ejemplo, las bicicletas de montaa, las de carretera y los tndems todos comparten las caractersticas de las bicicletas (velocidad actual, cadencia de pedal, marcha). An as cada una de ellas tambin define caractersticas adicionales que las hacen diferentes: los tndems tienen dos asientos y dos manillares, las bicicletas de carretera tienen un manillar con cuernos, algunas bicicletas de montaa tienen ms piones que les proporcionan marchas ms cortas. La programacin orientada a objetos permite que las clases hereden estados y comportamientos de uso comn de otras clases. En este ejemplo, Bicycle se convierte en la superclase de MountainBike, RoadBike y TandemBike. En el lenguaje de programacin Java se permite que cada clase tenga una superclase directa y que cada superclase tenga el potencial para una cantidad ilimitada de subclases: La sintaxis para crear subclases en sencilla. Utilice la palabra clave extends seguida del nombre de la clase de la que desea heredar al inicio de su declaracin de clase:
class MountainBike extends Bicycle { // Los nuevos campos y mtodos que definan una bici de montaa iran aqu }

Esto proporciona a MountainBike los mismos campos y mtodos que Bicycle, pero permite a su cdigo encargarse exclusivamente de las caractersticas que la hacen nica. Esto hace que el cdigo de sus subclases sea fcil de leer. Sin embargo debe encargarse de documentar apropiadamente el estado y comportamiento que cada superclase que define, ya que ese cdigo no aparecer en el archivo fuente de cada subclase. Qu es una interfaz? Como ya ha aprendido, los objetos definen su interaccin con el mundo exterior a travs de los mtodos de que exponen. Los mtodos forman la interfaz del objeto con el mundo exterior; por ejemplo, los botones que hay en la parte frontal de su televisor forman la interfaz entre usted y el cableado elctrico al otro lado de la caja de plstico. Debe pulsar un botn para encender y apagar el televisor. En su forma ms comn, una interfaz es un grupo de mtodos relacionados con cuerpos vacos. El comportamiento de una bicicleta, si se especifica como una interfaz, podra aparecer as:
interface Bicycle { void changeCadence(int newValue);

void changeGear(int newValue); void speedUp(int increment); void applyBrakes(int decrement); }

Para implementar esta interfaz el nombre de su clase debera cambiar (a ACMEBicycle, por ejemplo), y usara la palabra clave implements en la declaracin de clase:
class ACMEBicycle implements Bicycle { // remainder of this class implemented as before }

Implementar una interfaz permite a una clase ser ms formal acerca del comportamiento que promete proporcionar. Las interfaces forman un contrato entre la clase y el mundo exterior, y este contrato se hace cumplir en el momento de la compilacin. Si su clase afirma implementar una interfaz, todos los mtodos definidos por esa interfaz deben aparecer en su cdigo fuente para que se compile con xito.

Nota: Para compilar la clase ACMEBicycle necesitar aadir la palabra public delante de los mtodos de interfaz implementados. Aprender las razones para esto ms tarde en las lecciones que traten Clases y objetos e Interfaces y herencia.

Qu es un paquete? Un paquete es un espacio de nombre que organiza un conjunto de clases e interfaces relacionadas. Puede pensar en los paquetes como algo similar a las diferentes carpetas de su ordenador. Puede tener guardadas pginas HTML en una carpeta, imgenes en otra y scripts y aplicaciones en otra distinta. Puesto que un software escrito en el lenguaje de programacin Java puede llegar a consistir de cientos o miles de clases individuales, tiene sentido que se organicen las clases e interfaces relacionadas en paquetes. La plataforma Java proporciona una enorme biblioteca de clases (un conjunto de paquetes) adecuado para usar en sus propias aplicaciones. A esta biblioteca se la conoce como la Interfaz de Programacin de Aplicaciones (Application Programming Interface en ingls) o por su abreviatura API. Sus paquetes representan las tareas ms comunes asociadas a la programacin en general. Por ejemplo, un objeto String contiene estado y comportamiento para cadenas de caracteres (character strings); un objeto File permite a un programador crear, eliminar, inspeccionar, comparar o modificar un archivo en un sistema de archivos; un objeto Socket permite la creacin y uso de sockets de red; otros objetos de interfaz grfica (GUI) controlan botones, cajas de seleccin y cualquier otra cosa relacionada con las interfaces grficas de usuario. Literalmente hay miles de clases de las que elegir. Esto le permite al programador enfocar sus esfuerzos en el diseo de la aplicacin, ms que en la infraestructura requerida para

hacerla funcionar. La Java Platform API Specification contiene el listado completo de todos los paquetes, interfaces, clases, campos y mtodos proporcionados por la Plataforma Java 6, edicin estndar (Java Platform 6, Standard Edition). Cargue esta pgina en su navegador y adala a sus marcadores o favoritos. Siendo programador se convertir en su documentacin de referencia ms importante.

Leccin: Lo bsico del lenguaje Variables


Ya ha aprendido que los objetos almacenan su estado en campos. Sin embargo el lenguaje de programacin Java tambin utiliza el trmino variable. En esta seccin se trata esta relacin, adems de los convenios y reglas de nomenclatura de variables, tipos de datos bsicos (tipos primitivos, cadenas de caracteres y arrays), valores predeterminados y literales.

Operadores
En esta seccin se describen los operadores del lenguaje de programacin Java. En primer lugar presenta los operadores de uso ms comn y al final los menos utilizados. Cada discusin incluye ejemplos de cdigo que podr compilar y ejecutar.

Expresiones, sentencias y bloques


Los operadores se utilizan para construir expresiones que computan valores; las expresiones son los componentes centrales de las sentencias; las sentencias se pueden agrupar en bloques. En esta seccin se tratan las expresiones, sentencias y bloques mediante cdigo de ejemplo que ya ha visto.

Sentencias de control de flujo


En esta seccin se describen las sentencias de control de flujo presentes en el lenguaje de programacin Java. Cubre las sentencias de toma de decisin, bucles y ramificacin que permiten que sus programas ejecuten bloques de cdigo especficos de forma condicional. Variables Ya hemos visto en la leccin anterior que un objeto almacena su estado en campos. int cadence = 0; int speed = 0; int gear = 1; La leccin Qu es un objeto? le present el concepto de campos, pero probablemente siga teniendo alguna pregunta, como por ejemplo: Cules son los convenios y reglas para nombrar un campo? Adems de int, qu otros tipos de dato hay? Los campos

deben ser inicializados cuando se declaran? Se asigna un valor predeterminado a los campos si no se inicializan explcitamente? En esta leccin exploraremos las respuestas a este tipo de preguntas, pero antes de hacerlo hay una serie de distinciones tcnicas que debera conocer. En el lenguaje de programacin Java se usan los dos trminos campo y variable; esto es una fuente habitual de confusin entre desarrolladores noveles ya que ambos, a menudo, parecen referirse a la misma cosa. El lenguaje de programacin Java define los siguientes tipos de variables: Variables de instancia (Campos no estticos) Tcnicamente, los objetos almacenan sus estados individuales en campos no estticos, es decir, campos declarados sin la palabra clave static. Los campos no estticos tambin son conocidos como variables de instancia porque sus valores son nicos para cada instancia de una clase (en otras palabras, para cada objeto); el valor de currentSpeed de una bicicleta es independiente del valor de currentSpeed de otra. Variables de clase (campos estticos) Una variable de clase es cualquier campo declarado con el modificador static; esto le indica al compilador que existe solamente una copia de esta variable, independientemente de cuntas veces se haya instanciado esa clase. Un campo que defina la cantidad de marchas de un tipo en concreto de bicicletas se podra marcar como static ya que se aplicar la misma cantidad de marchas a todas las instancias. El cdigo static int numGears = 6; crear un campo esttico de ese tipo. Adems, se podra aadir la palabra clave final para indicar que la cantidad de marchas nunca cambiar. Variables locales De un modo similar a como un objeto almacena su estado en campos un mtodo a menudo almacenar su estado en variables locales. La sintaxis para declarar una variable local es similar a la declaracin de un campo (por ejemplo, int count = 0;). No hay una palabra clave especial que defina una variable como local, esa designacin viene enteramente por el lugar en el que se declare que es entre las llaves de apertura y cierre de un mtodo. Como tales, las variables locales son solamente visibles en el mtodo en el que son declaradas; no son accesibles desde el resto de la clase. Parmetros Ya hemos visto ejemplos de parmetros, tanto en la clase Bicycle como en el mtodo main de la aplicacin Hola mundo. Recuerde que la estructura del mtodo main es public static void main(String[] args). Aqu la variable args es el parmetro de este mtodo. Lo que debe recordar es que los parmetros siempre se clasifican como variables, no como campos. Esto tambin se aplica a otras construcciones que aceptan parmetros (como los constructores y gestores de excepciones) sobre las que aprender ms adelante en los tutoriales. Dicho esto, en lo que queda de este tutorial se utilizan las siguientes normas al hablar de campos y variables. Si hablamos de campos en general (excepto variables locales y parmetros) simplemente diremos campos. Si hablamos de todo lo anterior utilizaremos la palabra variables. Si el contexto necesita de una distincin clara, utilizaremos trminos especficos (campo esttico, variable local, etc.) segn sea apropiado. En ocasiones tambin podr ver el trmino miembro. A los campos, mtodos y tipos anidados de un tipo se les denomina colectivamente sus miembros.

Nomenclatura
Cada lenguaje de programacin tiene su propio conjunto de convenios y reglas para los tipos de nombres que se permiten utilizar, el lenguaje Java no es diferente. Las reglas y convenios para la nomenclatura de variables se pueden resumir como sigue: Los nombres de variables distinguen entre maysculas y minsculas. El nombre de una variable puede ser cualquier identificador vlido una secuencia de longitud ilimitada de letras y dgitos Unicode, que empiece con una letra, el smbolo del dlar $ o el guin bajo _. Sin embargo, por convenio siempre se utilizan los nombres de variable con una letra, no con $ o _. Adems, el smbolo del dlarm por convenio, no se utiliza nunca. Se encontrar con algn caso en el que nombres generados automticamente contegnasn el smbolo del dlar, pero sus propias variables deberan evitarlo. Este convenio tambin se aplica al guin bajo, aunque es tcnicamente vlido empezar el nombre de una variable con _, esta prctica se desaconseja. No se permite el espacio en blanco. Los siguientes caracteres pueden ser letras, dgitos, signos del dlar o guiones bajos. Tambin se aplican algunos convenios (y el sentido comn) a esta regla. Al elegir un nombre para sus variables, utilice palabras completas en vez de abreviaturas crpticas. As su cdigo ser ms fcil de leer y comprender. En muchos casos tambin har que su cdigo se autodocumente; por ejemplo, campos con el nombre cadencia, velocidad y marcha son mucho ms intuitivos que sus versiones abreviadas: c, v y m. Tenga tambin en mente que el nombre que elija no puede ser una palabra clave o reservada. Si el nombre que elije consiste de una sola palabra, escrbala completamente en minsculas. Si consiste de ms de una palabra, escriba la primera letra de cada palabra en maysculas. Los nombres numeroMarchas y marchaActual som ejemplos de este convenio. Si su variable almacena un valor constante, como static final int NUM_MARCHAS = 6, el convenio cambia ligeramente, aconsejando escribirla toda en maysculas, separando las palabras con el guin bajo. Por convenio el guin bajo no se utiliza en ningn otro sitio. Tipos de datos primitivos El lenguaje de programacin es un lenguaje fuertemente tipado, esto significa que todas las variables deben ser declaradas antes de ser utilizadas. Esto implica establecer el tipo y el nombre de la variable, como ya hemos visto:
int gear = 1;

Al hacer esto le indicamos al programa que existe una variable llamada gear, que almacena datos numricos y que tiene un valor inicial de 1. El tipo de dato de una variable determina los valores que puede contener adems de las operaciones que se puede realizar sobre ella. El lenguaje de programacin Java incluye siete otros tipos de datos primitivos adems de int. Un tipo primitivo est predefinido por el lenguaje y se nombra con una palabra clave reservada. Los valores primitivos no comparten estado con otros valores primitivos. Los ocho tipos de datos primitivos incluidos en el lenguaje de programacin Java son: byte: El tipo de dato byte es un entero de 8 bits complemento a dos. Su valor mnimo es -128 y el mximo 127 (inclusive). El tipo de datos byte se puede

utilizar para ahorrar memoria en grandes arrays, donde el ahorro de memoria realmente importa. Tambin se pueden utilizar en lugar de int donde sus lmites ayudan a aclarar el cdigo, el hecho de que el rango de una variable es limitado puede servir como una forma de documentacin. short: El tipo de dato short es un entero de 16 bits complemento a dos. Su valor mnimo es -32,768 y el mximo 32,767 (inclusive). Se aplican las mismas directrices que con byte: puede utilizar short para ahorrar memoria en grandes arrays, en situaciones en las que el ahorro realmente importa. int: El tipo de dato int es un entero de 32 bits complemento a dos. Su valor mnimo es -2,147,483,648 y el mximo 2,147,483,647 (inclusive). Generalmente este tipo es la eleccin predeterminada para valores enteros a no ser que haya una razn (como las mencionadas anteriormente) para elegir otro. Este tipo de dato normalmente ser lo suficiente grande para los nmeros que su program vaya a utilizar pero si necesita un rango ms amplio, utilice long. long: El tipo de dato long es un entero de 64 bits complemento a dos. Su valor mnimo es -9,223,372,036,854,775,808 y el mximo 9,223,372,036,854,775,807 (inclusive). Utilice este tipo de dato cuando necesite un rango de valores ms amplio que el proporcionado por int. float: El tipo de dato float es un dato en coma flotante IEEE 754 de 32 bits y precisin simple. Su rango de valores est fuera del mbito de este tema, pero se detalla en la seccin 4.2.3 de la Especificacin del lenguaje Java. Al igual que con byte y short, se recomienda usar un float (en vez de un double) si necesita ahorrar memoria en grandes array de nmeros en coma flotante. Este tipo de dato nunca debera ser usado para valores precisos como, por ejemplo, divisas. Para esto debera usarla clase java.math.BigDecimal. Nmeros y cadenas trata BigDecimal y otras clases tiles proporcionadas por la plataforma Java. double: El tipo de dato double es un dato en coma flotante IEEE 754 de 64 bits y precisin doble. Su rango de valores est fuera del mbito de este tema, pero se detalla en la seccin 4.2.3 de la Especificacin del lenguaje Java. Normalmente este tipo de dato es la eleccin predeterminada para valores decimales. Como ya se ha mencionado, este tipo de dato no se debera utilizar para valores precisos como, por ejemplo, divisas. boolean: El tipo de dato boolean solamente tiene dos valores posibles: true (verdadero) y false (falso). Utilice este tipo de datos como conmutadores para la evaluacin de condiciones verdadero/falso. Este tipo de dato representa un bit de informacin, pero su tamao es algo que no est definido con precisin. char: El tipo de dato char es un solo carcter Unicode de 16 bits. Tiene un valor mnimo de '\u0000' (o 0) y un mximo de '\uffff' (o 65.535 inclusive).

Adems de los ocho tipos de dato primitivos enumerados ms arriba, el lenguaje de programacin Java tambin proporciona soporte especial para cadenas de caracteres mediante la clase java.lang.String. Al encerrar una cadena de caracters entre comillas dobles automticamente se crear un nuevo objeto de tipo String, por ejemplo, String s = "esto es una cadena";. Los objetos String son inmutables, lo que significa que, una vez creados, sus valores no se pueden cambiar. La clase String tcnicamente no es un tipo de dato primitivo, pero si tenemos en cuenta el trato especial que le da el lenguaje, probablemente tender a pensar en ella como tal. Aprender ms acerca de la clase String en Objetos de datos simples

Valores predeterminados
No siempre es necesario asignar un valor cuando se declara un campo. El compilador fija un valor predeterminado razonable para los campos que se declaran pero no son inicializados. En general, este valor ser cero o null, dependiendo del tipo de dato. Sin embargo, fiarse de estos valores predeterminados se considera una mala costumbre en la programacin. La siguiente tabla resume los valores predeterminados para los tipos de dato que hemos mencionado anteriormente. Tipo de dato byte short int long float double char String (o cualquier objeto) Valor predeterminado (para campos) 0 0 0 0L 0.0f 0.0d '\u0000' null

boolean false Las variables locales son ligeramente distintas, el compilador nunca asigna un valor predeterminado a una variable local sin asignar. Si no puede inicializar su variable local donde se declara, asegrese de asignarle un valor antes de intentar usarla. Acceder a una variable local sin inicializar resutlar en un error a la hora de compilar.

Literales
Se habr fijado en que la palabra clave new no se utiliza para inicializar una variable de tipo primitivo. Los tipos primitivos son tipos de datos especiales incrustados dentro del lenguaje, no son objetos creados de una clase. Un literal es la representacin en cdigo fuente de un valor fijo, los literales se represenan directamente en su cdigo sin necesidad de computacin. Es posible asignar un literal a una variable de un tipo primitivo, como se muestra a continuacin:
boolean result = true; char capitalC = 'C'; byte b = 100; short s = 10000; int i = 100000;

Los tipos enteros (byte, short, int y long) se pueden expresar com los sistemas numricos decimal, octal o hexadecimal. El decimal es el sistema numrico que utiliza todos los das, est basado en 10 dgitos, numerados desde el 0 hasta el 9. El sistema octal es de base 8, que consiste de los dgitos entre el 0 y el 7. El sistema hexadecimal es de base 16, cuyos dgitos son los nmeros entre el 0 y el 9 y las letras entre la A y la F. El sistema decimal ser probablemente el nico ssitema numrcio que utilizar en la programacin de uso general. Sin embargo, si necesita octal o hexadecimal, el siguiente

ejemplo muestra la sintaxis correcta. El prefijo 0 indica octal, mientras que 0x indica hexadecimal.
int decVal = 26; // El nmero 26 en decimal int octVal = 032; // El nmero 26 en octal int hexVal = 0x1a; // El nmero 26 en hexadecimal

Los tipos de coma flotante (float y double) tambin se pueden expresar con E o e (para la notacin cientfica), F o f (literal float de 32 bits) y D o d (literal double de 64 bits, este es el predeterminado y se omite por convenio).
double d1 = 123.4; double d2 = 1.234e2; // el mismo valor que d1 pero en notacin cientfica float f1 = 123.4f;

Los literales de tipo char y String pueden contener cualquier carcter Unicode (UTF16). Si su editor de texto y su sistema lo permiten puede utilizar estos caracteres directamente en su cdigo. Si no, puede utilizar el escape Unicode como, por ejemplo, '\u0108' (C mayscula con circunflejo) o "S\u00ED se\u00F1or" (S Seor en espaol). Utilice siempe 'comillas simples' para literales char "comillas dobles" para literales String. Las secuencias de escape Unicode se puede utilizar en otros sitios de un programa (nombres de campo, por ejemplo), no solamente en literales char o String. El lenguaje de programacin Java tambien contempla algunas secuencias de escape especiales para literales char y String: \b (retroceso de carcter), \t (tabulacin), \n (cambio de lnea), \f (salto de pgina), \r (retorno de carro), \" (comillas dobles), \' (comillas simples) y \\ (barra invertida). Tambin est el literal especial null que se puede utilizar como valor para cualquier tipo de referencia. Se puede asignar null a cualquier variable excepto variables de tipo primitivo. Se puede hacer poco con un valor null adems de comprobar su presencia. Por lo tanto null se utiliza a menudo como marcador en un programa para indicar que un objeto no est disponible. Finalmente tambin hay un tipo especial de literal llamado literal de clase que se forma al tomar el nombre del tipo y aadir .class, por ejemplo, String.class. Esto se refiere al objeto (de tipo Class) que representa al tipo en s mismo.

Arrays
Un array es un objeto contenedor que almacena un nmero fijo de valores de un solo tipo. La longitud de un array se establece cuando ste se crea. Despus de su creacin su longitud es fija. Ya ha visto un ejemplo de un array en el mtodo main de la aplicacin Hola mundo. Esta seccin trata los arrays con ms detalle.

A cada unidad del array se le llama element y a cada elemento se accede por su ndice numrico.

Como se muestra en la ilustracin anterior, la numeracin empieza por 0. Al noveno elemento, por ejemplo, se acceder con el ndice 8. El siguiente programa, ArrayDemo, crea un array de enteros, lo rellena con algunos valores e imprime cada valor a la salida estndar.
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class ArrayDemo { public static void main(String[] args) { int[] anArray; // declara un array de enteros anArray = new int[10]; enteros anArray[0] anArray[1] anArray[2] anArray[3] anArray[4] anArray[5] anArray[6] anArray[7] anArray[8] anArray[9] = = = = = = = = = = 100; // inicializa el primer elemento 200; // inicializa el segundo elemento 300; // etc. 400; 500; 600; 700; 800; 900; 1000; // reserva memoria para 10

System.out.println("Elemento anArray[0]); System.out.println("Elemento anArray[1]); System.out.println("Elemento anArray[2]); System.out.println("Elemento anArray[3]); System.out.println("Elemento anArray[4]); System.out.println("Elemento anArray[5]); System.out.println("Elemento anArray[6]); System.out.println("Elemento anArray[7]); System.out.println("Elemento anArray[8]); System.out.println("Elemento anArray[9]); } }

en el ndice 0: " + en el ndice 1: " + en el ndice 2: " + en el ndice 3: " + en el ndice 4: " + en el ndice 5: " + en el ndice 6: " + en el ndice 7: " + en el ndice 8: " + en el ndice 9: " +

La salida de este programa es:


Elemento Elemento Elemento Elemento Elemento Elemento Elemento Elemento Elemento Elemento en en en en en en en en en en el el el el el el el el el el ndice ndice ndice ndice ndice ndice ndice ndice ndice ndice 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 100 200 300 400 500 600 700 800 900 1000

En una situacin de programacin del mundo real probablemente habra utilizado una de las estructuras de bucle para recorrer cada elemento del array en vez de escribir cada lnea como en el ejemplo. An as, este ejemplo ilustra claramente la sintaxis del array. Aprender acerca de las diferentes estructuras de bucle (for, while y do-while) en la seccin Sentencias de control de flujo.

Declarar una variable para que se refiera a un array


El programa anterior declara anArray con el siguiente cdigo:
int[] anArray; // declara un array de enteros

Igual que las declaraciones de variables de otros tipos, la declaracin de un array tiene dos componentes: el tipo del array y su nombre. El tipo del array se escribe tipo[], donde tipo es el tipo de dato de los elementos contenidos, los corchetes cuadrados son smbolos especiales que indican que esta variable contiene un array. El tamao del array no es parte de su tipo (por lo que los corchetes estn vacos). El nombre de un array puede ser cualquier cosa, siempre que cumpla con las reglas y convenios que ya se han tratdo en la seccin nomenclatura. Igual que con las variables de otros tipos, la declaracin realmente no crea un array solamente se dice al compilador que esta variable va a contener un array del tipo indicado. Puede declarar arrays de otros tipo de forma similar:

byte[] unArrayDeBytes; short[] unArrayDeShorts; long[] unArrayDeLongs; float[] unArrayDeFloats; double[] unArrayDeDoubles; boolean[] unArrayDeBooleans; char[] unArrayDeChars; String[] unArrayDeStrings;

Tambin puede colocar los corchetes cuadrados despus del nombre del array:
float unArrayDeFloats[]; // esta forma est desaconsejada

Sin embargo, por convenio se desaconseja esta forma, los corchetes identifican el tipo del array y deberan aparecer en la designacin del tipo.

Crear, inicializar y acceder a un array


Una de las formas de crear un array es con el operador new. La siguiente sentencia del programa ArrayDemo reserva un array con suficiente memoria para diez elementos enteros y asigna el array a la variable anArray.
anArray = new int[10]; // crea un array de enteros

Si faltara esta sentencia, el compilador mostrara un error como el siguiente y la compilacin fallara:
ArrayDemo.java:4: Variable anArray may not have been initialized.

Las siguientes lneas asignan valores a cada uno de los elementos del array:
anArray[0] = 100; // inicializa el primer elemento anArray[1] = 200; // inicializa el segundo elemento anArray[2] = 300; // etc.

A los elementos del array se accede por su ndice numrico:


System.out.println("Elemento 1 en el ndice 0: " + anArray[0]); System.out.println("Elemento 2 en el ndice 1: " + anArray[1]); System.out.println("Elemento 3 en el ndice 2: " + anArray[2]);

Tambin puede utilizar la sintaxis abreviada para crear e inicializar un array:


int[] anArray = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};

En esta caso la longitud del array viene determinada por la cantidad de valores proporcionados entre { y }. Tambin puede declarar un array de arrays (conocido como un array multidimensional) utilizando dos o ms conjuntos de corchetes cuadrados, por ejemplo String[][] nombres. Por lo tanto, a cada elemento se acceder por un nmero correspondiente de valores de ndice. En el lenguaje de programacin Java un array multidimensional es simplemente un array cuyos componentes son, tambin, arrays. Esto es distinto de los arrays en C o Fortran. Esto trae como consecuencia que las filas pueden variar en longitud, como se muestra en el siguiente programa MultiDimArrayDemo:

class MultiDimArrayDemo { public static void main(String[] args) { String[][] names = {{"Mr. ", "Mrs. ", "Ms. "}, {"Smith", "Jones"}}; System.out.println(names[0][0] + names[1][0]); //Mr. Smith System.out.println(names[0][2] + names[1][1]); //Ms. Jones } }

La salida de este programa es:


Mr. Smith Ms. Jones

Puede utilizar la propiedad length para determinar la longitud de un array. El cdigo


System.out.println(anArray.length);

mostrar el tamao del array en la salida estndar.

Copiar arrays
La clase System contiene el mtodo arraycopy que se puede utilizar para copiar eficientemente un array a otro:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

Los dos argumentos de tipo Object indican el array desde el que copiar y el array hacia el que copiar. Los tres argumentos de tipo int indican la posicin de inicio del array de origen, la posicin de inicio del array de destino y la cantidad de elementos que se copiarn. El siguiente programa, ArrayCopyDemo, declara un array de elementos de tipo char que componen la palabra decaffeinated. Utiliza arraycopy para copiar una subsecuencia de componentes del array en un segundo array:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived

* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class ArrayCopyDemo { public static void main(String[] args) { char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' }; char[] copyTo = new char[7]; System.arraycopy(copyFrom, 2, copyTo, 0, 7); System.out.println(new String(copyTo));

} }

La salida de este programa es:


caffein

Resumen de variables El lenguaje de programacin Java utiliza tanto campo como variable como parte de su terminologa. Las variables de instancia (campos no estticos) son nicas para cada instancia de una clase. Las variables de clase (campos estticos) son campos declarados con el modificador static; hay exactamente una copia de una variable de clase, independientemente de cuntas veces se haya instanciado sta. Las variables locales almacenan un estado temporal dentro de un mtodo. Los parmetros son variables que proporcionan informacin extra a un mtodo; tanto las variables locales como los parmetros siempre se clasifican como variables (no como campos). Existen reglas y convenios que se deben seguir a la hora de nombrar campos y variables. Los ocho tipos de datos primitivos son: byte, short, int, long, float, double, boolean y char. La clase java.lang.String representa cadenas de caracteres. El compilador asignar un valor predeterminado razonable a los campos de los tipos mendionados, nunca se asigna un valor predeterminado a una variable local. Un literal es la representacin en cdigo fuente de un valor fijo. Un array es un objeto contenedor que almacena un nmero fijo de valores de un solo tipo. La longitud de un array se establece cuando ste se crea. Despus de su creacin su longitud es fija.

Preguntas
1. El trmino variable de instancia es otra forma de llamar a ___.

2. 3. 4. 5.

El trmino variable de clase es otra forma de llamar a ___. Una variable local almacena un estado temporal, se declara dentro de un(a) ___. Una variable declarada dentro de los parntesis de un mtodo se llama ____. Cules son los ocho tipos de datos primitivos includos dentro del lenguaje de programacin Java? 6. Las cadenas de caracteres se representan mediante la clase ___. 7. Un ___ es un objeto contenedor que almacena un nmero fijo de valores de un solo tipo.

Ejercicios
1. Cree un pequeo programa que define varios campos. Intente crear algunos nombres de campo no permitidos y vea qu tipo de error produce el compilador. Utilice los convenios y reglas de nomenclatura como gua. 2. Intente dejar sin inicializar los campos del programa que ha creado en el ejercicio 1 e imprima sus valores. Intente lo mismo con una variable local y vea qu tipo de errores de compilacin puede producir. Si se familiariza con los errores comunes de compilacin le ser ms fcil reconocer erratas en su cdigo. Respuestas a preguntas y ejercicios: Variables

Respuestas a preguntas
1. El trmino variable de instancia es otra forma de llamar a un campo no esttico. 2. El trmino variable de clase es otra forma de llamar a un campo esttico. 3. Una variable local almacena un estado temporal, se declara dentro de un mtodo. 4. Una variable declarada dentro de los parntesis de un mtodo se llama parmetro. 5. Cules son los ocho tipos de datos primitivos includos dentro del lenguaje de programacin Java? byte, short, int, long, float, double, boolean, char 6. Las cadenas de caracteres se representan mediante la clase java.lang.String. 7. Un array es un objeto contenedor que almacena un nmero fijo de valores de un solo tipo.

Respuesta a ejercicios
1. Cree un pequeo programa que define varios campos. Intente crear algunos nombres de campo no permitidos y vea qu tipo de error produce el compilador. Utilice los convenios y reglas de nomenclatura como gua. Aqu no hay una sola respuesta correcta. Sus resultados variarn segn su cdigo. 2. Intente dejar sin inicializar los campos del programa que ha creado en el ejercicio 1 e imprima sus valores. Intente lo mismo con una variable

local y vea qu tipo de errores de compilacin puede producir. Si se familiariza con los errores comunes de compilacin le ser ms fcil reconocer erratas en su cdigo. Igualmente, para este ejercicio no hay una sola respuesta correcta. Sus resultados variarn segn su cdigo. Operadores Ahora que ha aprendido cmo declarar e inicializar variables, probablemente querr saber cmo hacer algo con ellas. Una buena forma de empezar es conociendo los operadores del lenguaje de programacin Java. Los operadores son smbolos especiales que realizan operaciones concretas sobre uno, dos o tres operandos y devuelven un resultado. A medida que exploremos los operadores del lenguaje Java le ser de utilidad conocer con antelacin cules de ellos poseen la precedencia ms alta. Los operadores de la siguiente tabla se muestran por orden de precedencia. Cunto ms alto est el operador en la tabla, mayor es su precedencia. Los operadores con mayor precedencia se evalan antes que los que posean una menor. Los operadores que estn en la misma lnea tienen igual precedencia. Cuando en la misma expresin aparecen operadores de igual precedencia, debe haber una regla que indique cul se evala primero. Todos los operadores binarios, excepto los de asignacin, se evalan de izquierda a derecha; los operadores de asignacin se evalan de derecha a izquierda. Precedencia de operadores Operadores postfix unarios multiplicativos aditivos de movimiento (shift) relacionales de igualdad AND a nivel de bit (bitwise AND) OR exclusivo a nivel de bit (bitwise exclusive OR) OR inclusivo a nivel de bit (bitwise inclusive OR) AND lgico OR lgico ternarios expr++ expr-++expr --expr +expr -expr ~ ! * / % + << >> >>> < > <= >= instanceof == != & ^ | && || ?: Precedencia

de asignacin

= += -= *= /= %= &= ^= |= <<= >>= >>>=

En la programacin de propsito general se utilizan algunos operadores con ms frecuencia que otros; por ejemplo, el operador de asignacin = es mucho ms corriente que el operador de movimiento a la derecha sin signo >>>. Teniendo esto en mente, los siguientes temas se centrarn en los operadores que probablemente utilizar de forma habitual y terminar tratando los que son menos comunes. Cada tema se acompaa con cdigo de ejemplo que podr compilar y ejecutar. Al estudiar los resultados reforzar lo que acaba de aprender. Operadores de asignacin, aritmticos y unarios El operador de asignacin sencillo Uno de los operadores ms habituales que se encontrar es el operador de asignacin sencillo =. Ya lo hemos visto en la clase Bicycle; asigna el valor a su derecha al operando a su izquierda:
int cadence = 0; int speed = 0; int gear = 1;

Este operador tambin se puede utilizar en objetos para asignar referencias a objetos, como se muestra en Creatcin de objetos. Los operadores aritmticos El lenguaje de programacin Java proporciona operadores que realizan la suma, resta, multiplicacin y divisin. Probablemente los reconozca por sus homlogos en la mtemtica bsica. El nico smbolo que le podr parecer nuevo es %, que divide un operando por el otro y devuelve el resto como su resultado.
+ operador de concatenar Strings) operador de * operador de / operador de % operador de adicin (tambin se utiliza para sustraccin multiplicacin divisin resto

El siguiente programa, ArithmeticDemo, comprueba los operadores aritmticos.


/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer.

* * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class ArithmeticDemo { public static void main (String[] args){ int result = 1 + 2; // result es ahora 3 System.out.println(result); result = result - 1; // result es ahora 2 System.out.println(result); result = result * 2; // result es ahora 4 System.out.println(result); result = result / 2; // result es ahora 2 System.out.println(result); result = result + 8; // result es ahora 10 result = result % 7; // result es ahora 3 System.out.println(result); } }

Tambin puede combinar los operadores aritmticos con el operador de asignacin sencillo para crear asignaciones compuestas. Por ejemplo, x+=1; y x=x+1; ambos incrementan el valir de x en 1. El operador + tambin se puede utilizar para concatenar (unir) dos cadenas, como se muestra en el siguiente programa ConcatDemo:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class ConcatDemo { public static void main(String[] args){

String firstString = "Esto es"; String secondString = " una cadena concatenada."; String thirdString = firstString+secondString; System.out.println(thirdString); } }

Al final de este programa la variable thirdString contiene Esto es una cadena concatenada., que se imprimir en la salida estndar. Los operadores unarios Los operadores unarios solamente necesitan un operando; realizan diferentes operaciones como incrementar o decrementar un valor en una unidad, negar una expresin o invertir el valor de un booleano.
+ Operador unario ms, indica un valor positivo (sin embargo los nmero son positivos sin el operador) Operador unario menos; niega una expresin ++ Operador de incremento; incrementa un valor en 1 -Operador de decremento; decrementa un valor en 1 ! Operador de complemento lgico; invierte el valor de un booleano

El siguiente programa, UnaryDemo, comprueba los operadores unarios:


/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class UnaryDemo { public static void main(String[] args){ int result = +1; // result es ahora 1 System.out.println(result); result--; // result es ahora 0 System.out.println(result); result++; // result es ahora 1 System.out.println(result); result = -result; // result es ahora -1 System.out.println(result); boolean success = false; System.out.println(success); // falso/false System.out.println(!xito); // verdadero/true } }

Los operadores de incremento y decremento se pueden aplicar delante (prefix) o detrs (postfix) del operando. Tanto el cdigo result++; como ++result; resultarn en que result ser incrementado en uno. La nica diferencia es que la versin prefix (+ +result) evala segn el valor incrementado, mientras que la versin postfix (result++) evala segn el valor original. Si solamente est realizando un incremento o decremento sencillo, realmente no importa cul de las dos formas utiliza. Pero si utiliza este operador como parte de una expresin ms larga, la forma que elija puede influir significativamente en el resultado. El siguiente programa, PrePostDemo, ilustra el operador unario de incremento prefix/postfix:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above

copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class PrePostDemo { public static void main(String[] args){ int i = 3; i++; System.out.println(i); // "4" ++i; System.out.println(i); // "5" System.out.println(++i); // "6" System.out.println(i++); // "6" System.out.println(i); // "7" } }

Operadores de igualdad, relacionales y condicionales Los operadores de igualdad y relacionales Los operadores de igualdad y relacionales determinan si un operando es mayor, menor, igual a o distinto de otro. Probablemente la mayora de estos operadores tambin le sern familiares. Tenga en mente que debe utilizar ==, no = cuando compruebe si dos valores primitivos son iguales.

== != > >= < <=

igual a distinto de mayor que mayor que o igual a menor que menor que o igual a

El siguiente programa, ComparisonDemo, comprueba los operadores de comparacin:


/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */

class ComparisonDemo { public static void main(String[] args){ int value1 = 1; int value2 = 2; if(value1 == value2) System.out.println("value1 == value2"); if(value1 != value2) System.out.println("value1 != value2"); if(value1 > value2) System.out.println("value1 > value2"); if(value1 < value2) System.out.println("value1 < value2"); if(value1 <= value2) System.out.println("value1 <= value2"); } }

Resultado:
value1 != value2 value1 < value2 value1 <= value2

Los operadores condicionales Los operadores && y || realizan las operaciones AND-Condicional y OR-Condicional sobre dos expresiones booleanas. Estos operadores muestran un comportamiento de cortocircuito, lo que significa que el segundo operando solamente se evala si es necesario.
&& AND-Condicional || OR-Condicional

El siguiente programa, ConditionalDemo1, comprueba estos operadores:


/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of

its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class ConditionalDemo1 { public static void main(String[] args){ int value1 = 1; int value2 = 2; if((value1 == 1) && (value2 == 2)) System.out.println("value1 es 1 Y value2 es 2"); if((value1 == 1) || (value2 == 1)) System.out.println("value1 es 1 O value2 es 1"); } }

Otro de los operadores condicionales es ?:, que se puede considerar una abreviatura de una sentencia if-then-else (tratada en la seccin Sentencias de control de flujo de esta leccin). Este operador tambin se conoce como el operador ternario porque utiliza tres operandos. En esl siguiente ejemplo este operador se debe leer como: Si unaCondicion es true (verdadera), asigna el valor de valor1 a resultado. Si no, asigna el valor de valor2 a resultado. El siguiente programa, ConditionalDemo2, comprueba el operador ?: :
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met:

* * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class ConditionalDemo2 { public static void main(String[] args){ int valor1 = 1; int valor2 = 2; int resultado; boolean unaCondicion = true; // es verdadera resultado = unaCondicion ? valor1 : valor2; System.out.println(resultado); } }

Puesto que unaCondicion es true (verdadera), este programa imprime 1 en la pantalla. Utilice el operador ?: en lugar de una sentencia if-then-else si hace que su cdigo sea ms legible, por ejemplo cuando las expresiones con compactas y no tienen efectos secundarios (como asignaciones).

El operador de comparacin de tipos instanceof El operador instanceof compara un objeto con un tipo indicado. Puede utilizarlo para comprobar si un objeto es una instancia de una clase, una instancia de una subclase o una instancia de una clase que implementa una interfaz en concreto. El siguiente programa, InstanceofDemo, define una clase padre (llamada Parent), una interfaz sencilla (llamada MyInterface), y una clase hija (llamada Child) que hereda del padre e implementa la interfaz.
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*/ class InstanceofDemo { public static void main(String[] args) { Parent obj1 = new Parent(); Parent obj2 = new Child(); System.out.println("obj1 instanceof instanceof Parent)); System.out.println("obj1 instanceof instanceof Child)); System.out.println("obj1 instanceof (obj1 instanceof MyInterface)); System.out.println("obj2 instanceof instanceof Parent)); System.out.println("obj2 instanceof instanceof Child)); System.out.println("obj2 instanceof (obj2 instanceof MyInterface)); } } Parent: " + (obj1 Child: " + (obj1 MyInterface: " + Parent: " + (obj2 Child: " + (obj2 MyInterface: " +

class Parent{} class Child extends Parent implements MyInterface{} interface MyInterface{}

Resultado:
obj1 obj1 obj1 obj2 obj2 obj2 instanceof instanceof instanceof instanceof instanceof instanceof Parent: true Child: false MyInterface: false Parent: true Child: true MyInterface: true

Al usar el operador instanceof, tenga en cuenta que null no es una instancia de nada. Operadores a nivel de bit y de desplazamiento de bit El lenguaje de programacin Java tambin proporciona operadores que proporcionan operaciones de a nivel de bit y de desplazamiento de bit en tipos enteros. Los operadores tratados en esta seccin son de uso poco comn. Por tanto su cobertura es breve, el objetivo es simplemente hacer constar que estos operadores existen. El operador complemento a nivel de bit ~ invierte un patrn de bits; se puede aplicar a cualquiera de los tipos enteros, haciendo de cada 0 un 1 y de cada 1 un 0. Por ejemplo, un byte contiene 8 bits; al aplicar este operador a un valor cuyo patrn de bits es 00000000 ste se cambiara a 11111111. El operador de desplazamiento a la izquierda con signo << desplaza un patrn de bits a la izquierda, y el operador de desplazamiento a la derecha con signo >> desplaza un patrn de bits a la derecha. El patrn de bits viene dado por el operando de la izquierda y el nmero de posiciones por el operando de la derecha. El operador de desplazamiento a la derecha sin signo >>> desplaza un cero hacia la posicin ms a la izquierda, mientras que la posicin ms a la izquierda despus del >> dependa de la extensin de

signo. El operador a nivel de bits & realiza una operacin de AND a nivel de bits. El operador a nivel de bits ^ realiza una operacin de OR exclusivo a nivel de bits. El operador a nivel de bits | realiza una operacin de OR inclusivo a nivel de bits. El siguient programa, BitDemo, utiliza el operador AND a nivel de bits para imprimir el nmero 2 en la salida estndar.
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH

DAMAGE. */ class BitDemo { public static void main(String[] args) { int bitmask = 0x000F; int val = 0x2222; System.out.println(val & bitmask); // imprime "2" } }

Resumen de operadores La siguiente referencia rpida resume los operadores proporcionados por el lenguaje de programacin Java.

Operador de asignacin sencillo


= Operador de asignacin sencillo

Operadores aritmticos
+ Operador de concatenar Strings) Operador de * Operador de / Operador de % Operador de adicin (tambin se utiliza para sustraccin multiplicacin divisin resto

Operadores unarios
+ Operador unario ms, indica un valor positivo (sin embargo los nmero son positivos sin el operador) Operador unario menos; niega una expresin ++ Operador de incremento; incrementa un valor en 1 -Operador de decremento; decrementa un valor en 1 ! Operador de complemento lgico; invierte el valor de un booleano

Operadores de igualdad y relacionales


== != > >= < <= Igual a Distinto de (No igual a) Mayor que Mayor que o igual a Menor que Menor que o igual a

Operadores condicionales
&& AND-Condicional || OR-Condicional ?: Ternario (abreviatura de la sentencia if-then-else)

Operado de comparacin de tipo


instanceof Compara un objeto con un tipo indicado

Operadores a nivel de bit y de desplazamiento de bit


~ << >> >>> & ^ | Complemento unario a nivel de Desplazamiento con signo a la Desplazamiento con signo a la Desplazamiento sin signo a la AND a nivel de bits OR exclusivo a nivel de bits OR inclusivo a nivel de bits bit izquierda derecha derecha

Preguntas y ejercicios: Operadores

Preguntas
1. Fjese en el siguiente fragmento de cdigo.
arrayOfInts[j] > arrayOfInts[j+1]

Qu operadores contiene el cdigo? 2. Fjese en el siguiente fragmento de cdigo.


int i = 10; int n = i++%5;

a. Cuales son los valores de i y n despus de que se haya ejecutado? b. Cules son los valores finales de i y n si en vez de usar el operador de incremento postfix (i++), utiliza la verisn prefix (++i))? 3. Qu operador utilizara para invertir el valor de un boolean? 4. Qu operador se utiliza para comparar dos valores, = o == ? 5. Explique el siguiente ejemplo de cdigo: result = someCondition ? value1 : value2;

Ejercicios
1. Cambie el siguiente programa para que utilice asignaciones compuestas:
class ArithmeticDemo { public static void main (String[] args){ int result = 1 + 2; // el resultado es ahora 3 System.out.println(result); result = result - 1; // el resultado es ahora 2 System.out.println(result); result = result * 2; // el resultado es ahora 4 System.out.println(result); result = result / 2; // el resultado es ahora 2 System.out.println(result);

10 3 }

result = result + 8; // el resultado es ahora result = result % 7; // el resultado es ahora System.out.println(result);

2. En el siguiente programa, explique por qu el valor 6 se muestra dos veces seguidas:


class PrePostDemo { public static void main(String[] args){ int i = 3; i++; System.out.println(i); // "4" ++i; System.out.println(i); // "5" System.out.println(++i); // "6" System.out.println(i++); // "6" System.out.println(i); // "7" } }

Respuestas a preguntas y ejercicios: Operadores

Respuestas a preguntas
1. Fjese en el siguiente fragmento de cdigo.
arrayOfInts[j] > arrayOfInts[j+1]

Pregunta: Qu operadores contiene el cdigo? Respuesta: >, + 2. Fjese en el siguiente fragmento de cdigo.
int i = 10; int n = i++%5;

a. Pregunta: Cuales son los valores de i y n despus de que se haya ejecutado? Respuesta: i es 11, y n es 0. b. Pregunta: Cules son los valores finales de i y n si en vez de usar el operador de incremento postfix (i++), utiliza la verisn prefix (++i))? Respuesta: i es 11, y n es 1. 3. Pregunta: Qu operador utilizara para invertir el valor de un boolean? Respuesta: El operador de complemento lgico !. 4. Pregunta:: Qu operador se utiliza para comparar dos valores, = o == ? Respuesta: El operador == se utiliza para la comparacin, y = para asignacin.

5. Pregunta: Explique el siguiente ejemplo de cdigo: result = someCondition ? value1 : value2; Respuesta: Este cdigo se debe leer como: Si unaCondicion es true (verdadera), asigna el valor de valor1 a resultado. Si no, asigna el valor de valor2 a resultado.

Ejercicios
1. Cambie el siguiente programa para que utilice asignaciones compuestas:
class ArithmeticDemo { public static void main (String[] args){ 3 int result = 1 + 2; // el resultado es ahora System.out.println(result); 2 result = result - 1; // el resultado es ahora System.out.println(result); 4 result = result * 2; // el resultado es ahora System.out.println(result); 2 result = result / 2; // el resultado es ahora System.out.println(result); 10 3 } result = result + 8; // el resultado es ahora result = result % 7; // el resultado es ahora System.out.println(result); }

Una solucin:
class ArithmeticDemo { public static void main (String[] args){ int result = 3; System.out.println(result); result -= 1; // result es ahora 2 System.out.println(result); result *= 2; // result es ahora 4 System.out.println(result); result /= 2; // result es ahora 2 System.out.println(result); result += 8; // result es ahora 10 result %= 7; // result es ahora 3 System.out.println(result);

} }

2. En el siguiente programa, explique por qu el valor 6 se muestra dos veces seguidas:


class PrePostDemo { public static void main(String[] args){ int i = 3; i++; System.out.println(i); // "4" ++i; System.out.println(i); // "5" System.out.println(++i); // "6" System.out.println(i++); // "6" System.out.println(i); // "7" } }

El cdigo System.out.println(++i); evalua a 6 porque la versin prefix de ++ evala al valor incrementado. La siguiente lnea, System.out.println(i++); evala al valor actual, y despus incrementa en uno. Por lo tanto 7 no se muestra hasta la lnea siguiente. Expresiones, sentencias y bloques Ahora que ya entiende las variables y los operadores es el momento de aprender lo que son las expresiones, las sentencias y los bloques. Los operadores se utilizan para construir expresiones que calculan valores; las expresiones son los componentes centrales de las sentencias; las sentencias se pueden agrupar en bloques.

Expresiones
Una expresin es una construccin hecha de variables, operadores e invocaciones de mtodos, creados segn la sintaxis del lenguaje, que evala a un solo valor. Ya hemos visto ejemplos de expresiones, ilustradas en negrita a continuacin:
int cadence = 0; anArray[0] = 100; System.out.println("Elemento 1 en el ndice 0: " + anArray[0]); int result = 1 + 2; // result es ahora 3 if(value1 == value2) System.out.println("value1 == value2");

El tipo de dato del valor devuelto por una expresin depende de los elementos utilizadas en ella. La expresin cadence = 0 devuelve un int porque el operador de asignacin devuelve un valor del mismo tipo de dato que el operando de su izquierda; en este caso cadence es un int. Como puede observar en los dems ejemplos, una expresin puede devolver tambin otro tipo de datos, por ejemplo boolean o String. El lenguaje de programacin Java permite construir expresiones compuestas a partir de varias expresiones ms pequeas siempre que el tipo de dato requerido por una parte de la expresin concuerde con el de la otra. A continuacin un ejemplo de una expresin compuesta:

1 * 2 * 3

En este ejemplo el orden en el que se evala la expresin no es importante porque el resultado de la muliplicacin no depende del orden; el resultado es siempre el mismo sin importar el orden en que se apliquen las multiplicaciones. Sin embargo esto no es cierto para todas las expresiones. Por ejemplo, la siguiente expresin dar resultados diferentes segn se realice primero la operacin de suma o la de divisin:
x + y / 100 // ambguo

Puede indicar exctamente cmo se debe evaluar una expresin mediante el uso de parntesis: ( y ). Para eliminar la ambigedad de la expresin anterior se podra escribir de la siguiente forma:
(x + y) / 100 // no ambguo, recomendado

Si no indica explcitamente el orden de las operaciones que se deben realizar, el orden lo determina la precedencia asignada a los operadores utilizados en la expresin. Lo peradores con mayor precedencia se evalan primero. Por ejemplo, el operador de divisin tiene mayor precedencia que el de suma. Por lo tanto las siguientes dos sentencias son equivalentes:
x + y / 100 x + (y / 100) // no ambguo, recomendado

Sea explcito al escribir expresiones compuestas e indique con parntesis qu operadores se deben evaluar primero. Esta prctica har que su cdigo sea ms fcil de leer y mantener.

Sentencias
Las sentencias son, a grandes rasgos, equivalentes a las oraciones del lenguaje natural. Una sentencia forma una unidad de ejecucin completa. Los siguientes tipos de expresiones se pueden convertir en sentencia si se terminan con punto y coma (;). Expresiones de asignacin Cualquier uso de code>++ o -Invocaciones de mtodos Expresiones de creacin de objetos

Este tipo de sentencias se llaman sentencias de expresin. Veamos algunos ejemplos de sentencias de expresin.
unValor = 8933.234; // sentencia de asignacin unValor++; // sentencia de incremento System.out.println("Hola Mundo!"); // sentencia de invicacin de mtodo Bicycle miBici = new Bicycle(); // sentencia de creacin de objeto

Hay dos otros tipo de sentencias adems de las de expresin: sentencias de declaracin y

sentencias de control de flujo. Una sentencia de declaracin declara una variable. Ya hemos visto muchos ejemplos de sentencias de declaracin:
double unValor = 8933.234; //sentencia de declaracin

Finalmente, las sentencias de control de flujo regulan el orden en el que se ejecutan las sentencias. Aprender ms acerca de las sentencias de control de flujo en la siguiente seccin, Sentencias de control de flujo

Bloques
Un bloque es un grupo de sentencias contenido entre corchetes emparejados que se puede utilizar en cualquier lugar en el que se permita una sentencia sencilla. El siguiente ejemplo, BlockDemo, ilustra el uso de bloques:
class BlockDemo { public static void main(String[] args) { boolean condition = true; if (condition) { // empieza el bloque 1 System.out.println("Condition es verdadero."); } // fin del bloque one else { // empieza el bloque 2 System.out.println("Condition es falso."); } // fin del bloque 2 } }

Preguntas y ejercicios: Expresiones, sentencias y bloques

Preguntas
1. 2. 3. 4. Los operadores se pueden usar en la construccin de ___, que calculan valores. Las expresiones son los componentes centrales de ___. Las sentencias se pueden agrupar en ___. El siguiente fragmento de cdigo es un ejemplo de una expresin ___.
1 * 2 * 3

5. Las sentencias son, a grandes rasgos, equivalentes a las oraciones del lenguaje natural, pero en vez de terminar con un punto una sentencia termina con ___. 6. Un bloque es un grupo de sentencias contenido entre ___ emparejados que se puede utilizar en cualquier lugar en el que se permita una sentencia sencilla.

Ejercicios
Identifique los siguientes tipos de expresiones: unValor = 8933.234; unValor++; System.out.println("Hola Mundo!"); Bicycle miBici = new Bicycle();

Respuestas a preguntas y ejercicios: Expresiones, sentencias y bloques

Preguntas
1. Los operadores se pueden usar en la construccin de expresiones, que calculan valores. 2. Las expresiones son los componentes centrales de las sentencias. 3. Las sentencias se pueden agrupar en bloques. 4. El siguiente fragmento de cdigo es un ejemplo de una expresin compuesta.
1 * 2 * 3

5. Las sentencias son, a grandes rasgos, equivalentes a las oraciones del lenguaje natural, pero en vez de terminar con un punto una sentencia termina con punto y coma. 6. Un bloque es un grupo de sentencias contenido entre corchetes emparejados que se puede utilizar en cualquier lugar en el que se permita una sentencia sencilla.

Ejercicios
Identifique los siguientes tipos de expresiones: unValor = 8933.234; // sentencia de asignacin unValor++; // sentencia de incremento System.out.println("Hola Mundo!"); // sentencia de invocacin de mtodo Bicycle miBici = new Bicycle(); // sentencia de creacin de objeto Sentencias de control de flujo Normalmente las sentencias de sus archivos de cdigo se ejecutan de arriba abajo, en el orden en que aparecen. Las sentencias de control de flujo, sin embargo, rompen el flujo de ejecucin al emplear tomas de decisiones, bucles y ramificaciones, permitiendo que su programa ejecute ciertos bloques de cdigo segn ciertas condiciones. Esta seccin describe las sentencias de toma de decisiones (if-then, if-then-else, switch), las sentencias de bucles (for, while, do-while) y las sentencias de ramificacin (break, continue, return) proporcionadas por el lenguaje de programacin Java. Las sentencias if-then e if-then-else

La sentencia if-then
La sentencia if-then es la ms bsica de las sentencias de control de flujo. Le indica al programa que ejecute cierta parte del cdigo solamente si una condicin evala a true. Por ejemplo, la clase Bicycle podria permitir que los frenos redujesen la velocidad de la bicicleta solamente si la bicicleta ya estuviera en movimiento. Una posible implementacin del mtodo aplicarFrenos podra ser as:
void aplicarFrenos(){ if (seMueve){ // la clusula "if": la bicicleta debe estar en movimiento velocidadActual--; // la clusula "then": reducir la velocidad actual } }

Si esta condicin evala a false (indicando que la bicicleta no se mueve), el control salta al final de la sentencia if-then. Los corchetes de apertura y cierre son opcionales siempre que la clusula then solo contenga una sentencia:
void aplicarFrenos(){ if (seMueve) velocidadActual--; // lo mismo que ms arriba, pero sin los corchetes }

La decisin de cundo omitir los corchetes es una cuestin de gusto personal. Omitirlos puede dar un aspecto ms descuidado al cdigo. Si ms tarde se aade una segunda sentencia a la clusula then suele ocurrir que se olviden de aadir los corchetes necesarios. El compilador no es capaz de capturar este tipo de errores, simplemente obtendr resultado errneos.

La sentencia if-then-else
La sentencia if-then-else proporciona una ruta de ejecucin secundaria cuando una clusula if evala a false. Podra utilizar la sentencia if-then-else en el mtodo aplicarFrenos para realizar una accin si se aplican los frenos cuando la bicicleta no se est moviendo. En esta caso la accin simplemente muestra un mensaje de error indicando que la bilicleta ya est detenida.
void aplicarFrenos(){ if (seMueve) { velocidadActual--; } else { System.err.println("La bicicleta ya est detenida"); } }

El siguiente programa, IfElseDemo, asigna una nota segn la puntuacin de una prueba: una A para una puntuacin de 90% o ms, una B par auna puntuacin de 80% o ms, etc.
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the

above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class IfElseDemo { public static void main(String[] args) { int testscore = 76; char grade; if (testscore >= 90) { grade = 'A'; } else if (testscore >= 80) { grade = 'B'; } else if (testscore >= 70) { grade = 'C'; } else if (testscore >= 60) { grade = 'D'; } else { grade = 'F'; } System.out.println("Nota = " + grade);

} }

La salida del programa es:


Nota = C

Se habr fijado en que el valor de testscore puede satisfacer a ms de una expresin de la sentencia compuesta: 76 >= 70 y 76 >= 60. Sin embargo, una vez se ha satisfecho una condicin se ejecutan las sentencias adecuadas (grade = 'C';) y las dems condiciones no se evalan. La sentencia switch Al contrario de if-then e if-then-else, la sentencia switch permite cualquier cantidad de rutas de ejecucin posibles.. Un switch funciona con los datos primitivos byte, short, char e int. Tambin funciona con tipos enumerados (tratados en Clases y herencia) y con unas cuantas clases especiales que envuelven a ciertos tipos primitivos: Character, Byte, Short, and Integer (tratado en Clases y objetos ). El siguiente programa, SwitchDemo, declara un int llamado month cuyo valor representa un mes del ao. El programa muestra el nombre del mes, basado en el valor de month, mediante la sentencia switch.
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR

* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class SwitchDemo { public static void main(String[] args) { int month = 8; switch (month) { 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("Mayo"); 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("Mes no vlido.");break; } } }

En este caso se mostrar Agosto en la salida estndar. El cuerpo de una sentencia switch se conoce como el bloque switch. Cualquier sentencia contenida directamente por el bloque switch puede estar marcada por una o ms etiquetas case o default. La sentencia switch evala su expresin y ejecuta el caso (case) adecuado. Tambin es posible, por supuesto, conseguir el mismo resultado con sentenciasifthen-else:
int month = 8; if (month == 1) { System.out.println("Enero"); } else if (month == 2) { System.out.println("Febrero"); } . . . // etctera

La decisin de usar una sentencia if-then-else o switch a menudo es simplemente una cuestin de criterio propio. Podr decidir cul usar basndose en la legibilidad y otros factores. Se puede utilizar una sentencia if-then-else para tomar decisiones basadas en rangos de valores o condiciones, mientras que una sentencia switch solamente puede tomar decisiones basadas en un solo valor entero o enumerado. Tambin es interestante la sentencia break que va detrs de cada case. Cada sentencia

break termina la sentencia switch que la envuelve. El control de flujo contina con la primera sentencia a continuacin del bloque switch. Las sentencias break son necesarias porque sin ellas las sentencias case fallaran, es decir, sin un break el flujo del programa seguira secuencialmente a travs de todas las sentencias case. El siguiente programa, SwitchDemo2, ilustra por qu podra ser til hacer que una sentencia case falle:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class SwitchDemo2 { public static void main(String[] args) {

int month = 2; int year = 2000; int numDays = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDays = 31; break; case 4: case 6: case 9: case 11: numDays = 30; break; case 2: if ( ((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0) ) numDays = 29; else numDays = 28; break; default: System.out.println("Mes no vlido."); break; } System.out.println("Nmero de das = " + numDays);

} }

Esta es la salida del programa.


Nmero de das = 29

Tcnicamente el ltimo break no es necesario ya que el flujo se saldra de la sentencia switch de todos modos. Sin embargo recomendamos usar un break para evitar errores al modificar el cdigo. La seccin default gestiona los valores que no sean tratados explcitamente por una de las secciones case. Las sentencias while y do-while La sentencia while ejecuta un bloque de sentencias contnuamente mientras una condicin sea verdadera true. Su sintaxis se puede resumir as:
while (expresin) { sentencia(s) }

La sentencia while evala expresin, que debe devolver un valor boolean. Si la expresin evala a true, la sentencia while ejecuta la(s) sentencia(s) que hay en el bloque while. La sentencia while contina evaluando la expresin y ejecutando su bloque hasta que la expresin evale a false. Podemos usar la sentencia while para

imprimir los valores del 1 al 10 como se muestra en el siguiente programa WhileDemo:


/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class WhileDemo { public static void main(String[] args){ int count = 1; while (count < 11) { System.out.println("Nmero: " + count); count++; } }

Podr realizar un bucle infinito mediante la sentencia while del siguiente modo:
while (true){ // ponga aqu su cdigo }

El lenguaje de programacin Java tambin proporciona la sentencia do-while, que se puede expresar as:
do { sentencia(s) } while (expresin);

La diferencia entre do-while y while es que do-while evala su expresin al final en lugar de al inicio. Por lo tanto las sentencias del bloque do siempre se ejecutan al menos una vez, como se muestra en el siguiente programa DoWhileDemo:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class DoWhileDemo { public static void main(String[] args){ int count = 1; do { System.out.println("Nmero: " + count); count++; } while (count <= 11); } }

La sentencia for La sentencia for proporciona una forma compacta de recorrer un rango de valores. Los programadores a menudo se refieren a ella como el bucle for por la forma en la que recorre su bloque hasta que se satisfaga la condicin indicada. La forma general de la sentencia for se puede expresar del siguiente modo:
for (inicializacin; terminacin; incremento) { sentencia(s) }

Al usar esta versin de la sentencia for tenga en cuenta que: La expresin inicializacin inicializa el bucle, se ejecuta una sola vez cuando el bucle empieza. El bucle termina cuando la expresin terminacin evala a false. La expresin incremento se invoca despus de cada iteracin por el bucle; es perfectamente aceptable que esta expresin incremente o decremente un valor. El siguiente programa, ForDemo, utiliza la forma general de la sentencia for para mostrar los nmeros del 1 al 10 en la salida estndar:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer.

* * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class ForDemo { public static void main(String[] args){ for(int i=1; i<11; i++){ System.out.println("Nmero: " + i); } } }

La salida de este programa es:


Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: 1 2 3 4 5 6 7 8 9 10

Fjese en cmo el cdigo declara una variable dentro de la expresin de inicializacin. El

mbito de esta variable se extiende desde su declaracin hasta el final del bloque perteneciente a la sentencia for, por lo tanto tambin se puede usar en las expresiones de terminacin e incremento. Es mejor declarar la variable que controla una sentencia for en la expresin de inicializacin si sta no es necesaria fuera del bucle. A menudo se utilizan los nombres i, j y k para controlar los bucles for; al declararlas dentro de la expresin de inicializacin se limita su tiempo de vida y se reduce la posibilidad de error. Las tres expresiones del bucle for son opcionales; se puede crear un bucle inifinto del siguiente modo:
for ( ; ; ) { } // bucle infinito

// el cdigo va aqu

La sentencia for tambin tiene otra forma diseada para la iteracin a travs de Colecciones y arrays. A esta forma a veces se la denomina for mejorado (enhanced for) y se puede utilizar para compactar ms sus bucles y facilitar su lectura. Como ejemplo, fjese en el siguiente array, que contiene los nmeros del 1 al 10:
int[] numeros = {1,2,3,4,5,6,7,8,9,10};

El siguiente programa, EnhancedForDemo, utiliza el bucle for mejorado para recorrer el array:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class EnhancedForDemo { public static void main(String[] args){ int[] numeros = {1,2,3,4,5,6,7,8,9,10}; for (int elemento : numeros) { System.out.println("Nmero: " + elemento); } } }

En este ejemplo la variable elemento contiene el valor actual del array numeros. La salida de este programa es igual a la anterior:
Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: Nmero: 1 2 3 4 5 6 7 8 9 10

Se recomienda el uso de esta forma de la sentencia for en vez de la forma general siempre que sea posible. Sentencias de ramificacin

La sentencia break
La sentencia break tiene dos formas: etiquetada y sin etiquetar. Hemos visto la forma sin etiquetar en la seccin anterior en la que se trataba la sentencia switch. Tambie podr utilizar una sentencia break sin etiquetar para terminar un bucle for, while o do-while, como se muestra en el siguiente programa BreakDemo:
class BreakDemo { public static void main(String[] args) { int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076,

int searchfor = 12;

2000, 8, 622, 127 };

int i; boolean foundIt = false; for (i = 0; i < arrayOfInts.length; i++) { if (arrayOfInts[i] == searchfor) { foundIt = true; break; } } if (foundIt) { System.out.println("Encontrado " + searchfor + " en el ndice " + i); } else { System.out.println(searchfor + " no est en el array"); } } }

Este programa busca el nmero 12 en un array. La sentencia break, en negrita, termina el bucle for cuando se encuentra el valor. En ese momento del control de flujo se transfiere a la sentencia print al final del programa. La salida de este programa es:
Encontrado 12 en el ndice 4

Una sentencia break sin etiquetar termina la sentencia switch, for, while o dowhile ms interna, pero un break etiquetado termina una sentencia externa. El siguiente programa, BreakWithLabelDemo, es parecido al programa anterior pero utiliza bucles for anidados para buscar un valor en un array de dos dimensiones. Un break etiquetado (como search) termina el bucle for externo cuando se encuentra el valor:
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. *

* - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class BreakWithLabelDemo { public static void main(String[] args) { int[][] arrayOfInts = { { 32, 87, 3, 589 }, { 12, 1076, 2000, 8 }, { 622, 127, 77, 955 } }; int searchfor = 12; int i; int j = 0; boolean foundIt = false; search: for (i = 0; i < arrayOfInts.length; i++) { for (j = 0; j < arrayOfInts[i].length; j++) { if (arrayOfInts[i][j] == searchfor) { foundIt = true; break search; } } } if (foundIt) { System.out.println("Encontrado " + searchfor + " en " + i + ", " + j); } else { System.out.println(searchfor + " no est en el array"); }

} }

Esta es la salida del programa.


Encontrado 12 en 1, 0

La sentencia break termina la sentencia etiquetada; no transfiere el control de flujo a la etiqueta. El control de flujo se transfiere a la sentencia inmediatamente posterior a la sentencia etiquetada (terminada).

La sentencia continue
La sentencia continue se salta la iteracin actual de un bucle for, while o dowhile. La forma sin etiquetar salta al final del cuerpo del bucle ms interno y evala la expresin booleana que lo controla. El siguiente programa, ContinueDemo, recorre un String contando las veces que aparece la letra p. Si el carcter actual no es una p la sentencia continue se salta el resto del bucle y sigue con el siguiente carcter. Si es una p, el programa incrementa la suma de letras.
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class ContinueDemo { public static void main(String[] args) { String searchMe = "peter piper picked a peck of pickled peppers"; int max = searchMe.length(); int numPs = 0; for (int i = 0; i < max; i++) { //interested only in p's if (searchMe.charAt(i) != 'p') continue; //process p's numPs++;

} System.out.println("Encontradas " + numPs + " p's en la cadena."); } }

Esta es la salida del programa.


Encontradas 9 p's en la cadena.

Compile el mismo programa eliminando la sentencia continue para ver el efecto ms claramente. Cuando vuelva a ejecutarlo el contador estar equivocado, indicando que ha encontrado 35 p's en lugar de 9. Una sentencia continue etiquetada se salta la iteracin actual de un bucle exterior marcado con la etiqueta indicada. El siguiente programa, ContinueWithLabelDemo, utiliza bucles anidados para buscar una subcadena dentro de otra cadena. Se necesitan dos bucles anidados: uno que recorra la subcadena y otro que recorra la cadena principal. El siguiente programa, ContinueWithLabelDemo, utiliza la forma etiquetada de continue para saltarse una iteracin del bucle exterior.
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *

* - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class ContinueWithLabelDemo { public static void main(String[] args) { String searchMe = "Look for a substring in me"; String substring = "sub"; boolean foundIt = false; int max = searchMe.length() - substring.length(); test: for (int i = 0; i <= max; i++) { int n = substring.length(); int j = i; int k = 0; while (n-- != 0) { if (searchMe.charAt(j++) != substring.charAt(k++)) { continue test; } } foundIt = true;

break test; } System.out.println(foundIt ? "Encontrado" : "No lo encontr"); } }

Esta es la salida del programa.


Encontrado

La sentencia return
La ltima de las sentencias de ramificacin es return. La sentencia return sale del mtodo actual y devuelve el control de flujo a donde se haba invocado el mtodo. La sentencia return tiene dos formas: una que devuelve un valor y otra que no lo devuelve. Para devolver un valor, simplemente aada el valor (o una expresin que calcule le valor) despus de la palabra clave return.
return ++count;

El tipo de dato devuelto debe coincidir con el tipo del valor de retorno declarado por el mtodo. Cuando declare un mtodo como void, utilice la forma de return que no devuelva un valor.
return;

La leccin Clases y objetos cubrir todo lo que necesite saber acerca de la creacin de mtodos. Resumen de Sentencias de control de flujo La sentencia if-then es la ms bsica de las sentencias de control de flujo. Le indica al programa que ejecute cierta parte del cdigo solamente si una condicin evala a true. La sentencia if-then-else proporciona una ruta de ejecucin secundaria cuando una clusula if evala a false. Al contrario de if-then e if-then-else, la sentencia switch permite cualquier cantidad de rutas de ejecucin posibles.. Las sentencias while y do-while ejecutan un bloque de sentencias contnuamente mientras una condicin sea true. La diferencia entre do-while y while es que dowhile evala su expresin al final en lugar de al inicio. Por lo tanto, las sentencias dentro del bloque do se ejecutan por lo menos una vez. La sentencia for proporciona una forma compacta de recorrer un rango de valores. Tiene dos formas, una de las cuales fue diseada para recorrer colecciones y arrays. Preguntas y ejercicios: Sentencias de control de flujo

Preguntas
1. La sentencia de control de flujo ms bsica proporcionada por el lenguaje Java es la sentencia ___. 2. La sentencia ___ permite cualquier cantidad de rutas de ejecucin posibles. 3. La sentencia ___ es parecida a la sentencia while, pero evala su

expresin al ___ del bucle. 4. Cmo se escribe un bucle infinito utilizando la sentencia for? 5. Cmo se escribe un bucle infinito utilizando la sentencia while?

Ejercicios
1. Teniendo en cuenta el siguiente fragmento de cdigo.
if (aNumber >= 0) if (aNumber == 0) System.out.println("primera cadena"); else System.out.println("segunda cadena"); System.out.println("tercera cadena");

a. Qu salida cree que se producir si aNumber es 3? b. Escriba un programa que contenga el fragmento anterior, haga que aNumber sea 3. Cul es la salida del programa? Es lo que haba predicho? Explique por qu la salida es la que es; en otras palabras, cul es el flujo de control del fragmento? c. Reformatee el cdigo para que el flujo sea ms comprensible, usando solamente espacios y cambios de lnea. d. Utilice corchetes, { y }, para aclarar el cdigo ms. Respuestas a preguntas y ejercicios: Sentencias de control de flujo

Respuestas a preguntas
1. La sentencia de control de flujo ms bsica proporcionada por el lenguaje Java es la sentencia if-then. 2. La sentencia switch permite cualquier cantidad de rutas de ejecucin posibles. 3. La sentencia do-while es parecida a la sentencia while, pero evala su expresin al bottom del bucle. 4. Pregunta: Cmo se escribe un bucle infinito utilizando la sentencia for? Respuesta:
for ( ; ; ) { }

5. Pregunta: Cmo se escribe un bucle infinito utilizando la sentencia while? Respuesta:


while (true) { }

Ejercicios
1. Teniendo en cuenta el siguiente fragmento de cdigo.
if (aNumber >= 0) if (aNumber == 0) System.out.println("primera

cadena"); else System.out.println("segunda cadena"); System.out.println("tercera cadena");

a. Ejercicio: Qu salida cree que se producir si aNumber es 3? Solucin:


segunda cadena tercera cadena

b. Ejercicio: Escriba un programa que contenga el fragmento anterior, haga que aNumber sea 3. Cul es la salida del programa? Es lo que haba predicho? Explique por qu la salida es la que es. En otras palabras, cul es el flujo de control del fragmento? Solucin: NestedIf
segunda cadena tercera cadena

3 es mayor o igual a 0, por lo que la ejecucin progresa a la segunda sentencia if. El test de la segunda sentencia if falla porque 3 no es igual a 0. Por tanto, se ejecuta la clusula else (ya que est ligada a la segunda sentencia if). Por lo tanto, se muestra segunda cadena. El ltimo println est completamente fuera de cualquier sentencia if, por lo que se ejecuta siempre, por lo tanto siempre se muestra tercera cadena. c. Ejercicio: Reformatee el cdigo para que el flujo sea ms comprensible, usando solamente espacios y cambios de lnea. Solucin:
if (aNumber >= 0) if (aNumber == 0) System.out.println("primera cadena"); else System.out.println("segunda cadena"); System.out.println("tercera cadena");

d. Ejercicio: Utilice corchetes, { y }, para aclarar el cdigo ms y reducir la posibilidad de errores por parte de futuros mantenedores del cdigo. Solucin:
if (aNumber >= 0) { if (aNumber == 0) { System.out.println("primera cadena"); } else { System.out.println("segunda cadena"); } } System.out.println("tercera cadena");

http://www.codexion.com/tutorialesjava/java/TOC.html

You might also like