Capítulo 1. Creación y uso de objetos. 1.1 Creación de objetos



Documentos relacionados
Sintaxis y Convenciones de Java. M. en C. Erika Vilches

Modulo 1 El lenguaje Java

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

8. Sentencia return y métodos

La clase estándar Scanner

Curso PHP Módulo 1 R-Luis

Práctica 2: Simón dice

Programación Orientada a Objetos con Java

Apuntes de ACCESS. Apuntes de Access. Campos de Búsqueda:

Centro de Capacitación en Informática

Introducción a la programación orientada a objetos

Ejemplos de conversión de reales a enteros

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

MATERIAL 2 EXCEL 2007

2. Estructura de un programa en Java

Introducción a la Firma Electrónica en MIDAS

Computación III. Objetivo de aprendizaje del tema

UNIDADES DE ALMACENAMIENTO DE DATOS

CAPÍTULO IV BREVE DESCRIPCIÓN DE LA INFRAESTRUCTURA DE CÓMPUTO VISUAL BASIC 6.0 PARA WINDOWS

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

10. Algunas clases estándar de Java (I)

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)

Introducción al lenguaje Java

FACULTAD DE INGENIERÍA

Programa diseñado y creado por Art-Tronic Promotora Audiovisual, S.L.

Creación de Funciones de Conducción

Guías _SGO. Gestione administradores, usuarios y grupos de su empresa. Sistema de Gestión Online

!!!!!!!! !!!!! Práctica!4.! Programación!básica!en!C.! ! Grado!en!Ingeniería!!en!Electrónica!y!Automática!Industrial! ! Curso!2015H2016!

Base de datos en Excel

TIPOS DE VARIABLES EN PHP. DECLARACIÓN Y ASIGNACIÓN. LA INSTRUCCIÓN ECHO PARA INSERTAR TEXTO O CÓDIGO. (CU00816B)

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

1 ELEMENTOS BASICOS DEL LENGUAJE

Primer Parcial Septiembre 5 de 2009

Para crear una lista como la anterior, primero escribe la información, y después selecciona el texto y aplícale el formato de viñetas.

Sistema de Gestión Portuaria Sistema de Gestión Portuaria Uso General del Sistema

Elementos léxicos del lenguaje de programación Java

Manual Oficina Web de Clubes (FBM)

Oficina Online. Manual del administrador

DOCUMENTOS COMPARTIDOS CON GOOGLE DOCS

Cómo registrarse y crear su cuenta de usuario? < IMAGEN 2.1.1: HAZ CLIC SOBRE EL BOTÓN RESALTADO

TABLA DE DECISION. Consideremos la siguiente tabla, expresada en forma genérica, como ejemplo y establezcamos la manera en que debe leerse.

INTELIGENCIA ARTIFICIAL 2015 TALLER RÁPIDO DE PROGRAMACIÓN EN JAVA

GUÍA DE LABORATORIO 5 ARREGLOS DE UNA DIMENSIÓN

9. Objetos y clases Clases

Operación Microsoft Access 97

Ejercicio 1. Formato de Fuente y Párrafo.

Matemática de redes Representación binaria de datos Bits y bytes

SistemA Regional de Información y Evaluación del SIDA (ARIES)

ZCARTAS: Iniciación a la suma y resta de números enteros Introducción Actividad 1: Escenario con cartas numeradas desde -2 hasta 2...

GUÍA DE TRABAJO Tecnología en Sistemas de Información

