pensando en java

958

Upload: ramiro-carrion-arellano

Post on 26-May-2015

354 views

Category:

Documents


11 download

TRANSCRIPT

  • 1. Piensa

2. Piensa en JavaBruce EckelTraduccin:Jorge Gonzlez BarturenFacultad de IngenieraUniversidad de DeustoRevisin tcnica:Javier Parra FuenteRicardo Lozano QuesadaDepartamento de Lenguajes y Sistemas Informticos e Ingeniera de SoftwareUniversidad Pontijicia de Salamanca en MadridCoordinacin general y revisin tcnica:Luis Joyanes AguilarDepartamento de Lenguajes y Sistemas Informticos e Ingeniera de SoftwareUniversidad Pontificia de Salamanca en MadridMadrid Mxico Santaf de Bogot Buenos Aires Caracas Lima MontevideoSan Juan San Jos Santiago Sao Paulo White Plains 3. atos de catalogacin bibliogrficaiBruce EckelPIENSA EN JAVASegunda edicinPEARSON EDUCACIN, S.A. Madrid, 2002ISBN: 84-205-3 192-8Materia: Informtica 68 1.3Formato 195 x 250 Pginas: 960No est permitida la reproduccin total o parcial de esta obrani su tratamiento o transmisin por cualquier medio o mtodosin autorizacin escrita de la Editorial.DERECHOS RESERVADOSO 2002 respecto a la segunda edicin en espaol por:PEARSON EDUCACI~NS, .A.Nez de Balboa, 12028006 MadridBruce EckelPIENSA EN JAVA, segunda edicin.ISBN: 84-205-3192-8Depsito Legal: M.4.162-2003ltima reimpresin, 2003PRENTICE 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-5Edicin en espuol:Equipo editorial:Editor: Andrs OteroAsistente editorial: Ana Isabel GarcaEquipo de produccin:Director: Jos A. ClaresTcnico: Diego MarnDiseo de cubierta: Mario Guindel, La Senz y Begoa PrezCompoicin: COMPOMAR. S.L.Impreso por: LAVEL, S. A.IMPRESO EN ESPANA - PRINTED IN SPAINEste libro ha sido impreso con papel y tintas ecolgicos 4. A la persona que, incluso en este momento, est creando el prximogran lenguaje de programacin. 5. @ Indice de contenidoPrlogo ................................................... xxiPrlogo a la 2." edicin ......................................... xxiiiJava2 ......................................................... xxivElCDROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvPrlogo a la edicin en espaol ................................. xxviiEl libro como referencia obligada a Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxviiEl libro como formacin integral de programador ....................... xxviiRecursos gratuitos en lnea ........................................ xxviiiUnas palabras todava ms elogiosas ................................. xxviiiComentarios de los lectores ................................... xxixIntroduccin .Prerrequisitos ............................................... xxxvAprendiendoJava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .x xxviObjetivos ................................................... xxxviDocumentacin en lnea ........................................x xxv.i..i Captulos ..................................................x.x xviiiEjercicios ................................................... xliiCD ROM Multimedia .......................................... xliiiCdigofuente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xliiiEstndares de codificacin ......................................... xlvVersiones de Java ............................................. xlvSeminarios y mi papel como mentor .............................. xlviErrores .................................................... xlviNota sob. re. el diseo de la portada ................................ xlvi Agradecimientos ............................................. xlviiColaboradores Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlix 6. vi Piensa en Java1: 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 contenido2: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 e s necesario destruir un objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . .mbito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .mbito de los objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Crear nuevos tipos d e 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Compilacin y 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 d e 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 JavaEloperadordeString+ ...........................................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 xiModificadores 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 ......................................Sintaxis de 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 JavaDiseoconherencia ...........................................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 u n 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 xiiiEn 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 inmodificable una 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 JavaEl 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 ...............................Comprobando y 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 xvStringTokenizer .................................................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 JavaBordes ........................................................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 xviiRevisar 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 JavaFundamentosdeCORBA .......................................... 773Unejemplo .................................................... 775Applets de Java y CORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780CORBAfrenteaRMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780Enterprise JavaBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780JavaBeans frente a EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781La especificacin EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782ComponentesEJB ............................................... 783Las partes de un componente EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784Funcionamiento de un EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785TiposdeEJB ................................................... 785Desarrollar un EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786ResumendeEJB ................................................ 791Jini: servicios distribuidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791Jini en contcxto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791Qu es Jini? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792Cmo funciona Jini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792El proceso de discovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793El proceso join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793El proceso lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794Separacin de interfaz e implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795Abstraer sistemas distribuidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796Resumen ...................................................... 796Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796A: 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 xixLas 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-ingls de clases. bases de datos. tablasy campos del CD ROM que acompaa al libro . . . . . . . . . . . . . . . . . . . 18. PrlogoSuger a mi hermano Todd, que est dando elcin, que la siguiente gran revolucin ser ensalto del hardware a la programa-ingenieragentica.Tendremos microbios diseados para hacer comida, combustible y plstico; limpiarn la polucin yen general, nos permitirn dominar la manipulacin del mundo fsico por una fraccin de lo quecuesta 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-torexperimentado sabe que la historia nunca tiene que ver con los elementos, sino con la gente. Lagentica tendr un gran impacto en nuestras vidas, pero no estoy seguro de que haga sombra a larevolucin de los computadores (que hace posible la revolucin gentica) -o al menos la revolu-cinde la informacin. La informacin hace referencia a comunicarse con otros: s, los coches, loszapatos y 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 escomunicacin.Este libro es un caso. La mayora de colegas pensaban que estaba un poco loco al poner todo en laWeb. "Por qu lo comprara alguien?", se preguntaban. Si hubiera sido de naturaleza ms conser-vadorano lo habra hecho, pero lo que verdaderamente no quera era escribir ms libros de com-putacinal estilo tradicional. No saba qu pasara pero result que fue una de las cosas ms inteli-gentesque he hecho con un libro.Por algn motivo, la gente empez a mandar correcciones. ste ha sido un proceso divertido, por-quetodo 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. Lagente 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 enfacilitar que todo se imprimiera con formato adecuado, pero eso no fren la demanda de una ver-sinpublicada. La mayora de la gente no quiere leer todo el libro en pantalla, y merodear por unconjunto 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.) Pareceque 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 penapasar el libro a papel. Actualmente, la gran mayora de libros conllevan problemas financieros, y qui-zseste nuevo enfoque pueda hacer que el negocio de la publicacin sea ms beneficioso. Este li- 19. xxii Piensa en Javabro se convirti en una experiencia reveladora para m de otra forma. Originalmente me acerqu aJava como "simplemente a otro lenguaje de programacin", lo que en cierto sentido es verdad. Peroa medida que pasaba el tiempo y lo estudiaba ms en profundidad, empec a ver que la intencinfundamental 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 sequiere solucionar, que yace sobre la complejidad de la mquina en que se soluciona. Debido a estacomplejidad, la mayora de nuestros proyectos fallan. Y lo que es ms, de todos los lenguajes de pro-gramacinde los que soy consciente, ninguno se ha lanzado completamente decidiendo que la metade 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 aadirloal 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 conC (para permitir la migracin fcil a los programadores de C), adems de eficiente. Estas metas sonambas muy tiles y aportan mucho al xito de Ctt, pero tambin exponen complejidad extra queevita que los proyectos se acaben (ciertamente, se puede echar la culpa a los programadores y lagestin, 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-mentepara ser un lenguaje ampliable, por lo que todas las aplicaciones que se apilaban sobre VBproducan 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 hayquien lea). Por otro lado, C++, VB, Perl, y otros lenguajes como Smalltalk han visto cmo algunosde sus esfuerzos de diseo se centraban en el aspecto de la complejidad y como resultado son re-marcadamenteexitosos 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-cirla complejidad para el programador. Como si se dijera "no nos importa nada ms que reducir eltiempo y la dificultad para producir un cdigo robusto". En los primeros tiempos, esta meta llevabaa un cdigo que no se ejecutaba muy rpido (aunque se haban hecho promesas sobre lo rpido quese ejecutara Java algn da), pero sin duda ha producido reducciones sorprendentes de tiempo dedesarrollo; la mitad o menos del tiempo que lleva crear un programa C++ equivalente. Este resulta-doslo puede ahorrar cantidades increbles de tiempo y dinero, pero Java no se detiene ah. En-vuelvetodas las tareas complejas que se han convertido en importantes, como el multihilo y la pro-gramacinen red, en bibliotecas o aspectos del lenguaje que en ocasiones pueden convertir esastareas en triviales. Y finalmente, asume muchos problemas de complejidad grandes: programas mul-tiplataforma,cambios dinmicos de cdigo, e incluso seguridad, cada uno de los cuales pueden en-cajardentro de un espectro de complejidades que oscila en el rango de "impedimento" a "motivosde cancelacin". Por tanto, a pesar de los problemas de rendimiento que se han visto, la promesade Java es tremenda: puede convertirnos en programadores significativamente ms productivos.Uno de los sitios en los que veo el mayor impacto de esto es en la Web. La programacin en redsiempre ha sido complicada, y Java la convierte en fcil Or los diseadores el lenguaje Java estnEsto lo retomo de la 2." edicin: creo que el lenguaje Python se acerca aun ms a esto. Ver http://www.Python.org. 20. Prefacio xxiiitrabajando en facilitarla an ms). La programacin en red es como hablar simultneamente de for-maefectiva y de forma ms barata de lo que nunca se logr con telfonos (slo el correo electrni-coya ha revolucionado muchos negocios). Al intercomunicarnos ms, empiezan a pasar cosasdivertidas, 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 paralos programas, de forma que stos se puedan comunicar con el usuario, ejecutar los programas endistintos tipos de mquinas, y escribir de forma sencilla programas que pueden comunicarse a tra-vsde Internet- Java incrementa el ancho de banda de comunicacin entre la gente. Creo que qui-zslos resultados de la revolucin de la comunicacin no se contemplarn por lo que conlleva eltransporte de grandes cantidades de bits; veremos la autntica revolucin porque podremos comu-nicarnoscon mayor facilidad: de uno en uno, pero tambin en grupos y, como planeta. He odo lasugerencia 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 esarevolucin, pero al menos la mera posibilidad me ha hecho sentir como si estuviera haciendo algolleno de sentido al intentar ensenar ese lenguaje.Prlogo a la 2.a edicinLa 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-brquien tenga quejas, y por alguna razn una queja que suele aparecer peridicamente es que "ellibro es demasiado grande". Para m, esto no es verdaderamente una queja, si se reduce a que "tie-nedemasiadas pginas". (Uno se acuerda de las quejas del Emperador de Austria sobre el trabajode Mozart: "Demasiadas pginas!", y no es que me est intentando comparar con Mozart de nin-gunaforma). Adems, slo puedo asumir que semejante queja puede provenir de gente que no tie-nean una idea clara de la vasta extensin del propio lenguaje Java en s, y que no ha visto el res-tode libros sobre la materia -por ejemplo, mi referencia favorita es el Core Java de Cay Horstmann& Cary Cornell (Prentice-Hall), que creci tanto que hubo que dividirlo en dos tomos. A pesar deesto, una de las cosas que he intentado hacer en esta edicin es eliminar las portes que se han vuel-toobsoletas o al menos no esenciales. Me siento a gusto haciendo esto porque el material originalsigue en la Web y en el CD ROM que acompaa al libro, en la misma forma de descarga gratuitaque 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 captulooriginal, "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 demasiadoextenso 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 mesorprendera ver aparecer la API "JTostadora"). Cubrir todas estas API se escapa por supuesto delmbito de este libro, y es una tarea relegada a otros autores, pero algunos aspectos no pueden ig- 21. xxiv Piensa en Javanorarse. El mayor de stos incluye el Java de lado servidor (principalmente Servlets & Java ServerPages 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-sistentescomo para soportar programacin en el lado cliente. Adems, est todo el problema decrear 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-tndesarrollados en el captulo que antes se llamaba "Programacin de red" y ahora "Computacindistribuida", un tema que se est convirtiendo en esencial para todo el mundo. Tambin se ver quese ha compilado este captulo para incluir un repaso de Jini (pronunciado "yeni", y que no es unacrnimo, sino slo un nombre), que es una tecnologa emergente que permite que cambiemos laforma de pensar sobre las aplicaciones interconectadas. Y por supuesto, el libro se ha cambiado parausar la biblioteca IGU Swing a lo largo de todo el mismo. De nuevo, si se desea el material Java1.0/1.1 antiguo, es posible conseguirlo gratuitamente del libro de descarga gratuita dehttp:llwww.BruceEckel.corn (tambin est incluido en el nuevo CD ROM de esta edicin, que se ad-juntaal mismo; hablar ms de l un poco ms adelante).Aparte de nuevas caractersticas del lenguaje aadidas a Java 2, y varias correcciones hechas a lolargo de todo el libro, el otro cambio principal est en el captulo de colecciones que ahora se cen-traen las colecciones de Java 2, que se usan a lo largo de todo el libro. Tambin he mejorado esecaptulo para que entre ms en profundidad en algunos aspectos importantes de las colecciones, enparticular, en cmo funcionan las funciones de hashing (de forma que se puede saber cmo crearuna adecuadamente). Ha habido otros movimientos y cambios, incluida la reescritura del Captulo1, y la eliminacin de algunos apndices y de otros materiales que ya no consideraba necesariospara el libro impreso, que son un montn de ellos. En general, he intentado recorrer todo, eliminarde 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 msediciones de este libro.Para aquellos de vosotros que siguen sin poder soportar el tamao del libro, pido perdn. Lo creiso no, he trabajado duro para que se mantenga lo menos posible. A pesar de todo, creo que hay bas-tantesalternativas 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 loque si se dispone de un ordenador de bolsillo, se puede disponer del libro sin tener que cargar ungran peso. Si sigue interesado en tamaos menores, ya existen de hecho versiones del libro paraPalm Pilot. (Alguien me dijo en una ocasin que leera el libro en la cama en su Palm, con la luz en-cendidaa la espalda para no molestar a su mujer. Slo espero que le ayude a entrar en el mundo delos sueos.) Si se necesita en papel, s de gente que lo va imprimiendo captulo a captulo y se lolee en el tren.Java 2En el momento de escribir el libro, es inminente el lanzamiento del Java Development Kit UDK) 1.3de Sun, y ya se ha publicado los cambios propuestos para JDK 1.4. Aunque estos nmeros de ver-sinse corresponden an con los "unos", la forma estndar de referenciar a las versiones posterio- 22. Prefacio xxvres a la JDK 1.2 es llamarles "Java 2". Esto indica que hubo cambios muy significativos entre el "vie-joJava" -que tena muchas pegas de las que ya me quej en la primera edicin de este libro- yesta nueva versin ms moderna y mejorada del lenguaje, que tiene menos pegas y ms adicionesy buenos diseos.Este libro est escrito para Java 2. Tengo la gran ventaja de librarme de todo el material y escribirslo para el nuevo lenguaje ya mejorado porque la informacin vieja sigue existiendo en la l." versinelectrnica disponible en la Web y en el CD-ROM (que es a donde se puede ir si se desea obcecarseen el uso de versiones pre-Java 2 del lenguaje). Tambin, y dado que cualquiera puede descargarsegratuitamente el JDK de http: / / java.sun.com, se supone que por escribir para Java 2, no estoy impo-niendoningn 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-rausar, 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 esrpido, robusto, seguro, est bien mantenido y es gratuito; una autntica revolucin en la historia dela computacin (no creo que se hayan visto todas estas caractersticas unidas en una nica herra-mientaanteriormente). Y Java ha encontrado un nicho muy importante en la programacin en ellado servidor en forma de Serulets, una tecnologa que es una grandsima mejora sobre la progra-macintradicional 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 compilebajo Linux, y por tanto, cuando se desempaquete el cdigo fuente y se compile bajo ese SO (con elltimo JDK) se ver que todo compila. Sin embargo, se ver que he puesto notas sobre caracters-ticasde JDK 1.3 en muchos lugares.El CD ROMOtro bonus con esta edicin es el CD ROM empaquetado al final del libro. En el pasado me he re-sistidoa poner CD ROM al final de mis libros porque pensaba que no estaba justificada una cargade unos pocos Kbytes de cdigo fuente en un soporte tan grande, prefiriendo en su lugar permitira la gente descargar los elementos desde el sitio web. Sin embargo, pronto se ver que este CDROM es diferente.El CD contiene el cdigo fuente del libro, pero tambin contiene el libro en su integridad, en variosformatos electrnicos. Para m, el preferido es el formato HTML porque es rpido y est completa-menteindexado -simplemente se hace clic en una entrada del ndice o tabla de contenidos y se es-tarinmediatamente en esa parte del libro.La carga de ms de 300 Megabytes del CD, sin embargo, es un curso multimedia denominado Thin-kingin C: Foundations for C++ & Java. Originalmente encargu este seminario en CD ROM a ChuckAllison, como un producto independiente, pero decid incluirlo con la segunda edicin tanto de Thin-kingin C++ como de Piensa en Java, gracias a la consistente experiencia de haber tenido gente vi-niendoa los seminarios sin la requerida experiencia en C. El pensamiento parece aparentementeser: "Soy un programador inteligente y no deseo aprender C, y s C++ o Java, por lo que me saltarC e ir directamente a C++/Java." Tras llegar al seminario, todo el mundo va comprendiendo que el 23. xxvi Piensa en Javaprerrequisito de aprender C est ah por algo. Incluyendo el CD ROM con el libro, se puede ase-gurarque 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-tulo3 (Controlando el flujo del programa) cubre los aspectos fundamentales de las partes de Javaque provienen de C, el CD es una introduccin ms gentil, y asume incluso un trasfondo de C me-norque el que supone el libro. Espero que al introducir el CD ser ms la gente que se acerque ala programacin en Java. 24. Prlogo a la edicinen espanoiJava se convierte da a da en un lenguaje de programacin universal; es decir, ya no slo sirve comolenguaje para programar en entornos de Internet, sino que se est utilizando cada vez ms como he-rramientade programacin orientada a objetos y tambin como herramienta para cursos especfi-cosde 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 lostemas anteriores siempre sern bienvenidos. Si, adems de reunir estos requisitos, el autor es unode los ms galardonados por sus obras anteriores, nns enfrentamos ante iin reto considerable: "laposibilidad de encontrarnos" ante un gran libro, de esos que hacen "historia". ste, pensamos, es elcaso del libro que tenemos entre las manos. Por qu pensamos as?El libro como referencia obligada a JavaPiensa en Java introduce todos los fundamentos tericos y prcticos del lenguaje Java, tratando deexplicar con claridad y rigor no slo lo que hace el lenguaje sino tambin el porqu. Eckel introducelos fundamentos de objetos y cmo los utiliza Java. ste es el caso del estudio que hace de la ocul-tacinde las implementaciones, reutilizacin de clases y polimorfismo. Adems, estudia en profun-didadpropiedades 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-dadse sacar el mximo partido al libro si se conoce otro lenguaje de programacin, o al menos tc-nicasde programacin (como haber seguido un curso de Fundamentos de Programacin, Metodo-logade la Programacin, Algoritmos, o cursos similares) y ya se puede apostar por un alto y eficienterendimiento si la migracin a Java se hace desde un lenguaje orientado a objetos, como C++.El libro como formacin integral de programadorUna de las fortalezas ms notables del libro es su contenido y la gran cantidad de temas importan-tescubiertos con toda claridad y rigor, y con gran profundidad. El contenido es muy amplio y sobretodo completo. Eckel prcticamente ha tocado casi todas las tcnicas existentes y utilizadas hoy daen el mundo de la programacin y de la ingeniera del software. Algunos de los temas ms sobre-salientesanalizados en el libro son: fundamentos de diseo orientado a objetos, implementacin deherencia y polimorfismo, manejo de excepciones, multihilo y persistencia, Java en Internet, reco-leccinde basura, paquetes Java, diseo por reutilizacin: composicin, herencia, interfaces y cla-sesinternas, 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 (EnterpriseJauaBeans) y Jini, JNI (Java Native Interface). 25. xxviii Piensa en JavaEl excelente y extenso contenido hacen al libro idneo para la preparacin de cursos de nivel medioy avanzado de programacin, tanto a nivel universitario como profesional. Asimismo, por el enfoquemasivamente profesional que el autor da al libro, puede ser una herramienta muy til como re-ferenciabsica o complementaria para preparar los exmenes de certificacin Java que la casa SunMicrosystems otorga tras la superacin de las correspondientes pruebas. Esta caracterstica es unvalor aadido muy importante, al facilitar considerablemente al lector interesado las directrices tc-nicasnecesarias para la preparacin de la citada certificacin.Recursos gratuitos en lneaSi las caractersticas citadas anteriormente son de por s lo suficientemente atractivas para la lectu-radel 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-, queofrece a cualquier lector, sin necesidad de compra previa, todo el contenido en lnea, junto a las fre-cuentesrevisiones de la obra y soluciones a ejercicios seleccionados, con la posibilidad de descar-garsegratuitamente todo este inmenso conocimiento incluido en el libro, junto al conocimiento com-plementarioofertado (ejercicios, revisiones, actualizaciones...), hacen a esta experiencia innovadoradel autor digna de los mayores agradecimientos por parte del cuerpo de programadores noveles oprofesionales de cualquier lugar del mundo donde se utilice Java (que hoy es prcticamente "todoel 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 CDgratuito que se puede conseguir siguiendo las instrucciones incluidas en el libro con el texto com-pletode la versin original en ingls y un gran nmero de ejercicios seleccionados resueltos y re-cursosJava de todo tipo.Para facilitar al lector el uso del CD ROM incluido en el libro, el equipo de revisin tcnica ha rea-lizadoel Apndice E: Correspondencias espaol-ingls de clases, bases de datos, tablas y campos del CDROM que acompaa al libro, a fin de identificar el nombre asignado en la traduccin al espaol, conel nombre original en ingls de dichas clases.Unas palabras todava ms elogiosasPara las personas que, como el autor de este prlogo, llevamos muchos aos (ya dcadas) dedicn-donosa programar computadores, ensear a programar y escribir sobre programacin, un librocomo 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-muestrasu larga lista de premios y sus numerosas y magnficas cualidades, Piensa en Java, no sloes una excelente obra para aprender y llegar a dominar el lenguaje Java y su programacin, sinotambin una excelente obra para aprender y dominar las tcnicas modernas de programacin.Luis Joyanes AguilarDirector del Departamento de Lenguajes y Sistemas Informticos e Zngenien de SoftwareUniversidad Pontificia de Salamanca campus Madrid 26. Comentarios los lectoresMucho 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-mentemaduro, 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, KingEduard VI11 Hospital, Surfrica.Gracias de nuevo por este maravilloso libro. Yo estaba completamente perdido (soy un programa-dorque no viene de C) pero tu libro me ha permitido avanzar con la misma velocidad con la que lohe 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 librosobre 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 profundidades sorprendente. Comprar el libro en cuanto se publique. He estado aprendiendo Java desde octubredel 96. He ledo unos pocos libros y considero el tuyo uno que "SE DEBE LEER". En estos ltimosmeses nos hemos centrado en un producto escrito totalmente en Java. Tu libro ha ayudado a consoli-daralgunos temas en los que andbamos confusos y ha expandido mi conocimiento base. Incluso heusado algunos de tus ejemplos y explicaciones como informacin en mis entrevistas para ayudar alequipo. He averiguado el conocimiento de Java que tienen preguntndoles por algunas de las cosasque he aprendido a partir de la lectura de tu libro (por ejemplo, la diferencia entre arrays y Vectores).El libro 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 dellenguaje 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-garen 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 elCMO 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 Javaco que explica el PORQU de Java; por qu se dise de la manera que se hizo, por qu funcionacomo lo hace, por qu en ocasiones no funciona, por qu es mejor que C++, por qu no lo es. Aun-quehace un buen trabajo de enseanza sobre el qu y el cmo del lenguaje, Piensa en Java es laeleccin 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 lesgusta. Chuck Iverson.Slo quiero comentarte tu trabajo en Piensa en Java. Es la gente como t la que dignifica el futurode Internet y simplemente quiero agradecerte el esfuerzo. Patrick Barrell, Network OfficerMamco, QAF M@. Inc.La mayora de libros de Java que existen estn bien para empezar, y la mayora tienen material paraprincipiantes y muchos los mismos ejemplos. El tuyo es sin duda el mejor libro y ms avanzado parapensar que he visto nunca. iPor favor, publcalo rpido! ... Tambin compr Thinking in C++ simple-mentepor lo impresionado que me dej Piensa en Java. George Laframboise, LightWorx Tech-nologyConsulting Inc.Te escrib anteriormente con mis impresiones favorables relativas a Piensa en Java (un libro que em-piezaprominentemente donde hay que empezar). Y hoy que he podido meterme con Java con tu li-broelectrnico 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-breslos aspectos ms importantes y menos tratados del desarrollo de Java: los porqus. SeanBrady.Tus ejemplos son claros y fciles de entender. Tuviste cuidado con la mayora de detalles impor-tantesde Java que no pueden encontrarse fcilmente en la dbil documentacin de Java. Y no mal-gastasel tiempo del lector con los hechos bsicos que todo programador conoce. Kai Engert, In-novativeSoftware, Alemania.Soy un gran fan de Piensa en Java y lo he recomendado a mis asociados. A medida que avanzo porla versin electrnica de tu libro de Java, estoy averiguando que has retenido el mismo alto nivel deescritura. Peter R. Neuvald.Un libro de Java MW BIEN escrito ... Pienso que has hecho un GRAN trabajo con l. Como lderde un grupo de inters especial en Java del rea de Chicago, he mencionado de forma favorable tulibro y sitio web muy frecuentemente en mis ltimas reuniones. Me gustara usar Piensa en Javacomo la base de cada reunin mensual del grupo, para poder ir repasando y discutiendo sucesiva-mentecada captulo. Mark Ertes.Verdaderamente aprecio tu trabajo, y tu libro es bueno. Lo recomiendo aqu a nuestros usuarios yestudiantes de doctorado. Hughes Leroy // Irisa-Inria Rennes France, jefe de ComputacinCientfica y Transferencia Industrial.De acuerdo, slo he ledo unas 40 pginas de Piensa en Java, pero ya he averiguado que es el librode programacin mejor escrito y ms claro que haya visto jams ... Yo tambin soy escritor, por loque probablemente soy un poco crtico. Tengo Piensa en Java encargado y ya no puedo esperarms -soy bastante nuevo en temas de programacin y no hago ms que enfrentarme a curvas de 28. Comentarios de los lectores xxxiaprendizaje en todas partes. Por tanto, esto no es ms que un comentario rpido para agradecerteeste trabajo tan excelente. Ya me haba empezado a quemar de tanto navegar por tanta y tanta prosade 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 tilen el entendimiento final de lo que he experimentado -algo confuso anteriormente- con Java yC++. Leer tu libro ha sido muy gratificante. Felix Bizaoui, Twin Oaks Industnes, Luisa, Va.Debo felicitarte por tu excelente libro. He decidido echar un vistazo a Piensa en Java guiado por miexperiencia 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 Javaque he ledo anteriormente. Tu libro parece tener un gran comienzo. He recomendado este libro amuchos de mis amigos y todos ellos lo han calificado de excelente. Por favor, acepta mis felicitacio-nespor escribir un libro tan excelente. Rama Krishna Bhupathi, Ingeniera de Software, TCSICorporation, San Jos.Simplemente quera decir lo "brillante" que es tu libro. Lo he estado usando como referencia prin-cipaldurante mi trabajo de Java hecho en casa. He visto que la tabla de contenidos es justo la msadecuada para localizar rpidamente la seccin que se requiere en cada momento. Tambin es ge-nialver un libro que no es simplemente una compilacin de las API o que no trata al programadorcomo a un monigote. Grant Sayer, Java Components Group Leader, Ceedata Systems PtyLtd., Australia.~Gu~Uun! libro de Java profundo y legible. Hay muchos libros pobres (y debo admitir tambin queun par de ellos buenos) de Java en el mercado, pero por lo que he visto, el tuyo es sin duda uno delos mejores. John Root, desarrollador Web, Departamento de la Seguridad Social, Londres.*Acabo* de empezar Piensa en Java. Espero que sea bueno porque me gust mucho Thinking inC++ (que le como programador ya experimentado en C++, intentado adelantarme a la curva deaprendizaje). En parte estoy menos habituado a Java, pero espero que el libro me satisfaga igual-mente.Eres un autor maravilloso. Kevin K. Lewis, Tecnlogo, ObjectSpace Inc.Creo que es un gran libro. He aprendido todo lo que s de Java a partir de l. Gracias por hacerlodisponible gratuitamente a travs de Internet. Si no lo hubieras hecho no sabra nada de Java. Perolo mejor es que tu libro no es un mero folleto publicitario de Java. Tambin muestra sus lados ne-gativos.T has hecho aqu un gran trabajo. FrederikFix, Blgica.Siempre me han enganchado tus libros. Hace un par de aos, cuando quera empezar con C++, fueC++ Inside & Out el que me introdujo en el fascinante mundo de C++. Me ayud a disponer de me-joresoportunidades en la vida. Ahora, persiguiendo ms conocimiento y cuando quera aprenderJava, me introduje en Piensa en Java -sin dudar de que gracias a l ya no necesitara ningn otrolibro. Simplemente fantstico. Es casi como volver a descubrirme a m mismo a medida que avanzo 29. xxxii Piensa en Javaen el libro. Apenas hace un mes que he empezado con Java y mi corazn late gracias a ti. Ahora loentiendo todo mucho mejor. Anand Kumar S., ingeniero de Software Computervision, India.Tu libro es una introduccin general excelente. Peter Robinson, Universidad de Cambridge,Computar Laboratory.Es con mucho el mejor material al que he tenido acceso al aprender Java y simplemente quera quesupieras la suerte que he tenido de poder encontrarlo. GRACIAS! Chuck Peterson, Product Le-ader,Internet Product Line, MS International.Este libro es genial. Es el tercer libro de Java que he empezado y ya he recorrido prcticamente dostercios. Espero acabar ste. Me he enterado de su existencia porque se usa en algunas clases in-ternasde Lucen Technologies y un amigo me ha dicho que el libro estaba en la Red. Buen trabajo.Jerry Nowlin, M13, Lucent Technologies.De los aproximadamente seis libros de Java que he acumulado hasta la fecha, tu Piensa en Java essin duda el mejor y el ms claro. Michael Van Waas, doctor, presidente, TMR Associates.Simplemente quiero darte las gracias por Piensa en Java. Qu libro tan maravilloso has hecho! iYpara qu mencionar el poder bajrselo gratis! Como estudiante creo que tus libros son de valor in-calculable,tengo una copia de C++ Inside & Out, otro gran libro sobre C++), porque no slo me en-seanel cmo hacerlo, sino que tambin los porqus, que sin duda son muy importantes a la horade sentar unas buenas bases en lenguajes como C++ y Java. Tengo aqu bastantes amigos a los queles encanta programar como a m, y les he hablado de tus libros. Todos piensan que son geniales!Por cierto, soy indonesio y vivo en Java. Ray Frederick Djajadinata, estudiante en Trisakti Uni-versity,Jakarta.El mero hecho de que hayas hecho que este trabajo est disponible gratuitamente en la Red me dejaconmocionado. Pens que deba decirte cunto aprecio y respeto lo que ests haciendo. Shane Ke-Bouthillier, estudiante de Ingeniera en Informtica, Universidad de Alberta, Canad.Tengo que decirte cunto anso leer tu columna mensual. Como novato en el mundo de la progra-macinorientada a objetos, aprecio el tiempo y el grado de conocimiento que aportas en casi todoslos temas elementales. He descargado tu libro, pero puedes apostar a que comprar una copia enpapel en cuanto se publique. Gracias por toda tu ayuda. Dan Cashmer, D. C. Ziegler & Co.Simplemente quera felicitarte por el buen trabajo que has hecho. Primero me recorr la versin PDFde Piensa en Java. Incluso antes de acabar de leerla, corr a la tienda y compr Thinking in C++. Aho-raque llevo en el negocio de la informtica ocho aos, como consultor, ingeniero de software, profe-sor/formador, y ltimamente autnomo, creo que puedo decir que he visto suficiente (fjate que nodigo haber visto "todo" sino suficiente). Sin embargo, estos libros hacen que mi novia me llame"geek. No es que tenga nada contra el concepto en s -simplemente pensaba que ya haba dejadoatrs esta fase. Pero me veo a m mismo disfrutando sinceramente de ambos libros, de una forma queno haba sentido con ningn otro libro que haya tocado o comprado hasta la fecha. Un estilo de es-crituraexcelente, una introduccin genial de todos los temas y mucha sabidura en ambos textos.Bien hecho. Simon Goland, [email protected], Simon Says Consulting, Inc. 30. Comentarios de los lectores xxxiiiDebo decir que tu Piensa en Java es genial! Es exactamente el tipo de documentacin que busca-ba.Especialmente las secciones sobre los buenos y malos diseos basados en Java. Dirk Duehr,Lexikon Verlag, Bertelsmann AG, Alemania.Gracias por escribir dos grandes libros (Thinking in C++, Piensa en Java). Me has ayudado inmen-samenteen mi progresin en la programacin orientada a objetos. Donald Lawon, DCL Enter-prises.Gracias por tomarte el tiempo de escribir un libro de Java que ayuda verdaderamente. Si ensearhace que aprendas algo, t ya debes estar ms que satisfecho. Dominic Turner, GEAC Support.Es el mejor libro de Java que he ledo jams -y he ledo varios. Jean-Yves MENGANT, ChiefSoftware Architect NAT-SYSTEM, Pars, Francia.Piensa en Java proporciona la mejor cobertura y explicacin. Muy fcil de leer, y quiero decir queesto se extiende tambin a los fragmentos de cdigo. Ron Chan, Ph. D., Expert Choice Ind.,Pittsburg PA.Tu libro es genial. He ledo muchos libros de programacin y el tuyo sigue aadiendo luz a la pro-gramacinen mi mente. Ningjian Wang, Information System Engineer, The Vanguard Group.Piensa en Java es un libro excelente y legible. Se lo recomiendo a todos mis alumnos. Dr. PaulGorman, Department of Computer Sciente, Universidad de Otago, Dunedin, Nueva Ze-landa.Haces posible que exista el proverbial almuerzo gratuito, y no simplemente una comida basada ensopa de pollo, sino una delicia de gourmet para aqullos que aprecian el buen software y los librossobre l mismo. Jose Suriol, Scylax Corporation.Gracias por la oportunidad de ver cmo este libro se convierte en una obra maestra! ES EL ME-JORlibro de la materia que he ledo o recorrido. Jeff Lapchinsky, programador, Net ResultTecnologies.Tu libro es conciso, accesible y gozoso de leer. Keith Ritchie, Java Research & DevelpmentTeam, KL Group Inc.ES sin duda el mejor libro de Java que he ledo! Daniel Eng.ES el mejor libro de Java que he visto! Rich Hoffarth, Arquitecto Senior, West Group.Gracias por un libro tan magnfico. Estoy disfrutando mucho a medida que leo captulos. FredTrimble, Actium Corporation.Has llegado a la maestra en el arte de hacernos ver los detalles, despacio y con xito. Haces que lalectura sea MUY fcil y satisfactoria. Gracias por un tutorial tan verdaderamente maravilloso. Ra-jeshRau, Software Consultant.Piensa en Java es un rock para el mundo libre! Miko O'Sullivan, Presidente, Idocs Inc. 31. xxxiv Piensa en JavaSobre Thinking in C++:Best Book! Ganador en 1995 del Software Development Magazine Jolt Award!"Este libro es un tremendo logro. Deberas tener una copia en la estantera. El captulo sobre flujosde E/S presenta el tratamiento ms comprensible y fcil de entender sobre ese tema que jams hayavisto."Al StevensEditor, Doctor Dobbs Journal"El libro de Eckel es el nico que explica claramente cmo replantearse la construccin de progra-maspara la orientacin a objetos. Que el libro es tambin un tutorial excelente en las entradas y enlas salidas de C++ es un valor aadido."Andrew BinstockEditor, Unix Review"Bruce contina deleitndome con esta introspeccin de C++, y Thinking in C++ es la mejor colec-cinde ideas hasta la fecha. Si se desean respuestas rpidas a preguntas difciles sobre C++, com-preeste libro tan sobresaliente."Gary EntsmingerAutor, The Tao of Objects"Thinking in C++" explora paciente y metdicamente los aspectos de cundo y cmo usar los inter-lineado~r,e ferencias, sobrecargas de operadores, herencia, y objetos dinmicos, adems de temasavanzados como el uso adecuado de plantillas, excepciones y la herencia mltiple. Todo el esfuerzose centra en un producto que engloba la propia filosofa de Eckel del diseo de objetos y programas.Un libro que no debe faltar en la librera de un desarrollador de C++, Piensa en Jaua es el libro deC++ que hay que tener si se estn haciendo desarrollos serios con C++."Richard Hale ShawAyudante del Editor, PC Magazine 32. IntroduccinComo cualquier lenguaje humano, Java proporciona una forma de expresar con-ceptos.Si tiene xito, la expresin media ser significativamente ms sencilla yms flexible que las alternativas, a medida que los problemas crecen en tamaoy complejidad.No podemos ver Java como una simple coleccin de caractersticas -algunas de las caractersticasno tienen sentido aisladas. Se puede usar la suma de partes slo si se est pensando en diseo, y nosimplemente en codificacin. Y para entender Java as, hay que entender los problemas del lengua-jey de la programacin en general. Este libro habla acerca de problemas de programacin, por quson problemas y el enfoque que Java sigue para solucionarlos. Por consiguiente, algunas caracte-rsticasque explico en cada captulo se basan en cmo yo veo que se ha solucionado algn proble-maen particular con el lenguaje. As, espero conducir poco a poco al lector, hasta el punto en queJava se convierta en lengua casi materna.Durante todo el tiempo, estar tomando la actitud de que el lector construya un modelo mental quele permita desarrollar un entendimiento profundo del lenguaje; si se encuentra un puzzle se podralimentar de ste al modelo para tratar de deducir la respuesta.PrerrequisitosEste libro asume que se tiene algo de familiaridad con la programacin: se entiende que un pro-gramaes una coleccin de sentencias, la idea de una subrutina/funcin/macro, sentencias de con-trolcomo "ir' y bucles estilo "while", etc. Sin embargo, se podra haber aprendido esto en muchossitios, como, por ejemplo, la programacin con un lenguaje de macros o el trabajo con una herra-mientacomo Perl. A medida que se programa hasta el punto en que uno se siente cmodo con lasideas bsicas de programacin, se podr ir trabajando a travs de este libro. Por supuesto, el libroser ms fcil pa