You are on page 1of 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(