Вы находитесь на странице: 1из 282

Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Michael Williams Exencin de responsabilidad

Tom McGinn Este documento contiene informacin propiedad de Oracle Corporation y se


Matt Heimer encuentra protegido por el copyright y otras leyes sobre la propiedad intelectual.
Usted solo podr realizar copias o imprimir este documento para uso exclusivo por
usted en los cursos de formacin de Oracle. Este documento no podr ser
Technical Contributors modificado ni alterado en modo alguno. Salvo que la legislacin del copyright lo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

considere un uso excusable o legal o "fair use", no podr utilizar, compartir,


and Reviewers descargar, cargar, copiar, imprimir, mostrar, representar, reproducir, publicar,
Lee Klement conceder licencias, enviar, transmitir ni distribuir este documento total ni parcialmente
sin autorizacin expresa por parte de Oracle.
Steve Watts
La informacin contenida en este documento puede someterse a modificaciones sin
Brian Earl previo aviso. Si detecta cualquier problema en el documento, le agradeceremos que
Vasily Strelnikov nos lo comunique por escrito a: Oracle University, 500 Oracle Parkway, Redwood
Shores, California 94065 EE. UU. No se garantiza que este documento se encuentre
Andy Smith libre de errores.
Nancy K.A.N
Aviso sobre restriccin de derechos e to
Chris Lamb
e n s
Todd Lowry
el
Si este software o la documentacin relacionada se entrega al Gobierno de EE. UU. ic
aplicar la siguiente disposicin:
a b l
o a cualquier entidad que adquiera licencias en nombre del Gobierno de EE. UU. se
Ionut Radu
fe r
Joe Darcy U.S. GOVERNMENT RIGHTS
a n s
Brian Goetz - tr
The U.S. Governments rights to use, modify, reproduce, release, perform, display, or
n
o
disclose these training materials are restricted by the terms of the applicable Oracle

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

Mtodos de la clase Employee 2-22


Creacin de una instancia de un objeto 2-23
Constructores 2-24
Sentencia package 2-25
Sentencias import 2-26
Ms informacin sobre import 2-27
Java se transfiere por valor 2-28
e to
Transferencia por valor para referencias de objetos 2-29
e n s
Objetos transferidos como parmetros 2-30
elic
a b l
Cmo compilar y ejecutar 2-31
fer
Compilacin y ejecucin: ejemplo 2-32
a n s
Cargador de clase Java 2-33
n - tr
o
Recoleccin de basura 2-34
s an
Resumen 2-35
) ha uide
Prueba 2-36
c o m tG
a il d e n
Visin general de la prctica 2-1: Creacin de clases Java 2-39

@ 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

4 Diseo de clases Java


Objetivos 4-2
Uso del control de acceso 4-3
Control de acceso protegido: ejemplo 4-4
e to
Sombra de campos: ejemplo 4-5
e n s
Control de acceso: recomendacin 4-6
elic
Sustitucin de mtodos 4-7
a b l
Llamada a un mtodo sustituido 4-9 fe r
a n s
Llamada al mtodo virtual 4-10
n - tr
Accesibilidad de los mtodos sustituidos 4-11 o
Aplicacin de polimorfismo 4-12 s an
Uso de la palabra clave instanceof 4-14 ) ha uide
c o m tG
a il
Conversin de referencias de objetos 4-15
d e n
gm s Stu
Conversin de reglas 4-16
@
r a vi e thi
Sustitucin de mtodos de objeto 4-18
a s
Mtodo Object toString 4-19
m u
e
i ( Object equals 4-20
Mtodo
a v
MarSustitucin de equals en Employee 4-21
w i n Sustitucin de Object hashCode 4-22
Ed Resumen 4-23
Prueba 4-24
Visin general de la prctica 4-1: Sustitucin de mtodos y aplicacin de
polimorfismo 4-28

5 Diseo de clases avanzadas


Objetivos 5-2
Modelacin de problemas de negocio con clases 5-3
Activacin de la generalizacin 5-4
Identificacin de la necesidad de clases abstractas 5-5
Definicin de clases abstractas 5-6
Definicin de mtodos abstractos 5-7
Validacin de clases abstractas 5-8
Prueba 5-9

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

Variables estticas 5-14


Definicin de variables estticas 5-15
Uso de variables estticas 5-16
Importaciones estticas 5-17
Prueba 5-18
Mtodos finales 5-19
Clases finales 5-20
e to
Variables finales 5-21
e n s
Declaracin de variables finales 5-22
elic
Prueba 5-23
a b l
fe r
Cundo evitar las constantes 5-24
a n s
Enumeraciones Typesafe 5-25
n - tr
o
an
Uso de enumeraciones 5-26
Enumeraciones complejas 5-27 s
ha uide
Prueba 5-28 )
m tG
Patrones de diseo 5-29 c o n
a il d e
Patrn singleton 5-30
@ gm s Stu
Clases anidadas 5-31
r a vi e thi
a s
Clase interna: ejemplo 5-32
m u
( e
Clases internas annimas 5-33
i
v
MaraPrueba 5-34

w i n Resumen 5-35

Ed Visin general de la prctica 5-1: Aplicacin de la palabra clave abstract 5-36


Visin general de la prctica 5-2: Aplicacin del patrn de diseo singleton 5-37
Visin general de la prctica 5-3: (Opcional) Uso de enumeraciones Java 5-38
(Opcional) Visin general de la prctica 5-4: Reconocimiento de clases anidadas 5-39

6 Herencia con interfaces Java


Objetivos 6-2
Implantacin de sustitucin 6-3
Interfaces Java 6-4
Desarrollo de interfaces Java 6-5
Campos constantes 6-6
Referencias a la interfaz 6-7
Operador instanceof 6-8
Interfaces de marcador 6-9
Conversin en tipos de interfaz 6-10

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

Interfaz Map 7-20


Tipos de Map 7-21
Interfaz Map: ejemplo 7-22
Interfaz Deque 7-23
Pila con Deque: ejemplo 7-24
Ordenacin de recopilaciones 7-25
Interfaz Comparable 7-26
e to
Comparable: ejemplo 7-27 e n s
Prueba de Comparable: ejemplo 7-28 elic
a b l
Interfaz Comparator 7-29
fe r
Comparator: ejemplo 7-30 a n s
Prueba de Comparator: ejemplo 7-31 n - tr
o
Prueba 7-32
s an
Resumen 7-33
) ha uide
o m tG
Visin general de la prctica 7-1: Recuento de nmeros de artculo mediante el uso
c
de un HashMap 7-34 a il d e n
@ gm s Stu
Visin general de la prctica 7-2: Coincidencia de parntesis mediante Deque 7-35
r a vi e thi
Visin general de la prctica 7-3: Recuento de inventario y ordenacin con
m a u s
i ( e
elementos Comparator 7-36
v
ara
M8 Procesamiento de cadenas
w i n
Ed
Objetivos 8-2
Argumentos de lnea de comandos 8-3
Propiedades 8-5
Carga y uso de un archivo de propiedades 8-6
Carga de propiedades desde la lnea de comandos 8-7
PrintWriter y la consola 8-8
Formato printf 8-9
Prueba 8-10
Procesamiento de cadenas 8-11
StringBuilder y StringBuffer 8-12
StringBuilder: ejemplo 8-13
Mtodos de cadena de ejemplo 8-14
Uso del mtodo split() 8-15
Anlisis con StringTokenizer 8-16

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

Clase de caracteres: ejemplos 8-21


Cdigo de clase de caracteres: ejemplos 8-22
Clases de caracteres predefinidas 8-23
Clases de caracteres predefinidas: ejemplos 8-24
Cuantificadores 8-25
Cuantificador: ejemplos 8-26
Voracidad 8-27
e to
Prueba 8-28
e n s
Coincidencias de lmite 8-29
el ic
Lmite: ejemplos 8-30 a b l
fe r
Prueba 8-31
a n s
Coincidencia y grupos 8-32
n - tr
o
Uso del mtodo replaceAll 8-33
Resumen 8-34 s an
) ha uide
Visin general de la prctica 8-1: Anlisis de texto con split() 8-35
c o m tG
a il d e n
Visin general de la prctica 8-2: Creacin de un programa de bsqueda de
gm s Stu
expresiones regulares 8-36
@
r a vi e thi
Visin general de la prctica 8-3: Transformacin de HTML mediante expresiones
a
regulares 8-37
m u s
( e
r a vi
9
Ma Excepciones y afirmaciones

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

Revisin del patrn DAO 9-22


Afirmaciones 9-23
Sintaxis de las afirmaciones 9-24
Invariantes internas 9-25
Invariantes de flujo de control 9-26
Condiciones posteriores e invariantes de clases 9-27
Control de evaluacin de tiempo de ejecucin de afirmaciones 9-28
e to
Prueba 9-29
e n s
Resumen 9-30
el ic
Visin general de la prctica 9-1: Captura de excepciones 9-31
a b l
fe
Visin general de la prctica 9-2: Ampliacin del objeto Exception 9-32
r
a n s
n - tr
o
an
10 Conceptos fundamentales de E/S en Java
Objetivos 10-2 s
a ide
Conceptos bsicos de E/S en Java 10-3 ) h u
o m t G
Flujos de E/S 10-4
Aplicacin de E/S 10-5 ma
ilc den
@ g s Stu
r a vi de
Datos dentro de flujos 10-6
e t hi de bytes 10-7
m a
Mtodos InputStream
u s flujos
e
i ( OutputStream de flujos de bytes 10-9
Mtodos
a v
M arEjemplo de flujo de bytes 10-10
win Mtodos Reader de flujos de caracteres 10-11
Ed Mtodos Writer de flujos de caracteres 10-12
Ejemplo de flujo de caracteres 10-13
Cadenas de flujos de E/S 10-14
Ejemplo de flujos en cadena 10-15
Flujos de procesamiento 10-16
E/S de la consola 10-17
java.io.Console 10-18
Escritura en una salida estndar 10-19
Lectura a partir de una entrada estndar 10-20
E/S de canal 10-21
Visin general de la prctica 10-1: Escritura de una aplicacin simple de E/S de la
consola 10-22
Persistencia 10-23
Serializacin y grficos de objetos 10-24

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

Escritura y lectura de un flujo de objetos 10-29


Mtodos de serializacin 10-30
Ejemplo de readObject 10-31
Resumen 10-32
Prueba 10-33
Visin general de la prctica 10-2: Serializacin y anulacin de la serializacin de
ShoppingCart 10-37
e to
e n s
11 E/S de archivos Java (NIO.2)
el ic
Objetivos 11-2 a b l
fe r
Nueva API de E/S de archivos Java (NIO.2) 11-3
a n s
Limitaciones de java.io.File 11-4
o n -tr
Sistemas de archivos, rutas y archivos 11-5
s a n 11-6
Ruta de acceso relativa frente a ruta de acceso absoluta
Enlaces simblicos 11-7 ) ha uide
c o m tG
Conceptos de Java NIO.2 11-8
a il d e n
Interfaz Path 11-9
@ gm s Stu
Caractersticas devlai interfazth
a i 11-10
Path
Path: ejemplo
r
a 11-11us e
e m
a v i ( de redundancias de Path 11-12
Eliminacin

MarCreacin de una subruta 11-13


w i n Unin de dos rutas 11-14
Ed Creacin de una ruta entre dos rutas 11-15
Trabajo con enlaces 11-16
Prueba 11-17
Operaciones File 11-20
Comprobacin de un directorio o un archivo 11-21
Creacin de archivos y directorios 11-23
Supresin de un directorio o un archivo 11-24
Copia de un directorio o un archivo 11-25
Copia entre un flujo y una ruta 11-26
Desplazamiento de un directorio o un archivo 11-27
Listado del contenido de un directorio 11-28
Lectura o escritura de todos los bytes o lneas de un archivo 11-29
Canales y ByteBuffers 11-30
Archivos de acceso aleatorio 11-31

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

Atributos de archivo DOS: ejemplo 11-36


Permisos de POSIX 11-37
Prueba 11-38
Visin general de la prctica 11-1: Escritura de una aplicacin de fusin
de archivos 11-41
Operaciones recursivas 11-42
Orden del mtodo FileVisitor 11-43
e to
Ejemplo: WalkFileTreeExample 11-46
e n s
Bsqueda de archivos 11-47
elic
Patrn y sintaxis de PathMatcher 11-48
a b l
PathMatcher: ejemplo 11-50 fe r
a n s
Clase Finder 11-51
n - tr
Otras clases tiles de NIO.2 11-52 o
Cambio a NIO.2 11-53 s an
Resumen 11-54 ) ha uide
c o m tG
Prueba 11-55
a il d e n
gm s Stu
Visin general de la prctica 11-2: Copia recursiva 11-58
@
r a vi e thi
(Opcional) Visin general de la prctica 11-3: Uso de PathMatcher para realizar una

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

Palabra clave volatile 12-22


Mtodos synchronized 12-23
Bloques synchronized 12-24
Bloqueo de supervisin de objeto 12-25
Deteccin de interrupcin 12-26
Interrupcin de un thread 12-27
Thread.sleep() 12-28
e to
Prueba 12-29
e n s
Mtodos Thread adicionales 12-30
elic
a b l
Mtodos a evitar 12-31
fe r
Interbloqueo 12-32
a n s
Resumen 12-33
n - tr
o
an
Visin general de la prctica 12-1: Sincronizacin de acceso a datos
s
compartidos 12-34
) ha uide
c o m tG
Visin general de la prctica 12-2: Implantacin de un programa multithread 12-35

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

M a Paquete java.util.concurrent.locks 13-5


w i n java.util.concurrent.locks 13-6
Ed Recopilaciones con proteccin de thread 13-7
Prueba 13-8
Sincronizadores 13-9
java.util.concurrent.CyclicBarrier 13-10
Alternativas de threads de alto nivel 13-11
java.util.concurrent.ExecutorService 13-12
java.util.concurrent.Callable 13-13
java.util.concurrent.Future 13-14
Cierre de ExecutorService 13-15
Prueba 13-16
E/S simultnea 13-17
Cliente de red de thread nico 13-18
Cliente de red multithread (parte 1) 13-19

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

w i n Uso de la API de JDBC 14-3


Ed Uso de clases de controlador de proveedor 14-4
Componentes de la API de JDBC clave 14-5
Uso de un objeto ResultSet 14-6
Unin de todo 14-7
Escritura de cdigo JDBC porttil 14-9
Clase SQLException 14-10
Cierre de objetos de JDBC 14-11
Construccin try-with-resources 14-12
try-with-resources: prctica incorrecta 14-13
Escritura de consultas y obtencin de resultados 14-14
Visin general de la prctica 14-1: Trabajo con la base de datos
Derby y JDBC 14-15
ResultSetMetaData 14-16

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

Qu es una transaccin? 14-22


