e to
e n s
elic
a b l
fer
a n s
t r
on- Java SE 7
Programacin
s an
) ha uide
c o m t IG
a i l d e n
Volumen Gua del alumno
@ gm s Stu
r a vi e thi
m a u s
i ( e
v
Mara
w i n
Ed
D67238CS20
Edicin 2.0
Noviembre de 2011
D81763
Authors Copyright 2011, Oracle y/o sus filiales. Todos los derechos reservados.
an
Alan Bateman license agreement and/or the applicable U.S. Government contract.
David Holmes s
ha uide
Disposicin de marca comercial registrada
)
m tG
Editors
o
Oracle y Java son marcas comerciales registradas de Oracle y/o sus filiales. Todos
c n
il e
los dems nombres pueden ser marcas comerciales de sus respectivos propietarios.
a d
gm s Stu
Richard Wallis
Daniel Milne @
vi e thi
a r
Vijayalakshmi Narasimhana s
e m u
i(
GraphicvDesigner
a
M arHans
James
w in
Ed Publishers
Syed Imtiaz Ali
Sumesh Koshy
Contenido
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
1 Introduccin
Metas del curso 1-2
Metas del curso 1-3
Asistentes 1-5
Requisitos 1-6
Presentaciones a la clase 1-7
e to
Entorno del curso 1-8
e n s
Los programas Java son independientes de la plataforma 1-9
elic
Grupos de productos de tecnologa Java 1-10 a b l
fer
Versiones de la plataforma Java SE 1-11
a n s
Descarga e instalacin del JDK 1-12
n - tr
o
Java en entornos de servidor 1-13
s an
Comunidad Java 1-14
) ha uide
Java Community Process (JCP) 1-15
c o m tG
OpenJDK 1-16
a il d e n
gm s Stu
Soporte de Oracle Java SE 1-17
@
r a vi e thi
Recursos adicionales 1-18
a
Resumen 1-19
m u s
( e
r a vi Java y revisin de clases
2
Ma Sintaxis
w i n Objetivos 2-2
Ed Revisin del lenguaje Java 2-3
Estructura de la clase 2-4
Clase simple 2-5
Bloques de cdigo 2-6
Tipos de datos primitivos 2-7
Literales numricas de Java SE 7 2-9
Literales binarios de Java SE 7 2-10
Operadores 2-11
Cadenas 2-12
Operaciones de cadenas 2-13
if else 2-14
Operadores lgicos 2-15
Matrices y bucle for-each 2-16
Bucle for 2-17
iii
Bucle while 2-18
Sentencia switch de cadena 2-19
Convenciones de nomenclatura Java 2-20
Una clase Java simple: Employee 2-21
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
@ gm s Stu
3 Encapsulacin y v
r a i
creacin
e t
dehisubclases
Objetivos m a
3-2 u s
i( e
Encapsulacin 3-3
a v
M arEncapsulacin: ejemplo 3-4
win Encapsulacin: datos privados, mtodos pblicos 3-5
Ed Modificadores de acceso pblicos y privados 3-6
Revisin de la clase Employee 3-7
Asignacin de nombres de mtodos: recomendaciones 3-8
Clase Employee refinada 3-9
Haga que las clases sean lo ms inmutables posibles 3-10
Creacin de subclases 3-11
Subclases 3-12
Subclase Manager 3-13
Los constructores no se heredan 3-14
Uso de super 3-15
Creacin de un objeto Manager 3-16
Qu es el polimorfismo? 3-17
Sobrecarga de mtodos 3-18
Mtodos con argumentos variables 3-19
iv
Herencia nica 3-21
Resumen 3-22
Prueba 3-23
Visin general de la prctica 3-1: Creacin de subclases 3-27
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
(Opcional) Visin general de la prctica 3-2: Adicin de una clase Staff a una clase
Manager 3-28
v
Palabra clave static 5-10
Mtodos estticos 5-11
Implantacin de mtodos estticos 5-12
Llamada a mtodos estticos 5-13
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
w i n Resumen 5-35
vi
Uso de tipos de referencia genricos 6-11
Implantacin y ampliacin 6-12
Ampliacin de interfaces 6-13
Interfaces en jerarquas de herencia 6-14
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
Prueba 6-15
Diseo de patrones e interfaces 6-16
Patrn DAO 6-17
Antes del patrn DAO 6-18
Despus del patrn DAO 6-19
La necesidad del patrn de fbrica 6-20
Uso del patrn de fbrica 6-21
e to
Fbrica 6-22
e n s
Combinacin de DAO y fbrica 6-23
el ic
Prueba 6-24
a b l
Reutilizacin del cdigo 6-25 fe r
a n s
Dificultades en el diseo 6-26
n - tr
Composicin 6-27 o
Implantacin de la composicin 6-28 s an
Polimorfismo y composicin 6-29 ) ha uide
c o m tG
Prueba 6-31
a il d e n
Resumen 6-32
@ gm s Stu
r a vi e thi
Visin general de la prctica 6-1: Implantacin de una interfaz 6-33
m a
Visin general de la prctica 6-2: Aplicacin del patrn DAO 6-34
u s
( e
(Opcional) Visin general de la prctica 6-3: Implantacin de la composicin 6-35
i
v
ara
M7 Genricos y recopilaciones
w i n
Ed Objetivos 7-2
Genricos 7-3
Clase de cach simple sin genricos 7-4
Clase de cach genrica 7-5
Funcionamiento de los genricos 7-6
Genricos con diamante de inferencia de tipo 7-7
Prueba 7-8
Recopilaciones 7-9
Tipos de recopilaciones 7-10
Interfaz List 7-11
Clase de implantacin ArrayList 7-12
ArrayList sin genricos 7-13
ArrayList genrica 7-14
ArrayList genrica: Iteracin y empaquetado 7-15
vii
Empaquetado automtico y desempaquetado 7-16
Prueba 7-17
Interfaz Set 7-18
Interfaz Set: ejemplo 7-19
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
viii
Scanner 8-17
Expresiones regulares 8-18
Pattern y Matcher 8-19
Clases de caracteres 8-20
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
w i n Objetivos 9-2
Ed Manejo de errores 9-3
Manejo de excepciones en Java 9-4
La sentencia try-catch 9-5
Objetos Exception 9-6
Categoras de excepciones 9-7
Prueba 9-8
Manejo de excepciones 9-10
La clusula finally 9-11
La sentencia try-with-resources 9-12
Excepciones suprimidas 9-13
La interfaz de AutoCloseable 9-14
Captura de varias excepciones 9-15
Declaracin de excepciones 9-16
Manejo de excepciones declaradas 9-17
ix
Devolucin de excepciones 9-18
Excepciones personalizadas 9-19
Prueba 9-20
Excepciones de envoltorio 9-21
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
x
Campos y objetos transitorios 10-25
Transient: ejemplo 10-26
UID de versin de serializacin 10-27
Ejemplo de serializacin 10-28
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
xi
Mtodos de E/S en buffer para archivos de texto 11-32
Flujos de bytes 11-33
Gestin de metadatos 11-34
Atributos de archivo (DOS) 11-35
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
m a
supresin recursiva 11-59
u s
i ( e
v
Mara
12 Threads
Objetivos 12-2
w i n
Ed Programacin de tareas 12-3
Importancia de los threads 12-4
Clase Thread 12-5
Ampliacin de Thread 12-6
Inicio de Thread 12-7
Implantacin de Runnable 12-8
Ejecucin de instancias Runnable 12-9
Runnable con datos compartidos 12-10
Un ejecutable: varios threads 12-11
Prueba 12-12
Problemas con datos compartidos 12-13
Datos no compartidos 12-14
Prueba 12-15
Operaciones atmicas 12-16
xii
Ejecucin desordenada 12-17
Prueba 12-18
Palabra clave volatile 12-19
Parada de un thread 12-20
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
a il d e n
13 Simultaneidad
@ gm s Stu
Objetivos 13-2 vi
r a e t hi
m a u s
Paquete java.util.concurrent 13-3
( e
r a vi java.util.concurrent.atomic 13-4
Paquete
xiii
Cliente de red multithread (parte 2) 13-20
Cliente de red multithread (parte 3) 13-21
Cliente de red multithread (parte 4) 13-22
Cliente de red multithread (parte 5) 13-23
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
Paralelismo 13-24
Sin paralelismo 13-25
Paralelismo Naive 13-26
La necesidad de un marco Fork-Join 13-27
Extraccin de trabajo 13-28
Ejemplo de thread nico 13-29
java.util.concurrent.ForkJoinTask<V> 13-30
e to
Ejemplo de RecursiveTask 13-31
e n s
Estructura de compute 13-32
elic
Ejemplo de compute (por debajo del umbral) 13-33 a b l
fer
Ejemplo de compute (por encima del umbral) 13-34
a n s
Ejemplo de ForkJoinPool 13-35
n - tr
o
Recomendaciones del marco Fork-Join 13-36
s an
Prueba 13-37
) ha uide
Resumen 13-38
c o m tG
a il d e n
(Opcional) Visin general de la prctica 13-1: Uso del paquete
gm s Stu
java.util.concurrent 13-39
@
r a vi e thi
(Opcional) Visin general de la prctica 13-2: Uso del marco Fork-Join 13-40
m a u s
i ( e
14 Creacin de aplicaciones de base de datos con JDBC
v
Mara
Objetivos 14-2
xiv
Obtencin de recuento de filas 14-17
Control del tamao de recuperacin de ResultSet 14-18
Uso de PreparedStatement 14-19
Uso de CallableStatement 14-20
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
xv
Prueba 15-20
Resumen 15-21
Visin general de la prctica 15-1: Creacin de una aplicacin de fecha
localizada 15-22
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
xvi
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
Introduccin
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Metas del curso
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
siguiente:
Crear aplicaciones con tecnologa Java en las que se usen
las funciones orientadas a objetos del lenguaje Java,
como la encapsulacin, la herencia y el polimorfismo
Ejecutar una aplicacin Java desde la lnea de comandos
Crear aplicaciones que usen el marco Collections to
Implantar tcnicas de manejo de errores mediante el n s e
manejo de excepciones e l ice
l
Implantar la funcionalidad de entrada/salida (E/S)fede rab
lectura y escritura de datos y archivos de texto
t r a ns
y comprender los flujos de o n -
n
E/S avanzados sa ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
(continuacin)
Manipular archivos, directorios y sistemas de archivos
mediante la especificacin JDK7 NIO.2
Realizar varias operaciones en tablas de bases de datos,
incluida la creacin, la lectura, la actualizacin y la
supresin mediante la API JDBC
e to
n s
Procesar cadenas mediante una serie de expresiones
e l ice
regulares
r a bl
Crear aplicaciones multithread de alto rendimiento n s fe que
eviten los interbloqueos n - tra
Localizar aplicaciones Java a no
s h a d e
m ) Gu i
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
m ar use
v i (e
Mara
w i n
Ed
Presntese brevemente:
Nombre
Cargo o puesto
Compaa
Experiencia con programacin Java y aplicaciones Java
Motivos para asistir e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
PC del aula
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Programas independientes de la plataforma
Maplicaciones de tecnologa Java se escriben en el lenguaje de programacin Java y se
Las
i n
w compilan en cdigo de byte de Java. El cdigo de byte se ejecuta en la plataforma Java. El
Ed software que le proporciona una plataforma Java que se puede ejecutar se denomina Java
Runtime Environment (JRE). Se usa un compilador, incluido en el Java SE Development Kit
(JDK), para convertir el cdigo fuente Java en cdigo de byte de Java.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Identificacin de grupos de tecnologa Java
M proporciona una lnea completa de productos de tecnologa Java, que va desde kits que
Oracle
i n
w crean programas de tecnologa Java hasta entornos de emulacin (prueba) para dispositivos de
Ed consumo, como telfonos mviles. Como se indica en el grfico, todos los productos de
tecnologa Java comparten la base del lenguaje Java. Las tecnologas Java, como Java Virtual
Machine, se incluyen (de distintas formas) en tres grupos diferentes de productos, cada uno
diseado para cumplir las necesidades de un mercado objetivo concreto. En la figura se ilustran
los tres grupos de productos de tecnologa Java y sus tipos de dispositivo objetivo. Entre otras
tecnologas Java, cada edicin incluye un Software Development kit (SDK) que permite a los
programadores crear, compilar y ejecutar programas de tecnologa Java en una plataforma
concreta:
Java Platform, Standard Edition (Java SE): desarrolla applets y aplicaciones que se
ejecutan en exploradores web y en computadoras de escritorio, respectivamente. Por
ejemplo, puede utilizar Java SE Software Development Kit (SDK) para crear un programa de
procesador de texto para una computadora personal. Tambin puede usar Java SE para
crear una aplicacin que se ejecute en un explorador.
Nota: los applets y las aplicaciones se diferencian en varios aspectos. Principalmente, los applets
se inician en un explorador web, mientras que las aplicaciones se inician en un sistema operativo.
Versin del
Ao Plataforma
desarrollador (JDK)
1996 1.0 1
1997 1.1 1
1998 1.2 2
2000 1.3 2
e to
2002 1.4 2 e n s
2004 elic
1.5 5
a b l
2006 1.6 6 fer
a n s
2011 1.7
o n -tr
7
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
SiM
ara
Cmo detectar la versin
tiene Java SE instalado en el sistema, puede detectar el nmero de versin ejecutando
i n
w java -version. Tenga en cuenta que el comando java se ha incluido con Java Runtime
Ed Environment (JRE). Como desarrollador, tambin necesita un compilador Java, normalmente
javac. El comando javac est incluido en Java SE Development Kit (JDK). Es posible que haya
que actualizar la variable PATH del sistema operativo para que incluya la ubicacin de javac.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
1.
M
2.
ara
Vaya a http://www.oracle.com/technetwork/java/javase/downloads/index.html.
Seleccione el enlace Java Platform, Standard Edition (Java SE).
w i n
Ed 3.
4.
Descargue la versin correspondiente a su sistema operativo.
Siga las instrucciones de instalacin.
5. Defina su valor de PATH.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
Basada en software Apache ) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
AM
ara
Qu es la comunidad Java?
un alto nivel, la comunidad Java es el trmino que se usa para referirse al gran nmero de
i n
w personas y organizaciones que desarrollan, innovan y usan la tecnologa Java. En esta
Ed comunidad se incluyen desarrolladores como personas, organizaciones, empresas y proyectos de
cdigo abierto.
En la comunidad Java es muy habitual que descargue y use bibliotecas Java de fuentes que no
sean de Oracle. Por ejemplo, en este curso, utilizar una biblioteca JDBC desarrollada por
Apache para acceder a una base de datos relacional.
Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
siguiente:
Crear clases Java simples
Crear variables primitivas
Manipular cadenas
Usar las sentencias de bifurcacin if-else y switch
e to
Iterar con bucles
e n s
Crear matrices
elic
Usar campos, constructores y mtodos Java a b l
s f er
Usar las sentencias package e import ran
o n -t
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
package <package_name>;
import <other_packages>;
i n M
mostrado, las palabras clave Java aparecen resaltadas en negrita.
w La palabra clave package define si esta clase est relacionada con otras clases y se
Ed proporciona un nivel de control de acceso. Se usan modificadores de acceso (como public
y private) ms adelante en esta leccin.
La palabra clave import define otras clases o grupos de clases que est usando en la
clase. La sentencia import permite restringir lo que el compilador tiene que buscar a la
hora de resolver los nombres de clases usados en esta clase.
La palabra clave class precede al nombre de esta clase. El nombre de la clase y el nombre
de archivo deben coincidir cuando se declare la clase public (lo que es una buena
prctica). Sin embargo, la palabra clave public situada delante de la palabra clave class
es un modificador y no es necesaria.
Las variables, o los datos asociados a los programas (como enteros, cadenas, matrices y
referencias a otros objetos), se denominan campos de instancia (en ocasiones abreviado
como campos).
Los constructores son funciones que se llaman durante la creacin (instanciacin) de un
objeto (representacin en la memoria de una clase Java).
Los mtodos son las funciones que se pueden realizar en un objeto. Tambin se conocen
como mtodos de instancia.
i n M
diapositiva. Al mtodo main se le llama automticamente cuando se llama a la clase desde la
w lnea de comandos.
Ed Los argumentos de la lnea de comandos se transfieren al programa mediante la matriz args[].
Nota: se llama a un mtodo que se modifica con la palabra clave static sin una referencia a un
objeto concreto. En su lugar, se usa el nombre de clase. A estos mtodos se les conoce como
mtodos de clase. El mtodo main es un mtodo especial al que se llama cuando se ejecuta esta
clase con Java Runtime.
Booleano
El tipo boolean puede ser true o false.
Nota: true y false pueden parecer palabras clave, pero son tcnicamente literales booleanos.
e to
// A 16-bit 'short' value:
e n s
short aShort = (short)0b1010_0001_0100_0101;
elic
a b l
fe r
// Some 32-bit 'int' values:
a n s
int anInt1 = 0b1010_0001_0100_0101_1010_0001_0100_0101;
o n -tr
int anInt2 = 0b101;
s an
) ha uide
int anInt3 = 0B101; // The B can be upper or lower case.
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Los literales binarios son valores int de Java. Los valores byte y short de Java se deben
i n M
convertir para evitar una advertencia de prdida de precisin del compilador.
w
Ed
2
3 public static void main(String args[]){
4
5 char letter = 'a';
6 Los literales de cadena se
7 String string1 = "Hello"; crean automticamente
como objetos String.
8 String string2 = "World";
e to
9 String string3 = "";
e n s
10 String dontDoThis = new String ("Bad Practice");
elic
11 a b l
fe r
12 string3 = string1 + string2; // Concatenate strings
a n s
13
o n -tr
an
14 System.out.println("Output: " + string3 + " " + letter);
15 s
ha uide
16 }
m tG )
c o n
17 }
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
El cdigo de la diapositiva muestra cmo se representan los caracteres de texto en Java. Los
caracteres sencillos se pueden representar con el tipo char. Sin embargo, Java tambin incluye
w i n
un tipo String para representar varios caracteres. Las cadenas se pueden definir como se
Ed muestra en la diapositiva y combinarse con el signo + como operador de concatenacin.
La salida del cdigo en la diapositiva es:
Output: HelloWorld a
Atencin: las cadenas se deben inicializar siempre con el operador de asignacin "=" y texto
entre comillas, como se muestra en los ejemplos. No se recomienda usar new para inicializar un
objeto String. El motivo es que "Bad Practice", que aparece en la lnea 10, es un literal
String del tipo String. El uso de la palabra clave new simplemente sirve para crear otra
instancia idntica desde el punto de vista funcional al literal. Si esta sentencia apareciera dentro
de un bucle al que se llamara frecuentemente, se crearan muchas instancias de String
innecesarias.
2
3 public static void main(String args[]){
4 long a = 1;
5 long b = 2;
6
7 if (a == b){
e to
8 System.out.println("True");
e n s
9 } else {
le lic
a b
10 System.out.println("False");
s f er
11 }
- t r an
12
n on
13 }
s a
14 } a
) h uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En el ejemplo de la diapositiva se muestra la sintaxis de una sentencia if-else en Java.
3
4 String[] names = new String[3];
5
6 names[0] = "Blue Shirt";
7 names[1] = "Red Shirt"; Las matrices son objetos. Los
8 names[2] = "Black Shirt"; objetos de matriz tienen una
9 longitud de campo final.
10 int[] numbers = {100, 200, 300}; e to
e n s
ic
11
12 for (String name:names){
b l el
13 System.out.println("Name: " + name);
fe r a
14 }
a n s
15
o n -tr
an
16 for (int number:numbers){
17 System.out.println("Number: " + number);
s
ha uide
18 }
m tG )
19 }
c o n
20 }
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Esta clase demuestra cmo definir las matrices en Java. En el primer ejemplo se crea una matriz
String y se inicializa cada uno de los elementos por separado. La segunda matriz int se define
w i n
en una sola sentencia.
Ed Cada matriz se itera con la construccin for-each de Java. El bucle define un elemento que
representar cada elemento de la matriz y la matriz de la que se va realizar bucle. La salida de la
clase se muestra aqu:
Name: Blue Shirt
Name: Red Shirt
Name: Black Shirt
Number: 100
Number: 200
Number: 300
Nota: por defecto, las matrices tambin son objetos. Todas las matrices soportan los mtodos de
la clase Object. Siempre puede obtener el tamao de una matriz mediante su campo length.
2
3 public static void main(String args[]){
4
5 for (int i = 0; i < 9; i++ ){
6 System.out.println("i: " + i);
7 }
e to
8
e n s
9 }
elic
a b l
10 }
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La diapositiva muestra el bucle for clsico. Se inicializa un contador y se incrementa con cada
i n M
paso del bucle. Cuando se cumple la sentencia de la condicin, el bucle sale. A continuacin se
w muestra la salida de ejemplo de este programa.
Ed i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
2
3 public static void main(String args[]){
4
5 int i = 0;
6 int[] numbers = {100, 200, 300};
7
e to
8 while (i < numbers.length ){
n s
9 System.out.println("Number: " + numbers[i]);
e l ice
10 i++; r a bl
11 } n s fe
12 } n - tra
o
13 } an s de
h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
El bucle while realiza una prueba y contina si la expresin se evala en true. El bucle while,
i n M
que se muestra aqu, se itera en una matriz mediante un contador. En esta diapositiva se muestra
w la salida del cdigo:
Ed Number: 100
Number: 200
Number: 300
Nota: tambin existe un bucle do-while, donde se ha ejecutado la prueba despus de la
expresin al menos una vez:
class DoWhileDemo {
public static void main(String[] args){
int count = 1;
do {
System.out.println("Count is: " + count);
count++;
} while (count <= 11);
}
}
i n M
7 de Java, solo se podan usar enumeraciones y los tipos de datos primitivos byte, short, char
e int en una sentencia switch. Las enumeraciones aparecen en la leccin titulada Diseo de
w
Ed clases avanzadas.
1 package com.example.domain;
2 public class Employee { declaracin de clase
3 public int empId;
4 public String name;
campos
5 public String ssn;
6 public double salary;
e to
7
e n s
8 public Employee () { un constructor
le lic
a b
9 }
s f er
10
- t r an
11 public int getEmpId () {
n on
un mtodo
12 return empId; s a
13 } ) a
h uide
c o m tG
14 } il en
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
e ma use
a v i(
La clase Java se suele usar para almacenar o representar datos para la construccin que
a r
i n M
representa la clase. Por ejemplo, podra crear un modelo (una representacin programtica) de
un objeto Employee. Un objeto Employee definido mediante este modelo contendr valores para
w
Ed empId, name, nmero de la Seguridad Social (ssn) y salary.
El mtodo de constructor de esta clase crea una instancia de un objeto denominado Employee.
Un mtodo constructor es exclusivo de Java, ya que el tipo de retorno del mtodo es una
instancia de la clase, por lo que los constructores siempre tienen el mismo nombre que la clase y
no declaran un tipo de retorno. Puede declarar ms de un constructor, como ver en la leccin
titulada Diseo de clases Java.
1 package com.example.domain;
2 public class Employee {
3 public int empId;
e to
4 // other fields...
e n s
5 public void setEmpId(int empId) {
elic
6 this.empId = empId;
a b l
7 }
A menudo un par de mtodos
fe r
para definir y obtener el valor
a n s
8
9
public int getEmpId() {
return empId;
del campo actual.
o n -tr
10 }
s an
11 // getter/setter methods for other fields... ) ha uide
c o m tG
12 }
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Adicin de mtodos a la clase Employee
M prctica comn es crear un juego de mtodos que manipulen datos de campo: mtodos que
Una
i n
w definen el valor de cada uno de los campos y mtodos que obtienen el valor de cada campo. A
Ed estos mtodos se les denomina mtodos de acceso (getter) y mutadores (setter).
La convencin consiste en usar set y get ms el nombre del campo con la primera letra del
nombre de campo en maysculas (CamelCase en minsculas). La mayora de los entornos de
desarrollo integrados (IDE) modernos proporcionan un mtodo sencillo para generar
automticamente los mtodos de acceso (getter) y mutadores (setter).
Observe que los mtodos set usan la palabra clave this. La palabra clave this permite al
compilador distinguir entre el nombre de campo de la clase (this) y el nombre del parmetro que
se est transfiriendo como argumento. Sin la palabra clave this, el compilador detectara:
"Assignment to self".
En este sencillo ejemplo, podra usar el mtodo setName para cambiar el nombre de empleado y
el mtodo setSalary para cambiar el valor salary del empleado.
int x = 3;
int y = x;
e to
El valor de x se copia y transfiere a y: e n s
el ic
a b l
3 3
fe r
a n s
x y
o n -tr
copia el valor de s x a
n
Si se modifica x (por ejemplo, x) h= 5;),uino
a dese cambia el valor
de y. c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
( e
iJava
a
El lenguaje
r v usa la transferencia por valor para todas las operaciones de asignacin. Esto
a
in M
significa que se evala el argumento de la derecha del signo igual y que el valor del argumento se
w asigna a la izquierda del signo igual.
Ed En el caso de primitivos Java, esto es muy sencillo. Java no transfiere una referencia a un
primitivo (como un entero), sino una copia del valor.
windirectorio D:\test\com\example:
Ed package com.example;
public class HelloWorld {
public static void main (String [] args) {
if (args.length < 1) {
System.out.println("Hello World!");
} else {
System.out.println("Hello " + args[0] + "!");
}
}
}
package com.oracle.test;
public class BrokenClass {
public boolean valid = "false";
public String s = new String ("A new string");
public int i = 40_000.00;
public BrokenClass() { }
}
e to
a. Falta una sentencia import. e n s
lic
b. A boolean valid se le ha asignado un objeto String. ble
f e ra
c. String s se ha creado mediante new.
t r a ns
d. Al mtodo BrokenClass le falta una sentencia
o n - return.
e.
n objeto
Se necesita un mtodo para crearsunanuevo
h a d e
BrokenClass.
m ) Gu i
o
f. Al valor entero i se leilha ent un double.
c asignado
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
e ma use
a v i(
a r
i n M
w
Ed
Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
e to
e n s
elic
a b l
ID de empleado fe r
n s
Cambio de nombre
a
Nombre
o n -tr
Subida de salario
Nmero de la Seguridad Social
s an
Salario
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Modelo simple
M que se le ha pedido que cree un modelo de un empleado tpico. Qu datos deseara
Suponga
i n
w representar en un objeto que describiera a un empleado?
Ed ID de empleado: puede utilizarlo como identificador nico del empleado.
Nombre: humanizar a los empleados siempre es una buena idea.
Nmero de la Seguridad Social: solo para empleados de EE. UU. Tal vez desee incluir
algn otro tipo de identificacin para empleados que no sean de EE. UU.
Salario: siempre es bueno registrar cunto gana el empleado.
Qu operaciones podra permitir en el objeto de empleado?
Cambio de nombre: si el empleado se casa o se divorcia, se podra producir un cambio de
nombre.
Subida de salario: aumenta segn los mritos.
Tras crear un objeto de empleado, es probable que no desee permitir cambios en los campos de
ID de empleado o nmero de la Seguridad Social. Por tanto, necesitar un medio para crear un
objeto de empleado sin modificaciones, excepto por los mtodos permitidos.
i n M
que hace que sean invisibles fuera de los mtodos de la propia clase.
w
Ed
package come.example.model;
public class Employee {
e to
private int empId; Paso 1 de la encapsulacin:
e n s
private String name; ocultar los datos (campos).
elic
private String ssn;
a b l
fe r
private double salary;
a n s
//... constructor and methods
o n -tr
an
}
s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
m ar use
v i (e
AlM
ara
Seleccin de mtodos bienintencionados
igual que los campos deben definir de forma clara el tipo de datos que almacenan, los mtodos
i n
w deben identificar claramente las operaciones que realizan. Una de las formas ms sencillas de
Ed mejorar la lectura del cdigo (cdigo Java o de cualquier otro tipo) es escribir nombres de
mtodos que identifiquen claramente su funcin.
1 package com.example.domain;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
1 package com.example.domain;
2 public class Manager {
e to
3 private int empId; e n s
un momen
to... r.... elic
4 private String name;
r esu lt a muy familia b l
o
este cdig r a
5 private String ssn;
n s fe
6 private double salary;
-tr a
7 private String deptName;
o n
8 public Manager () { }
s an
9 // access and mutator methods...
) ha uide
10 }
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Especializacin con las subclases Java
Mclase Manager mostrada aqu se parece mucho a la clase Employee, pero con cierta
La
i n
w especializacin. Un objeto Manager tambin incluye un departamento, con su correspondiente
Ed nombre. Como resultado, tambin puede que haya ms operaciones.
Lo que esto demuestra es que un objeto Manager es de tipo Employee, pero un objeto
Employee con ms funciones.
Sin embargo, si debiramos definir clases Java de esta forma, habra mucho cdigo redundante.
superclase: Employee
(clase "principal")
e to
e n s
el ic
a b l
esto significa "hereda" fe r
a n s
o n -tr Manager,
subclase:
s a n es un objeto Employee
) ha uide (clase "secundaria")
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Un programa Java simple
M una clase existente tiene subclases, la nueva clase creada se dice que hereda las
Cuando
i n
w caractersticas de la otra clase. A esta nueva clase se la denomina subclase y es una
Ed especializacin de la superclase. Todos los campos y los mtodos no privados de la superclase
forman parte de la subclase.
Por tanto, en este diagrama, una clase Manager obtiene empId, name, SSN, salary y los
dems mtodos pblicos de Employee.
Es importante tener en cuenta que, si bien Manager especializa Employee, un objeto Manager
sigue siendo un objeto Employee.
Nota: el trmino subclase es un poco confuso. La mayora de la gente considera que el prefijo
sub- denota menos. Sin embargo, una subclase Java es la suma de s misma y de su principal.
Al crear una instancia de una subclase, la estructura de memoria resultante contiene todos los
cdigos de la clase principal, la clase principal anterior, y as sucesivamente en sentido
ascendente en la jerarqua de clases hasta que alcanza la clase Object.
1 package com.example.domain;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
i n M
palabra clave super.
w Nota: la llamada super del constructor del principal debe aparecer primero en el constructor.
Ed La palabra clave super tambin se puede usar para llamar de forma explcita a los mtodos de
los campos de acceso o de la clase principal.
argumentos variables.
La notacin varargs
considera al parmetro
1 public class Statistics { nums como una matriz.
2 public float average(int... nums) {
3 int sum = 0;
4 for (int x : nums) { // iterate int array nums
e to
5 sum += x;
n s
6 }
e l ice
7 return ((float) sum / nums.length); r a bl
8 } n s fe
a
9 } n-tr n o
Tenga en cuenta que el argumento a
s nums es realmente un
objeto de matriz de tipo int[]. h
) Estoa d e
ipermite al mtodo
o m G u
iterarse y permitir cualquier
a ilc dcantidad e nt de elementos.
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
a vi (
Uso de rargumentos variables
M a
winEl mtodo average mostrado en la diapositiva toma cualquier serie de argumentos enteros. La
notacin (int... nums) convierte la lista de argumentos transferidos al mtodo average en
Ed un objeto de matriz del tipo int.
Nota: los mtodos que usan varargs tampoco pueden tomar parmetros, si bien s se pueden
llamar a average(). En la API de NIO.2, en la leccin titulada E/S de archivos Java, los
varargs aparecern como parmetros opcionales. Para tener esto en cuenta, podra reescribir el
mtodo average en la diapositiva de la siguiente forma:
public float average(int... nums) {
int sum = 0; float result = 0;
if (nums.length > 0) {
for (int x : nums) // iterate int array nums
sum += x;
result = (float) sum / nums.length;
}
return (result);
}
}
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Si bien Java no permite ms de una clase en una subclase, el lenguaje proporciona funciones
que permiten a varias clases implantar las funciones de otras clases. Ver este concepto en la
w i n
leccin sobre herencia.
Ed La herencia nica no impide el refinamiento continuado y la especializacin de las clases
mostrados anteriormente.
En el diagrama que se muestra en la diapositiva, un superior puede tener empleados y un director
tiene un presupuesto y puede aprobar gastos.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
m ar use
v i (e
a r a clave de modificador de acceso de esta tabla son private, protected y public.
Las palabras
1 package demo;
2 public class Foo {
3 protected int result = 20; declaracin que permite
subclases
4 int other = 25;
5 }
1 package test; e to
e n s
2 import demo.Foo;
elic
3 public class Bar extends Foo {
a b l
fe r
4 private int sum = 10;
a n s
5 public void reportSum () {
o n -tr
6 sum += result;
s an
7 sum += other;
) ha uerror i de del compilador
8 }
c o m tG
9 a il d e n
gm s Stu
}
@ hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
a r a
Copyright
s
( e m u
v i
ara
En este ejemplo, hay dos clases en dos paquetes. La clase Foo est en el paquete demo y
i n M
declara un campo de datos denominado result con un modificador de acceso protected.
w En la clase Bar, que ampla Foo, hay un mtodo, reportSum, que agrega el valor de result a
Ed sum. A continuacin, el mtodo intenta agregar el valor de other a sum. El campo other se
declara mediante el modificador por defecto y esto genera un error de compilador. Por qu?
Respuesta: el campo result, declarado como campo protected, est disponible para todas
las subclases, incluso aunque estn en otro paquete. El campo other se declara como que usa
el acceso por defecto y solo est disponible para clases y subclases declaradas en el mismo
paquete.
Este ejemplo se ha extrado del proyecto JavaAccessExample.
1 package demo;
2 public class Foo2 {
3 protected int result = 20;
4 }
1 package test;
e to
2 import demo.Foo2;
e n s
3 public class Bar2 extends Foo2 {
elic
4 private int sum = 10;
a b l
fe
El campo result
r
5 private int result = 30;
a n s
es una sombra del
6 public void reportSum () {
o n -tr
campo principal.
7 sum += result;
s an
8 }
) ha uide
9 }
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En este ejemplo, la clase Foo2 declara el campo result. Sin embargo, la clase Bar2 declara su
i n M
propio campo result. La consecuencia es que el campo result de la clase Foo2 tiene una
sombra en el campo result de la clase Bar2. Qu es sum en este ejemplo? sum ahora es 40
w
Ed (10 + 30). Los IDE modernos (como NetBeans) detectan las sombras y generan una advertencia.
De los mtodos con el mismo nombre no se crea una sombra, sino que se sustituyen. El proceso
de sustitucin se explica ms adelante en esta misma leccin.
ejecucin.
1 public class EmployeeStockPlan {
2 public int grantStock (Employee e) {
3 // perform a calculation based on Employee data
4 if (e instanceof Manager) {
5 // process Manager stock grant
e to
6 } else if (e instanceof Engineer) {
e n s
7 // process Engineer stock grant
elic
a b l
8 } else if (e instanceof Admin) {
fe r
9 // process Admin stock grant
a n s
10 } else {
o n -tr
11 // perhaps an error a generic Employee?
s an
12 }
) ha uide
13 }
c o m tG
14}
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En este elemento EmployeeStockPlan modificado, el mtodo grantStock utiliza
i n M
instanceof para determinar el tipo de Employee transferido al mtodo.
w Otra perspectiva para este problema es usar la nueva funcin en JDK 7 para activar las cadenas:
Ed String type = emp.getClass().getSimpleName();
switch (type) {
case "Engineer":
// process Engineer grant
case "Admin":
// process Admin grant
case "Manager":
// process Manager grant
case "Director":
// process Director grant
default:
// error result
}
e to
Employee e = m; // OK e n s
elic
a b l
fe r
a n s
Employee e = d; // OK
Manager m = d; // OK o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
Manager m = (Manager)e;
e n s
// Would also work if
elic
// e was a Director obj
a b l
fe r
a n s
Director d = (Director)m; n -tr
Engineer eng = (Engineer)m;
o
// fails at run time
s an
// compiler error
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Conversiones descendentes
M una conversin descendente, el compilador simplemente determina si se puede realizar la
Con
i n
w conversin; si el destino de la conversin descendente es una subclase, puede que la conversin
Ed se pueda realizar correctamente.
Observe que, en tiempo de ejecucin, la conversin produce una excepcin
java.lang.ClassCastException si la referencia del objeto es de una superclase y no del
tipo de clase o una subclase.
La conversin de la variable e a una referencia m de Manager hace que el compilador no falle,
porque Manager y Employee estn en la misma jerarqua de clases, por lo que la conversin
probablemente sea correcta. Esta conversin tambin funciona en tiempo de ejecucin, porque
resulta que la variable e es realmente un objeto Manager. Esta conversin tambin funcionara
en tiempo de ejecucin si e apuntara a una instancia de un objeto Director.
La conversin de la variable m en una instancia Director hace que el compilador no falle, pero
porque m es realmente una instancia de Manager; esta conversin falla en tiempo de ejecucin
con una excepcin ClassCastException.
Por ltimo, cualquier conversin que est fuera de la jerarqua de clases fallar, como la
conversin de una instancia de Manager en una instancia de Engineer. Manager y Engineer
son ambos empleados, pero Manager no es un objeto Engineer.
m ar use
v i (e
Nota: en
a r aocasiones puede que desee imprimir el nombre de la clase que est ejecutando un
i n M
continuacin, prueba para asegurarse de que se trata de una instancia de una clase Employee
w (todas las subclases tambin son empleados, por lo que funciona). A continuacin, el elemento
Ed Object se convierte en Employee y cada uno de los campos de Employee se comprueban
para ver si existe igualdad.
Nota: para los tipos String, debe utilizar el mtodo equals para probar la igualdad de las
cadenas carcter a carcter.
a. Verdadero e to
e n s
b. Falso
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
1 package com.bank;
2 public class Account {
3 double balance;
4 }
10 package com.bank.type;
11 import com.bank.Account;
12 public class Savings extends Account {
13 private double interest;
14 Account acct = new Account();
e to
15 public double getBalance (){ return (interest + balance); }
e n s
16 }
elic
Qu cambio hara que se compilase este cdigo?
a b l
a. Declarar balance como private en la lnean3. fe r
s
a 3.
b. Declarar balance como protected ennla - trlnea
n o
c. a
Sustituir balance por acct.balance
s deen la lnea 15.
h a
d. m) Gui
Sustituir balance por Account.balance
o en la lnea 15.
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
e to
Use siempre el tipo de referencia ms genrico posible. e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Codificacin de la generalizacin
M siempre el tipo de referencia ms genrico posible. Los IDE Java pueden contener
Use
i n
w herramientas de refactorizacin que facilitan el cambio de referencias existentes por un tipo base
Ed ms genrico.
m ar use
v i (e
Mtodos
a rade fbrica
M
inEn lugar de llamar directamente a constructores, a menudo usar mtodos estticos para
w
Ed nuevo objeto siempre que se llama a un constructor. Un mtodo de fbrica esttico podra
recuperar referencias a objetos. A menos que se espere que pase algo inesperado, se crea un
mantener una cach de objetos para reutilizarlos o crear nuevas instancias si se agotara la cach.
Un mtodo de fbrica tambin puede producir un objeto que subclasifique el tipo de retorno del
mtodo.
Ejemplo:
NumberFormat nf = NumberFormat.getInstance();
private int x;
e to
public void instanceMethod() {
e n s
x = 2;
elic
}
a b l
fe r
}
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Limitaciones de mtodos estticos
Mmtodos estticos se pueden usar antes de crear cualquier instancia de su clase
Los
i n
w delimitadora. Desde el punto de vista cronolgico, esto significa que en una Java Virtual Machine
Ed en ejecucin puede que no haya incidencias de las variables de instancias de las clases
contenedoras. Los mtodos estticos no pueden nunca acceder a las variables de instancias de
sus clases delimitadoras ni llamar a sus mtodos no estticos.
double d = Math.random();
StaticUtilityClass.printMessage();
StaticUtilityClass uc = new StaticUtilityClass();
uc.printMessage(); // works but misleading
sameClassMethod();
public StaticCounter() {
Solo una copia en
counter++; la memoria
}
double p = Math.PI;
new StaticCounter();
new StaticCounter();
System.out.println("count: " + StaticCounter.getCount());
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
no se pueden ampliar.
public final class FinalParentClass { }
// compile-time error
public class ChildClass extends FinalParentClass { }
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
public VariableExampleClass() {
field = 100;
}
e to
e n s
public void changeValues(final int param) {
elic
param = 1; // compile-time error
a b l
date.setTime(0); // allowed
fe r
date = new Date(); // compile-time error a n s
final int localVar;
o n -tr
localVar = 42;
s an
localVar = 43; // compile-time error
) ha uide
}
c o m tG
}
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Campos finales
Inicializacin
w i n
Ed Los campos finales (variables de instancia) deben ajustarse a uno de los siguientes supuestos:
Tener asignado un valor al declararse
Tener asignado un valor en cada uno de los constructores
Estticos y finales
Un campo que es tanto esttico como final se considera una constante. Por convencin, los
campos constantes usan identificadores que solo estn formados por letras maysculas y
caracteres de subrayado.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
constructores privados.
public enum PowerState { Llame a un constructor
PowerState para inicializar
OFF("The power is off"), la referencia public
ON("The usage power is high"), static final OFF.
SUSPEND("The power usage is low");
e to
private String description;
El constructor no puede ser e n s
private PowerState(String d) { del tipo public ni
el ic
protected.
a b l
description = d;
fe r
}
a n s
public String getDescription() {
o n -tr
return description;
s an
} ) ha uide
c o m tG
}
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Constructores de enumeracin
M instancia de enumeracin no se puede instanciar con new.
Una
w i n
Ed
Clases locales
e to
Clases annimas e n s
elic
Clases anidadas estticas
a b l
feinterfaz r
Se suelen usar en aplicaciones con elementosns de
grfica de usuario (GUI). n - tra
Pueden limitar el uso de una "clasea no a la clase
helper"
h a s de
delimitadora de nivel superior.
) ui o m tG
il c e n
a d
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Motivos para usar clases anidadas
Msiguiente informacin se ha obtenido de
La
i n
w http://download.oracle.com/javase/tutorial/java/javaOO/nested.html.
Ed Agrupacin lgica de clases
Si una clase resulta til solo para otra clase, resulta lgico embeberla en esa clase y conservar
las dos juntas. Anidar estas "clases helper" hace que su paquete sea ms racionalizado.
Encapsulacin aumentada
Piense en dos clases de nivel superior, A y B, donde B tiene que acceder a miembros de A que,
de otra forma, estaran declarados como private. Al ocultar la clase B en la clase A, los miembros
de la clase A se pueden declarar como privados y B puede acceder a ellos. Adems, B tambin
se puede ocultar al mundo exterior.
Cdigo ms legible y fcil de mantener
La anidacin de clases pequeas en clases de nivel superior acerca el cdigo al lugar donde se
usa.
Una clase annima se usa para definir una clase sin nombre.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
e to
Implantaciones e n s
elic
a b l
fe r
a n s
o n -tr
s an
Television es una) instancia ha uiddeeun
c o m tG
objeto
a il d e n
ElectronicDevice.
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Anteriormente, ha usado instanceof en los tipos de clase. Cualquier tipo que se pueda usar
i n M
como referencia se podr usar como operando para el operador instanceof. En la diapositiva,
Television implanta ElectronicDevice. Por tanto, un elemento Television es una
w
Ed instancia de Television, un elemento ElectronicDevice y un elemento
java.lang.Object.
i n M
para determinar si se puede serializar el estado de un objeto. Al implantar Serializable, no
tendr que proporcionar implantaciones de mtodos. La prueba (como operador instanceof) de
w
Ed la capacidad de serializar un objeto va incorporada en las bibliotecas de E/S estndar. Esta
interfaz se utiliza en la leccin titulada Conceptos fundamentales de E/S en Java.
posible:
EmployeeDAO dao = new EmployeeDAOMemoryImpl();
dao.delete(1);
EmployeeDAOMemoryImpl implanta
EmployeeDAO.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
Ampliaciones
a n Implantaciones
h a s de
m ) Gui
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Herencias de interfaces
Minterfaces se usan para una clase de herencia que se conoce como herencia de interfaces.
Las
i n
w Java permite la herencia de varias interfaces, pero solo la herencia de una clase.
Ed Ampliacin de una clase de implantacin
Si escribe una clase que ampla una clase que implanta una interfaz, la clase creada tambin
implanta la interfaz. Por ejemplo, AmphibiousCar ampla BasicCar. BasicCar implanta Car;
por tanto, AmphibiousCar tambin implanta Car.
Interfaces que amplan interfaces
Una interfaz puede ampliar otra interfaz. Por ejemplo, la interfaz MotorizedBoat puede ampliar
la interfaz Boat. Si la clase AmphibiousCar implanta MotorizedBoat, debe implantar todos
los mtodos de Boat y MotorizedBoat.
Mtodos duplicados
Cuando cuenta con una clase que implanta varias interfaces, directa o indirectamente, puede
aparecer la misma firma de mtodo en distintas interfaces implantadas. Si las firmas son las
mismas, no se produce ningn conflicto y solo se necesita una implantacin.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
Antes del patrn ) a ide
hDAO
o m G u
ilc den t
a
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Principio de responsabilidad nica
Mclase Employee que aparece en la diapositiva tiene mtodos que se centran en dos principios
La
i n
w o aspectos distintos. Un juego de mtodos se centra en la manipulacin de la representacin de
Ed una persona, mientras que el otro se centra en el mantenimiento de objetos Employee. Debido a
que estos dos juegos de responsabilidades se pueden modificar en puntos distintos de la vida de
las aplicaciones, tiene sentido separarlos en distintas clases.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
Despus de la refactorizacin c o m del t Gpatrn DAO
i l e n
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
m ar use
v i (e
SiM
ara
Implantaciones de DAO
cree que necesitar cambiar la implantacin de DAO posteriormente para que use otro
i n
w mecanismo de persistencia, es mejor usar una interfaz para definir el contrato que deben cumplir
Ed las implantaciones de DAO.
Las interfaces DAO sealan mtodos para crear, leer, actualizar y suprimir datos, si bien los
nombres de mtodos pueden variar. Al implantar por primera vez el patrn DAO, no ver la
ventaja de forma inmediata. La ver posteriormente, cuando empiece a modificar o a sustituir el
cdigo. En la leccin titulada Creacin de aplicaciones de base de datos con JDBC se trata la
sustitucin del DAO basado en memoria por DAO de archivos y bases de datos.
e to
e n s
elic
Al usar un tipo de interfaz, Esta llamada al constructor
a b l
las posteriores lneas no est ligada a una implantacin
fe r
estarn ligadas a una sola
implantacin.
y aparecer en muchos
a n s
lugares de una aplicacin.
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
La implantacin
EmployeeDAO est oculta. elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Este patrn elimina las llamadas directas al constructor a favor de la llamada a un mtodo. Las
fbricas se suelen usar al implantar el patrn DAO.
i n
w En el ejemplo de la diapositiva, desconoce el tipo de mecanismo de persistencia que usa
Ed EmployeeDAO porque se trata solo de una interfaz. La fbrica podra devolver una implantacin
de DAO que usara archivos o una base de datos para almacenar y recuperar datos. Como
desarrollador, desea saber el tipo de persistencia que se est usando, porque influye en el
rendimiento y la fiabilidad de la aplicacin. Sin embargo, no desea que la mayora del cdigo que
ha escrito est totalmente acoplado al tipo de persistencia.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
Los clientes dependen
c o msolo de tG DAO abstractos
i l e n
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
m ar use
vi (e
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
a n
Implantaciones de mtodos situadas
h a s e
en distintas
d clases
m tG ) u i
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Limitaciones de la herencia
M solo soporta la herencia de una sola clase, lo que impide que se puedan heredar distintas
Java
i n
w implantaciones de un mtodo con la misma firma. La herencia de varias interfaces no plantea el
Ed mismo problema que la herencia de clases, ya que no puede haber implantaciones de mtodos
en conflicto en las interfaces.
e to
e n s
elic
a b l
fe r
a n s
Un objeto car complejo que no se o n -tr
puede transferir a un mtodo est
s an
esperando un objeto car simple
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Reutilizacin del cdigo
Mcapacidad de usar el mtodo addCar para cualquier tipo de objeto Car, con independencia de
La
i n
w su complejidad, es otra forma de reutilizar el cdigo. No podemos afirmar actualmente lo
Ed siguiente:
addCar(new SpyCarWithSunRoof());
el polimorfismo.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
a n
Composicin con interfaces para a
h s d e
soportar el polimorfismom) u i
o t G
a ilc den
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
ra v
Cada clase delegada que use en una composicin debe tener definida una interfaz. Al crear la
Ma
clase de composicin, declara que implanta todos los tipos de interfaz delegada.
in
w Al realizar esta accin, crea un objeto que es una composicin de otros objetos y que tiene
Ed muchos tipos.
Ahora, podemos afirmar:
addCar(new SpyCarWithSunRoof());
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
Genricos y recopilaciones
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
s
return this.shirt;
ha uide
)
m} t G
}
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Los dos ejemplos de la diapositiva muestran clases de cach muy simples. Aunque las clases son
muy simples, es necesario utilizar una clase independiente para cada tipo de objeto.
w i n
Ed
i n M
la definicin de clase que aparece entre los parntesis angulares. En este caso, T se refiere al
w tipo y puede representar cualquier tipo. Como muestra el ejemplo, se ha cambiado el cdigo
Ed para utilizar t en lugar de informacin de tipo especfica. El cambio permite que la clase
CacheAny almacene cualquier tipo de objeto.
T no se ha elegido de forma casual, sino por convencin. Con los genricos se suele utilizar una
serie de letras.
Nota: puede utilizar el identificador que desee. nicamente se recomienda el uso de los valores
que se muestran a continuacin.
Las convenciones son las siguientes:
T: tipo
E: elemento
K: clave
V: valor
S, U: se utilizan si hay un segundo tipo, un tercer tipo o ms
Sintaxis.
No es necesario repetir los tipos en la parte derecha de la
sentencia.
Los parntesis angulares indican el reflejo de los parmetros
de tipo.
Simplifica las declaraciones genricas. to
Ahorra la introduccin de datos. n s e
ic e
b l el
//Generics fe r a
a n s
-tr
CacheAny<String> myMessage = new CacheAny<>();
} o n
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
El diamante de inferencia de tipo es una nueva funcin de JDK 7. En el cdigo genrico, observe
cmo la definicin de tipo de la derecha equivale siempre a la definicin de tipo de la izquierda.
w i n
En JDK 7, puede utilizar el diamante para indicar que la definicin de tipo de la derecha equivale
Ed a la de la izquierda. Esto ayuda a evitar la introduccin de informacin redundante una y otra vez.
Ejemplo: TestCacheAnyDiamond.java
Nota: de algn modo, funciona al contrario que una asignacin de tipo Java normal. Por
ejemplo, Employee emp = new Manager(); convierte el objeto emp en una instancia de
Manager.
Sin embargo, en el caso de los genricos:
ArrayList<Manager> managementTeam = new ArrayList<>();
es la parte izquierda de la expresin (en lugar de la derecha) la que determina el tipo.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
El diagrama de la diapositiva muestra todos los tipos de recopilaciones que descienden de
Collection. Algunos mtodos de ejemplo se proporcionan para Collection y List.
w i n
Observe el uso de los genricos.
Ed Caractersticas de las clases de implantacin
HashSet: recopilacin de elementos que no contiene elementos duplicados.
TreeSet: recopilacin de elementos ordenada que no contiene elementos duplicados.
ArrayList: implantacin de matriz dinmica.
Deque: recopilacin que se puede utilizar para implantar una pila o cola.
Nota: la interfaz Map es un rbol de herencia independiente y se detalla ms adelante en esta
misma leccin.
i n M
una matriz aumentable de forma dinmica. Una aplicacin de lista de tareas es un buen ejemplo
de aplicacin que puede aprovechar una ArrayList.
w
Ed
1 import java.util.ArrayList;
2 import java.util.List;
3
4 public class GenericArrayList {
5 public static void main(String args[]){
6
7 List<Integer> partList = new ArrayList<>(3);
8
e to
9 partList.add(new Integer(1111));
e n s
10 partList.add(new Integer(2222));
elic
a b l
11 partList.add(new Integer(3333));
fe r
12 partList.add(new Integer(4444)); // ArrayList auto grows
a n s
13
14 System.out.println("First Part: " + partList.get(0)); // First item
o n -tr
15 an
partList.add(0, new Integer(5555)); // Insert an item by index
s
16
) ha uide
17 m tG
// partList.add("Bad Data"); // compile error now
c o
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Con los genricos, todo es ms sencillo. Cuando la ArrayList se inicializa en la lnea 6,
i n M
cualquier intento de agregar un valor no vlido (lnea 15) da como resultado un error de tiempo de
w compilacin.
Ed En el ejemplo de la diapositiva se muestra una serie de funciones de ArrayList.
La lnea 12 muestra cmo una ArrayList crece automticamente al agregar un elemento
con un tamao superior al original.
La lnea 14 muestra cmo puede acceder el ndice a los elementos.
La lnea 15 muestra cmo se pueden insertar los elementos en la lista segn el ndice.
Nota: en la lnea 7, la ArrayList se asigna a un tipo List. El uso de este estilo permite
intercambiar la implantacin de List sin cambiar otro tipo de cdigo.
i n M
las conversiones debido a la funcin de desempaquetado automtico de Java.
w
Ed
Simplifica la sintaxis.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
i n M
descripciones (tal y como se muestra en la diapositiva).
w
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La interfaz Map no ampla la interfaz Collection debido a que representa asignaciones en lugar
i n M
de una recopilacin de objetos. Entre las principales clases de implantacin se incluyen:
w TreeMap: asignacin en la que las claves se ordenan automticamente.
Ed HashTable: implantacin de matriz asociativa clsica con claves y valores. HashTable
est sincronizada.
HashMap: implantacin similar a HashTable excepto en que acepta claves y valores nulos.
Adems, no est sincronizada.
i n M
del programa es:
w
Ed
=== Part List ===
Part#: 111111 Blue Polo Shirt
Part#: 222222 Black T-Shirt
Part#: 333333 Duke Hat
i n M cola se suele utilizar para realizar el seguimiento de solicitudes de mensaje asncronas con
Una
w el fin de procesarlas de forma ordenada. Puede ser muy til para recorrer un rbol de directorios o
Ed estructuras similares.
i n M
Comparator.
w La interfaz Comparable se implanta en una clase y proporciona una nica opcin de ordenacin
Ed para la clase.
La interfaz Comparator permite crear varias opciones de ordenacin. Puede conectar la opcin
diseada cuando lo desee.
Las dos interfaces se pueden utilizar con recopilaciones ordenadas, como TreeSet y TreeMap.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La diapositiva muestra cmo la clase ComparableStudent est relacionada con la interfaz
i n M
Comparable y TreeSet.
w
Ed
i n M
que, puesto que la interfaz se ha diseado mediante el uso de genricos, los parntesis
angulares definen el tipo de clase transferida al mtodo compareTo. Las sentencias if se
w
Ed incluyen para mostrar las comparaciones que se llevan a cabo. Tambin puede nicamente
devolver un resultado.
Los nmeros devueltos tienen los siguientes significados.
Nmero negativo: s es anterior al elemento actual.
Nmero positivo: s es posterior al elemento actual.
Cero: s es igual que el elemento actual.
En los casos en que la recopilacin contenga valores equivalentes, sustituya el cdigo que
devuelve cero con cdigo adicional que devuelva un nmero negativo o positivo.
i n M
Una vez que se inicializa la lista, se ordena mediante la interfaz Comparable. La salida del
w programa es la siguiente:
Ed Name: George Washington ID: 3333 GPA:3.4
Name: John Adams ID: 2222 GPA:3.9
Name: Thomas Jefferson ID: 1111 GPA:3.8
Nota: la clase ComparableStudent ha sustituido el mtodo toString().
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La diapositiva muestra dos clases Comparator que se pueden utilizar con la clase Student.
i n M
El ejemplo de la diapositiva siguiente muestra cmo utilizar Comparator con una interfaz sin
ordenar como ArrayList mediante el uso de la clase de utilidad Collections.
w
Ed
i n M
Name y GPA. Para la comparacin de nombres, se han simplificado las sentencias if.
w
Ed
i n M
recopilacin.
w Nota: se ha comentado cdigo para ahorrar espacio.
Ed Observe cmo los objetos Comparator se inicializan en las lneas 4 y 5. Una vez creadas las
variables sortName y sortGpa, se pueden transferir al mtodo sort() por el nombre. La
ejecucin del programa produce la siguiente salida.
Name: George Washington ID: 3333 GPA:3.4
Name: John Adams ID: 2222 GPA:3.9
Name: Thomas Jefferson ID: 1111 GPA:3.8
Name: John Adams ID: 2222 GPA:3.9
Name: Thomas Jefferson ID: 1111 GPA:3.8
Name: George Washington ID: 3333 GPA:3.4
Notas
La clase de utilidad Collections proporciona una serie de mtodos tiles para distintas
recopilaciones. Entre los mtodos se incluyen min(), max(), copy() y sort().
La clase Student ha sustituido el mtodo toString().
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Procesamiento de cadenas
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates
i n M
sentencia try, se abre un archivo relativo a los archivos de origen en el proyecto de NetBeans. Al
w cargarlo, los pares nombre-valor estn disponibles para su uso en la aplicacin.
Ed Los archivos de propiedades permiten inyectar fcilmente informacin de la configuracin u otros
datos de la aplicacin en la misma.
import java.io.PrintWriter;
i n M
para guardar la informacin. En el ejemplo de la diapositiva se muestra cmo crear el objeto. La
opcin true es necesaria para forzar que PrintWriter vace las lneas impresas en la consola.
w
Ed
cadenas:
printf y String.format
public class PrintfExample {
public static void main(String[] args){
PrintWriter pw = new PrintWriter(System.out, true);
to
double price = 24.99; int quantity = 2; String color = "Blue";
System.out.printf("We have %03d %s Polo shirts that cost
n s e
$%3.2f.\n", quantity, color, price);
ic e
System.out.format("We have %03d %s Polo shirts that cost
b l el
$%3.2f.\n", quantity, color, price);
fe r a
String out = String.format("We have %03d %s Polo shirts that cost
a n s
-tr
$%3.2f.", quantity, color, price);
System.out.println(out);
o n
an
pw.printf("We have %03d %s Polo shirts that cost $%3.2f.\n",
s
ha uide
quantity, color, price);
}
m tG )
}
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Puede aplicar el formato printf mediante el uso de la clase String y cualquier flujo de salida. En
i n M
la diapositiva se muestran varios ejemplos de aplicacin de formato a cadenas. Consulte la
w documentacin de la API de Java para obtener ms informacin sobre todas las opciones.
Ed %s: cadena
%d: decimal
%f: flotante
La salida del programa es la siguiente:
We have 002 Blue Polo shirts that cost $24.99.
We have 002 Blue Polo shirts that cost $24.99.
We have 002 Blue Polo shirts that cost $24.99.
We have 002 Blue Polo shirts that cost $24.99.
i n M
cadenas.
w
Ed
e to
sb.append("The lightning struck...\n").append("[ ");
e n s
for(int i = 1; i < 11; i++){
elic
a b l
sb.append(i).append(" ");
fe r
}
a n s
sb.append("] times");
o n -tr
a n
System.out.println(sb.toString());
h a s d e
} m ) Gu i
o
}
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i (la diapositiva muestra algunos mtodos StringBuilder comunes. Puede utilizar
a
El ejemplovde
M ar
StringBuilder para insertar texto en su posicin. Se recomienda el encadenamiento de
w inllamadas de adicin para la creacin de cadenas.
Ed La salida del programa es la siguiente:
It was a dark and stormy night, the lightning flashed and the thunder
rumbled.
The lightning struck...
[ 1 2 3 4 5 6 7 8 9 10 ] times
i n M
con el carcter (o los caracteres) que dividirn la cadena. El resultado se captura en una matriz.
w Nota: el delimitador se puede definir mediante el uso de expresiones regulares.
Ed La salida del programa de la diapositiva es la siguiente:
Blue Shirt
Red Shirt
Black Shirt
Maroon Shirt
i n M
diferente. Debe iterar los tokens para acceder a ellos. Tenga en cuenta tambin que el delimitador
", " en este caso indica el uso de comas y espacios como delimitadores. Por tanto, el resultado
w
Ed del anlisis es el siguiente:
Blue
Shirt
Red
Shirt
Black
Shirt
Maroon
Shirt
i n M
cadena. Adems, la clase Scanner se puede utilizar para convertir nmeros en tokens y en
cualquier tipo de nmero primitivo. Observe cmo se define Scanner en la lnea 7. El objeto
w
Ed resultante se puede iterar en funcin de un tipo especfico. En este caso, se utiliza un tipo float.
La salida de este segmento de cdigo es la siguiente:
Values found: 1.1 2.2 3.3
FSum: 6.6000004
to
4 public class PatternExample {
5 public static void main(String[] args){
n s e
6 String t = "It was the best of times";
ic e
7
b l el
8 Pattern pattern = Pattern.compile("the");
fe r a
9 Matcher matcher = pattern.matcher(t);
a n s
10
o n -tr
an
11 if (matcher.find()) { System.out.println("Found match!"); }
12 }
s
ha uide
13 }
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Los objetos Pattern y Matcher funcionan de forma conjunta para proporcionar una solucin
i n M
completa.
w El objeto Pattern define la expresin regular que se utilizar para la bsqueda. Como se
Ed muestra en el ejemplo, una expresin regular puede ser tan sencilla como una palabra o frase.
El objeto Matcher se utiliza para seleccionar la cadena de destino que se va a buscar. Hay
disponible una serie de mtodos para el objeto matcher. Estos mtodos se tratan en las
siguientes diapositivas.
Al ejecutarlo, el ejemplo produce la siguiente salida:
Found match!
Carcter Descripcin
i n M
CustomCharClassExamples.java.
w
Ed
i n M
times.
w Para que esto suceda, en Java:
Ed 1. Cree un objeto Pattern para almacenar la expresin regular con la que desea realizar la
bsqueda.
2. Cree un objeto Matcher mediante la transferencia del texto que va a buscar al objeto
Pattern y la devolucin de un objeto Matcher.
3. Llame a Matcher.find() para buscar el texto con el objeto Pattern definido.
4. Llame a Matcher.group() para mostrar los caracteres que coinciden con el patrn.
i n M
siguiente coincidencia en la misma lnea.
w Ejemplo:
Ed Pattern p1 = Pattern.compile("\\d\\d");
Matcher m1 = p1.matcher(t);
while (m1.find()){
System.out.println("Found: " + m1.group());
}
Produce:
Found: 20
Found: 15
Puede encontrar el cdigo de este ejemplo en el proyecto StringExamples en el archivo
PredefinedCharClassExample.java.
Cuantificador Descripcin
i n M
QuantifierExample.java.
w
Ed
e to
Patrn Descripcin Texto de e n s
coincidencia elic
a b l
ago.*far Una expresin regular recupera r
Longlonglong ago, in
fe
siempre el mayor nmero de n s
a galaxy far far away.
a
caracteres posible.
o n -tr
ago.*?far El carcter ? bsicamente a n Longlonglong ago, in
desactiva la voracidad. h a s dea galaxy far far away.
m ) Gui
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( regular intenta siempre buscar coincidencias con caracteres que devuelvan el
a v
Una expresin
M ar de caracteres. Esto se conoce como principio de voracidad. Utilice el operador ? para
mximo
winlimitar el resultado al menor nmero de caracteres necesarios para coincidir con el patrn.
Ed Puede encontrar el cdigo de este ejemplo en el proyecto StringExamples en el archivo
GreedinessExample.java.
Fijacin Descripcin
Cadena de destino it was the best of times or it was the worst of times
i n M
BoundaryCharExample.java.
w
Ed
Pattern p1 = Pattern.compile("(\\S+?)\\.(\\S+?)\\@(\\S+)");
Matcher m1 = p1.matcher(email);
if (m1.find()){
System.out.println("First: " + m1.group(1));
System.out.println("Last: " + m1.group(2));
System.out.println("Domain: " + m1.group(3));
System.out.println("Everything Matched: " + m1.group(0));
}
}
Programacin Java SE 7 8-32
}
Uso del mtodo replaceAll
elementos.
e to
Pattern p1 = Pattern.compile("h1");
e n s
Matcher m1 = p1.matcher(header);
elic
if (m1.find()){
a b l
fe r
header = m1.replaceAll("p");
a n s
System.out.println(header);
o n -tr
an
}
} s
ha uide
}
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Puede buscar y sustituir elementos mediante el uso del mtodo replaceAll despus de realizar
i n M
una bsqueda.
w La salida del programa es la siguiente:
Ed <p>This is an H1</p>
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to