INFORMÁTICA. Práctica 5. Programación en C. Grado en Ingeniería en Electrónica y Automática Industrial. Curso v1.0 (05.03.

Introducción al lenguaje de programación java

Guía para el Portal de Profesores del Sistema de Información CLASS Académico

Carrito de Compras. Esta opción dentro de Jazz la podremos utilizar como cualquier otro carrito de compras de una página de Internet.

MINI MANUAL PARA CREAR FORMULARIOS CON PHP Marzo 2007

MANUAL DE LA APLICACIÓN HELP DESK

Práctica 1 El juego de los chinos

Pruebas de unidad con JUnit

Capítulo 9. Archivos de sintaxis

Manual de operación Tausend Monitor

Introducción a PHP. * No es necesario declarar previamente las variables.

CAPÍTULO 4. EL EXPLORADOR DE WINDOWS XP

MANUAL DE USUARIO DE LA APLICACIÓN DE ACREDITACION DE ACTIVIDADES DE FORMACION CONTINUADA. Perfil Entidad Proveedora

Banco de la República Bogotá D. C., Colombia

28.- Manejo de los Feriados

PROBLEMAS CON SU CLAVE? Cliente Nuevo Puedo solicitar acceso a la Banca en Línea (Contrato Uso de Canales de Autoatención) a través del Portal?

Sistema de Inscripciones en Línea de la Olimpiada Mexicana de Matemáticas, Delegación Yucatán MANUAL DE USUARIO

Tipos de variables en Visual Basic (integer, single, double, string, object, etc.). Ejemplos. (CU00308A)

PROGRAMA PARA LA RECEPCIÓN VALIDACIÓN Y RESGUARDO DE DOCUMENTOS FISCALES VERSIÓN 1.00 MANUAL DE OPERACIÓN

Hacer clic sobre la figura, para extraer todos los registros o presionar la tecla F2.

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

I. Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein Javier Navarro

Ejemplo de lectura por teclado de un número entero: int n; System.out.print("Introduzca un número entero: "); n = sc.nextint();

Bibliotecas Escolares. Perfil de Lector.

Los números racionales

Adaptación al NPGC. Introducción. NPGC.doc. Qué cambios hay en el NPGC? Telf.: Fax.:

Curso de PHP con MySQL Gratis

DESARROLLO DE HABILIDADES DEL PENSAMIENTO LÓGICO

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

El e-commerce de Grupo JAB es una herramienta que permite a los clientes del Grupo, realizar un amplio conjunto de servicios de consulta, petición y

LiLa Portal Guía para profesores

INTRODUCCIÓN...2 1ª PARTE: INTERFAZ DE USUARIO...3

CAPITULO V. SIMULACION DEL SISTEMA 5.1 DISEÑO DEL MODELO

POWER POINT. Iniciar PowerPoint

Conciliación bancaria en CheqPAQ Cargado de estado de cuenta

Módulo Registro Clínico

NOTAS TÉCNICAS SOBRE EL SIT: Documentos de Gestión

CAPÍTULO 3 Servidor de Modelo de Usuario

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Estas visiones de la información, denominadas vistas, se pueden identificar de varias formas.

Operación de Microsoft Word

Web de Letras Manual de usuario. Gestiona tus letras por internet

MANUAL PARA LA GESTIÓN DEL PRÉSTAMO ENTRE LAS BIBLIOTECAS DE LA RED DE LECTURA PÚBLICA DE EUSKADI

MACROS. Automatizar tareas a través del uso de las macros.

CONCEPTOS BASICOS DEL LENGUAJE JAVA

MANUAL DE USUARIO. SISTEMA DE INVENTARIO DE OPERACIONES ESTADÍSTICAS.

Apéndice 5 Manual de usuario de ColeXión. ColeXión 1.0. Manual de usuario

3.1 INGENIERIA DE SOFTWARE ORIENTADO A OBJETOS OOSE (IVAR JACOBSON)

Transcripción:

Capítulo 1 Creación y uso de objetos Al escribir un programa en Java, es común que se tenga la necesidad de crear varios objetos. Éstos interactuarán entre sí mediante el envío y recepción de mensajes. Una vez que un objeto termina el trabajo para el cual fue creado, se recicla la memoria utilizada por él y de esta manera puede ser usada por otros objetos. La creación, uso y eliminación de un objeto se conoce como ciclo de vida de un objeto. En este capítulo se muestra cómo trabajar con objetos ya sea de clases definidas en los paquetes de Java o bien de clases definidas por el programador. El trabajo con objetos incluye: crearlos, interactuar con ellos a través del envío y recepción de mensajes, compararlos, eliminarlos e imprimirlos, entre otras operaciones. 1.1 Creación de objetos El primer paso para trabajar con un objeto, en Java, es su creación. Para crear un objeto se requiere utilizar el operador new seguido del nombre de la clase a la que pertenecerá tal objeto. 1 Por ejemplo, si se sabe que existe la clase Moneda y se desea crear un objeto de ella, se debe escribir la instrucción new Moneda();. La aplicación del operador new crea un objeto, separando el espacio necesario para mantener su estado, y devuelve como resultado la referencia al objeto creado. Una referencia es un tipo de dato usado para trabajar con objetos. El valor que almacena una variable o constante de tipo referencia no es el objeto en sí, es la dirección o referencia al objeto; de ahí que, en las figuras, las referencias se representan con flechas. La confusión puede ser debida a que es común referirse al objeto con el nombre de la referencia. La creación de un objeto puede pensarse de manera análoga al hecho de inflar un globo con gas y atarle un cordón. (Figura 1.1). La referencia es el cordón atado al globo, no es el globo. 1 Recordar que todo objeto pertenece a una clase. 1

2 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS... Objeto de la clase Moneda Referencia al objeto Figura 1.1: Creación de un objeto. En la figura 1.2 se muestra la diferencia entre un tipo primitivo y una referencia. En la parte izquierda se tiene un dato de tipo primitivo, en este caso un número entero, denominado edad cuyo valor es 35. En la parte derecha de la figura se tiene un dato de tipo referencia denominado saludo cuyo valor es la dirección (flecha) a un objeto. edad 35 saludo HOLA Figura 1.2: Variable para dato de tipo primitivo y variable para referencia. Si la referencia devuelta por el operador new no se asigna a ninguna variable, el objeto sólo se crea y no es posible darle un uso posterior. (El globo se infla pero no se fija a nada así que vuela y nadie puede jugar con él). Por esta razón, antes de crear un objeto, es necesario declarar una variable o constante para almacenar la referencia a él. La forma de declarar una referencia es similar a cualquier dato primitivo: se especifica el tipo de dato seguido de un identificador y posiblemente un valor inicial. La diferencia está en que el tipo de dato debe ser el nombre de una clase. Por ejemplo Moneda lasuertuda; (Parte superior de la figura 1.3) con lo cual se separa espacio para una referencia a un objeto de la clase Moneda y sin valor conocido. En la analogía, la variable de tipo referencia es la mano del niño que sostiene el cordón del globo, con la restricción de que en esa mano a lo más puede haber un cordón. Ejemplo 1.1. Código para la creación de un objeto de la clase Moneda en Java. Moneda lasuertuda;... // Código lasuertuda = new Moneda();... // Más código // Declaración de una referencia // Creación del objeto La creación de un objeto de la clase Moneda se ilustra en la parte media de la figura 1.3.

1.1. CREACIÓN DE OBJETOS 3 Al crear un objeto, se hace con el estado inicial definido en la clase. En ocasiones, es preciso proporcionar valores para crear este estado inicial. Estos valores se especifican entre los paréntesis que están después del nombre de la clase. Por ejemplo, si se desea una moneda de cincuenta pesos se debe hacer new Moneda(50);. Al igual que con los datos primitivos, es posible asignar un valor a una referencia en el momento de su declaración, de esta manera se pueden tener los dos pasos anteriores en una sola instrucción; por ejemplo: Moneda lasuertuda = new Moneda(); (ver parte baja de la figura 1.3). Moneda lasuertuda;? Declaración de referencia lasuertuda Creación del objeto Moneda lasuertuda; lasuertuda new Moneda(); valor 1 Asignación de referencia lasuertuda Moneda lasuertuda = new Moneda(); valor 1 Figura 1.3: Creación de un objeto en Java. Una referencia al igual que cualquier variable sólo tiene un valor a la vez. Sin embargo, un objeto puede tener varias referencias, esto es el equivalente a que alguien tenga su nombre y varios apodos, o bien, en la analogía con los globos, a un globo con varios cordones. Por ejemplo, si se tienen las siguientes instrucciones: Moneda lasuertuda = new Moneda(); Moneda chiquita = lasuertuda; Moneda mimoneda = lasuertuda; se tiene el efecto gráfico mostrado en la figura 1.4. En las dos últimas instrucciones no se crean objetos, debido a que no se usa el operador new, sólo se crean referencias al objeto existente. En este caso se dice que chiquita y mimoneda son alias de lasuertuda. Al terminar de trabajar con un objeto se puede asignar el valor null a la referencia, con lo cual el objeto ya no está accesible desde tal referencia. La palabra null está reservada por Java para asignar a las variables de tipo referencia cuando se desea especificar que no

4 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS lasuertuda chiquita mimoneda valor 1 Figura 1.4: Varias referencias a un objeto. están ligadas a ningún objeto. Por ejemplo al escribir la instrucción lasuertuda = null; se tiene el efecto que muestra la figura 1.5. En caso de que se asigne el valor null a la única referencia al objeto, éste ya no puede accesarse más. lasuertuda chiquita (lasuertuda = null;) valor 1 mimoneda Figura 1.5: Asignación de valor nulo a una referencia. En resumen, el valor de una referencia puede ser el valor de otra variable (o constante) de tipo referencia, el resultado de la creación de un objeto o bien el valor constante null. 1.2 Uso de objetos Una vez creado un objeto se le pueden enviar mensajes, ya sea para conocer su estado, modificar su estado, realizar algún cálculo, etcétera. Cada mensaje enviado se implementa mediante la llamada a un método haciendo uso de la notación punto cuya sintaxis es la siguiente: referenciadelobjeto.nombredelmétodo(listadeparamétros) La notación punto consta del nombre o identificador de la referencia al objeto que atenderá el mensaje, un punto, el nombre del método y la lista de parámetros para esa llamada en particular. La lista de parámetros, es una lista de identificadores o literales, cada uno separado por comas. Siempre deben escribirse los paréntesis independientemente de que el método requiera, o no, parámetros. La respuesta a un mensaje depende de la interacción entre los métodos definidos en la clase del objeto que recibió el mensaje, y del valor asignado en el mensaje a cada uno de

1.2. USO DE OBJETOS 5 sus parámetros. En algunos casos, la respuesta a un mensaje implica cambiar el estado de un objeto. Por ejemplo, si se tiene un objeto llamado miauto de la clase Automóvil y se le envía el mensaje frenar (mediante la sintaxis miauto.frenar();) la velocidad del automóvil cambia a cero (Figura 1.6). a) Envío de mensaje b) Recepción del mensaje miauto.frenar() miauto.frenar() jaime miauto jaime miauto velocidad... 100 velocidad... 0 Figura 1.6: Envío y recepción de mensajes. Por otra parte, hay mensajes que requieren información adicional. Por ejemplo, si se desea disminuir la velocidad de un auto es necesario indicar en cuánto, para ello en la llamada al método se debe especificar este valor entre los paréntesis; para el ejemplo del auto se podría escribir miauto.ajustarvelocidad(80) (Figura 1.7). a) Envío de mensaje b) Recepción del mensaje miauto.ajustarvelocidad(80) miauto.ajustarvelocidad(80) jaime miauto jaime miauto velocidad... 100 velocidad... 80 Figura 1.7: Envío y recepción de mensajes con parámetros. En ocasiones se espera recibir el valor de un atributo de la estructura como una respuesta a un mensaje, por ejemplo, si interesa conocer la velocidad del auto en un momento dado es posible preguntar, y esperar que indique un valor (Figura 1.8). En el caso que la respuesta a un mensaje sea un valor, es conveniente que este valor se almacene en alguna variable para su uso posterior. Ejemplo: velocidadactual = miauto.conocervelocidad(); La ejecución de los programas es secuencial, por lo tanto, una vez que se envía un mensaje a un objeto, el objeto emisor debe esperar a que termine de ejecutarse el método que responde a dicho mensaje antes de realizar cualquier otra tarea. Para poder llamar a un método es necesario conocer su signatura o firma pues ésta proporciona la información necesaria para poder hacerlo. La firma de un método consta