Propiedades ACID de una transaccin 14-23
Transferencia sin transacciones 14-24
Transferencia correcta con transacciones 14-25
Transferencia incorrecta con transacciones 14-26
Transacciones JDBC 14-27
RowSet 1.1: RowSetProvider y RowSetFactory 14-28
e to
Uso de RowSetFactory de RowSet 1.1 14-29
e n s
Ejemplo: Uso de JdbcRowSet 14-31
elic
a b l
Objetos de acceso a datos 14-32
fe r
Patrn de objeto de acceso a datos 14-33
a n s
Resumen 14-34
n - tr
o
Prueba 14-35
s an
ha uide
Visin general de la prctica 14-2: Uso del patrn de objeto de acceso
)
a datos 14-39
c o m tG
a il d e n
15 Localizacin
@ gm s Stu
Objetivos 15-2 vi
r a e t hi
Por qu m a
localizar? u s
15-3
e
i ( de ejemplo 15-4
Aplicacin
a v
M arLocale 15-5
win Grupo de recursos 15-6
Ed Archivo de grupo de recursos 15-7
Archivos del grupo de recursos de ejemplo 15-8
Prueba 15-9
Inicializacin de la aplicacin de ejemplo 15-10
Aplicacin de ejemplo: bucle principal 15-11
Mtodo printMenu 15-12
Cambio de Locale 15-13
Interfaz de ejemplo con francs 15-14
Formato de fecha y moneda 15-15
Inicializacin de fecha y moneda 15-16
Visualizacin de fecha 15-17
Personalizacin de fechas 15-18
Visualizacin de moneda 15-19

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

(Opcional) Visin general de la prctica 15-2: Localizacin de una aplicacin


JDBC 15-23

A Descripcin general de SQL


Objetivos A-2
Uso de SQL para consultar la base de datos A-3
Sentencias SQL A-4
e to
Sentencia SELECT bsica A-5
e n s
Limitacin de las filas seleccionadas A-7
elic
Uso de la clusula ORDER BY A-8
a b l
fe r
Sintaxis de las sentencias INSERT A-9
a n s
Sintaxis de sentencias UPDATE A-10
n - tr
Sentencia DELETE A-11 n o
s a
Sentencia CREATE TABLE A-12
h
) Gua i d e
Definicin de restricciones A-13
o m
Inclusin de restricciones A-16ilc
a d e nt
Tipos de datos A-18 gm S tu
@
vi A-20
Borrado de una tabla t hi s
a r a s e
Resumenm
e A-21 u
a v i(
Mar
w i n
Ed

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

Este curso aborda las principales API que se usan para


disear aplicaciones orientadas a objetos con Java.
Tambin aborda la escritura de programas de base de
datos con JDBC.
Utilice este curso para ampliar sus conocimientos del
lenguaje Java y prepararse para el examen de to
programador Oracle Certified Professional, Java SE 7. n s e
ic e
b l el
fe r a
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

Programacin Java SE 7 1-2


Objetivos del curso
Al finalizar este curso, debera estar capacitado para lo
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

Programacin Java SE 7 1-3


Objetivos del curso
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

(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

Programacin Java SE 7 1-4


Asistentes
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Entre el pblico al que va dirigido se incluyen aquellos que:


Hayan terminado el curso Conceptos fundamentales de
Java SE 7, o bien que tengan experiencia con el lenguaje
Java y que sean capaces de crear, compilar y ejecutar
programas
Tengan experiencia con al menos un lenguaje de
e to
programacin n s
e l ice
Comprendan los principios orientados a objetos
r a bl
Tengan experiencia con los conceptos bsicos n yfe
s
a
conocimientos bsicos de SQL n-tr no
a
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
Mara
w i n
Ed

Programacin Java SE 7 1-5


Requisitos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Para completar este curso satisfactoriamente, debe saber cmo:


Compilar y ejecutar aplicaciones Java
Crear clases Java
Crear instancias de objetos con la palabra clave new
Declarar variables de referencia y primitivas de Java
Declarar mtodos Java con valores de retorno y parmetros e to
n s
Usar construcciones condicionales como sentencias if y lice
switch a b le
Usar construcciones en bucle, como bucles for,ns fer y do
while
Declarar e instanciar matrices Java n - tra
n o
Usar la especificacin de la API Java
s aPlatform,
Standard
h a d e
Edition (Javadocs) m) ui
i l co ent G
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
Mara
w i n
Ed

Programacin Java SE 7 1-6


Presentaciones a la clase
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Programacin Java SE 7 1-7


Entorno del curso
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

PC del aula

Aplicaciones Herramientas adicionales


principales Firefox
JDK 7 Java DB
NetBeans
e to
7.0.1
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
En este curso estn preinstalados los siguientes productos para las prcticas de las lecciones:
JDK 7: Java SE Development Kit incluye el compilador Java de lnea de comandos (javac)
w i n y Java Runtime Environment (JRE), que proporciona el comando java necesario para
Ed ejecutar aplicaciones Java.
Firefox: se utiliza un explorador web para ver la documentacin HTML (documentacin
Java) para la bibliotecas de la plataforma Java SE.
NetBeans 7.0.1: NetBeans IDE es una herramienta de desarrollo de software gratuita y de
cdigo abierto para los profesionales que crean aplicaciones de empresa, web, de escritorio
y mviles. NetBeans 7.0.1 cuenta con soporte total de la plataforma Java SE 7. El soporte
se proporciona mediante la oferta Oracle Development Tools Support.
Java DB: Java DB es una distribucin soportada por Oracle de la base de datos de
tecnologa Java 100% Apache Derby de cdigo abierto. Se trata de SQL basado en
estndares, fcil de usar, seguro y totalmente transaccional, con API JDBC y con Java EE,
pero con un tamao reducido, de tan solo 2,5 MB.

Programacin Java SE 7 1-8


Los programas Java son independientes de la
plataforma
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
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.

Programacin Java SE 7 1-9


Grupos de productos de tecnologa Java
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
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.

Programacin Java SE 7 1-10


Versiones de la plataforma Java SE
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Programacin Java SE 7 1-11


Descarga e instalacin del JDK
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
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.

Programacin Java SE 7 1-12


Java en entornos de servidor
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Java se suele usar en entornos


de empresa:
Oracle Fusion Middleware
Servidores de aplicaciones
Java
GlassFish
e to
WebLogic
e n s
i c
le l
Servidores de base de datos
ab
MySQL
s f er
n
-tra
Oracle Database
on
a n
a s
h 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
Entornos de empresa
Meste curso, desarrollar aplicaciones Java SE. Hay patrones estndar que se tienen que
En
i n
w seguir al implantar aplicaciones Java SE, como crear siempre un mtodo main que pueda variar
Ed al implantar aplicaciones de empresa. Java SE es el nico punto de inicio en su trayectoria para
convertirse en un desarrollador Java. En funcin de las necesidades de su organizacin, puede
que tenga que desarrollar aplicaciones que se ejecuten dentro de servidores de aplicaciones Java
EE o en otros tipos de middleware Java.
En ocasiones, tambin tendr que trabajar con informacin almacenada en bases de datos
relacionales como MySQL u Oracle Database. En este curso se le presentan los conceptos
fundamentales de la programacin de bases de datos.

Programacin Java SE 7 1-13


Comunidad Java
Mvil e
incrustada
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
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.

Programacin Java SE 7 1-14


Java Community Process (JCP)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

JCP se usa para desarrollar nuevos estndares Java:


http://jcp.org
Descarga gratuita de todas las solicitudes de
especificacin Java (JSR)
Acceso anticipado a las especificaciones
Posibilidad de recibir comentarios y revisiones por parte e to
e n s
de otros miembros lic
Participacin libre a b le
r e
a n sf
n -tr
o
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
JCP.next
M produce las solicitudes JSR que detallan los estndares de la plataforma Java. Mediante el
JCP
i n
w proceso JSR tambin se define y se mejora el comportamiento del propio JCP. JCP est en plena
Ed evolucin y sus mejoras se definen en JSR-348. JSR-348 presenta cambios en las reas de la
transparencia, la participacin, la agilidad y el gobierno.
Transparencia: en el pasado, algunos de los aspectos relacionados con el desarrollo de
una JSR se producan de forma opaca. Sin embargo, el desarrollo transparente es ahora la
prctica recomendada.
Participacin: se anima tanto a los usuarios como a los grupos de usuarios Java a formar
parte de JCP.
Agilidad: las JSR lentas ahora no se recomiendan.
Gobierno: los grupos de expertos SE y ME se estn fusionando en un solo cuerpo.

Programacin Java SE 7 1-15


OpenJDK
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

OpenJDK es la implantacin de cdigo fuente de Java:


http://openjdk.java.net/
Proyecto de cdigo abierto con licencia GPL
Implantacin de referencia JDK
Donde se desarrollan nuevas funciones
Permite contribuciones a la comunidad e to
e n s
Base de Oracle JDK 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
Importancia de OpenJDK
M a que se trata de cdigo abierto, OpenJDK permite a los usuarios trasladar Java a
Debido
i n
w sistemas operativos y plataformas de hardware de su eleccin. Actualmente se estn realizando
Ed traslados para muchas plataformas (adems de las ya soportadas), incluidas FreeBSD,
OpenBSD, NetBSD y MacOS X.

Programacin Java SE 7 1-16


Soporte de Oracle Java SE
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Java est disponible de forma gratuita. Sin embargo, Oracle


proporciona soluciones Java de pago:
Java SE Support Program ofrece actualizaciones para
versiones Java con un fin de vida determinado.
Oracle Java SE Advanced y Oracle Java SE Suite:
JRockit Mission Control e to
Deteccin de falta de memoria e n s
elic
Low Latency GC (Suite)
a b l
fe r
JRockit Virtual Edition (Suite)
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
An es gratuito
M (Oracle JDK) se pone a libre disposicin del pblico sin coste alguno. Oracle ofrece
Java
i n
w soluciones comerciales avanzadas sin ningn coste. El programa Java for Business que se
Ed ofreca anteriormente se ha sustituido por Oracle Java SE Support, que permite acceso a Oracle
Premier Support y a los binarios de Oracle Java SE Advanced y de Oracle Java SE Suite. Para
obtener ms informacin, visite http://www.oracle.com/us/technologies/java/java-se-suite-
394230.html.

Programacin Java SE 7 1-17


Recursos adicionales
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Tema Sitio web


Enseanza y formacin http://education.oracle.com
Documentacin de
productos http://www.oracle.com/technology/documentation
Descarga de productos http://www.oracle.com/technology/software
Artculos sobre productos http://www.oracle.com/technology/pub/articles
Soporte de productos e to
http://www.oracle.com/support
e n s
Foros sobre productos http://forums.oracle.com
l e lic
Tutoriales sobre productos http://www.oracle.com/technetwork/tutorials/index.html
r a b
Cdigo de ejemplo https://www.samplecode.oracle.com nsf
e
Oracle Technology Network
n - tra
http://www.oracle.com/technetwork/java/index.html
para desarrolladores Java
a no
Oracle Learning Library s de
http://www.oracle.com/goto/oll
h a
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 (la diapositiva se muestran los distintos recursos web disponibles que permiten
a v
En la tabla de
M ar ms informacin sobre la programacin Java SE.
obtener
win
Ed

Programacin Java SE 7 1-18


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin debe haber aprendido lo siguiente:


Los objetivos del curso
Software usado en este curso
Plataformas Java (ME, SE y EE)
Nmeros de versin de Java SE
Obtencin de un JDK e to
e n s
La naturaleza abierta de Java y su comunidad elic
a b l
Opciones de soporte comercial para Java SE 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

Programacin Java SE 7 1-19


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Sintaxis Java y revisin de clases

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

Al finalizar esta leccin, debera estar capacitado para lo


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Programacin Java SE 7 2-2


Revisin del lenguaje Java
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin se repasan los conceptos fundamentales


de Java y de la programacin. Se supone que los
alumnos conocen los siguientes conceptos:
La estructura bsica de una clase Java
Los bloques y comentarios de un programa
Variables e to
e n s
Las construcciones de bifurcacin bsicas if-else lic
y switch a b le
La iteracin con bucles for y while s f er
n tra
n -
a no
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
Mara
w i n
Ed

Programacin Java SE 7 2-3


Estructura de la clase
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

package <package_name>;

import <other_packages>;

public class ClassName {


<variables(also known as fields)>;
e to
e n s
<constructor method(s)>;
elic
a b l
fe r
<other methods>;
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
Se describe una clase Java en un archivo de texto con una extensin .java. En el ejemplo

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.

Programacin Java SE 7 2-4


Clase simple
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una clase Java simple con un mtodo main:

public class Simple{

public static void main(String args[]){


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
Para ejecutar un programa Java, debe definir un mtodo main, como se muestra en la

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.

Programacin Java SE 7 2-5


Bloques de cdigo
Todas las declaraciones de clase se incluyen en un bloque
de cdigo.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las declaraciones de mtodos se incluyen en bloques de


cdigo.
El mbito de los campos y los mtodos Java es el bloque
(o la clase).
Los bloques de cdigos se definen entre corchetes:
{ } e to
e n s
Ejemplo:
elic
a b l
public class SayHello { fe r
a n s
public static void main(String[] args) {
o n -tr
System.out.println("Hello world");
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
El mbito de clase de los campos (variables) y los mtodos Java se define mediante el corchete
angular de apertura de la izquierda y el de cierre de la derecha.
i n
w El mbito de clase permite a cualquier mtodo de la clase llamar a cualquier otro mtodo de la
Ed clase. El mbito de clase tambin permite que cualquier mtodo acceda a cualquier campo de la
clase.
Los bloques de cdigo siempre se definen con corchetes {}. Para ejecutar un bloque, se ejecuta
cada una de las sentencias definidas en el bloque en el orden del primero al ltimo (de izquierda
a derecha).
El compilador Java ignora todos los espacios en blanco. No es necesario el sangrado de lneas,
pero facilita la lectura del cdigo. En este curso, el sangrado de la lnea incluye cuatro espacios,
que es el sangrado de lnea por defecto que usa NetBeans IDE.

Programacin Java SE 7 2-6


Tipos de datos primitivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Entero Coma Carcter True


flotante False
byte float char boolean
short double
int
long
e to
1, 2, 3, 42 3.0F 'a' true
e n s
07 .3337F '\u0061' false
elic
0xff 4.022E23 '\n' a b l
s f er
0 0.0f '\u0000' an false -tr
o n
s an
Agregue las letras "L" o "F" en maysculas
) ha ouminsculas
i de al
nmero para especificar un nmero
c o m largot G o uno flotante.

ail tude n
m
g sS
i @ hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
t
a r a
Copyright
s
e m u
Enterorav
i(
M
Java
aproporciona cuatro tipos de enteros diferentes para nmeros de diferentes tamaos. Todos
n
wi los tipos numricos llevan signo, lo cual quiere decir que pueden incluir nmeros positivos o
Ed negativos.
Los tipos enteros tienen los siguientes rangos:
El rango de byte es de 128 a +127. Nmero de bits = 8.
El rango de short es de 32 768 a +32 767. Nmero de bits = 16.
El rango de int es de 2 147 483 648 a +2 147 483 647. El tipo de entero ms comn es
int. Nmero de bits = 32.
El rango de long es de 9 223 372 036 854 775 808 a +9 223 372 036 854 775 807.
Nmero de bits = 64.
Coma flotante
Los tipos de coma flotante incluyen nmeros con una parte fraccionaria conforme con el estndar
IEEE 754. Hay dos tipos de comas flotantes: float y double.
double recibe este nombre porque proporciona el doble de precisin que float. Un elemento
float usa 32 bits para almacenar datos, mientras que un elemento double utiliza 64 bits.

Programacin Java SE 7 2-7


Carcter
El tipo char se utiliza en caracteres individuales, a diferencia de una cadena de caracteres (que
se implanta como un objeto String). Java soporta Unicode, un estndar internacional para
representar caracteres en cualquier idioma escrito del mundo en valores nicos de 16 bits. Los
primeros 256 caracteres coinciden con el juego de caracteres ISO Latn 1, parte del cual es
ASCII.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Booleano
El tipo boolean puede ser true o false.
Nota: true y false pueden parecer palabras clave, pero son tcnicamente literales booleanos.

Valores por defecto


Si no se especifica ningn valor, se utiliza un valor por defecto. Los valores en rojo en la
diapositiva son los valores utilizados por defecto. El valor char por defecto es null
(representado como '\u0000'), mientras que el valor por defecto de boolean es false. to
Nota: las variables locales (es decir, las variables declaradas en mtodos) no tienen un valoreporn se
l e lic
defecto. Si se intenta usar una variable local a la que no se le ha asignado un valor, se producir
un error del compilador. Es bueno incluir siempre un valor por defecto en cualquier
r a bvariable.
sf e
a n
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
r a vi e thi
m a u s
i( e
a v
M ar
win
Ed

Programacin Java SE 7 2-8


Literales numricas de Java SE 7
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En Java SE 7 (y versiones posteriores), puede aparecer


cualquier nmero de caracteres subrayados (_) entre dgitos
en un campo numrico. Esto puede mejorar la lectura del
cdigo.

long creditCardNumber = 1234_5678_9012_3456L;


e to
long socialSecurityNumber = 999_99_9999L;
e n s
float pi = 3.14_15F; elic
a b l
long hexBytes = 0xFF_EC_DE_5E;
fe r
long hexWords = 0xCAFE_BABE; a n s
long maxLong = 0x7fff_ffff_ffff_ffffL; o n -tr
byte nybbles = 0b0010_0101; s an
long bytes = 0b11010010_01101001_10010100_10010010; ) 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
Reglas para literales
M puede colocar caracteres de subrayado entre dgitos; no puede colocarlos en los siguientes
Solo
i n
w lugares:
Ed Al principio o al final de un nmero
Junto a una coma decimal en un literal de coma flotante
Antes de un sufijo F o L
En posiciones en las que se espere una cadena de dgitos
Nota: Java es sensible a maysculas y minsculas. En Java, la variable creditCardNumber no
es igual que CREDITCARDNUMBER. La convencin indica que las variables y los nombres de
mtodos Java usan formato CamelCase en minsculas, minsculas para la primera letra del
primer elemento de un nombre de variable y maysculas para la primera letra de los posteriores
elementos.

Programacin Java SE 7 2-9


Literales binarios de Java SE 7
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En Java SE 7 (y versiones posteriores), los literales binarios


tambin se pueden expresar con el sistema binario agregando
los prefijos 0b o 0B al nmero:
// An 8-bit 'byte' value:
byte aByte = (byte)0b00100001;

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

Programacin Java SE 7 2-10


Operadores

Operador de asignacin simple


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

= Operador de asignacin simple


Operadores aritmticos
+ Operador de suma (tambin se usa para la concatenacin de
cadenas)
Operador de resta
* Operador de multiplicacin
e to
/ Operador de divisin e n s
% Operador de resto elic
a b l
Operadores unarios fe r
a n s
+ Operador ms unario; indica positivo
o n -tr
an
Operador menos unario; niega una expresin
++ Operador de aumento; aumenta un valor en 1 s
ha uide
m tG )
-- Operador de disminucin; disminuye un valor en 1
c o n
il e
! Operador de complemento lgico; invierte el valor de un booleano
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
Mara
Como se han presentado los nmeros, en la diapositiva se muestra una lista de operadores
comunes. La mayora son habituales de cualquier lenguaje de programacin y se proporciona una
w i n
descripcin en la diapositiva.
Ed Los operadores binarios y a nivel de bit se han omitido por brevedad. Para obtener detalles sobre
ellos, consulte el tutorial de Java:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
Nota: los operadores tienen una prioridad definitiva. Para obtener la lista completa, consulte el
enlace del tutorial de Java mencionado anteriormente. La prioridad se puede sustituir mediante el
uso de parntesis.

Programacin Java SE 7 2-11


Cadenas
1 public class Strings {
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Programacin Java SE 7 2-12


Operaciones de cadenas

1 public class StringOperations {


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 public static void main(String arg[]){ Los literales de cadena se


3 String string2 = "World"; crean automticamente
4 String string3 = ""; como objetos String.
5
6 string3 = "Hello".concat(string2);
7 System.out.println("string3: " + string3);
8
9 // Get length
e to
10 System.out.println("Length: " + string1.length());
e n s
11
elic
a b l
12 // Get SubString
fe r
13 System.out.println("Sub: " + string3.substring(0, 5));
a n s
14
15 // Uppercase o n -tr
16 System.out.println("Upper: " + string3.toUpperCase());
s an
17 }
) ha uide
18}
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
En la diapositiva se muestran algunos mtodos de cadena comunes, incluidos:
concat()
w i n
Ed
length()
substring()
toUpperCase()
Para ver qu otros mtodos se pueden usar en un objeto String, consulte la documentacin de
la API.
La salida del programa es:
string3: HelloWorld
Length: 5
Sub: Hello
Upper: HELLOWORLD
Nota: String es una clase, no un tipo primitivo. Las instancias de la clase String representan
secuencias de caracteres Unicode.

Programacin Java SE 7 2-13


if else

1 public class IfElse {


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

i n Msalida del cdigo en la diapositiva es la siguiente:


La
w
Ed False

Programacin Java SE 7 2-14


Operadores lgicos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Operadores de igualdad y relacionales


== Igual que
!= Distinto de
> Mayor que
>= Mayor o igual que
< Menor que
e to
<= Menor o igual que
e n s
Operadores condicionales elic
a b l
&& AND condicional
fer
|| OR condicional a n s
?: Ternario (versin abreviada de la sentencia if-then-else) o n -tr
Operador de comparacin de tipos s an
) a ide
hcon
instanceof Compara un objeto m unutipo especificado
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
e
i ( se muestra un resumen de los operadores lgicos y condicionales en Java.
a v
En la diapositiva
M ar
win
Ed

Programacin Java SE 7 2-15


Matrices y bucle for-each
1 public class ArrayOperations {
2 public static void main(String args[]){
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Programacin Java SE 7 2-16


Bucle for

1 public class ForLoop {


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Programacin Java SE 7 2-17


Bucle while

1 public class WhileLoop {


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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);
}
}

Programacin Java SE 7 2-18


Sentencia switch de cadena
1 public class SwitchStringStatement {
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 public static void main(String args[]){


3
4 String color = "Blue";
5 String shirt = " Shirt";
6
7 switch (color){
8 case "Blue":
9 shirt = "Blue" + shirt;
e to
10 break;
e n s
ic
11 case "Red":
12 shirt = "Red" + shirt;
b l el
13 break;
fe r a
14 default:
a n s
15 shirt = "White" + shirt;
o n -tr
an
16 }
17
s
ha uide
18 System.out.println("Shirt type: " + shirt);
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
ara
Este ejemplo muestra una sentencia switch en Java con un objeto String. Antes de la versin

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.

Programacin Java SE 7 2-19


Convenciones de nomenclatura Java

Los nombres de clases son nombres en


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class CreditCard { formato CamelCase en maysculas.


2 public int VISA = 5001;
3 public String accountName; Las constantes se deben declarar con
todas las letras en maysculas.
4 public String cardNumber;
5 public Date expDate; Los nombres de variables son breves,
pero significativos y tienen formato
6 CamelCase en minsculas.
7 public double getCharges(){
e to
8 // ...
e n s
9 }
elic
10
a b l
fe r
11 public void disputeCharge(String chargeId, float amount){
a n s
12 // ...
o n -tr
an
13 }
Los mtodos deben ser
14} verbos en formato s
ha uide
CamelCase en minsculas.
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

M ara
Los nombres de clases deben ser nombres con maysculas y minsculas, con la primera
letra mayscula y la primera letra de cada palabra interna en maysculas. A este enfoque se
w i n le conoce como "CamelCase en maysculas".
Ed Los mtodos deben ser verbos con maysculas y minsculas, con la primera letra en
minscula y la primera letra de cada palabra interna en maysculas. A esto se le conoce
como "CamelCase en minsculas".
Los nombres de variables deben ser cortos, pero significativos. La eleccin de un nombre
de variable debe ser mnemotcnica: diseada para indicar al observador casual su
finalidad.
Los nombres de variables de un carcter se deben evitar, excepto como variables
"desechables" temporales.
Las constantes se deben declarar con todas las letras en maysculas.
Para obtener el documento completo Code Conventions for the Java Programming Language
(Convenciones de cdigo para el lenguaje de programacin Java), vaya a
http://www.oracle.com/technetwork/java/codeconv-138413.html.

Programacin Java SE 7 2-20


Una clase Java simple: Employee

Una clase Java se suele usar para representar un concepto.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Programacin Java SE 7 2-21


Mtodos de la clase Employee

Cuando una clase tiene campos de datos, una prctica habitual


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

consiste en proporcionar mtodos para almacenar datos (mtodos


setter) y recuperar datos (mtodos getter) de los campos.

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.

Programacin Java SE 7 2-22


Creacin de una instancia de un objeto

Para crear una instancia (objeto) de la clase Employee, utilice


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

la palabra clave new.


/* In some other class, or a main method */
Employee emp = new Employee();
emp.empId = 101; // legal if the field is public,
// but not good OO practice
e to
emp.setEmpId(101); // use a method instead
e n s
emp.setName("John Smith");
elic
emp.setSsn("011-22-3467"); a b l
fe r
emp.setSalary(120345.27);
a n s
En este fragmento de cdigo Java, crea onuna instancia de -tr
n
a al nuevo objeto a
la clase Employee y asigna la referencia
a s
h uide
una variable denominada emp. )
c o m tG
A continuacin, asigna
il enal objeto Employee.
valores
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
(e ma use
v i
Creacin
a rade una instancia de la clase Employee
M
Para utilizar la clase Employee para incluir informacin de un empleado, debe asignar memoria
winal objeto Employee y llamar a un mtodo constructor de la clase. Se crea una instancia de un
Ed objeto al usar la palabra clave new. A todos los campos declarados en la clase se les proporciona
espacio de memoria y se inicializan en sus valores por defecto. A continuacin, se llama al
mtodo constructor. Si la asignacin de memoria y el constructor son correctos, se devuelve
como resultado una referencia al objeto. En el ejemplo de la diapositiva, la referencia se asigna a
una variable denominada emp.
Para almacenar valores (datos) en la instancia de objeto Employee, simplemente podra asignar
valores a cada uno de los campos. Sin embargo, esto no es recomendable y niega el principio de
la encapsulacin. En su lugar, debera usar mtodos para definir el valor de cada uno de los
campos de datos. Posteriormente en esta leccin, examinar la restriccin de acceso a los
campos para fomentar la encapsulacin.
Una vez que todos los campos de datos estn definidos con valores, tiene una instancia de un
objeto Employee con un empId con un valor 101, name con la cadena John Smith, Social
Security Number (ssn) definida en 011-22-3467 y salary con el valor 120,345.27.

Programacin Java SE 7 2-23


Constructores
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class Employee {


public Employee() { Un constructor sin argumentos
(no-arg) simple.
}
}

Employee emp = new Employee(); e to


e n s
l e lic
El valor que devuelve el constructor es una referencia r a ba un
objeto Java del tipo creado. sf e
a n
Los constructores aceptan el uso de parmetros. 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
e
i ( es un pseudomtodo que crea un objeto. En el lenguaje de programacin Java,
a v
Un constructor
M
los ar
constructores son mtodos con el mismo nombre que su clase, que se usan para crear una
wininstancia de un proyecto. A los constructores se les llama mediante la palabra clave new.
Ed Los constructores se tratan con ms detalle en la leccin titulada Encapsulacin y creacin de
subclases.

Programacin Java SE 7 2-24


Sentencia package

La palabra clave package se usa en Java para agrupar


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

clases. Un paquete se implanta como carpeta y, al igual que


una carpeta, proporciona un espacio de nombre a una clase.
vista de espacio de nombre vista de carpeta
com.example.domain +com
|_+example
e to
Employee |_+domain e n s
el ic
|_+Employee.java
a b l
|_+Manager.java fe r
Manager
a n s
o n -tr
a n s iempre.
s deben declar ar
h a
s si e d
) queG e
m teu
o a
ilc Ldosent
p
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
EnM
ara
Paquetes
Java, un paquete es un grupo de tipos (de clase). Solo puede haber una declaracin package
i n
w para una clase.
Ed Los paquetes van ms all de ser algo til. Los paquetes crean un espacio de nombre, una
recopilacin lgica de cosas, como una jerarqua de directorios.
Es una buena prctica utilizar siempre una declaracin package. La declaracin package
siempre est en la parte superior de la clase.

Programacin Java SE 7 2-25


Sentencias import

La palabra clave import se usa para identificar a las clases a las


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

que desea hacer referencia en la clase.


La sentencia import ofrece un mtodo prctico para
identificar clases a las que desea hacer referencia en la clase.
import java.util.Date;

Puede importar una nica clase o un paquete completo:


e to
import java.util.*; e n s
elic
Puede incluir varias sentencias import: a b l
fe r
a n s
-tr
import java.util.Date;
o n
an
import java.util.Calendar;

Se aconseja usar todo el paquete s


hay elunombre de de clase en
m ) i
lugar del carcter comodn
c o * parat evitar
n G conflictos de nombres
de clase.
m ail tude
@ g sS
a i
Copyright
r t hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
m a u s
i( e
a v
M arhacer referencia a una clase usando su espacio de nombre cualificado en las aplicaciones,
Importaciones
Podra
wincomo en el siguiente ejemplo:
Ed java.util.Date date = new java.util.Date();
Sin embargo, esto le supondra tener que introducir muchos datos. En lugar de esto, Java ofrece
la sentencia import para permitirle declarar que desea hacer referencia a una clase de otro
paquete.
Nota: se recomienda usar el paquete especfico totalmente cualificado y un nombre de clase para
evitar la confusin cuando haya dos clases con el mismo nombre, como en el siguiente ejemplo:
java.sql.Date y java.util.Date. La primera es una clase Date, que se usa para
almacenar un tipo Date en una base de datos y java.util.Date es una clase Date de uso
general. Resulta que java.sql.Date es una subclase de java.util.Date. Esto se trata con
mayor detalle ms adelante en el curso.
Nota: los IDE modernos, como NetBeans y Eclipse, buscan de forma automtica y agregan
sentencias import. En NetBeans, por ejemplo, use la secuencia de teclas Ctrl + Mays + I para
corregir las importaciones del cdigo.

Programacin Java SE 7 2-26


Ms informacin sobre import
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las sentencias import van despus de la declaracin del


paquete y antes de la declaracin de la clase.
No es necesaria una sentencia import.
Por defecto, su clase siempre importa java.lang.*
No es necesario que importe clases que estn en el
mismo paquete: e to
e n s
elic
package com.example.domain;
a b l
import com.example.domain.Manager; // unused import
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
Los detalles sobre este paquete y sus clases se tratan ms adelante en el curso.
M
w i n
Ed

Programacin Java SE 7 2-27


Java se transfiere por valor
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El lenguaje Java (a diferencia de C++) usa la transferencia por valor


para pasar todos los parmetros.
Para visualizar esto con primitivos, tenga en cuenta lo siguiente:

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.

Programacin Java SE 7 2-28


Transferencia por valor para
referencias de objetos
En el caso de objetos Java, el valor del lado derecho de una
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

asignacin es una referencia a la memoria que almacena un


objeto Java.
Employee x = new Employee();
Employee y = x;
La referencia es alguna direccin de la memoria.
e to
42 direccin de memoria = 42 e n s
elic
x Objeto a b l
y = x; fe r
Employee
a n s
42
o n -tr
y s an
) ha uide
Tras la asignacin, el valor c o my estelGmismo que el valor de x:
de
una referencia al mismo a e n
il objetodEmployee.
@ 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 (objetos Java, el valor de una referencia de objeto es el puntero de memoria a la
a
En el casovde
M ar del objeto Employee creado.
instancia
winAl asignar el valor de x a y, no est creando un nuevo objeto Employee, sino una copia del valor
Ed de la referencia.
Nota: un objeto es una instancia de clase o una matriz. Los valores de referencia (referencias)
son punteros a esos objetos y una referencia null especial, que no hace referencia a ningn
objeto.

Programacin Java SE 7 2-29


Objetos transferidos como parmetros

Siempre que se cree un nuevo objeto, se crea una nueva


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

referencia. Considere los siguientes fragmentos de cdigo:


Employee x = new Employee();
foo(x);

public void foo(Employee e) {


e = new Employee();
e to
e.setSalary (1_000_000_00); // What happens to x here?
e n s
}
l e lic
El valor de x no cambia como resultado de la llamada r a bal
sf e
mtodo foo: a n
Objeto -tr
x 42
Employee
n on
s a
) h a i d e
e 99
o m tG u
Objeto
il c e n Employee
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 see
Siempre
r a v
que crea un nuevo valor, como la sentencia e = new Employee(); en el mtodo
a
M se crea un nuevo objeto y se cambia el valor del parmetro por el nuevo valor.
foo,
i n
w El valor de x simplemente se copia en el parmetro para el mtodo, por lo que x no cambia
Ed durante y tras la ejecucin del mtodo foo.
Qu valor se devuelve de x.getSalary(); tras la llamada a foo(x);?
Como se muestra, el valor de la referencia x no cambia y el valor devuelto sera el mismo que
antes de la llamada. Esto se debe a que se ha usado la palabra clave new para crear un nuevo
objeto y se ha asignado esa instancia de objeto a e. Sea cual sea el valor que e tuviera antes (la
referencia a x) ahora se sobrescribe.
El mtodo setSalary funciona en la referencia e, no en la referencia de objeto transferida al
mtodo.
Si fuera a eliminar la sentencia, e = new Employee();, el mtodo e.setSalary estara
funcionando en la referencia x y el empleado representado por la variable x estara ganando
mucho dinero.
Nota: las ubicaciones de memoria 42 y 99 solo se muestran con fines ilustrativos.

Programacin Java SE 7 2-30


Cmo compilar y ejecutar

Los archivos de clase Java se deben compilar antes de ejecutarse.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Para compilar un archivo de origen Java, utilice el compilador Java (javac).

javac classpath <path to other classes> -d <complier


output path> <path to source>.java

Puede utilizar la variable de entorno CLASSPATH al directorio superior a


la ubicacin de la jerarqua de paquetes.
e to
Tras compilar el archivo .java de origen, se genera un archivo e n s
elic
.class.
a b l
Para ejecutar la aplicacin Java, ejectela con el intrprete Java
fe r
(java):
a n s
o n -tr
java classpath <path to other classes>
a n <package
name>.<classname>
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
a v
M
La
ar
CLASSPATH
variable CLASSPATH la usa tanto el compilador Java como el intrprete Java (tiempo de
winejecucin).
Ed classpath puede incluir:
Una lista de nombres de directorio (separados por puntos y comas en Windows y dos
puntos en UNIX)
- Las clases estn en un rbol de paquete en relacin con los directorios de la lista.
- classpath incluye el directorio de trabajo actual (.) por defecto.
Un nombre de archivo .zip o .jar que est totalmente cualificado con su nombre de ruta
de acceso
- Las clases de estos archivos se deben comprimir con los nombres de ruta de acceso
que se derivan de los directorios formados por sus nombres de paquete.
Nota: el directorio que contiene el nombre raz de un rbol de paquete se debe agregar a
classpath. Considere la accin de colocar la informacin de classpath en la ventana de
comandos o incluso en el comando Java, en lugar de codificarla en el entorno.

Programacin Java SE 7 2-31


Compilacin y ejecucin: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Suponga que la clase que aparece en las notas est en el


directorio D:\test\com\example:
javac d D:\test D:\test\com\example\HelloWorld.java

Para ejecutar la aplicacin, utilice el intrprete y el nombre de


clase totalmente cualificado:
e to
java classpath D:\test com.example.HelloWorld e n s
el ic
Hello World!
a b l
s f er
java classpath D:\test com.example.HelloWorld
- t r an Tom
Hello Tom!
n on
s a
La ventaja de un IDE como NetBeans
) a
h es i e la gestin del
dque
classpath, la compilacin yolamejecucin u
G de la aplicacin Java se
il c n t
manejan mediante la a
m
herramienta.
t u de
@ g sS
a i
Copyright
r t hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
m a u s
i( e
a v
M
Tenga
aren cuenta la siguiente clase simple de un archivo denominado HelloWorld.java en el
Ejemplo

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] + "!");
}
}
}

Programacin Java SE 7 2-32


Cargador de clase Java
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Durante la ejecucin de un programa Java, Java Virtual


Machine carga los archivos de clase Java compilados con una
clase Java propia denominada el cargador de clases
(java.lang.ClassLoader).
Al instanciar un objeto, se llama al cargador de clases:
public class Test {
e to
public void someOperation() {
e n s
Employee e = new Employee();
elic
//... Al cargador de clases se le llama
a b l
para "cargar" esta clase en la fe r
}
memoria. a n s
}
o n -tr
Test.class.getClassLoader().loadClass("Employee"); 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
e
i (el uso del cargador de clases es totalmente invisible para el usuario. Puede ver los
a v
Normalmente,
M ar del cargador de clases usando el indicador -verbose al ejecutar la aplicacin. Por
resultados
winejemplo:
Ed java verbose classpath D:\test com.example.HelloWorld
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
... and many more

Programacin Java SE 7 2-33


Recoleccin de basura
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cuando se crea una instancia de un objeto con la palabra


clave new, se asigna memoria al objeto. El mbito de una
referencia de objeto depende de si se ha instanciado el objeto:
public void someMethod() {
Employee e = new Employee();
// operations on e
El mbito del objeto e finaliza aqu.
e to
}
e n s
Cuando finaliza someMethod, ya no se puede acceder ea lic
l
la memoria a la que hace referencia e. rab fe
El recolector de basura de Java reconoce cundo n s ya no se
n - tra
puede acceder a una instancia y libera
a noautomticamente
esta memoria.
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
e
ide( recoleccin de basura de Java se puede ajustar en funcin del tipo de aplicacin
a
El esquema
r v
M
que a
est creando. Para obtener ms informacin, debera realizar el curso de Oracle University
w inAjuste de rendimiento de Java y optimizacin (D69518GC10).
Ed

Programacin Java SE 7 2-34


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Crear clases Java simples
Crear variables primitivas
Manipular cadenas
Usar las sentencias de bifurcacin if-else y switch
Iterar con bucles e to
Crear matrices e n s
elic
Usar campos, constructores y mtodos Java a b l
Usar las sentencias package e import s f er
an -tr
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
w i n
Ed

Programacin Java SE 7 2-35


Prueba

En el siguiente fragmento, qu tres problemas puede identificar?


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Programacin Java SE 7 2-36


Prueba

Con la clase Employee definida en esta leccin, determine el


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

valor de e.name en el siguiente fragmento:


public Employee changeName (Employee e, String name) {
e.name = name;
return (e);
}
//... in another class
Employee e = new Employee();
e to
e.name = "Fred";
e n s
elic
e = changeName("Bob", e);
a b l
System.out.println (e.getName());
fe r
a. Fred a n s
b. Bob o n -tr
c. s an
null
) ha uide
d. Objeto String vaco 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

Programacin Java SE 7 2-37


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En el siguiente fragmento, cul es el resultado?


public float average (int[] values) {
float result = 0;
for (int i = 1; i < values.length; i++)
result += values;
return (result/values.length);
}
e to
int[] nums = {100, 200, 300};
e n s
System.out.prinln (average(avg));
elic
a b l
a. 100 r
n s fe
b. 150.33
-tr a
c. 166.67 o n
s an
d. 200
) 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

Programacin Java SE 7 2-38


Visin general de la prctica 2-1:
Creacin de clases Java
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Creacin de una clase Java con NetBeans IDE
Creacin de una clase Java con un mtodo main
Escritura de cdigo en el cuerpo del mtodo main para
crear una instancia del objeto Employee e imprimir
valores de la clase en la consola e to
e n s
Compilacin y prueba de la aplicacin mediante lic
e
NetBeans IDE abl 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

Programacin Java SE 7 2-39


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Encapsulacin y creacin de subclases

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

Al finalizar esta leccin, debera estar capacitado para lo


siguiente:
Usar la encapsulacin en el diseo de clases Java
Modelar problemas de negocio con clases Java
Convertir las clases en inmutables
Crear y usar subclases Java
e to
Sobrecargar mtodos e n s
elic
Usar mtodos de argumentos variables
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

Programacin Java SE 7 3-2


Encapsulacin

El trmino encapsulacin significa incluir en una cpsula o


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

envolver algo alrededor de un objeto para cubrirlo. En la


programacin orientada a objetos, la encapsulacin cubre, o
envuelve, el funcionamiento interno de un objeto Java.
El usuario del objeto no puede ver las variables de datos o
los campos.
Los mtodos, las funciones de Java, proporcionan un e to
n s
servicio explcito al usuario del objeto, pero ocultan la
e l ice
implantacin.
r a bl
Mientras los servicios no cambien, la implantacin n s fese
a
n-tr
puede modificar sin que esto afecte al usuario.
no
a
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
M ara
El trmino encapsulacin tiene la siguiente definicin en el glosario de referencia de tecnologa
Java:
i n
w La localizacin del conocimiento en un mdulo. Debido a que los objetos encapsulan datos y la
Ed implantacin, el usuario de un objeto puede verlo como una caja negra que proporciona servicios.
Se pueden agregar, suprimir o cambiar mtodos y variables de instancia, pero si los servicios que
proporciona el objeto no varan, el cdigo que usa el objeto puede seguir usndolo sin tenerse
que volver a escribir.
Una analoga de la encapsulacin sera el volante de un vehculo. Al conducir el vehculo, tanto si
es el suyo, el de un amigo o uno de alquiler, normalmente no se planteara cmo el volante
implanta una funcin de giro a la derecha o a la izquierda. El volante podra estar conectado a las
ruedas delanteras de varias formas: mecanismo de rtula, cremallera y pin o mediante algn
otro extrao juego de servomecanismos.
Siempre y cuando la direccin del vehculo sea la deseada al girar, el volante encapsular las
funciones necesarias. No tendr que preocuparse por la implantacin.

Programacin Java SE 7 3-3


Encapsulacin: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Qu datos y operaciones encapsulara en un objeto que


represente a un empleado?

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.

Programacin Java SE 7 3-4


Encapsulacin: datos privados,
mtodos pblicos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una forma de ocultar los detalles de implantacin es declarar


todos los campos como private.
1 public class CheckingAccount {
La declaracin de campos como
2 private int custID; private evita que se pueda acceder
3 private String name; directamente a estos datos desde una
4 private double amount; instancia de clase.
// illegal!
5 public CheckingAccount { ca.amount =
e to
6 } 1_000_000_000.00;
e n s
7 public void setAmount (double amount) {
elic
a b l
8 this.amount = amount;
fe r
9 }
a n s
10 public double getAmount () {
o n -tr
11 return amount;
s an
12 }
) ha uide
13 m tG
//... other public accessor and mutator methods
c o
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 ejemplo, los campos custID, name y amount ahora estn marcados como private, lo

i n M
que hace que sean invisibles fuera de los mtodos de la propia clase.
w
Ed

Programacin Java SE 7 3-5


Modificadores de acceso pblicos y privados

La palabra clave public, que se aplica a campos y mtodos,


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

permite a cualquier clase de cualquier paquete acceder al


campo o al mtodo.
La palabra clave private, que se aplica a campos y mtodos,
permite el acceso solo a otros mtodos de la propia clase.
CheckingAccount chk = new CheckingAccount ();
chk.amount = 200; // Compiler error amount is a private field
e to
chk.setAmount (200); // OK
e n s
elic
a b l
La palabra clave private tambin se puede aplicar aeun
f r
mtodo para ocultar un detalle de implantacin. an s
o n -tr
// Called when a withdrawal exceeds the available
a n funds
private void applyOverdraftFee () { as e
h
) Gu i d
amount += fee;
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
r a v
in Ma
w
Ed

Programacin Java SE 7 3-6


Revisin de la clase Employee

La clase Employee utiliza actualmente el acceso de tipo


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public para todos sus campos. Para encapsular los datos,


convierta los campos en private.

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

Programacin Java SE 7 3-7


Asignacin de nombres de mtodos:
recomendaciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Si bien los campos ahora estn ocultos mediante el acceso


private, hay algunos problemas con la clase Employee actual.
Los mtodos setter (actualmente acceso de tipo public)
permiten a cualquier otra clase cambiar el ID, el SSN y el
salario (aumentarlo o reducirlo).
La clase actual no representa realmente las operaciones to
definidas en el diseo de la clase Employee original. n s e
ic e
Dos recomendaciones para los mtodos:
b l el
Oculte todos los detalles de implantacin que pueda. f er a
an
Asigne al mtodo un nombre que identifique claramente
s su uso
n - t r
o funcionalidad. o
a se han realizado n
En el modelo original de la clase aEmployee
s e
h uiydsubida
las operaciones de cambiom de) nombre de salario.
i l co ent G
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
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.

Programacin Java SE 7 3-8


Clase Employee refinada

1 package com.example.domain;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 public class Employee {


3 // private fields ...
4 public Employee () {
5 }
6 // Remove all of the other setters
7 public void setName(String newName) {
Paso 2 de la
8 if (newName != null) {
encapsulacin: estos
e to
9 this.name = newName; nombres de mtodos
e n s
10 }
el
tienen sentido en el ic
a b l
contexto de una
11 }
r
clase Employee.
fe
12
a n s
13 public void raiseSalary(double increase)
o n -t{r
14 this.salary += increase;
s an
15 }
) ha uide
16 }
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
Los mtodos setter actuales de la clase permiten a cualquier clase que use una instancia de
Employee modificar los campos ID, Salary y SSN del objeto. Desde un punto de vista
w i n
empresarial, no deseara que estas operaciones se realizasen en un objeto de empleado. Una
Ed vez creado el empleado, estos campos deben ser inmutables (no se permiten cambios).
El modelo Employee, segn la definicin de la diapositiva titulada Encapsulacin: ejemplo solo
inclua dos operaciones: una para cambiar el nombre de un empleado (como resultado de un
matrimonio o un divorcio) y otra para aumentar el salario de un empleado.
Para refinar la clase Employee, el primer paso es eliminar los mtodos setter y crear mtodos
que identifiquen claramente su finalidad. Aqu hay dos mtodos, uno para cambiar el nombre de
un empleado (setName) y el otro para aumentar el salario de un empleado (raiseSalary).
Tenga en cuenta que la implantacin del mtodo setName prueba el parmetro de cadena
transferido para asegurarse de que la cadena no es un valor null. El mtodo puede realizar ms
comprobaciones si es necesario.

Programacin Java SE 7 3-9


Haga que las clases sean lo ms
inmutables posibles
Paso 3 de la
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 package com.example.domain; encapsulacin: elimine el


2 public class Employee { constructor por defecto;
implante un constructor
3 // private fields ... para definir el valor de
4 // Create an employee object todos los campos.
5 public Employee (int empId, String name,
6 String ssn, double salary) {
7 this.empId = empId;
e to
8 this.name = name;
e n s
9 this.ssn = ssn;
elic
10 this.salary = salary; a b l
fe r
11 }
a n s
12
o n -tr
an
13 public void setName(String newName) { ... }
14 s
ha uide
15
m tG
public void raiseSalary(double increase) { ... })
c o n
16 }
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
Recomendacin: inmutabilidad
Mltimo, dado que la clase ya no tiene mtodos setter, necesita un modo de definir el valor
Por
i n
w inicial de los campos. La respuesta es transferir el valor de cada campo en la construccin del
Ed objeto. Al crear un constructor que tome todos los campos como argumentos, puede garantizar
que una instancia de Employee se rellene totalmente con datos antes de convertirse en un objeto
de empleado vlido. Este constructor sustituye al constructor sin argumentos.
Con los permisos adecuados, el usuario de su clase podra transferir valores null y, por ello,
debera determinar si desea comprobar esos valores en el constructor. En lecciones posteriores
se abordarn las estrategias para manejar esos tipos de situaciones.
La eliminacin de los mtodos setter y la sustitucin del constructor sin argumentos tambin
garantiza que los campos Employee ID y Social Security Number (SSN) de la instancia de
Employee sean inmutables.

Programacin Java SE 7 3-10


Creacin de subclases

Ha creado una clase Java para modelar los datos y las


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

operaciones de un objeto Employee. Ahora suponga que


deseara especializar los datos y las operaciones para describir
un objeto Manager.

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.

Programacin Java SE 7 3-11


Subclases
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En un lenguaje orientado a los objetos como Java, las


subclases se usan para definir una nueva clase en relacin
con una existente.

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.

Programacin Java SE 7 3-12


Subclase Manager

1 package com.example.domain;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 public class Manager extends Employee {


3 private String deptName;
4 public Manager (int empId, String name,
5 String ssn, double salary, String dept) {
6 super (empId, name, ssn, salary);
7 this.deptName = dept; La palabra clave super se usa
para llamar al constructor de la
8 }
clase principal. Debe ser la
e to
9 primera sentencia del
e n s
10 public String getDeptName () { constructor.
elic
11 return deptName; a b l
fe r
12 }
a n s
13 // Manager also gets all of Employee's public methods!
o n -tr
an
14 }
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
Sintaxis Java para las subclases
Mpalabra clave extends se usa para crear una subclase.
La
i n
w La clase Manager, al ampliar la clase Employee, hereda todos los mtodos y los campos de
Ed datos que no sean privados de Employee. Despus de todo, si un superior tambin es un
empleado, lo lgico es que Manager tenga los mismos atributos y operaciones que Employee.
Observe que la clase Manager declara su propio constructor. Los constructores no se heredan de
la clase principal. En la siguiente diapositiva se ofrecen ms detalles sobre este aspecto.
El constructor que Manager declara en la lnea 4 llama al constructor de su clase principal,
Employee, mediante la palabra clave super. Esto define el valor de todos los campos
Employee: id, name, ssn y salary. Manager es una especializacin de Employee, por lo que
para crear un elemento Manager se necesita un nombre de departamento, que se asigna al
campo deptName de la lnea 7.
Qu otros mtodos podra desear en un modelo de Manager? Tal vez desee un mtodo que
agregue un objeto Employee a este elemento Manager. Puede utilizar una matriz o una clase
especial denominada recopilacin para realizar un seguimiento de los empleados a los que
supervisa el superior. Para obtener informacin sobre las recopilaciones, consulte la leccin
titulada Elementos genricos y recopilaciones.

Programacin Java SE 7 3-13


Los constructores no se heredan
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Si bien una subclase hereda todos los mtodos y campos de


una clase principal, no hereda los constructores. Hay dos
formas de obtener un constructor:
Escribir su propio constructor.
Usar el constructor por defecto.
Si no declara un constructor, se le proporcionar un e to
constructor sin argumentos por defecto. e n s
le
Si declara su propio constructor, el constructor por defecto
lic
a b
ya no se proporcionar. fer s
- t r an
no n
a
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
Constructores en subclases
M una de las subclases hereda los mtodos y los campos no privados de su principal
Cada
i n
w (superclase). Sin embargo, la subclase no hereda el constructor de su principal. Debe
Ed proporciona un constructor.
La especificacin de lenguaje Java incluye la siguiente descripcin:
Las declaraciones de constructores no son miembros. Nunca se heredan y, por tanto, no estn
sujetas a ocultacin o sustitucin.

Programacin Java SE 7 3-14


Uso de super

Para crear una instancia de una subclase, normalmente resulta


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

ms fcil llamar al constructor de la clase principal.


En su constructor, Manager llama al constructor de
Employee.
super (empId, name, ssn, salary);

La palabra clave super se usa para llamar al constructor de to


un principal. n s e
Debe ser la primera sentencia del constructor. e l ice
Si no se proporciona, se inserta una llamada por defecto r a bal
n s fe
super().
n - tra
La palabra clave super tambin se puede
a no usar para llamar al
mtodo de un principal o para acceder
a s adeun campo (no
privado) de un principal. ) h ui
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 clase Manager declara su propio constructor y llama al constructor de la clase principal con la

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.

