Está en la página 1de 653
PROGRAMACION EN JAVA 5.0 JAMES P, COHOON University of Virginia JACK W. DAVIDSON University of Virginia TRaoUcciON Jesiis Sanchez Allende Dr. Ingeniero de Telecomunicacién Universidad Aifonso X el Sabio Pilar Moreno Diaz Licenciada en Matematicas Universidad Alfonso X el Sabio Gabriel Huecas Fernndez-Toribio Dr. Ingeniero de Telecomunicacién Universidad Politécnica de Madrid Ricardo Sosa Sanchez-Cortés Ingeniero en Informatica Universidad Alfonso X ef Sabio Gabriel Pastor Martin Ingeniero en informatica Universidad Alfonso X el Sabio MADRID - BOGOTA + BUENOS AIRES » CARACAS + GUATEMALA + LISBOA + MEXICO * NUEVA YORK « PANAMA + SAN JUAN + SANTIAGO + SAO PAULO AUCKLAND + HAMBUFGO + LONDRES + MILAN = MONTREAL « NUEVA DELHI + PARIS SAN FRANCISCO « SIDNEY « SINGAPUR + TOKIO * TORONTO Contenido Preracio Cariruto I: FUNDAMENTos DE JAVA, I. Primer programa 1.1.1 “Comentarios y espacio en Blanco 2 3 MEt0d0 wn 4 Métodes print) y printin() 5 Secuencias de Escape. 12 Caleulos simples, 12.1 Constante 122 Variables 123 Operaciones... 13 Tipos primitivos. 13.1” Tipo ine. | 132 Tipo char. | 133 Tipo double 14 Expresiones. | 14.1 Operadores unarios y binarios | 142 Precedencia... | 143 Conversién de operadores por extension y coercion. 1.4.4 Desbordamiento, subdesbordamiento y excepciones LS Programas interactives. : 1.6 Asignacién de variables primitivas 1.6.1 Intercambio... 1.62 Precedencia y asociatvidad de la asignacién.. 1.6.3 Incremento y decremento... 1.7 Caso prictico — Promedio de cinco nimeros 1.8 Resumen 1.9 Autoevaluacién 1:10 Ejercicios.. 1.11 Proyecto de programacion — Tu... 1.12 Proyecto de programacién — Zona de entrenamiento 1.13 Solucién a la autoevaluacién.. vi Contenido Capiruto 2: Cariruco 3: Capiruto 4: OBJETOS nnn aie 7 DE Clases... 68 2.2 Objetos y variables. 68 22.1 Inicializacion. 70 2.2.2 Null y referencias sin inic n 23° Asignacion a 24 Variables con modificador Final 78 25 Métodos y operaciones de Sering. 7 2.6 Caso de estudio — Conversion de fechas... 86 27 Resumen 91 28 — Autoevaluacion . 2 29 Ejercicios 2 210 Proyecto de programacion — %6 2.11 Solucién a la autoevaluacién 98 CLASES ae a =? 101 3.1 Preparacién. 102 32 Una clase muy simple.. 04 32.1 Variables de instancia y atributos 106 3.2.2 Constructor por defecto.. 107 3.23 Método de instancia.. 109 324 Uso... : 3.3 Métodos con parimetros y valor devuelto.. 16 34 — Conclusién. 127 35 Resumen. 127 3.6 Autoevaluacién 129 3.7 Ejercicios 129 38 Proyecto de programacion — Racionales 132 3.9 Solucién a la autoevaluacién.. 135 DECISIONES ssssnsen oe — 139 4.1 Algebra de Boole y tablas de verdad 140 4.1.1 Expresiones 16ghcas nn 140 42 Tipo Boolean 142 42.1 Igualdad entre Boolean y operadares de orden... 143 4.2.2 Revision de la Precedencia de los operadores. 146 43° Sentencia If 146 43.1 Evitar problemas 149 44 Sentencia IFelse.. Ist 45 Sentencias anidadas. 153 46 Estructura Ifelse-if... : 157 47 Comparacién de igualdad entre objetos. 161 48 Sentencia switch lea 49 Caso de estudio — Validacion de codigo | de comprobacién 172 410 Caso de estudio — Triingulos.. 176 4.11 Resumen. 181 4.12 Autoevaluacion 184 4.13 Ejercicios : 186 4.14 Proyecto de programacion — Asistente MEdiCO wun 192 415 Solucién a la autoevaluacion..... se 195 Car Capituto 5: ENTREACTO G1: PROGRAMACION CON INTERFAZ GRAFICA sr Capiruro 6: Cariruco 7: Contenido vit Bucte 7 mene 197 5.1 Sentencia White .. 198 5.2 Bucle For : a 207 5.2.1 Ambito de la variable de Indice 212 52.2 Cilculo del nimero de combinaciones. 212 5.3. Sentencia Do-while 214 5.4 Bucles anidados. : 218 5.5 Procesamiento sencillo de archivos 21 5.6 Caso de estudio — Analisis de un conjunto de datos. 227 5.7 Resumen... 234 5.8 Autoevaluacion.. 235 5.9 Ejercicios ae 236 5.10 Proyecto de programacion — Problema de los cuatro trabajadores temporales... 240 5.11 Solucién a la autoevaluacion 241 Gl.1_Interfaz grifica y programacién dirigida por eventos... GI.2_Caleuladora de la sensacién térmica.. GI.2.1 Constantes de clase y variables de instancia. G1.22 Construccién de la interfaz de usuario.. GI.2.3. Manejo de eventos y actionPerformed( © G1.24 Método main() nn. : G13 Resumen. GI4 Autoevaluacion GIS Ejercicios é : : GI. Proyecto de programacién — Zona de entrenamiento, GI.7__ Solucién a la autoevaluacién PROGRAMACION CON CLASES Y MéTODOS 6.1 Modificador STATIC. 62 Paso de pardmetros oh . : 286 64 — Métodos heredados y reeseritura . 289 65 Ambito y reutilizacién de nombres. 295 65.1 Reglas de ambito local 295 65.2 Reutilizacién de nombres... 296 66 — Sobrecarga 299 67 Ejemplos 306 68 Clases genéricas.... 315 69 Resumen... 317 6.10 Autoevaluacién. ‘ os veniam 318 611 Ejercicios.. : seniennnninen 321 6.12 Proyecto de pogramacién — Financiacién para un coche... 329 6.13 Solucién a la autoevaluacién..... ARRAYS Y COLECCIONES . 7.1 Requisitos basicos de las listas.. 7.2 Arrays de una dimension... 72.1 Definiciones : 72.2 Acceso los elementos Contenido Capiruto 8: 73. Bucle FOR iterador. ae 74 Operaciones simples con arrays 74.1 Extraccién 742 Buscar un valor. 743 Buscar el valor minimo. 75 Arrays y métodos... 75.1 Busqueda secuencial y busqueda binari 75.2. Inicializacién a cero. 75.3 Mostrar valores 7.5.4 Obtencién de valores e inversion 76 6.1 Método selecciénDirecta() 762 Calidad de selecciénDirecta() 7.7 Parametros en linea de comando worn 7.8 Arrays multidimensionales 78.1 Matrices.. 79 Colecciones... 7.10 ARRAYLIST 7.11 Algoritmos sobre colecciones. é 7.12 Caso de estudio — Graficos de tarta. 7.13 Resumen... 7.14 Autoevaluacién 7.15 Ejercicios . 7.16 Proyecto de programacién — Matrices. 7.17 Solucién a la autoevaluaciér HeRENCIA ¥ POLIMORFISMO Al3 8.1 Disefio orientado a objetos 4l4 8.1.1 PuntoTridimensional ais 8.1.2 PuntoColoreado, 423 82 Polimorfismo... 426 83 Matices de la herencia.. 428 83.1 Controlando el acceso.. 429 832 Atributos. 42 833 Conversiones de tipo.. 435 834 Ligadura dindmic 436 835 Final. 438 84 Clases base abstractas 439 85 Interfaces é es 443 86 Caso de estudio ~ Preparando el acuario 447 87 Resumen 88 Autoevaluacién 89 Ejercicios. z ae 8.10 Proyecto de programacién ~ Dispensador de cambio B11 Solucién a fa autoevaluacién.. 7.23 Inicializacién explicita.. 7.2.4 Arrays constantes, 7.25 Miembros ENTREACTO G2:PROGRAMACION CON INTERFAZ GRAFICA sesso Capituto 9: CapituLo 10: Capiruco Hs Capituto 12: : - Contenido ix 469 G2.1 Caso de estudio — Tipo de personalidad 470 G2.1.1 Antecedentes 470 62.2 Proyecto de programacién — Juego de adivinar. 483 Excerciones. eon 499 9.1 Manejo de excepciones.r.numm 500 9.2 Finally y el comando type vn 508 9.3 Creacion y lanzamiento de excepcione: 510 9A RESUMER vernnnnnne 9.5 Autoevaluacion 9.6 Elercicios 9.7 Proyecto de programacion — Un segundo vistazo SI7 9.8 Solucién a la autoevaluacién RESOLUCION RECURSIVA DE PROBLEMAS vos 10.1 Métodos recursivos.. 10.1.1. Nimeros y cuadrados de Fibonacci 525 10.2 Caso de estudio ~ Bisqueda binaria recursiva. 529 10.3 Método mergeSorti) 104 {Cun répido se puede ordenar? 10.5 Recursividad e iteracién.. 10.6 Caso de estudio — Permutacion de cadenas 10.7 Resumen wrnson 10.8 Autoevaluacion 10.9 Ejercicios.... 10.10 Proyecto de programacion — El fractal de Sierpinski 10.11 Solucién a la autoevalu . 552 Hives caer 553 U1.1 Planificacién. 1.1.1 Bjecucién después de un plaz H1.1.2 Ejecucién repetitiva. 11.1.3. Ejecuciones en instantes determinados .. 11.2. Suspensién del flujo de control 11.3. Caso de estudio — Animacién 114 Caso de estudio — Peces nadando 115. Resumen. 11.6 Autoevaluacién IL? Bjercici 11.8 Proyecto de programaciin — Mejores peces. 11.9 Solucién a la autoevaluacién... PRUEBAS Y DEPURACION 589 12.1 Pruebas.. 590 12.1.1 Pruebas: Un ejemplo. 591 12.1.2 Fundamentos del proceso de prueba 599 12.1.3 Revisiones e inspecciones.. 602 12.14 Pruebas de caja negra y de caja blanca, z 604 12.1.5 Pruebas de integracién y de sistema nn. 609 x Contenido 12.2 Depuracion . 610 12.2.1 Método cientifico 610 12.2.2 Técnicas de depuracién y consejos.. 613 123. Resumen... 616 124 — Auroevaluacién 617 125 Ejercicios ..n. ae 618 126 Proyecto de programacién — getList() 619 12.7 Solucién a la autoevaluacion 620 Apénpice A: TABLAS Y OPERADORE! eenentensenn 623, A.l Conjunto de caracteres Unicode 624 A2 Palabras reservadas. 625 3 Operadores y su precedencia 625 Apénpice B: _ E/S CON FoRMATo.. ene 629 BI Introduecién é 630 | B.2 __ Sintaxis del texto de formato. 630 ApENDICE C: APPLET. seen eee 635 .1 Una applet sencilla... 636 C2 Métodos de una applet... 638 C21 Método init)... 638 €22 Método start() 638 23 Método stop() 639 C24 Método destroy() 639 C25 Método paint() 639 3 Applet y subprocesos 642 C4 Seguridad de las applet... 645 C5 Resumen... 645 inpice seen ensue 647 Finns res el enpuaye pede DNS de“desarrofto madiitas, muchos para lar pra i fiplicaciones. de todo tier nel yends mltiproceso,mieracss gacas de uu frances yy lsportabildad gracias a-sw distio-de agit |e importance dela seguridad ylarobustez ha adquirida nn nuevo signifi Java dispone de amb a aol set oriented a oi ag6azicode los conceptes de progsamacin y la sor parte dels poblens y conepios ques mporanes enorme: tiea ae se pueden apreciar hasta que no se entiende sib uno, Por desgr aniaees na dif farea, Afigual que redictar bien, la programacién conlleva anos: deprictien: Ensehar a programar e& muchos aspectos a enseite redaciar se les ensenia kédactar leseddd buen prosa yrealizando gjercicios de redaceioh tepetidamente con lo ‘erganizarlas ideas de forma que puedapresentars de Laimanera mis wica ro van desarallando-lahabilidadsbnoatesaredeescebieun-péerafo o dbs a creat largasdisertaciones, como.cosayoyshistorias comtasioinformes.is. ; algoritmos de colecciones. + Capitulo 8: Herencia y polimorfismo—diseiio orientado a objetos; teu ilizacién; clase base; clase derivada; herencia tnica; super; relaciones es-un,tiene-un y usa-un; control de la herencia; miembros por defecto, protected y private; polimorfismo; clase base abstract; jerarquias de interface xvi Prefacio + Entreacto GUI-2: Programacién con interfaz grifica—casos de estudio en el disefio ¢ implementacion de interfaces grificas de usuario para calcular el tipo de personalidad y un juego de adivinacion. + Capitulo 9: Excepciones—sucesos anormales; excepciones; lanzar; probar; capturar; ‘manejadores de excepciones; finaly; especializacién de flujos. * Capitulo 10: Resolucion recursiva de problemas—funciones recursivas, ordenacién, busqueda, visualizacion * Capitulo 11 Hilos—miltiples flujos de control independientes; procesos; hilos; planifi- cacidn y repeticion de hilos; Timer; TimerTask; Thread; date; Calendar; JOpttonPane; dormir; animacién; software de sistema. + Capitulo 12: Pruebas y depuracin—desarrollo de software; revision de eédigo; prue~ bas de caja negra y pruebas de caja blanca; inspecciones; programas de prueba; cober~ tura de sentencias: pruebas unitarias, de integracin y de sistemas; pruebas de regresién; condiciones frontera; cobertura de caminos; depuracién. + Apéndice A: Tablas y operadores—conjunto de caracteres Unicode: palabras reserva das; operadores y precedencia, + Apéndice B: EAS con formato—Scanner; prin + Apéndice C: Applet—programacién de applet. INTERFAZ GRAFICA (GUD A partir de observaciones personales y de conversaciones con otros colegas, somos cons- cientes que no es posible introducir las interfaces graficas de usuario (GUI) en un primer curso de programacién, Puede que no haya tiempo suficiente para realizar una introduc cién a la API de swing y a la programacién dirigida por eventos. Por tanto, hemos aislado este material en dos “entreactos”, GUI-I y GUI-2, y son opcionales. Sin embargo, los docentes que deseen utilizarlo, deben hacerlo tras presentar los conceptos de clases del Capitulo 3, Hacemos la distincién entre interfaces grdficas de usuario y creacién de imagenes grifi- cas. Con la API estindar de Java resulta muy sencillo dibujar rectangulos, lineas, eirculos, 6valos, triéngulos o poligonos. Su dibujado es casi tan simple como mostrar texto por la consola, Otros ejemplos de otros capitulos utilizan estas posibilidades de Java. Estos ejem- plos pueden también tomarse como opcionales. Sin embargo, nuestra experiencia nos indica que a los alumnos les encanta crear imagenes graficas y que los conceptos de la programa cién orientada a objetos resultan més sencillos de entender con ejemplos que tengan una componente visual. USO DEL LIBRO El bro consta de mas material que el que se puede tratar en un primer curso. Es deliberado, ya que permite que los profesores puedan seleccionar los temas ha impartir sobre progra- imacién y desarrollo de software. El libro se ha diseiiado para impartir estos temas con fle- xibilidad. Por ejemplo, si el profesor desea retrasar la presentacién de las clases, empezar a tratar el material sobre estructuras de control (Secciones 4.1-4.9 y las Secciones 5.1-5.5), De forma andloga, si un profesor desease presentar los arrays antes que las clases, se puede utilizar el material sobre arrays (Secciones 7.1-7.4 y la Secci6n 7.8) antes del tema de clases. Excepto por el ejemplo de la Seccién 8.2, el tema de herencia podria darse antes que el tema de arrays, a Profacio xvii El tema de pruebas y depuracién del Capitulo 12 se puede impartir en cualquier momen- to una vez se haya contado el tema de arrays. Nosotros utilizamos el siguiente esquema en nuestro primer curso, Semana Tema Material 1 Fundamentos de programacion Capitulo 1 2 Maniputacién de objetos Capitulo 2 (Secciones 2.1-2.5) 34 Clases Capitulo 3 5 Sentencias condicionales Capitulo 4 (Secciones 4.1-4.7, 4.10) &7 — Bucles Capitulo 5 (Secciones 5.1-5.5) 8 Interfaces griticas GUFl y GUE2 910 Amptiacién de clases Capitulo 6 11-12 Arrays y coleceiones Capitulo 7 13-14 Herencia y polimoriismo Capitulo 8 MATERIAL ADICIONAL En el sitio Web ww.mhhe. com/cohoon puede obtener el eédigo fuente y los archivos de datos de todos los programas del libro original en inglés, Todos los programas han sido adaptados al espafiol manteniendo Ia filosofia original de los mismos. Ademés, puede des- ccargat un completo paquete de trasparencias, en formatos PDF y PowerPoint, y presenta- ciones de varios entornos de programacién en Java, También puede encontrar en nuestro sitio Web http: //ww.cs virginia. edu/ javaprograndesign otros recursos docentes adicionales. Estos dos sitios Web estin en inglés. Al buscar los archivos, tenga en cuenta que la versién inglesa tiene un capitulo mas de numeracién con relacién a esta edicién en castellano del libro, SOBRE LOS AUTORES Jim Cohoon es profesor det departamento de informatica de la Universidad de Virginia y antiguo miembro del personal técnico de los laboratorios Bell de AT&T. Pas6 a la universi- dad tras recibir su titulo de doctorado por la Universidad de Minnesota. Fue nominado dos veces en este departamento al premio al mejor profesor de la universidad. En 1994, recibié tuna beca Fulbright para Alemania, donde impartié un curso sobre programacién orientada a objetos ¢ ingenicria del software, Entre sus intereses de investigacion se encuentran los algoritmos, el diseiio asistido por ordenador, las estrategias de optimizacién y la docencia ‘en informatica, Es autor de mas de 75 articulos y libros en estos campos. Es miembro de la Association of Computing Machinery (ACM), el ACM Special Interest Group on Design Automation (SIGDA), el ACM Special Interest Group on Computer Science Education (SIGCSE), el Institute of Electrical and Electronics Engineers (IEEE) y el IEEE Circuits and Systems Society. Es miembro del ACM Council, ACM-SIG Governing Board Executive Committee, antiguo miembro del ACM Publications Board y fue organizador de SIGDA. Puede ponerse en contacto con él en cohoondvirginia.edu. Su pigina Web es http:// www. cs. virginia. edu/cohoon. Jack Davidson tambien es profesor del departamento de informatica de la Universidad de Virginia, Pasé a formar parte de la universidad tras obtener su titulo de doctorado en la Universidad de Arizona, Ha recibido el premio NCR’s Faculty Innovation Award por sus Prefacio innovaciones en Ia ensefanza. Entre sus intereses de investigacién se ineluyen los com- piladores, la arquitectura de compiladores, el software de sistemas y la doceneia en info- miitica. Es autor de mis de 100 articulos en estos campos. Es miembro del ACM, el ACM Special Interest Group on Programming Languages (SIGPLAN), el ACM Special Interest Group on Computer Architecture (SIGARCH), SIGCSE, el IEEE y la IEEE Computer Society, Ha sido editor asociado de Transactions on Programming Languages and Systems, la revista lider del ACM sobre lenguajes de programacién y sistemas, desde 1994 hasta 2000. Ha sido organizador del Programming Language Design and Implementation Conference (PLDI "98) de 1998 y formo parte del comite de programa del SIGPLAN Workshop on Languages, Compilers, and Tools for Embedded Systems (LCTES 2000) de 2000. Puede ponerse en contacto con él en jwd@vi rginia.edu. Su pagina Web es http: //www.cs.virginia.edu/~jwd INFORMACION ADICIONAL Los siguientes libros se pueden utilizar como primer libro sobre el lenguaje de programa- cién Java, + Ken Amold, James Gosling y David Holmes, The Java Programming Language, Thitd Edition, Addison-Wesley; Junio 2000. * Bill Joy (Editor), Guy Steele, James Gosling y Gilad Bracha, The Java Language Specification, Second Edition, Addison-Wesley; Junio 2000. Los siguientes libros son buenos textos sobre las bibliotecas estandar, disefio orientado a ‘objetos mis avanzado y desarrollo de programas. + David M. Geary, Graphic Java 1.2, Mastering the JFC: AWT, Volumen 1, Prentice Hall; Septiembre 1998, + David M. Geary, Graphic Java 2, Volumen 2, Swing, Prentice Hall; Marzo 1999, + Joshua Engel, Programming for the Java Virtwal Machine, Addison-Wesley; Junio 1999. + Cay S. Horstmann y Gary Comell, Core Java 2, Volumen 1, Fundamentals, Prentice Hall; Agosto 2002. + Cay S. Horstmann y Gary Comell, Core Java 2: Volumen Il, Advanced Features, Prentice Hall; Diciembre 2001. + Matthew Robinson y Pavel A. Vorobiev, Swing, Manning Publications Company; Febreto 2003. + Stephen A. Stelting y Olav Maassen, Applied Java Patterns, Prentice Hall; Diciembre 2001 + Sun Microsystems, Java Look and Feel Design Guidelines: Advanced Topics, Addison Wesley Professional; Marzo 2001 + Al Vermeulen (Editor), Scott W. Ambler, Greg Bumgardner, Eldon Metz, Alan ‘Vermeulen, Trevor Misfeldt, Jim Shur y Patrick Thompson, The Elements of Java Stvle, Cambridge University Press; Enero 2000. + John Zukowski, Java Collections, APress; Abril 2001 Projo... xix AGRADECIMIENTOS Queremos agradecer a la Universidad de Virginia que nos proporcionase el entomo para que este libro saliese adelante, En particular, queremos dar las gracias a Jack Stankovic y Mary Lou Soffa por su incansable esfuerzo en liderar el departamento de informitica 4 su situacién de relevancia nacional. También queremos agradecer a Aaron Bloomfield, Jenna Coboon, Joanne Cohoon, Tom Horton y John Knight todos sus comentarios. Gracias a Hannah Cohoon por sus dibujos de peces y a 15 Cohoon por sus disefios de los iconos Gracias a todas las personas de McGraw-Hill por su esfuerzo para que el libro se convir- seen una realidad. En particular, queremos dar las gracias al editor Alan Apt por su apoyo y entusiasmo; a Kay Brimeyer, Sheila Frank y Laura Fuller por su profesionalidad; a Rick Noel por liderar el equipo de disefio de cubierta; a Kevin Campbell por la maquetacién; a Mary Cahall por sus capacidades organizativas y a Michael Weitz por sus ideas de marke ting: Gracias muy especiales para Melinda Bilecki, nuestro editor de desarrollo—apre mos sobremanera todos tus esfuerzos, Gracias a las siguientes personas, revisores, lectores, probadores, por sus valios0s co- mentarios y sugerencias sobre el texto y el resto de materiales, A. Arokiasamy, Multimedia University of Malaysia David Aspinall, University of Edinburgh Ivan Bajic, San Diego State University Dwight Bamett, Virginia Tech Vivekram Bellur, University of Virginia David Bethelmy, Embry-Riddle Aeronautical University Robert Biddle, Victoria University of Wellington Elizabeth Boese, Colorado State University Gene Boggess, Mississippi State University Mike Buckley, University at Buffalo Robert Burton, Brigham Young University Judith Challinger, California State University, Chico Errol Chopping, Charles Sturt University Tivas Cicekli, University of Central Florida Charles Daly, Dublin City University J. Greggory Dobbins, University of South Carolina Neveen Elnahal, University of Virginia Stephen Fickas, University of Oregon Jeffrey Forbes, Duke University Gerald Gordon, DePaul University Heng Aik Koan, National University of Singapore Michael Huns, University of South Carolina ‘Norm Jacobson, University of California, Irvine Cerian Jones, Montana Tech Katherine Kane, University of Virginia Cathy Key, University of Texas, San Antonio Abigail Knight, Tandem Schoo! Barry Lawson, University of Richmond Susan Lindsay, University of Virginia Evelyn Lulis, DePaul University Profacio Lauren Malone, University of Virginia Stephanie Kim Marvin, University of Virginia Ame Maus, University of Oslo Blayne Mayfield, Oklahoma State University Stanley McCaslin, Longwood University Jim McElroy, California State University, Chico Daniel McCracken, City College of New York Hugh McGuire, University of California, Santa Barbara Christoph Mlinarchik, University of Virginia Keitha Murray, lona College Faye Navabi, Arizona State University Richard Patti, Camegie Mellon Hal Perkins, University of Washington Pete Petersen, Texas A&M University Roger Priebe, University of Texas Vera Proulx, Northeastern University ' Graham Roberts, Flinders University Roy Ruhling, University of Virginia Celia Schahezenski, Montana Tech Carolyn Schauble, Colorado State University Carol Scheftic, California Polytechnic State University, San Luis Obispo Jesse Barrack Schofield, University of Virginia John Scott, Massachusetts Bay Community College Eric Schwabe, DePaul University Mike Scott, University of Texas Barbara Ann Sherman, University of Buffalo Barry Soroka, California Polytechnic State University, Pomona Michael Tashbook, State University of New York, Stony Brook David Vineyard, Kettering University Queremos dar las gracias a nuestro primer editor y, ahora amiga, Betsy Jones. Le desea- mos suerte en su nueva aventura, Gracias a nuestras esposas, Audrey y Joanne, y a nuestros hijos por su esfuerzo y coope- racién en que este libro saliese adelante. Por iltimo, gracias a los usuarios del libro. Agradecemos cualquier comentario o suge- rencia e ideas para mejorar su contenido. Por favor, escriba al editor McGraw-Hill, o envie tun mensaje a cohcon@virginia edu o jw IPC JW.D CAPITULO | FUNDAMENTOS DE JAVA en Java. En él se van a presentar una serie de programas que interact ‘usuario utilizando texto como entrada y salida de informacién. También se pre- entan los tipos primitivos de Java, Con estos tipos y los operadores asociados es manipulen variables y valore Se presenta también con gran detalle el uso di forma de obt e utilizan para modifi iento clave que debe entender y que todo mo se obtienen partir de lo que introduce el usuario, de forma que los programas hagan que indique de un prog) el sequimiento d 2 Programactin on Java 5 BR rrimer procrama El primer programa tiene el nombre YostrarPredi ccion.Java. Se va a utilizar para descri= bir a estructura de un programa en Java. El objetivo del programa es mostrar una prediccién ue realizé Thomas Watson. Las dos lineas de la prediccion es la safida (lo que se escribe) en una ventana de consola, es decit, en una ventana que permite que el usuario escriba eo- mandos. La salida del programa seri escribir en la pantalla lo siguiente: Creo que existe mercado para unos cinco ordenadores mas Watson, 12M, 1943 En el Listado 1.1 se puede ver una copia del archivo MostrarPrediccion. java, En la Figura 1.1 se puede ver qué hace el programa cuando se ejecuta. HI Autores: J. W. Davidson 1) Objetivo: mostrar na de consola HT método maint): punto de inicio de Ta ap public static void main(Stringt] args) | 1 2 3 4] public class MostrarPrediccion | 5 5 7 a System.out.print(*Crea que existe mercado para"); 3 System.out.printin(" unos cinco ordenadores.*); 10 System.out.printin(* Thomas Katson, IBM, 1943."); fie) az. En niicleo del programa se concentra en las tres sentencias que muestran el mensaje (ineas 8-10). Cada una de estas sentencias es una instruccién que hay que ejecutar. Al ejecutarse las tres se muestra la prediccién, EI método llamado main‘) se construye con las sentencias de las lineas 7 a la 11. Un método en Javaes un término para dar nombre a una unidad de cédigo que realiza una accion o implementa un comportamiento, En otros lenguajes de programacién se utilizan los térmi- nos finci6n, procedimiento o subrutina en lugar de método. El método main() forma parte de la clase Mostrar? rediccion (Iineas 4-12). Una clase define una forma de definir objetos. Algunos programadores lo llaman declarar en lugar de definir. Puede pensar que una clase es como un modelo o una plantilla de un objeto. Ademis, de tener métodos que definen comportamientos, también puede tener atributos (campos de datos 0 valores). El resto de elementos del programa son comentarios, que documentan quienes son los autores, el objetivo del programa, y las partes que tiene (Iineas 1, 2 y 6), y el espacio en blanco, que se utiliza para que los distintos elementos del programa aparezcan més separados (lineas 3 y 5). ‘A continuacién se tratard con detalle el formato y significado de las doce lineas de cédigo que conforman el programa. Después se tratarén los fundamentos de la definicién de clases, Ta formacién de sentencias, la definicién de métodos y la salida de texto por pantalla, Capitulo 1. Fundamentos de JAVA 3 Figura I.1__Ejecucién de MostrarPrediccion.java. imbolo. del sistema end: javac MostrarPrediccion. java end: java MostrarPrediccion Creo que existe mercado para unos cinco ordenaderes | Thomas Watson, TBH, 1943. + ‘end: \ Recursos Puede encontrar el cédigo fuente de todos los programas originales de este texto en el sitio ‘Web www. javaprograndesign.com. COMENTARIOS Y ESPACIO EN BLANCO Algo que a veces resulta dificil de apreciar a los principiantes con la programacién es que | tun programa lo puede leer mucha gente. Un programa debe tener una parte de Java legal (la | parte que entiende ef compilador). Sin embargo, los programadores también tienen que ser capaces de entenderlo, | Enel desarrollo de un software comercial pueden trabajar miles de programadores. Algunos de ellos quertin afiadir nuevas funciones, mientras otros se dedican a corregir errores. Para realizar su tarea, los programadores deben poder entender cémo funciona el programa que se les ha asignado. Por tanto, es importante escribir y documentar los programas de forma que | otra persona pueda entender lo que hace si fuese necesario depurarto (eliminar los evrores). | Incluso cuando se escriben programas para uso personal, a menudo es necesario modifi- carlos, Aunque se entendiese cdmo funcionaba el programa cuando se escribi6, meses 0 afios, aris, se pueden olvidar detalles importantes. El mecanismo que permite introducir notas en un programa es el uso de comentarios Estas notas no las procesa el compilador. Su objetivo es ayudar a describir y documentar cémo funciona el programa y quienes son sus autores. Teniendo en cuenta la importancia de los comentarios, el programa MostrarPredic ion. java comienza en las lineas 1-2 con dos comentarios de cabecera de una lined. El uso del cardcter// doble indica que et resto de la linea es un comentario que el compilador ignorard 4 Programaciin en Java 50 ~ Comentario para identificar quienes Son os autores del programa a J1 Autores: J. P. Cohoon y J. H. Davidson V1 Objetivo: mostrar una cita an 12 ventana de consola — Dos barras seguidas indican que el Comentario que describe el resto de la tinea es un comentario ‘objetivo del programa Con estos comentarios el lector del programa puede conocer quién es la persona de con- tacto para preguntarle sobre el programa y sus objetivos. En la linea 6 se puede encontrar otro comentario de una linea. El comentario describe algo importante sobre e! método que le sigue: ¢s el método donde comienza la ejecucion del programa, método main(): punto de inicio de 1a aplicacion Observe que el comentario de la linea 6 se encuentra sangrado (mas dentro) que el texto de la linea 4. Cuando se escribe un programa, se sangran las lineas para indicar que se en- cuentran dentro de los elementos donde se incluyen. El comentario de la linea 6 y el método que le sigue se encuentran con sangria porque forman parte de la definicién de la clase HostrarPrediccion. Cuando un componente de un programa se compone de partes, esas partes también se eseriben con mayor sangria. Por ejemplo las lineas 8 a 10 forman parte de las acciones del ‘método ma in(), por eso se les ha dado una sangria adicional con respecto a la linea 7. Cada, nivel de sangria suele afiadir tres 0 cuatro espacios. El comentario y el método se encuentran sangradas porque forman i bare dela clase Mostrar 11 método main(): punto de inicio de la aplicacién public static void main(Stringf} args) | System.out.print(*Creo que existe mercado para"): System.out.printin(* unos cinco ordenadores.*) System.out.printin(* Thomas Katson, [8M, 1943.7); a publi¢ class MostrarPredsc Las sentencias se han sangrado ain mas porque son elementos de! ‘método main() Las lineas 4 y 5 del programa se han dejado en blanco, Las Iineas en blanco pueden ser tan importantes como los comentarios, Permiten identificar visualmente las distintas seccio- nes de un programa, consiguiendo que el programa sea mas sencillo de leer y entender, Los caracteres espacio en blanco (espacios, tabuladores, etc) que haya entre los distintos elemen- tos del programa se ignoran durante su compilacién, por lo que se pueden insertar como se consideren apropiados, |, Capitulo 1 Fundamentos de JAVA 4 Atencién al detalle > El delimitador de comentario de una linea / hay que escribirlo sin dejar espacios en blanco centre las dos barras. Si existe un espacio entre las barras su significado es completamente diferente. Por ejemplo, un espacio entre las dos barras podria significar que se ha escribo de forma incorrecta una expresin aritmética, en lugar de interpretarse como un comentato. HERD Ls, PALABRAS CLAVE E IDENTIFICADORES En la cuarta linea del programa MostrarPrediccion. Java comienza la definicién de la clase MostrarPrediccton, Todos los programas en Java tienen al menos una definicién de clase. aN class MostrarPrediccion ( ' El cardcter abre lave es un a jmitador que indica que lo aue sigue forma parte de la clase la \ clave public significa que que se esta definiendo lo podran La palabra clave class utlizar otras significa que se va a dar clases nombre a una clase Elidentificador es lo que dae nombre ala clase La definicion de la clase para el programa Mostrar rediccion java empieza con dos palabras clave public y class. Las palabras clave son palabras con un trato especial en el lenguaje Java para un cierto uso. Como tienen un significado especial, el programador no puede cambiarlas v no se puede utilizar para dar nombre a otros elementos. Las palabras clave van siempre en mintsculas, por lo que PUBLIC Publtc. no son palabras clave. Sin embargo, son nombres validos en Java, lo que en programacion se llaman identificadores. No es recomendable utilizar esas palabras como identificado- res, ya que alguien que lea el c6digo puede confundirse al no darse cuenta de Ia diferen- cia de las mayisculas. En el Apéndice A.2 puede ver la lista completa de todas las pa- Iabras clave, En este libro, todas las palabras clave se escriben en negrita en un tipo monoespaciado, La palabra clave class de la linea 4 indica que empieza la definicién de una clase, En Java se pueden colocar modificadores delante de la palabra clave class. Estos modificado- res pueden poner restricciones o calificar la naturaleza de la clase que se define, El modifi- | cador public indica que otras clases pueden utilizar ésta para crear y utilizar objetos. Un } archivo puede contener como maximo una clase pub! . ‘A continuacién se encuentra el nombre de ta clase que se estt definiendo, En Java es obligatorio que el nombre de una clase puiblica sea el mismo que el nombre del archivo don- | de se guards, Por tanto, el nombre de esta clase ¢s MostrarPredtceton. 2S ES ES ES 6 Programacidin en Java 5. Después del nombre de la clase se encuentra un caricter abre lave {, Java utiliza las aves (J para delimizar las sentencias que forman una clase. Para la clase MostrarPreci ccion, el cierra llave de fa linea [2 ¢s fa que casa con el abre llave de la linea 4. Por tanto, la definicién de la clase se encuentra entre las linens 4 y 12. Las reglas para construir nombres validos son que deben ser identificadores vlidos de Java, ‘no ser palabras clave, Las reglas para construir un identificador vilido son las siguientes: + Un identificador debe comenzar con una letra del alfabeto, un cardicter de subrayado (), el signo déiar (8) + Los siguientes caracteres del identificador, si hay mis, deben ser alfabéticos, digitos, subrayados o signos de d6lar + No puede haber espacios en blanco entre los caracteres que forman el identificador. + Um identficador no pueden tener mas de 65.535 caracteres Como ejemplos de identificadores vilidos de Java pueden estar altura primervator —aflos, Scantidad Mu « Los identifieadores Hon chen y x podrian parecer somprendentes. Sin embargo, como Java es un lenguaje internacional, en lugar de utilizar los antiguos caracteres ASCH utiliza ef conjunto de caraeteres Unicode, que es un estindar internacional, Este conjunto de caracte- res es suficiente para escribir en los principales idiomas del mundo. En particular se puede escribir en alemén, en griego, en hebreo, etc. Ademiis de NostrarPrediccion, el resto de identificadores en el programa son main, 8, System, out, print y printin, El identificador ma in es el nombre del método donde se inicia la ejecucién del programa; String y Systen son nombres de clases de Java; 48 y out son variables que permiten referenciar otros recursos del programa y arnt y println son nombres de métodos que permiten escribir textos en la consol Eleccién de nombres ejemplo, utilice 21 tura en lugar deh o 21t. Ya se tratardn los convenios de escritura de ‘nombres cuando se vayan presentando los distintos elementos de un programa. El convenio utitizado en et libro se basa en los convenios de codificacién estindar de Java, Puede en- contrar el documento sobre convenios de codificacién en el Web de Sun Microsystems en. www. javasaft.com/docs/cadecony El punto de inicio deta ejecucién de un programa en Java es el método ma in( ). Como ya se ha indicado anteriormente, un método es un fragmento de cédigo con un nombre. El conve- nio de estilo del libro va a ser incluir después del nombre de los métodos un par de parénte- sis, Estos paréntess sirven de pista visual para saber que se trata de un método. En general, la definicién de un método en Java tiene los siguientes elementos, en el orden indicados, donde ta cursiva indica que son opeionales. ERED SS ES ES Capito |. Fundamentos de JAVA. Nostficadores Tipo Nombre, Lista ' a devuelto del metodo ‘de parémotras’ ‘ae sentencias Ze ! ! Propiedades Eltipo dei dentifcador _Descripcion dela. —_‘Instrucciones para elmétode valor que__—-del nombre’ informacion que requiere__implemerttare deveieel del método —"‘elmetodo para evar a comportarnento dl metodo cabo au tares eto Enel métodonain() de la clase MostrarPredi ccion se han utilizado tos modificadores publ icy static, E] modificador pub! ‘c indica que este método lo pueden usa Esas otras clases se pueden defini bien en el mismo archivo o en otros distintos. El modifi- cador static indiea que el método main() es un servicio de la clase y no que no es necesa- rio crear ningtin objeto para uilizarlo, En programacién orientada a objetos estos métodos se llaman métodos de clase Algutios métodos devuelven (retornan) valores que se utilizarin en otras partes del pro- grama cuando se les invogue para que se ejecuten. Por ejemplo, ef método raiz cuadrada—* Enlos optics 2 deyuelve la raiz euadrada de su pardmetro, es decir, el valor que se da al método para que y2astestaze pueda llevar a cabo su tarea. Si al método raiz euadrada e le invoca con el valor 64 devuel- | ganahte ve 8, y si se le invoca con el valor 144 devuelve 12 | geahetce éne! _Algunos métodos Hlevan a cabo su tarea y no devuelven ningin valor. A este tipo de Capo Ssevera_métodos, como el método main(), se les indica como vo‘d para indiear, justamente, que no conmayer desl devuelven ningin valor. En a definicidn, al nombre del método le siguen un abre y cierra paréntesis. Los parén- tesis pueden contener, opeionalmente, una lista de pardmeiros formales. Estos parimetros describen los tipos de informacién que se traslada al método cuando se le invoca. Por ejem- plo, el método raiz cuadrada esperar como parimetro un nimero, En el caso del método moi n<) de una aplicacién, Java obliga a que haya un parimetro det tipo Strinat], donde Ser‘ngC? significa una lista de textos. Su significado real se vera en el Capitulo 7 Eleccién de nombre Por convenio, el pardmetro del método a in() tiene como nombre args. Asi pues, todos los programas que aparecen en ef libro tienen un método ma in() con la lista de parmetros, formales Stringt) args. ‘Tras los paréntesis aparecen un parde abre y cierrallave que indican el inicio de la accién del método, En el método main() del programa Host rarPredi con. Java, la lista de sen- tencias son las que se encuentran en las lineas 8 a 10. System.out.print("Creo que existe mercado para") System-outprintin(" unos cinco ordenadores.*): System.out.printin(" Thomas Watson, IBM, 1943."); En Java, una Gnica sentencia puede ocupar més de una linea, por lo que se necesita un delimitador para indicar que la sentencia ha terminado. Para ello se utiliza el punto y coma () de la misma forma que se utiliza un punto para terminar esta frase de este parrafo. Cuando un intérprete de Java empieza a ejecutar una aplicacién en Java, el flujo de control comienza en el método main() de la aplicacién. Entonces se empiezan a ejecutar Ee 8 Programacion en Java 5.0 todas las sentencias del método main() en orden, Por tanto, cuando se ejecuta el programa MostrarPrediccton. java primero se ejecuta la sentencia de la linea 8, despues la de la linea 9 y, por ultimo, la de la linea 10 HEREE “er 0005 pRINTO ¥ PRINTLNO Como ya se ha visto anteriormente, la lista de sentencias que define el comportamiento del método maio() son ystem.out.print(*Creo que existe mercado para") System.out.printin(* unos cinco ordena System.out-arintin(* Thomas Watson Estas sentencias escnben la cita en la ventana en que se ejecuta el programa (véase la Figura 1.1). Se muestra gracias a las capacidades de la clase System, que es una de ls clases esténdar (oficial) de Java. En particular, System forma parte del paquete de nombre va" Jang, donde en Java paguete significa una biblioteca de software. El programa MostrarPrediccion. java necesita acceder al miembro (componente) out de Syston, Para ello el programa lo selecciona de System utilizando un punto (.), que eel mecanismo selector de Java, EI miembro out es una variable, por lo que guarda un valor. Mediante dicho valor el programa puede acceder a un objeto que muestra un texto en la ventana de la consola donde se ejecuta la aplicacién. Este objeto es un flujo de salida (output stream). Un flujo es un objeto que representa un dispositivo de salida como un monitor o un dispositivo de entrada como un teclado 0 un archivo. Los métodos asociados con un objeto flujo permiten que el programador interact con el dispositivo sin tener que preocuparse con ios detalles de bajo nivel de cémo funciona cada operacién del dispositiv. Por su asociacién con la ventana de consola, al flujo de salida System. out se le lama Slujo de salida estindar. Java utiliza la clase estindar Print Stre2n para representar el flujo de salida estandar. En la Figura 1.2 se muestra una representacién de System. out y su rela, cién con PrintStrean, Lavariable Systemout permite acceder a un flujo de ‘sala del tipo Print Stream El atributo de destina dela Impresin de este objet Print Stream es la ventana de intin(String s) : void. | consol print(String El comportamienta de un objeto Print Stream presenta un modelo de alta nivel para laimpresion Capitulo 1. Fundamentos de JAVA igura 1.3. Seleccién de elementos miembro. Elpunto indica que se desea selecconar un Et punto indica que se elemento membro dela desea selecconar un clase System elemento miembro de la \ / clase aut system out print, = ¢string™ . x El elemento miembro out de System es ln abjeto fujo de ealida que se if ‘encuentra asociado de forma Fexto “string” como predeterminada con la ventana de parametro de print|) consola donde se ejecuta la aplicacion La clase System se define en el Método de out. La invocacion del método print() paquete estandar java.ang jardmetro se muestre en al fyjo de sali EL flujo de salida estindar tiene los métodos miembro de nombres print) y print int) que se utilizan en el programa para escribir a prediccién. Los métodos miembro son el me- canismo por el que un objeto dispone de un comportamiento. Se accede a los métodos print’) y print in() tras realizar varios procesos de seleccién con el selector punto, En la Figura 1.3 se muestra el proceso de seleceidn de la invocacién dela linea 8, Cuando se invoca el método_print() el comportamiento que presenta es mostrar el valor del parimetro a través del flujo de salida asociado. En este caso, el flujo de salida es la ventana de la consola donde se ejecuta el programa y el pardmetto utilizado es el literal "Crea que existe mercado para unos cinco ordenadores.*. Un literal de un string es una secuencia de caracteres delimitada por dobles comillas ("). ‘No se permite que un literal de un string ocupe més de una linea del programa. Por tanto, la siguiente sentencia no es una sentencia valida, System.out.printin("Creo que existe mercado para") _— No valida, Un literal de lun string no puede ‘ocupar mas de una linea Cuando se invoca a un método, se ejecuta la accién asociada al mismo. En el caso del método print (), su ejecueién hace que el argumento string se muestre en al ventana de la consola en el mismo punto en que se encuentre el cursor de Ja ventana. Un cursor es un simbolo especial de Ia ventana. Habitualmente suele presentarse como un bloque o un subrayado parpadeante. 10... Programacién en Java 5.0 Tras escribir el argumento, el cursor se sitia inmediatamente detrés del dltimo caricter escrito. En la siguiente tepresentacién de la ejecucién de la salida de print (), el simbolo i seri la representacin del cursor. Creo a te mercado para a Tras ejecutar la primera ‘sencencia can print() el cursor se siti desp de laa" de ‘para’ El método print In() difiere del método print () en que después de escribir el pardme- tro, mueve ef cursor al inicio de la siguiente linea de la ventana. Por tanto, tras ejecutar la sentencia del primer print n( la salida del programa seri como la siguiente Creo que existe me . — Tras ejecutar la primera sentencia con printin) ‘cursor se sitia al inicio de la siguiente linea do para unas cinco ordena Con la ejecucidn de la segunda sentencia printn() el programa completa su salida Creo que existe mercado para unos cinco ordenadores Thomas Watson, IBN, 1943 Experimento a> N Los siguientes programas son muy similares a os trareecicetan.3ava yaque tambien muestran informacién textual. Puede pensar en ellos como experimentos de uso de los métodos print () y printin(}. Bs muy recomendable que pruebe el cédigo y le haga, ‘modificaciones, Observar los cambios que producen las modificaciones que haga en el ‘comportamiento del programa suele ser un mecanismo muy eficaz de darse cuenta de eémo funcionan los programas. ‘Suponga que en lugar de mostrar una cita se quiere mostrar una lista de tareas. 1 Ene: enviar una felicitacién a mamé. 9 May: enviar una felicitacién a papa. 15 May: enviar una felicitacién al padrino. 20 Sep: enviar una felicitacién a los primos. Si se ha entendido NostrarPrediccion. java, el programa para esto deberia resultar muy sencillo, El programa se lamar YostrarTareas. java, Puede ver el programa en el Capitulo 1. Fundamentos de JAVA AN stado 1.2. Fijese que no se ha incluido el comentario sobre los autores. Se seguird igual el resto del libro, ya que son obvios. ‘Cada una de las sentencias print n() del método maint) de cribe una nueva linea en la pantalla, rarTareas. java es: 1 Ene: enviar una felicitacton a mama 3 May: enviar una felicitacion a papd 15 May: enviar una felicitacién al padrino. 20 Sep: enviar una felicitacion a los primos. ado 1.2. MostrarTareas.java. Ohjetive: mastrar una serie de tareas por panta public class MostrarTareas | { main(J: punto de inicia de 1a apticacton public static void main(Stringl] args) | System.out.printIn(7l Ene: enviar una felicitacidn a mand.) System.out-printin(79 May: enviar una felici System.out-printin("ls May: enviar una felicity System.out.printIn( SECUENCIAS DE ESCAPE Suponga, ahora, que desea escribir un programa que muestre en pantalla la siguiente cita de la obra “Blancanieves” de los Hermanos Grim: “Era un crudo dia de invierno, y los copos de nieve caian del cielo como blaneas plumas. La Reina cosia junto a una ventana, cuyo marco era de ébano.”” Uilizando las siguientes sentencias con print) y print ]n() se muestra el texto apro- piadamente Systen System.out-printin("y los copos de niev System.out .print("coma blancas plunas System.out -printin("La Reina costa junto a u System.out .printIn("cuyo marco era de ébano out print(*Era un crudo dia de invierno catan del clelo ventang Lo que se muestra en la pantalla es lo siguiente: Era un crudo dia de invierno, y los copos de nieve catan del cielo coma blancas plumas. La Refna costa junto @ una ventana. cuyo marco era de ébano 12 Programacién en Java 5.0 Sin embargo, suponga que desea que también aparezcan las comillas al comienzo y al final de la cit, En el Listado 1.3 se muestra un programa para ello. El programa tiene de nombre Ci taconcomi! 13s. ava, 1. 2 3) public class ci a 5. // maint): punto de inicio de ta aplicacton 6: public static void main(Stringl} args) 7 System.out.print("\"Era un crudo dia de fnvierno, *) | 8 System.out.printIn(*y los copos de nieve catan del cielo") | 9 ‘out.print( "como blancas plumas. *); 10: y printin(‘La Reina costa junto a una ventan; n System.out-printin(*cuya marco era de ébano,\. ' oe) 3. El programa utiliza secwencias de escape para escribir las dobles comillas, Una secuencia, de escape es una secuencia especial de dos caracteres que representa un cardeter. Si no se utilizasen estas secuencias de escape no se podrian utilizar literales de string que contaviesen. el caracter comillas dobles. En Java se utiliza el caricter barra hacia atrs para iniciar una secuencia de escape. La secuencia para las comillas dobles es \". Por tanto, para mostrar las comillas dobles al inicio y final de la cita, se modifica el método maint) de Ci taconcomi} Tas. java de la siguiente forma, System.out.print(*\"Era un crud dia de fnvierno, System-out printIn(ty los copos de nieve catan del Syotem.out:print( "como Blancos plumes. = System-out:printin(*La Reina costa junta a una ventana, "); System.out-printin(*cuyo ‘2 de ébano.\""); jel En la primera sentencia se ha afiadido la secuencia de escape de comillas dobles al inicio del literal del string. En la tltima sentencia se ha afiadido al final. La salida del programa es centonces la siguiente "Era un crudo dia de invierno, y los copos de nieve caan del cielo como blancas plumas. La Reina casta junto a una vi cuyo marco era de ébano." de En Java se definen distintas secuencias de escape. Por ejemplo, \t es la secuenci escape para el cardcter tabulador, \n es el cardcter de nueva linea y \\ el cardeter barra hacia atris, En la Tabla 1.1 se puede ver la lista completa, Capitulo 1. Fundamentos de JAVA AB Tabla |.1__Secuencias de escape en Java. Secuencia de escape Significado B borrar hacia atras \n nueva linea \t tabulador \r salto de linea \\ barra hacia atras \" comillas dobles \" comilla simple El caricter nueva linea permite mover el cursor al inicio de la siguiente linea en medio de un literal de un string. Por ejemplo, en el programa 1 sMascotas. java que se muestra en. cl Listado 1.4 se utiliza s6lo una sentencia, System. out print In( *Cuqui \ntiila\nCaty\nki ty") Listado 1.4 MisMascotas.java. Hf Objetivo: mostrar los nombres de mis mascotas public class Mistascotas [ 11 main(): punto de inicio de 1a aplicacion public static void main(Stringt] args) System. out print] a("Cuqui \nMi1a\nca \nkity) Lo que muestra en la salida estindar cuatro lineas, con los nombres de mis cuatro mas- cotas, Cuqui Mila Caty kity Enel programa NuestraTabla. java del Listado 1.5 se utiliza el carécter tabulador para ‘que aparezcan los datos en columnas. La salida del programa es la siguiente Nombre Altura Pte Juan 2 carlos 40 ana 39 Inés 37 Lucta 42 14 Programacion en Java 5.0 Los programadores suelen utilizar mas la secuencia de escape del tabulador que el carie- ter tabulador en los literales de los string, ya que indica explicitamente a quien lea el eédigo que se utiliza un tabulador en lugar de aparecer un niimero arbitrario de espacios, A continuacién se veran programas que utilizan algunos de los tipos numéricos que pro- Porciona Java, Se utilizaran esos tipos y las operaciones definidas para crear y manipular valores y variables. Esta manipulacién de valores y variables es una destreza vital para la programacién, eS Listado 1.5 MuestraTabla.java. ean 11 Objetivo: mostrar datos en una tabla Public class MuestraTabla | #7 main(): puniy de intcto ge 1a aplicacron Public static void main(Stringt] args) | System,out.printin("Nombre\taltura\teié* ' System-out .print iat System.out. print In{"Juan\t1'79\t42" System.out. print in(*Cartos\tl"70\t40") System.out -printIn(*Ana\tl'73\t39"}: System.out -printin(*Inés\t1"65\t37") system-out n(*Luct atl 'B2\t42") L 2 3 4 5 7 a 3. Errores sintdcticos Cuando se compila un programa en Java que no es correcto, el compilador genera una lista de errores sintdcticos. Un error sintéctico es una violacién de las reglas que deti- nen qué es un programa correcto. Por ejemplo, suponga que en la definicién de la clase MostrarPredicci on se hubiese escrito incorrectamente public class MosLrer?rediceton ¢ El compitador de Java mostraré un mensaje de error indicando que no esperaba ‘encontrarse un carécter abre paréntesis. Cuando un compilador indica que ha encontrado un error de sintaxis en una determinada linea, también hay que tener en cuenta las lineas anteriores. Por ejemplo, un error tipico al teclear un programa es olvidar el punto y coma, Este error de sintaxis se detecta en la linea siguiente a la que no tiene el punto y coma, Se ‘muestra en esa linea el error porque no se detecta que falta hasta que se sigue leyendo en 4a linea siguiente. De hecho es el primer elemento de la linea lo que no se espera ya que esperaba encontrar un punto y coma. ERED concatenacién coneatenacién hay " pesa* que acceder ala i ubleacion de J memoria de pesoEnLibras para obtener su valor Para una persona ai pes 75.8 Tibras y mide 4.5: ples La tiltima sentencia con print) n() requiere un cierto andlisis tiene un IMC de * + Math.round( ime System.out.printin¢ El programa no muestra simplemente el valor dela variable inc, como hari Ia sentencia System.out.printin(*tiene un INC de" + imc); Con esta sentencia la salida del programa seria Para una persona que pesa 75.5 Vibras y mide 4.5 pies, tiene un IMC de 18.24391242817714 Al mostrar 14 digitos decimales aparece un mimero muy grande que no tiene ningiin interés real. Por tanto, en lugar de mostrar directamente el valor de inc, en el programa se muestra Math. round( mc). Capitulo 1. Fundamentos de JAVA 3 System.out.printin(*tieme un IMC de * + Mé El método Hath. round’) es un método de la clase estindar de Java jay2.1ang. Como es un método de clase, se trata de un servicio que proporciona la clase y que no re~ quiere que se utilice ningtin objeto de la clase. El método recibe un valor del tipo double y devuelve ef valor entero més cercano. Por tanto, la salida del programa es Para una persona que esa 75.5 libras y mide 4.5 pies tiene un IMC de 18 El programa IMC. java ha permitido demostrar la utilidad de las constantes, las variables y los operadores. A continuacion se presentan todos los tipos primitivos, HRRERM tr 0s primitivos | Ademés del tipo doub)e Java tiene otros siete tipos primitivos. Hay cinco tipos primitivos, enteros byte, short, int, Tong y char (char también es el tipo cariicter); otro tipo primitivo de punto flotante floaty un tipo ligico boolean, cuyos valores son true y fa1se, Todos, los nombres de los tipos primitivos son palabras ciave. Los distintos tipos primitivos tienen distintas capacidades de representacién. Por ejemplo, short utiliza 2 bytes para representar un entero y un int utiliza 4 bytes. Por ello, una varia- ble short puede guardar valores enteros del intervalo ~32.768 ... 32.767 y una variable int puede guardar valores enteros del intervalo ~2.147.483.648 ... 2.147.483.647. Otro ejemplo de las capacidades de representacion esti en el tipo F1oat que utiliza 4 bytes para representar nimeros en coma flotante y el tipo doub! e utiliza 8 bytes. Como consecuen- cia, una variable #1 oat tiene unos 6 digitos de precisién mientras que un valor double tiene unos 15 digitos. El motivo por el que se dispone de distintos tipos numéricos es para permitir a los pro- ‘gramadores acceso a todos los tipos que se suelen utilizar en distintos tips de computadoras, ‘como por ejemplo PC, teléfonos méviles, PDA, ete. En los programas que se ven en el libro normalmente se uilizan los tipos primitivos int, char y double. Representacién En el Apéndice 4.3 se muestra una representacin completa de los valores que se pueden representar con cada uno de los tipos primitivos. Ree TIPO INT La mayor parte de los lenguajes de programacién disponen de un tipo bésico para guardar y manipular variables y valores enteros. En Java este tipo es ‘nt. 24 Programacién en Java 5.0 Listado 1.7 CelsiusAFahrenheit.java. 1. // Objetivo: Convertic una temperatura de grados Celsius a grados Fahrenheit 2 3! public class CelsiusAFahrenhett { a 5. main(): punto de inicio de 1a aplicacion 6. public static void mainiStringl] args) { 7 JI establece la temperatura en grados Celsius 8 int celsius = 28: 9 0 1! convierte 2 su equivalente en grados Fahrenheit int fahrenheit = 32+ ((9 * celsius) / 8) 1) questra el resultado a System.out.printin(*Una temperatura Celsius de") io System.out.printin(” "+ celsius) | 16. System.out .printin(*equivale a una tenperal | a System.out.printin(* "+ fahrenheit): Java proporciona los operadores aritméticos binarios entre enteros habituales como la | suma +, la resta -, la multiplicacién * y la divisiOn /, donde el término binario indica que el ‘operador se aplica a dos operandos. Por ejemplo, 1 ~ 2 vale 3, 18 - 11 vale 7 y 3 * 21 vale 63. La division entera suele confundir a quien esté aprendiendo a programar. Cuando se | utitizan operandos enteros, el resultado de la divisién entera es un valor entero, es decir, no | existe resto, Por ejemplo 20 / 6 vale 3, 19 / 11 vale 1, 4 / 5 vale 0y 8 / -3 vale -2. | En Java también existe el operador médulo (2). Este operador devuelve el resto asocindo | ala division entera. Por ejemplo, 18 % 3 vale 0, 17 8 2 vale 1, 1216 vale 12, 7-3 vale 1 y—7%3 vale -1, Enel Apéndice A.3 puede ver una lista completa de los operadores entre enteros. En Java no existe un operador de potenciacién. Sin embargo, en la clase estindar Java. lang. Mat sf existen métodos para realizar la operacién de potencia. En el Listado 1.7 se presenta el programa Cel siusAFshrenheit.java que utiliza varios | operadores entre int que convierten una temperatura Celsius a su equivalente entero en Fahrenheit. En la conversién se utiliza la formula Farenhe 2 + 2 Celsius 32+ 2cek La salida del programa es | Una temperatura Celsius de } 28 | equivale a una temperatura Fahrenheit de | 82 En el programa variable ¢1sius guarda el valor de la temperatura a convertr. Al escribir la definicién de la variable int fahrenhest, puede darse cuenta que se est evaluando una expres | int celsius = 28: Capitulo 1, Fundamentos de JAVA — 28 int fahrennett = 32 + ((9 * ¢ 18): FF correcta Por ejemplo, no se podria expresar la definicién de la siguiente forma: int fanreneit ~ 32 + (19 * celsius); // incarrecta Como los operandos son enteros, el término 9 / 5 de la sentencia incorrecta se evalia 1, lo que hace que la definicion fuese equivalente a int fahrenheit ~ HI incorrecta La implementacién correcta reordena y agrupa la expresién del 9 con celsius para que su producto sea el que se divide por 5, IPO CHAR : Relacionado muy de cerca con los tipos numéricos se encuentra el tipo char. En Java los caracteres se codifican utilizando 2 bytes en el conjunto de codificacién Unicode. ‘Normalmente, un programador no utiliza una representacién literal de un carécter. En su lugar suele representar un earicter entre comillas simples. E] compilador tradueiré automati- ccamente a representacién del caricter en su codificacién Unicode. Por ejemplo, un progra- mador utilizaria 'a" cuando necesitase referirse explicitamente al cardcter a en Iugar de uti- lizar su valor Unicode 97. Como la representacién subyacente de un char es un entero, las ‘operaciones definidas para los tipos enteros también estén definidas para las variables char. El conjunto de caracteres Unicode garantiza que para el alfabeto inglés Estas relaciones resultan de utilidad pues permiten conocer la posicién de distintos ca- racteres respecto a otros. Ademés, del conjunto Unicode se puede saber que tad genera un entero que es la codificacion del eardcter "3". De hecho, para cualquier digito d excepto el 9, la expresién ‘d’ = | da el siguiente digito en secuencia. Por tanto + 10° +L seevaliiaa "1"; + ‘LT +L seevaliiaa ‘2°; + 18° + Lseevaliaa ‘9° ‘También existe la siguiente relacién para las letras minésculas latinas del alfabeto inglés + tat + Lseevaliiaa ‘b's + tbh + Tseevaliaa ‘c's + ty' + Tseevaliaa'z EEE 2 26 Programacion en Java 5.0 + Jf Objetivo: Mostrar 1a arttmética de ca Ademés, también existe la siguiente relacién en cuanto a las letras maytisculas latinas del alfabeto inglés + c+ Lseevaliiaa '8" + 181+ 1 seevaldaa'c"; + TY Tse evalia a *2". Estas relaciones también son utiles pues permiten clasificar un cardcter como letra ma- yviscula 0 miniscula 0 como digito, siempre que se considere aparte la letra ‘i En el Listado 1.8 el programa Mindscul aaMaytiscua..java proporeiona un ejemplo de aritmética de char. El programa convierte una letra miniscula en inglés a su equivalente ma- yuscula. El cardcter que se desea convertir se guarda en la variable char letraMindscut. char Tetrattinuscula = "c* La letra mayiscula correspondiente se guarda en JetraMayascula char letraMaydscula = ‘A’ + (letraMindscula El término (Jetratindscula ~ 'a") calcula la diferencia en la codificacién Unicode entre los caracteres que representan letratindscula y ‘2'. En este caso la diferencia es 99 =97, es decir, 2, lo que significa que el cardcter que representa letraMindscua se encuen- ta codificado dos posiciones después que el caricter ‘s'. En general, la diferencia entre ‘cualquier letra miniscula inglesa y la ‘2 representa el desplazamiento eon el caricter Como las letras mayiisculas tienen también codificaciones consecutivas, aiadiendo un des- plazamiento de ‘A” genera la letra maytiscula correspondiente. La salida del programa es Listada LQ Mi igeulaAMaytiscula java. public class MindsculaaMaydscula Vf main(): punto de inicto de Ta aptic public static void mein(Stringl] args) { 11 eapieza con una letra en mindscula char letraMiniscula = ‘c's 17 La convierte a su equivalente en maydscula int TetraMayascula = ‘A’ + (letraMind 1) muestra el resultado System.out.printIn("E] equivalente en mayuscula de"); System-out .printin(* "+ letraMindscula) System.cut.printin("es*) System.out.printin(* "+ letraMayéscula) HEEB 1-0 vouste Capitulo 1. Fundamentos de JAVA 27 quivalente en maydscula de Literales de caracteres y literales de textos Un error habitual cuando se comienza a programar es confundir los valores caricter con Jos valores string. Un literal de carécter es una codificacién de exactamente un caricter que se representa entre comillas simples. Por tanto, °3', "Ki", '=" y "\n" son, todos ellos, valores literales de caracteres vilidos. Las expresiones "2" y 'abc' no son literales de caracteres vilidos: "2" no es un literal de caracteres pues no se encuentra entre comillas, simples, y '2bc’ no es un literal de caracteres porque abc no es una codificacion de un solo caréeter. Un literal de un texto o de un string de caracteres es una codificacién de cero 0 mis ccaracteres entre comillas dobles. Por tanto, "abc," y "a" son literales de textos vilidos. Las expresiones '" y '25c' no som lterales de textos vilidos pues ambas utitizan comillas, simples. Clase Character Como ta conversién entre mayisculas y minisculas suele realizarse con frecuencia en los programas, la clase estindar de Java javs.}ang-Character proporciona los siguientes. ‘métodos, que ademés funcionan para cualquier idioma, no sélo para inglés: ae char Character. toLowercase(char ch) ‘ Devuelve el caricter equivalente en miniscula del caricter ch, si existe: si existe devuelve ch. char Character. toUppercase(char ch) Devuelve el cardcter equivalente en maytiscula del carécter ch, si existe: si no existe devuelve ch El tipo double utiliza 8 bytes para representar un valor de coma flotante. En Java se pueden utilizar los operadores aritméticos habituales excepto la potenciacién. En el Apéndice A.3 puede ver una lista completa de los operadores sobre valores de coma flotante, Enel Listado 1.9 del programa kiénetrosaMi11as.java se convierte una distancia double de kilémetros a su equivalente en millas. El programa utiliza la siguiente con- version: Millas = 0,621371 x Kilometros La salida del programa es 3.2 kilémetros = 1.9883872 millas 28 Programacin en Java 5.0 Listado 1.9 KilémetrosAl L. 7 objetivo: Convertir kilometros a miiTas 2 3. pubtte class Kilonetrosam a 5. // main(): punto de inicio de la aplicactén &. public static void main(Seringl] args!) 7 define Jas constan 8 Final double WILLAS POR KILOMETRO ~ 0.621372; 9 10 17 inate Tos kilonetros i double distanciaén<’lometros = 3.2 12 13 11 convierée a mitTas 1 double distanciagnMiltas ~ distanciaénkilénetros 15) Y'MILLAS_POR_KTLOMETRO 16. 17 {J muestra el resultado é 18 System.out.prinzin(distanciaénkilémetros + * ki ldnetros = * 19 ‘t distanciagmlas + 7 miT)as*); 200 ay s Infinito y més allé 2 En Java se dispone de varias constantes predefinidas que se pueden utilizar en los progra- ‘mas. Estas constantes son miembros de las clases Integer, Souble y Float. Estas clases forman parte del paquete estindar 5 Integer. MAK_VALUE El mayor valor positivo de tipo int. Integer .NIN_VALUE El menos valor negative de tipo int. Doubie.MAK_VALUE EI mayor valor positivo de tipo double. Double. MIN_YALUE | El menor valor positivo Doubie. POSITIVE_INFINE EI valor infinito positivo del tipo double. Un valor que es mayor que cualquier ‘otro del valor finito double. Double. NEGATIVE_INFINITY EI valor infinito negativo del tipo double, Un valor que es menor que cualquier | ‘otro valor finito double. Double. Na El valor noes un nimero (Not-a-Number) del tipo double. Es un valor double que no se corresponde con ningiin valor numérico. Double. Nal no se puede comparar ccon ningin otro valor double ni siquiera consigo mismo. Por ejemplo, como Ia divisién por cero no esta definida, 1.0/0.0 se evalia a Doub) e..N de tipo double. En la clase Flot se definine un conjunto similar de constantes para el tipo ‘como los de Doub con el tipo double. Capitulo | Pundamentos de JAVA — 29 Como se puede observar en las lineas 14-15, a veces las sentencias no caben apropiada- ‘mente en una nica linea, Esta situacién no genera un problema, ya que Java ignora los es- ppacios en blanco entre elementos del programa, Por tanto, aunque la expresién de inicializa- ci6n de 0: stanci aEnMi1 as ocupe dos lineas ello no afecta a su evaluacién. El convenio para dividir una expresion larga en varias lineas es que la linea que continia deberia empezar on un operador y si fuese razonable, la linea que continiia deberia estar sangrada de forma que quede debajo de la expresién que continiia. Con estas dos medidas se indica a quien lea el programa que la linea es continuacion de la expresién de la linea anterior. aes Notacién decimal y cientifica En Java se pueden escribir los literales de coma flotante de dos formas bisicas, en notacién decimal o cientifica. Un niimero en notacién decimal consta de una parte entera y una parte decimal separadas por un punto. Tanto Ia parte entera como Ia paste devinnal pueden no cxistir. $i existen, tanto la parte entera como la parte decimal son nimeros decimales. Por ejemplo, 123.456, 0.0, .9y 1. se encuentran en notacién decimal. ‘También se pueden expresar con niimeros en coma flotante utilizando la notacién cien- nifica. Un mimero en notacién cientifica consta de un niimero en notacién decimal seguido don caricter ¢ 0 E seguido de un exponente. El exponente es un literal decimal entero. Por ejemplo, 1.23e10, 0.23E-4, ~45.e23 y 23. 6812 son literales en coma flotante escritos en notacién cientifica. Estos niimeros son equivales a 1.2310", 0.23x10%, 45x102 y 23.6810", respectivamente, EXPRESIONES En los ejemplos anteriores se han elegido cuidadosamente las expresiones para que tengan Ja evaluacién obvia. Por ejemplo, fijese en la definicién de la variable fahrenhe’ t del pro- ‘grama Cei siusAFahrenhett. java. int fahrenhett = 32 + ((9 * celsius)/5); El uso de los paréntesis fue deliberado, de forma que fuese clara Ia forma en que se eva- ita la expresién ‘Suponga la inicializacién de la variable expr en el siguiente fragmento de cédigo int expr = 4+ 2% 6; Parece como si pudiese haber dos posibles valores para la variable expr. Si en primer lugar se evalia la suma, expr se inicializa a 30; si se realiza en primer lugar la multiplicacién se inicializa a 14. Ahora suponga el siguiente eédigo System.out.printin(S / 2.0): {Qué valor se muestra? La respuesta depende de si la divisién que se realiza cuando se evalia 5 /2.0 es una divisidn entera 0 en coma flotante. De hecho estas evaluaciones de 4 + 2 * Sy5 / 2.0. Java no son ambiguas. En esta secciGn se tratarin las reglas de Java para la evaiuacion de expresiones. Estas reglas aseguran 30 Programactin en Java 5.0 que on Java ninguna expresién es ambigua, En particular, las reglas de Java hacen que las, cexpresiones anteriores inicialicen expr a 14 y se muestre el valor 2.5, HERES oP eravones UNARIOS Y BINARIOS Las expresiones son el mecanismo de Java para realizar operaciones con valores y variables Es el medio de calcular nuevos valores a partir de otros. Los valores y las variables con las que se opera se denominan operandos. El proceso de aplicar una operacion a los operandos se denomina evaluacién de una expresién. La evaluacién de una expresion da como resul- tado un valor y un tipo de Java. La nocién de que una expresion se evalia tanto a un valor como a.un tipo es muy importante La forma mds simple de una expresién en Java es un literal o una variable sin ninguna operacién. Suponga que la variable tananoMuestra se define de tipo tnt int tamanomuestra Entonces el resultado de evaluar la expresién ‘tamanioMues: La operacién que se aplica es la que consigue el valor de la ubicacién en memoria asociada con la variable tanaraMuestra El operador ~ en las siguientes expresiones | | | | esel valor int de 20. En un cierto sentido, la operacién se aplica a la variable tamanoMues~ | es un operador unario, donde el término wnario significa que se aplica a un tinico operando. En Java existen varios operadores unarios. En estas expresiones se esté utilizando el opera- dor unario de cambio de signo para cambiar el signo de un valor. Por tanto, el primer resul- tado es el valor int -23. Si se supone que n es una variable double con el valor -10.5 double n = -10.5 Entonces la expresién -n se evaliaal valor double 10.5. El operador unario positivo se incluye por simetria con el de cambio de signo. La expresion. 284 i | se eval al valor int 244, | ‘Como ya se ha visto en la introduccién a los tipos primitivos, en Java existen muchos | operadores binarios. Por ejemplo, las expresiones oF g+ ie 19.82 28 se evalian, respectivamente, a los valores int 126, int 2, double 26.72 y double -1.7, HRREERME rrecevencia Capito 1. Fundamentos de JAVA 3 Aunque aritméticamente el resultado sea el mismo utilizando tanto literales como varia- bles, en Java se especifica que cuando se evaliien operaciones binarias se evalie primero el operando de la izquierda antes que el de la derecha, La multiplicacién debe ser explicita La ecuacién de una linea se eseribe normalmente como y= mx + 6, En esta formula se tiende implicitamente que m y xe multiplican una por otra. En Java no existe la multiplica- cin implicita. La exptesién mx + 5 utiliza la operacién de suma entre las variables mx y b. Como en muchos lenguajes de programacin, en Java se pueden escribir expresiones compues- tas por varios operadores unarios y binarios. Por ejemplo, suponga la siguiente sentencia, int resultado = 3 * 5 Dependiendo de si se hace primero la multiplicacion o la divisién, el valor de la variable ul tado puede ser 7 0 6 En general, para evaluar una expresién se necesita un conjunto de reglas de precedencia y reglas de asociatividad que indiquen el orden en que se aplican los operadores. Primero se va a tratar la precedencia, A cada operador se le asigna un nivel de preceden- cia. Los operadores con mayor nivel de precedencia se aplican antes que los operadores con menor nivel de precedencia, Las expresiones aritméticas se evaliian de la misma forma que se aprendieron en la escue- la. Los operadores paréntesis () tiene el mayor nivel de precedencia. Los operadores unarios y+ tienen mayor precedencia que los operadores de multiplicacién *, division / y médulo Los operadores multiplicativos tienen mayor precedencia que la suma y la resta En la Tabla 1.2 se especifican en parte los niveles de precedencia de los operadores arit- méticos y de agrupamiento (los paréntesis). En el Apéndice A.3 puede ver una tabla come pleta con todos fos operadores. Por lo que en la definicién int expr =4+2+5, Ja variable expr se inicializa a 14 y no a 30. Se inicializa de esta forma porque la multipti- cacién tiene mayor precedencia que la suma. Tabla 1.2 Precedencia basica de operadores y su asociatividad. Precedencia, Operador Asociatividad 7 oO No asociativo 3 +y> unarios Asociatividad derecha 1 “15 Asociatividad izquierda ul + Asociatividad izquierda 32 Programacién en Java 5.0 Fijese en los siguientes ejemplos de expresiones: 2) 348 ff Ia diviston tiene mayor precedencia que la sume “a+ 4/1 e? cambio de signo tiene precedencia soore 1a muitiplicacién B+7%2 ff 2] modulo tiene mayor precedencia que 12 sume En la primera expresién, como el operador de divisién tiene mayor precedencia que el de la suma, en primer lugar se hace la divisién. El resultado es 0, al que se suma 5 para evaluar- se al valor int 5, En el segundo ejemplo, se aplica primero el operador de cambio de signo | al 8, yel valor resultado -é se multiplica por 4 evaluindose la expresién al valor int 32. En la tercera expresién, se realiza primero la operacién médulo que se evahiia al valor 1. A este valor se le suma & dando como valor de la expresion el int 2 Para modificar el orden de evaluacién se utilizan los paréntesis. Suponga que se desea caleular el promedio de tres variables double 2, b y c. El siguiente fragmento de cédigo no es correcto. double p os arbte/ 3.0: //Promedio incorrecto Coma el operador divisién tiene mayor precedencia es el que se aplica primero, Esta expresion es equivalente aa~b+ (c/ 30) Teniendo en cuenta la precedencia de operadores, primero se calcula la division ¢ / 3.0. A continuacién, se calcula la suma a + b. Después se suman estos dos resultados intermedios. Para ‘obtener el resultado deseado se escribe Ia expresién utilizando paréntesis de la siguiente forma. b+c) /3.0:\//Promedio correcto \ Les paréntesis agrupan los términos cuya suma va ‘ser el operand izquierdo de la division double promedio = Las expresiones entre paréntesis se pueden anidar. Es decir, una expresion entre parén- tesis puede contener mis expresiones entre paréntesis, En estos casos primero se evalian las, expresiones entre paréntesis mis internas. Suponga la siguiente expresion: @+Gea~5/ 4-2 ‘Como la expresién entre paréntesis (3 + 2) se encuentra anidada dentro de otra expresion entre paréntesis, es la que primero se evalia. Después, se evaliian las expresiones entre los paréntesis extemos. El resultado final se evalita al valor int 13. ‘Ademis de las reglas de precedencia, también se necesitan reglas de asociatividad. Estas, reglas de asociatividad son las que indican cémo se evalita una expresi6n con operandos del mismo nivel de precedencia. Esto ocurre, por ejemplo, en la expresién de inicializacién de la definicién de la variable resui taco del inicio de esta seccién. int resultado = 3* 5/2 Como se puede ver en la Tabla 1.2, Ia multiplicacién y la divisién tienen asociatividad izquierda. Esta asociatividad hace que el compilador evalde los operandos de izquierda a de~ recha, Por tanto, en la expresidn de inicializacién de la variable result, el 5 se asocia con el ‘operador de su izquierda y el valor correcto al que se evahia esta expresién es el valor int 7 Recuerde que la divisién entera devuelve un nlimero entero. Capitulo 1. Fundamentos de JAVA 33 j Uso de los paréntesis Aunque es importante conocer las reglas de precedencia, normalmente se utilizan parénte~ sis para indicar explicitamente el orden de evaluacién aunque realmente no sean necesarios. Esta técnica permite entender mejor el eédigo haciéndoto més legible. Esta comprensién es ‘importante si hay que modificarlo posteriormente. Por ejemplo, la expresién atbeera- 3.0 ‘yla expresién con paréntesis, (a+b) +c fa) - 3.0 realizan los mismos céleulos, pero el significado de la segunda queda mucho més claro, CONVERSION DE OPERADORES POR EXTENSION Y COERCION Hasta ahora, se han considerado expresiones numéricas en las que todos los operandos eran del mismo tipo. Pero, zqué ocutte si uno de los operandos es del tipo int y otro es del tipo char? ¢O si un operando de una multiplicacién es del tipo int y el otro es del tipo double? En total, hay 49 posibles combinaciones de operandos para cada uno de los operadores nu méricos binarios. En lugar de tener distintas operaciones aritméticas para cada una de las posibles combinaciones de operandos, en Java se aplican reglas de conversion unarias sobre los operands antes de realizar las operaciones. Una de las reglas que se lleva a cabo sobre si se aplica aritmética de enteros o de coma flotante es la siguiente: + Si cualquiera de los operandos es de coma flotante, entonces se realiza la operacién en coma flotante, Si no, se realiza aritmética de enteros. tras reglas aseguran que los operandos se convierten al mismo tipo de valor. Una de estas reglas es la siguiente: + Sicualquiera de tos operandos es de tipo double, entonces el operando que no sea del tipo double se extiende autométicamente, es decir, se convierte al tipo double. Por ejemplo, suponga que se tienen las siguientes definiciones. Entonces, las siguientes expresiones son expresiones enteras ¥y las siguientes son expresiones en coma flotante 34° Programaciénen Java 5.0 We En las siguientes expresiones de coma flotante, los operandos enteros se extienden a double antes de realizar la evaluacién. 11.29 + 199: tid Si el resultado de una expresién de inicializacién entera se utiliza para inicializar una variable de un tipo diferente al de la expresién, los valores se convierten al tipo de la variable por extensién o por coercién. Por ejemplo, en las siguientes sentencias el valor int de la expresién 5 * 5 se amplia a double en la primera definicién y se realiza una coercién a char en la segunda. double 2 = 5 ¥ 5; char D = 5 * 5: Para ver informacién detallada sobre las reglas de conversién aritmética, puede consultar el manual de referencia de Java The Java Language Specification, J. Gosling, B. Joy, G. Steele, and, G. Bracha, Addison-Wesley, New York, 2000. Puede encontrar una versién en Tinea del texto en el Web en ww. javasart.com Para el operador + hay cierta sutilezas para las reglas de conversion unarias. Si al menos tuno de sus operandos es un String, se realiza la concatenacién, sino se realiza la suma, Suponga el siguiente fragmento de cédigo. {Qué se genera en la salida? Para determinar la respuesta se utiliza la regla de que + presenta asociatividad izquierda, tring s=1+2+ "3%; String t= "1" +2 +3 Systen.out.printin(s): System.out print in(t. Por tanto la salida es 33 123 Capitulo 1. Fundamentos de JAVA 38 Como + es asociativo por la izquierda, en la expresién de inicializacién | + 2 + "3" se cevalda en primer lugar la suma 1 = 2, Por tanto, s se inicializa con el valorde la concatenacion de 3+°3° Por la misma razén, en la expresion de inicializacién "1* + 2 +3. se evalda en primer ugar la concatenacién "1" + 2. Por tanto, t se inicializa al valor de la concatenacién de *12 DESBORDAMIENTO, SUBDESBORDAMIENTO Y EXCEPCIONES Elmanee de atsene! Capital 9. Al evaluar operadores aritméticos pueden generar un valor que es mayor o menor que los tipos enteros que se pueden manejar. En estas situaciones se produce lo que se denomina, respectivamente, desbordamiento (overflow) y subdesbordamiento (underflow). No hay ninguna sefial que indique en un programa en Java que se ha producido un desbordamiento oun subdesbordamiento. Por ejemplo, al ejecutar el siguiente fragmento de c6digo ero = Integer MAK_VALUE int desdordam{entolnt = mayorEntero * mayorEntero: System.out.printIn(mayorEntera +" * * + mayorentero +" se evalda en Java a * + desbordamientotnt) muestra lo siguiente 2147483647 * 2147483647 se evalda en Java a1 Por tanto, tenga mucho cuidado cuando realice célculos con niimeros muy grandes o muy pequeiios. En Java, si se genera una sefial automaticamente cuando se intenta realizar una divisién por 0. Suponga el siguiente cédigo, donde se intenta dividir por 0. Como factor se define al valor 1, la expresién (factor - 1) se evalia a0. int factor = 1 int resultado = 2 / (factor - 1); System.out printin("Se termind 1a divi 6m por cero.) Este fragmento de cédigo nunca ejecuta la sentencia con print] n(). Dividir por cero es luna operacién que se supone no se debe hacer. Es lo que se conoce como una excepetén. El proceso de sefializario es lo que se conoce como Janzar una excepcién. Si un programa no tiene cédigo que capture la excepcién, el programa termina En la siguiente seccién se tratara el desarrollo de un programa que interactiie con el usuario mediante el uso de sentencias de entrada y salida. HERI Procramas INTERACTIVOS Una de las mayores deficiencias de IMC. java es que e! peso y Ia altura de la persona se han fijado en el programa. A no ser que conozea a alguien de ese peso y altura, el programa no 36 Programacién en Java 5.0 Para okt informacion de lag AP estandar de fa puede wevevascFtcore tiene mayor interés. Para que sea itil, en general debe poder realizar entrada y salida de datos (E/S) de forma interactiva con el usuario, Lo que se quiere hacer es un programa para calcular el IMC con los datos de peso y altura que el usuario desee. Este programa se puede escribir modificando el programa IHC. java del Listado 1.6 para que utilice un objeto flujo «que sea capaz de extraer u obtener los valores que el usuario eseriba en el teclado, culadora de IMC Intraduzca e1 peso (en libras): 130.0 Introduzca 1a altura (en pies): 5.75 ara una persona que pesa 130 1ibras y mide5.75 pies tiene un IMC de 19 En este ejemplo de ejecucién del programa el texto en negrita es lo que el usuario escri- be en respuesta a la peticién de peso y altura. Se utilizara este convenio en el resto del libro. Esta salida es lo que genera el programa Calculadora IMC. java del Listado 1.10. El programa Caiculadora IMC. java empieza con una sentencia import. import java.utiT.* Una sentencia import indica que el programa necesita acceder a otros recursos de Java. Para crear y acceder al objeto flujo de entrada que sirve para poder conseguir los valores, el programa utiliza la clase Scanner que se encuentra definida en la biblioteca de software estindar java.uti1 En a terminologia de Java, a una biblioteca de software se la llama paguete 0 interfaz de programacién de aplicaciones (API). Como en un programa sélo se conocen de forma im- plicita las clases definidas en el paquete java. lang es necesario importar la clase Scanner dela API uti Existen cientos de API que se pueden utilizar en los programas en Java. Por ejemplo, existen API para desarrollo multimedia, criptografia, telefonin, recemocimiento de habla, et. En Java los recursos que se encuentran en una API son principalmente clases. Lacclases y otros elementos de una API se suelen organizar de forma jerdrquica para formar un paquete. El dela sentencia {port es un cardcter especial que indica que se pongan a disposicién del programa todos los recursos de java.ut?. Por esta razén, se suele llamar un carécter comodin. En lugar de utilizar el comodin * para poder acceder a todos los recursos de ut 11, el programa podria haber importado la clase concreta uilizando su nombre completo. import java.util.Scanner Se ha elegido utilizar e1 comodin sobre el nombre completo porque es el uso mis habitual en la préctica de la programacién. Se dejara de momento la descripcién de la clase Scanner hasta que se vean las sentencias que permiten obtener los valores de entrada El método maint) de Calcul adora IMC. java empieza de la forma habitual definiendo dos variables de conversin 1 detinicion de ntes final double KILOGRAMOS_POR_LIBRA = 0.454 final double MeTROS_PORPIE = 9.3046; Capituo 1, Fundamentos de JAVA 37 public class CaleuladoralMc ( IF matnc): punto de inicio ae Public static void main(String! JI definicion de constantes final double KILOGRAMOS_PORLIBRA = 0.454; Final double METROS_PORLPLE = 0.3046 args) { 1) muestra 1a leyen System.out.printin( ‘alculadara de INC\n") 1) configura ef flujo de entradi Scanner stdin = new Scanner(System. in): / obtiene las caractertsticas de 1a persona System,out.print("Introduzca @1 peso (en libras) double peso€nLibras = stdin.nextDouble System.out.print(*Introduzca 1a altura (en pies): *): double alturagnPies = stdin.nextOouble();, JI convierte el sistema métrico double peso = pesofnLibras * XILOGRANOS_POR_LIBRA; double altura = alturatnPies * METROS_POR PTE; 4) calcula el ime double imc = peso / (altura * altura): J! muestra el resultado System.out.printin("Para una persona que"): System.out.printin(* pesa * + pesotnLibras + * libras*); System.out.printin(” y mide * + alturatnPies + * pies") System aut printtin(*tiene un INC de * + Math.round( ined) ‘Al empezar se muestra una leyenda, J! muestra 1a leyenda System.out .printin("Calculadora de TMC\n"): La siguiente seccién del programa es mas interesante, Entonces se define e inicializa la variable stan del tipo Scenner. La expresién de inicializacién utiliza el operador new, que es un mecanismo de Java para crear nuevos objetos, Scanner stdin = new Scanner(System. in) En la expresidn new se utiliza la variable System. in. System. in es el correspondiente flujo de entrada estandar, de la misma forma que la variable Systen. out es el flujo de sali- da estindar. De manera predeterminada, Systen. in se encuentra asociada con el teclado. 38 Programacién en Java 5.0 (pS se raters can deale uso de objets y ‘anaes referencia, En el programa se define una variable Scanner porque los métodos de entrada de que dispone S n son de muy bajo nivel. Por ejemplo, para leer un dato se puede hacer byte a byte. Utilizando un objeto Scanner el programa puede utilizar los métodos de alto nivel de esta clase para obtener valores del flujo de entrada. En particular, Scanner tiene los métodos nextOoub|e() y next int) que sirven para obtener del flujo de entrada el siguien- {e valor como de coma flotante y el siguiente valor como un entero, ‘Como Scanner es una clase, sus variables no son variables de tipo primitivo, son variables (objeto) de tipo referencia. La inicializacion de una variable de un tipo referencia se realiza con una referencia (un puntero) a una ubicacién de memoria que guarda un objeto del tipo asociado. Es importante entender que el valor de una variable objeto no es un objeto sino una referencia a un objeto. ‘La expresién de inicializacin de stdin es new Scanner(System. in) que genera una referencia a un nuevo objeto Scanner que se asocia al flujo de entrada estindar System. in. El operando del operador now es una invocacién de un método. Fn particular, a invocacion del método es una invocacién de un constructor. Un constructor sirve para configurar un ‘objeto al crearse con el operador new. El nombre del constructor indica el tipo de objeto que se crea Por tanto, la definicién de la variable stdin reserva una ubicacién en memoria para la variable stir, El valor de esta ubicacién de memoria es una referencia a la ubicacion de memoria que guarda un nuevo objeto Scanner. El nuevo objeto Scanner se configura para ue represente al flujo de entrada que indica Systen. in, La representacién de la memoria para Ia variable s tain seria Lavariable stdin permite ‘nccedar aun figede (ibys GREE BEARER ‘entrada del tipo Scanner | El atributo source iorASA al valor int 400. aorta ao INTERCAMBIO Un patrén (una tarea) tipico de programacién es el intercambio de los valores de dos varia- bles. Por ejemplo, suponga que se definen ¢ inicializan las variables « e y y que después se quieren intercambiar sus valores. double x = 5.12: double y ~ 19.28 Es decir, la memoria inicial de las variables se podria dibujar de la siguiente forma | «© siz Se desea copiarel valor de x en y y copiar el valor de y en x. Resulta tentador escribir las siguientes sentencias de asignacién para llevar a cabo la tarea yi I Copiar y en x yo +f Copiar x en y Sin embargo, este cédigo dard como resultado que tanto x como y tengan el valor original de y, es decir 19.28, Para ver este problema, veamos la ejecucién poco a poco. Tras Ia asignacién, el valor de y, que es 19.28, se copia en la ubicacién de memoria de x. Tras esta asignacién la memoria queda de la forma Tras la segunda asignacién, el valor de x, que ahora es 19.28, se copia en la ubicacién de ‘memoria de y Wf Copiar y en x yrx: f/ Copiar x eny 44 Programacion en Java 5.0 Aunque y se actualiza, en realidad lo hace al mismo valor que tenia. Por tanto, tras la asignacion la memoria queda de la siguiente forma GE y © 19:28 El problema estuvo en la primera sentencia de asignacién que sobrescribié el valor de x que se necesita para actualizar el valor de y. Para llevar a cabo correctamente la tarea, se utiliza otra variable donde se copia el valor de una de las variables. En el siguiente fragmen- to de cédigo se utiliza una variable double de nombre recuerdak para ello, double x = 5.12. double y = 19.28; double recuerdax x, // lace una copta gel valor ortginal de x Koy: 1 Copia yen x y= Pecuerdax 11 Copia 21 valor original de x eny ‘Tras ejecutar las tres sentencias de definicién la memoria se puede representar de la si- guiente forma recuerdak 5.12 La primera asignacién any J Copia y en x actualiza x, por lo que la memoria queda como sigue recuerdax Por lo que realiza correctamente la tarea de intercambiar los valores de x e y. Capitulo |. Fundamentos de JAVA — AS, PRECEDENCIA Y ASOCIATIVIDAD DE LA ASIGNACION Como el resto de los operadores, ef operador de asignacidn se evalta aun valor. El valor de tuna operacién de asignacién es el nuevo valor del operando de la izquierda, Suponga que y # se han declarado como variables de tipo int. entonces la sentencia guarda el valor 15 en la variable J y se evaliia al valor int 15. Como la asignacién produce un valor, se pueden escribir expresiones como {Que significa la expreston de asignacién anterior? La respuesta se puede obtener de las reglas de precedencia y asociatividad del operador de asignacién. La interpretacién natural y correcta es que en primer lugar se multiplican 5 por 3. Es decir, la precedencia de = es menor que la de *, Por tanto, la interpretacidn de la anterior expresion es koja Continuando con el ejemplo, fijese que la; tiene a ambos lados el operador de asignacién ~. En esta situacién la asociatividad de = determina que § se asocia con el = de su derecha, 0 bien el - con su izquierda. Al contrario que los operadores aritméticos, el operador de asigna- cién presenta asociatividad derecha. Por tanto la interpretacién correcta de la expresién es ke = 15 *3)) lo que indica que el resultado de la asignacién del producto 5 * 3 a j se asigna.a k. De nuevo, esta interpretacién es la natural ya que si la asignacién fuese asociativa por la izquierda la interpretacién seria lo que no tiene ningiin sentido. (ERD) cremenTo Y DECREMENTO Java tiene operadores especiales para incrementar o decrementar una variable numérica. El operador de incremento es + y el operador de decremento es --. Cuando se aplica a una variable primitiva, estos operadores suman o restan uno, respectivamente, al valor de la variable. Por ejemplo, el siguiente fragmento de cédigo int i - System.out.printin(*t vale * +4 da como resultado Ei EE cE 2 CS 46 Programaciin en Java En cualquier momento, la expresin 5 equivalente ata asignacién tated también se pue: oc Asignacién compuesta Java tiene varios operadores especiales para realizar operaciones muy frecuentes. Uno pue= dz pensar en estos operadores come abrevatuas del lengua, Por ojo, una operacisn misma Variable: Por ejemplo, suponga que desea afi $a la variable *. En muchos ter guajes de programacién, esta operacién se deberia escribir Sin embargo, Java tiene un operador de asignacién compuesta aditiva que leva a cabo fa ‘misma tarea. En Java la expresion anterior se escribe normalmente como mes iB: Otros de tos operadores de asigniacién compuiésta son *-, “+ y /-. Respectivamente, escalan,reducen y dviden la variable 6bjetvo. Por ejemplo,” {+ expresion? feb muevervalor de f es 1 * Cexpresién) i sv expresion: // ef nuevo valor de { esi. Cexpresién) expresion: f/ e/ nuevo valor de t es t I fexprestan) Existen dos formas de utilizar los operadores de incremento y decremento, prefija y osifija, El término prefija significa que el operador aparece antes que el operando y el tér- ‘mino postfija significa que aparece después. Las expresiones ++i y '++ son, respectivamen- te, ejemplos pref y postiio. En el eddigo anterior se podria haber escrito int i= 4: System.out.printin( "i que produciria el mismo mensaje de salida. Entonces, cual es la diferencia entre la version prefija y la postfija? La diferencia se convierte en aparente cuando se utiliza el operador dentro de una expresién mayor. Fijese en el siguiente fragmento de cédigo: int 1 = 4; int j= 4 System.out.printin(*i vale "+ 441): // primero se hace e1 incremento em-out.printin(*j vale * + j++): // primero se hace la concatenacién em.aut.printin("! vale * +1) System.out.printin(*j vale Capitulo 1. Fundamentos de JAVA AT Conversiones y coerciones en la asignacién Si el objetivo y la expresin modificadora no tienen el mismo tipo, hay que convert la expresin modificadora al tipo de la variable objetivo. Si la conversién de la asignacién es una extensién, entonces Java realiza la conversién automiticamente, Por ejemplo, suponga que se han realiza las siguientes definiciones. int i = double 4 = 2.0; Entonces la siguiente asignacién es valida d= 1:1 // valida: el compitador tiende ef int 1 al double 1 El valor int 1 se extiende automaticamente al valor double 1.0, Java no realiza autométicamente la conversién de coercién. Por tanto, la siguientes sentencias no compilan, isd: // fegal: no hay coer plicit de dou ea fat Java permite que el programa explicite una coercion mediante el operador coercién casting”). Una coercion convierte un valor de un tipo en un valor de otto tipo. La forma de indicar una coercién es la siguiente El tipo al que se converte la expresion Mediante la coercién, la siguiente sentencia se convierte en una sentencia de asignacién valida, f= Gan Una conversién de un valor en coma flotante a un valor entero siempre trunea el valor. Por tanto, el valor que se asigna a la variable i en la siguiente sentencia es 6. Fe int) #9: sf se trunca 6 9 at entera 6 ) Sree) donde “-” indica un valor sin inicializar, Aunque Java permite definir variables locales de | esta forma, obliga a que tengan un valor inicial antes de poder usarlo. {| ‘Ademas de asignar una reterencia a una vanable objeto tambien se le puede asignar una | referencia nu11. Conceptualmente la referencia nu11 se refiere a la direccidn vacia, Este 1 valor indica que la variable no esta haciendo referencia a ningiin objeto. En el siguiente 1 fragmento de codigo: | String nombre nuts Scanner archivagntrada = nul]: Rectangle recuadro = null: i todas las variables nombreLetra, archivoEntrada y recuadro se inicializan con el valor | nu Esta inicializacién se puede representar de la siguiente forma | arenivotntraca (uit) | X Ee | recuadro. (mull) ( y) Bs importante darse cuenta que una variable con el valor nu11 es distinta de una variable sin valor inicial, Aunque ninguna de las dos referencian a ningiin objeto, la variable que se ha inicializado con valor nul se puede asignar a otra variable, String String J Tegal: si se ha fofetalizado con el valor mutt String W iTegal: 82 no se ho inictalizado | i | | El valor nut1 indica que la variable no guarda informacién. HEEB ssicracion Al igual que con los tipos primitivos, se puede asignar una variable objeto a otra, El resulta- do de la asignacién es que ambas variables referencian al mismo objeto 74 Programacién en Java 5.9 Suponga que las variables String palabral y palabra? se inicializan de la siguiente forma: tring pala 5 uminoso* String palabra2 = egant. Por lo que las dos variables tienen la siguiente representacién: ial Sa Si se asigna el valor de palabra? a palabral de la siguiente forma palabral = palabra2: entonces p21 abra hace referencia al mismo objeto que pal abra2 c=) | palabra j a | patanrze ( —} + ( relegante* | La variable p21abra! es un alias del objeto que referencia p21 98°22, Como el texto ")uminoso" ya no se necesita, Java reclama automédticamente la memoria, que ocupa el texto para que otras partes del programa puedan utilizar el sitio. Esta reutiliza~ cidn de la memoria se llama recoleccién de objetos no utilizados (0 recoleccién de basura) yes una de las caracteristicas mas importantes de Java. | “También se puede utilizar una sentencia de asgnacién para dar un valor inicial a una | variable objeto sin inicializar. Por ejemplo, en el siguiente fragmento de c6digo se define | una variable local espacio de la clase Rectangle y después se le asigna el nuevo valor construido. U Rectangle espacio espacio = new Rec gle. 1, 6 | ‘Tras su definicién, espacio se puede representar como espacio Tras la asignacién, espacio referencia a un rectingulo de 6 x 2 ubicado en la posicién a,b, Capitulo 2. Objetos 78 Este e6digo empieza definiendo una variable a de Ia clase String. Tras definirla se puede representar como > (se =D En la siguiente sentencia de cédigo se define una variable b dela clase String. Esta defini cidn have que las variables » yb hagan referencia al mismo String. | Trail A continuacién se asigna un nuevo valor a la variable 2, que ahora referencia a un String con el valor "beta". Aungue antes tanto a come b hacian referencia al mismo Seeing, al asignar el valor a la variable o, la variable no se ve afectada. —— “petae a a naltat : NO) ees eT Ee yr Nan La variable b mantiene la referencia al texto “21 fa", Las variables a y 5 guardan sus propias referencias a la representacién "a1 Fa". Por tanto, al cambiar la variable 2, entonces b no se ve afectada, y viceversa. VARIABLES CON MODIFICADOR FINAL | Enel Capitulo | se utiliz6 el modificador Fiat para definir constantes de un tipo primitivo, ‘También se puede utilizar este modificador para definir constantes de objetos. Sin embargo, ‘cuando se define de esta forma, ya sea para un objeto Sting o para cualquier otro, lo que se 76 — Programacidn en Java 5.0 estd indicando es séo que la referencia no se puede modificar. Fs decii se tiene que referir a la misma ubicacién de memoria, En el siguiente fragmento de cédigo se definen dos constantes String Ja constante siempre Final Final ing TITULO = "La aparicion det homor: ring AVI @ bole es negra" No se pueden modificar las referencias de estas variables. La representacién que se utilizaré es la siguiente ao tiTuco_poema —}- ¢ we 7 “= GC Los candados indican que est memoria guarda una constante, Por tanto, la siguiente sentencia generaré un error de compilacién, ya que intenta modificar la referencia de la variable AV1S0 AVISO = ‘La bola es verds*; // ilega? para una constante ‘Aunque una constante a un objeto siempre se refiera a la misma ubicacién de memoria, no significa, necesariamente, que el valor que haya en esa ubicacién no se pueda modificar utiizando sus métodos miembro. moses culate stante = " — ee ee GS Por ejemplo, la definicién de la constante BLOQUE de la clase Rectangle referencia una ubjcacién de memoria. Inicialmente se guarda un rectingulo de 4 x 2 situado en (6, 9). final Rectangle BLOQUE = new Rectangle(é. 9, 4, 2) La representacién de la constante 8LOQUE seria eLoave ge Sin embargo, se puede modificar el valor del objeto Rectangle que referencia 8L00UE. Por ejemplo, en el siguiente fragmento de cédigo se reconfigura el rectingulo para que stt cesquina superior izquierda esté en (1, 4) y sus dimensiones sean 8 X 3. Capitulo 2 Objetos TT BLOQUE.setLocation(1, 4) BLOQUE.resfze(8, 3) Tras ejecutar este eédigo, la representacién en memoria seria ee; a. 4) BLOQUE 8 — | Rectangle: f= ps coc 8 / La clase String no proporciona ningin método para modificar un valor String, Por tanto, un objeto que sea una constante String nunca se podré modificar, es decir, un String es inmutable, Por tanto, la constante LENGUAJE de la clase String final seri ¢ LENGUAJE = * se puede representar de la siguiente forma No se puede modifcar la El contenido no se puede cambiar, referencia una vez ya que no existen métodoe de establecida, ‘String que lo modifiquen | | ae METODOSY OPERACIONES DE STRING Para escribir un texto, se pueden utilizar los métodos print () y print n()) de Systen.out. Por ejemplo, el siguiente fragmento de cédigo muestra el valor al que hace referencia la variable a¢agio por la salida estindar. String ad System.oul = “iHoy puede ser un gran dia printIn(adagio); En la primera sentencia se define la variable atagio de la clase String que se inicializa para referenciar a la ubicacién de memoria que contiene el texto "Ioy puede see un gran dial Tilloy pue! adagio ( sb AS En Ia segunda sentencia se invoca System.out.print1n() para mostrar por pantalla los, caracteres de la variable adeaio. Tras la Hamada se produce la siguiente salida: 78 Programacién en Java 5.0 _ ioy puede ser un gran dia! En el siguiente fragmento de cédigo se muestra cémo utilizar un objeto Scanner para conseguir un texto que escriba el usuario en la entrada estindar y asignarlo a una variable String. Scanner stdin = new Scanner( fen.out.print("Introduzca su ndmero de cuenta: *)s String respuesta = stdin.nextLine() En primer lugar, se inicializa la variable stdin a una referencia a Scanner que espera entrada por la entrada estindar. AL igual que en los programas interactivos de consola del Capitulo 1, el segmento de c6digo utiliza el método print) para mostrar un mensaje de peticidn. Tras ejecutar la sen- tencia print) en la salida estandar aparece lo siguiente Introduzca su nimero de cuenta: El texto que escriba el usuario en respuesta a la peticin se recoge con el método next Line() dela clase Scanner y el método devuelve una referencia a dicho texto. Ese valor de la referencia se utiliza paca inicializar la variable Si por ejemplo el usuario introduce el texto sr¢1s¢3, Introduzca su numero de cuenta: artista la variable respuesta que se define en la dltima sentencia del fragmento de cédigo haria referencia a una representaciin de "artista" dela clase String. respueste (— sartsster En el siguiente fragmento de cédigo se utiliza la variable stdin para pedir el nombre y apellidos de una persona. En el programa se repiten por a salida esténdar los textos intro- ducidos. System.out .print(*Introduzca su nombre | String nombre = stdin.nextLineQ) system.out.print(*Introduzca sus apellidos: *) String apeilidos ~ stdin.nextLine(}; system.out.printin("Su nombre es " + nombre + | “+ apellidas + "."): ara ole a de o° ~Lapitulo2. Objeros 79 Al igual que en el anterior segmento de c6digo, este comienza con la definicién de la va- Fiable stdin que se inicializa a una referencia a un objeto Scanner que representa la entrada estindar. Con un texto de peticidn se indica al usuario que introduzca su nombre. Suponga que el usuario responde Ja ntroduzca su nombre: Juan En la siguiente sentencia del cédigo se define la variable nonbre de la clase String La variable se inicializa con el valor que devuelve la llamada a stdin.nextLine(). Con la respuesta del usuario, la representacién de la variable nombre es la siguiente ‘Suponga que el usuario responde a la segunda petici6n de la siguiente forma Introduzca sus apellidas: Moreno Diaz En la segunda llamada al método nextLine() se asigna una referencia al objeto ape 1 idos de la clase String que representa el texto “Morena faz". Por tanto, las variables nombre y apel1 idos tienen la siguiente representacion apellidos C—> ¢ “worene Diaz® » La siguiente sentencia del eédigo System.out.printin(*Su nombre es " * nombr + apellidos + "."): escribe los valores de vuelta al usuario, El pardmetro "Su ronbre es *+nombre+* * Tides +"." de printin() utiliza varias veces el operador + de concatenacién de String para combinar textos. El resultado de la concatenacién es un objeto String cuyo valor represents el texto "Su nombre es Juan Moreno Diaz." Por tanto, la pantalla de- beria mostrar Introduzea su nombre: Juan Introduzca sus apellidos: Moreno Diaz Su nombre es Juan Moreno Diaz El operador de concatenacién también se puede utilizar para combinar mimeros 0 va- lores char con textos u objetos String. El resultado es un String con su interpretacién natural. Por ejemplo, las siguientes definiciones 80 Programacién en Java 5.0 : String sl = ‘Un kilogramo son * + 1000 + * gramos.* String s2 = "Pi vale menos que" + 3.1416 + '.' consiguen que las dos variables se puedan representar como ‘So Guam) Java también dispone del operador aiadir, +. Este operador actin de forma que al ope- rando de la izquierda se le asigne una referencia a un nuevo String con la concatenacién el valor del operando de la izquierda antes de la asignacién con el valor del operando de la | derecha, Como la concatenacién vista, el operando de la derecha puede ser un niimero, un | caricter 0 un texto. El siguiente fragmento de c6digo utiliza varias veces el operador +~ String s = "iHarley* javidson*: getty System.out.printin(s): Este fragmento de cédigo genera el siguiente resultado Harley-Davidson! Como el operando de Ia parte derecha puede ser cualquier expresidn, el siguiente frag- mento de cédigo genera el mismo resultado String § = ‘iHarley" System.out.printin(s): Este cédigo da la impresién que el objeto al que se refiere la variable s es siempre el mismo. Sin embargo, lo que realmente cambia en el cédigo es el valor dela variable s. Cada vez que se utiliza la operacién de afiadir hace que la variable s haga referencia a un objeto String diferente. Ademis de utilizar los operadores de concatenacién y asignacién, también se pueden utilizar los métodos miembro para conseguir toda una variedad de comportamientos. En este momento se mencionarén solamente los métodos més ttiles. En capitulos posteriores se irdn presentando otros. Como recordatorio, decir que los métodos miembro es la forma que tiene un método en Java de implementar un comportamiento y que los métodos de clase son servicios que proporciona una clase. El método length) de la clase String devuelve el nimero de caracteres que contiene el texto que representa, Cuando se le invoca, al método no hay que pasarlé ningiin parémetto. Esta ausencia de parimetros suele darse en muchos métodos que devuelven el valor de un atributo del objeto asociado, Enel programa TamafoTexto. java del Listado 2.1 se utiliza este método para mostrar el niimero de caracteres que ha introducido el usuario. A continuacién se muestra un ejemplo | de su ejecucién, Capitulo 2. Objewos BL Introduzca un texto: Hola a todos E] texto tiene 12 caracteres Al igual que en anteriores programas de consola, TanajioTexto .jave s6lo tiene un tinico ‘método de nombre ma in(). Este método comienza con la definicion de la variable stdin de la clase Scanner para leer de la entrada estindar. Después aparece el cédigo que solicita al usuario un texto y espera a que el usuario escriba el texto. System.out.print(Introduzea un texto: *) String texto =" stdin.nextLinet) A continuacién, el programa calcula el némero de caracteres del texto leido en la linea rlimero 17, int tamano = texto. length() Alinvocar texto. 1ength() Java inicializa la variable tanaro de tipo int al nimero de caracteres que haya introducido el usuario, El programa termina mostrando el resultado del calculo, System.out.printin("E texto tiene * + tanatio Listado 2.1 TamafioTexto,java. el tamamto de? texto Introductdo 1 Objetivo: Mostrar ef usuarsa * Amport Jave.utiT. public class TonsfioTexto 11. main(): punto é2 Inicfa de 1a apricacton public static votd nainString( args) | I! establece el flujo de entrada Scanner stdin = new Scanner (System.in): if solictta et texto System.out.print(*Introduzca un texto ring texto ~ stdin.nextLine(); {J calcula el tanafo de texto int tamaho = texto. length(); 11 muestra e} resultado System.out.printin("E1 texto tiene * + tamano +" caracteres."): ~ 82 Programacisn en Java 50 Otro método iil de la clase String es chart (). Este método recibe como parimetro un valor de indice y devuelve el valor del cardcter en dicha posicién del String Aunque este comportamiento resulta relativamente natural por su nombre y su pari- ‘metro, lo que no es tan natural ni en Java ni en otros lenguajes de programacién es que el primer cardcter deun String 2s €] que tiene indice 0. ‘Suponga la siguiente definicién de una variable a] fabeto de tipo String, String alfabeto = “abcdefghi Jkimnfopgrstuvwxyz": La representacién para esta variable seria aitabeto (= (__“encaetantikiannoparstuvwerz” |) ee, Esta representacién no muestra que cada carcter del texto se guarda en su propia posi- cién de memoria, Una representacién que recoge mejor esta nocién es la siguiente: Perr pple hyp En esta figura se puede ver cada letra del texto en un recuadro individual. La letra ‘a’ esti en el primer recuadro, que tiene indice 0; la letra *b’ en el segundo, con indice I y asi sucesivamente. Teniendo en cuenta esta representacién, los valores de las variables de tipo cha c3 que se definen en el siguiente fragmento de cédigo se pueden calcular facilmente. .eey char cl ~ alfabeto.charat(9): char c2 = Otra utilidad de los métodos de la clase String es poder obtener un substring de un string. Para ello se puede utilizar el método substring() que recibe como parémettos dos enteros. El primero indica el indice de la posicién de inicio desde la que se copia y el segun- do indica el indice de la posicién que esta detrds del iltimo caricter a copiar. Este método devuelve un nuevo String que representa la porcidn del texto indicado por los indices. Capitulo 2 Objetos 83 En el siguiemte fragmento de codigo se inicializa la variable mes para que haga referencia ‘aun objeto String con los primeros seis caracteres de la variable nesCunp]eafios. La invo- cacién a substring() se hace de la forma mesCunpeafos..substring(0,6). Observe que la diferencia entre 6 y 0 es 6, que es el tamaiio del substring que se devuelve. String mesCumpleanos = String mes = mescumpl ean ystem.out.printin( "ET m gosto 2006": substring(o, 6 Este codigo muestra EI mes es Agosto La clase String también tiene otro método miembro sudstring() que sélo tiene un tinico parémetro del tipo int. Este método devuelve un nuevo objeto String que es un subs- tring del String utilizado. Este substring comienza con el caricter con el indice indicado con el parimetro y termina con el resto del texto. En el siguiente segmento de cédigo se uti- liza este método para mostrar los iltimos cuatro caracteres del texto de la variable String fecha = "6 de febrero de 2007" int n= fecha. length() String afo = fecha. substring(n-4): System.out.printIn("E] afo es "+ aflo + 7.7) Este eédigo muestra ano es 2007 Otto método miembro de la clase String es trim(). Este método devuelve un nuevo objeto con la representacién de la parte del texto al que se le han eliminado los espacios que tuviese al inicio 0 al final. Por ejemplo, el siguiente cédigo - el mundo gira = eL.trim¢ 3 genera dos variables String de nombres ty t2 con la siguiente representacién Fijese e6mo el método trin() no modifica los espacios que habia entre las palabras. Solamente elimina los espacios al principio y al final. En la clase String también se pueden encontrar métodos para buscar substrings dentro de un String, Uno de estos méodos es index0F) que recibe dos parimetros. El primero es el substring que se desea buscar y el segundo es el indice a partic del cual iniciar la biis~ 84 Programacion en Java 5.0 queda. Si se encuentra el substring el método devuelve la posicién de la primera ocurrencia, En caso contrario devuelve ~{ Suponga el siguiente fragmento de eédigo nt nl = fruta.indexftbuscar, 0); int n2 = fruta.indexdf (buscar, al + 1) int 3 = fruta.indexOf(buscar, 2 + 1): System.out.printin(* Primer resultado de 1a busqueda: * + nl) System.out-printIn(* Segundo resultado de 1a busqueda: * + 92): System.out.printin(* er resultada de la bésqueda: " + n3) Genera el siguiente resultado en pantalla “pananal do de Ta bisqueda: 1 Segundo resultado busqueda: 3 Tercer resultada de 12 busqueda: -1 Buscanda "an" En la siguiente representacién se muestran las dos variables que se definen en el progra- ma con sus “recuadros” Plellels ) routs C —- ( mor (GE) > Gen En la primera bisqueda del substring "an* en el String referenciado por Ia variable fruit empieza a buscar en el indice 0. Como esta biisqueda encuentra el substring en el indice 1, la variable ni se inicializa a 1 La segunda buisqueda de “an* en el texto de la variable fruta empieza en el indice 2 (ni + 1), Esta busqueda encuentra el substring en el indice 3. Por tanto, la variable n2 se inicializa a 3. En la tetcera busqueda se empieza en el indice 4 (n2 + 1). Como esta busqueda no se completa nunca la variable n3 se inicializa a—1 La clase String también tiene una coleccién de métodos de clase, todos ellos con el nombre value0(). Como son métodos de clase, proporcionan servicios. En particular, pro- porcionan servicios relacionados con textos. Para cada uno de los tipos primitivos (char, int, double, ete.) existe un método de clase value0F(), que recibe como parimetro un valor de ese tipo. El método devuelve una refe- rencia a un nuevo objeto String que representa el valor de su parimetro en forma de carac- teres. Los métodos va! ue0*() se definen como métodos de clase en lugar de como métodos miembro porque su labor no supone acceder ni manipular objetos String previos. puede encontrar Capitulo 2. Objerws 85 Ultima coincidencia En la clase String también se dispone de métodos miembro para buscar la iltima co- incidencia de un texto, Por ejemplo, existe un método 1astIndex0F() que recibe dos pardmetros, el substring que se desea buscar y un indice que se utiliza en la bisqueda. Si el substring se encuentra en el String en un indice que no sea mayor que et parimetro indicado, el método devuelve la posicién de inicio de lailtima de dichas coincidencias en el objeto String. Sino se encuentra el substring, 12st index0#() devuelve -1. Suponga el. siguiente fragmento de texto en el que se busca "iss" ea “Mississippi” String nombre ~ “Mississippi String buscar = "iss": printin("Buscando \*" + buscar + VT en nt nom = nombre. indexof(buscar, 0 nombre. last indexO?(bu + nombre. Tengtn()- out.printin(* Primer reaultade de 12 busqueda: * +n System.out.printin(* Segundo resultade de 13 busqueda: * + n2) Este cédigo genera el siguiente resultado Buscanda “is: a en “Mississippi” imer resultado de 1a busqueda: 1 undo’ resultado de 1a bésqueda: 4 Enel siguiente fragmento de c6digo se utilizan tres métodos v21 ued). int vl = double v2 ~ 3.14; char v3 = ‘a's Suring si = String. valueor(viy: String s2 = String.valueot(v2); String $3 = String. valueot(v3); Este cédigo genera variables con la siguiente representaci6n: 86 Programaciém en Java 5.0 o ae CASO DE ESTUDIO — CONVERSION DE FECHAS El bjetio de este caso de estudio es mostrar el uso dea bbloweca ‘String para a mavipulacion de inferacign, Para conocer mejor la biblioteca String y adquirir més experiencia en la resolucién de problemas se va a desarrollar un programa que convierta fechas del formato habitual en el formato estindar. Una fecha en el formato habitual consta de un dia seguido de la palabra ‘de’, un nombre dde mes, la palabra ‘de’ y el ailo. Por ejemplo, serian fechas habituales las siguientes: 8 de mayo de 2006, o 30 de noviembre de 2012. Una fecha en el formato intemacional estindar consta de un alo seguido de un guidn, el tmes, un guidn y el dia. Por ejemplo, son fechas en el formato estindar las siguientes: 2006- mayo-8, 0 2012-noviembre-30. ENUNCIADO DEL PROBLEMA Escriba un programa de consola interactivo que convierta una fecha en formato habitual, or ejemplo: 8 de mayo de 2006 al formato estindar, es decir 2006-mayo-8. EjempLo De uso Conversor de formatos de fech Convierte del formato habitual (8 de mayo de 2006) a1 formato estdndar (2006-mayo-8) Introduzca una fecha en formato habitual: 8 de mayo de 2006 La conversién de 1a fecha 8 de mayo de 2006 al formato estandar es 2006-mayo-8 ANAuIsis ¥ DISERIO Un anilisis del problema indica que hay que solicitar datos al usuario y manipularios. Para manipular los datos de una fecha un objeto apropiado cs un objeto String, De este objeto String, se pueden obtener el substring con el dia, el substring con el nombre del mes y el substring con el afi. A continuacién, se pueden concatenar estos substrings de forma apro- piada para generar un objeto String con la representacién en el formato estindar. Por tanto, para resolver el problema se van a ctear, usar y manipular las siguientes varia- bles y sus objetos asociados: + stdin: Scanner para representar el flujo de entrada estindar. + fechaHabi tual: String para guardar la fecha del usuario en el formato habitual + mes: String para guardar el mes; + dia: String para guardar el dia del mes; + afi: String para guardar el aiio; ichafstandar: String para guardar la fecha en el formato estindar. ‘Ademés, aunque se da por supuesto, también se utilizar la salida estindar. + system.out: PrintStream para escribir en el flujo de salida esténdar Capito 2. Objeros 87 Con estas variables se puede escribir el siguiente seudocédigo (algoritmo) que describe la interaccién y manipulacion de objetos para resolver el problema, Paso J. Muestra una leyenda en la salida estandar que describe el objetivo del programa. Paso 2. Escribe un mensaje en la salida estindar solicitando al usuario que introduzea una fecha en el formato habitual Paso 3. Obtiene un String com la fecha introducida por el usuario por la entrada estandar y lo asigna a la variable fechsHab’ Paso 4. Eseribe la fecha de la variable f2chaab’ tua en la salida estindar. Paso 5. Consulta la representacién de la fecha fechaHabitual y extrae la representacion del mes. Asigna este valor ala variable mes: Paso 6. Consulta la tepresentacién de la fecha fechaHabi tual y extrae la representacién del dia, Asigna este valor a la variable ¢ Paso 7. Consulta la representacién de la fecha fechaHobi tua] extrae la representacién del aio, Asigna este valor a la variable aio, Paso 8. Asigna a la variable fecha standar la concatenacién de los valores de las vari bles aio, mes y da separados con los guiones apropiados. Paso 9, Muestra la representacion de fechafstandar en la salida esténdar. ‘A continuacién se trataré con detalle la implementacién en Java de este seudocédigo. Implementacion Resulta muy sencillo mostrar en pantalla la leyenda con el método System.out.printin() echa"): tual” system. out .pr: Tat" al formato estandai + 7 (2006-mayo-8)."): systen.out.printlnt): De Ia misma forma, se muestra la solicitud al usuario con el método systen.out print) [J solicita al usuario una fecha en formato habitual (Paso 2) System.out.print(*Introduzca una fecha en formato habitual: ") Se puede obtener la fecha que introduzca el usuario utilizando el método next Line() de la clase Scanner. Con el valor obtenido se inicializa la variable fechaHabi tual 1 recoge el valor que introd Scanners String ca el usuario (Paso 3) n= new Scanner(System. in) fabitual = stdin.nextLine(): ch Antes de empezar a manipular el texto que se ha obtenido en la variable fechaHabi tus), se muestra este valor en la pantalla para indicar el objetivo del programa, if muestra la fecha letda por ps Systen.out.pri System. out .prin tala (Paso 4) ‘onversién de 1a fecha"): "+ fechaHabitual) 88° Programacién en Java 50 Por ejemplo, suponga que la FechaHab/ tual representa" 8 de mayo de 2006", que se puede representar de la siguiente forma fechaHabitual (| ——}-» ( @ de mayo de 2006 * ) El texto que muestra por pantalla este fragmento de cédigo es el siguiente La conversion de la fecha @ de mayo de 2006 Para determinar el texto del dia a partir del texto leido hay que eliminar cualquier espacio que haya delante o dettés del texto, 11 obtiene 7 dia (Paso FechaHabitual = Fechadabi tual .trint int _m = fechaHabitual. indexO#(* ")s String dia ~ fechaHabitual.sudstring(O, m): FechaHabitual = fechaHabitual.substring(m + 3); Tras eliminar los espacios de delante y detris del texto se asigna a la variable fechata~ bitual un nuevo objeto String con el texto de la fecha pero sin espacios al principio ni al final, es decir se eliminan dos espacios que habia al principio y uno que habia al final Después de eliminar los espacios en blanco, para buscar el valor del dia se obtiene el indice m del primer espacio, para lo que se utiliza el método incex0F() de la clase String En concreto se invoca el método index0*( ) que recibe un tnico parémetro. Como resultado devuelve el indice donde se encuentra la primera ocurrencia del texto buscado. int m= fechaHabi tual. indexof(* *) Para crear el String con el dia, se utiliza el método substring) de la clase Steins String dia = fechaHabitual.substring(0, m) El método recibe dos pardmetros 0 yn, que indican el indice de comienzo del texto que se va a copia y el indice de la posicién después del iltimo cardcter a copiar, Este método crea y devuelve un nuevo String con la copia de los caracteres indicados. Después de crear el substring con el dia, se actualiza fecha#abitua? para que haga referencia ala parte de la fecha que sigue al dia fechaHabitual = fechaHabitual.sudstring(m + 3) En esta actualizacién se asigna a fechaHabitual el valor que devuelve buffer substring(m+ 3), Este método devueive un nuevo String con los caracteres que empiezan enel indice m+ 3 hasta el final de la fecha. fechatobituns ( ——}-» ( * mayo de 2006

También podría gustarte