6 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS a) Envío de mensaje b) Recepción del mensaje miauto.obtenervelocidad() miauto.obtenervelocidad() jaime miauto jaime miauto velocidad... 100 velocidad... 100 100 Figura 1.8: Recepción de mensajes que devuelven un valor. del nombre del método y entre paréntesis una lista con los parámetros que requiere para trabajar. Esta lista indica el tipo y posiblemente el nombre de cada parámetro, el orden de los parámetros está implícito en la lista. El tipo de valor que devuelve el método no forma parte de la firma, sin embargo en este capítulo se incluye, porque es conveniente almacenar el resultado de un método en una variable (o constante) del tipo de valor que se especifica en el resultado para poder trabajar con ese valor más adelante. Ejemplos de firmas: char lanzar(); // Devuelve un caracter y no requiere parámetros. String obtenernombre(); // Devuelve una cadena y no requiere parámetros. void asignarnombre(string); // No devuelve nada y requiere una cadena. double distancia (Punto); // Devuelve un doble y requiere un Punto. 1.3 Eliminación de objetos Java permite al programador crear todos los objetos que necesite sin preocuparse de saber si el sistema de cómputo tiene suficientes recursos o no, la máquina virtual se encarga de destruirlos cuando ya no se necesitan. La JVM también se hace cargo de recuperar la memoria utilizada por los objetos que han sido eliminados, esto lo hace mediante la utilización de un recolector de basura el cual es activado automáticamente. En tanto que para crear un objeto se debe utilizar el operador new, la eliminación de objetos es implícita, se realiza cuando ya no hay más referencias a él. En general, el programador no tiene que ocuparse de la eliminación de los objetos, pero si se piensa que se tienen varios objetos sin referencia, se puede llamar al método gc de la clase System quizá porque se requiera disponer de todos los recursos del sistema en ese momento.

1.4. EJEMPLOS DE TRABAJO CON OBJETOS 7 1.4 Ejemplos de trabajo con objetos Los objetos se comunican entre sí mediante llamadas a métodos. Así que un programa en Java debe verse como una serie de objetos llamando a métodos. En esta sección se presentan programas cuyo objetivo es ilustrar el trabajo con objetos en Java, de tal forma que se asume que las clases que se usan en estos ejemplos existen. Ejemplo 1.2. Diseño de un programa que muestra en la pantalla un texto de felicitación. 1. Encontrar los objetos principales. Los sustantivos son: programa, pantalla y texto de felicitación. El sustantivo programa no se convierte en clase, en general se convierte en el método principal del programa, cuya programación será el resultado del escenario especificado en el tercer paso de esta metodología. Pantalla no se va a programar pues es en donde se verá el resultado del programa. Felicitación es el resultado del programa. 2. Determinar el comportamiento deseado. En este caso, como no hay objetos en la definición del problema no es posible asociarles comportamiento. 3. Definir escenarios. Para ayudar al diseño del programa, sobre todo en este caso en que la descripción es tan breve se define el escenario del programa. (a) El usuario ejecuta el programa. (b) Algún objeto imprime el mensaje de felicitación. En este caso se ha descubierto que se requiere un objeto capaz de escribir un mensaje de felicitación. Todo programa requiere mostrar mensajes al usuario, ya sea para interactuar con él o bien para mostrar los resultados del programa. De ahí que Java considera el monitor de la computadora como el objeto que sirve para que el usuario interactúe con los programas. En Java hay un objeto predefinido System.out el cual responde a los métodos println y print para mostrar información en el monitor. Ambos métodos reciben como parámetro una cadena y la despliegan en el monitor al ejecutarse. La diferencia entre estos métodos radica en que el método println una vez que muestra su cadena en el monitor pone un salto de línea para que la siguiente cadena desplegada empiece en una nueva línea y el método print no hace el salto de línea. Por ser un objeto predefinido no es necesario crearlo mediante el operador new, basta con usarlo en los lugares que se requiera enviar información al usuario.