Programacin Java SE 7 3-15


Creacin de un objeto Manager

La operacin de creacin de un objeto Manager es similar a la


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

de creacin de un objeto Employee:


Manager mgr = new Manager (102, "Barbara Jones",
"107-99-9078", 109345.67, "Marketing");

Todos los mtodos Employee estn disponibles para to


Manager: n s e
ic e
mgr.raiseSalary (10000.00); b l el
fe ra
a n s
La clase Manager define un nuevo mtodo
o n -trpara obtener
el valor Department Name: n
s a
String dept = mgr.getDeptName(); ) 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
e
i ( el archivo Manager.java no contiene todos los mtodos de la clase
A pesar a
devque
M ar
Employee.java (explcitamente), se incluyen en la definicin del objeto. Por tanto, tras crear
w i nuna instancia de un objeto Manager, puede usar los mtodos declarados en Employee.
Ed Tambin puede llamar a mtodos que sean especficos de la clase Manager.

Programacin Java SE 7 3-16


Qu es el polimorfismo?
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El trmino polimorfismo, en su definicin estricta, significa


muchas formas.
Employee emp = new Manager();

Esta asignacin es perfectamente vlida. Un empleado


puede ser un superior. to
Sin embargo, el siguiente cdigo no se compila: n s e
ic e
b l el
emp.setDeptName ("Marketing"); // compiler error!
fe r a
a n s
-tr solo como un
El compilador Java reconoce la variable nemp
o
n Employee no
objeto Employee. Debido a que laaclase
s
ha muestra
tiene un mtodo setDeptName, ide un error.
m ) Gu
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
En lenguajes de programacin orientados a objetos como Java, polimorfismo es la capacidad de
a r
n Mhacer referencia a un objeto con su formato real o con un formato principal.
wi Esto resulta particularmente til al crear un mtodo de negocio de uso general. Por ejemplo,
Ed puede aumentar el salario de cualquier objeto Employee (principal o secundario) con solo
transferir la referencia de objeto a un mtodo de negocio de uso general que acepte un objeto
Employee como argumento.

