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.086 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.086
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 qu