piensa en java(2002) espanol

958

Upload: ashley-stronghold-witwicky

Post on 12-Jun-2015

1.917 views

Category:

Technology


13 download

DESCRIPTION

Este es el libro "Thinking in Java" en español del autor Bruce Eckel

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 SoftwareUniversidad Pontijicia de Salamanca en MadridCoordinacin general y revisin tcnica: Luis Joyanes Aguilar Departamento de Lenguajes y Sistemas Informticos e Ingeniera de SoftwareUniversidad Pontificia de Salamanca en MadridMadrid Mxico Santaf de Bogot Buenos Aires Caracas Lima Montevideo San Juan San Jos Santiago Sao Paulo White Plains 3. atos de catalogacin bibliogrficaiBruce EckelPIENSA EN JAVASegunda edicinPEARSON EDUCACIN, S.A. Madrid, 2002 ISBN: 84-205-3 192-8 Materia: 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 E D U C A C I ~ 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 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 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxxviObjetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxxviDocumentacin en lnea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxxvii . ...Captulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxviiiEjercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xliiCD ROM Multimedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xliiiCdigofuente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xliiiEstndares de codificacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvVersiones de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvSeminarios y mi papel como mentor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlviErrores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlviNota sobre el diseo de la portada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xlvi. .Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlviiColaboradores 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 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 d e 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. xPiensa 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 contenidoxi 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...................................... 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 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 d e 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 d e 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 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. xivPiensa 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .L clase File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 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. xviPiensa 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~ Q u e s u n B e a n ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 contenidoxvii 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 JavaFundamentosdeCORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773Unejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .775Applets de Java y CORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .780CORBAfrenteaRMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .780Enterprise 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .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 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 d e libros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .E: Correspondencias espaol-ingls de clases. bases de datos. tablas y campos del CD ROM que acompaa al libro . . . . . . . . . . . . . . . . . . . 18. PrlogoSuger a mi hermano Todd, que est dando el salto del hardware a la programa-cin, que la siguiente gran revolucin ser en ingeniera gentica.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-tor experimentado sabe que la historia nunca tiene que ver con los elementos, sino con la gente. L agentica 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-cin de 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-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. 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-sin publicada. L mayora de la gente no quiere leer todo el libro en pantalla, y merodear por un aconjunto 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-zs este nuevo enfoque pueda hacer que el negocio de la publicacin sea ms beneficioso. Este li- 19. xxiiPiensa 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-gramacin de 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 C t t , 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-mente para 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-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 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-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 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-cajar dentro 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. Prefacioxxiii 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- ciente gente 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 L gente ha hecho muchos, muchos comentarios maravillosos sobre la primera edicin de este li- a 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 Core Java 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. xxivPiensa 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-sistentes como 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-tn desarrollados 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, e s 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-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 lolargo 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 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-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 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-cendida a 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-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 significativos entre 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 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-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 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-mienta anteriormente). 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-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 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-ticas de 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-sistido a 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-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 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. xxviPiensa en Javaprerrequisito 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 Javaque 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 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-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 lostemas anteriores siempre sern bienvenidos. Si, adems de reunir estos requisitos, el autor es unode los ms galardonados por sus obras anteriores, n n s 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-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 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-tes cubiertos 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-salientes analizados en el libro son: fundamentos de diseo orientado a objetos, implementacin deherencia 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 (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-ferencia bsica 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-nicas necesarias 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-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-, queofrece 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 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-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 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-donos a 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-muestra su 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. Comentarioslos 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 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 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 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-dar algunos 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-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 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-que hace 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-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 en Java (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. SeanBrady.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 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 M W 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-mente cada 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 Javaqu