Programacin Java SE 7 3-17


Sobrecarga de mtodos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Su diseo puede llamar a varios mtodos de la misma clase


con el mismo nombre, pero con distintos argumentos.
public void print (int i)
public void print (float f)
public void print (String s)
Java le permite reutilizar un nombre de mtodo para ms to
de un mtodo. n s e
Se aplican dos reglas a los mtodos sobrecargados: le li
ce
ra b
Las listas de argumentos deben ser distintas. f e
Los tipos de retorno pueden variar. t r a ns
n o -
s de
a nvlido:
Por tanto, el siguiente ejemplo no es
public void print (int i) h
) Gui a
o m
ilc dent
public String print (int i)
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
e
i ( disear mtodos con la misma finalidad (nombre de mtodo), como print,
a
Puederquevdesee
M
paraaimprimir varios tipos distintos. Podra disear un mtodo para cada tipo:
n
wi printInt(int i)
E d
printFloat(float f)
printString(String s)
Sin embargo, esto sera tedioso y no estara muy orientado a los objetos. En su lugar, puede
crear un nombre de mtodo reutilizable y simplemente cambiar la lista de argumentos. Este
proceso se denomina sobrecarga.
Con los mtodos de sobrecarga, las listas de argumentos deben ser distintas: en orden, nmero o
tipo. Asimismo, los tipos de retorno pueden ser distintos. Sin embargo, no se permiten dos
mtodos con la misma lista de argumentos que solo difieran en el tipo de retorno.

Programacin Java SE 7 3-18


Mtodos con argumentos variables

Una variacin a la sobrecarga de mtodos es cuando necesita


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

un mtodo que tome cualquier nmero de argumentos del


mismo tipo:
public class Statistics {
public float average (int x1, int x2) {}
public float average (int x1, int x2, int x3) {}
public float average (int x1, int x2, int x3, int x4) {}
e to
}
e n s
Estos tres mtodos sobrecargados comparten la misma le lic
a b
funcionalidad. Estara bien reducir estos mtodosfear uno
s
solo. tran n -
o
an
Statistics stats = new Statistics ();
float avg1 = stats.average(100, 200); s
ha uide
float avg2 = stats.average(100, 200, 300);
m tG )
float avg3
c o
= stats.average(100, 200, 300, 400);
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
Mtodos con un nmero de variable del mismo tipo
Mejemplo de sobrecarga es cuando necesita proporcionar un juego de mtodos sobrecargados
Un
i n
w que difieran en el nmero de argumentos del mismo tipo. Por ejemplo, suponga que desea contar
Ed con mtodos para calcular una media. Tal vez desee calcular las medias para 2, 3 o 4 (o ms)
enteros.
Cada uno de estos mtodos realiza un tipo similar de clculo, la media de argumentos
transferidos, como en este ejemplo:
public class Statistics {
public float average(int x1, int x2) { return (x1 + x2) / 2; }
public float average(int x1, int x2, int x3) {
return (x1 + x2 + x3) / 3;
}
public float average(int x1, int x2, int x3, int x4) {
return (x1 + x2 + x3 + x4) / 4;
}
}
Java proporciona una sintaxis til para reducir estos tres mtodos a solo uno y proporcionar
cualquier cantidad de argumentos.

Programacin Java SE 7 3-19


Mtodos con argumentos variables

Java proporciona una funcin denominada varargs o


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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);
}
}

Programacin Java SE 7 3-20


Herencia nica
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El lenguaje de programacin Java permite que una clase solo


ample otra clase. A esto se le denomina herencia nica.

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.

Programacin Java SE 7 3-21


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Crear clases Java simples
Usar la encapsulacin en el diseo de clases Java
Modelar problemas de negocio con clases Java
Convertir las clases en inmutables
Crear y usar subclases Java e to
e n s
Sobrecargar mtodos lic
Usar mtodos de argumentos variables a b le
r e
a n sf
n -tr
o
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

Programacin Java SE 7 3-22


Prueba

Teniendo en cuenta el diagrama de la diapositiva titulada


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Herencia nica y las siguientes sentencias Java, cul es la


sentencia que no se compila?

Employee e = new Director();


Manager m = new Director();
e to
Admin a = new Admin();
e n s
el ic
a. a b l
e.addEmployee (a);
s f er
b. m.addEmployee(a); - t r an
n on
c. m.approveExpense(100000.00);
s de a
m G u i d. ) ha
Ninguna de ellas se compila.
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
a v
M ar
d win
E

Programacin Java SE 7 3-23


Prueba
Tenga en cuenta las siguientes clases que no se compilan:
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class Account {


private double balance;
public Account(double balance) { this.balance = balance; }
//... getter and setter for balance
}
public class Savings extends Account {
private double interestRate;
public Savings(double rate) { interestRate = rate; }
e to
}
e n s
Con qu correccin se podran compilar estas clases?
le lic
a. Agregar un constructor sin argumentos a Savings. a b
s f er
b. Llamar al mtodo setBalance de Account
t r n
adesde
Savings. on -
n
a apublic.
c. Cambiar el acceso de interestRate
a s
h uide
)
d. Agregar un constructor aoSavings
m t G que llame al
c n
ail con
constructor de Account desuper.
@ 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

Programacin Java SE 7 3-24


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En cules de las siguientes declaraciones se demuestra la


aplicacin de unas convenciones de nomenclatura Java
correctas?
a. public class repeat { }
b. public void Screencoord (int x, int y){}
c. private int XCOORD; e to
e n s
d. public int calcOffset (int xCoord, int
le lic
yCoord) { } r a b
sf e
tr a n
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
w i n
Ed

Programacin Java SE 7 3-25


Prueba
Qu cambios realizara para convertir a esta clase en inmutable?
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

(Seleccione todas las respuestas posibles).


public class Stock {
public String symbol;
public double price;
public int shares;
public double getStockValue() { }
public void setSymbol(String symbol) { }
e to
public void setPrice(double price) { }
e n s
public void setShares(int number) { }
el ic
} a b l
s f er
a. Convertir los campos symbol, shares y price
- t r aenn private.
b. Eliminar setSymbol, setPrice y setShares. n on
c. Convertir el mtodo getStockValue s aen private.

h a
) symbol, i d e
d. Agregar un constructor que tome
o m G u shares y price
como argumentos. 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
r a v
in Ma
w
Ed

Programacin Java SE 7 3-26


Visin general de la prctica 3-1:
Creacin de subclases
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Aplicacin de los principios de encapsulacin a la clase
Employee que ha creado en la prctica anterior
Creacin de subclases de Employee, incluidas Manager,
Engineer y Administrative assistant (Admin)
Creacin de una subclase de Manager denominada e to
n s
Director ce i
Creacin de una clase de prueba con un mtodo b l el
f er a
main para probar las clases nuevas n s
n - tra
a no
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
Mara
w i n
Ed

Programacin Java SE 7 3-27


(Opcional) Visin general de la prctica 3-2:
Adicin de una clase Staff a una clase Manager
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Creacin de una matriz de Employees denominada
staff
Creacin de un mtodo para agregar un empleado al
elemento del superior staff
Creacin de un mtodo para eliminar un empleado del e to
elemento del superior staff 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

Programacin Java SE 7 3-28


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Diseo de clases 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
Mara
w i n
Ed
Objetivos

Al finalizar esta leccin, debera estar capacitado para lo siguiente:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Usar niveles de acceso: private, protected, el nivel por


defecto y public.
Sustituir mtodos
Sobrecargar constructores y otros mtodos de la forma
adecuada
Usar el operador instanceof para comparar tipos de objeto e to
e n s
Usar la llamada al mtodo virtual
le lic
Usar conversiones ascendentes y descendentes fer a b
Sustituir mtodos de la clase t r a ns
Object para mejorar o n -
la funcionalidad de la clase s an
a e ) h Guid
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
Mara
w i n
Ed

Programacin Java SE 7 4-2


Uso del control de acceso
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ha visto las palabras clave public y private. Hay cuatro niveles de


acceso que se pueden aplicar a los mtodos y los campos de datos.
En la siguiente tabla se muestra el acceso a un campo o mtodo
marcado con el modificador de acceso en la columna izquierda.
Modificador Misma clase Mismo Subclase de Universo
(palabra paquete otro paquete
clave) e to
e n s
private S
el ic
a b l
por defecto S S fe r
a n s
protected S S Sn*-t
r
o
S S s a n S S
public
h
) Gu a i d e
Las clases pueden ser por defecto c o m (sin modificador)
t o de tipo public.
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
a r a clave de modificador de acceso de esta tabla son private, protected y public.
Las palabras

i n M falta una palabra clave, se aplica el modificador de acceso por defecto.


Cuando
w La palabra clave private permite el mximo control de acceso a los campos y mtodos.
Ed Con private, solo se puede acceder a un campo de datos o mtodo de la misma clase Java.
La palabra clave public permite el mximo acceso a campos y mtodos, haciendo que se
pueda acceder a ellos en cualquier parte: en la clase, paquete, subclases y cualquier otra clase.
La palabra clave protected sea aplica para mantener el acceso en el paquete y la subclase.
Los campos y mtodos que usan protected se dice que permiten subclases.
*Nota: el tipo de acceso protected se ha ampliado a las subclases que residen en un paquete
distinto de la clase propietaria de la funcin protegida. Como resultado, los campos o los mtodos
protegidos permiten realmente un mayor acceso que los marcados con un control de acceso por
defecto. Debe usar el tipo de acceso de tipo protected cuando sea adecuado para una
subclase de una clase, pero no las clases no relacionadas.

Programacin Java SE 7 4-3


Control de acceso protegido: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Programacin Java SE 7 4-4


Sombra de campos: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Programacin Java SE 7 4-5


Control de acceso: recomendacin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una buena prctica al trabajar con campos es hacer que sean


tan poco accesibles como sea posible y especificar claramente
el uso de los campos en los mtodos.
1 package demo;
2 public class Foo3 {
3 private int result = 20;
4 protected int getResult() { result = value; }
e to
5 } e n s
elic
1 package test;
a b l
2 import demo.Foo3; fe r
a n s
-tr
3 public class Bar3 extends Foo3 {
4 private int sum = 10;
o n
5 public void reportSum() {
s an
6 sum += getResult();
) ha uide
7 }
c o m tG
8 } 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
En la diapositiva se muestra una versin ligeramente modificada del ejemplo con la palabra clave
protected. Si la idea es limitar el acceso al resultado del campo a las clases del paquete y las
w i n
subclases (protegido por paquete), debe asegurarse de que el acceso es explcito mediante la
Ed definicin de un mtodo escrito expresamente para el acceso a nivel de paquetes y subclases.

Programacin Java SE 7 4-6


Sustitucin de mtodos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Considere un requisito para proporcionar una cadena que


represente algunos detalles sobre los campos de la clase
Employee.

1 public class Employee {


2 private int empId;
e to
3 private String name;
e n s
4 // ... other fields and methods
le lic
5 a b
er
public String getDetails () {
6 return "Employee id: " + empId + nsf
7 n
" Employee name:" + name; - tra
8 } a no
h a s de
9 } ) i m u
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
e ma us
a v i(
Si bien la clase Employee tiene getters para devolver valores para una sentencia print, estara
a r
i n M
bien contar con un mtodo de utilidad para obtener los detalles especficos sobre el empleado.
Piense en un mtodo que se agrega a la clase Employee para imprimir detalles sobre el objeto
w
Ed Employee.
Adems de agregar campos o mtodos a una subclase, tambin puede modificar o cambiar el
comportamiento existente de un mtodo del principal (superclase).
Tal vez desee especializar este mtodo para describir un objeto Manager.

Programacin Java SE 7 4-7


Sustitucin de mtodos

En la clase Manager, mediante la creacin de un mtodo con


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

la misma firma que el mtodo de la clase Employee, est


sustituyendo el mtodo getDetails:
1 public class Manager extends Employee {
2 private String deptName;
3 // ... other fields and methods
e to
4 public String getDetails () {
e n s
5 return super.getDetails () +
le lic
6 a b
er
" Department: " + deptName;
s f
7 }
- t r an
8 } n n o
Una subclase puede llamar a un mtodo a
s principal usando la
palabra clave super. h
) Gui a d e
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
Cuando
r a
sevsustituye un mtodo, sustituye el mtodo de la clase (principal) de la superclase.
a
winAM
este mtodo se le llama para cualquier instancia de Manager.

Ed Una llamada con el formato super.getDetails() llama al mtodo getDetails de la clase


principal.
Nota: si, por ejemplo, una clase declara dos mtodos pblicos con el mismo nombre y una
subclase sustituye uno de ellos, la subclase seguir heredando el otro mtodo.

Programacin Java SE 7 4-8


Llamada a un mtodo sustituido

Con los ejemplos anteriores de Employee y Manager:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Employee e = new Employee (101, "Jim Smith", "011-12-2345",


100_000.00);
Manager m = new Manager (102, "Joan Kern", "012-23-4567",
110_450.54, "Marketing");
System.out.println (e.getDetails());
System.out.println (m.getDetails());
e to
e n s
i c
le l
Se llama al mtodo getDetails correcto de cada clase:
b
f e ra
Employee id: 101 Employee name: Jim Smith
an s
Employee id: 102 Employee name: Joan Kern Department: Marketing
- t r
n on
s a
) 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
e ma us
a v i(
Durante el tiempo de ejecucin, Java Virtual Machine llama al mtodo getDetails de la clase
a r
i n M
adecuada. Si comenta el mtodo getDetails de la clase Manager que se muestra en la
diapositiva anterior, qu sucede cuando se llama a m.getDetails()?
w
Ed Respuesta: recuerde que los mtodos se heredan de la clase principal. Por tanto, en tiempo de
ejecucin, se ejecuta el mtodo getDetails de la clase principal (Employee).

Programacin Java SE 7 4-9


Llamada al mtodo virtual
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Qu sucede si tiene lo siguiente?


Employee e = new Manager (102, "Joan Kern", "012-23-4567",
110_450.54, "Marketing");
System.out.println (e.getDetails());

Durante la ejecucin, se determina que el tipo de tiempo


de ejecucin del objeto es un objeto Manager: to
n s e
Employee id: 102 Employee name: Joan Kern Department: Marketing
lic e
El compilador no tiene fallos porque la clase Employee b l e
f e ra
tiene un mtodo getDetails y, en tiempo dens ejecucin,
- t r a
al mtodo que se ejecuta se le hace referencia o n desde un
objeto Manager. a n
a s
Se trata de un aspecto dem ) h Guidedenominado
polimorfismo
o
llamada al mtodo virtual.
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
ra vi (
Comportamiento del compilador frente al comportamiento en tiempo de ejecucin
M a
winEl aspecto importante que se debe recordar es la diferencia entre el compilador (que comprueba
Ed
que se pueda acceder a cada uno de los mtodos y campos segn la definicin estricta de la
clase) y el comportamiento asociado a un objeto determinado en tiempo de ejecucin.
Esta distincin es un aspecto importante y potente del polimorfismo: el comportamiento de un
objeto viene determinado por su referencia de tiempo de ejecucin.
Debido a que el objeto que ha creado es un objeto Manager, en tiempo de ejecucin, cuando se
llama al mtodo getDetails, la referencia de tiempo de ejecucin es al mtodo getDetails
de una clase Manager, incluso aunque la variable e sea del tipo Employee.
A este comportamiento se le conoce como llamada al mtodo virtual.
Nota: si es un programador de C++, obtiene este comportamiento en C++ solo si marca el
mtodo con la palabra clave de C++ virtual.

Programacin Java SE 7 4-10


Accesibilidad de los mtodos sustituidos

Un mtodo sustituido no puede ser menos accesible que el


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

mtodo de la clase principal.


public class Employee {
//... other fields and methods
public String getDetails() { ... }
}
public class Manager extends Employee {
e to
//... other fields and methods
e n s
private String getDetails() { //... }
elic
}
a b l
fe r
public class OverriddingTest {
a n s
Employee e = new Manager(102, "Joan Kern", "012-23-4567",
o n -tr
110_450.54, "Marketing");
s an
ha uide
e.getDetails(); // illegal method is private
}
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
AlM
ara
Para sustituir un mtodo, el nombre y el orden de los argumentos deben ser idnticos.
cambiar el acceso del mtodo getDetails de Manager a private, solo esa clase podr
i n
w ejecutar el mtodo. Sin embargo, la semntica del lenguaje para ejecutar e.getDetails
Ed determina que se ejecuta el mtodo getDetails de Manager. El resultado es un error de tiempo
de ejecucin.
Qu sucede si hace el mtodo Employee de getDetails privado y el mtodo Manager
pblico?
Respuesta: debido a que el compilador comprueba los tipos, indica que est intentando acceder
a un mtodo privado en Employee.

Programacin Java SE 7 4-11


Aplicacin de polimorfismo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Suponga que se le solicita que cree una nueva clase que


calcule las acciones otorgadas a los empleados segn su
salario y su rol (superior, ingeniero o administrador):
1 public class EmployeeStockPlan {
2 public int grantStock (Manager m) {
3 // perform a calculation for a Manager
4 }
uy . e to
tos s
no m obje n
5 public int grantStock (Engineer e) {
a ic e
6 // perform a calculation for an Engineer
n t ado
b l el
7 } orie r a
8 public int grantStock (Admin a) {
n s fe
9 // perform a calculation for an Admin
-tr a
o n
an
10 }
11 //... one method per employee type s
ha uide
12}
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
Problema de diseo
M es el problema en el ejemplo de la diapositiva? Cada uno de los mtodos realiza el clculo
Cul
i n
w en funcin del tipo de empleado transferido y devuelve el nmero de acciones.
Ed Tenga en cuenta lo que sucede si agrega dos o tres tipos de empleados adicionales. Necesitara
agregar tres mtodos ms y, posiblemente, replicar el cdigo segn la lgica de negocio
necesaria para calcular las acciones.
Es obvio que no es una buena forma de solucionar este problema. Si bien el cdigo funcionar,
no es fcil de leer y es probable que cree mucho cdigo duplicado.

Programacin Java SE 7 4-12


Aplicacin de polimorfismo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una buena prctica consiste en transferir parmetros y escribir


mtodos que usen el formato ms genrico del objeto posible.
public class EmployeeStockPlan {
public int grantStock (Employee e) {
// perform a calculation based on Employee data
}
}
e to
e n s
// In the application class
elic
a b l
EmployeeStockPlan esp = new EmployeeStockPlan ():
fe r
Manager m = new Manager ();
a n s
int stocksGranted = grantStock (m);
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
Uso del formato ms genrico
M buena prctica consiste en disear y escribir mtodos que adopten el formato ms genrico
Una
i n
w del objeto posible.
Ed En este caso, Employee es una buena clase base que tomar como punto de partida. Pero cmo
sabe el tipo de objeto transferido? La respuesta aparecer en la siguiente diapositiva.

Programacin Java SE 7 4-13


Uso de la palabra clave instanceof
El lenguaje Java proporciona la palabra clave instanceof
para determinar un tipo de clase de objeto en tiempo de
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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
}

Programacin Java SE 7 4-14


Conversin de referencias de objetos

Despus de usar el operador instanceof para verificar


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

que el objeto recibido como argumento es una subclase,


puede acceder a toda la funcionalidad del objeto
convirtiendo la referencia:
1 public void modifyDeptForManager (Employee e, String dept) {
2 if (e instanceof Manager) {
3 Manager m = (Manager) e; e to
e n s
4 m.setDeptName (dept);
el ic
5 }
a b l
6 }
s f er
Sin la conversin a Manager, el mtodo setDeptName
- t r an no
se compilara. no n
a
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
( e
a vireferencia
Si bienruna a superclase genrica es til para transferir objetos de un lado a otro,
a
M que tenga que usar un mtodo de la subclase.
puede
i n
w Por ejemplo, en la diapositiva, necesita el mtodo setDeptName de la clase Manager. Para que
Ed el compilador no tenga fallos, puede convertir una referencia de la superclase genrica a la clase
especfica.
Sin embargo, hay reglas para convertir las referencias. Esto aparece en la siguiente diapositiva.

Programacin Java SE 7 4-15


Conversin de reglas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las conversiones ascendentes siempre estn permitidas y en


ellas no se necesita un operador cast.
Director d = new Director();
Manager m = new Manager();

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

Programacin Java SE 7 4-16


Conversin de reglas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En el caso de las conversiones descendentes, el compilador


debe aceptar que la conversin es, al menos, posible.
Employee e = new Manager();
Manager m = new Manager();

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.

Programacin Java SE 7 4-17


Sustitucin de mtodos de objeto
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una de las ventajas de la herencia nica es que cada una de


las clases tiene un objeto principal por defecto. La clase raz de
cada clase Java es java.lang.Object.
No es necesario que declare que la clase ampla Object.
El compilador se encarga de esa tarea.
public class Employee { //... }
e to
e n s
es equivalente a:
elic
a b l
public class Employee extends Object { //... }
fer
a n s

n r son finales,
La clase raz contiene varios mtodos que-tno
pero hay tres que son importantes a o
n pensar en la
para
sustitucin: s
ha ide
) u toString, equals yco m tG
hashCode
a il 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
e
i ( sobrecargar mtodos de objeto
a v
M
La
ar
Recomendacin:
clase java.lang.Object es la clase raz de todas las clases en el lenguaje de
d winprogramacin Java. Todas las clases incluirn por defecto la subclase Object.
E Object define varios mtodos que no son finales diseados para que los sustituya la clase. Son:
equals, hashCode, toString, clone y finalize. De ellos, hay tres mtodos que debera
intentar sustituir.

Programacin Java SE 7 4-18


Mtodo Object toString

Al mtodo toString se le llama siempre que se transfiera una


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

instancia de la clase a un mtodo que tome un objeto String,


como println:
Employee e = new Employee (101, "Jim Kern", ...)
System.out.println (e);

Puede utilizar toString para proporcionar informacin de e to


la instancia: n s
ce i
b l el
public String toString () {
fe r a
return "Employee id: " + empId + "\n"
a n s
"Employee name:" + name;
o n -tr
an
}
s
ha usobre de la clase es mejor
Este enfoque para obtener detalles ) i
que crear su propio mtodo c o m getDetails.
tG
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
Nota: en
a r aocasiones puede que desee imprimir el nombre de la clase que est ejecutando un

i n M El mtodo getClass() es un mtodo Object que se usa para devolver la instancia de


mtodo.
objeto Class y el mtodo getName() proporciona el nombre totalmente cualificado de la clase
w
Ed de tiempo de ejecucin.
getClass().getName(); // returns the name of this class instance
Estos mtodos estn en la clase Object.

Programacin Java SE 7 4-19


Mtodo Object equals

El mtodo Object equals solo compara referencias de objetos.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Si hay dos objetos x e y en cualquier clase, x es igual a y


si y solo si x e y hacen referencia al mismo objeto.
Ejemplo:
Employee x = new Employee (1,"Sue","111-11-1111",10.0);
Employee y = x;
e to
x.equals (y); // true
e n s
Employee z = new Employee (1,"Sue","111-11-1111",10.0);
elic
a b l
x.equals (z); // false!
fer
a n s
Ya que lo que realmente se desea es probar n r contenido del
-tel
o
objeto Employee, es necesario sustituirnel mtodo equals:
s a
public boolean equals (Object )o)
a
h { ... i d}e
o m tG u
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
e
i ( de Object determina (por defecto) solo si los valores de dos referencias de
a
El mtodo v
ar apuntan al mismo objeto. Bsicamente, la prueba en la clase Object es simplemente la
equals
M
objetos
winsiguiente:
Ed Si x == y, devolver true.
En el caso de un objeto (como el objeto Employee) que contiene valores, esta comparacin no
es suficiente, particularmente si deseamos asegurarnos de que solo hay un empleado con un ID
concreto.

Programacin Java SE 7 4-20


Sustitucin de equals en Employee

Un ejemplo de sustitucin del mtodo equals en la clase


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Employee compara todos los campos para ver si tienen


igualdad:
1 public boolean equals (Object o) {
2 boolean result = false;
3 if ((o != null) && (o instanceof Employee)) {
4 Employee e = (Employee)o;
5 if ((e.empId == this.empId) && e to
e n s
6 (e.name.equals(this.name)) &&
elic
7 (e.ssn.equals(this.ssn)) &&
a b l
8 (e.salary == this.salary)) {
fe r
a n s
-tr
9 result = true;
10 }
o n
11 }
s an
12 return result;
) ha uide
13 }
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
Esta simple prueba equals comprueba en primer lugar que el objeto transferido no es nulo y, a

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.

Programacin Java SE 7 4-21


Sustitucin de Object hashCode

El contrato general de Object indica que si dos objetos se


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

consideran iguales (con el mtodo equals), el cdigo hash del


entero devuelto para los dos objetos tambin debe ser igual.
1 // Generated by NetBeans
2 public int hashCode() {
3 int hash = 7;
e to
4 hash = 83 * hash + this.empId;
e n s
5 hash = 83 * hash + Objects.hashCode(this.name);
elic
6 hash = 83 * hash + Objects.hashCode(this.ssn);
a b l
7 hash = 83 * hash + (int) fe r
a n s
-tr
(Double.doubleToLongBits(this.salary) ^
(Double.doubleToLongBits(this.salary) >>> 32));
o n
8 return hash;
s an
9 }
) 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
Sustitucin de hashCode
Mdocumentacin Java para la clase Object indica:
La
i n
w "... Normalmente es necesario sustituir el mtodo hashCode siempre que se sustituya este
Ed mtodo [equals], para mantener el contrato general del mtodo hashCode, que indica que los
objetos iguales deben tener cdigos hash iguales."
El mtodo hashCode se usa junto con el mtodo equals en recopilaciones basadas en hash,
como HashMap, HashSet y Hashtable.
Este mtodo se puede malinterpretar fcilmente, por lo que debe tener cuidado. Lo bueno es que
los IDE, como NetBeans, pueden generar hashCode.
Para crear su propia funcin hash, los siguientes pasos le permitirn aproximar un valor hash
razonable para instancias iguales y distintas:
1) Empezar con una constante de entero que no sea cero. Con los nmeros primos se
producen menos colisiones de hashcode.
2) Para cada campo usado en el mtodo equals, calcule un cdigo hash int para el campo.
Observe que para el elemento Strings, puede utilizar el elemento hashCode del objeto
String.
3) Agregar los cdigos hash calculados juntos.
4) Devolver el resultado.