8 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS Todo programa en Java está formado por clases, aquí se muestra como construir una clase que solamente contiene el método main que es en donde inicia la ejecución de todo programa. Al dar, en el sistema operativo, la instrucción java Felicitacion se ejecuta automáticamente este método. Ejemplo 1.3. Implementación del programa para mostrar un mensaje de felicitación. /** * Programa para que envie un mensaje de felicitación. * Objetivo Mostrar el uso del objeto System.out * @author Amparo López Gaona * @version Noviembre 2010 */ public class Felicitacion { // 1 public static void main (String [] pps) { // 2 System.out.println(" Felicidades! Has escrito tu primer programa en Java");// 3 // 4 // 5 Los comentarios forman parte de la documentación de los programas, su objetivo es facilitar las tareas de depuración y mantenimiento de los programas, por lo tanto, deben ser informativos de lo que se está codificando y cómo se está haciendo en términos generales, no deben especificar cosas obvias. Los comentarios no aportan nada funcional a los algoritmos, únicamente sirven para facilitar su comprensión, por tanto son ignorados por el compilador. Es recomendable que todo programa en Java empiece con un comentario en el que se describe el objetivo del programa, el nombre del programador y la fecha de realización. Este comentario abarca varias líneas así que se utiliza un comentario que empieza con /** y termina con */ además, se recomienda incluir algunas instrucciones que empiezan con arroba (@) como son: @author seguida del nombre del programador. Como no existe una instrucción para especificar la fecha, en este texto se coloca en la instrucción @version. Estos comentarios son útiles para generar la documentación del programa en páginas en HTML 2 de manera automática. Para generar la documentación se emplea el programa javadoc seguido del nombre del archivo fuente, en el apéndice?? se tiene un ejemplo de su utilización y el resultado obtenido. Para facilitar la explicación del programa, se numeraron las líneas con un comentario al final de cada una de ellas. En la línea 1 se define una clase llamada Felicitacion. La forma de definirla es mediante las palabras reservadas public class seguidas de un identificador para el nombre de la clase. En Java siempre se tienen que construir clases, por lo menos una que utilice objetos de clases definidas por otros, como en este ejemplo. 2 Para poder ser leídas desde cualquier navegador de Internet.

1.4. EJEMPLOS DE TRABAJO CON OBJETOS 9 En la línea 2 se define el método main que es en donde inicia la ejecución del programa. Esta línea tiene que escribirse exactamente como aparece en el ejemplo. En el siguiente capítulo se explica el significado de cada palabra que aparece en esta línea. En la línea 3, se envía el mensaje println al objeto System.out. En este caso el método println recibe la cadena " Felicidades! Has escrito tu primer programa en Java" En la línea 4 está la llave que termina el método main. En la línea 5 está la llave que termina la clase Felicitacion. Para compilar este programa se debe dar la instrucción javac Felicitacion.java. Debido a que la clase Felicitacion contiene al método main, el nombre del archivo debe ser igual al nombre de la clase y terminar con.java. En caso de encontrar errores se deben corregir y volver a compilar el programa, repitiendo estos pasos hasta que no haya errores. Entre los errores comunes que se cometen al empezar a programar está omitir el símbolo de punto y coma con que se termina cada instrucción, otro error frecuente es no cerrar las comillas o bien cerrarlas en una línea diferente de la que se abrieron. Una vez libre de errores de sintaxis, se puede ejecutar el programa con la instrucción java Felicitacion. Al hacerlo se hace una llamada implícita al método main de la clase Felicitacion. El resultado de esta llamada es mostrar en la pantalla de la computadora lo siguiente: Felicidades! Has escrito tu primer programa en Java Recordar que las comillas se utilizan para especificar que se tiene una literal y no son parte de la cadena. Ejemplo 1.4. El programa 1.3 podría haberse escrito sin ninguna alineación como se muestra a continuación: /** * Programa sencillo para que envié un mensaje de felicitación. * Objetivo Mostrar un programa sin alineación. * @author Amparo López Gaona * @version Noviembre 2010 */ public class Felicitacion{public static void main(string[] pps){system.out.println (" Felicidades! Has escrito tu primer programa en Java"); Este programa funciona igual que el programa 1.3, sólo es más compacto, con lo cual se ahorra espacio en su almacenamiento; sin embargo, es mucho más difícil de leer y en su caso de corregir o modificar, de ahí la importancia de la alineación de instrucciones. Ejemplo 1.5. El siguiente programa desplegará la felicitación en dos líneas. /** * Programa sencillo para que envie un mensaje de felicitación. * Objetivo Mostrar cómo se crean y escriben mensajes en más de una línea. * @author Amparo López Gaona

10 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS * @version Noviembre 2010 */ public class FelicitacionEn2Lineas { // 1 public static void main (String [] pps) { // 2 System.out.println(" Felicidades!"); // 3 System.out.println("\t Has escrito tu primer programa en Java"); // 4 // 5 // 6 Es importante notar que en el segundo mensaje, la cadena empieza con \t, que es el caracter para el tabulador de espacios en blanco. El resultado de este programa es: Felicidades! Has escrito tu primer programa en Java Las líneas 3 y 4 se podrían escribir en una sola como sigue: System.out.println(" Felicidades!\n\t Has escrito tu primer programa en Java"); En caso de que el mensaje fuera tan grande que la cadena no cupiera en una sola línea sería necesario dividirlo, para ello se tendrían que cerrar las comillas y continuar en la siguiente línea especificando una concatenación de cadenas, como sigue: System.out.println(" Felicidades!\n\t Has escrito tu primer programa en Java y" + " esto es un gran paso en tu carrera como programador."); Si las líneas 3 y 4 se cambiaran por las siguientes líneas: System.out.print(" Felicidades!"); System.out.println("\t Has escrito tu primer programa en Java"); El resultado sería el mensaje en una sola línea debido a que la primera instrucción no baja de línea, así que el siguiente mensaje empezará en donde acabe el primero, es decir después del signo de admiración. Ejemplo 1.6. Programa que felicita al usuario del programa incluyendo su nombre en la felicitación. Se desea que cada vez que se ejecute este programa, éste le pregunte a la persona su nombre y luego la felicite. 1. Encontrar los objetos principales. Sustantivos: usuario, nombre y felicitación. Al igual que programa, la palabra usuario es común en la descripción de problemas y no se toma en cuenta como candidato a objeto.

1.4. EJEMPLOS DE TRABAJO CON OBJETOS 11 2. Determinar el comportamiento deseado. En este caso, como no hay objetos en la definición del problema no es posible asociarles comportamiento. 3. Definir escenario. (a) Solicitar el nombre del usuario. (b) Almacenarlo en un objeto de la clase String. (c) Felicitar al usuario incluyendo su nombre en la felicitación. Este problema es muy parecido al problema anterior, excepto que ahora se requiere interactuar con el usuario para solicitarle su nombre y leerlo, así que además del objeto para enviar el mensaje, se requiere un objeto para poder leer del teclado. Finalmente, se requiere un objeto para almacenar el nombre de la persona que ejecuta el programa. Solicitar datos al usuario es tarea cotidiana en los programas, para ello Java proporciona en el paquete java.util la clase Scanner, la cual tiene métodos para interactuar con el usuario de los programas, por lo tanto tiene métodos para leer, del teclado, datos de cada tipo primitivo de Java. Al crear un objeto de la clase Scanner se debe dar como parámetro el objeto System.in para que la lectura sea del teclado. Cada método proporcionado en esta clase, tiene por nombre nexttipo, donde el sufijo tipo corresponde al tipo primitivo que se desea leer. Como es la segunda palabra del nombre de un método debe empezar con mayúscula. Por ejemplo, para leer un número entero se tiene el método nextint. También incluye el método nextline que se utiliza para leer cadenas de caracteres. Las firmas de los métodos se presentan en la tabla 1.1. Sintaxis boolean nextboolean() byte nextbyte() double nextdouble() int nextint() long nextlong() float nextfloat() short nextshort() String nextline() Descripción del resultado Devuelve el booleano leído del teclado. Devuelve el byte leído del teclado. Devuelve el número real leído del teclado. Devuelve el número entero leído del teclado. Devuelve el número entero grande leído del teclado. Devuelve el número real grande leído del teclado. Devuelve el número entero pequeño leído del teclado. Devuelve la cadena leída del teclado. Tabla 1.1: Algunos métodos de la clase Scanner

12 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS Si se desea usar métodos de clases definidas en cualquier paquete de Java se deben llamar con la sintaxis: NombreDePaquete.NombreDeClase.NombreDeMétodo(parámetros). Una forma abreviada de hacerlo es incluir, al principio del archivo (fuera de la clase), la instrucción import NombreDePaquete.*; Ejemplo import java.util.*; y luego ya se puede usar el método como si estuviera definido en esa clase, es decir sólo basta especificar su nombre y parámetros. Cabe destacar que la instrucción import no copia el código, sólo avisa al compilador en donde buscar. A continuación se muestra la implementación del algoritmo. import java.util.scanner; // 0 /** * Programa para enviar una felicitación personalizada. * Objetivo Mostrar cómo se crean y usan objetos de distintas clases. * @author Amparo López Gaona * @version Noviembre 2010 */ public class FelicitacionPersonalizada { public static void main (String [] pps) { Scanner in = new Scanner(System.in); // 1 String nombre; // 2 System.out.println("Dame tu nombre "); // 3 nombre = in.nextline(); // 4 System.out.print(" Felicidades "+ nombre+ "! "); // 5 System.out.println("Has escrito tu primer programa en Java"); // 6 En la línea 1 de este programa se crea un objeto de la clase Scanner. En este caso, y a lo largo de todo el libro, se le pasará como parámetro al momento de crear el lector el objeto System.in. Para poder crearlo, se debe avisar al compilador que se va a utilizar el paquete en donde está está clase por esta razón es indispensable empezar el programa con la línea cero que tiene la instrucción import java.util.scanner; En la línea 2, se crea una referencia a un objeto de la clase String que contendrá el nombre del usuario de programa. Esta clase la proporciona Java, en el paquete java.lang. No es necesario incluir explícitamente este paquete. Notar que entre las declaraciones y las instrucciones se deja una línea en blanco esto es para facilitar la lectura. En la línea 3, se pide al usuario que proporcione su nombre. Si no se incluyera esta instrucción, el usuario no sabría que hacer y la ejecución del programa quedaría detenida pues se trataría de realizar la instrucción de lectura pero como el usuario no sabe que tiene que teclear algo se queda en espera de algún resultado.

1.4. EJEMPLOS DE TRABAJO CON OBJETOS 13 En la línea 4, se lee el nombre del usuario mediante la llamada al método nextline de la clase Scanner, el resultado de este método (que es la referencia a una cadena) se almacena en la variable nombre. Recordar que es importante almacenar el resultado de la llamada a un método en una variable de tipo correspondiente para poder hacer uso de ese valor posteriormente. Al ejecutar la línea 5, se imprime la felicitación seguida del nombre del usuario. Para ello se utiliza el operador + con cadenas de caracteres como se vio en la sección??. A continuación un ejemplo de ejecución de este programa: Dame tu nombre Andrea Felicidades Andrea! Has escrito tu primer programa en Java En este programa se puede apreciar cómo es posible tener varios objetos y estos objetos pueden ser de clases diferentes. La clase String tiene métodos para comparar cadenas, buscar subcadenas, extraer subcadenas, crear una copia de una cadena, convertirla a minúsculas o mayúsculas, entre otros. Algunos de ellos se muestran en la tabla 1.2. Sintaxis charat(int) equals(string) indexof(string) length() substring(int, int) tolowercase() touppercase() trim() Descripción del resultado Devuelve el caracter de la posición indicada. Devuelve true si la cadena pasada como parámetro es igual a la cadena que llama al método. Devuelve false en caso contrario. Devuelve la posición en donde empieza la subcadena pasada como parámetro. Devuelve la cantidad de caracteres que tiene la cadena. Devuelve la cadena formada por los caracteres que están desde la posición indicada en el primer parámetro hasta uno antes de la indicada en el segundo parámetro. Devuelve la cadena en minúsculas. Devuelve la cadena en mayúsculas. Devuelve la cadena sin espacios en blanco al final. Tabla 1.2: Métodos de la clase String Para la descripción completa de todos los métodos de esta clase consultar la dirección http://download.oracle.com/javase/1.4.2/docs/api/java/lang/string.html Ejemplo 1.7. Programa para conversión de nombres. El programa debe leer del teclado el nombre completo de una persona separando con una coma el nombre de los apellidos y mostrarlo en el formato: apellido materno, apellido paterno, nombre.

14 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS 1. Encontrar los objetos principales. Sustantivos: programa, teclado, nombre completo, persona, coma, nombre, apellidos, formato, apellido materno, apellido paterno. En este caso, como en los dos anteriores sólo se tienen objetos para interactuar con el usuario y cadenas para leer y manipular los nombres. 2. Definir escenario. (a) El programa solicita al usuario un nombre completo en un formato especial. (b) El usuario teclea el nombre completo separando con una coma el nombre de los apellidos. (c) El programa lee el nombre tecleado y lo almacena en un objeto de la clase String. (d) El programa extrae cada elemento del nombre. (e) El programa acomoda los elementos del nombre de acuerdo al formato deseado. (f) El programa muestra el nombre en el nuevo formato. import java.util.scanner; /** * Programa para convertir nombres de persona de un formato a otro * Objetivo Trabajar con objetos de la clase String. * @author Amparo López Gaona * @version Noviembre 2010 */ public class ConvertidorNombres { public static void main (String [] pps) { Scanner in = new Scanner(System.in); String nombrecompleto = new String(); String nombre, apaterno, amaterno; System.out.println("Dame el nombre completo de una persona."); System.out.println("Separando el nombre de los apellidos con una coma"); nombrecompleto = in.nextline(); // Elimina blancos al final de la línea nombrecompleto = nombrecompleto.trim(); int posición = nombrecompleto.indexof(","); //Busca la coma nombre = nombrecompleto.substring(0, posición); nombrecompleto = nombrecompleto.substring(posición+2,nombrecompleto.length()); posición = nombrecompleto.indexof(" "); //Busca el primer blanco de la línea

1.4. EJEMPLOS DE TRABAJO CON OBJETOS 15 apaterno = nombrecompleto.substring(0, posición); nombrecompleto = nombrecompleto.substring(posición+1); amaterno = nombrecompleto; String nombrenuevo = amaterno + " " + apaterno + " " + nombre; System.out.println("("+nombreNuevo+ ") en el formato solicitado."); Notar que para extraer los dos primeros elementos se extrae la cadena desde la posición inicial hasta donde se encuentra el delimitador, que en el primer caso es una coma y, en el segundo un espacio en blanco. Ejemplo 1.8. Programa para jugar a los volados con la computadora. El juego de volados es un juego entre dos personas, una de ellas lanza una moneda al aire y la otra trata de adivinar la cara que estará visible al caer la moneda al suelo. La cara puede ser águila o bien sol. Si acierta gana y si no es el caso pierde. En este caso el lugar de la persona que lanza la moneda será tomado por la computadora. 1. Encontrar los objetos principales. Sustantivos: juego, persona, jugador, moneda, aire, cara, suelo, computadora. Juego, es lo que se quiere programar. Persona y jugador son sinónimos y se refieren al usuario del programa. Computadora es con quién se va a jugar. Aire y suelo están relacionados con el juego físicamente, no se van a programar como clases. Cara es atributo de la moneda. Tanto águila como sol son valores de la cara de la moneda. Así que el único objeto que se requiere es una moneda y aunque no se especifica, implícitamente en la definición del problema están objetos para interactuar con el usuario. 2. Determinar el comportamiento deseado. Verbos: lanzar la moneda, cara de la moneda que estará visible, caer la moneda. Estos son métodos de la clase Moneda como se puede deducir de la definición del problema. 3. Definir escenario. (a) El programa da al usuario la bienvenida y le solicita predicción (águila o sol). (b) El programa lee la predicción del usuario. (c) El programa lanza la moneda.

16 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS (d) El programa muestra la cara visible de la moneda. (e) El programa determina el ganador. Se puede asumir que ya existe la clase Moneda con un método lanzar que devuelve la cadena aguila si cae águila y sol en otro caso. El algoritmo descrito en el escenario, se presenta en las siguientes líneas de programa. import java.util.scanner; /** * Programa para que el usuario juegue volados con la computadora. * Objetivo Mostrar cómo se crean y usan objetos de distintas clases. * @author Amparo López Gaona * @version Noviembre 2010 */ public class Volados { static public void main (String [] pps) { Moneda centenario = new Moneda(); //Declaración de variables Scanner in = new Scanner(System.in); String nombre, pidio, cayo; System.out.print("Dame tu nombre "); // Solicita nombre del jugador nombre = in.nextline(); // Solicita predicción System.out.print(nombre+ ", qué pides: águila o sol? "); pidio = in.nextline(); // Lee predicción pidio = pidio.tolowercase(); // La pasa a minúsculas pidio = pidio.trim(); cayo = centenario.lanzar(); System.out.println("Cayó " + cayo); // Lanza la moneda // Muestra lo que cayó En las primeras líneas del método main se crean los objetos que se requerirán en el programa. Éstos son: un objeto de la clase Moneda, es el objeto con el que se jugará; un objeto de la clase Scanner con el propósito de que permita al programa enterarse de la predicción del usuario, en cuanto a la cara que mostrará la moneda al caer; un objeto de la clase String para almacenar el nombre del jugador; dos variables más de tipo String, una para saber con qué cara pensó el usuario que caería la moneda y la otra para almacenar el valor con el que realmente cayó. Se solicita al jugador su nombre; se lee este nombre y se almacena en la cadena referenciada por la variable nombre. Se imprime el nombre del jugador seguido de la solicitud para que

1.4. EJEMPLOS DE TRABAJO CON OBJETOS 17 especifique lo que elige. Por ejemplo, Andrea, que pides: aguila o sol?. El jugador debe escribir una cadena con su petición. Se lee la selección del usuario, enviando el mensaje nextline al objeto in de la clase Scanner. Este método devuelve la línea (cadena) tecleada por el usuario. La respuesta al mensaje se almacena en la variable pidio convertida a minúsculas y sin espacios en blanco después de la última letra. Se simula el lanzamiento al aire de la moneda, mediante el mensaje lanzar al objeto centenario de la clase Moneda. Este método no requiere argumentos y devuelve una cadena; ésta puede ser aguila si cae águila o bien sol si cae sol. El resultado de este método se almacena en la variable cayo. Se muestra lo que cayó, mediante la instrucción System.out.println que recibe como parámetro la cadena "Cayó "+ cayo. Notar que la explicación dada al programa es prácticamente la misma que se puede leer con los comentarios del mismo. Es un ejemplo de la importancia de los comentarios adecuados. Si el programa termina aquí, el usuario puede saber si ganó o perdió de acuerdo al resultado del programa. Sin embargo, para evitar trampas se solicitó que el programa determine el ganador. Para poder hacerlo se requiere de una instrucción que permita verificar si el valor solicitado y el que cayó son iguales o no. En el capítulo anterior se presentaron las expresiones condicionales, y lo que se requiere en este punto es una expresión que compare pidio con cayo y de acuerdo al resultado de esta comparación ejecute cierta acción. Es decir, se requiere una instrucción condicional, la instrucción if cuya sintaxis y semántica se explican a continuación. La instrucción condicional if tiene la siguiente sintaxis: empieza con la palabra reservada if seguida de una expresión booleana, denominada condición, entre paréntesis; luego un bloque de instrucciones que se ejecutan cuando la evaluación de la condición es verdadera, tal y como se muestra a continuación. if (condición) bloque1 Un bloque es un conjunto de instrucciones agrupadas con un par de llaves ({) con el propósito de ser tratadas como unidad. Dentro de un bloque puede haber otros bloques. La convención de Java especifica que la llave de inicio del bloque se pone al final de la instrucción que lo contendrá, en este caso la instrucción if. Las instrucciones dentro del bloque llevan un nuevo margen de alineación y la llave que cierra el bloque va alineada al mismo nivel que la instrucción donde se abre el bloque. Las instrucciones contenidas en el bloque de la instrucción if se ejecutarán siempre y cuando el resultado de la evaluación de la condición sea true, en caso contrario se ignoran. Otra forma de la instrucción if es la siguiente:

18 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS if (condición) bloque1 else bloque2 La instrucción condicional if ejecuta sólo uno de los dos bloques de instrucciones incluidos en ella de acuerdo al resultado de la evaluación de la condición, si la condición devuelve el valor true se ejecuta sólo el bloque1 y en caso de devolver false se ejecuta sólo el bloque2; nunca se ejecutan ambos bloques. En ambos casos de instrucción if, la ejecución del programa continúa después de la instrucción if. Así para que el programa determine y muestre si el jugador ganó o perdió, antes de terminar el programa anterior se debe incluir la siguiente instrucción condicional: if (pidio.equals(cayo)) { System.out.println(nombre + ", ganaste :) "); else { System.out.println(nombre + ", perdiste :("); El significado de la instrucción es que si el valor de la variable pidio es igual al de la variable cayo el jugador acertó en su predicción y por lo tanto ganó, que es el mensaje que se envía, en caso contrario perdió. Es decir, sólo puede ganar o perder pero no ambas cosas y se determina cuál de estas situaciones se presenta de acuerdo a la evaluación de la condición. Para comparar dos cadenas no se utiliza el operador == visto en el capítulo anterior, se utiliza el método equals como se especificó en la tabla 1.2. En el siguiente capítulo se explica la razón. En el programa 1.8 qué sucede si el usuario proporciona una cadena distinta de aguila y de sol? El programa funcionará, en este caso con un valor que nunca será igual al resultado del volado, este es un comportamiento incorrecto. En el capítulo?? se resaltó la importancia de desarrollar programas robustos (programas que hacen lo que se desea que hagan y funcionen a prueba de errores), el programa anterior no lo es porque no se está asegurando que el usuario teclee sólo las cadenas permitidas, él puede teclear cualquiera. Para evitar que el programa trabaje con cualquier cadena es necesario verificar el dato leído y en caso de que no sea un valor que se encuentre dentro del conjunto de valores permitidos avisarle al usuario del problema y terminar. Para programar esto se requiere de una instrucción condicional como la siguiente: if (pidio.equals("aguila") pidio.equals("sol")) { // Jugar else { //Enviar mensaje indicando el error

1.4. EJEMPLOS DE TRABAJO CON OBJETOS 19 En la condición de la instrucción if anterior se asegura que se puede jugar sólo en caso de que el usuario haya tecleado una cadena correcta independientemente de si lo hace con mayúsculas o minúsculas debido a que antes ésta se convirtió a minúsculas. Ejemplo 1.9. Programa completo y robusto para jugar volados con la computadora. import java.util.scanner; /** * Programa para que el usuario juegue volados con la computadora. * Objetivo Mostrar cómo se crean y usan objetos de distintas clases. * @author Amparo López Gaona * @version Noviembre 2010 */ public class Volados { static public void main (String [] pps) { Moneda centenario = new Moneda(); //Declaración de variables Scanner in = new Scanner(System.in); String nombre, pidio, cayo; System.out.print("Dame tu nombre "); // Solicita nombre del jugador nombre = in.nextline(); // Solicita predicción System.out.print(nombre+ ", qué pides: águila o sol? "); pidio = in.nextline(); // Lee predicción pidio = pidio.tolowercase(); // La pasa a minúsculas pidio = pidio.trim(); cayo = centenario.lanzar(); System.out.println("Cayó " + cayo); // Lanza la moneda // Muestra lo que cayó if (pidio.equals("aguila") pidio.equals("sol")) { cayo = lasuertuda.lanzar(); //Elección válida. Juega System.out.println("Cayo " + cayo); if (pidio.equals(cayo)) System.out.println(nombre + ", ganaste :) "); else System.out.println(nombre + ", perdiste :("); else // Elección incorrecta. System.out.println("Sólo puedes pedir águila o sol. Así no juego."); En este programa se puede observar que en el bloque de la instrucción if puede haber instrucciones de cualquier tipo incluso otra(s) instrucción condicional. La forma de funcionar

20 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS en este ejemplo es la siguiente: si el usuario no tecleo una cadena correcta se envía el mensaje de error Sólo puedes pedir águila o sol. Así no juego. En otro caso, se lanza la moneda y se determina al ganador. Ejemplo 1.10. Programa que determina entre tres jugadores quién tiene el número mayor al lanzar un dado. En este juego se requieren tres jugadores, cada uno lanza el dado y gana el jugador cuya cara superior del dado haya tenido el valor más alto. Si los tres valores son iguales gana el primer jugador. 1. Encontrar los objetos principales. Sustantivos: jugador, número mayor, dado, valor. Jugador es el usuario del programa; número mayor es valor que calculará el programa. Dado es el objeto principal pues tiene estructura y comportamiento que se utilizará en el programa. Valor es atributo del dado. 2. Determinar el comportamiento deseado (responsabilidades). Para el dado el comportamiento esperado es poder lanzarlo y que muestre el valor de su cara superior. 3. Definir escenario. (a) El programa solicita el nombre a cada jugador. (b) El programa recaba los nombres. (c) Cada jugador lanza el dado. (d) El programa determina el valor más alto. (e) El programa avisa quién es el ganador. /* * Programa que determina el mayor de tres valores de un dado, al ser lanzado * cada vez por un jugador distinto. * Objetivo: ilustrar el uso de condicionales * @author Amparo López Gaona * @version Noviembre 2010 */ import java.util.scanner; class MayorValor { public static void main (String [] pps) { Dado midado = new Dado(); Scanner in = new Scanner(System.in);

1.4. EJEMPLOS DE TRABAJO CON OBJETOS 21 int mayor; int valor1, valor2, valor3; String nombre1, nombre2, nombre3; //Valor del dado en cada tirada. //Nombre de los jugadores //Pedir el nombre de cada jugador. System.out.println("Dame el nombre del primer jugador"); nombre1 = in.nextline(); System.out.println("Dame el nombre del segundo jugador"); nombre2 = in.nextline(); System.out.println("Dame el nombre del tercer jugador"); nombre3 = in.nextline(); //Cada jugador lanza el dado. valor1 = midado.lanzar(); valor2 = midado.lanzar(); valor3 = midado.lanzar(); // Avisa qué valor le cayó a cada jugador. System.out.println(nombre1 + " tienes un "+valor1); System.out.println(nombre2 + " tienes un "+valor2); System.out.println(nombre3 + " tienes un "+valor3); // Determina el valor mayor.... // Avisa cuál es el valor mayor. in.println("\n el mayor valor es "+ mayor); Primero se declaran las variables necesarias en este programa: un dado, un objeto lector, variables para almacenar el nombre de cada jugador y otras para almacenar el valor de cada tirada. Una vez solicitado el nombre de cada jugador, se lanza el dado y se almacena el valor de la cara superior en una variable entera distinta. Para determinar el valor mayor lo primero que se ocurre es utilizar una condición como la siguiente: valor1 > valor2 > valor3 pero esto no es posible porque la expresión se evalúa de izquierda a derecha comparando primero valor1 > valor2, el resultado de esta comparación es un valor booleano (true o false), que no puede luego ser comparado con el valor de la variable valor3; se estaría preguntando false > valor3. Existen varias formas para determinar el valor mayor entre tres valores. Una forma consiste en determinar el mayor entre el valor1 y el valor2 y luego encontrar el mayor entre el valor3 y el mayor de los dos anteriores como se muestra a continuación: if (valor1 > valor2) {

22 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS mayor = valor1; else { mayor = valor2; if (valor3 > mayor) { mayor = valor3; En este caso, con la primera instrucción if se determina el mayor entre las variables valor1 y valor2 y se almacena en la variable mayor, luego se compara éste con el valor de la tercera variable (valor3). Si se cumple la condición de la segunda instrucción if la tercera variable tiene el valor mayor y se almacena éste en la variable mayor, y si no se cumple la condición, no se hace nada porque antes ya se había almacenado el valor mayor en la variable mayor que no se modifica. Otra forma de determinar el valor más alto es utilizar el siguiente código: if (valor1 > valor2 && valor1 > valor3) { mayor = valor1; else { if (valor2 > valor1 && valor2 > valor3) { mayor = valor2; else { mayor = valor3; con lo cual se compara el valor de la primera tirada con el de las otras dos para determinar si es la mayor, pero se hace en dos pasos: primero se compara el valor de la primera tirada con el de la segunda. Si es mayor, luego se compara ese mismo valor con el de la tercera tirada. Esta última comparación no se efectúa si la primera tirada tiene valor menor que la segunda, debido a la propiedad de corto circuito mencionada en el capítulo anterior. Si la evaluación de la condición anterior arroja el valor true se sabe que el primer jugador tiene el valor más alto y termina esta instrucción. Si no es el caso, entonces es necesario comparar el valor de la tirada del segundo jugador con las otras dos, si es mayor entonces ésta es la mayor y si no, la mayor es la tercera. En este ejemplo, se tiene que la instrucción de la cláusula else de la instrucción condicional if, es a su vez otra instrucción condicional if. Cuando alguno de los bloques de la instrucción if es a su vez otra instrucción if se tiene anidamiento de instrucciones condicionales if, con lo cual se permite tener una condición después de haber tomado una decisión mediante otra condición. Si en lugar de tener el código como se mostró anteriormente se tuviera el siguiente, en el que se elimina el último else:

1.5. EJERCICIOS 23 if ( valor1 > valor2 && valor1 > valor3) { mayor = valor1; else { if (valor2 > valor1 && valor2 > valor3) { mayor = valor2; mayor = valor3; siempre se almacenaría en mayor el valor que obtuvo el tercer jugador, cosa que es incorrecta desde el punto de vista lógico, no desde el sintáctico. Es decir, se tendría un programa que compila, pero que arroja un resultado incorrecto en la mayoría de los casos. Como puede apreciarse, la alineación de las instrucciones es solamente para facilitar la legibilidad del código no para influir en en la ejecución de las instrucciones. Ejemplo 1.11. Ahora se desea saber no sólo el valor sino cuál jugador lo obtuvo. El cambio que se tiene que hacer al programa es conservar el nombre del jugador, esto se logra declarando una variable de tipo String llamada ganador y modificando las condicionales como sigue: if (valor1 > valor2) { mayor = valor1; ganador = nombre1; else { mayor = valor2; ganador = nombre2; if (mayor < valor3) { mayor = valor3; ganador = nombre3; y al avisar cuál es el valor mayor se incluye el nombre del ganador como sigue: System.out.println("El ganador es "+ ganador + " con un valor de "+ mayor); 1.5 Ejercicios 1. Describir en que difiere una variable para un tipo primitivo de una variable para referencias. 2. Describir en que difiere un tipo primitivo de una clase.

24 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS 3. Responder a las siguientes preguntas con verdadero o falso: (a) Es posible que con una variable se haga referencia a más de un objeto a la vez? (b) Es posible que con una variable se haga referencia a más de un objeto en diferentes momentos? (c) Es posible tener varias referencias a un mismo objeto al mismo tiempo? (d) Es posible crear objetos sin utilizar el operador new? 4. En cada una de las siguientes columnas, que representan una porción de código, especificar cuántos objetos hay, además de cuántas y cuáles referencias tiene cada uno. Objeto t, s; Objeto t, s; Objeto t, s; t = new Objeto(); t = new Objeto(); t = new Objeto(); s = t; s = t; s = new Objeto(); t = null; 5. Es correcto el siguiente código para intercambiar dos valores? Porqué? public class Duda{ public static void main (String[] pps) { int x = 25, y = 18; // Intercambia x con y y = x; x = y; System.out.println("Ahora x = " + x + " y = " + y); 6. Dada la siguiente instrucción: if ((valornuevo >= 0) && (valornuevo < límite)) { valor = valornuevo; (a) Indicar cuál es el rango de valores válidos para asignar el valor de valornuevo a la variable valor. (b) Indicar el rango de valores si se sustituye el operador >= de la condición por el operador >. (c) Indicar el rango de valores permitidos si se sustituye el operador && de la condición por el operador.

1.5. EJERCICIOS 25 7. Es correcto el siguiente código para encontrar el mayor de tres valores? Por qué? if (valor1 > valor2 && valor1 > valor3) { mayor = valor1; if (valor2 > valor1 && valor2 > valor3) { mayor = valor2; else { mayor = valor3; 8. En el programa del ejemplo 1.9 hacer los cambios necesarios para que se determine no sólo el ganador sino también quién queda en segundo lugar y quién en tercero. 9. Qué hace el siguiente programa? class UsoDeCadenas{ public static void main (String [] pps) { String frase = "Una mosca parada en la pared"; System.out.println("La frase :\"" + frase + "\" tiene "+ frase.length() + " letras"); System.out.println("Extraje la palabra :" + frase.substring(4,10)); String otra =frase.touppercase().replace( E, A ).replace( I, A ); otra = otra.replace( O, A ).replace( U, A ); System.out.println("En mayúsculas y con A: "+otra); otra = otra.replace( A, O ).tolowercase(); System.out.println("Ahora en minúsculas y con o: "+otra); String larga =frase.concat(" roja"); System.out.println(larga + "\n"+ frase); 10. Escribir un programa para rotular sobres de cartas dirigidas a James Bond, con la siguiente dirección: J. Bond "Agente 007" Apt. #645 N.Y. USA.

26 CAPÍTULO 1. CREACIÓN Y USO DE OBJETOS 11. Escribir un programa que modele un psiquiatra. El programa debe preguntar al usuario, que tomará el papel de paciente, cuál es su problema. Con la respuesta debe preguntar por qué y después de su respuesta decir Muy interesante, hablaremos de ello con más detalle en la siguiente sesión. Por ejemplo: Cómo se encuentra? Estoy deprimido. Porqué dice estoy deprimido? No dije que usted estuviera deprimido; dije que yo estoy deprimido Muy interesante, hablaremos de ello con más detalle en la siguiente sesión. 12. Escribir un programa para calcular el RFC de una persona. El RFC se obtiene tomando las dos primeras letras del apellido paterno, la inicial del apellido materno y la inicial del nombre, seguido de los dos dígitos finales del año de nacimiento, los dos dígitos del mes de nacimiento y dos dígitos para el día de nacimiento. Por ejemplo, si la persona se llama Andrea López López y nació el 14-04-1992, su RFC es lola920414. 13. Escribir un programa para que jueguen disparejos entre tres jugadores, uno de ellos es la computadora. El juego consiste en que cada jugador lanza su moneda al aire y gana el jugador cuya cara visible de la moneda sea distinta de la cara visible de cada una de las otras dos monedas. 14. Escribir un programa que juegue dados con las siguientes reglas: se tiran dos dados y se suma el valor de la cara superior de cada uno. Si la suma es 7 u 11 el jugador gana. Si la suma es 2, 3 ó 12 el jugador pierde. Si la suma es 4, 5, 6, 8, 9 ó 10, ésta se convierte en los puntos del jugador quien, para ganar, debe volver a tirar los dados si la suma de esta tirada más lo acumulado da un total de 11 puntos gana, en otro caso pierde.