Transcript
  • 1. Piensa

2. Piensa en Java Bruce Eckel Traduccin: Jorge Gonzlez Barturen Facultad de Ingeniera Universidad de Deusto Revisin tcnica: Javier Parra Fuente Ricardo Lozano Quesada Departamento de Lenguajes y Sistemas Informticos e Ingeniera de Software Universidad Pontijicia de Salamanca en Madrid Coordinacin general y revisin tcnica: Luis Joyanes Aguilar Departamento de Lenguajes y Sistemas Informticos e Ingeniera de Software Universidad Pontificia de Salamanca en Madrid Madrid Mxico Santaf de Bogot Buenos Aires Caracas Lima Montevideo San Juan San Jos Santiago Sao Paulo White Plains 3. atos de catalogacin bibliogrfica i Bruce Eckel PIENSA EN JAVA Segunda edicin PEARSON EDUCACIN, S.A. Madrid, 2002 ISBN: 84-205-3192-8 Materia: Informtica 68 1.3 Formato 195 x 250 Pginas: 960 No est permitida la reproduccin total o parcial de esta obra ni su tratamiento o transmisin por cualquier medio o mtodo sin autorizacin escrita de la Editorial. DERECHOS RESERVADOS O 2002 respecto a la segunda edicin en espaol por: PEARSON EDUCACI~N,S.A. Nez de Balboa, 120 28006 Madrid Bruce Eckel PIENSA EN JAVA, segunda edicin. ISBN: 84-205-3192-8 Depsito Legal: M.4.162-2003 ltima reimpresin, 2003 PRENTICE HALL es un sello editorial autorizado de PEARSON EDUCACIN, S.A. Traducido de: Thinking in JAVA, Second Edition by Bruce Eckel. Copyright O 2000, Al1 Rights Reserved. Published by arrangement with the original publisher, PRENTICE HALL, INC., a Pearson Education Company. ISBN: 0-13-027363-5 Edicin en espuol: Equipo editorial: Editor: Andrs Otero Asistente editorial: Ana Isabel Garca Equipo de produccin: Director: Jos A. Clares Tcnico: Diego Marn Diseo de cubierta: Mario Guindel, La Senz y Begoa Prez Compoicin: COMPOMAR. S.L. Impreso por: LAVEL, S. A. IMPRESO EN ESPANA - PRINTED IN SPAIN Este libro ha sido impreso con papel y tintas ecolgicos 4. A la persona que, incluso en este momento, est creando el prximo gran lenguaje de programacin. 5. @ Indice de contenido Prlogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi Prlogo a la 2." edicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii Java2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .ElCDROM xxv Prlogo a la edicin en espaol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .El libro como referencia obligada a Java xxvii El libro como formacin integral de programador . . . . . . . . . . . . . . . . . . . . . . . xxvii Recursos gratuitos en lnea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxviii Unas palabras todava ms elogiosas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxviii Comentarios de los lectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix Introduccin . Prerrequisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .AprendiendoJava xxxvi Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxxvi Documentacin en lnea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxxvii ...Captulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxxviii Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlii CD ROM Multimedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xliii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Cdigofuente xliii Estndares de codificacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlv Versiones de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlv Seminarios y mi papel como mentor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvi Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvi Nota sobre el diseo de la portada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvi . .Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Colaboradores Internet xlix 6. vi Piensa en Java 1:Introduccin a los objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El progreso de la abstraccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Todo objeto tiene una interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La implementacin oculta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reutilizar la implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herencia: reutilizar la interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La relacin es-un frente a la relacin es-como-un . . . . . . . . . . . . . . . . . . . . . . . . Objetos intercambiables con polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Clases base abstractas e interfaces Localizacin de objetos y longevidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Colecciones e iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La jerarqua de raz nica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliotecas de colecciones y soporte al fcil manejo de colecciones . . . . . . . . . El dilema de las labores del hogar: quin limpia la casa? . . . . . . . . . . . . . . . . . Manejo de excepciones: tratar con errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Multihilo Persistencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .JavaeInternet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .lQueslaWeb? Programacin en el lado del cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programacin en el lado del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un ruedo separado: las aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anlisisydiseo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase O: Elaborar un plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase 1: Qu estamos construyendo? ................................. Fase 2: Cmo construirlo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase 3: Construir el ncleo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase 4: Iterar los casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase5:Evolucin ................................................ Los planes merecen la pena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Programacin extrema Escritura de las pruebas en primer lugar .............................. Programacin a pares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .PorquJavatienexito Los sistemas son ms fciles de expresar y entender . . . . . . . . . . . . . . . . . . . . Ventajas mximas con las bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manejo de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programacin a lo grande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estrategias para la transicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Guas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Obstculosdegestin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . davafrenteaC++?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. ndice de contenido 2:Todoesunobjeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Los objetos se manipulan mediante referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Uno debe crear todos los objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dnde reside el almacenamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Un caso especial: los tipos primitivos ArraysenJava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Nunca es necesario destruir un objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .mbito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .mbito de los objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Crear nuevos tipos de datos: clases Camposymtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Mtodos. parmetros y valores de retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .La lista de parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Construccin de un programa Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Visibilidad de los nombres ...................................Utilizacin de otros componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .La palabra clave static . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Tu primer programa Java ..........................................Compilaciny ejecucin . . . . . . . . . . . . . . . . . . . . . . . . . .Comentarios y documentacin empotrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Documentacin en forma de comentarios Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTMLempotrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .asee: referencias a otras clases ................................Etiquetas de documentacin de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Etiquetas de documentacin de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Etiquetas de documentacin de mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ejemplo de documentacin Estilodecod~cacin............................................. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3: Controlar el flujo del programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Utilizar operadores de Java Precedencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Asignacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Operadores matemticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Autoincremento y Autodecremento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Operadores relacionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Operadores lgicos Operadoresdebit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .....................................Operadores de desplazamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Operador ternario if-else Eloperadorcoma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8. x Piensa en Java EloperadordeString+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pequeos fallos frecuentes al usar operadores . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de conversin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Java no tiene "sizeof" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Volver a hablar acerca de la precedencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un compendio de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Control de ejecucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trueyfalse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . If-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Iteracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . break y continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resuiiieil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4: Inicializacin y limpieza ..................................... Inicializacin garantizada con el constructor . . . . . . . . . . . . . . . . . . . . . . . . Sobrecargademtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Distinguir mtodos sobrecargados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sobrecarga con tipos primitivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sobrecarga en los valores de retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constructores por defecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La palabra clave this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Limpieza: finalizacin y recoleccin de basura . . . . . . . . . . . . . . . . . . . . . . . Para qu sirve finalize( )? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hay que llevar a cabo la limpieza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La condicin de muerto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Cmo funciona un recolector de basura Inicializacin de miembros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Especificacin de la inicializacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicializacin de constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicializacin de arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays multidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5: Ocultar la implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El paquete: la unidad de biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creando nombres de paquete nicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Una biblioteca de herramientas a medida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizar el comando import para cambiar el comportamiento . . . . . . . . . . . . . . . Advertencia relativa al uso de paquetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9. ndice de contenido xi Modificadores de acceso en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "Amistoso" ("Friendly") . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . public: acceso a interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . private: jeso no se toca! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . protected: "un tipo de amistad" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interfaz e implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Acceso a clases Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6: Reutilizando clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sintaxis de la composicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sintaxisde la herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicializando la clase base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Combinando la composicin y la herencia . . . . . . . . . . . . . . . . . . . . . . . . . . ......................................Garantizar una buena limpieza Ocultacin de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elccin entre composicin y herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Protegido (protected) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Desaerrollo incremental . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversin hacia arriba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Por qu "conversin hacia arriba"? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lapalabraclavefinal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Paradatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mtodosconstante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Precaucin con constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Carga de clases e inicializacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicializacin con herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . De nuevo la conversin hacia arriba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Olvidando el tipo de objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elcambio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .La ligadura en las llamadas a mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . .Produciendo el comportamiento adecuado Extensibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Superposicin frente a sobrecarga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases y mtodos abstractos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases y mtodos abstractos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Orden de llamadas a constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Herencia y finahe( ) Comportamiento de mtodos polimrficos dentro de constructores . . . . . . . . . 10. xii Piensa en Java Diseoconherencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Herencia pura frente a extensin Conversin hacia abajo e identificacin de tipos en tiempo de ejecucin . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8: Interfaces y clases internas Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ."Herencia mltiple" en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Extender una interfaz con herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Constantes de agrupamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Iniciando atributos en interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Interfaces anidados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Clases internas . . . . . . . . . . . . . . . . . . . . . . . . . . . .Clases internas y conversiones hacia arriba ................................mbitos y clases internas en mtodos .........................................Clases internas annimas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .El enlace con la clase externa ..........................................Clases internas estticas ................................Referirse al objeto de la clase externa .........................Acceso desde una clase mltiplemente anidada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Heredar de clases internas ............................Pueden superponerse las clases internas? ...................................Identificadores de clases internas ..........................................Por qu clases internas? .................................Clases internas y sistema de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Resumen ........................................................Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9: Guardar objetos ...........................................................Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Los arrays son objetos de primera clase Devolverunarray ............................................... LaclaseArrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rellenarunarray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Copiarunarray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Comparar arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Comparaciones de elementos de arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ordenar un array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Buscar en un array ordenado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Resumen de arrays .....................................Introduccin a los contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Visualizar contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Rellenar contenedores ......................Desventaja de los contenedores: tipo desconocido 11. ndice de contenido xiii . . . . . . . . . . . . . . . . . . . . . . . . . . . . .En ocasiones funciona de cualquier modo Hacer un ArrayList consciente de los tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Taxonoma de contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Funcionalidad de la Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Funcionalidad del interfaz List . . . . . . . . . . . . . . . . . . . .Construir una pila a partir de un objeto LinkedList . . . . . . . . . . . . . . . . . . . . .Construir una cola a partir de un objeto LinkedList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Funcionalidad de la interfaz Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Conjunto ordenado (SortedSet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Funcionalidad Map ......................................Mapa ordenado (Sorted Map) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Hashing y cdigos de hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Superponer el mtodo hashCode( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Guardar referencias El nhjetn HasMap dkhil (WeakHashMa~). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Revisitando los iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Elegir una implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Elegir entre Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Elegir entre Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Elegir entre Mapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ordenar y buscar elementos en Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Utilidades . . . . . . . . . . . . . . . . . . . . . . . .Hacer inmodificableuna Coleccin o un Mapa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sincronizar una Coleccin o Mapa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Operaciones no soportadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Contenedores de Java 1.0/1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Vector y enumeration Hashtable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pila(Stack) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Conjunto de bits (BitSet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Resumen Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10: Manejo de errores con excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Excepciones bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Parmetros de las excepciones ..Capturarunaexcepcion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elbloquetry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Manejadores de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Crear sus propias excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .La especificacin de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Capturar cualquier excepcin Relanzarunaexcepcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ExcepcionesestndardeJava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12. xiv Piensa en Java El caso especial de RuntimeException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Limpiando con finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .~Paraqusirvefinally? Peligro: la excepcin perdida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Restricciones a las excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Emparejamiento de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Guas de cara a las excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Resumen Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11:El sistema de E/S de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La clase File ...................................................... Un generador de listados de directorio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprobandoy creando directorios ................................. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Entradaysalida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .TiposdeInputStream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .TiposdeOutputStream Aadir atributos e interfaces tiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Leer de un InputStream con un FilterInputStream . . . . . . . . . . . . . . . . . . . . Escribir en un OutputStream con FilterOutputStream . . . . . . . . . . . . . . . . . ...............................................Readers & Writers Fuentes y consumidores de datos ................................... Modificar el comportamiento del flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Clases no cambiadas Por s mismo: RandomAccessFile .................................... Usos tpicos de flujos de E/S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Flujosdeentrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Flujosdesalida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Unerror? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Flujosentubados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .E/Sestndar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Leerdelaentradaestndar Convirtiendo System.out en un PrintWriter . . . . . . . . . . . . . . . . . . . . . . . . . . .......................................RedingiendolaE/Sestndar Compresin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Compresin sencilla con GZIP Almacenamiento mltiple con ZIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ARchivos Java UAR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Serializacin de objetos ............................................. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Encontrarlaclase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Controlar la serializacin Utilizar la persistencia ............................................ Identificar smbolos de una entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .StreamTokenizer 13. ndice de contenido xv StringTokenizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Comprobar el estilo de escritura de maysculas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Resumen Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12: Identificacin de tipos en tiempo de ejecucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .La necesidad de RTTI ElobjetoClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Comprobar antes de una conversin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sintaxis RTTI Reflectividad: informacin de clases en tiempo de ejecucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Un extractor de mtodos de clases Resuinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13: Crear ventanas y applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .El applet bsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Restricciones de applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ventajas de los applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Marcos de trabajo de aplicacin . . . . . . . . . . . . . . . . . . . . . . . . . .Ejecutar applets dentro de un navegador web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Utilizar Appletviewer Probarapplets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ejecutar applets desde la lnea de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Un marco de trabajo de visualizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Usar el Explorador de Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Hacer un botn Capturarunevento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .reas de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Controlar la disposicin Borderhyout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Flowhyout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gridhyout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GridBagLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Posicionamiento absoluto Boxhyout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elmejorenfoque? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .El modelo de eventos de Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Tipos de eventos y oyentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Seguimiento de mltiples eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Un catlogo de componentes Swing Botones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Iconos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Etiquetas de aviso Camposdetexto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14. xvi Piensa en Java Bordes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .JScrollPanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Unminieditor Casillas de verificacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Botonesdeopcin Combo boxes (listas desplegables) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .PanelesTabulados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Cajasdemensajes Mens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Mensemergentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Generacindedibujos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Cajasdedilogo Dilogos de archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .HTMLencomponentesSwing Deslizadores y barras de progreso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . rboles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Tablas Seleccionar Apariencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Elportapapeles Empaquetando un applet en un fichero JAR . . . . . . . . . . . . . . . . . . . . . . . . . . . Tcnicas de programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Correspondencia dinmica de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Separar la lgica de negocio de la lgica IU . . . . . . . . . . . . . . . . . . . . . . . . . . . Una forma cannica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programacin visual y Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .~QuesunBean? Extraer BeanInfo con el Introspector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un Bean ms sofisticado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .EmpaquetarunBean Soporte a Beans ms complejo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .MssobreBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Resumen Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14: Hilos mltiples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interfaces de respuesta de usuario rpida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .HeredardeThread Hilos para una interfaz con respuesta rpida ........................... Combinar el hilo con la clase principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Construir muchos hilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Hilosdemonio Compartir recursos limitados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acceder a los recursos de forma inadecuada ........................... Cmo comparte Java los recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15. ndice de contenido xvii Revisar los JavaBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloqueo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Bloquendose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Interbloqueo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Prioridades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Leer y establecer prioridades Gruposdehilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Volver a visitar Runnable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Demasiados hilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ejercicios 15: Computacin distribuida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programacin en red . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Identificar una mquina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Servir a mltiples clientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Datagramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizar URL en un applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ms aspectos de redes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conectividad a Bases de Datos de Java (JDBC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Hacer que el ejemplo funcione . . . . . . . . . . . . . . . . . . . . . . .Una versin con IGU del programa de bsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Por qu el API JDBC parece tan complejo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Un ejemplo ms sofisticado Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El servlet bsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Servlets y multihilo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Gestionar sesiones con servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ejecutar los ejemplos de servlets Java Server Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objetos implcitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Directivas JSP Elementos de escritura de guiones JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extraer campos y valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Atributos JSP de pgina y su mbito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manipular sesiones en JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Crear y modificar cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ResumendeJSP ................................................ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .RMI (Invocation Remote Method) Interfaces remotos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementar la interfaz remota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Crearstubsyskeletons ........................................... Utilizar el objeto remoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16. xviii Piensa en Java FundamentosdeCORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773 Unejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Applets de Java y CORBA 780 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .CORBAfrenteaRMI 780 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Enterprise JavaBeans 780 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .JavaBeans frente a EJB 781 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .La especificacin EJB 782 ComponentesEJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Las partes de un componente EJB 784 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Funcionamiento de un EJB 785 TiposdeEJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Desarrollar un EJB 786 ResumendeEJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Jini: servicios distribuidos 791 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Jini en contcxto 791 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Qu es Jini? 792 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Cmo funciona Jini 792 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .El proceso de discovery 793 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .El proceso join 793 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .El proceso lookup 794 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Separacin de interfaz e implementacin 795 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Abstraer sistemas distribuidos 796 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ejercicios 796 A: Paso y Retorno de Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Pasando referencias Usodealias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Haciendo copias locales Pasoporvalor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clonandoobjetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Aadiendo a una clase la capacidad de ser clonable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Clonacin con xito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .El efecto de Object.clone( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Clonando un objeto compuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Una copia en profundidad con ArrayList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Copia en profundidad va serializacin . . . . . . . . . . . . . . . . .Aadiendo "clonabilidad" a lo largo de toda una jerarqua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .{Por qu un diseo tan extrao? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Controlando la "clonabilidad" Elconstructordecopias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Clases de slo lectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Creando clases de slo lectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Los inconvenientes de la inmutabilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Strings inmutables 17. ndice de contenido xix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Las clases String y StringBuffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Los Strings son especiales Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .B.El Interfaz Nativo Java (JNI1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Invocando a un mtodo nativo . . . . . . . . . . . . . . . . . . . . . . . . . . .El generador de cabeceras de archivo:javah . . . . . . . . . . . . . . . . . . . . . .renombrado de nombres y signaturas de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Implementando la DLL . . . . . . . . . . . . . . . . . . . . .Accediendo a funciones JNI: el parmetro JNIEnv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Accediendo a Strings Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Pasando y usando objetos Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .JNI y las excepciones Java JNIyloshilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Usando un cdigo base preexistente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Informacin adicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .C: Guas de programacin Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Diseo Implemenentacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .D: Recursos Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Libros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Anlisis y Diseo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Mi propia lista de libros E: Correspondencias espaol-inglsde clases. bases de datos. tablas . . . . . . . . . . . . . . . . . . .y campos del CD ROM que acompaa al libro 18. Prlogo Suger a mi hermano Todd, que est dando el cin, que la siguiente gran revolucin ser en salto del hardware a la programa- ingeniera gentica. Tendremos microbios diseados para hacer comida, combustible y plstico; limpiarn la polucin y en general, nos permitirn dominar la manipulacin del mundo fsico por una fraccin de lo que cuesta ahora. De hecho yo afirm que la revolucin de los computadores parecera pequea en com- paracin. Despus, me di cuenta de que estaba cometiendo un error frecuente en los escritores de ciencia fic- cin: perderme en la tecnologa (lo que por supuesto es fcil de hacer en ciencia ficcin). Un escri- tor experimentado sabe que la historia nunca tiene que ver con los elementos, sino con la gente. La gentica tendr un gran impacto en nuestras vidas, pero no estoy seguro de que haga sombra a la revolucin de los computadores (que hace posible la revolucin gentica) -o al menos la revolu- cin de la informacin. La informacin hace referencia a comunicarse con otros: s, los coches, los zapatosy especialmente la terapia gentica son importantes, pero al final, sto no son ms que ador- nos. Lo que verdaderamente importa es cmo nos relacionamos con el mundo. Y cunto de eso es comunicacin. Este libro es un caso. La mayora de colegas pensaban que estaba un poco loco al poner todo en la Web. "Por qu lo comprara alguien?", se preguntaban. Si hubiera sido de naturaleza ms conser- vadora no lo habra hecho, pero lo que verdaderamente no quera era escribir ms libros de com- putacin al estilo tradicional. No saba qu pasara pero result que fue una de las cosas ms inteli- gentes que he hecho con un libro. Por algn motivo, la gente empez a mandar correcciones. ste ha sido un proceso divertido, por- que todo el mundo ha recorrido el libro y ha detectado tanto los errores tcnicos como los grama- ticales, y he podido eliminar fallos de todos los tipos que de otra forma se habran quedado ah. La gente ha sido bastante amable con sto, diciendo a menudo " yo no quiero decir esto por criticar...", y tras darme una coleccin de errores estoy seguro de que de otra forma nunca los hubiera encon- trado. Siento que ste ha sido un tipo de grupo de procesos que ha convertido el libro en algo es- pecial. Pero cuando empec a or: "De acuerdo, bien, est bien que hayas puesto una versin electrnica, pero quiero una copia impresa proveniente de una autntica editorial", puse mi mayor empeo en facilitar que todo se imprimiera con formato adecuado, pero eso no fren la demanda de una ver- sin publicada. La mayora de la gente no quiere leer todo el libro en pantalla, y merodear por un conjunto de papeles, sin que importe cun bien impresos estn, simplemente no era suficiente. (Adems,tampoco creo que resulte tan barato en trminos de tner para impresora lser.) Parece que a fin de cuentas, la revolucin de los computadores no conseguir dejar sin trabajo a las edito- riales. Sin embargo, un alumno me sugiri que ste podra ser un modelo para publicaciones fina- les: los libros se publicarn primero en la Web, y slo si hay el suficiente inters, merecer la pena pasar el libro a papel. Actualmente, la gran mayora de libros conllevanproblemas financieros, y qui- zs este nuevo enfoque pueda hacer que el negocio de la publicacin sea ms beneficioso. Este li- 19. xxii Piensa en Java bro se convirti en una experiencia reveladora para m de otra forma. Originalmente me acerqu a Java como "simplemente a otro lenguaje de programacin", lo que en cierto sentido es verdad. Pero a medida que pasaba el tiempo y lo estudiaba ms en profundidad, empec a ver que la intencin fundamental de este lenguaje es distinta de la de otros lenguajes que he visto. La programacin est relacionada con gestionar la complejidad:la complejidad del problema que se quiere solucionar, que yace sobre la complejidad de la mquina en que se soluciona. Debido a esta complejidad,la mayora de nuestros proyectos fallan. Y lo que es ms, de todos los lenguajes de pro- gramacin de los que soy consciente, ninguno se ha lanzado completamente decidiendo que la meta de diseo principal fuera conquistar la complejidad del desarrollo y mantenimiento de programas1. Por supuesto, muchas decisiones de diseo de lenguajes se hicieron sin tener en mente la comple- jidad, pero en algn punto haba siempre algn otro enfoque que se consideraba esencial aadirlo al conjunto. Inevitablemente, estos otros aspectos son los que hacen que generalmente los progra- madores "se den con la pared" contra ese lenguaje. Por ejemplo, C++tena que ser compatible con C (para permitir la migracin fcil a los programadores de C), adems de eficiente. Estas metas son ambas muy tiles y aportan mucho al xito de Ctt, pero tambin exponen complejidad extra que evita que los proyectos se acaben (ciertamente, se puede echar la culpa a los programadores y la gestin, pero si un lenguaje puede ayudar 'a capturar los errores, por qu no hacer uso de ello?). Como otro ejemplo, Visual Basic (VB) estaba atado a BASIC, que no estaba diseado verdadera- mente para ser un lenguaje ampliable, por lo que todas las aplicaciones que se apilaban sobre VB producan sintaxis verdaderamente horribles e inmantenibles. Perl es retrocompatible con Awk, Sed, Grep y otras herramientas Unix a las que iba a reemplazar, y como resultado se le acusa a me- nudo, de producir "cdigo de slo escritura" (es decir, cdigo que tras unos pocos meses no hay quien lea). Por otro lado, C++,VB, Perl, y otros lenguajes como Smalltalk han visto cmo algunos de sus esfuerzos de diseo se centraban en el aspecto de la complejidad y como resultado son re- marcadamente exitosos para solucionar ciertos tipos de problemas. Lo que ms me impresion es que he llegado a entender que Java parece tener el objetivo de redu- cir la complejidad para el programador. Como si se dijera "no nos importa nada ms que reducir el tiempo y la dificultad para producir un cdigo robusto". En los primeros tiempos, esta meta llevaba a un cdigo que no se ejecutaba muy rpido (aunque se haban hecho promesas sobre lo rpido que se ejecutara Java algn da), pero sin duda ha producido reducciones sorprendentes de tiempo de desarrollo; la mitad o menos del tiempo que lleva crear un programa C++equivalente. Este resulta- do slo puede ahorrar cantidades increbles de tiempo y dinero, pero Java no se detiene ah. En- vuelve todas las tareas complejas que se han convertido en importantes, como el multihilo y la pro- gramacin en red, en bibliotecas o aspectos del lenguaje que en ocasiones pueden convertir esas tareas en triviales.Y finalmente, asume muchos problemas de complejidadgrandes: programas mul- tiplataforma, cambios dinmicos de cdigo, e incluso seguridad, cada uno de los cuales pueden en- cajar dentro de un espectro de complejidades que oscila en el rango de "impedimento" a "motivos de cancelacin". Por tanto, a pesar de los problemas de rendimiento que se han visto, la promesa de Java es tremenda: puede convertirnos en programadores significativamentems productivos. Uno de los sitios en los que veo el mayor impacto de esto es en la Web. La programacin en red siempre ha sido complicada, y Java la convierte en fcil Or los diseadores el lenguaje Java estn Esto lo retomo de la 2." edicin: creo que el lenguaje Python se acerca aun ms a esto. Ver http://www.Python.org. 20. Prefacio xxiii trabajando en facilitarla an ms). La programacin en red es como hablar simultneamente de for- ma efectiva y de forma ms barata de lo que nunca se logr con telfonos (slo el correo electrni- co ya ha revolucionado muchos negocios). Al intercomunicarnos ms, empiezan a pasar cosas divertidas,probablemente mucho ms interesantes que las que pasarn con la ingeniera gentica. De todas formas -al crear los programas, trabajar para crear programas, construir interfaces para los programas, de forma que stos se puedan comunicar con el usuario, ejecutar los programas en distintos tipos de mquinas, y escribir de forma sencilla programas que pueden comunicarse a tra- vs de Internet- Java incrementa el ancho de banda de comunicacin entre la gente. Creo que qui- zs los resultados de la revolucin de la comunicacin no se contemplarn por lo que conlleva el transporte de grandes cantidades de bits; veremos la autntica revolucin porque podremos comu- nicarnos con mayor facilidad: de uno en uno, pero tambin en grupos y, como planeta. He odo la sugerencia de que la prxima revolucin es la formacin de cierto tipo de mente global para sufi- cientegente y suficiente nivel de interconectividad. Puede decirse que Java puede fomentar o no esa revolucin, pero al menos la mera posibilidad me ha hecho sentir como si estuviera haciendo algo lleno de sentido al intentar ensenar ese lenguaje. Prlogo a la 2.a edicin La gente ha hecho muchos, muchos comentarios maravillosos sobre la primera edicin de este li- bro, cosa que ha sido para m muy, pero que muy, placentero. Sin embargo, en todo momento ha- br quien tenga quejas, y por alguna razn una queja que suele aparecer peridicamente es que "el libro es demasiado grande". Para m, esto no es verdaderamente una queja, si se reduce a que "tie- ne demasiadas pginas". (Uno se acuerda de las quejas del Emperador de Austria sobre el trabajo de Mozart: "Demasiadas pginas!", y no es que me est intentando comparar con Mozart de nin- guna forma). Adems, slo puedo asumir que semejante queja puede provenir de gente que no tie- ne an una idea clara de la vasta extensin del propio lenguaje Java en s, y que no ha visto el res- to de libros sobre la materia -por ejemplo, mi referencia favorita es el CoreJava de Cay Horstmann & Cary Cornell (Prentice-Hall),que creci tanto que hubo que dividirlo en dos tomos. A pesar de esto,una de las cosas que he intentado hacer en esta edicin es eliminar las portes que se han vuel- to obsoletas o al menos no esenciales. Me siento a gusto haciendo esto porque el material original sigue en la Web y en el CD ROM que acompaa al libro, en la misma forma de descarga gratuita que la primera edicin del libro (en http:/ / www.BruceEckel.com). Si se desea el material antiguo, sigue ah, y esto es algo maravilloso para un autor. Por ejemplo, puede verse que el ltimo captulo original, "Proyectos", ya no est aqu; dos de los proyectos se han integrado en los otros captulos, y el resto ya no son adecuados. Tambin el captulo de "Patrones de diseo" se volvi demasiado extenso y ha sido trasladado a un libro que versa sobre ellos (descargable tambin en el sitio web). Por tanto, el libro debera ser ms fino. Pero no lo es. El aspecto mayor es el continuo desarrollo del lenguaje Java en s, y en particular las API que se ex- panden,y prometen proporcionar interfaces estndar para casi todo lo que se desee hacer (y no me sorprendera ver aparecer la API "JTostadora"). Cubrir todas estas API se escapa por supuesto del mbito de este libro, y es una tarea relegada a otros autores, pero algunos aspectos no pueden ig- 21. xxiv Piensa en Java norarse. El mayor de stos incluye el Java de lado servidor (principalmente Servlets & Java Server Pages o JSP), que es verdaderamente una solucin excelente al problema de la World Wide Web, donde se descubri que las distintas plataformas de navegadores web no son lo suficientemente con- sistentes como para soportar programacin en el lado cliente. Adems, est todo el problema de crear de forma sencilla aplicaciones que interacten de forma sencilla con bases de datos, transac- ciones, seguridad y semejante, cubiertos gracias a los Enterprise Java Beans (EJB). Estos temas es- tn desarrollados en el captulo que antes se llamaba "Programacin de red" y ahora "Computacin distribuida", un tema que se est convirtiendo en esencial para todo el mundo. Tambin se ver que se ha compilado este captulo para incluir un repaso de Jini (pronunciado "yeni", y que no es un acrnimo, sino slo un nombre), que es una tecnologa emergente que permite que cambiemos la forma de pensar sobre las aplicacionesinterconectadas.Y por supuesto, el libro se ha cambiado para usar la biblioteca IGU Swing a lo largo de todo el mismo. De nuevo, si se desea el material Java 1.0/1.1 antiguo, es posible conseguirlo gratuitamente del libro de descarga gratuita de http:llwww.BruceEckel.corn (tambin est incluido en el nuevo CD ROM de esta edicin, que se ad- junta al mismo; hablar ms de l un poco ms adelante). Aparte de nuevas caractersticas del lenguaje aadidas a Java 2, y varias correcciones hechas a lo largo de todo el libro, el otro cambio principal est en el captulo de colecciones que ahora se cen- tra en las colecciones de Java 2, que se usan a lo largo de todo el libro. Tambin he mejorado ese captulo para que entre ms en profundidad en algunos aspectos importantes de las colecciones, en particular, en cmo funcionan las funciones de hashing (de forma que se puede saber cmo crear una adecuadamente). Ha habido otros movimientos y cambios, incluida la reescritura del Captulo 1,y la eliminacin de algunos apndices y de otros materiales que ya no consideraba necesarios para el libro impreso, que son un montn de ellos. En general, he intentado recorrer todo, eliminar de la 2." edicin lo que ya no es necesario (pero que sigue existiendo en la primera edicin electr- nica), incluir cambios y mejorar todo lo que he podido. A medida que el lenguaje contina cam- biando -aunque no a un ritmo tan frentico como antiguamente- no cabe duda de que habr ms ediciones de este libro. Para aquellos de vosotros que siguen sin poder soportar el tamao del libro, pido perdn. Lo creis o no, he trabajado duro para que se mantenga lo menos posible. A pesar de todo, creo que hay bas- tantes alternativas que pueden satisfacer a todo el mundo. Adems, el libro est disponible electr- nicamente (en idioma ingls desde el sitio web, y desde el CD ROM que acompaa al libro), por lo que si se dispone de un ordenador de bolsillo, se puede disponer del libro sin tener que cargar un gran peso. Si sigue interesado en tamaos menores, ya existen de hecho versiones del libro para Palm Pilot. (Alguien me dijo en una ocasin que leera el libro en la cama en su Palm, con la luz en- cendida a la espalda para no molestar a su mujer. Slo espero que le ayude a entrar en el mundo de los sueos.) Si se necesita en papel, s de gente que lo va imprimiendo captulo a captulo y se lo lee en el tren. Java 2 En el momento de escribir el libro, es inminente el lanzamiento delJava Development Kit UDK) 1.3 de Sun, y ya se ha publicado los cambios propuestos para JDK 1.4. Aunque estos nmeros de ver- sin se corresponden an con los "unos", la forma estndar de referenciar a las versiones posterio- 22. Prefacio xxv res a la JDK 1.2 es llamarles "Java 2". Esto indica que hubo cambios muy significativosentre el "vie- jo Java" -que tena muchas pegas de las que ya me quej en la primera edicin de este libro- y esta nueva versin ms moderna y mejorada del lenguaje, que tiene menos pegas y ms adiciones y buenos diseos. Este libro est escrito para Java 2. Tengo la gran ventaja de librarme de todo el material y escribir slopara el nuevo lenguaje ya mejorado porque la informacinvieja sigue existiendo en la l."versin electrnica disponible en la Web y en el CD-ROM (que es a donde se puede ir si se desea obcecarse en el uso de versiones pre-Java 2 del lenguaje). Tambin, y dado que cualquiera puede descargarse gratuitamenteel JDK de http:/ /java.sun.com, se supone que por escribir para Java 2, no estoy impo- niendo ningn criterio financiero o forzando a nadie a hacer una actualizacin del software. Hay, sin embargo, algo que resear. JDK 1.3 tiene algunas mejoras que verdaderamente me gusta- ra usar, pero la versin de Java que est siendo actualmente distribuida para Linux es la JDK 1.2.2 (ver http:/ /www.Linux.org). Linux es un desarrollo importante en conjuncin con Java, porque es rpido, robusto, seguro, est bien mantenido y es gratuito; una autntica revolucin en la historia de la computacin (no creo que se hayan visto todas estas caractersticas unidas en una nica herra- mienta anteriormente). Y Java ha encontrado un nicho muy importante en la programacin en el lado servidor en forma de Serulets, una tecnologa que es una grandsima mejora sobre la progra- macin tradicional basada en CGI (todo ello cubierto en el captulo "Computacin Distribuida"). Por tanto, aunque me gustara usar slo las nuevas caractersticas, es crtico que todo se compile bajo Linux, y por tanto, cuando se desempaquete el cdigo fuente y se compile bajo ese SO (con el ltimo JDK) se ver que todo compila. Sin embargo, se ver que he puesto notas sobre caracters- ticas de JDK 1.3en muchos lugares. El CD ROM Otro bonus con esta edicin es el CD ROM empaquetado al final del libro. En el pasado me he re- sistido a poner CD ROM al final de mis libros porque pensaba que no estaba justificada una carga de unos pocos Kbytes de cdigo fuente en un soporte tan grande, prefiriendo en su lugar permitir a la gente descargar los elementos desde el sitio web. Sin embargo, pronto se ver que este CD ROM es diferente. El CD contiene el cdigo fuente del libro, pero tambin contiene el libro en su integridad, en varios formatos electrnicos. Para m, el preferido es el formato HTML porque es rpido y est completa- mente indexado -simplemente se hace clic en una entrada del ndice o tabla de contenidos y se es- tar inmediatamente en esa parte del libro. La carga de ms de 300 Megabytes del CD, sin embargo, es un curso multimedia denominado Thin- king in C: Foundationsfor C++&Java. Originalmente encargu este seminario en CD ROM a Chuck Allison,como un producto independiente,pero decid incluirlo con la segunda edicin tanto de Thin- king in C++como de Piensa en Java, gracias a la consistente experiencia de haber tenido gente vi- niendo a los seminarios sin la requerida experiencia en C. El pensamiento parece aparentemente ser: "Soy un programador inteligente y no deseo aprender C, y s C++o Java, por lo que me saltar C e ir directamente a C++/Java."Tras llegar al seminario, todo el mundo va comprendiendo que el 23. xxvi Piensa en Java prerrequisito de aprender C est ah por algo. Incluyendo el CD ROM con el libro, se puede ase- gurar que todo el mundo atienda al seminario con la preparacin adecuada. El CD tambin permite que el libro se presente para una audiencia mayor. Incluso aunque el Cap- tulo 3 (Controlando el flujo del programa) cubre los aspectos fundamentales de las partes de Java que provienen de C, el CD es una introduccin ms gentil, y asume incluso un trasfondo de C me- nor que el que supone el libro. Espero que al introducir el CD ser ms la gente que se acerque a la programacin en Java. 24. Prlogo a la edicin en espanoi Java se convierte da a da en un lenguaje de programacin universal; es decir, ya no slo sirve como lenguajepara programar en entornos de Internet, sino que se est utilizando cada vez ms como he- rramienta de programacin orientada a objetos y tambin como herramienta para cursos especfi- cos de programacin o de estructuras de datos, aprovechando sus caractersticas de lenguaje "mul- tiparadigma". Por estas razones, los libros que afronten temarios completos y amplios sobre los temas anteriores siempre sern bienvenidos. Si, adems de reunir estos requisitos, el autor es uno de los ms galardonados por sus obras anteriores, nns enfrentamos ante iin reto considerable: "la posibilidad de encontrarnos" ante un gran libro, de esos que hacen "historia". ste, pensamos, es el caso del libro que tenemos entre las manos. Por qu pensamos as? El libro como referencia obligada a Java Piensa en Java introduce todos los fundamentos tericos y prcticos del lenguaje Java, tratando de explicar con claridad y rigor no slo lo que hace el lenguaje sino tambin el porqu. Eckel introduce los fundamentos de objetos y cmo los utiliza Java. ste es el caso del estudio que hace de la ocul- tacin de las implementaciones, reutilizacin de clases y polimorfismo. Adems, estudia en profun- didad propiedades y caractersticas tan importantes como AWT, programacin concurrente (mul- tihilo, multithreading2), programacin en red, e incluso diseo de patrones. Es un libro que puede servir para iniciarse en Java y llegar hasta un nivel avanzado. Pero, en reali- dad se sacar el mximo partido al libro si se conoce otro lenguaje de programacin, o al menos tc- nicas de programacin (como haber seguido un curso de Fundamentos de Programacin, Metodo- loga de la Programacin,Algoritmos,o cursos similares) y ya se puede apostar por un alto y eficiente rendimiento si la migracin a Java se hace desde un lenguaje orientado a objetos, como C++. El libro como formacin integral de programador Una de las fortalezas ms notables del libro es su contenido y la gran cantidad de temas importan- tes cubiertos con toda claridad y rigor, y con gran profundidad. El contenido es muy amplio y sobre todo completo. Eckel prcticamente ha tocado casi todas las tcnicas existentes y utilizadas hoy da en el mundo de la programacin y de la ingeniera del software. Algunos de los temas ms sobre- salientes analizados en el libro son: fundamentos de diseo orientado a objetos, implementacin de herencia y polimorfismo, manejo de excepciones, multihilo y persistencia, Java en Internet, reco- leccin de basura, paquetes Java, diseo por reutilizacin: composicin, herencia, interfaces y cla- ses internas, arrays y contenedores de clases, clases de E/S Java, programacin de redes con soc- kets, JDBC para bases de datos, JSPs (JavaServer Pages), RMI, CORBA, EJBs (Enterprise JauaBeans) y Jini, JNI (Java Native Interface). 25. xxviii Piensa en Java El excelente y extenso contenido hacen al libro idneo para la preparacin de cursos de nivel medio y avanzado de programacin, tanto a nivel universitario como profesional. Asimismo,por el enfoque masivamente profesional que el autor da al libro, puede ser una herramienta muy til como re- ferencia bsica o complementaria para preparar los exmenes de certificacin Java que la casa Sun Microsystems otorga tras la superacin de las correspondientes pruebas. Esta caracterstica es un valor aadido muy importante, al facilitar considerablemente al lector interesado las directrices tc- nicas necesarias para la preparacin de la citada certificacin. Recursos gratuitos en lnea Si las caractersticas citadas anteriormente son de por s lo suficientemente atractivas para la lectu- ra del libro, es sin duda el excelente sitio en Internet del autor otro valor aadido difcil de medir, por no decir inmedible y valiossimo. La generosidad del autor -y, naturalmente, de Pearson-, que ofrece a cualquier lector, sin necesidad de compra previa, todo el contenido en lnea, junto a las fre- cuentes revisiones de la obra y soluciones a ejercicios seleccionados, con la posibilidad de descar- garse gratuitamente todo este inmenso conocimiento incluido en el libro,junto al conocimiento com- plementario ofertado (ejercicios,revisiones, actualizaciones...), hacen a esta experiencia innovadora del autor digna de los mayores agradecimientos por parte del cuerpo de programadores noveles o profesionales de cualquier lugar del mundo donde se utilice Java (que hoy es prcticamente "todo el mundo mundial", que diran algunos periodistas). De igual forma es de agradecer el CD kOM que acompaa al libro y la oferta de un segundo CD gratuito que se puede conseguir siguiendo las instrucciones incluidas en el libro con el texto com- pleto de la versin original en ingls y un gran nmero de ejercicios seleccionados resueltos y re- cursos Java de todo tipo. Para facilitar al lector el uso del CD ROM incluido en el libro, el equipo de revisin tcnica ha rea- lizado el Apndice E: Correspondencias espaol-ingls de clases, bases de datos, tablas y campos del CD ROM que acompaa al libro, a fin de identificar el nombre asignado en la traduccin al espaol, con el nombre original en ingls de dichas clases. Unas palabras todava ms elogiosas Para las personas que, como el autor de este prlogo, llevamos muchos aos (ya dcadas) dedicn- donos a programar computadores, ensear a programar y escribir sobre programacin, un libro como ste slo nos trae elevados y elogiosos pensamientos. Consideramos que es un libro magnfi- co, maduro, consistente, intelectualmente honesto, bien escrito y preciso. Sin duda, como lo de- muestra su larga lista de premios y sus numerosas y magnficas cualidades, Piensa en Java, no slo es una excelente obra para aprender y llegar a dominar el lenguaje Java y su programacin, sino tambin una excelente obra para aprender y dominar las tcnicas modernas de programacin. Luis Joyanes Aguilar Director del Departamento de Lenguajes y Sistemas Informticos e Zngenien de Software Universidad Pontificia de Salamanca campus Madrid 26. Comentarios los lectores Mucho mejor que cualquier otro libro de Java que haya visto. Esto se entiende "en orden de mag- nitud" ...muy completo, con ejemplos directos y al grano, excelentes e inteligentes, sin embarullar- se, lleno de explicaciones....En contraste con muchos otros libros de Java lo he encontrado inusual- mente maduro, consistente, intelectualmente honesto, bien escrito y preciso. En mi honesta opinin, un libro ideal para estudiar Java. Anatoly Vorobey, Technion University, Haifa, Israel. Uno de los mejores tutoriales de programacin, que he visto de cualquier lenguaje.Joakim Ziegler, FIX sysop. Gracias por ese libro maravilloso, maravilloso en Java. Dr. Gavin Pillary, Registrar, King Eduard VI11 Hospital, Surfrica. Gracias de nuevo por este maravilloso libro. Yo estaba completamente perdido (soy un programa- dor que no viene de C) pero tu libro me ha permitido avanzar con la misma velocidad con la que lo he ledo. Es verdaderamente fcil entender los principios subyacentes y los conceptos desde el prin- cipio, en vez de tener que intentar construir todo el modelo conceptual mediante prueba y error. Afortunadamente podr acudir a su seminario en un futuro no demasiado lejano. Randa11 R. Haw- ley, Automation Technician, Eli Lilly & Co. El mejor libro escrito de computadores que haya visto jams. Tom Holland. ste es uno de los mejores libros que he ledo sobre un lenguaje de programacin...El mejor libro sobre Java escrito jams. Revindra Pai, Oracle Corporation, lnea de productos SUNOS. ste es el mejor libro sobre Java que haya visto nunca! Has hecho un gran trabajo. Tu profundidad es sorprendente.Comprar el libro en cuanto se publique. He estado aprendiendo Java desde octubre del 96. He ledo unos pocos libros y considero el tuyo uno que "SE DEBE LEER". En estos ltimos meses nos hemos centrado en un producto escrito totalmente en Java. Tu libro ha ayudado a consoli- dar algunos temas en los que andbamos confusos y ha expandido mi conocimiento base. Incluso he usado algunos de tus ejemplos y explicaciones como informacin en mis entrevistas para ayudar al equipo. He averiguado el conocimiento de Java que tienen preguntndoles por algunas de las cosas que he aprendido a partir de la lectura de tu libro (por ejemplo,la diferencia entre arrays y Vectores). Ellibro es genial! Steve Wilkinson, Senior Staff Specialist, MCI Telecommunications. Gran libro. El mejor libro de Java que he visto hasta la fecha. Jeff Sinlair, ingeniero de Softwa- re, Kestral Computing. Gracias por Piensa en Java. Ya era hora de que alguien fuera ms all de una mera descripcin del lenguaje para lograr un tutorial completo, penetrante, impactante y que no se centra en los fabri- cante. He ledo casi todos los dems -y slo el tuyo y el de Patrick Winston han encontrado un lu- gar en mi corazn. Se lo estoy recomendando ya a los clientes. Gracias de nuevo. Richard Brooks, consultor de Java, Sun Professional Services, Dallas. Otros libros contemplan o abarcan el QU de Java (describiendo la sintaxis y las bibliotecas) o el CMO de Java (ejemplos de programacin prcticos). Piensa en Jaual es el nico libro que conoz- 'Thinking in Java (titulo original de la obra en ingls). 27. xxx Piensa en Java co que explica el PORQU de Java; por qu se dise de la manera que se hizo, por qu funciona como lo hace, por qu en ocasiones no funciona, por qu es mejor que C++,por qu no lo es. Aun- que hace un buen trabajo de enseanza sobre el qu y el cmo del lenguaje, Piensa en Java es la eleccin definitiva que toda persona interesada en Java ha de hacer. Robert S. Stephenson. Gracias por escribir un gran libro. Cuanto ms lo leo ms me gusta. A mis estudiantes tambin les gusta. Chuck Iverson. Slo quiero comentarte tu trabajo en Piensa en Java. Es la gente como t la que dignifica el futuro de Internet y simplemente quiero agradecerte el esfuerzo. Patrick Barrell, Network Officer Mamco, QAF M@. Inc. La mayora de libros de Java que existen estn bien para empezar, y la mayora tienen material para principiantes y muchos los mismos ejemplos. El tuyo es sin duda el mejor libro y ms avanzadopara pensar que he visto nunca. iPor favor, publcalo rpido!...Tambin compr Thinking in C++simple- mente por lo impresionado que me dej Piensa en Java. George Laframboise, LightWorx Tech- nology Consulting Inc. Te escrib anteriormente con mis impresiones favorables relativas a Piensa enJava (un libro que em- pieza prominentemente donde hay que empezar). Y hoy que he podido meterme con Java con tu li- bro electrnico en mi mano virtual, debo decir (en mi mejor Chevy Chase de Modern Problems) "Me gusta!". Muy informativo y explicativo, sin que parezca que se lee un texto sin sustancia. Cu- bres los aspectos ms importantes y menos tratados del desarrollo de Java: los porqus. Sean Brady. Tus ejemplos son claros y fciles de entender. Tuviste cuidado con la mayora de detalles impor- tantes de Java que no pueden encontrarse fcilmente en la dbil documentacin de Java. Y no mal- gastas el tiempo del lector con los hechos bsicos que todo programador conoce. Kai Engert, In- novative Software, Alemania. Soy un gran fan de Piensa en Java y lo he recomendado a mis asociados. A medida que avanzo por la versin electrnica de tu libro de Java, estoy averiguando que has retenido el mismo alto nivel de escritura. Peter R. Neuvald. Un libro de Java M W BIEN escrito...Pienso que has hecho un GRAN trabajo con l. Como lder de un grupo de inters especial en Java del rea de Chicago, he mencionado de forma favorable tu libro y sitio web muy frecuentemente en mis ltimas reuniones. Me gustara usar Piensa en Java como la base de cada reunin mensual del grupo, para poder ir repasando y discutiendo sucesiva- mente cada captulo. Mark Ertes. Verdaderamente aprecio tu trabajo, y tu libro es bueno. Lo recomiendo aqu a nuestros usuarios y estudiantes de doctorado. Hughes Leroy // Irisa-InriaRennes France, jefe de Computacin Cientfica y Transferencia Industrial. De acuerdo, slo he ledo unas 40 pginas de Piensa enJava, pero ya he averiguado que es el libro de programacin mejor escrito y ms claro que haya visto jams...Yo tambin soy escritor, por lo que probablemente soy un poco crtico. Tengo Piensa en Java encargado y ya no puedo esperar ms -soy bastante nuevo en temas de programacin y no hago ms que enfrentarme a curvas de 28. Comentarios de los lectores xxxi aprendizaje en todas partes. Por tanto, esto no es ms que un comentario rpido para agradecerte este trabajo tan excelente. Ya me haba empezado a quemar de tanto navegar por tanta y tanta prosa de tantos y tantos libros de computadores -incluso muchos que venan con magnficas recomenda- ciones. Me siento muchsimo mejor ahora. Glenn Becker, Educational Theatre ssociation. Gracias por permitirme disponer de este libro tan maravilloso. Lo he encontrado inmensamente til en el entendimiento final de lo que he experimentado -algo confuso anteriormente- con Java y C++. Leer tu libro ha sido muy gratificante. Felix Bizaoui, Twin Oaks Industnes, Luisa, Va. Debo felicitartepor tu excelente libro. He decidido echar un vistazo a Piensa enJava guiado por mi experiencia en Thinking in C++, y no me ha defraudado. Jaco van der Merwe, Software Specia- list, DataFusion Systems Ltd., Steienbosch, Surfnca. Este libro hace que todos los dems libros de Java que he ledo parezcan un insulto o sin duda in- tiles. 13rett g Porter, Senior Programmer, Art & Logic. He estado leyendo tu libro durante una semana o dos y lo he comparado con otros libros de Java que he ledo anteriormente. Tu libro parece tener un gran comienzo. He recomendado este libro a muchos de mis amigos y todos ellos lo han calificado de excelente. Por favor, acepta mis felicitacio- nes por escribir un libro tan excelente. Rama Krishna Bhupathi, Ingeniera de Software, TCSI Corporation, San Jos. Simplemente quera decir lo "brillante" que es tu libro. Lo he estado usando como referencia prin- cipal durante mi trabajo de Java hecho en casa. He visto que la tabla de contenidos es justo la ms adecuada para localizar rpidamente la seccin que se requiere en cada momento. Tambin es ge- nial ver un libro que no es simplemente una compilacin de las API o que no trata al programador co


Top Related