Programacin Java SE 7 4-22


Resumen
En esta leccin, debe haber aprendido a hacer lo siguiente:
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Usar niveles de acceso: private, protected, el nivel


por defecto y public
Sustituir mtodos
Sobrecargar constructores y otros mtodos de la forma
adecuada
Usar el operador instanceof para comparar tipos de
e to
objeto e n s
Usar la llamada al mtodo virtual le lic
a b
Usar conversiones ascendentes y descendentes sfer
n
Sustituir mtodos de la clase Object paran-tra
mejorar la funcionalidad de la clase a no
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
Mara
w i n
Ed

Programacin Java SE 7 4-23


Prueba

Suponga que tiene una clase Account con un mtodo


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

withdraw() y una clase Checking que ampla Account,


que declara su propio mtodo withdraw(). Cul es el
resultado del fragmento de cdigo siguiente?
1 Account acct = new Checking();
2 acct.withdraw(100);
e to
e n s
a. El compilador avisa sobre un fallo en la lnea 1. elic
a b l
b. El compilador avisa sobre un fallo en la lnea 2. fe r
a n s
o n -tr
c. Error de tiempo de ejecucin: asignacin incompatible
(lnea 1).
s an
ha uide
d. Se ejecuta el mtodo Account.withdraw().
)
m tG
co
e. Se ejecuta el mtodo lChecking.withdraw().
n
ai tude
g sSm
i @ hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
t
a
Copyright
r
e ma us
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 4-24


Prueba

Suponga que tiene una clase Account y una clase Checking


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

que ampla Account. Se ejecutar el cuerpo de la sentencia


if en la lnea 2.
1 Account acct = new Checking();
2 if (acct instanceof Checking) { // will this block run? }

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

Programacin Java SE 7 4-25


Prueba

Suponga que tiene una clase Account y una clase Checking


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

que ampla Account. Tambin tiene una clase Savings, que


ampla Account. Cul es el resultado del cdigo siguiente?
1 Account acct1 = new Checking();
2 Account acct2 = new Savings();
3 Savings acct3 = (Savings)acct1;
e to
e n s
a. acct3 contiene la referencia a acct1.
le lic
b. Se produce una excepcin ClassCastException r a b
de
tiempo de ejecucin. s f e
- t r an
c. onlnea 2.
El compilador avisa sobre un fallo ennla
d. s endlaeconversin de la
El compilador avisa sobre unhfallo
a
a
) Gui
lnea 3. o m t
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
v
Mara
w i n
Ed

Programacin Java SE 7 4-26


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Programacin Java SE 7 4-27


Visin general de la prctica 4-1:
Sustitucin de mtodos y
aplicacin de polimorfismo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Modificacin de las clases Employee, Manager y
Director; sustitucin del mtodo toString()
Creacin de una clase EmployeeStockPlan con un
mtodo de otorgamiento de acciones que usa la palabra e to
e n s
clave instanceof
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

Programacin Java SE 7 4-28


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Diseo de clases avanzadas

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

Al finalizar esta leccin, debera estar capacitado para lo


siguiente:
Disear clases base de uso general mediante clases
abstractas
Crear clases y subclases Java abstractas
Modelar problemas de negocio mediante las palabras e to
clave static y final e n s
elic
Implantar el patrn de diseo singleton a b l
s f
Distinguir entre clases de nivel superior y anidadas
er
an -tr
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
w i n
Ed

Programacin Java SE 7 5-2


Modelacin de problemas de negocio con clases
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La herencia (o creacin de subclases) es una funcin esencial


del lenguaje de programacin Java. La herencia permite la
reutilizacin de cdigo mediante:
Herencia de mtodos: las subclases evitan la duplicacin
del cdigo al heredar las implantaciones de mtodos.
Generalizacin: el cdigo que est diseado para basarse
e to
en el tipo ms genrico posible es ms fcil de mantener. e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
Diagrama
a
il herencia
de
d e n de clases
@ 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
AlM
ara
Herencia de clases
disear una solucin orientada a objetos, debe intentar evitar la duplicacin del cdigo. Una
i n
w tcnica para evitar la duplicacin consiste en crear mtodos y clases de biblioteca. Las bibliotecas
Ed funcionan como un punto central para incluir cdigo de uso comn. Otra tcnica para evitar la
duplicacin de cdigo es usar la herencia de clases. Cuando se identifique un tipo base
compartido entre dos clases, cualquier cdigo compartido se puede colocar en una clase
principal.
Cuando sea posible, utilice referencias de objetos del tipo base ms genrico posible. En Java, la
generalizacin y la especializacin permiten la reutilizacin mediante la herencia de mtodos y la
llamada de mtodos virtuales (VMI). VMI, en ocasiones denominado enlace tardo, permite a un
emisor de llamada llamar de forma dinmica a un mtodo siempre que este se haya declarado en
un tipo base genrico.

Programacin Java SE 7 5-3


Activacin de la generalizacin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La codificacin en un tipo base comn permite introducir


nuevas subclases con pocas modificaciones o ninguna de
cualquier cdigo que dependa del tipo base ms genrico.
ElectronicDevice dev = new Television();
dev.turnOn(); // all ElectronicDevices can be turned on

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.

Programacin Java SE 7 5-4


Identificacin de la necesidad
de clases abstractas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las subclases no tienen que heredar una implantacin de


mtodo si el mtodo est especializado.

