Está en la página 1de 38
Principales conceptos que se abordan en este capitulo: @ campos ™@ métodos (de acceso y de modificacién) @ constructores ® asignacién y sentencia condicional m parémetros Construcciones Java que se abordan en este capitulo campo, constructor, comentario, parémetro, asignacién (=), bloque, sentencia return, void, operadores de asignacién compuestos (+ =,- =), sentencia if En este capitulo nos internamos por primera vez en el cédigo fuente de una clase. Dis cutiremos sobre los elementos bisicos de las definiciones de una cl tructores y métodos. Los métodos contienen sentencias, ¢ inicialmente vemos métodos que s6lo contienen sentencias aritméticas sencillas y sentencias de impresién. Mas ade- lante introducimos las sentencias condicionales que permiten realizar elecciones entre las diferentes acciones que llevan a cabo los métodos. e: campos, cons Comenzaremos examinando un nuevo proyecto que contiene una cantidad adecuada de detalle. Este proyecto representa una implementacién simplificada de una maquina expendedora de boletos automatizada, Cuando empecemos a introducir la mayoria de las caracteristicas basicas de las clases, encontraremos rapidamente que esta implemen- tacién es deficiente de diversas maneras, de modo que luego procederemos a describir una versién mas sofisticada de la maquina expendedora de boletos, que representa una mejora significativa de la misma. Finalmente, y con el objetivo de reforzar los c ceptos introducidos en este capitulo, daremos una mirada al interior del ejemplo curso- de-laboratorio que ya encontramos en el Capitulo | Maquina expendedora de boletos Las estaciones de tren a menudo tienen maquinas que imprimen un boleto cuando un cliente introduce en ella el dinero correspondiente a su tarifa. En este capitulo defini- remos una clase que modela algo similar a estas maquinas. Como estaremos entrando en el interior de nuestras primeras clases de ejemplo en Java, para comenzar manten- lel) Capitulo 2 ll Comprender las definiciones de clases dremos nuestra simulacién lo suficientemente simple, lo que nos dard la oportunidad de hacer algunas preguntas sobre cémo estos modelos difieren de las versiones del mundo real y cémo podriamos cambiar nuestras clases para que los objetos que ellas crean se parezcan mas a las cosas reales. Nuestras maquinas trabajan con clientes que introducen dinero en ella y luego le soli- citan que imprima un boleto. La maquina mantiene un registro de la cantidad de dinero que ha recaudado durante todo su funcionamiento. En la vida real, es frecuente que la maquina expendedora de boletos ofrezca un conjunto de boletos de diferentes tipos y los clientes escogen entre ellos, slo el que desean, Nuestra maquina simplificada imprime sélo boletos de un nico precio, Resulta significativamente mas complicado programar una clase que sea capaz de emitir boletos de diferentes valores que si tienen un nico precio, Por otra parte, con programacién orientada a objetos es muy facil crear varias instancias de la clase, cada una con su propio precio, para cumplir con la necesidad de diferentes tipos de boletos Explorar el comportamiento de una maquina expendedora de boletos ingenua Abra en BlueJ el proyecto maquina-de-boletos-simple. Este proyecto contiene sélo una clase, MaquinaDeBoletos, que podra explorar de manera similar a los ejem- plos discutidos en el Capitulo 1. Cuando cree una instancia de MaquinaDeBoletos, le pedir que ingrese un mimero que corresponde al precio de los boletos que emi- tira esta maquina en particular. Este nimero refleja la cantidad de centavos del preci por lo que resulta apropiado como valor para trabajar un mimero entero positivo, por ejemplo 500. Ejercicio 2.1 Cree un objeto MaquinaDeBoletos en el banco de objetos y ‘observe sus métodos. Podra ver los siguientes métodos: obtenerSaldo, obte- nerPrecio, ingresarDinero e imprimirBoleto. Pruebe el método obte- nerPrecio. Vera un valor de retorno que contiene el precio de los boletos que se determiné cuando se creé este objeto. Use el método ingresarDinero para simular que coloca una cantidad de dinero en la maquina y luego use obtenerSaldo para controlar que la maquina registré la cantidad introducida. Puede ingresar sucesivamente varias cantidades de dinero en la maquina, como si colocara varias monedas 0 billetes en una maquina real. Pruebe ingresar la cantidad exacta de dinero requerida para un boleto. Como esta es una maquina simplificada, el boleto no se imprimir automaticamente, de modo que una vez que haya ingresado dinero suficiente, llame al método imprimirBoleto. Se emitiré en la ventana terminal de BlueJ un facsimil del boleto. Ejercicio 2.2 ;Qué valor aparece si controla el saldo de la maquina después de que se imprimié el boleto? jercicio 2.3 Experimente ingresando diferentes cantidades de dinero antes de emitir los boletos. {Observa algo extrafio en el comportamiento de la maquina? {Qué ocurre si ingresa demasiado dinero en la maquina? 2Recibe algun reintegro? {Qué ocurre si no coloca dinero suficiente y luego prueba emitir un boleto? Figura 2.4 Ventana del editor de Blue 2.2 Examinar una definicion de clase 241 Ejercicio 2.4 Trate de comprender bien el comportamiento de la maquina interactuando con ella en el banco de objetos antes de comenzar a ver como esta implementada la clase MaquinaDeBoletos en la proxima seccién, Ejercicio 2.5 Cree otra maquina que opere con boletos de un precio dife- rente. Compre un boleto a esta maquina. El boleto que emite, gtiene un aspecto diferente de! anterior? Examinar una definicion de clase EI examen del comportamiento de los objetos MaquinaDeBoletos en Blued revela que s6lo se comportan de la manera que esperamos si ingresamos la cantidad exacta de dinero que corresponde al precio de un boleto. Podremos comenzar a ver por qué ocurre esto, cuando exploremos los detalles internos de la clase en esta seccién. Entre al cédigo de la clase MaquinaDeBoletos haciendo doble clic sobre su icono en el diagrama de clases. Veri algo similar a la Figura 2.1 FEC srt ‘Cass Edt Tools Options + Taupien aSwMe que 10 USUAETOS INgresan Canciaades que-crenen-sencia0- * Qeuthor David J. Barnes and Michael Kolling * Qversion 2006.03.30 " public cless MaquinaDeBoletos | private int precio ; private int saldo; private int total: ee * Crea une méquina que vende boletos de un determinado precio. * Observe que el precio debe ser mayor que cero y que no hay * controles que aseguren esto. ” public MaquinaDeBoletos (int precioDelBoleto) precioDelBoleto; El texto completo de la clase se muestra en Cédigo 2.1. Viendo el texto de la defini- cin de la clase parte por parte podremos analizar algunos de los conceptos de orien- tacién a objetos sobre los que hemos hablado en el Capitulo 1. 22 Capitulo 2 lm Comprender las definiciones de clases Codigo 2.1 La clase MaquinaDeBoletos jee af MaquinaDeBoletos modela una méquina de boletos simplificada e ingenua que trabaja con boletos de tarifa plana. El precio de un boleto se especifica mediante el constructor. Es una maquina ingenua en el sentido de que confia en que los usuarios introducen la cantidad de dinero necesaria antes de imprimir un boleto. También asume que los usuarios ingresan cantidades que tienen sentido. @author David J. Barnes and Michael Kolling @version 2006.03.30 public class MaquinaDeBoletos { // El precio de un boleto de esta maquina. private int precio ; J/ La cantidad de dinero ingresada hasta ahora por un cliente. private int saldo; // La cantidad total de dinero recolectada por esta maquina. private int total; ys * Crea una maquina que vende boletos de un determinado precio. * Observe que el precio debe ser mayor que cero y que no hay * controles que aseguren esto. of public MaquinaDeBoletos(int precioDelBoleto) { precio = precioDelBoleto; saldo = 0; total = 0; + ys * Devuelve el precio de un boleto. oie public int obtenerPrecio() { return precio; ye Cédigo 2.1 (continuacion) La clase MaquinaDeBoletos 2.3 Campos, constructores y métodos. 23 * Devuelve la cantidad de dinero que ya se ingresé para * el siguiente boleto. th public int obtenerSaldo() { return saldo; } ie * Recibe del cliente una cantidad de dinero en centavos. aH public void ingresarDinero(int cantidad) { saldo = saldo + cantidad; + eed * Imprime un boleto. * Actualiza el total de dinero recolectado y * pone el saldo en cero. os public void imprimirBoleto() { // Simula 1a impresién de un boleto. System.out.print1n ("###HHHHEHHHRHRHHHE® ) 5 System.out.print1n("# Linea Blue "); System.out.print1n("# Boleto"); System.out.println("# " + precio + " cvos."); System.out.print1n ("#HHHHHHHHHEHHAH HHH” ) 5 System. out.print1n(); J] Actualiza el total recaudado con el saldo. total = total + saldo; // Limpia el saldo. saldo = 0; + Campos, constructores y métodos El cédigo de la mayoria de las clases puede descomponerse en dos partes principales: una envoltura exterior pequefia que simplemente da nombre a la clase y una parte interna mucho més grande que hace todo el trabajo. En este caso, la envoltura exte- rior es la siguiente: public class MaquinaDeBoletos { } La envoltura exterior de las diferentes clases es muy parecida, su principal finalidad es proporcionar un nombre a la clase. Se omite la parte interna de la clase Cédigo 2.2 Nuestro orden de campos, constructores y métodos Capitulo 2 ll Comprender las definiciones de clases Ejercicio 2.6 Escriba la envoltura exterior de las clases Estutiante y Cur- soDeLaboratorio tal como piense que deberian ser, no se preocupe por la parte interna. Ejercicio 2.7 {Tiene importancia si escribimos public class MaquinaDeBoletos ° class Public MaquinaDeBoletos en la parte exterior de la clase? Edite el cédigo de la clase MaquinaDeBoletos para probar las dos formas anteriores y cierre la ventana del editor. gObserva algtin cambio en el diagrama de clases? Qué mensaje de error aparece cuando presiona el bot6n Compile? gConsidera que este mensaje explica claramente cual es el error? Ejercicio 2.8 Verifique si es posible quitar la palabra public de la parte exte- rior de la clase MaquinaDeBoletos. La parte interna de la clase es el lugar en el que definimos los campos, los construc tores y los métodos que dan a los objetos de la clase sus caracteristicas particulares y tres com- su comportamiento. Podemos resumir las caracteristicas esenciales de estos ponentes de una clase como sigue: = Los campos almacenan datos para que cada objeto los use. m Los constructores permiten que cada objeto se prepare adecuadamente cuando es creado. © Los métodos implementan el comportamiento de los objetos. En Java existen muy pocas reglas sobre el orden que se puede elegir para definir los ‘campos, los constructores y los métodos dentro de una clase. En la clase Maquina- DeBoletos hemos elegido listar primero los campos, segundo los constructores y por liltimo los métodos (Cédigo 2.2). Este es el orden que seguiremos en todos nuestros ejemplos. Otros autores eligen adoptar diferentes estilos y esto es, mayormente, una cuestién de preferencia. Nuestro estilo no es necesariamente mejor que el de otros, Sin embargo, es importante elegir un estilo y luego usarlo de manera consistente, porque de este modo las clases seran mas ficiles de leer y de comprender. public class NombreDeClase { Campos Constructores Métodos + Ejercicio 2.9 Como consecuencia de su temprana experimentacion en BlueJ con los objetos de la maquina expendedora de boletos, probablemente recuerde los nombres de algunos de los métodos, por ejemplo imprimirBoleto. Observe 2.3.1 Concepto Los campos almacenan dalos ppara que un objeto los use. Los campos tambien son ‘conocidos como variables de instancia. Cédigo 2.3 Los campos de la clase MaquinaDeBoletos 2.3 Campos, constructores y métodos 25 la definicién de clase en el Cédigo 2.1 y utilice el conocimiento que ha adqui- rido junto con la informacion adicional sobre el orden que hemos dado, para hacer una lista de los nombres de los campos, los constructores y los métodos de la clase MaquinaDeBoletos. Pista: hay un solo constructor en la clase. Ejercicio 2.10 {Observa algun aspecto del constructor que lo haga signifi- cativamente diferente de los otros métodos de la clase? Campos La clase MaquinaDeBoletos tiene tres campos: precio, saldo y total. Los campos también son conocidos como variables de instancia. Los hemos definido al comienzo de la definicién de la clase (Cédigo 2.3). Todos los campos estan asociados a los temas monetarios con los que trabaja la maquina expendedora de boleto: El campo precio almacena el precio de un boleto. El campo saldo almacena la cantidad de dinero ingresada por el usuario en la maquina antes de pedir la impresién de un boleto. = El campo total guarda un registro de la cantidad total de dinero ingresado en la maquina por todos los usuarios desde que el objeto maquina fue construido. public class MaquinaDeBoletos if private int precio; private int saldo; private int total; Se omitieron el constructor y los métodos. a Los campos son pequeflas cantidades de espacio dentro de un objeto que pueden usarse para almacenar valores. Todo objeto, una vez creado, dispondra de un espacio para cada campo declarado en su clase. La Figura 2.2 muestra un diagrama que representa un objeto maquina de boletos con sus tres campos. Los campos atin no tienen valores asignados; una vez que los tengan, podemos escribir cada valor dentro de la caja que representa al campo. La notacién es similar a que se usa en Blue para mostrar los objetos en el banco de objetos, excepto que aqui mostramos un poco mais de detalle. En Bluel, por razones de espacio, los campos no se muestran en el icono del objeto, sin embargo, podemos verlos abriendo la ventana del ins- pector de objetos. Cada campo tiene su propia declaracién en el cédigo. En la definicién de la clase, arriba de cada una de estas lineas hemos agregado una linea de texto, un comentario, para beneficio de los lectores humanos: J/ £1 precio de un boleto de esta maquina. private int precio; 26 Capitulo 2 ll Comprender las definiciones de clases Figura 2.2 Un objeto de la clase MaquinaDeBoletos Se introduce una sola linea de comentario mediante los dos caracteres «//» que se escriben sin espacios entre ellos. Los comentarios mas detallados, que frecuentemente ‘ocupan varias lineas, se escriben generalmente en la forma de comentarios multilinea: Los comentarios se insertan en el codigo de una clase | comienzan con el par de caracteres «/*» y terminan con el par «*/». Hay un buen para proporcionar | ejemplo de este tipo de comentarios antes del encabezado de la clase en el Cédigo 2.1. explicaciones 2 los lectores humanos. Las definiciones de los tres campos son bastante similares: No tienen ningun electo sobre la Todas las definiciones indican que son campos privados (private) del objeto; habla- ee eee con remos mas sobre su significado en el Capitulo 5, pero por el momento, simple- case. ‘mente diremos que siempre definimos los campos como privados. m Los tres campos son de tipo int. Esto indica que cada campo puede almacenar un niimero entero, cuestién que resulta razonable dado que deseamos que almacenen mimeros que representan cantidades de dinero en centavos. Puesto que los campos pueden almacenar valores que pueden variar a lo largo del tiempo, se les conoce como variables. El valor almacenado en un campo puede ser cambiado, si se desea. Por ejemplo, cuando se introduce mas dinero en la maquina queremos que se modifique el valor almacenado en el campo saldo. En las siguientes secciones encontraremos otras categorias de variables ademas de los campos. Los campos precio, saldo y total son todos los datos que necesita el objeto maquina para cumplir su rol de recibir dinero de un cliente, emitir boletos y mantener actualizado el total de dinero que ha sido introducido en ella. En las siguientes sec- ciones veremos como el constructor y los métodos usan estos campos para implementar el comportamiento de la maquina expendedora de boletos ingenua Ejercicio 2.11 ;De qué tipo considera que es cada uno de los siguientes campos? private int cantidad; private Estudiante representante; private Servidor host; Ejercicio 2.12 {Cudles son los nombres de los siguientes campos? private boolean vive; private Persona tutor; private Juego juego; 2.3.2 ‘Concepto Los constructores. permiten que cada objeto sea preparado adecuadamente cuando es creado, Codigo 2.4 El constructor de la clase MaquinaDeBoletos 2.3 Campos, constructores y métodos 27 Ejercicio 2.13 En la siguiente declaracién de campo que esta en la clase MaquinaDeBoletos private int precio; cTiene importancia el orden en que aparecen las tres palabras? Edite la clase MaquinaDeBoletos para probar los diferentes érdenes. Cierre el editor des- pués de cada cambio. La apariencia del diagrama de clases después de cada cambio, gle da alguna clave sobre cuales son los érdenes posibles? Verifique su respuesta presionando el botén Compile para ver si existe algin mensaje de error iAsegurese de reinstalar la version original después de sus experimentaciones! Ejercicio 2.14 {Es necesario que cada declaracién de campo siempre fina- lice con un punto y coma? Experimente una vez mas usando el editor. La regia que aprenderé aqui es muy importante, por lo que aseguirese de recordarla Ejercicio 2.15 Escriba la declaracién completa de un campo cuyo tipo es int y cuyo nombre es estado, Constructores Los constructores de una clase tienen un rol especial que cumplir: su responsabilidad es poner cada objeto de esa clase en un estado adecuado para que pueda ser usado una vez, que haya sido creado, Esta operacién se denomina inicializacién. El constructor inicializa el objeto en un estado razonable. El Cédigo 2.4 muestra el constructor de la clase MaquinaDeBoletos. Uno de los rasgos distintivos de los constructores es que tienen el mismo nombre que la clase en la que son definidos, en este caso MaquinaDeBoletos. public class MaquinaDeBoletos { ‘Se omitieron los campos yen * Crea una maquina que vende boletos de un determinado precio. * Observe que el precio debe ser mayor que cero y que no hay * controles que aseguren esto. al public MaquinaDeBoletos (int precioDelBoleto) { precio = precioDelBoleto; saldo = 0; total = 0; + Se omitieron los métodos + 28 Capitulo 2 ll Comprender las definiciones de clases Figura 2.3 Un objeto MaquinaDeBoletos después de su inicializacion (creado para boletos de 500 centavos) Los campos del objeto se inicializan en el constructor. A algunos campos, tales como saldo y total, se les puede poner un valor inicial que tenga sentido asignando un valor constante, en este caso, cero. Con otros campos, tal como ocurre con el precio del boleto, no resulta tan simple elegir este valor inicial ya que no conocemos el precio de los boletos de una maquina en particular hasta que la méquina esté cons- truida: recuerde que deseamos crear varios objetos maquina para vender boletos de diferentes precios, por lo que no sera correcto para todos los casos ningun precio ini- cial. Recordara que al experimentar en BlueJ con la creacién de objetos Maquina- DeBoletos tuvo que ingresar el costo del boleto cada vez que creaba una nueva maquina. Un punto importante para destacar aqui es que el precio de un boleto se determina, en un principio, fuera de la maquina, y luego debe ser pasado dentro del objeto maquina, En BlueJ usted decide el valor del boleto y lo ingresa en una caja de didlogo, Una tarea del constructor es recibir este valor y almacenarlo en el campo precio de la nueva maquina creada de modo que la maquina pueda recordar dicho valor sin que usted. tenga que tenerlo en mente. Podemos ver que uno de los papeles mas importantes de un campo es recordar informacién, de modo que esté disponible para un objeto durante toda la vida del mismo. La Figura 2.3 muestra un objeto maquina de boletos después de que se haya ejecutado su constructor. Los valores han sido asignados a los campos. A partir de este diagrama podemos decir que la maquina fue creada al pasar el nimero 500 como el valor del precio del boleto. En la proxima seccién hablaremos sobre cémo hace un objeto para recibir estos valores desde el exterior. Nota: en Java, todos los campos son inicializados automaticamente con un valor por defecto, si es que no estan inicializados explicitamente. El valor por defecto para los campos enteros es 0. Por lo que hablando estrictamente, podriamos tra- bajar sin asignar el valor 0 a los campos saldo y total, confiando en que el valor por defecto 0 predefinido dara el mismo resultado. Sin embargo, preferimos escribir explicitamente las asignaciones. No hay ninguna desventaja en hacer esto y sirve para documentar lo que esta ocurriendo realmente. No esperamos que el lector de la clase conozca cual es el valor por defecto y documentamos. que realmente queremos que este valor sea 0 y no que hemos olvidado ini. cializarlo. 2.4 Pasar datos mediante parémetros 29 ae Pasar datos mediante parametros La manera en que los constructores y los métodos reciben valores es mediante sus pardmetros. Recuetde que hemos hablado brevemente sobre los parametros en el Capi- tulo 1. Los parmetros se definen en el encabezado de un constructor 0 un método: public MaquinaDeBoletos (int precioDelBoleto) Este constructor tiene un solo parimetro, precioDelBoleto, que es de tipo int, del mismo tipo que el campo precio que se usar para determinar el precio del boleto. La Figura 2.4 ilustra cémo se pasan los valores mediante parametros. En este caso, un usuario de Blued ingresa un valor en la caja de didlogo cuando crea una nueva méiquina (se muestra a la izquierda), y ese valor luego es copiado dentro del parimetro precioDel- Boleto del constructor de la nueva maquina (se ilustra con la flecha A). La caja que presenta el objeto maquina de la Figura 2.4, titulada «MaquinaDeBoletos (constructor) es el espacio adicional para el objeto, que se crea solamente cuando se ejecuta el cons- tructor: lo lamaremos el espacio del constructor del objeto (0 espacio del método cuando hablemos sobre métodos en lugar de constructores, ya que la situacién es la misma). El espacio del constructor se usa para proporcionar lugar para almacenar los valores de los pardmetros del constructor (y todas las variables que vendrin mas adelante). Distinguimos entre nombres de los parimetros dentro de un constructor 0 un método, y valores de los parmetros fuera de un constructor 0 un método: hacemos referencia eee r a los nombres como pardmetros formales y a los valores como pardmetros actuales. Socsien de codigo | Por lo tanto precioDelBoleto es un parimetro formal y el valor ingresado por el en la que le variable | usuario, por ejemplo 500, es un parimetro actual. Puesto que permiten almacenar puede ser accedida. | valores, los pardmetros formales constituyen otra clase de variables. En nuestros dia- gramas, todas las variables se representan mediante cajas blancas. Concepto Figura 2.4 (A) Pasaje de parametro y (8) asignacién Un parimetro formal esta disponible para un objeto sélo dentro del cuerpo del cons- tructor 0 del método que lo declara. Decimos que el alcance de un parimetro esta res- tringido al cuerpo del constructor o del método en el que es declarado, En cambio, el alcance de un campo es toda la clase y puede ser accedido desde cualquier lugar en la misma clase. 30 Capitulo 2 ll Comprender las definiciones de clases ‘Concepto El tiempo de vida de una variable describe cuanto tiempo continuara existiendo la variable antes de ser destruida, Concepto Las sentencias de asignacin ‘almacenan el valor representado por el lado derecho de la sentencia en una variable nombrada a la izquierda, Un concepto relacionado con el alcance de una variable es el tiempo de vida de la variable. El tiempo de vida de un parimetro se limita a una sola llamada de un cons- tructor 0 método, Una vez que completé su tarea, los parimetros formales desaparecen y se pierden los valores que contienen, En otras palabras, cuando un constructor ter- mina su ejecucién, se elimina el espacio del constructor (véase Figura 2.4) junto con las variables parimetro que contiene Por el contrario, el tiempo de vida de un campo es el mismo tiempo de vida que el del objeto al que pertenece. En conclusién, si queremos recordar el costo de los boletos contenido por el parimetro precioDe1Boleto, debemos guardar su valor en algdn lugar mas persistente, esto es, en el campo precio. Ejercicio 2.16 iA qué clase pertenece el siguiente constructor? public Estudiante (String nombre) Ejercicio 2.17 {Cuantos parametros tiene el siguiente constructor y cudles son sus tipos? public Libro (String titulo, double precio) Ejercicio 2.18 ;Puede suponer de qué tipo serdn algunos de los campos de la clase Libro? :Puede asumir algo respecto de los nombres de estos campos? Asignaci6n En la seccién anterior destacamos la necesidad de almacenar el valor de corta vida de un parimetro dentro de algin lugar més permanente, un campo. Para hacer esto, el cuerpo del constructor contiene la siguiente sentencia de asignacion: precio = precioDelBoleto; Se reconocen las sentencias de asignacién por la presencia de un operador de asigna- cién, como es el signo «=» en el ejemplo anterior. Las sentencias de asignacién fun- cionan tomando el valor de to que aparece del lado derecho del operador y copiando dicho valor en una variable ubicada en el lado izquierdo, En la Figura 2.4 ilustramos esta operacién con la flecha B. La parte de la derecha se denomina una expresién: las, expresiones son cosas que la computadora puede evaluar. En este caso, la expresion consiste en una sola variable pero veremos mas adelante en este capitulo algunos ejem- plos de expresiones mas complicadas que contienen operaciones aritméticas. Una regla sobre las sentencias de asignacién es que el tipo de una expresién debe coincidir con el tipo de la variable a la que es asignada, Hasta ahora hemos encontrado tres tipos diferentes: int, String y muy brevemente, boolean. Esta regla significa que, por ejemplo, no tenemos permitido almacenar una expresién de tipo entero en una variable de tipo cadena. La misma regla se aplica también entre los parametros formales y los pardmetros actuales: el tipo de una expresién de un parimetro actual debe coincidir con el tipo de una variable parimetro formal. Por ahora, podemos decir que ambos parimetros deben ser del mismo tipo, aunque veremos en capitulos posteriores que esto ‘no es totalmente cierto. Cédigo 2.5 El método obtenerPrecio 2.6 Métodos de acceso 34 Ejercicio 2.19 Suponga que la clase Mascota tiene un campo denominado nombre de tipo String. Escriba una sentencia de asignacién en el cuerpo del siguiente constructor, de modo que el campo nombre se inicialice con el valor del parametro del constructor. public Mascota (String nombreMascota) { } Ejercicio 2.20 Desafio ,Cudl es el error en la siguiente versién del cons- tructor de la clase MaquinaDeBoletos? public MaquinaDeBoletos(int precioDelBoleto) { int precio = precioDelBoleto; saldo = 0; total = 0; + Una vez que haya resuelto el problema, pruebe esta version en el proyecto maquina-de-boletos-simple. {Compila esta version? Cree un objeto e inspec- cione sus campos. ,Observa algun error en el valor del campo precio? {Qué explicacién puede dar? Métodos de acceso La clase MaquinaDeBoletos tiene cuatro métodos: obtenerPrecio, obtener- Saldo, ingresarDinero e imprimirBoleto. Comenzaremos por ver el codigo de los métodos considerando el método obtenerPrecio (Cédigo 2.5). public class MaquinaDeBoletos { Se omitieron los campos. Se omitieron los constructores. pee * Devuelve el precio de un boleto. th public int obtenerPrecio() { return precio; + Se omitieron los restantes métodos. i Los métodos tienen dos partes: un encabezado y un cuerpo. A continuacién mostramos el encabezado del método obtenerPrecio: yee * Devuelve el precio de un boleto. 32 Capitulo 2 ll Comprender las definiciones de clases ‘Concepto Los métodos se componen de dos partes: un | encabezado y un cuerpo, 7 public int obtenerPrecio() Las tres primeras lineas conforman un comentario que describe qué hace el método. La cuarta linea es conocida también como la signatura del método'. Es importante dis tinguir entre signatura del método y declaracién de campos porque son muy parecidos. Podemos decir que obtenerPrecio es un método y no un campo porque est seguido de un par de paréntesis: «( « y »)» . Observe también que no hay un punto y coma al final de ta signatura. El cuerpo de! método es la parte restante del método, que aparece a continuacién del encabezado, Est siempre encerrado entre llaves: «{« y »}». Los cuerpos de los métodos contienen las declaraciones y las sentencias que definen qué ocurre dentro de un objeto cuando es invocado ese método. En nuestro ejemplo anterior, el cuerpo del método contiene una sola sentencia, pero veremos ripidamente muchos ejemplos en los que el cuerpo del método consta de varias lineas de declaraciones y sentencias. Cualquier conjunto de declaraciones y sentencias, ubicado entre un par de Ilaves, es conocido como un blogue. Por lo que el cuerpo de la clase MaquinaDeBoletos y los cuerpos de todos los métodos de la clase son bloques. Existen, por lo menos, dos diferencias significativas entre las signaturas del constructor MaquinaDeBoletos y del método obtenerPrecio: public MaquinaDeBoletos (int precioDelBoleto) public int obtenerPrecio() El método tiene un tipo de retorno int pero el constructor no tiene tipo de retorno, El tipo de retorno se escribe exactamente antes del nombre del método. El constructor tiene un solo parimetro formal, precioDe1Boleto, pero el método no tiene ninguno, sélo un par de paréntesis vacios. Es una regla de Java que el constructor no puede tener ningin tipo de retorno. Por otro lado, tanto los constructores como los métodos pueden tener cualquier mimero de parimetros formales, inclusive pueden no tener ninguno. En el cuerpo de obtenerPrecio hay una sola sentencia: return precio; Esta es una sentencia return y es la responsable de devolver un valor entero que coin- cida con el tipo de retorno int de la signatura del método. Cuando un método con- tiene una sentencia return, siempre es la tltima sentencia del mismo porque una vez que se ejecuté esta sentencia no se ejecutarén mas sentencias en el método. El tipo de retorno int de obtenerPrecio es una forma de prometer que el cuerpo del método hari algo que resulte finalmente un valor entero que haya sido calculado y retornado como resultado del método. Podria pensar en la llamada a un método como si fuera una manera de preguntar algo a un objeto, y el valor de retorno del método seria la respuesta del objeto a dicha pregunta. En este caso, cuando se invoque el método obtenerPrecio de una maquina de boletos, la pregunta equivalente es, cual es el costo del boleto? Una maquina de boletos no necesita realizar ningin célculo ' Esta definicién difiere ligeramente de la definicién mas formal de la especificacién del len- guaje Java donde la signatura no incluye al modificador de acceso nial tipo de retorno. Concepto Los métodos de ‘acceso devuolven informacion sobre el estado de un objeto. ‘Concepto Los métodos de modificacién cambian el estado de un objet. 2.7 Métodos de modificacion 33 para ser capaz de responder esta pregunta porque mantiene la respuesta en su campo precio, por lo tanto, el método responde devolviendo justamente el valor de esa variable, A medida que desarrollemos clases mas complejas encontraremos inevitable- mente preguntas més complejas que requieren mas trabajo para brindar sus respuestas. Frecuentemente describimos a métodos tales como los dos métodos obtener de la MaquinaDeBoletos (obtenerPrecio y obtenerSaldo) como métodos de acceso. EI motivo de mencionarlos de esta manera es que devuelven informacién al invocador sobre el estado de un objeto, es decir, proporcionan acceso a dicho estado. Un método de acceso contiene generalmente una sentencia return para devolver informacién como un valor en particular. Ejercicio 2.21 Compare el método obtenerSaldo con el método obte- nerPrecio. {Cudles son las diferencias entre ellos? Ejercicio 2.22 Sj una llamada a obtenerPrecio puede ser caracterizada por la pregunta gcuanto cuesta el boleto?, zcmo podria caracterizar una lla- mada a obtenerSaldo? Ejercicio 2.23 Si se cambia el nombre de obtenerSaldo por obtenerDi- neroIngresado, ces necesario modificar la sentencia return en el cuerpo del método? Pruebe este cambio en BlueJ. Ejercicio 2.24 Defina un método de acceso, obtenerTotal, que devuelva el valor del campo total. Ejercicio 2.25 Pruebe eliminar la sentencia return del cuerpo del método obtenerPrecio. .Qué mensaje de error aparece cuando trata de compilar la clase? Ejercicio 2.26 Compare las signaturas de los métodos obtenerPrecio imprimirBoleto que se muestran en el Cédigo 2.1. Ademas de sus nom- bres, .cual es la principal diferencia entre ellas? Ejercicio 2.27 Los métodos ingresarDinero e imprimirBoleto, {tienen sentencias return? {Por qué considera que es asi? ,Observa algo en sus enca- bezados que podria sugerir el porqué no requieren sentencias return? Métodos de modificacion Los métodos obtener de la maquina de boletos realizan, todos ellos, tareas simi- lares: devuelven el valor de uno de los campos del objeto. El resto de los métodos, ingresarDinero e imprimirBoleto, tienen un papel mis significativo, principal- mente porque modifican el valor de uno o mas campos del objeto maquina cada vez que son invocados. A los métodos que modifican el estado de su objeto los llamamos métodos de modificacién (0 s6lo modificadores) De la misma manera en que pensamos en los métodos de acceso como solicitantes de informacién (preguntas), podemos pensar en los métodos de modificacién como soli citudes a un objeto para que cambie su estado. Cédigo 2.6 El método. ingresarDinero Capitulo 2 ll Comprender las definiciones de clases Un efecto distintivo de un modificador es que un objeto exhibira con frecuencia un comportamiento ligeramente diferente antes y después de ser llamado. Podemos ilus- trar esto con el siguiente ejercicio. Ejercicio 2.28 Cree una maquina de boletos con un precio de su eleccién. Primeramente llame a su método obtenerSaldo. Luego llame al método ingresarDinero (Codigo 2.6) ingrese como parametro actual una cantidad de dinero positiva y distinta de cero. Llame nuevamente a obtenerSaldo. Las dos llamadas a obtenerSaldo debieran tener diferente salida puesto que la llamada a ingresarDinero tuvo el efecto de cambiar el estado de la maquina mediante su campo saldo. La signatura de ingresarDinero tiene tipo de retorno void y un solo parimetro formal, cantidad, de tipo int. Un tipo de retorno void significa que el método no devuelve ningin valor cuando es llamado; es significativamente diferente de todos los otros tipos de retorno, En Bluel, la diferencia es mas notable porque después de una llamada a un método void no se muestra ninguna caja de diilogo con el valor devuelto. En el cuerpo de un método void, esta diferencia se refleja en el hecho de que no hay ninguna sentencia return, i * Recibe de un cliente una cantidad de dinero en centavos. a public void ingresarDinero(int cantidad) { saldo = saldo + cantidad; } En el cuerpo de ingresarDinero hay una sola sentencia que es otra forma de sen- tencia de asignacién, Siempre consideramos las sentencias de asignacién examinando primero los célculos que aparecen a la parte derecha del simbolo de asignacién. En este caso, el efecto es calcular un valor que es la suma del nimero del parimetro can- tidad con el nimero del campo saldo. Este valor es calculado y luego asignado al ‘campo $aldo, por lo que el efecto de esta sentencia es incrementar el valor de saldo en el valor de cantidad®. Ejercicio 2.29 Qué elementos del encabezado de ponerPrecio nos indican que es un método y no un constructor? public void ponerPrecio (int precioDelBoleto) 2 En realidad, Java permite que los métodos void contengan una forma especial de sentencia de retorno en la que no se devuelve ningin valor. Esta sentencia toma la forma return; y simplemente hace que el método finalice sin ejecutar ninguna linea mas de cédigo. EI sumar una cantidad al valor de una variable es algo tan comin que existe un operador de asignacién compuesto, especial para hacerlo: «+=». Por ejemplo: saldo += cantidad; 2.8 Imprimir desde métodos 35 Ejercicio 2.30 Complete el cuerpo del método ponerPrecio de modo que asigne el valor de su parametro al campo precio. Ejercicio 2.31 Complete el cuerpo del siguiente método cuyo propésito es sumar el valor de su parémetro al campo de nombre puntaije. ys* * Incrementa el puntaje en un numero de puntos dado *! public void incrementar (int puntos) { } Ejercicio 2.32 Complete el siguiente método cuyo propésito es restar el valor de su parametro del campo de nombre precio. ye * Disminuye el precio en una cantidad dada oj public void descuento (int cantidad) { Nota: convenciones Java sobre métodos de acceso y de modificacion7 En Java, los nombres de los métodos de acceso suelen comenzar con la palabra «get» en lugar de la palabra «obtener» y los nombres de los métodos de modi cacién, con la palabra «set» en lugar de «poner». Por ejemplo: getPrecio, getSaldo son métodos de acceso a las variables precio y saldo. setPrecio, setSaldo son métodos de modificacién de las variables precio y saldo. De aqui en adelante, usaremos esta convencién para los nombres de los métodos de modificacién y de acceso. Imprimir desde métodos El Cédigo 2.7 muestra el método mas complejo de la clase, imprimirBoleto. Para ayudarle a comprender la siguiente discusién, asegirese de haber invocado este método en una maquina de boletos. Debiera ver algo similar a la siguiente ventana terminal de Bluel. BARRA AAA HEHEHE # Linea BlueJ # Boleto # 500 cvos. AERP AE EAE EAE EAE EE 36 Capitulo 2 ll Comprender las definiciones de clases Cédigo 2.7 | método imprimirBoleto Concepto EI método systen.out.prin In imprime su pardmetro en la terminal de text. y* * Imprime un boleto y pone el saldo actual en cero eh public void imprimirBoleto() { // Simula la impresién de un boleto. System. out.print1n ("###HHHHHHHHHHHHHHE® ) 5 System.out.printIn("# Linea BlueJ"); System.out.print1n("# Boleto"); System.out.print1n("# " + precio + * cvos. System. out.print1n("##HHHHHHHHHHHHHHHE® ) 5 System. out.print1n() ; // Actualiza el total recaudado con el saldo. total = total + saldo; // Limpia el saldo. saldo = 0; } Este es el método mas largo que hemos visto hasta ahora, por lo que lo dividiremos en partes mas manejables: m La signatura indica que el método tiene un tipo de retorno void y que no tiene parametros = El cuerpo contiene ocho sentencias ademas de los comentarios asociados. 1 Las primeras seis sentencias son las responsables de imprimir lo que se ve en la terminal de Bluel. m La séptima sentencia suma el dinero ingresado por el cliente (a través de Hamadas previas a ingresarDinero) al total del dinero recolectado por la méquina desde que fue creada, m La octava sentencia vuelve el saldo al valor 0 con una sentencia basica de asig- nacidn, y prepara la méquina para el proximo cliente que introduciri dinero en ella ‘Comparando la salida que aparece con las sentencias que la producen, es facil ver que una sentencia como System.out.println("# Linea BlueJ"); prime literalmente la cadena que aparece entre el par de comillas dobles. Todas estas sentencias de impresin son invocaciones al método print1n del objeto System. out que esté construido dentro del lenguaje Java, En la cuarta sentencia, el parimetro actual de print1n es un poco mas complicado: System.out.println("# " + precio + cvos."); Se usan los dos operadores “+” para construir un solo parimetro de tipo cadena a partir de tres componentes: m La cadena literal « » (observe el cardcter espacio luego del numeral); 1m el valor del campo precio (observe que no hay comillas alrededor de! nombre del campo); m [a cadena literal «cvos.» (observe el cardcter espacio antes de la palabra cvos). 2.9 Resumen de la maquina de boletos simplificada 37 Cuando se usa el simbolo «+» entre una cadena y cualquier otra cosa, este simbolo es un operador de concatenacién de cadenas (es decir, concatena o reine cadenas para crear una nueva cadena) en lugar de ser el operador aritmético de suma. Observe que la diltima llamada a print1n no contiene ningun parametro de tipo cadena. Esto esta permitido y el resultado de la llamada sera dejar una linea en blanco entre esta salida y cualquier otra que le siga. Podra ver ficilmente la linea en blanco si imprime un segundo boleto Ejercicio 2.33 Agregue un método de nombre mensaje a la clase Maqui - naDeBoletos, su tipo de retorno debe ser void y no debe tomar ningun para- metro. El cuerpo del método debe imprimir algo parecido a Por favor, ingrese la cantidad de dinero correcta. Ejercicio 2.34 Agregue un método mostrarPrecio a la clase MaquinaDe- Boletos. Serd un método con tipo de retorno void y sin parametros. El cuerpo del método debera imprimir algo similar a: El precio del boleto es de xyz centavos. Donde xyz deberd ser reemplazado por el valor que contenga el campo precio cuando el método sea llamado. Ejercicio 2.35 Cree dos maquinas con diferentes precios de boletos. Sus res- pectivas llamadas al método mostrarPrecio producen la misma salida o es diferente? ¢Cémo explica este efecto? Ejercicio 2.36 Si se altera la cuarta sentencia de imprimirBoleto de modo que el precio también esté entre comillas, zqué piensa que se imprimira? System.out.println("# “ + "precio" + " cvos."); Ejercicio 2.37 Qué piensa sobre la siguiente version? System.out.printin("# precio cvos."); Ejercicio 2.38 ;Podria usarse en maquinas diferentes alguna de las dos Uiltimas versiones anteriores para mostrar los precio de sus boletos? Explique su respuesta. Resumen de la maquina de boletos simplificada Hemos examinado hasta ahora con cierto detalle la estructura interna de la clase maquina de boletos simplificada. Hemos visto que la clase tiene una pequeita capa exterior que le asigna un nombre y un cuerpo interno mas sustancial que contiene los campos, un constructor y varios métodos. Los campos se usan para almacenar datos que permiten a los objetos mantener un estado, Los constructores se usan para pre- parar un estado inicial cuando se crea un objeto. Tener un estado inicial permitiré que un objeto responda apropiadamente a las lamadas a métodos inmediatamente después de su creacién. Los métodos implementan el comportamiento definido para los objetos de la clase. Los métodos de acceso brindan informacién sobre el estado de un y los de modificacién cambian el estado de un objeto. J RUS 38 Capitulo 2 ll Comprender las definiciones de clases Hemos visto que los constructores se diferencian de los métodos por tener el mismo nombre que la clase en la que estin definidos. Tanto los constructores como los métodos pueden tener pardmetros, pero solamente los métodos pueden tener tipo de retorno. Los tipos de retorno que no son void nos permiten pasar un resultado hacia el exte- rior de un método. Un método que no tiene un tipo de retorno void debe tener una sentencia return como la ultima sentencia de su cuerpo. Las sentencias return se aplican solamente en los métodos porque los constructores nunca tienen tipo de retorno de ninguna naturaleza, ni siquiera void. Antes de que intente hacer estos ejercicios, asegurese de haber comprendido bien cémo se comporta la maquina de boletos y cémo esta implementado ese comportamiento a través de los campos, el constructor y los métodos de la clase. Ejercicio 2.39 Modifique el constructor de la MaquinaDeBoletos de modo que no tenga ningun parametro. En su lugar, el precio de los boletos debiera fijarse en 1000 centavos. {Qué efecto tendra esta modificacion cuando se cons- truyan objetos maquina de boletos en Blues? Ejercicio 2.40 Implemente un método vaciar, que simule el efecto de quitar todo el dinero de la maquina. Este método debe tener un tipo de retorno void y Su cuerpo simplemente pone en cero el valor del campo total. Necesita tener algun parametro? Pruebe su método creando una maquina, ingrese algo de dinero, emita algunos boletos, verifique el total y luego vacie la maquina. ¢Es un método de modificacién 0 de acceso? Ejercicio 2.41 Implemente un método, ponerPrecio, que permita modificar e! precio de los boletos con un nuevo valor. El nuevo precio se pasa al método mediante un pardmetro. Pruebe su método creando una maquina, mostrando el precio de los boletos, cambiando el precio y luego mostrando el nuevo precio. dEs un método de modificacién? Ejercicio 2.42 Provea a la clase de dos constructores: uno debe tomar un solo parametro que especifique el precio del boleto, y el otro no debe tener parametros y debe establecer el precio como un valor fijo por defecto, el que usted elija. Pruebe su implementacién creando maquinas mediante los dos cons tructores diferentes. Reflexién sobre el disefio de la maquina de boletos En las proximas secciones examinaremos la implementacién de una clase mejorada para la maquina de boletos, que trate de remediar algunas de las restricciones que pre- senta la implementacién simplificada A partir de nuestro andlisis del interior de la clase MaquinaDeBoletos se puede apre- ciar lo inadecuada que seria esta implementacién en el mundo real. Es deficiente por varios motivos: m= No verifica si el cliente ingres6 dinero suficiente como para pagar el boleto. m No devuelve nada de dinero si el cliente pagé de més por el boleto. Cédigo 2. Una maquina de boletos mas sofisticada 2.11 Hacer elecciones: la sentencia condicional 39 = No controla si el cliente ingresa cantidades de dinero que tienen sentido: experi- mente, por ejemplo, qué ocurre si ingresa una cantidad negativa ™ No verifica si tiene sentido el precio del boleto pasado a su constructor. Si pudiésemos remediar estos problemas entonces tendriamos una pieza de software mucho mas funcional que podria servir como base para operar una maquina de boletos del mundo real. Dado que vemos que podemos mejorar la versién existente, abra el proyecto maquina-de-boletos-mejorada. Tal como en el caso anterior, el proyecto con- tiene una sola clase, MaquinaDeBoletos. Antes de ver los detalles internos de la clase, experimente con ella creando algunas instancias y vea si observa alguna dife- rencia en el comportamiento entre la versién previa simplificada y ésta. Una diferencia specifica es que la nueva versién tiene un método adicional, reintegrarSaldo. Mas adelante, en este capitulo, usaremos este método para introducir un aspecto adicional de Java, de modo que vea qué ocurre cuando lo invoca. Hacer elecciones: la sentencia condicional El Cédigo 2.8 muestra los detalles internos de la definicién de clase de la maquina de boletos mejorada. Muchas de estas definiciones ya son familiares a partir del andlisis de la maquina de boletos simplificada. Por ejemplo, la envoltura exterior que nombra a la clase es la misma porque hemos elegido dar el mismo nombre a esta clase; ademé: contiene los mismos tres campos para mantener el estado del objeto y han sido decla- rados de la misma manera; el constructor y los dos métodos get también son los mismos que los anteriores. yt * MaquinaDeBoletos modela una maquina de boletos que trabaja * con tarifa plana. * El precio de un boleto se especifica a través del constructor. * Implementa controles para asegurar que un usuario ingrese * sdlo cantidades de dinero con sentido y sélo se imprimira * un boleto si el dinero ingresado alcanza. * @author David J. Barnes and Michael Kolling * @version 2006.03.30 SU public class MaquinaDeBoletos{ // El precio de un boleto de esta maquina. private int precio; // La cantidad de dinero ingresada hasta ahora por un cliente. private int saldo; J] €1 total del dinero recolectado por esta maquina. private int total; [* 40 Cédigo 2.8 (continuacion) Una maquina de boletos mas sofisicada Capitulo 2 ll Comprender las definiciones de clases * Crea una maquina que vende boletos de un precio determinado. * public MaquinaDeBoletos(int precioDelBoleto) ¢ precio = precioDelBoleto; saldo = 0; total = 0; + i * Devuelve el precio de un boleto. ef public int getPrecio() iG return precio; + i * Devuelve la cantidad de dinero que ya se ingresé para * el siguiente boleto. a public int getSaldo() { return saldo; } ee * Recibe del cliente una cantidad de dinero en centavos. * Controla que la cantidad tenga sentido. a public void ingresarDinero(int cantidad) positiva: " + { if(cantidad > 0) { saldo = saldo + cantidad; + else { System.out.println("Debe ingresar una cantidad cantidad) ; ib } ye * Imprime un boleto si la cantidad de dinero ingresada * alcanza y disminuye el saldo actual en el precio * del boleto. Imprime un mensaje de error si se * requiere mas dinero. 2p public void imprimirBoleto() i Codigo 2.8 (continuacién) Una maquina de boletos mas sofisticada 2.11 Hacer elecciones: la sentencia condicional a if(saldo >= precio) { // Simula la impresién de un boleto. System.out.printn ("##HHHHHHAHHHHHHHHH" ) 5 System.out.print1n("# Linea BlueJ "); System.out.print1n("# Boleto"); System.out.println("# " + precio + * evos."); System. out.print1n ("###HHHRHRHRHAHHHHH" ) 5 System. out.print1n() ; // Actualiza el total recolectado con el precio. total = total + precio; // Disminuye el saldo en el valor del precio. saldo = saldo - precio; } else { System.out.print1n("Debe ingresar como minimo: * + (precio - saldo) + * vos mas." } } ym * Devuelve el valor del saldo. * Se limpia el saldo. a public int reintegrarSaldo() { int cantidadaReintegrar; cantidadAReintegrar = saldo; saldo = 0; return cantidadAReintegrar; } Encontramos el primer cambio significativo en el método ingresarDinero. Hemos reconocido que el principal problema de la maquina de boletos simplificada era su falta de control sobre ciertas condiciones. Una de esas faltas de control era sobre la can- tidad de dinero introducida por un cliente, de modo que resultaba posible ingresar una cantidad de dinero negativa. Hemos remediado esa falla haciendo uso de una sentencia condicional que controla que el monto ingresado sea un valor mayor que cero: if(cantidad > 0) { saldo = saldo + cantidad; } else { System.out.printin("Debe ingresar una cantidad positiva: " + cantidad) ; B 42 Capitulo 2 ll Comprender las definiciones de clases ‘Concepto Una sentencia condicional realiza tuna de dos acciones posibles basandose en el resultado de una prueba. Concepto Las expresiones: bbooleanas tienen blo dos valores posibles: verdadero 0 falso. Se las encuentra cominmente controlando la eleccién entre los dos caminos posibles de una sentencia condicional Las sentencias condicionales también son conocidas como sentencias if debido a la palabra usada en la mayoria de los lenguajes de programacién que las introducen, Una sentencia condicional nos permite hacer una de dos acciones posibles basindose en el resultado de una verificacién 0 prueba: si el resultado es verdadero entonces hacemos una cosa, de lo contrario hacemos algo diferente. Una sentencia condicional tiene la forma general descrita en el siguiente pseudo-cddigo: if(se leva a cabo alguna prueba que da un resultado verdadero o falso) { Si la prueba dio resultado verdadero, ejecutar estas sentencias 7 else { Si el resultado dio falso, ejecutar estas sentencias + Es importante apreciar que después de la evaluacién de la prueba se Ilevari a cabo s6lo uno de los conjuntos de sentencias que estin a continuacién de la prueba. Por lo que, en el ejemplo del método ingresarDinero, a continuacién de la prueba sobre la cantidad de dinero introducida, s6lo sumaremos la cantidad al saldo o bien mos- traremos el mensaje de error. La prueba usa el operador mayor que «>» para com- parar el valor de cantidad con cero. Si el valor es mayor que cero entonces se sumara al saldo. Si no es mayor que cero, se muestra un mensaje de error. En efecto, usando una sentencia condicional podemos proteger la modificacién del saldo del caso en que el parimetro no represente una cant La prueba que se usa en una sentencia condicional es un ejemplo de una expresién booleana. Anteriormente en este capitulo introdujimos expresiones aritméticas que pro- ducen resultados numéricos. Una expresién booleana tiene sélo dos valores posibles, verdadero(true) 0 falso (false): una de dos, el valor de cantidad es mayor que cero (verdadero) 0 no es mayor que cero (falso). Una sentencia condicional hace uso de esos dos posibles valores para clegir entre dos acciones diferentes. Ejercicio 2.43 Controle que el comportamiento del que hemos hablado es correcto creando una instancia de MaquinaDeBoletos e invocando a ingre- sarDinero con varios valores diferentes en el parametro actual. Controle el saldo antes y después de invocar a ingresarDinero. En los casos en que se muestra un mensaje de error, gambia el valor de! saldo? Trate de predecir qué ocurriria si ingresa como pardmetro el valor cero y luego compruebe la verdad de su prediccién. Ejercicio 2.44 Prediga qué cree que ocurrira si cambia el control de ingre- sarDinero usando el operador mayor o igual que. 0) if (cantidad Verifique sus predicciones ejecutando algunas pruebas. ;Qué diferencia pro- duce este cambio en el comportamiento del método? Ejercicio 2.45 En el proyecto figuras que vimos en el Capitulo 1 usamos un campo boolean para controlar un aspecto de los objetos circulo. ,Cual es ese aspecto? cEstaba bien hecho el control mediante un tipo que tiene sélo dos valores diferentes? 2.12 Un ejemplo mas avanzado de sentencia condicional | 43 Un ejemplo mas avanzado de sentencia condicional El método imprimirBoleto contiene un ejemplo mas avanzado de una sentencia con- dicional. Aqui esta su esquema: if(saldo >= precio) { Se omitieron los detalles de impresién. J} Actualiza el total recaudado con el precio. total = total + precio; // Decrementa el saldo en el valor del precio. saldo = saldo - precio; i; else { System.out.println("Debe ingresar como minimo: + (precio - saldo) + cvos mas."); } Queremos remediar el hecho de que la versin simplificada no controla que un cliente haya introducido dinero suficiente para que se emita un boleto. Esta versién verifica que el valor del campo saldo es como minimo tan grande como el valor del campo precio. De ser asi estd bien que se emita un boleto; de lo contrario, en lugar del boleto mostramos un mensaje de error. Ejercicio 2.46 En esta version de imprimirBoleto también hacemos algo ligeramente diferente con los campos total y saldo. Compare la implemen- tacién del método en el Cédigo 2.1 con la del Cédigo 2.8 para ver si puede encontrar cuales son esas diferencias. Luego compruebe su comprensién expe- rimentando en BlueJ. El método imprimirBoleto disminuye el valor del saldo en el valor del precio. En consecuencia, si un cliente ingresa mas dinero que el precio del boleto, quedara algo de dinero en saldo que podri usarse para conformar el precio de un segundo boleto. Alternativamente, el cliente puede pedir el reintegro del dinero sobrante y esto es lo que hace el método reintegrarSaldo tal como veremos en la proxima sec- cién. Ejercicio 2.47 Después de emitido un boleto, si se resta el precio del campo saldo (Puede este ultimo campo tener un valor negativo? Justifique su res- puesta. Ejercicio 2.48 Hasta ahora hemos introducido dos operadores aritméticos, + y~, que pueden usarse en expresiones aritméticas en Java. Vea el Apéndice D para encontrar qué otros operadores estén disponibles en Java. Ejercicio 2.49 Escriba una sentencia de asignacién que almacene el resul- tado de multiplicar dos variables, precio y descuento, en una tercera variable, ahorro, 44 Capitulo 2 ll Comprender las definiciones de clases Ejercicio 2.50 Escriba una sentencia de asignacién que divida el valor de total por el valor de cantidad y almacene el resultado en la variable pro- medio. Ejercicio 2.51 Escriba una sentencia if que compare el valor de precio con el valor de presupuesto. Si el precio es mayor que el presupuesto imprimir el mensaje «Muy caro», de lo contrario imprimir el mensaje «El precio es justo». Ejercicio 2.52 Modifique su respuesta al ejercicio anterior de modo que el mensaje que se emite, cuando el precio es demasiado alto, incluya el valor de su presupuesto. Variables locales El método reintegrarSaldo contiene tres sentencias y una declaraci6n. La declara- Concepto ci6n ilustra una nueva clase de variable: Una variable local public int reintegrarSaldo() fs una variable que { se deciara y se u ‘ eRe Gee int cantidadAReintegrar} método. Su alcance cantidadAReintegrar = saldo; y tiempo de vida se saldo = 0; peaeania oeicel return cantidadAReintegrar; método } {Qué clase de variable es cantidadAReintegrar? Sabemos que no es un campo porque los campos se definen fuera de los métodos. Tampoco es un parimetro porque siempre se definen en el encabezado del método. La variable cant idadAReintegrar es lo que se conoce como una variable local porque esti definida dentro de un método. Es muy comin inicializar variables locales cuando se las declara, por lo que podri- amos abreviar las dos primeras sentencias de reintegrarSaldo de la siguiente manera: int cantidadAReintegrar = saldo; Las declaraciones de las variables locales son muy similares a las declaraciones de los campos pero las palabras private o public nunca forman parte de ellas. Tal como con los parémetros formales, las variables locales tienen un aleance que esti limitado a las sentencias del método al que pertenecen. Su tiempo de vida es el tiempo de la ejecucién del método: se crean cuando se invoca un método y se destruyen cuando el método termina. Los constructores también pueden tener variables locales. Las variables locales se usan frecuentemente como lugares de almacenamiento tem- poral para ayudar a un método a completar su tarea. En este método se usa canti- dadAReintegrar para guardar el valor del saldo inmediatamente antes de ponerlo en cero; el método retorna entonces el viejo valor del saldo. Los siguientes ejercicios Jo ayudaran a comprender la necesidad de usar una variable local para escribir el método reintegrarSaldo. Ejer 2.53 Por qué la siguiente versién de reintegrarSaldo no da el mismo resultado que el original? 2.14 Campos, parémetros y variables locales 45 public int reintegrarSaldo() { saldo = 0; return saldo; + Qué pruebas podria ejecutar para demostrar la diferencia entre los resultados? Ejercicio 2.54 ,Qué ocurre si trata de compilar la clase MaquinaDeBoletos con la siguiente versin de reintegrarSaldo? public int reintegrarSaldo() { return saldo; saldo = 0; + {Qué conocimiento tiene sobre las sentencias return que lo ayudarla a explicar por qué esta versién no compila? Ahora que ha visto como se usan las variables locales, vuelva al Ejercicio 2.20 y veri- fique que lo comprende: alli, una variable local evita que un campo con el mismo nombre sea accedido. Cuidado Una variable local de! mismo nombre que un campo evitaré que el campo sea accedido dentro de un método. Vea la Seccién 3.12.2 para otra manera de pre- venir el acceso, cuando sea necesario. Campos, parametros y variables locales n de cantidadAReintegrar en el método reintegrarSaldo s tipos diferentes de variables: campos, parimetros formales y variables locales. Es importante comprender las similitudes y diferencias entre estos tipos de variables. A continuacién hacemos un resumen de sus caracteristicas: m Las tres clases de variables pueden almacenar un valor acorde a su definicién de tipo de dato. Por ejemplo, una variable definida como de tipo int permite alma- cenar un valor entero. 1m Los campos se definen fuera de los constructores y de los métodos. Los campos se usan para almacenar datos que persisten durante la vida del objeto, de esta manera mantienen el estado actual de un objeto. Tienen un tiempo de vida que finaliza cuando termina el objeto. m El alcance de los campos es la clase: la accesibilidad de los campos se extiende a toda la clase y por este motivo pueden usarse dentro de cualquier constructor 0 método de clase en la que estén definidos. = Como son definidos como privados (private), los campos no pueden ser acce- jos desde el exterior de Ia clase. 1 Los parametros formales y las variables locales persisten solamente en el lapso durante el cual se ejecuta un constructor o un método. Su tiempo de vida es tan 46 Capitulo 2 l™ Comprender las definiciones de clases largo como una llamada, por lo que sus valores se pierden entre llamadas. Por este ‘motivo, actiian como lugares de almacenamiento temporales antes que permanentes. Los pardmetros formales se definen en el encabezado de un constructor o de un método. Reciben sus valores desde el exterior, se inicializan con los valores de los parimetros actuales que forman parte de la lamada al constructor 0 al método. Los parimetros formales tienen un alcance limitado a su definicién de constructor 0 de método. Las variables locales se declaran dentro del cuerpo de un constructor o de un método. Pueden ser inicializadas y usadas solamente dentro del cuerpo de las definiciones de constructores © métodos. Las variables locales deben ser inicializadas antes de ser usadas en una expresién, no tienen un valor por defecto. Las variables locales tienen un alcance limitado al bloque en el que son declaradas. No son accesibles desde ningiin lugar fuera de ese bloque. Ejer 2.55 Agregue un nuevo método, vaciarMaquina, diseniado para simular el quitar todo el dinero de la maquina. Debe retornar el valor de total y poner total nuevamente en cero. Ejercicio 2.56 EI método vaciarMaquina, jes un método de ac modificacién, 0 ambos? 0, de Ejercicio 2.57 Escriba nuevamente el método imprimirBoleto de modo que declare una variable local, cantidadRestanteAPagar que debe ser inicializada para que contenga la diferencia entre el precio y el saldo. Rescriba la prueba de la sentencia condicional para controlar el valor de cant idadRestanteAPagar: si su valor es menor o igual que cero se deberd imprimir un boleto, de lo contrario se emitira un mensaje de error mostrando la cantidad de dinero que falta para pagar el boleto. Pruebe su version para asegurarse de que se comporta exacta- mente de la misma manera que la versién original. Ejercicio 2.58 Desafio. Suponga que queremos que un Unico objeto Maqui- naDeBoletos disponga de boletos de diferentes precios: por ejemplo, los usua- rios podrian presionar un botén de la maquina real para seleccionar un boleto de un precio en particular {Qué otros métodos o campos necesitaria agregar a la MaquinaDeBoletos para lograr esta funcionalidad? ¢Considera que varios de los métodos existentes debieran también ser cambiados? Grabe el proyecto maquina-de-boletos-mejorada bajo un nuevo nombre e imple- mente sus cambios en el nuevo proyecto. eo Resumen de la maquina de boletos mejorada En vias de desarrollar una ver in mas sofisticada de la clase MaquinaDeBoletos, hemos sido capaces de encontrar los mayores inconvenientes de la versién simplifi- cada. Al hacerlo, hemos introducido dos nuevas construcciones del lenguaje: la sen- tencia condicional y las variables locales. 2.16 Ejercicios de revision 47 ™ Una sentencia condicional nos da la posibilidad de realizar una prueba, y en base a su resultado llevar a cabo una u otra de dos acciones distintas. Las variables locales nos permiten calcular y almacenar temporalmente valores dentro de un constructor 0 un método. Contribuyen al comportamiento que imple- mentan las definiciones de sus métodos, pero sus valores se pierden una vez que el constructor o el método finaliza su ejecucién. Puede encontrar mas detalles sobre las sentencias condicionales y las formas que pueden asumir sus pruebas en el Apéndice C. Ejercicios de revision En este capitulo hemos sentado bases nuevas y hemos introducido una gran cantidad de conceptos nuevos. Seguiremos construyéndolos en capitulos posteriores de modo que es importante que se sienta familiarizado con ellos. Pruebe hacer los siguientes ejercicios en lapiz y papel como una forma de verificar que ha comenzado a usar la terminologia que hemos introducido en este capitulo. No se moleste por el hecho de que sugerimos hacerlos en papel en lugar de hacerlos en BlueJ, sera una buena pric- tica el intentar resolver los ejercicios sin que medie un compilador. Ejercicio 2.59 Determine el nombre y el tipo de retorno de este método public String getCodigo() { return codigo; + Ejercicio 2.60 Indique el nombre de este método y el nombre y el tipo de su parametro. public void setCreditos(int cantidadDeCreditos) ct creditos = cantidadDeCreditos; + Ejercicio 2.61 Escriba la envoltura exterior de una clase de nombre Per- ona. Recuerde incluir las llaves al comienzo y al final del cuerpo de la clase; pero, por otra parte, deje el cuerpo vacio. Ejercicio 2.62 Escriba las declaraciones de los siguientes campos: ™ Un campo denominado nombre y de tipo String ™ Un campo de tipo int y de nombre edad Un campo de tipo String denominado codigo Un campo de nombre creditos de tipo int Ejercicio 2.63 Escriba un constructor para la clase Modulo. El constructor tendré un solo parémetro de tipo String denominado codigoDelModulo. El cuerpo del constructor debera asignar el valor de su parémetro a un campo de nombre codigo. No tiene que incluir la declaracién de codigo, sélo el texto del constructor. 48 Capitulo 2 ml Comprender las definiciones de clases Ejercicio 2.64 Escriba un constructor para una clase de nombre Persona. El constructor debera tener dos parémetros: el primero de tipo String y deno- minado miNombre, y el segundo de tipo int y de nombre miEdad. Use el primer parametro para establecer el valor de un campo denominado nombre, y el segundo para preparar un campo de nombre edad. No tiene que incluir las definiciones de estos campos, sdlo el texto de! constructor Ejercicio 2.65 Corria el error de este método: public void getEdad() ( return edad; + Ejercicio 2.66 Escriba un método de acceso de nombre getNombre que retorna el valor de un campo denominado nombre, cuyo tipo es String Ejercicio 2.67 Escriba un método de modificacién de nombre setEdad que tenga un inico parametro de tipo int y que cambie el valor del campo de nombre edad. Ejercicio 2.68 Escriba un método de nombre imprimirDetalles para una clase que tiene un campo de tipo String denominado nombre. El método imprimirDetalles debe mostrar en la terminal de texto, la cadena «El nombre de esta persona es» seguida del valor del campo nombre. Por ejemplo, si el valor del campo nombre es «Elena», el método imprimiria El nombre de esta persona es Elena Si se las arreglé para completar la mayoria o todos estos ejercicios, entonces parece que esta en condiciones de intentar crear en BlueJ un nuevo proyecto y llevar a cabo su propia definicién de una clase Persona. Por ejemplo, la clase deberia tener campos nseguro para completar para registrar el nombre y la edad de una persona. Si se sint cualquiera de estos ejercicios, vuelva a las secciones anteriores de este capitulo y al cédigo de la clase MaquinaDeBoletos para revisar las cuestiones que ain no le queden claras. En la proxima seccién ofrecemos algin material mas para realizar la revision. Revisar un ejemplo familiar Codigo 2.9 La clase Estudiante Al llegar a este punto del capitulo ha encontrado una gran cantidad de conceptos nuevos. Para ayudar a reforzar esos conceptos los revisaremos en un contexto familiar pero diferente. Abra el proyecto curso-de-laboratorio que trabajamos en el Capitulo 1 y Tuego examine la clase Estudiante en el editor (Codigo 2.9). ye * La clase Estudiante representa un estudiante en un sistema * administrativo de estudiantes. Contiene los detalles relevantes Codigo 2.9 (continuacién) La clase Estudiante 2.17 Revisar un ejemplo familiar 49 * en nuestro contexto. * @author Michael Kolling y David Barnes * @version 2006.03.30 "| public class Estudiante { // nombre completo del estudiante private String nombre; // ID (identificador)del estudiante private String id; /1 la cantidad de créditos que tiene hasta ahora private int oreditos; nee * Crea un nuevo estudiante con un determinado nombre y con * un determinado numero de identificacién. af public Estudiante(String nombreCompleto, String IdEstudiante) { nombre = nombreCompleto; id = IdEstudiante; creditos = 0; + ee * Devuelve el nombre completo de este estudiante. 3 public String getNombre() { return nombre; } yee * Asigna un nuevo nombre a este estudiante. a public void cambiarNombre(String nuevoNombre) { nombre = nuevoNombre; oi per * Devuelve el Id de este estudiante. fy, public String getIdEstudiante() { return id; + yr * Suma algunos puntos a los créditos acumulados del estudiante. 50 Capitulo 2 ll Comprender las definiciones de clases Codigo 2.9 (continuacién) a La clase public void sumarCreditos(int puntosAdicionales) Estudiante { creditos += puntosAdicionales; iy i * Devuelve el numero de créditos que el estudiante ha acumulado. oy public int getCreditos() { return creditos; } yet * Devuelve el nombre de usuario del estudiante. * El nombre de usuario es una combinacién de los cuatro primeros * caracteres del nombre del estudiante y los tres primeros * caracteres del numero del ID de estudiante. ut! public String getNombreDeUsuario() { return nombre.substring(0,4) + id.substring(0,3); + yer * Imprime el nombre y el numero de ID del estudiante en la * terminal de salida. ad public void imprimir() { System.out.println(nombre + " (" + id + ")"); + La clase contiene tres campos: nombre, id y creditos. Cada uno de ellos es ini- cializado en un Gnico constructor. Los valores iniciales de los primeros dos campos estén determinados por los valores pasados al constructor mediante parametros. Cada uno de estos campos tiene un método de acceso get pero solamente los campos nombre y creditos tienen asociados métodos de modificacién: esto sig- nifica que el valor de un campo id permanece fijo una vez que se ha construido el objeto, El método getNombreDeUsuario ilustra una nueva caracteristica que serd fuertemente explorada 2.17 Revisar un ejemplo familiar 51 public String getNombreDeUsuario() { return nombre.substring(0,4) + id.substring(0,3); + Tanto nombre como id son cadenas, y la clase String tiene un método de acceso, substring, con la siguiente signatura en Java: ye * Return a new string containing the characters from * beginIndex to (endIndex-1) from this string. af public String substring(int beginIndex, int endIndex) El valor cero del indice representa el primer cardcter de una cadena, de modo que get- NombreDeUsuario toma los primeros cuatro caracteres de la cadena nombre, los pri- meros tres caracteres de la cadena id y los concatena formando una nueva cadena que, en definitiva, es el resultado que devuelve el método. Por ejemplo, si nombre es la cadena «Leonardo da Vinci» y el id es la cadena «468366», entonces este método devuelve la cadena «Leon468» . Ejercicio 2.69 Dibuje una figura similar a la que muestra la Figura 2.3 para representar el estado inicial de un objeto Estudiante después de su cons- truccién, con los siguientes valores para sus parametros actuales. new Estudiante("Benjamin Jonson", *738321") Ejercicio 2.70 Si cl nombre de un estudiante es «Henry Moore» y su id es «557214» :Qué debiera retornar el método getNombreDeUsuario? Ejercicio 2.74 Cree un estudiante de nombre “djb" y con id "859012", Qué ocurre cuando se invoca getNombreDeUsuario sobre este objeto estudiante? éPor qué considera que es asi? Ejercicio 2.72 La clase String define el método de acceso length con la siguiente signatura ye * Return the number of characters in this string. */) public int length() Es decir que el método de acceso length de la clase String de Java devuelve la cantidad de caracteres de una cadena. Agregue una sentencia condicional al constructor de Estudiante para emitir un mensaje de error si el largo del parametro nombre es menor de cuatro carac- teres 0 el largo del parametro idEstudiante es menor de tres caracteres. Sin embargo, el constructor debe seguir usando esos parémetros para preparar los campos nombre e idEstudiante, aun cuando se imprima el mensaje de error, Pista: use sentencias if de la siguiente forma (sin su parte «else») para imprimir los mensajes de error. if(se realiza la prueba sobre uno de los parémetros) { 52 Capitulo 2 ll Comprender las definiciones de clases Si la prueba dio resultado verdadero, imprimir un mensaje de error. } Si es necesario, vea el Apéndice C para encontrar mas detalles sobre los dife- rentes tipos de sentencias if Ejercicio 2.73 Desafio. Modifique el método getNombreDeUsuario de la clase Estudiante de modo que siempre genere un nombre de usuario, aun cuando alguno de sus campos nombre o id no tengan la longitud necesaria Para las cadenas mas cortas que las del largo requerido, use la cadena com- pleta Resumen En este capitulo hemos sentado las bases para crear una definicién de clase. Las clases contienen campos, constructores y métodos que definen el estado y el comportamiento de los objetos. Dentro de los constructores y de los métodos, una secuencia de sen- tencias define cémo un objeto cumple con las tareas diseftadas. Hemos abordado las sentencias de asignacién y las sentencias condicionales y agregaremos otros tipos mis de sentencias en capitulos posteriores. Términos introducidos en este capitulo campo, variable de instancia, constructor, método, signatura de! método, cuerpo del método, pardmetro, método de acceso, método de modifica- cién, declaracién, inicializacién, bloque, sentencia, sentencia de asigna- cién, sentencia condicional, sentencia return, tipo de retorno, comentario, expresién, operador, variable, variable local, alcance, tiempo de vida Resumen de conceptos ™ campo Los campos almacenan datos para que un objeto los use. Los campos se conocen como variables de instancia comentario Los comentarios se insertan dentro del cédigo de una clase para brindar explicaciones a los lectores humanos. No tienen efecto sobre la funcionalidad de la clase. ™ constructor Los constructores permiten que cada objeto sea preparado adecuada- mente cuando es creado. lm alcance El alcance de una variable define la seccién de cédigo desde donde la variable puede ser accedida. '™ tiempo de vida El tiempo de vida de una variable describe el tiempo durante el cual la variable continda existiendo antes de ser destruida. ™ asignacién Las sentencias de asignacién almacenan el valor representado del lado derecho de la sentencia en la variable nombrada en el lado izquierdo. 2.18 Resumen 53 ™@_método Los métodos estén compuestos por dos partes: un encabezado y un cuerpo. lm método de acceso Los métodos de acceso devuelven informacion sobre el estado de un objeto. lm métodos de modificacién Los métodos de modificacién cambian el estado de un objeto. 1m printin El método System. out.print1n(...) imprime su parémetro en la terminal de texto. ™ condicional Una sentencia condicional realiza una de dos acciones posibles basan- dose en el resultado de una prueba. lm expresién booleana Las expresiones booleanas tienen solo dos valores posibles: ver- dadero y falso. Se las encuentra comtinmente controlando la eleccién entre los dos caminos de una sentencia condicional. 1 variable local Las variables locales son variables que se declaran y usan dentro de un Unico método. Su alcance y tiempo de vida estan limitados por el método. Los siguientes ejercicios estin disefiados para ayudarlo a experimentar con los con- ceptos de Java que hemos discutido en este capitulo. Crearé sus propias clases que contienen elementos tales como campos, constructores, métodos, sentencias de asigna- cién y sentencias condicionales. Ejercicio 2.74 Debajo de este ejercicio se encuentra el esquema de la clase Libro que se encuentra en el proyecto ejercicio-libro. El esquema ya declara dos campos y un constructor para inicializar dichos campos. En este ejercicio y en algunos de los siguientes, agregara mas aspectos al esquema de la clase. Agregue a la clase dos métodos de acceso, getAutor y getTitulo, que devuelven los campos autor y titulo como sus respectivos resultados. Pruebe su clase creando algunas instancias y llamando a estos métodos, ye * Una clase que registra informacion sobre un libro. * Puede formar parte de una aplicacién mas grande * como por ejemplo, un sistema de biblioteca. * @author (Escriba su nombre aqui.) * @version (Escriba la fecha aqui.) al public class Libro { J! Los campos. private String autor; private String titulo; i * Inicializa los campos autor y titulo cuando * se construya este objeto a 54 Capitulo 2 ll Comprender las definiciones de clases public Libro(String autorDelLibro, String tituloDelLibro) i autor = autorDelLibro; titulo = tituloDelLibro; + JJ Agregue los métodos aqui... + Ejercicio 2.75 Agregue al esquema de la clase Libro dos métodos, impri- mirAutor e imprimirTitulo, que impriman respectivamente, los campos del autor y del titulo del libro en la ventana terminal Ejercicio 2.76 Agregue un campo més, paginas, a la clase Libro para almacenar la cantidad de paginas. Este campo debe ser de tipo int y su valor inicial debe ser pasado al Unico constructor, junto con las cadenas para el autor y el titulo. Incluya un método de acceso adecuado para este campo, getPa- ginas. Ejercicio 2.77 Agregue a la clase Libro el método imprimirDetalles para imprimir los detalles del autor, el titulo y la cantidad de paginas en la ven- tana terminal. Los detalles sobre el formato de esta salida quedan a su libre eleccién. Por ejemplo, los tres elementos pueden imprimirse en una sola linea © bien se puede imprimir cada elemento en una linea independiente. También puede incluir algiin texto explicativo para ayudar al usuario a saber cual es el autor y cual es el titulo. Por ejemplo: Titulo: Robinson Crusoe, Autor: Daniel Defoe, Paginas: 232 Ejercicio 2.78 Agregue otro campo a la clase, numeroDeReferencia. Este campo puede almacenar, por ejemplo, un niimero de referencia para una biblio- teca. Debe ser de tipo String y ser inicializado en el constructor con una cadena de longitud cero (" ") cuando su valor inicial no sea pasado al cons- tructor mediante el parémetro. Defina un método de modificacién para este campo con la siguiente signatura: public void setNumeroDeReferencia(String ref) El cuerpo de este método debe asignar el valor del parametro al campo nume- roDeReferencia. Agregue el método de acceso correspondiente para ayudar a controlar que el método de modificacién funciona correctamente. Ejercicio 2.79 Modifique su método imprimirDetalles para que incluya la impresién del nimero de referencia. Sin embargo, el método imprimira el numero de referencia solamente si el campo numeroDeReferencia contiene una cadena de longitud distinta de cero. Si no es asi, en su lugar imprima la cadena «ZZZ». Pista: use una sentencia condicional cuya prueba invoque al método length sobre la cadena numeroDeReferencia. Ejercicio 2.80 Mocifique su método setNumeroDeReferencia de modo que cambie el contenido del campo numeroDeReferencia solo si el parametro es una cadena de tres caracteres como minimo. Si es menor que tres, imprima un mensaje de error y deje este campo sin cambios. 2.18 Resumen 55 Ejercicio 2.81 Agregue a la clase Libro un nuevo campo entero, prestado. Este campo representa un contador del nimero de veces que un libro ha sido prestado. Agregue un método de modificacion a la clase, prestar, que incre- mente el campo prestado en 1 cada vez que es llamado. Incluya un método de acceso, getPrestado, que retorne el valor de este nuevo campo como su resultado. Modifique imprimirDetalles para que incluya el valor de este campo con algiin texto explicativo. Ejercicio 2.82 Desafio. Cree un nuevo proyecto en BlueJ: ejercicio-calentador. Escriba los detalles del proyecto en el descriptor de! proyecto, la nota de texto que se ve en el diagrama. Cree una clase Calentador que contenga un solo campo entero: temperatura. Defina un constructor sin parametros. El campo temperatura debe ser preparado en el constructor con el valor 15. Defina los métodos de modificacién calentar y enfriar cuyo efecto es aumentar o dis- minuir el valor de la temperatura en 5° respectivamente, Defina un método de acceso que retorne el valor de la temperatura. Ejercicio 2.83 Desafio. Modifique su clase Calentador agregando tres nuevos campos enteros: min, max e incremento. Los valores iniciales de min y max deben establecerse mediante parametros del constructor. EI valor inicial del incremento en el constructor es 5. Modifique las declaraciones de calentar y enfriar de modo que usen el valor del incremento en lugar del valor explicito 5. Antes de avanzar con este ejercicio, controle que todo fun- cione bien. Luego modifique el método calentar para que no permita que la ‘temperatura pueda recibir un valor mayor que max. De manera similar modi- fique enfriar para que no permita que la temperatura tome un valor menor que min. Controle que la clase funcione adecuadamente. Luego agregue un método, setIncremento, que tiene un solo parametro entero que se usa para establecer el valor del incremento. Nuevamente controle que la clase funcione tal como se espera creando algunos objetos Calentador en BlueJ. Si se pasa un valor negativo al método setIncremento, csigue funcionando todo tal como se esperaba? Agregue un control para que este método no permita que se asigne un valor negativo al incremento.

También podría gustarte