Piensa
Piensa en Java                         Bruce Eckel                             Traducción:                       Jorge Gon...
atos de catalogación bibliográficai    Bruce Eckel    PIENSA EN JAVA    Segunda edición    PEARSON EDUCACIÓN, S.A. Madrid,...
A la persona que, incluso en este momento, está creando el próximo                                   gran lenguaje de prog...
@                                                              Indice de contenidoPrólogo . . . . . . . . . . . . . . . . ...
vi¡¡     Piensa en Java       1:Introducción a los objetos                    ...................................         ...
índice de contenido2:Todoesunobjeto                 .........................................       Los objetos se manipul...
x      Piensa en Java                    EloperadordeString+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
índice de contenido              xi       Modificadores de acceso en Java . . . . . . . . . . . . . . . . . . . . . . . . ...
xii       Piensa en Java                   Diseñoconherencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
índice de contenido             xiii               En ocasiones funciona de cualquier modo . . . . . . . . . . . . . . . ....
xiv      Piensa en Java                         El caso especial de RuntimeException . . . . . . . . . . . . . . . . . . ....
índice de contenido             xv                StringTokenizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
xvi    Piensa en Java                   Bordes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
índice de contenido              xvii             Revisar los JavaBeans . . . . . . . . . . . . . . . . . . . . . . . . . ...
xviii     Piensa en Java                      FundamentosdeCORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
índice de contenido             xix             Las clases String y StringBuffer . . . . . . . . . . . . . . . . . . . . ....
PrólogoSugerí a mi hermano Todd, que está dando el salto del hardware a la programa-ción, que la siguiente gran revolución...
xxii      Piensa en Javabro se convirtió en una experiencia reveladora para mí de otra forma. Originalmente me acerqué aJa...
Prefacio    xxiii trabajando en facilitarla aún más). La programación en red es como hablar simultáneamente de for- ma efe...
xxiv    Piensa en Javanorarse. El mayor de éstos incluye el Java de lado servidor (principalmente Servlets & Java ServerPa...
Prefacio     xxv res a la JDK 1.2 es llamarles "Java 2". Esto indica que hubo cambios muy significativos entre el "vie-jo ...
xxvi    Piensa en Javaprerrequisito de aprender C está ahí por algo. Incluyendo el CD ROM con el libro, se puede ase-gurar...
Prólogo a la ediciónen espanoiJava se convierte día a día en un lenguaje de programación universal; es decir, ya no sólo s...
xxviii   Piensa en JavaEl excelente y extenso contenido hacen al libro idóneo para la preparación de cursos de nivel medio...
Comentarios                                            los lectores Mucho mejor que cualquier otro libro de Java que haya ...
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Piensa en java(2002) espanol
Próxima SlideShare
Cargando en…5
×

Piensa en java(2002) espanol

2.072 visualizaciones

Publicado el

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

Publicado en: Tecnología
0 comentarios
2 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

Sin descargas
Visualizaciones
Visualizaciones totales
2.072
En SlideShare
0
De insertados
0
Número de insertados
1
Acciones
Compartido
0
Descargas
83
Comentarios
0
Recomendaciones
2
Insertados 0
No insertados

No hay notas en la diapositiva.

Piensa en java(2002) espanol

  1. 1. Piensa
  2. 2. Piensa en Java Bruce Eckel Traducción: Jorge González Barturen Facultad de Ingeniería Universidad de Deusto Revisión técnica: Javier Parra Fuente Ricardo Lozano Quesada Departamento de Lenguajes y Sistemas Informáticos e Ingeniería de Software Universidad Pontijicia de Salamanca en Madrid Coordinación general y revisión técnica: Luis Joyanes Aguilar Departamento de Lenguajes y Sistemas Informáticos e Ingeniería de Software Universidad Pontificia de Salamanca en MadridMadrid México Santafé de Bogotá Buenos Aires Caracas Lima Montevideo San Juan San José Santiago Sao Paulo White Plains
  3. 3. atos de catalogación bibliográficai Bruce Eckel PIENSA EN JAVA Segunda edición PEARSON EDUCACIÓN, S.A. Madrid, 2002 ISBN: 84-205-3 192-8 Materia: Informática 68 1.3 Formato 195 x 250 Páginas: 960No está permitida la reproducción total o parcial de esta obrani su tratamiento o transmisión por cualquier medio o métodosin autorización escrita de la Editorial.DERECHOS RESERVADOSO 2002 respecto a la segunda edición en español por:PEARSON E D U C A C I ~ NS.A. ,Núñez de Balboa, 12028006 MadridBruce EckelPIENSA EN JAVA, segunda edición.ISBN: 84-205-3192-8Depósito Legal: M.4.162-2003Última reimpresión, 2003PRENTICE HALL es un sello editorial autorizado de PEARSON EDUCACIÓN, 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-5Edición en espuñol:Equipo editorial: Editor: Andrés Otero Asistente editorial: Ana Isabel GarcíaEquipo de producción: Director: José A. Clares Técnico: Diego MarínDiseño de cubierta: Mario Guindel, Lía Sáenz y Begoña PérezCompoición: COMPOMAR. S.L.Impreso por: LAVEL, S. A .IMPRESO EN ESPANA - PRINTED IN SPAIN Este libro ha sido impreso con papel y tintas ecológicos
  4. 4. A la persona que, incluso en este momento, está creando el próximo gran lenguaje de programación.
  5. 5. @ Indice de contenidoPrólogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi Prólogo a la 2." edición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii Java2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiv ElCDROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvPrólogo a la edición en español . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii El libro como referencia obligada a Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii El libro como formación integral de programador . . . . . . . . . . . . . . . . . . . . . . . xxvii Recursos gratuitos en línea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxviii Unas palabras todavía más elogiosas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxviiiComentarios de los lectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxixIntroducción . Prerrequisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxv AprendiendoJava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxxvi Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxxvi Documentación en línea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxxvii . ... Capítulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxviii Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlii CD ROM Multimedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xliii Códigofuente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xliii Estándares de codificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlv Versiones de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlv Seminarios y mi papel como mentor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvi Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvi Nota sobre el diseño de la portada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvi . . Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvii Colaboradores Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlix
  6. 6. vi¡¡ Piensa en Java 1:Introducción a los objetos ................................... El progreso de la abstracción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Todo objeto tiene una interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La implementación oculta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reutilizar la implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herencia: reutilizar la interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La relación es-un frente a la relación es-como-un . . . . . . . . . . . . . . . . . . . . . . . . Objetos intercambiables con polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . Clases base abstractas e interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Localización de objetos y longevidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Colecciones e iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La jerarquía de raíz única . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliotecas de colecciones y soporte al fácil manejo de colecciones . . . . . . . . . El dilema de las labores del hogar: ¿quién limpia la casa? . . . . . . . . . . . . . . . . . Manejo de excepciones: tratar con errores . . . . . . . . . . . . . . . . . . . . . . . . . . Multihilo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Persistencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JavaeInternet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lQuéeslaWeb? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programación en el lado del cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programación en el lado del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un ruedo separado: las aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Análisisydiseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase O Elaborar un plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : Fase 1: ¿Qué estamos construyendo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase 2: ¿Cómo construirlo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase 3: Construir el núcleo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase 4: Iterar los casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fase5:Evolución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Los planes merecen la pena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programación extrema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Escritura de las pruebas en primer lugar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programación a pares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PorquéJavatieneéxito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Los sistemas son más fáciles de expresar y entender . . . . . . . . . . . . . . . . . . . . Ventajas máximas con las bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manejo de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programación a lo grande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estrategias para la transición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Guías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Obstáculosdegestión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . davafrenteaC++? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  7. 7. índice de contenido2:Todoesunobjeto ......................................... Los objetos se manipulan mediante referencias . . . . . . . . . . . . . . . . . . . . . . Uno debe crear todos los objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dónde 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Camposymétodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Métodos. parámetros y valores d e retorno . . . . . . . . . . . . . . . . . . . . . . . . . . La lista de parámetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Construcción de un programa Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visibilidad de los nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilización de otros componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La palabra clave static . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tu primer programa Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compilación y ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comentarios y documentación empotrada . . . . . . . . . . . . . . . . . . . . . . . . . . Documentación en forma de comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTMLempotrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . asee: referencias a otras clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Etiquetas de documentación de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Etiquetas de documentación de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Etiquetas de documentación de métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo de documentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estilodecod~cación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3: Controlar el flujo del programa ............................... Utilizar operadores d e Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Precedencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Asignación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores matemáticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Autoincremento y Autodecremento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores relacionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadoresdebit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de desplazamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operador ternario if-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eloperadorcoma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  8. 8. x Piensa en Java EloperadordeString+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pequeños fallos frecuentes al usar operadores . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de conversión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Java no tiene "sizeof" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Volver a hablar acerca de la precedencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un compendio de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Control de ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trueyfalse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . If-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Iteración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . break y continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resuiiieil ................................................... Ejercicios ................................................... 4: Inicialización y limpieza ..................................... Inicialización garantizada con el constructor . . . . . . . . . . . . . . . . . . . . . . . . Sobrecargademétodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Distinguir métodos sobrecargados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sobrecarga con tipos primitivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sobrecarga en los valores de retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constructores por defecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La palabra clave this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Limpieza: finalización y recolección de basura . . . . . . . . . . . . . . . . . . . . . . . ¿Para qué sirve finalize( ) ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hay que llevar a cabo la limpieza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La condición de muerto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cómo funciona un recolector de basura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicialización de miembros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Especificación de la inicialización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicialización de constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicialización de arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays multidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5: Ocultar la implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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. 9. índice de contenido xi Modificadores de acceso en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "Amistoso" ("Friendly") . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . public: acceso a interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . private: jeso no se toca! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . protected: "un tipo de amistad" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interfaz e implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acceso a clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6: Reutilizando clases ........................................ Sintaxis de la composición ...................................... Sintaxis de la herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicializando la clase base ......................................... Combinando la composición y la herencia . . . . . . . . . . . . . . . . . . . . . . . . . . Garantizar una buena limpieza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ocultación de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elcción entre composición y herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Protegido (protected) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Desaerrollo incremental . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversión hacia arriba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¿Por qué "conversión hacia arriba"? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lapalabraclavefinal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Paradatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Métodosconstante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Precaución con constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Carga de clases e inicialización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicialización con herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . De nuevo la conversión hacia arriba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Olvidando el tipo de objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elcambio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La ligadura en las llamadas a métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Produciendo el comportamiento adecuado . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Superposición frente a sobrecarga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases y métodos abstractos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases y métodos abstractos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Orden de llamadas a constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herencia y finahe( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comportamiento de métodos polimórficos dentro de constructores . . . . . . . . .
  10. 10. xii Piensa en Java Diseñoconherencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herencia pura frente a extensión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversión hacia abajo e identificación de tipos en tiempo de ejecución . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8: Interfaces y clases internas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "Herencia múltiple" 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 métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases internas anónimas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El enlace con la clase externa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases internas estáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Referirse al objeto de la clase externa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acceso desde una clase múltiplemente 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducción a los contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visualizar contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rellenar contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Desventaja d e los contenedores: tipo desconocido . . . . . . . . . . . . . . . . . . . . . .
  11. 11. índice de contenido xiii En ocasiones funciona de cualquier modo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hacer un ArrayList consciente de los tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . Iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Taxonomía 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 códigos de hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Superponer el método hashCode( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Guardar referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El nhjetn HasMap dkhil (WeakHashMa~). . . . . . . . . . . . . . . . . . . . . . . . . . . . Revisitando los iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elegir una implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elegir entre Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elegir entre Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elegir entre Mapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ordenar y buscar elementos en Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hacer inmodificable una Colección o un Mapa . . . . . . . . . . . . . . . . . . . . . . . . Sincronizar una Colección 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 básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Parámetros de las excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capturarunaexcepcion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elbloquetry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manejadores de excepciones ....................................... Crear sus propias excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La especificación de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capturar cualquier excepción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Relanzarunaexcepción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ExcepcionesestándardeJava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  12. 12. xiv Piensa en Java El caso especial de RuntimeException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Limpiando con finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~Paraquésirvefinally? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Peligro: la excepción perdida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Restricciones a las excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Emparejamiento de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Guías 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Añadir 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 típicos de flujos de E/S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Flujosdeentrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Flujosdesalida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¿Unerror? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Flujosentubados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E/Sestándar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Leerdelaentradaestándar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Convirtiendo System.out en un PrintWriter . . . . . . . . . . . . . . . . . . . . . . . . . . RedingiendolaE/Sestándar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compresión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compresión sencilla con GZIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Almacenamiento múltiple con ZIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ARchivos Java UAR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Serialización de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Encontrarlaclase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controlar la serialización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizar la persistencia ............................................ Identificar símbolos de una entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . StreamTokenizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  13. 13. índice de contenido xv StringTokenizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprobar el estilo de escritura de mayúsculas . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12: Identificación de tipos en tiempo de ejecución . . . . . . . . . . . . . . . . . . . La necesidad de RTTI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ElobjetoClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprobar antes de una conversión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sintaxis RTTI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reflectividad: información de clases en tiempo de ejecución . . . . . . . . . . . . . . Un extractor de métodos de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resuinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13: Crear ventanas y applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El applet básico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Restricciones de applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ventajas de los applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Marcos de trabajo de aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejecutar applets dentro de un navegador web . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizar Appletviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Probarapplets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejecutar applets desde la línea de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . Un marco de trabajo de visualización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Usar el Explorador de Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hacer un botón . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capturarunevento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Áreas de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controlar la disposición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Borderhyout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Flowhyout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gridhyout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GridBagLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Posicionamiento absoluto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boxhyout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¿Elmejorenfoque? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El modelo de eventos de Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de eventos y oyentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Seguimiento de múltiples eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un catálogo de componentes Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Botones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Iconos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Etiquetas de aviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Camposdetexto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  14. 14. xvi Piensa en Java Bordes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JScrollPanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unminieditor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Casillas de verificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Botonesdeopción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Combo boxes (listas desplegables) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PanelesTabulados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cajasdemensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Menús . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Menúsemergentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Generacióndedibujos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cajasdediálogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diálogos de archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTMLencomponentesSwing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deslizadores y barras de progreso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Árboles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Seleccionar Apariencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elportapapeles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Empaquetando un applet en un fichero JAR . . . . . . . . . . . . . . . . . . . . . . . . . . . Técnicas de programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Correspondencia dinámica de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Separar la lógica de negocio de la lógica IU . . . . . . . . . . . . . . . . . . . . . . . . . . . Una forma canónica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programación visual y Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~ Q u é e s u n B e a n ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extraer BeanInfo con el Introspector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un Bean más sofisticado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EmpaquetarunBean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Soporte a Beans más complejo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MássobreBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14: Hilos múltiples .......................................... Interfaces de respuesta de usuario rápida . . . . . . . . . . . . . . . . . . . . . . . . . . HeredardeThread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hilos para una interfaz con respuesta rápida . . . . . . . . . . . . . . . . . . . . . . . . . . . Combinar el hilo con la clase principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Construir muchos hilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hilosdemonio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compartir recursos limitados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acceder a los recursos de forma inadecuada . . . . . . . . . . . . . . . . . . . . . . . . . . . Cómo comparte Java los recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  15. 15. índice de contenido xvii Revisar los JavaBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloqueo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloqueándose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interbloqueo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prioridades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Leer y establecer prioridades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gruposdehilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Volver a visitar Runnable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Demasiados hilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15: Computación distribuida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programación en red . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Identificar una máquina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Servir a múltiples clientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Datagramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizar URL en un applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Más aspectos de redes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conectividad a Bases de Datos de Java (JDBC) . . . . . . . . . . . . . . . . . . . . . . . . Hacer que el ejemplo funcione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Una versión con IGU del programa de búsqueda . . . . . . . . . . . . . . . . . . . . . . . Por qué el API JDBC parece tan complejo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un ejemplo más sofisticado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El servlet básico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Servlets y multihilo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gestionar sesiones con servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejecutar los ejemplos de servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Java Server Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objetos implícitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Directivas JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elementos de escritura de guiones JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extraer campos y valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Atributos JSP de página 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. 16. xviii Piensa en Java FundamentosdeCORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773 Unejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 Applets de Java y CORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780 CORBAfrenteaRMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780 Enterprise JavaBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780 JavaBeans frente a EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781 La especificación EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782 ComponentesEJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783 Las partes de un componente EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784 Funcionamiento de un EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785 TiposdeEJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785 Desarrollar un EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786 ResumendeEJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791 Jini: servicios distribuidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791 Jini en contcxto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791 ¿Qué es Jini? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792 Cómo funciona Jini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792 El proceso de discovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793 El proceso join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793 El proceso lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794 Separación de interfaz e implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795 Abstraer sistemas distribuidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796 A Paso y Retorno de Objetos . . . . . . . . . . : Pasando referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Usodealias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Haciendo copias locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pasoporvalor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clonandoobjetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Añadiendo a una clase la capacidad de ser clonable . . . . . . . . . . . . . . . . . . . . . Clonación con éxito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El efecto de Object.clone( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clonando un objeto compuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Una copia en profundidad con ArrayList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Copia en profundidad vía serialización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Añadiendo "clonabilidad" a lo largo de toda una jerarquía . . . . . . . . . . . . . . . . . {Por qué un diseño tan extraño? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controlando la "clonabilidad" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elconstructordecopias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases de sólo lectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creando clases de sólo lectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Los inconvenientes de la inmutabilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Strings inmutables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  17. 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 método nativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El generador de cabeceras de archivo: javah . . . . . . . . . . . . . . . . . . . . . . . . . . . renombrado de nombres y signaturas de funciones . . . . . . . . . . . . . . . . . . . . . . Implementando la DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accediendo a funciones JNI: el parámetro JNIEnv . . . . . . . . . . . . . . . . . . . . . Accediendo a Strings Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pasando y usando objetos Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JNI y las excepciones Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JNIyloshilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Usando un código base preexistente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Información adicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .C: Guías de programación Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implemenentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .D: Recursos Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Libros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Análisis y Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mi propia lista d e libros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .E: Correspondencias español-inglés de clases. bases de datos. tablas y campos del CD ROM que acompaña al libro . . . . . . . . . . . . . . . . . . .
  18. 18. PrólogoSugerí a mi hermano Todd, que está dando el salto del hardware a la programa-ción, que la siguiente gran revolución será en ingeniería genética.Tendremos microbios diseñados para hacer comida, combustible y plástico; limpiarán la polución yen general, nos permitirán dominar la manipulación del mundo físico por una fracción de lo quecuesta ahora. De hecho yo afirmé que la revolución de los computadores parecería pequeña en com-paración.Después, me di cuenta de que estaba cometiendo un error frecuente en los escritores de ciencia fic-ción: perderme en la tecnología (lo que por supuesto es fácil de hacer en ciencia ficción). Un escri-tor experimentado sabe que la historia nunca tiene que ver con los elementos, sino con la gente. L agenética tendrá un gran impacto en nuestras vidas, pero no estoy seguro de que haga sombra a larevolución de los computadores (que hace posible la revolución genética) -o al menos la revolu-ción de la información. La información hace referencia a comunicarse con otros: sí, los coches, loszapatos y especialmente la terapia genética son importantes, pero al final, ésto no son más que ador-nos. Lo que verdaderamente importa es cómo nos relacionamos con el mundo. Y cuánto de eso escomunicación.Este libro es un caso. La mayoría de colegas pensaban que estaba un poco loco al poner todo en laWeb. "¿Por qué lo compraría alguien?", se preguntaban. Si hubiera sido de naturaleza más conser-vadora no lo habría hecho, pero lo que verdaderamente no quería era escribir más libros de com-putación al estilo tradicional. No sabía qué pasaría pero resultó que fue una de las cosas más inteli-gentes que he hecho con un libro.Por algún 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 técnicos como los grama-ticales, y he podido eliminar fallos de todos los tipos que de otra forma se habrían quedado ahí. Lagente ha sido bastante amable con ésto, diciendo a menudo " yo no quiero decir esto por criticar...",y tras darme una colección 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 oír: "De acuerdo, bien, está bien que hayas puesto una versión electrónica,pero quiero una copia impresa proveniente de una auténtica editorial", puse mi mayor empeño enfacilitar que todo se imprimiera con formato adecuado, pero eso no frenó la demanda de una ver-sión publicada. L mayoría de la gente no quiere leer todo el libro en pantalla, y merodear por un aconjunto de papeles, sin que importe cuán bien impresos estén, simplemente no era suficiente.(Además, tampoco creo que resulte tan barato en términos de tóner para impresora láser.) Pareceque a fin de cuentas, la revolución de los computadores no conseguirá dejar sin trabajo a las edito-riales. Sin embargo, un alumno me sugirió que éste podría ser un modelo para publicaciones fina-les: los libros se publicarán primero en la Web, y sólo si hay el suficiente interés, merecerá la penapasar el libro a papel. Actualmente, la gran mayoría de libros conllevan problemas financieros, y qui-zás este nuevo enfoque pueda hacer que el negocio de la publicación sea más beneficioso. Este li-
  19. 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 programación", lo que en cierto sentido es verdad. Peroa medida que pasaba el tiempo y lo estudiaba más en profundidad, empecé a ver que la intenciónfundamental de este lenguaje es distinta de la de otros lenguajes que he visto.La programación está relacionada con gestionar la complejidad: la complejidad del problema que sequiere solucionar, que yace sobre la complejidad de la máquina en que se soluciona. Debido a estacomplejidad, la mayoría de nuestros proyectos fallan. Y lo que es más, de todos los lenguajes de pro-gramación de los que soy consciente, ninguno se ha lanzado completamente decidiendo que la metade diseño principal fuera conquistar la complejidad del desarrollo y mantenimiento de programas1.Por supuesto, muchas decisiones de diseño de lenguajes se hicieron sin tener en mente la comple-jidad, pero en algún punto había siempre algún otro enfoque que se consideraba esencial añadirloal 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++ tenía que ser compatible conC (para permitir la migración fácil a los programadores de C), además de eficiente. Estas metas sonambas muy útiles y aportan mucho al éxito de C t t , pero también exponen complejidad extra queevita que los proyectos se acaben (ciertamente, se puede echar la culpa a los programadores y lagestión, 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 diseñado verdadera-mente para ser un lenguaje ampliable, por lo que todas las aplicaciones que se apilaban sobre VBproducían 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 "código de sólo escritura" (es decir, código que tras unos pocos meses no hayquien lea). Por otro lado, C++,VB, Perl, y otros lenguajes como Smalltalk han visto cómo algunosde sus esfuerzos de diseño se centraban en el aspecto de la complejidad y como resultado son re-marcadamente exitosos para solucionar ciertos tipos de problemas.Lo que más 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 más que reducir eltiempo y la dificultad para producir un código robusto". En los primeros tiempos, esta meta llevabaa un código que no se ejecutaba muy rápido (aunque se habían hecho promesas sobre lo rápido quese ejecutaría Java algún día), 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 sólo puede ahorrar cantidades increíbles 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-gramación 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 dinámicos de código, 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 cancelación". Por tanto, a pesar de los problemas de rendimiento que se han visto, la promesade Java es tremenda: puede convertirnos en programadores significativamente más productivos.Uno de los sitios en los que veo el mayor impacto de esto es en la Web. La programación en redsiempre ha sido complicada, y Java la convierte en fácil Or los diseñadores el lenguaje Java estánEsto lo retomo de la 2." edición: creo que el lenguaje Python se acerca aun más a esto. Ver http://www.Python.org.
  20. 20. Prefacio xxiii trabajando en facilitarla aún más). La programación en red es como hablar simultáneamente de for- ma efectiva y de forma más barata de lo que nunca se logró con teléfonos (sólo el correo electróni- co ya ha revolucionado muchos negocios). Al intercomunicarnos más, empiezan a pasar cosas divertidas, probablemente mucho más interesantes que las que pasarán con la ingeniería genética. 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 máquinas, y escribir de forma sencilla programas que pueden comunicarse a tra- vés de Internet- Java incrementa el ancho de banda de comunicación entre la gente. Creo que qui- zás los resultados de la revolución de la comunicación no se contemplarán por lo que conlleva el transporte de grandes cantidades de bits; veremos la auténtica revolución porque podremos comu- nicarnos con mayor facilidad: de uno en uno, pero también en grupos y, como planeta. He oído la sugerencia de que la próxima revolución es la formación de cierto tipo de mente global para sufi- ciente gente y suficiente nivel de interconectividad. Puede decirse que Java puede fomentar o no esa revolución, pero al menos la mera posibilidad me ha hecho sentir como si estuviera haciendo algo lleno de sentido al intentar ensenar ese lenguaje.Prólogo a la 2.a edición L gente ha hecho muchos, muchos comentarios maravillosos sobre la primera edición 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 razón una queja que suele aparecer periódicamente es que "el libro es demasiado grande". Para mí, esto no es verdaderamente una queja, si se reduce a que "tie- ne demasiadas páginas". (Uno se acuerda de las quejas del Emperador de Austria sobre el trabajo de Mozart: "¡Demasiadas páginas!", y no es que me esté intentando comparar con Mozart de nin- guna forma). Además, sólo puedo asumir que semejante queja puede provenir de gente que no tie- ne aún una idea clara de la vasta extensión 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 edición 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 acompaña al libro, en la misma forma de descarga gratuita que la primera edición 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 capítulo original, "Proyectos", ya no está aquí; dos de los proyectos se han integrado en los otros capítulos, y el resto ya no son adecuados. También el capítulo de "Patrones de diseño" se volvió demasiado extenso y ha sido trasladado a un libro que versa sobre ellos (descargable también en el sitio web). Por tanto, el libro debería ser más 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 estándar para casi todo lo que se desee hacer (y no me sorprendería 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. 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 solución 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 programación en el lado cliente. Además, está todo el problema decrear de forma sencilla aplicaciones que interactúen de forma sencilla con bases de datos, transac-ciones, seguridad y semejante, cubiertos gracias a los Enterprise Java Beans (EJB). Estos temas es-tán desarrollados en el capítulo que antes se llamaba "Programación de red" y ahora "Computacióndistribuida", un tema que se está convirtiendo en esencial para todo el mundo. También se verá quese ha compilado este capítulo para incluir un repaso de Jini (pronunciado "yeni", y que no es unacrónimo, sino sólo un nombre), que es una tecnología 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 (también está incluido en el nuevo CD ROM de esta edición, que se ad-junta al mismo; hablaré más de él un poco más adelante).Aparte de nuevas características del lenguaje añadidas a Java 2, y varias correcciones hechas a lolargo de todo el libro, el otro cambio principal está en el capítulo de colecciones que ahora se cen-tra en las colecciones de Java 2, que se usan a lo largo de todo el libro. También he mejorado esecapítulo para que entre más en profundidad en algunos aspectos importantes de las colecciones, enparticular, en cómo funcionan las funciones de hashing (de forma que se puede saber cómo crearuna adecuadamente). Ha habido otros movimientos y cambios, incluida la reescritura del Capítulo1, y la eliminación de algunos apéndices y de otros materiales que ya no consideraba necesariospara el libro impreso, que son un montón de ellos. En general, he intentado recorrer todo, eliminarde la 2." edición lo que ya no es necesario (pero que sigue existiendo en la primera edición electró-nica), incluir cambios y mejorar todo lo que he podido. A medida que el lenguaje continúa cam-biando -aunque no a un ritmo tan frenético como antiguamente- no cabe duda de que habrá másediciones de este libro.Para aquellos de vosotros que siguen sin poder soportar el tamaño del libro, pido perdón. Lo creáiso 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. Además, el libro está disponible electró-nicamente (en idioma inglés desde el sitio web, y desde el CD ROM que acompaña 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 tamaños menores, ya existen de hecho versiones del libro paraPalm Pilot. (Alguien me dijo en una ocasión que leería el libro en la cama en su Palm, con la luz en-cendida a la espalda para no molestar a su mujer. Sólo espero que le ayude a entrar en el mundo delos sueños.) Si se necesita en papel, sé de gente que lo va imprimiendo capítulo a capítulo 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 números de ver-sión se corresponden aún con los "unos", la forma estándar de referenciar a las versiones posterio-
  22. 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 tenía muchas pegas de las que ya me quejé en la primera edición de este libro- y esta nueva versión más moderna y mejorada del lenguaje, que tiene menos pegas y más adicionesy buenos diseños.Este libro está escrito para Java 2. Tengo la gran ventaja de librarme de todo el material y escribirsólo para el nuevo lenguaje ya mejorado porque la información vieja sigue existiendo en la l."versiónelectrónica 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). También, 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 ningún criterio financiero o forzando a nadie a hacer una actualización del software.Hay, sin embargo, algo que reseñar. JDK 1.3 tiene algunas mejoras que verdaderamente me gusta-ría usar, pero la versión 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 conjunción con Java, porque esrápido, robusto, seguro, está bien mantenido y es gratuito; una auténtica revolución en la historia dela computación (no creo que se hayan visto todas estas características unidas en una única herra-mienta anteriormente). Y Java ha encontrado un nicho muy importante en la programación en ellado servidor en forma de Serulets, una tecnología que es una grandísima mejora sobre la progra-mación tradicional basada en CGI (todo ello cubierto en el capítulo "Computación Distribuida").Por tanto, aunque me gustaría usar sólo las nuevas características, es crítico que todo se compilebajo Linux, y por tanto, cuando se desempaquete el código fuente y se compile bajo ese SO (con elúltimo JDK) se verá que todo compila. Sin embargo, se verá que he puesto notas sobre caracterís-ticas de JDK 1.3 en muchos lugares.El CD ROMOtro bonus con esta edición 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 código 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 código fuente del libro, pero también contiene el libro en su integridad, en variosformatos electrónicos. Para mí, el preferido es el formato HTML porque es rápido 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 más 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 edición 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 saltaréC e iré directamente a C++/Java." Tras llegar al seminario, todo el mundo va comprendiendo que el
  23. 23. xxvi Piensa 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 preparación adecuada.El CD también 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 introducción más gentil, y asume incluso un trasfondo de C me-nor que el que supone el libro. Espero que al introducir el CD será más la gente que se acerque ala programación en Java.
  24. 24. Prólogo a la ediciónen espanoiJava se convierte día a día en un lenguaje de programación universal; es decir, ya no sólo sirve comolenguaje para programar en entornos de Internet, sino que se está utilizando cada vez más como he-rramienta de programación orientada a objetos y también como herramienta para cursos específi-cos de programación o de estructuras de datos, aprovechando sus características de lenguaje "mul-tiparadigma". Por estas razones, los libros que afronten temarios completos y amplios sobre lostemas anteriores siempre serán bienvenidos. Si, además de reunir estos requisitos, el autor es unode los más 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 teóricos y prácticos del lenguaje Java, tratando deexplicar con claridad y rigor no sólo lo que hace el lenguaje sino también el porqué. Eckel introducelos fundamentos de objetos y cómo los utiliza Java. Éste es el caso del estudio que hace de la ocul-tación de las implementaciones, reutilización de clases y polimorfismo. Además, estudia en profun-didad propiedades y características tan importantes como AWT, programación concurrente (mul-tihilo, multithreading2), programación en red, e incluso diseño 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 máximo partido al libro si se conoce otro lenguaje de programación, o al menos téc-nicas de programación (como haber seguido un curso de Fundamentos de Programación, Metodo-logía de la Programación, Algoritmos, o cursos similares) y ya se puede apostar por un alto y eficienterendimiento si la migración a Java se hace desde un lenguaje orientado a objetos, como C++.El libro como formación integral de programadorUna de las fortalezas más 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 prácticamente ha tocado casi todas las técnicas existentes y utilizadas hoy díaen el mundo de la programación y de la ingeniería del software. Algunos de los temas más sobre-salientes analizados en el libro son: fundamentos de diseño orientado a objetos, implementación deherencia y polimorfismo, manejo de excepciones, multihilo y persistencia, Java en Internet, reco-lección de basura, paquetes Java, diseño por reutilización: composición, herencia, interfaces y cla-ses internas, arrays y contenedores de clases, clases de E/S Java, programación de redes con soc-kets, JDBC para bases de datos, JSPs (JavaServer Pages), RMI, CORBA, EJBs (EnterpriseJauaBeans) y Jini, JNI (Java Native Interface).
  25. 25. xxviii Piensa en JavaEl excelente y extenso contenido hacen al libro idóneo para la preparación de cursos de nivel medioy avanzado de programación, 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 básica o complementaria para preparar los exámenes de certificación Java que la casa SunMicrosystems otorga tras la superación de las correspondientes pruebas. Esta característica es unvalor añadido muy importante, al facilitar considerablemente al lector interesado las directrices téc-nicas necesarias para la preparación de la citada certificación.Recursos gratuitos en líneaSi las características 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 añadido difícil de medir,por no decir inmedible y valiosísimo. La generosidad del autor -y, naturalmente, de Pearson-, queofrece a cualquier lector, sin necesidad de compra previa, todo el contenido en línea, 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 prácticamente "todoel mundo mundial", que dirían algunos periodistas).De igual forma es de agradecer el CD kOM que acompaña 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 versión original en inglés y un gran número 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 revisión técnica ha rea-lizado el Apéndice E: Correspondencias español-inglés de clases, bases de datos, tablas y campos del CDROM que acompaña al libro, a fin de identificar el nombre asignado en la traducción al español, conel nombre original en inglés de dichas clases.Unas palabras todavía más elogiosasPara las personas que, como el autor de este prólogo, llevamos muchos años (ya décadas) dedicán-donos a programar computadores, enseñar a programar y escribir sobre programación, un librocomo éste sólo nos trae elevados y elogiosos pensamientos. Consideramos que es un libro ma