public class Television extends ElectronicDevice {

public void turnOn() {


changeChannel(1);
e to
initializeScreen(); e n s
elic
}
a b l
public void turnOff() {}
fe r
a n s
public void changeChannel(int channel) {}
o n -tr
public void initializeScreen() {}
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
Implantaciones de mtodos
M las clases hermanas tienen un mtodo comn, este se suele colocar en una clase
Cuando
i n
w principal. En algunas circunstancias, sin embargo, la implantacin de la clase principal siempre se
Ed tendr que sobrescribir con una implantacin especializada.
En estos casos, la inclusin del mtodo en una clase principal tiene tanto ventajas como
desventajas. Permite el uso de tipos de referencias genricas, pero los desarrolladores pueden
fcilmente olvidar especificar la implantacin especializada de las subclases.

Programacin Java SE 7 5-5


Definicin de clases abstractas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una clase se puede declarar como abstracta mediante el


modificador de nivel de clase abstract.

public abstract class ElectronicDevice { }

Una clase abstracta puede tener una subclase. to


n s e
ic e
public class Television extends ElectronicDevice { }
b l el
fe r a
a n s
-tr
Una clase abstracta no se puede instanciar.
on
a n
ElectronicDevice dev = new ElectronicDevice();
h a s d e // error
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 ( de una clase como abstracta evita que se cree cualquier instancia de dicha clase.
a v
La declaracin
M ar una clase abstracta es un error de tiempo de compilacin. Una clase abstracta se
Instanciar
winampliar normalmente mediante una clase secundaria y se puede usar como tipo de referencia.
Ed

Programacin Java SE 7 5-6


Definicin de mtodos abstractos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Un mtodo se puede declarar como abstracto mediante el


modificador de nivel de mtodo abstract.

public abstract class ElectronicDevice {

public abstract void turnOn();


e to
public abstract void turnOff();
Sin corchetes e n s
}
elic
Un mtodo abstracto: a b l
s f er
No puede tener un cuerpo de mtodo.
- t r an
on
Se debe declarar en una clase abstracta.
n
a
Se sobrescribe en subclases.has ide
m ) Gu
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
(e ma us
v i
rade mtodos abstractos
Herencia
a
M
Cuando una clase secundaria hereda un mtodo abstracto, est heredando una firma de mtodo,
winpero sin implantacin. Por este motivo, no se permiten corchetes al definir los mtodos
Ed abstractos.
Un mtodo abstracto es una forma de garantizar que cualquier clase secundaria contendr un
mtodo con una firma coincidente.

Programacin Java SE 7 5-7


Validacin de clases abstractas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las siguientes reglas adicionales se aplican cuando se usan


las clases y los mtodos abstractos:
Una clase abstracta puede tener cualquier nmero de
mtodos abstractos y no abstractos.
Al heredar de una clase abstracta, debe realizar una de
las siguientes acciones:
e to
Declarar la clase secundaria como abstracta. e n s
Sustituya todos los mtodos abstractos heredados de la le lic
a b
s f er de
clase principal. De lo contrario, se producir un error
tiempo de compilacin. tran n -
o
error: Television is not abstract s anda ndoes not override
abstract method turnOn() in ElectronicDevice ) 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
e
i ( abstractas
a
Uso de rlasvclases
SiM
a
bien se puede evitar implantar un mtodo abstracto declarando clases secundarias como
n
wi abstractas, esto solo sirve para retrasar lo inevitable. Las aplicaciones necesitan mtodos no
Ed abstractos para crear objetos. Utilice mtodos abstractos para describir la funcionalidad que se
necesita en las clases secundarias.

Programacin Java SE 7 5-8


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Para que la compilacin se realice correctamente, un mtodo


abstracto no debe tener:
a. Un valor de retorno
b. Una implantacin de mtodo
c. Parmetros del mtodo
d. Acceso private 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

Programacin Java SE 7 5-9


Palabra clave static

El modificador static se usa para declarar campos y


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

mtodos como recursos de nivel de clase. Los miembros de


clase estticos:
Se pueden usar sin instancias de objeto.
Se usan cuando un problema se soluciona mejor sin
objetos. to
Se usan cuando hay objetos del mismo tipo que deben icen
se
compartir campos. b l el
f e
No se deben usar para no usar las funciones orientadas
ra a
t r a ns
n- justificado.
objetos de Java a menos que haya un motivo
no
a
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
ElM
ara
Java: orientado a objetos por diseo
lenguaje de programacin Java se ha diseado como un lenguaje orientado a objetos, a
i n
w diferencia de lenguajes como Objective-C y C++, que han heredado el diseo de procedimientos
Ed de C. Al desarrollar en Java, siempre debe intentar disear una solucin orientada a objetos.

Programacin Java SE 7 5-10


Mtodos estticos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Los mtodos estticos son mtodos que se pueden llamar


incluso si la clase en la que se hayan declarado no se ha
instanciado. Los mtodos estticos:
Se denominan mtodos de clase.
Son tiles para las API que no estn orientadas a objetos.
java.lang.Math contiene muchos mtodos estticos.
e to
e n s
Se suelen usar en lugar de los constructores para realizarlic
tares relacionadas con la inicializacin de objetos. able
No pueden acceder a miembros no estticos de s f
laermisma
clase. - t r an
n on
Se pueden ocultar en subclases,speroa no se pueden
sustituir.
a
) h uide
m G o
ilcvirtual.ent
Sin llamada a mtodo
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
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();

Programacin Java SE 7 5-11


Implantacin de mtodos estticos

public class StaticErrorClass {


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

private int x;

public static void staticMethod() {


x = 1; // compile error
instanceMethod(); // compile error
}

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.

Programacin Java SE 7 5-12


Llamada a mtodos estticos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

double d = Math.random();
StaticUtilityClass.printMessage();
StaticUtilityClass uc = new StaticUtilityClass();
uc.printMessage(); // works but misleading
sameClassMethod();

Al llamar a los mtodos estticos, debera: e to


n s
Cualificar la ubicacin del mtodo con un nombre de clase e l ice
bl
si el mtodo se encuentra en otra clase distinta a elaradel
emisor de la llamada a n sf
r -t
No es necesario para mtodos de la n on clase
misma
Evitar el uso de una referencia a
des objeto a
para llamar a un
h
) Gu i d e
mtodo esttico om
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

Programacin Java SE 7 5-13


Variables estticas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las variables estticas son variables a las que se puede


acceder incluso aunque la clase en la que se hayan declarado
no se haya instanciado. Las variables estticas:
Se denominan variables de clase.
Se limitan a una sola copia por JVM.
Son tiles para contener datos compartidos. e to
e n s
Los mtodos estticos almacenan datos en variables lic
estticas. b l e
e r a
a n sf copia de
Todas las instancias de objetos comparten una sola
cualquier variable esttica. -tr on
a n se carga por
Se inicializan cuando la clase contenedora
s
primera vez. ) ha ide m G u
o t
a ilc den
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
(e ma us
v i
Carga de
a raclases
M
Las clases suministradas por el desarrollador de aplicaciones se suelen cargar a peticin (primer
winuso). Las variables estticas se inicializan cuando se carga su clase delimitadora. Intentar
Ed acceder a un miembro de clase esttica puede disparar la carga de una clase.

Programacin Java SE 7 5-14


Definicin de variables estticas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class StaticCounter {


private static int counter = 0;

public StaticCounter() {
Solo una copia en
counter++; la memoria
}

public static int getCount() { e to


return counter; 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
Persistencia de variables estticas
M de las tecnologas que se usan para mantener el estado de la aplicacin en Java solo
Muchas
i n
w guardan variables de instancias. El mantenimiento de un solo objeto que realiza un seguimiento
Ed del estado compartido se puede usar como alternativa a las variables estticas.

Programacin Java SE 7 5-15


Uso de variables estticas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

double p = Math.PI;

new StaticCounter();
new StaticCounter();
System.out.println("count: " + StaticCounter.getCount());

Al acceder a las variables estticas, debera: e to


e n s
Cualificar la ubicacin de la variable con un nombre de e lic
clase si la variable se encuentra en otra clase distinta
r a bal la
del emisor de la llamada n s fe
ra -t
on clase
No es necesario para variables de la nmisma
Evitar el uso de una referencia a
des objeto para acceder a a
h
) Gu i d e
una variable esttica om
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
AlM
ara
Referencias de objetos a miembros estticos
igual que se debe evitar el uso de referencias de objetos a mtodo estticos, tambin debera
i n
w evitar el uso de referencias de objetos para acceder a variables estticas. Si todos los miembros
Ed de una clase son estticos, procure usar un constructor privado para evitar la instanciacin de
objetos.

Programacin Java SE 7 5-16


Importaciones estticas

Una sentencia de importacin esttica hace que los miembros


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

estticos de una clase estn disponibles con su nombre simple.


Con cualquiera de las siguientes lneas:
import static java.lang.Math.random;
import static java.lang.Math.*;

La llamada al mtodo Math.random()se podra escribir e to


e n s
como: ic
b l el
public class StaticImport {
fe r a
public static void main(String[] args) {
a n s
double d = random();
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 uso excesivo de la importacin esttica puede afectar negativamente a la lectura del cdigo.
Procure no agregar varias importaciones estticas a una clase.
w i n
Ed

Programacin Java SE 7 5-17


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El nmero de instancias de una variable esttica est


relacionado con el nmero de objetos que se han creado.
a. Verdadero
b. Falso

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

Programacin Java SE 7 5-18


Mtodos finales

Un mtodo se puede declarar como final. Los mtodos


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

finales no se pueden sobrescribir.


public class MethodParentClass {
public final void printMessage() {
System.out.println("This is a final method");
}
e to
} e n s
elic
a b l
public class MethodChildClass extends MethodParentClass { fe r
a n s
// compile-time error
o n -tr
an
public void printMessage() {
System.out.println("Cannot override method"); 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
Mitos sobre el rendimiento
Mdeclaracin de un mtodo como final a penas afecta al rendimiento. Los mtodos se deben
La
i n
w declarar como finales solo para desactivar la sustitucin de mtodos.
Ed

Programacin Java SE 7 5-19


Clases finales

Una clase se puede declarar como final. Las clases finales


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Programacin Java SE 7 5-20


Variables finales

El modificador final se puede aplicar a las variables. Las


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

variables finales no pueden cambiar sus valores una vez


inicializadas. Las variables finales pueden ser:
Campos de clase
Los campos finales con expresiones de constantes de
tiempo de compilacin son variables de constantes.
Los campos estticos se pueden combinar con los finales e to
e n s
para crear una variable siempre disponible y que nunca lic
cambia. ble ra
f e
Parmetros del mtodo
tra ns
Variables locales n -
a no
Nota: las referencias finales siempre a sdeben hacer
referencia
h
) de G d e
i objeto se puede
al mismo objeto, pero el contenido
o m u
ese
modificar. ilc ent
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
(e ma use
v i
ray desventajas de las variables finales
Ventajas
a
M
Prevencin de bugs
win
Ed Los valores de las variables finales no se pueden nunca modificar una vez inicializadas. Este
comportamiento funciona como un mecanismo de prevencin de bugs.
Proteccin de threads
La naturaleza inmutable de las variables finales elimina cualquiera de las preocupaciones que
conlleva el acceso simultneo mediante varios threads.
Referencia final a los objetos
Una referencia de objeto final solo sirve para evitar que una referencia apunte a otro objeto. Si
est diseando objetos inmutables, debe evitar que los campos del objeto se modifiquen. Las
referencias finales tambin le evitan asignar un valor null a la referencia. El mantenimiento de
referencias de un objeto evita que ese objeto est disponible para la recoleccin de basura.

Programacin Java SE 7 5-21


Declaracin de variables finales
public class VariableExampleClass {
private final int field;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

private final int forgottenField;


private final Date date = new Date();
public static final int JAVA_CONSTANT = 10;

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.

Programacin Java SE 7 5-22


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

A un campo final (variable de instancia) se le puede asignar un


valor cuando se declara o en todos los constructores.
a. Verdadero
b. Falso

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

Programacin Java SE 7 5-23


Cundo evitar las constantes

Las variables public, static y final pueden ser muy


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

tiles, pero hay un patrn de uso concreto que se debera


evitar. Las constantes pueden proporcionar una falsa
sensacin de validacin de los datos introducidos o de
comprobacin del rango de valores.
Piense en un mtodo que solo deba recibir uno de los tres to
valores posibles: n s e
Se trata de una constante
ice
Computer comp = new Computer(); int que es igual que 2.
b l el
comp.setState(Computer.POWER_SUSPEND); a f er
Las siguientes lneas de cdigo se seguiran n s
acompilando:
- t r
Computer comp = new Computer(); n on
s a
comp.setState(42);
) 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
e
i ( de rangos en tiempo de ejecucin
r a
Comprobacin v
M
En
aejemplo
el de la diapositiva, debe realizar una comprobacin de rango en tiempo de ejecucin
winal usar un valor int para representar el estado. En el mtodo setState, se puede usar una
Ed sentencia if para validar que solo se acepten los valores 0, 1 o 2. Este tipo de comprobacin se
realiza cada vez que se llama al mtodo setState, lo que provoca una sobrecarga adicional.

Programacin Java SE 7 5-24


Enumeraciones Typesafe
Java 5 ha incluido una enumeracin typesafe al lenguaje. Las
enumeraciones:
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Se crean con una variacin de una clase Java


Proporcionan una comprobacin de rangos en tiempo de
compilacin
public enum PowerState {
OFF,
Estas son las referencias a los
ON, tres nicos objetos PowerState
e to
SUSPEND; que pueden existir.
e n s
el ic
}
a b l
s f er
Una enumeracin se puede utilizar de la siguiente
- t r anforma:
Computer comp = new Computer(); n on
s a Este mtodo toma una
comp.setState(PowerState.SUSPEND);
) a
h uide referencia PowerState.
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
i ( de rangos en tiempo de compilacin
r a
Comprobacinv
M
En
aejemplo
el de la diapositiva, el compilador realiza una comprobacin de tiempo de compilacin
winpara garantizar que solo se transfieran las instancias vlidas de PowerState al mtodo
Ed setState. En tiempo de ejecucin no se produce ninguna sobrecarga en la comprobacin de los
rangos.

Programacin Java SE 7 5-25


Uso de enumeraciones
Las referencias a enumeraciones se pueden importar de forma
esttica.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

import static com.example.PowerState.*;

public class Computer extends ElectronicDevice {


private PowerState powerState = OFF;
//...
} PowerState.OFF
e to
Las enumeraciones se pueden usar como expresin en una e n s
sentencia switch. elic
a b l
public void setState(PowerState state) { fe r
a n s
switch(state) {
o n -tr
an
case OFF:
//...
Importadas de forma esttica
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

Programacin Java SE 7 5-26


Enumeraciones complejas
Las enumeraciones pueden tener campos, mtodos y
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Programacin Java SE 7 5-27


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una enumeracin puede tener un constructor con los


siguientes niveles de acceso:
a. public
b. protected
c. por defecto (nivel de acceso no declarado)
d. private 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

Programacin Java SE 7 5-28


Patrones de diseo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Los patrones de diseo:


Son soluciones reutilizables a problemas de desarrollo de
software comunes.
Estn documentados en catlogos de patrones.
Design Patterns: Elements of Reusable Object-Oriented
Software (Patrones de diseo: elementos del software
e to
reutilizable orientado a objetos), de Erich Gamma et al. n s
(conocido como Gang of Four, la banda de los cuatro, por e l ice
sus cuatro autores) r a bl
e sf
Forman un vocabulario para hablar sobre el n
tradiseo.
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
ara
Catlogos de patrones de diseo
M disponibles catlogos de patrones para muchos lenguajes de programacin. La mayora de
Hay
i n
w los patrones de diseo tradicionales se aplican a cualquier lenguaje de programacin orientado a
Ed objetos. Una de las obras ms conocidas, Design Patterns: Elements of Reusable Object-
Oriented Software, usa una combinacin de C++, Smalltalk y diagramas para mostrar las posibles
implantaciones de patrones. Son muchos los desarrolladores Java que an hacen referencia a
esta obra, ya que los conceptos se pueden extrapolar a cualquier lenguaje orientado a objetos.
Obtendr ms informacin sobre los patrones de diseo y otras recomendaciones de Java en el
curso Patrones de diseo Java.

Programacin Java SE 7 5-29


Patrn singleton
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El patrn de diseo singleton detalla una implantacin de clase


que solo se puede instanciar una vez.

public class SingletonClass {


private static final SingletonClass instance =
1
new SingletonClass();
e to
e n s
2 private SingletonClass() {} el ic
a b l
s f er
3
public static SingletonClass getInstance()
- t r an {
return instance;
n on
} s a
} ) 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
e
i (de un patrn singleton
a v
M
El
ar de diseo singleton es uno de los patrones de diseo de creacin que se clasifican en
Implantacin
patrn
winDesign Patterns: Elements of Reusable Object-Oriented Software.
Ed Para implantar el patrn de diseo singleton:
1. Utilice una referencia esttica para apuntar a la instancia nica. Declarar la referencia como
final garantiza que nunca se har referencia a otra instancia.
2. Agregue un solo constructor privado a la clase singleton. El modificador privado solo permite
acceso de la "misma clase", lo que prohbe cualquier intento de instanciar la clase singleton,
excepto en el caso del intento en el paso 1.
3. Un mtodo de fbrica pblico devuelve una copia de la referencia a singleton. Este mtodo
se declara como esttico para acceder al campo esttico declarado en el paso 1. El paso 1
podra usar una variable pblica, lo que hace que no sea necesario el mtodo de fbrica.
Los mtodos de fbrica ofrecen una mayor flexibilidad (por ejemplo, implantar una solucin
singleton por thread) y se suelen usar en la mayora de las implantaciones de singleton.
Para obtener una referencia de singleton, llame al mtodo getInstance:
SingletonClass ref = SingletonClass.getInstance();

Programacin Java SE 7 5-30


Clases anidadas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una clase anidada es una clase declarada dentro del cuerpo


de otra clase. Las clases anidadas:
Tienen varias categoras.
Clases internas
Clases de miembros

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.

Programacin Java SE 7 5-31


Clase interna: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class Car {


private boolean running = false;
private Engine engine = new Engine();

private class Engine {


public void start() {
running = true;
}
e to
}
e n s
elic
a b l
public void start() {
fe r
engine.start();
a n s
}
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
Clases internas frente a clases anidadas estticas
M clase interna se considera parte de la clase externa y hereda el acceso a todos los miembros
Una
i n
w privados de la clase externa. En el ejemplo de la diapositiva se muestra una clase interna, que es
Ed una clase de miembro. Las clases internas tambin se declaran dentro de un bloque de mtodos
(clases locales).
Una clase anidada esttica no es una clase interna, pero su declaracin parece similar con un
modificador static adicional en la clase anidada. Las clases anidadas estticas se pueden
instanciar antes de la clase externa delimitadora y, por tanto, se deniega el acceso a todos los
miembros no estticos de la clase delimitadora.

Programacin Java SE 7 5-32


Clases internas annimas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una clase annima se usa para definir una clase sin nombre.

public class AnonymousExampleClass {


public Object o = new Object() {
@Override
public String toString() {
e to
return "In an anonymous class method";
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
Clase sin nombre
Mel ejemplo de la diapositiva, la clase java.lang.Object tiene una subclase y es esa
En
i n
w subclase la que se est instanciando. Al compilar una aplicacin con clases annimas, se
Ed generar un archivo de clase independiente con una convencin de nomenclatura
Outer$1.class, donde 1 es el nmero de ndice de las clases annimas en una clase
delimitadora y Outer es el nombre de la clase delimitadora.
Las clases internas annimas tambin pueden ser clases locales.

Programacin Java SE 7 5-33


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cules de los siguientes tipos de clases anidadas son clases


internas?
a. anonymous
b. local
c. static
d. member 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

Programacin Java SE 7 5-34


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Disear clases base de uso general mediante clases
abstractas
Crear clases y subclases Java abstractas
Modelar problemas de negocio mediante las palabras
clave static y final e to
e n s
Implantar el patrn de diseo singleton lic
Distinguir entre clases de nivel superior y anidadasrab
le
sf e
tr a n
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
w i n
Ed

Programacin Java SE 7 5-35


Visin general de la prctica 5-1:
Aplicacin de la palabra clave abstract
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Identificacin de posibles problemas que se pueden
solucionar con clases abstractas
Refactorizacin de una aplicacin Java existente para que
use clases y mtodos abstractos
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

Programacin Java SE 7 5-36


Visin general de la prctica 5-2:
Aplicacin del patrn de diseo singleton
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica se aborda el uso de las palabras clave static y


final, y la refactorizacin de una aplicacin existente para
implantar el patrn de diseo singleton.

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

Programacin Java SE 7 5-37


Visin general de la prctica 5-3:
(Opcional) Uso de enumeraciones Java
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica se abarca el uso de una aplicacin existente y


la refactorizacin del cdigo para utilizar una enumeracin.

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

Programacin Java SE 7 5-38


(Opcional) Visin general de la prctica 5-4:
Reconocimiento de clases anidadas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica se abarca el anlisis de una aplicacin Java


existente y la identificacin del nmero y los tipos de clases
presentes.

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

Programacin Java SE 7 5-39


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Herencia con interfaces 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
Mara
w i n
Ed
Objetivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Al finalizar esta leccin, debera estar capacitado para lo


siguiente:
Modelar problemas de negocio mediante interfaces
Definir una interfaz Java
Seleccionar entre herencia de interfaz y herencia de clase
Ampliar una interfaz e to
n s
Refactorizar cdigo para implantar el patrn DAO lice e
r a bl
s fe
- t r an
no n
a
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
Mara
w i n
Ed

Programacin Java SE 7 6-2


Implantacin de sustitucin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La capacidad de describir tipos abstractos es una potente


funcin de Java. La abstraccin permite:
Facilidad de mantenimiento
Clases con errores lgicos que se pueden sustituir con
clases nuevas y mejoradas.
Implantacin de sustitucin
e to
El paquete java.sql describe los mtodos que usan los e n s
desarrolladores para comunicarse con las bases de datos, le lic
pero la implantacin es especfica del proveedor. fer a b
an s
Divisin del trabajo
n - t r
no la interfaz de
Describir la API de negocio que necesita
a
a
usuario de una aplicacin permite
h s a dicha
d e interfaz de usuario
i
m) Gu de forma conjunta.
y a la lgica de negocio desarrollarse
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
Abstraccin
M de aprender a definir tipos abstractos mediante el uso de clases. Hay dos formas de definir
Acaba
i n
w la abstraccin de tipos en Java: clases e interfaces abstractas. Al escribir cdigo para que haga
Ed referencia a tipos abstractos, ya no depender de las clases de implantacin especficas. La
definicin de estos tipos abstractos puede parecer un trabajo adicional al principio, pero puede
reducir la refactorizacin posteriormente si se usa bien.

Programacin Java SE 7 6-3


Interfaces Java
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las interfaces Java se usan para definir tipos abstractos. Las


interfaces:
Son similares a las clases abstractas que solo contienen
mtodos abstractos pblicos.
Describen los mtodos que debe implantar una clase.
Los mtodos no deben tener una implantacin {corchetes}. e to
e n s
Pueden contener campos constantes. lic
Se pueden usar como tipo de referencia. a b le
s f er
Son un componente esencial de muchos patrones an de
- t r
diseo. on
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
En Java, una interfaz describe un contrato para una clase. El contrato definido por una interfaz
dicta los mtodos que se deben implantar en una clase. Las clases que implantan el contrato
w i n
deben cumplir todo el contrato o declararse como tipo abstract.
Ed

Programacin Java SE 7 6-4


Desarrollo de interfaces Java

Las interfaces pblicas de nivel superior se declaran en su


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

propio archivo .java. Las interfaces se implantan en lugar


de ampliarse.
public interface ElectronicDevice {
public void turnOn();
public void turnOff();
e to
}
e n s
elic
public class Television implements ElectronicDevice {
a b l
fe r
public void turnOn() { }
a n s
public void turnOff() { }
o n -tr
public void changeChannel(int channel) {}
s an
private void initializeScreen() {}
) 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
Reglas para interfaces
Modificadores de acceso
i n
w Todos los mtodos de una interfaz son de tipo public, incluso aunque olvide declararlos como
Ed tipo public. No puede declarar los mtodos como private o protected en una interfaz. El
contrato que detalla una interfaz es una API pblica que una clase debe proporcionar.
Modificador abstracto
Debido a que todos los mtodos son de tipo abstract de forma implcita, es redundante (si bien
est permitido) declarar un mtodo como abstract. Debido a que todos los mtodos de interfaz
son abstractos, no puede proporcionar ninguna implantacin de mtodo, ni siquiera un juego
vaco de corchetes.
Implantaciones y ampliaciones
Una clase puede ampliar una clase principal y, a continuacin, implantar una lista separada por
comas de interfaces.

Programacin Java SE 7 6-5


Campos constantes
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las interfaces pueden tener campos constantes.

public interface ElectronicDevice {


public static final String WARNING =
"Do not open, shock hazard";
public void turnOn();
e to
public void turnOff();
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
Solo se permiten campos constantes en una interfaz. Al declarar un campo en una interfaz, de
forma implcita es de tipo public, static y final. Puede especificar de forma redundante
w i n
estos modificadores. Procure no agrupar todos los valores constantes de una aplicacin en una
Ed sola interfaz; un diseo correcto es el que distribuye los valores constantes de una aplicacin en
varias clases e interfaces. La creacin de clases monolticas o interfaces que contengan grandes
agrupaciones de cdigo no relacionado no respeta las recomendaciones del diseo orientado a
objetos.

Programacin Java SE 7 6-6


Referencias a la interfaz
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Puede utilizar una interfaz como tipo de referencia. Al usar un


tipo de referencia de interfaz, debe usar solo los mtodos
sealados en la interfaz.

ElectronicDevice ed = new Television();


ed.turnOn();
e to
ed.turnOff();
e n s
ed.changeChannel(2); // fails to compile
elic
a b l
String s = ed.toString();
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
Una referencia introducida como interfaz solo se puede usar para hacer referencia a un objeto
que implanta esa interfaz. Si el objeto tiene todos los mtodos detallados en la interfaz, pero no la
w i n
implanta, no se podr usar la interfaz como tipo de referencia para ese objeto. Las interfaces
Ed incluyen de forma implcita todos los mtodos de java.lang.Object.

Programacin Java SE 7 6-7


Operador instanceof

Puede usar instanceof con las interfaces.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Television t = new Television();


if (t instanceof ElectronicDevice) { }

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.

Programacin Java SE 7 6-8


Interfaces de marcador
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las interfaces de marcador definen un tipo, pero no


sealan ningn mtodo que deba implantar una clase.

public class Person implements java.io.Serializable { }

El objetivo de estos tipos de interfaces solo es comprobar


los tipos. e to
e n s
elic
a b l
Person p = new Person();
fe r
if (p instanceof Serializable) { 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
java.io.Serializable es una interfaz de marcador que usa una biblioteca de E/S de Java

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.

Programacin Java SE 7 6-9


Conversin en tipos de interfaz
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Puede realizar la conversin en un tipo de interfaz.

public static void turnObjectOn(Object o) {


if (o instanceof ElectronicDevice) {
ElectronicDevice e = (ElectronicDevice)o;
e.turnOn();
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
AlM
ara
Instrucciones de conversin
igual que se hace al convertir en tipos de clase, si convierte en un tipo que no es vlido para
i n
w ese objeto, la aplicacin generar una excepcin e incluso se podra bloquear. Para verificar que
Ed una conversin se realizar correctamente, debe usar una prueba instanceof.
En el ejemplo de la diapositiva se muestra un diseo deficiente, ya que el mtodo
turnObjectOn() solo funciona en elementos ElectronicDevice. Usar instanceof y
realizar una conversin agrega sobrecarga en tiempo de ejecucin. Cuando sea posible, utilice
una prueba en tiempo de compilacin reescribiendo el mtodo como:
public static void turnObjectOn(ElectronicDevice e) {
e.turnOn();
}

Programacin Java SE 7 6-10


Uso de tipos de referencia genricos

Utilice el tipo de referencia ms genrico siempre que sea


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

posible:
EmployeeDAO dao = new EmployeeDAOMemoryImpl();
dao.delete(1);
EmployeeDAOMemoryImpl implanta
EmployeeDAO.

Al usar un tipo de referencia de interfaz, puede usar una


clase de implantacin distinta sin correr el riesgo de e to
e n s
interrumpir las siguientes lneas de cdigo:
el ic
a b l
s f er
EmployeeDAOMemoryImpl dao = new EmployeeDAOMemoryImpl();
t r a n
dao.delete(1);
on -
a n
Es posible que solo use mtodosh a s d e
)
maqu. t G u i
EmployeeDAOMemoryImpl
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
e
i ( debe usar el tipo ms genrico posible. Esto significa que, para el objeto que
Al crearr a v
referencias,
M
est ainstanciando, debe declarar la referencia para que sea de un tipo de interfaz o de un tipo de
w i nclase principal. Al hacer esto, todo el uso de la referencia no est ligado a una clase de
Ed implantacin concreta y, si fuera necesario, podra usar otra clase de implantacin. Al usar una
interfaz que implanta varias clases como tipo de referencia, tendr libertad para cambiar la
implantacin sin que el cdigo se vea afectado. Se podra usar una referencia de tipo
EmployeeDAOMemoryImpl para llamar a un mtodo que solo aparezca en la clase
EmployeeDAOMemoryImpl.
Las referencias especificadas en una clase concreta harn que el cdigo est totalmente
acoplado a esa clase y podran provocar una mayor refactorizacin del cdigo cuando se
cambien las implantaciones.

Programacin Java SE 7 6-11


Implantacin y ampliacin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las clases pueden ampliar una clase principal e implantar


una interfaz:
public class AmphibiousCar extends BasicCar implements
MotorizedBoat { }

Tambin puede implantar varias interfaces:


e to
public class AmphibiousCar extends BasicCar implements e n s
MotorizedBoat, java.io.Serializable { } elic
a b l
fe r
a n s
Utilice una coma para separar la o n -tr
lista de interfaces.
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
En primer lugar Extends
utiliza extends y implements, extends debe ir primero.
w i n
Ed

Programacin Java SE 7 6-12


Ampliacin de interfaces
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las interfaces pueden ampliar otras interfaces:


public interface Boat { }

public interface MotorizedBoat extends Boat { }

Al implantar MotorizedBoat, la clase AmphibiousCar e to


n s
debe cumplir el contrato sealado tanto por
e l ice
MotorizedBoat como por Boat: bl ra
f e
public class AmphibiousCar extends BasicCar implements
t r a ns
MotorizedBoat, java.io.Serializable { } n-
a no
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
a v
M ar
win
Ed

Programacin Java SE 7 6-13


Interfaces en jerarquas de herencia
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
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.

Programacin Java SE 7 6-14


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una clase puede implantar varias interfaces.


a. Verdadero
b. Falso

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

Programacin Java SE 7 6-15


Diseo de patrones e interfaces
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Uno de los principios del diseo orientado a objetos es:


Programe para una interfaz, no para una implantacin.
Se trata de un tema comn en muchos patrones de
diseo. Este principio desempea un rol en:
El patrn de diseo DAO
El patrn de diseo de fbrica
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
M ara
Principios del diseo orientado a objetos
Programe para una interfaz, no para una implantacin es una prctica que se populariz gracias
i n
w a la obra Design Patterns: Elements of Reusable Object-Oriented Software (Patrones de diseo:
Ed elementos del software reutilizable orientado a objetos).
Puede obtener ms informacin sobre los principios del diseo orientado a objetos y los patrones
de diseo en el curso Patrones de diseo Java.

Programacin Java SE 7 6-16


Patrn DAO
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El patrn de objeto de acceso a datos (DAO) se usa al crear


una aplicacin que debe mantener informacin. El patrn DAO:
Separa el dominio de problemas del mecanismo de
persistencia.
Usa una interfaz para definir los mtodos usados para la
persistencia. Una interfaz permite sustituir la implantacin
e to
de la persistencia por: e n s
DAO basados en memoria como solucin temporal le lic
a b
DAO basados en archivos para una versin inicial s f er
t r an
DAO basados en JDBC para soportar la persistencia
- de la
o n
base de datos
s an
ha uideJava (JPA) para
DAO basados en la API de persistencia
)
m la base
soportar la persistenciaode t G de datos
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
v
AlM
ara
Por qu se debe separar el cdigo de persistencia del de negocio?
igual que la funcionalidad necesaria de una aplicacin influir en el diseo de las clases, as lo
i n
w harn otros aspectos. En el diseo tambin influyen aspectos como el deseo de que el
Ed mantenimiento sea sencillo y la capacidad de mejorar una aplicacin. El cdigo modular separado
por la funcionalidad es ms fcil de actualizar y mantener.
Al separar la lgica de negocio y de persistencia, las aplicaciones son ms fciles de implantar y
mantener a costa de clases e interfaces adicionales. A menudo estos dos tipos de lgica tienen
distintos ciclos de mantenimiento. Por ejemplo, la lgica de persistencia se tendra que modificar
si la base de datos que usa la aplicacin se hubiera migrado de MySQL a Oracle 11g.
Si crea interfaces para las clases que contienen la lgica de persistencia, resulta ms fcil
sustituir la implantacin de persistencia.

Programacin Java SE 7 6-17


Antes del patrn DAO
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Observe la combinacin de mtodos de persistencia y mtodos


de negocio.

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.

Programacin Java SE 7 6-18


Despus del patrn DAO
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El patrn DAO extrae la lgica de persistencia de las clases


de dominios y las traslada a clases distintas.

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.

Programacin Java SE 7 6-19


La necesidad del patrn de fbrica
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El patrn DAO depende del uso de interfaces para definir una


abstraccin. El uso de un constructor de implantacin DAO le
ata a una implantacin concreta.

EmployeeDAO dao = new EmployeeDAOMemoryImpl();

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

Programacin Java SE 7 6-20


Uso del patrn de fbrica
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Al usar una fbrica, se evita que la aplicacin tenga que estar


totalmente acoplada a una implantacin de DAO concreta.

EmployeeDAOFactory factory = new EmployeeDAOFactory();


EmployeeDAO dao = factory.createEmployeeDAO();

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.

Programacin Java SE 7 6-21


Fbrica
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La implantacin de la fbrica es el nico punto de la


aplicacin que debe depender de clases DAO concretas.

public class EmployeeDAOFactory { Devuelve una referencia


escrita como interfaz

public EmployeeDAO createEmployeeDAO() {


e to
return new EmployeeDAOMemoryImpl(); 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
Para una mayor simplicidad, esta fbrica codifica el nombre de una clase concreta que instanciar.
Podra mejorar esta fbrica colocando el nombre de la clase en un origen externo, como un
w i n
archivo de texto y utilizar la clase java.lang.Class para instanciar la subclase concreta. Un
Ed ejemplo bsico del uso de java.lang.Class es el siguiente:
String name = "com.example.dao.EmployeeDAOMemoryImpl";
Class clazz = Class.forName(name);
EmployeDAO dao = (EmployeeDAO)clazz.newInstance();

Programacin Java SE 7 6-22


Combinacin de DAO y fbrica
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
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

Programacin Java SE 7 6-23


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una implantacin de singleton tpica contiene un mtodo de


fbrica.
a. Verdadero
b. Falso

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

Programacin Java SE 7 6-24


Reutilizacin del cdigo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La duplicacin del cdigo (copiar y pegar) puede conllevar


problemas de mantenimiento. No desea corregir el mismo
bug una y otra vez.
No se repita . (principio DRY, del ingls Don't Repeat
Yourself)
Reutilice el cdigo de la forma correcta:
e to
Refactorice rutinas de uso comn en bibliotecas. e n s
Mueva el comportamiento que comparten las clases ble
lic
hermanas a su clase principal. f e ra
Cree nuevas combinaciones de comportamientost r a ns
o n -
n
combinando varios tipos de objetos (composicin).
a
a s
h 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
Copiar y pegar cdigo no es algo que siempre se deba evitar. Si el cdigo duplicado sirve como
punto de partida y se realizan muchas modificaciones, esto podra ser un comportamiento
w i n
correcto para copiar y pegar lneas de cdigo. Debe ser consciente de qu cantidad de copiado y
Ed pegado se produce en un proyecto. Adems de realizar auditoras de cdigo manuales, hay
herramientas que se pueden usar para detectar el cdigo duplicado. Para consultar un ejemplo de
esto, consulte http://pmd.sourceforge.net/cpd.html.

Programacin Java SE 7 6-25


Dificultades en el diseo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La herencia de clases permite reutilizar cdigo, pero no es algo


muy modular.
Cmo se crea un elemento SpyCarWithSunRoof?

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.

Programacin Java SE 7 6-26


Composicin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La composicin de objetos permite crear objetos ms


complejos. Para implantar la composicin:
1. Cree una clase con referencias a otras clases.
2. Agregue los mismos mtodos de firma que se reenvan
a los objetos a los que se hace referencia.
Composicin e to
e n s
elic
a b l
fe r
a n s
o n -tr
Combinacin de varios mtodos s an
de clases mediante ) hlaa uide
composicinlyco
m tG
el reenvo
a i 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
Delegacin
Mdelegacin y el reenvo de mtodos son dos trminos que se suelen usar indistintamente. El
La
i n
w reenvo de mtodos se produce cuando se escribe un mtodo que no hace nada, excepto
Ed transferir la ejecucin a otro mtodo. En algunos casos, la delegacin puede implicar algo ms
que el simple reenvo. Para obtener ms informacin sobre la diferencia entre los dos conceptos,
consulte la pgina 20 de la obra Design Patterns: Elements of Reusable Object-Oriented
Software.

Programacin Java SE 7 6-27


Implantacin de la composicin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class SpyCarWithSunRoof {


private BasicCar car = new BasicCar();
private SpyCarAddon spyAddon = new SpyCarAddon();
private SunRoofAddon roofAddon = new SunRoofAddon();

public void start() {


car.start(); Reenvo de mtodos e to
e n s
}
elic
a b l
fe r
// other forwarded methods
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
Los asistentes de IDE facilitan la implantacin de la composicin
M implantar la composicin con NetBeans IDE, utilice la herramienta Insert Code de la
Para
i n
w siguiente forma:
Ed 1. Haga clic con el botn derecho en los corchetes de la clase compleja y seleccione "Insert
Code.
2. Seleccione "Delegate Method.
Aparece el cuadro de dilogo Generate Delegate Methods.
3. Seleccione las llamadas de mtodos que desea reenviar.
Los mtodos se insertan.
Repita estos pasos para cada una de las clases delegadas.

Programacin Java SE 7 6-28


Polimorfismo y composicin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El polimorfismo nos debe permitir transferir cualquier tipo de


elemento Car al mtodo addCar. La composicin no permite
el polimorfismo, a menos que

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());

Programacin Java SE 7 6-29


Polimorfismo y composicin

Utilice interfaces para que todas las clases delegadas soporten


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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());

Programacin Java SE 7 6-30


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La delegacin de mtodos es necesaria para crear objetos


complejos mediante:
a. Polimorfismo
b. Composicin

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

Programacin Java SE 7 6-31


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Modelar problemas de negocio mediante interfaces
Definir una interfaz Java
Seleccionar entre herencia de interfaz y herencia de clase
Ampliar una interfaz
Refactorizar cdigo para implantar el patrn DAO 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

Programacin Java SE 7 6-32


Visin general de la prctica 6-1:
Implantacin de una interfaz
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Escritura de una interfaz
Implantacin de una interfaz
Creacin de referencias de un tipo de interfaz
Conversin en tipos de interfaz
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

Programacin Java SE 7 6-33


Visin general de la prctica 6-2:
Aplicacin del patrn DAO
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Reescritura de un objeto de dominio existente con una
implantacin de persistencia basada en memoria con el
patrn DAO
Uso de una fbrica abstracta para evitar la dependencia
de implantaciones concretas
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

Programacin Java SE 7 6-34


(Opcional) Visin general de la prctica 6-3:
Implantacin de la composicin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Reescritura de una aplicacin existentes para soportar
mejor la reutilizacin de cdigo en la composicin
Uso de interfaces para permitir el polimorfismo

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

Programacin Java SE 7 6-35


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Al finalizar esta leccin, debera estar capacitado para:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Crear una clase genrica personalizada


Utilizar el diamante de inferencia de tipo para crear un
objeto
Crear una recopilacin sin utilizar genricos
Crear una recopilacin mediante el uso de genricos
Implantar una ArrayList e to
e n s
Implantar una interfaz Set
le lic
Implantar un HashMap a b
s f er
Implantar una pila mediante el uso de Deque
- t r an
Utilizar tipos enumerados non a
a s
h 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

Programacin Java SE 7 7-2


Genricos

Proporcionan una seguridad flexible al cdigo.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Mueven muchos errores comunes de tiempo de ejecucin


a tiempo de compilacin.
Proporcionan un cdigo ms limpio y fcil de escribir.
Reducen la necesidad de conversin de recopilaciones.
Se utilizan frecuentemente en la API Collections 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
Mara
w i n
Ed

Programacin Java SE 7 7-3


Clase de cach simple sin genricos
public class CacheString {
private String message = "";
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public void add(String message){


this.message = message;
}

public String get(){


return this.message;
}
public class CacheShirt {
e to
}
private Shirt shirt;
e n s
elic
public void add(Shirt shirt){
a b l
this.shirt = shirt;
fe r
}
a n s
o n -tr
an
public Shirt get(){

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

Programacin Java SE 7 7-4


Clase de cach genrica
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class CacheAny <T>{


2
3 private T t;
4
5 public void add(T t){
6 this.t = t;
e to
7 }
e n s
8
elic
a b l
9 public T get(){
fe r
10 return this.t;
a n s
11 } o n -tr
12 } 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
Para crear una versin genrica de la clase CacheAny, se agrega una variable denominada T a

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

Programacin Java SE 7 7-5


Funcionamiento de los genricos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Compare los objetos de tipo restringido con las alternativas


genricas.

1 public static void main(String args[]){


2 CacheString myMessage = new CacheString(); // Type
3 CacheShirt myShirt = new CacheShirt(); // Type
4
e to
5 //Generics
e n s
6 CacheAny<String> myGenericMessage = new CacheAny<String>();
elic
a b l
7 CacheAny<Shirt> myGenericShirt = new CacheAny<Shirt>();
fe r
8
a n s
9 myMessage.add("Save this for me"); // Type
o n -tr
10 myGenericMessage.add("Save this for me"); // Generic
s an
11
) ha uide
12 }
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
Observe cmo la versin genrica de la clase puede sustituir un nmero cualquiera de clases de
cach especficas de tipo. Las funciones add() y get() funcionan exactamente de la misma
w i n
forma. De hecho, si la declaracin myMessage pasa a ser genrica, no es necesario realizar
Ed cambios en el resto del cdigo.
El cdigo de ejemplo se encuentra en el proyecto Generics del archivo TestCacheAny.java.

Programacin Java SE 7 7-6


Genricos con diamante de inferencia de tipo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Programacin Java SE 7 7-7


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cul de las siguientes opciones no es una abreviatura


convencional en el uso de los genricos?
a. T: tabla
b. E: elemento
c. K: clave
d. V: valor 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

Programacin Java SE 7 7-8


Recopilaciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una recopilacin es un objeto nico diseado para


gestionar un grupo de objetos.
Los objetos de una recopilacin se denominan elementos.
No se permite el uso de primitivos en una recopilacin.
Distintos tipos de recopilaciones implantan varias
estructuras de datos comunes:
Pilas, colas, matrices dinmicas o elementos hash. e to
e n s
La API Collections se basa, en
elic
gran medida, en los genricos a b l
fe r
para su implantacin.
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
Una recopilacin es un objeto nico que gestiona un grupo de objetos. Los objetos de la
recopilacin se denominan elementos. Distintos tipos de recopilaciones implantan estructuras de
w i n
datos estndar, entre las que se incluyen pilas, colas, matrices dinmicas y elementos hash.
Ed Todos los objetos de recopilacin se han optimizado para su uso en aplicaciones Java.
Nota: las clases Collections se almacenan en el paquete java.util. Las sentencias import no
se muestran en los siguientes ejemplos, pero son necesarias para todos los tipos de
recopilaciones:
import java.util.List;
import java.util.ArrayList;
import java.util.Map;

Programacin Java SE 7 7-9


Tipos de recopilaciones
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
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.

Programacin Java SE 7 7-10


Interfaz List

List es una interfaz que define el comportamiento


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

de una lista genrica.


Recopilacin ordenada de elementos
List incluye los siguientes
comportamientos:
Adicin de elementos en un ndice especfico
e to
Adicin de elementos al final de la lista e n s
Obtencin de un elemento basado en un ndice le lic
r a b
Eliminacin de un elemento basado en un ndicesfe
Sobrescritura de un elemento basado ennun - an
trndice
Obtencin del tamao de la lista a n
o
hainstancia s
de para ocultar
Utilice List como un objeto) de u i
c o m tG
los detalles de la implantacin.
il n
a tude
g sSm
i @ hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
t
a
Copyright
r
e ma us
a v i(
La interfaz List es la base de todas las clases Collections que muestran el comportamiento de
a r
i n M
una lista.
w
Ed

Programacin Java SE 7 7-11


Clase de implantacin ArrayList
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Se trata de una matriz aumentable de forma dinmica.


La lista crece automticamente si los elementos exceden
el tamao inicial.
Tiene un ndice numrico.
El ndice accede a los elementos.
Los elementos se pueden insertar segn el ndice.
e to
Los elementos se pueden sobrescribir. e n s
elic
Permite los elementos duplicados.
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
Una ArrayList implanta una recopilacin List. La implantacin muestra las caractersticas de

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

Programacin Java SE 7 7-12


ArrayList sin genricos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class OldStyleArrayList {


2 public static void main(String args[]){
3 List partList = new ArrayList(3);
4
5 partList.add(new Integer(1111));
6 partList.add(new Integer(2222));
7 partList.add(new Integer(3333));
8 partList.add("Oops a string!");
e to
9
e n s
10 Iterator elements = partList.iterator();
elic
11 while (elements.hasNext()) {
a b l
12 Integer partNumberObject = (Integer) (elements.next()); // error?
fe r
13 int partNumber = (int) partNumberObject.intValue();
a n s
14
o n -tr
15 System.out.println("Part number: " + partNumber);
s an
ha uide
16 }
17 }
m tG )
c o n
il
18 }
a 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
En el ejemplo de la diapositiva, se crea una lista de nmeros de artculos mediante el uso de una
ArrayList. Con el uso de la sintaxis anterior a la versin 1.5 de Java, no existe la definicin de
w i n
tipo. Por tanto, los tipos se pueden agregar a la lista tal y como se muestra en la lnea 8. Depende
Ed del programador saber cules son los objetos que estn en la lista y su orden. Si la lista fuera
solo para objetos Integer, se producira un error de tiempo de ejecucin en la lnea 12.
En las lneas de la 10 a la 16, con una recopilacin no genrica, se utiliza un elemento Iterator
para iterar con la lista de elementos. Observe que es necesario realizar un gran nmero de
conversiones para volver a extraer los objetos de la lista con el fin de imprimir los datos.
Al final, hay una gran cantidad de azcar sintctica (cdigo adicional) innecesaria que funciona
con las recopilaciones de esta forma.
Si se comenta la lnea que agrega el elemento String a la ArrayList, el programa produce la
siguiente salida:
Part number: 1111
Part number: 2222
Part number: 3333

Programacin Java SE 7 7-13


ArrayList genrica
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Programacin Java SE 7 7-14


ArrayList genrica: Iteracin y empaquetado
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

for (Integer partNumberObj:partList){


int partNumber = partNumberObj; // Demos auto unboxing
System.out.println("Part number: " + partNumber);
}

El bucle for mejorado o el bucle for-each proporcionan to


un cdigo ms limpio. n s e
La conversin no se realiza debido al empaquetado ble l
ice
automtico y el desempaquetado. fera s
- t r an
no n
a
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 uso del bucle for-each es ms sencillo y proporciona un cdigo ms limpio. No se realizan

i n M
las conversiones debido a la funcin de desempaquetado automtico de Java.
w
Ed

Programacin Java SE 7 7-15


Empaquetado automtico y desempaquetado

Simplifica la sintaxis.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Produce un cdigo ms limpio y fcil de leer.

1 public class AutoBox {


2 public static void main(String[] args){
3 Integer intObject = new Integer(1);
4 int intPrimitive = 2;
e to
5
e n s
6 Integer tempInteger;
elic
7 int tempPrimitive;
a b l
8 fe r
a n s
-tr
9 tempInteger = new Integer(intPrimitive);
10 tempPrimitive = (int) intObject.intValue(); o n
11
s an
12 tempInteger = intPrimitive; // Auto box
) ha uide
13
c o
tempPrimitive = intObject; // Auto unboxm 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
Las lneas 9 y 10 muestran un mtodo tradicional para el movimiento entre objetos y primitivos.
Las lneas 12 y 13 muestran el empaquetado y desempaquetado.
i n
w Empaquetado automtico y desempaquetado
Ed El empaquetado automtico y el desempaquetado son funciones del lenguaje Java que le
permiten realizar asignaciones razonables sin el uso de la sintaxis de conversin formal. Java
ofrece las conversiones en el momento de la compilacin.
Nota: tenga cuidado a la hora de utilizar el empaquetado automtico en un bucle. El uso de esta
funcin implica un coste de rendimiento.

Programacin Java SE 7 7-16


Prueba

Cul de las siguientes opciones declara una Integer


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

ArrayList con tres elementos?


a. List<Integer> partList = new ArrayList<>(three);
b. List<Integer> partList = new ArrayList<>[3];
c. List<Integer> partList = new ArrayList<>(three);
d. List<Integer> partList = new ArrayList<>(3);
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

Programacin Java SE 7 7-17


Interfaz Set

Set es una lista que contiene solo elementos nicos.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una interfaz Set no tiene ndice.


No se permite el uso de elementos duplicados en una
interfaz Set.
Puede iterar con elementos para acceder a ellos.
TreeSet ofrece una implantacin ordenada. to
n s e
ic e
b l el
fe r a
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
Por ejemplo, se puede utilizar un elemento Set para realizar un seguimiento de una lista de
nmeros de artculo nicos.
w i n
Ed

Programacin Java SE 7 7-18


Interfaz Set: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una interfaz Set es una recopilacin de elementos nicos.

1 public class SetExample {


2 public static void main(String[] args){
3 Set<String> set = new TreeSet<>();
4
5 set.add("one");
e to
6 set.add("two");
e n s
7 set.add("three");
elic
a b l
8 set.add("three"); // not added, only unique
fe r
9
a n s
10 for (String item:set){
o n -tr
11 System.out.println("Item: " + item);
s an
ha uide
12 }
13 }
m tG )
c o n
14 }
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
Una interfaz Set es una recopilacin de elementos nicos. Este ejemplo utiliza un elemento
TreeSet, que ordena los elementos en la interfaz Set. Si se ejecuta el programa, la salida es la
w i n
siguiente:
Ed Item: one
Item: three
Item: two

Programacin Java SE 7 7-19


Interfaz Map
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Recopilacin que almacena varios pares clave-valor.


Clave: identificador nico de cada elemento de una
recopilacin
Valor: valor almacenado en el elemento asociado a la clave
Se denomina matriz asociativa en otros lenguajes.
e to
e n s
Clave Valor
elic
101 Blue Shirt a b l
fe r
102 Black Shirt a n s
o n -tr
103 Gray Shirt
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
Map resulta til para realizar un seguimiento de elementos, como listas de artculos y sus

i n M
descripciones (tal y como se muestra en la diapositiva).
w
Ed

Programacin Java SE 7 7-20


Tipos de Map
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
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.

Programacin Java SE 7 7-21


Interfaz Map: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class MapExample {


public static void main(String[] args){
Map <String, String> partList = new TreeMap<>();
partList.put(S001", "Blue Polo Shirt");
partList.put(S002", "Black Polo Shirt");
partList.put(H001", "Duke Hat");

e to
partList.put(S002", "Black T-Shirt"); // Overwrite value
e n s
Set<String> keys = partList.keySet();
elic

a b l
System.out.println("=== Part List ===");
fe r
for (String key:keys){
a n s
System.out.println("Part#: " + key + " " +
o n -tr
an
partList.get(key));
}
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
El ejemplo muestra cmo crear una interfaz Map y realizar operaciones estndar en ella. La salida

i n M
del programa es:
w
Ed
=== Part List ===
Part#: 111111 Blue Polo Shirt
Part#: 222222 Black T-Shirt
Part#: 333333 Duke Hat

Programacin Java SE 7 7-22


Interfaz Deque
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Recopilacin que se puede utilizar como pila o cola.


Significa cola de dos extremos (y se pronuncia deck).
Una cola proporciona operaciones FIFO (primero en
entrar, primero en salir).
Mtodos add(e) y remove()
Una pila proporciona operaciones LIFO e to
e n s
(ltimo en entrar, primero en salir). ic
Mtodos push(e) y pop() b l el
fe r a
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
Deque es una interfaz secundaria de Collection (al igual que Set y List).

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.

Programacin Java SE 7 7-23


Pila con Deque: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class TestStack {


2 public static void main(String[] args){
3 Deque<String> stack = new ArrayDeque<>();
4 stack.push("one");
5 stack.push("two");
6 stack.push("three");
7
e to
8 int size = stack.size() - 1;
e n s
elic
9 while (size >= 0 ) {
a b l
10 System.out.println(stack.pop());
fe r
11 size--;
a n s
12 }
o n -tr
13 }
s an
14 }
) 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
Deque (pronunciado deck) es una cola de dos extremos. Esto significa fundamentalmente que
Deque se puede utilizar como cola (operaciones FIFO [primero en entrar, primero en salir]) o
w i n
como pila (operaciones LIFO [ltimo en entrar, primero en salir]).
Ed

Programacin Java SE 7 7-24


Ordenacin de recopilaciones

Las interfaces Comparable y Comparator se utilizan


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

para ordenar recopilaciones.


Las dos se implantan mediante el uso de genricos.
Uso de la interfaz Comparable:
Sustituye al mtodo compareTo.
Proporciona una nica opcin de ordenacin.
e to
Uso de la interfaz Comparator: e n s
lic
Se implanta mediante el uso del mtodo compare. able
Permite crear varias clases Comparator. s f er
n ra
-t ordenacin.
Permite crear y utilizar distintas opcionesnde
a no
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
La API Collections ofrece dos interfaces para la ordenacin de elementos: Comparable y

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.

Programacin Java SE 7 7-25


Interfaz Comparable

Uso de la interfaz Comparable:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Sustituye al mtodo compareTo.


Proporciona una nica opcin de ordenacin.

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

Programacin Java SE 7 7-26


Comparable: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class ComparableStudent implements Comparable<ComparableStudent>{


2 private String name; private long id = 0; private double gpa = 0.0;
3
4 public ComparableStudent(String name, long id, double gpa){
5 // Additional code here
6 }
7 public String getName(){ return this.name; }
8 // Additional code here
e to
9
e n s
10 public int compareTo(ComparableStudent s){
elic
11 int result = this.name.compareTo(s.getName());
a b l
fe r
12 if (result > 0) { return 1; }
a n s
-tr
13 else if (result < 0){ return -1; }
14 else { return 0; }
o n
15 }
s an
16 }
) 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
El ejemplo de la diapositiva implanta la interfaz Comparable y el mtodo compareTo. Observe

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.

Programacin Java SE 7 7-27


Prueba de Comparable: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class TestComparable {


2 public static void main(String[] args){
3 Set<ComparableStudent> studentList = new TreeSet<>();
4
5 studentList.add(new ComparableStudent("Thomas Jefferson", 1111,
3.8));
6 studentList.add(new ComparableStudent("John Adams", 2222, 3.9));
7 studentList.add(new ComparableStudent("George Washington", 3333,
e to
3.4));
e n s
8
elic
9 for(ComparableStudent student:studentList){
a b l
10 System.out.println(student);
fe r
11 }
a n s
12 }
o n -tr
13 }
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
En el ejemplo de la diapositiva, se crea una ArrayList de elementos ComparableStudent.

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().

Programacin Java SE 7 7-28


Interfaz Comparator

Uso de la interfaz Comparator:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Se implanta mediante el uso del mtodo compare.


Permite crear varias clases Comparator.
Permite crear y utilizar distintas opciones de ordenacin.

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

Programacin Java SE 7 7-29


Comparator: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class StudentSortName implements Comparator<Student>{


public int compare(Student s1, Student s2){
int result = s1.getName().compareTo(s2.getName());
if (result != 0) { return result; }
else {
return 0; // Or do more comparing
}
}
e to
}
e n s
elic
public class StudentSortGpa implements Comparator<Student>{
a b l
public int compare(Student s1, Student s2){
fe r
if (s1.getGpa() < s2.getGpa()) { return 1; }
a n s
else if (s1.getGpa() > s2.getGpa()) { return -1; }
o n -tr
else { return 0; }
s an
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
El ejemplo de la diapositiva muestra las clases Comparator creadas para la ordenacin segn

i n M
Name y GPA. Para la comparacin de nombres, se han simplificado las sentencias if.
w
Ed

Programacin Java SE 7 7-30


Prueba de Comparator: ejemplo

1 public class TestComparator {


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 public static void main(String[] args){


3 List<Student> studentList = new ArrayList<>(3);
4 Comparator<Student> sortName = new StudentSortName();
5 Comparator<Student> sortGpa = new StudentSortGpa();
6
7 // Initialize list here
8
9 Collections.sort(studentList, sortName);
e to
10 for(Student student:studentList){
e n s
11 System.out.println(student);
elic
a b l
12 }
fe r
13
a n s
14
15
Collections.sort(studentList, sortGpa);
for(Student student:studentList){ o n -tr
16 System.out.println(student);
s an
17 }
) ha uide
18 }
c o m tG
19 }
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
El ejemplo de la diapositiva muestra cmo los dos objetos Comparator se utilizan con una

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().

Programacin Java SE 7 7-31


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Qu interfaz utilizara para crear varias opciones de


ordenacin para una recopilacin?
a. Comparable
b. Comparison
c. Comparator
d. Comparinator 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

Programacin Java SE 7 7-32


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Crear una clase genrica personalizada
Utilizar el diamante de inferencia de tipo para crear un
objeto
Crear una recopilacin sin utilizar genricos
Crear una recopilacin mediante el uso de genricos e to
e n s
Implantar una ArrayList
le lic
Implantar una interfaz Set a b
s f er
Implantar un HashMap tran n-
Implantar una pila mediante el uso no
s a
de Deque
) a
h uide
m tG
co
Utilizar tipos enumerados n
ail tude
g sSm
i @ hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
t
a
Copyright
r
e ma us
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 7-33


Visin general de la prctica 7-1:
Recuento de nmeros de artculo
mediante el uso de un HashMap
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Creacin de una asignacin para almacenar un nmero
de artculo y el recuento
Creacin de una asignacin para almacenar un nmero
de artculo y la descripcin
e to
Procesamiento de la lista de artculos y generacin de e n s
lic
un informe ble ra
f e
tra ns
n -
a no
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
Mara
w i n
Ed

Programacin Java SE 7 7-34


Visin general de la prctica 7-2:
Coincidencia de parntesis mediante Deque
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica se aborda el procesamiento de las sentencias


de programacin para asegurar que coincide el nmero de
parntesis.

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

Programacin Java SE 7 7-35


Visin general de la prctica 7-3:
Recuento de inventario y ordenacin con
elementos Comparator
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica se aborda el procesamiento de transacciones


de inventario que generan dos informes ordenados de forma
distinta mediante el uso de elementos Comparator.

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

Programacin Java SE 7 7-36


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Al finalizar esta leccin, debera estar capacitado para:


Leer datos de la lnea de comandos
Buscar cadenas
Analizar cadenas
Crear cadenas mediante StringBuilder
Buscar cadenas mediante el uso de expresiones regulares e to
n s
Analizar cadenas mediante el uso de expresiones
e l ice
regulares
r a bl
Sustituir cadenas mediante el uso de expresiones n s fe
a
regulares n-tr no
a
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
Mara
w i n
Ed

Programacin Java SE 7 8-2


Argumentos de lnea de comandos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Todas las aplicaciones de tecnologa Java pueden utilizar


argumentos de lnea de comandos.
Estos argumentos de cadena se colocan en la lnea de
comandos para iniciar el intrprete de Java despus del
nombre de la clase:
java TestArgs arg1 arg2 "another arg"
e to
Cada argumento de la lnea de comandos se coloca en la ic e n s
matriz args que se transfiere al mtodo main esttico:ble
l
f e ra
public static void main(String[] args)
tra ns
n -
a no
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
M ara
Al iniciar un programa Java en una ventana de terminal, puede proporcionar el programa con cero
o ms argumentos de lnea de comandos.
i n
w Los argumentos de lnea de comandos permiten al usuario especificar la informacin de
Ed configuracin de la aplicacin. Estos argumentos son cadenas: pueden ser tokens autnomos
(como arg1) o cadenas entre comillas (como "another arg").

Programacin Java SE 7 8-3


Argumentos de lnea de comandos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class TestArgs {


public static void main(String[] args) {
for ( int i = 0; i < args.length; i++ ) {
System.out.println("args[" + i + "] is '" +
args[i] + "'");
}
}
e to
}
e n s
Ejecucin de ejemplo: elic
a b l
java TestArgs "Ted Baxter" 45 100.25
fe r
args[0] is 'Ted Baxter'
a n s
args[1] is '45'
o n -tr
args[2] is '100.25'
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
Los argumentos de lnea de comandos se transfieren siempre al mtodo main como cadenas,
independientemente del tipo de destino. Si una aplicacin requiere argumentos de lnea de
w i n
comandos que no sean del tipo String (por ejemplo, valores numricos), la aplicacin debe
Ed convertir los argumentos de cadena en sus tipos correspondientes mediante el uso de las clases
envoltorio, como el mtodo Integer.parseInt, que se puede utilizar para convertir el
argumento de cadena que representa al nmero entero en el tipo int.

Programacin Java SE 7 8-4


Propiedades

La clase java.util.Properties se utiliza para cargar


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

y guardar pares clave-valor en Java.


Se pueden almacenar en un archivo de texto simple:
hostName = www.example.com
userName = user
password = pass
e to
e n s
El nombre del archivo termina en .properties. elic
a b l
El archivo puede estar en cualquier fe r
ubicacin en la que el compilador a n s
o n -tr
pueda encontrarlo.
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
La ventaja de un archivo de propiedades es la capacidad de definir valores para la aplicacin de
forma externa. El archivo de propiedades se suele leer al inicio de la aplicacin y se utiliza para los
w i n
valores por defecto. Sin embargo, el archivo de propiedades puede ser tambin una parte integral
Ed de un esquema de localizacin en el que almacena los valores de las etiquetas de men y el texto
para los distintos idiomas que puede soportar la aplicacin.
La regla de nomenclatura para el archivo de propiedades es <nombre_archivo>.properties,
aunque el archivo puede tener la extensin que desee. El archivo puede estar en cualquier
ubicacin en la que la aplicacin pueda encontrarlo.

Programacin Java SE 7 8-5


Carga y uso de un archivo de propiedades
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public static void main(String[] args) {


2 Properties myProps = new Properties();
3 try {
4 FileInputStream fis = new FileInputStream("ServerInfo.properties");
5 myProps.load(fis);
6 } catch (IOException e) {
7 System.out.println("Error: " + e.getMessage());
8 }
e to
9
e n s
10 // Print Values
elic
11 System.out.println("Server: " + myProps.getProperty("hostName"));
a b l
12 System.out.println("User: " + myProps.getProperty("userName"));
fe r
13 System.out.println("Password: " + myProps.getProperty("password"));
a n s
14 }
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
En el fragmento de cdigo, se crea un objeto Properties. A continuacin, mediante una

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.

Programacin Java SE 7 8-6


Carga de propiedades desde
la lnea de comandos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La informacin sobre propiedades tambin se puede


transferir en la lnea de comandos.
Utilice la opcin D para transferir pares clave-valor:
java Dpropertyname=value Dpropertyname=value myApp

Por ejemplo, transfiera uno de los valores anteriores: to


n s e
java Dusername=user myApp
ic e
b l el
r a
sfe
Obtenga los datos de Properties del objeto System:
an
- t r
String userName = System.getProperty("username");
n on
s a
) 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
e
i ( sobre propiedades tambin se puede transferir en la lnea de comandos. La
a v
La informacin
M ar de la transferencia de propiedades desde la lnea de comandos es la simplicidad, ya que
ventaja
winno tiene que abrir un archivo y leerlo. Sin embargo, si tiene ms de unos pocos parmetros, es
Ed preferible utilizar un archivo de propiedades.

Programacin Java SE 7 8-7


PrintWriter y la consola

Si ya no desea utilizar System.out.println() para imprimir


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

texto en la consola, existe una alternativa.

import java.io.PrintWriter;

public class PrintWriterExample {


e to
public static void main(String[] args){
e n s
PrintWriter pw = new PrintWriter(System.out, true);
elic
pw.println("This is some output.");
a b l
fe r
a n s
-tr
}
} 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
ara
Si no desea introducir System.out.whatever una y otra vez, puede utilizar 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

Programacin Java SE 7 8-8


Formato printf

Java proporciona varias opciones para aplicar formato a las


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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.

Programacin Java SE 7 8-9


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cules son las dos sentencias de impresin con formato


vlidas?
a. System.out.printf("%s Polo shirts cost
$%3.2f.\n", "Red", "35.00");
b. System.out.format("%s Polo shirts cost
$%3.2f.\n", "Red", "35.00"); e to
e n s
c. System.out.println("Red Polo shirts
le lic
a b
cost $35.00.\n");
s f er
d. System.out.print("Red Polo shirts
- t r an cost
$35.00.\n"); non a
a s
h 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

Programacin Java SE 7 8-10


Procesamiento de cadenas

StringBuilder para construir la cadena


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Mtodos de cadena incorporados


Bsqueda
Anlisis
Extraccin de subcadenas
Anlisis con StringTokenizer 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
La primera parte de esta seccin abarca las funciones de cadena que no son expresiones
regulares. Para realizar manipulaciones de cadenas simples, existe una serie de mtodos
w i n
incorporados muy tiles.
Ed

Programacin Java SE 7 8-11


StringBuilder y StringBuffer

StringBuilder y StringBuffer son las herramientas


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

preferidas cuando la concatenacin de cadenas no es


trivial.
Ms eficaces que +
Simultaneidad
StringBuilder (sin proteccin de thread)
e to
StringBuffer (con proteccin de thread) e n s
lic
Definicin de la capacidad con el tamao realmente ble
necesario. f e ra
s n
- tra puede
El cambio continuo de tamao del bufferntambin
o
an
producir problemas de rendimiento.
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
Las clases StringBuilder y StringBuffer son la forma recomendable de concatenar

i n M
cadenas.
w
Ed

Programacin Java SE 7 8-12


StringBuilder: ejemplo

public class StringBuilding {


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public static void main(String[] args){


StringBuilder sb = new StringBuilder(500);

sb.append(", the lightning flashed and the thunder


rumbled.\n");
sb.insert(0, "It was a dark and stormy night");

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

Programacin Java SE 7 8-13


Mtodos de cadena de ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class StringMethodsExample {


2 public static void main(String[] args){
3 PrintWriter pw = new PrintWriter(System.out, true);
4 String tc01 = "It was the best of times";
5 String tc02 = "It was the worst of times";
6
7 if (tc01.equals(tc02)){
e to
8 pw.println("Strings match..."); }
e n s
9 if (tc01.contains("It was")){
elic
a b l
10 pw.println("It was found"); }
fe r
11 String temp = tc02.replace("w", "zw");
a n s
12 pw.println(temp);
o n -tr
13 pw.println(tc02.substring(5, 12));
s an
14 }
) ha uide
15 }
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 cdigo de la diapositiva muestra algunos de los mtodos de cadena ms tiles de la clase
String.
w i n equals(): prueba la igualdad del contenido de dos cadenas. Se prefiere a ==, que prueba
Ed si dos objetos apuntan a la misma referencia.
contains(): busca una cadena para ver si contiene la cadena proporcionada.
replace(): busca la cadena determinada y sustituye las instancias con la cadena de
destino proporcionada. Hay un mtodo replaceFirst() para sustituir solo la primera
instancia.
substring(): devuelve una cadena en funcin de su posicin en la cadena.
La ejecucin de los programas que se muestran en la diapositiva devuelve la siguiente salida:
It was found
It zwas the zworst of times
s the w

Programacin Java SE 7 8-14


Uso del mtodo split()
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class StringSplit {


2 public static void main(String[] args){
3 String shirts = "Blue Shirt, Red Shirt, Black
Shirt, Maroon Shirt";
4
5 String[] results = shirts.split(", ");
6 for(String shirtStr:results){
e to
7 System.out.println(shirtStr); e n s
elic
8 }
a b l
9 }
fe r
10 }
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 forma ms sencilla de analizar una cadena es utilizar el mtodo split(). Llame al mtodo

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

Programacin Java SE 7 8-15


Anlisis con StringTokenizer
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class StringTokenizerExample {


2 public static void main(String[] args){
3 String shirts = "Blue Shirt, Red Shirt, Black Shirt, Maroon
Shirt";
4
5 StringTokenizer st = new StringTokenizer(shirts, ", ");
6
7 while(st.hasMoreTokens()){
e to
8 System.out.println(st.nextToken());
e n s
9 }
elic
a b l
10 }
fe r
11 }
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 clase StringTokenizer realiza la misma funcin que split() pero con un enfoque

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

Programacin Java SE 7 8-16


Scanner
Una clase Scanner puede convertir en un token una cadena o un flujo.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public static void main(String[] args) {


2 Scanner s = null;
3 StringBuilder sb = new StringBuilder(64);
4 String line01 = "1.1, 2.2, 3.3";
5 float fsum = 0.0f;
6
7 s = new Scanner(line01).useDelimiter(", ");
8 try {
e to
9 while (s.hasNextFloat()) {
e n s
10 float f = s.nextFloat();
elic
11 fsum += f;
a b l
12 sb.append(f).append(" "); fe r
a n s
-tr
13 }
14
o
System.out.println("Values found: " + sb.toString());n
15 System.out.println("FSum: " + fsum);
s an
16 } catch (Exception e) {
) ha uide
17
m tG
System.out.println(e.getMessage());
c o
18 }
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
Una clase Scanner se puede utilizar para convertir en un token un flujo de entrada o una

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

Programacin Java SE 7 8-17


Expresiones regulares
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Lenguaje para coincidencias de cadenas de texto


Vocabulario muy detallado
Bsqueda, extraccin o bsqueda y sustitucin
Con Java, el uso de la barra invertida (\) es importante.
Objetos Java
Pattern e to
e n s
Matcher ic
b l el
PatternSyntaxException
fe r a
java.util.regex
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

Programacin Java SE 7 8-18


Pattern y Matcher

Pattern: define una expresin regular


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Matcher: especifica una cadena de bsqueda


1 import java.util.regex.Matcher;
2 import java.util.regex.Pattern;
3

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!

Programacin Java SE 7 8-19


Clases de caracteres
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Carcter Descripcin

. Coincide con cualquier carcter nico (letra, dgito o carcter especial),


salvo marcadores de final de lnea.
[abc] Coincidira con a, b o c en esa posicin.

Coincidira con cualquier carcter que no fuera a, b o c en esa


[^abc]
posicin. e to
e n s
[a-c] Rango de caracteres (en este caso, a, b y c).
elic
a b l
| Alternancia; bsicamente un indicador or. 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
Las clases de caracteres le permiten buscar coincidencias con un carcter de varias formas.
M
w i n
Ed

Programacin Java SE 7 8-20


Clase de caracteres: ejemplos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cadena de destino It was the best of times

Patrn Descripcin Texto de


coincidencia
w.s Cualquier secuencia que It was the best of
empiece por w seguida de times
cualquier carcter seguido de s. e to
e n s
w[abc]s Cualquier secuencia que It was the best of
el ic
empiece por w seguida de a, times
a b l
b o c y, a continuacin, s. fe r
a n s
t[^aeo]mes Cualquier secuencia que
n r the best of
It-twas
empiece por t seguida de o
n times
cualquier carcter que no sea a
s de
h
) Gui
a, e u o seguida de mes.
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
Puede encontrar el cdigo de este ejemplo en el proyecto StringExamples en el archivo

i n M
CustomCharClassExamples.java.
w
Ed

Programacin Java SE 7 8-21


Cdigo de clase de caracteres: ejemplos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class CustomCharClassExamples {


2 public static void main(String[] args) {
3 String t = "It was the best of times";
4
5 Pattern p1 = Pattern.compile("w.s");
6 Matcher m1 = p1.matcher(t);
7 if (m1.find()) { System.out.println("Found: " + m1.group());
8 }
e to
9
e n s
10 Pattern p2 = Pattern.compile("w[abc]s");
elic
11 Matcher m2 = p2.matcher(t);
a b l
12 if (m2.find()) { System.out.println("Found: " + m2.group());
fe r
13 }
a n s
14
o n -tr
an
15 Pattern p3 = Pattern.compile("t[^eou]mes");
16 Matcher m3 = p3.matcher(t);
s
ha uide
17
)
if (m3.find()) { System.out.println("Found: " + m3.group());
m tG
18 }
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
En el ejemplo de la diapositiva se muestran dos formas de buscar was y una forma de buscar

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.

Programacin Java SE 7 8-22


Clases de caracteres predefinidas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Carcter Clase de Carcter Clase negada


predefinido caracteres negado
\d (dgito) [0-9] \D [^0-9]

\w (carcter [a-zA-Z0-9_] \W [^a-zA-Z0-9_]


alfanumrico)
\s (espacio en [ \r\t\n\f\0XB] \S [^ \r\t\n\f\0XB]
e to
blanco) 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
Hay varias clases de caracteres que se utilizan de forma repetida. Estas clases se convierten en
clases de caracteres predefinidas. Las clases existen para identificar dgitos, caracteres
w i n
alfanumricos y espacios en blanco.
Ed Caracteres de espacio en blanco
\t: carcter de tabulacin
\n: carcter de nueva lnea
\r: retorno de carro
\f: avance de pgina
\x0B: tabulador vertical

Programacin Java SE 7 8-23


Clases de caracteres predefinidas: ejemplos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cadena de destino Jo told me 20 ways to San Jose in 15 minutes.

Patrn Descripcin Texto de


coincidencia
\\d\\d Buscar dos dgitos.** Jo told me 20 ways
to San Jose in
15 minutes. e to
e n s
\\sin\\s Buscar in entre dos espacios y, Jo told me 20 ways
el ic
a continuacin, los tres to San Jose in
a b l
caracteres siguientes. 15 minutes.fe r
a n s
\\Sin\\S Buscar in entre dos
o n -trtold me 20 ways
Jo
caracteres que no sean de n to San Jose in
espacio y, a continuacin, los a
s de15 minutes.
tres caracteres siguientes. 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
** Si hay ms coincidencias en la lnea actual, las llamadas adicionales a find() devolvern la

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.

Programacin Java SE 7 8-24


Cuantificadores
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cuantificador Descripcin

* El carcter precedente se repite cero o ms veces.

+ El carcter precedente se repite una o ms veces.

? El carcter precedente debe aparecer una vez o ninguna.


e to
{n} El carcter precedente aparece exactamente n veces.
e n s
elic
{m,n} El carcter precedente aparece de m a n veces.
a b l
fe r
{m,} El carcter precedente aparece m o ms veces.
a n s
(xx){n} Este grupo de caracteres se repite n veces. 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
Los cuantificadores le permiten seleccionar fcilmente un rango de caracteres en las consultas.
M
w i n
Ed

Programacin Java SE 7 8-25


Cuantificador: ejemplos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cadena de destino Longlonglong ago, in a galaxy far far away

Patrn Descripcin Texto de


coincidencia
ago.* Buscar ago y 0 o todos los Longlonglong ago, in
caracteres restantes en la lnea. a galaxy far far away
e to
gal.{3} Coincidir con gal y los tres Longlonglong ago, in e n s
caracteres siguientes. Esto a galaxy far far away el ic
a b l
sustituye a como se utiliza
fe r
en un ejemplo anterior.
a n s
(long){2} Buscar long repetido dos o n -tr
Longlonglong ago, in
veces. n
a a galaxy far far away
a s
h 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 encontrar el cdigo de este ejemplo en el proyecto StringExamples en el archivo

i n M
QuantifierExample.java.
w
Ed

Programacin Java SE 7 8-26


Voracidad
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una expresin regular intenta recuperar siempre tantos


caracteres como sea posible.
Utilice el operador ? para limitar la bsqueda al menor
nmero de coincidencias posible.
Cadena de destino Longlonglong ago, in a galaxy far far away.

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.

Programacin Java SE 7 8-27


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Qu smbolo significa que el carcter se repite una o ms


veces?
a. *
b. +
c. .
d. ? 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

Programacin Java SE 7 8-28


Coincidencias de lmite
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Fijacin Descripcin

^ Coincide con el principio de una lnea.

$ Coincide con el final de una lnea.

\b Coincide con el inicio o el final de una palabra.


e to
\B No coincide con el principio o el final de una palabra.
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
Los caracteres de lmite se pueden utilizar para la coincidencia con distintas partes de una lnea.
M
w i n
Ed

Programacin Java SE 7 8-29


Lmite: ejemplos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cadena de destino it was the best of times or it was the worst of times

Patrn Descripcin Texto de


coincidencia
^it.*?times Secuencia que empieza una It was the best of
lnea con it seguido de algunos times or it was the
caracteres y times, con la worst of times e to
voracidad desactivada. e n s
el ic
\\sit.*times$ Secuencia que empieza con it b
It was the best of
a l
seguido de algunos caracteres y fe r
times or it was the
termina la lnea con times. a n s
worst of times
o n -tr
\\bor\\b.{3} Buscar or entre lmites de n It was the best of
palabras y los tres caracteres s a times or it was the
siguientes. ) a
h uide worst of times
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
Puede encontrar el cdigo de este ejemplo en el proyecto StringExamples en el archivo

i n M
BoundaryCharExample.java.
w
Ed

Programacin Java SE 7 8-30


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Qu smbolo coincide con el final de lnea?


a. *
b. +
c. $
d. ^
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

Programacin Java SE 7 8-31


Coincidencia y grupos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cadena de destino george.washington@example.com

Coincidencia de 3 partes (george).(washington)@(example.com)

Nmeros de grupo ( 1 ).( 2 )@( 3 )


e to
e n s
elic
Patrn (\\S+?)\\.(\\S+?)\\@(\\S+)
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
Con las expresiones regulares, puede utilizar los parntesis para identificar partes de una cadena
para la coincidencia. En el ejemplo, se coincide con las distintas partes de una direccin de
w i n
correo electrnico. Observe cmo se ha numerado cada par de parntesis. En una expresin
Ed regular, group(0) coincide con todas las coincidencias de texto del uso de grupos. A
continuacin, se muestra el cdigo fuente del ejemplo:
public class MatchingExample {
public static void main(String[] args){
String email = "george.washington@example.com";

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

Con el mtodo replaceAll puede buscar y sustituir


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

elementos.

public class ReplacingExample {


public static void main(String[] args){
String header = "<h1>This is an H1</h1>";

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>

Programacin Java SE 7 8-33


Resumen

En esta leccin, debe haber aprendido a hacer lo siguiente:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Leer datos de la lnea de comandos


Buscar cadenas
Analizar cadenas
Crear cadenas mediante StringBuilder
Buscar cadenas mediante el uso de expresiones regulares
e to
Analizar cadenas mediante el uso de expresiones n s
l i ce
regulares bl e
fe r a
Sustituir cadenas mediante el uso de expresioness
a n
regulares n-tr no
a
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
Mara
w i n
Ed

Programacin Java SE 7 8-34


Visin general de la prctica 8-1:
Anlisis de texto con split()
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica se aborda el uso del mtodo


String.split() para analizar texto.

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

Programacin Java SE 7 8-35


Visin general de la prctica 8-2:
Creacin de un programa de bsqueda de
expresiones regulares
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica se aborda la creacin de un programa que


busque un archivo de texto mediante una expresin regular.

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

Programacin Java SE 7 8-36


Visin general de la prctica 8-3:
Transformacin de HTML mediante
expresiones regulares
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Esta prctica aborda la transformacin del cdigo HTML de


un archivo mediante el uso de varias expresiones regulares.

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

Programacin Java SE 7 8-37


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

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

Вам также может понравиться