Está en la página 1de 267

Core Java

Cdigo del Curso: CY420


Versin: 5.1

Gua del Estudiante

Libro 1: Core Java

IBM Training
Worldwide Certified Material

Informacin Sobre la Publicacin


Esta publicacin ha sido producida usando Microsoft Word 2000 y Microsoft PowerPoint
2000 para Windows.
Marcas Registradas
IBM es una marca registrada por International Business Machines Corporation.
Otras compaas, productos, y nombre de servicios pueden ser marcas registradas o
marcas de servicios de otros.
Marcas Registradas de otras Compaas
HotJava browser, Java Development Kit (JDK), Java, Java Servlet, Solaris, Enterprise
Java Beans, Java Server Pages, JDK, JSP Sun Microsystems, Microsoft MAKECAB,
Windows operating system, ASP, VB, .NET, VC++, Microsoft Access, Microsoft SQL
Server, Microsoft ODBC for Oracle Microsoft Corp, WinZip Nico Mak Computing,
Inc., Time Time Warner, JDBC Javasoft, Oracle Oracle Corporation, Sybase
Sybase Inc., UDB DB2 IBM.
Edicin Octubre 2007
La informacin contenida en este documento no ha sido sometida a ninguna prueba
formal de IBM y es distribuida bsicamente como es" sin ninguna garanta ya sea
expresa o implcita. El uso de esta informacin o la implementacin de cualquiera de
estas tcnicas es responsabilidad del comprador y depender de la habilidad de ste
para su evaluacin e integracin en el ambiente operacional del comprador. A pesar de
que cada tema ha sido revisado por IBM para su exactitud en una situacin especfica,
no hay garanta de que obtener el mismo resultado o uno similar a ste en otra
situacin. Los compradores que intenten adaptar estas tcnicas a sus propios
ambientes lo hacen bajo su propio riesgo.
Copyright International Business Machines Corporation, 2007. All rights reserved.
Este documento no puede ser reproducido en su totalidad o en parte sin el previo
permiso escrito de IBM.
Instrucciones Especiales para la Impresin de este Curso:
No elimine pginas en blanco que puedan aparecer al final de cada unidad o entre
unidades. Estas pginas fueron insertadas intencionalmente.

Gua del Estudiante

Core Java

Contenido
Descripcin del Curso: Core Java....................................................................iv
Descripcin de Unidades ................................................................................viii
Volumen 1: Fundamentos de Java ....................................................................1
Unidad 1: Visin General de Java .....................................................................3
Objetivos del Aprendizaje

1. Introduccin

2. Historia de Java

3. Comparacin entre Java y C++

4. Caractersticas de Java

5. La Plataforma Java

11

6. Impacto de Java en la WWW

16

7. Clases y Objetos

17

8. Orientacin a Objetos en Java

21

9. Ejemplo de una Aplicacin Java

26

10. Ejemplo de Applet Java

27

Resumen

29

Unidad 1: Examen de Autoevaluacin

30

Respuestas a la Unidad 1: Examen de Autoevaluacin

32

Unidad 2: Operadores, Expresiones y Control de Flujo................................33


Objetivos del Aprendizaje

33

1. Introduccin

34

2. Tipos de Datos en Java

34

3. Clases Envolventes

39

4. Math Clases Colaboradoras sobre los Tipos de Datos

44

5. Manejo de String

44

6. Identificadores

50

7. Declaracin e Inicializacin de Variables

51

8. Operadores en Java

53

9. Conversin de Tipos

63

10. Arreglos

66

11. Estructuras de Control

71

Resumen

86

Unidad 2: Examen de Autoevaluacin

87
i

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Respuestas a la Unidad 2: Examen de Autoevaluacin

89

Unidad 3: Lab. de Operaciones, Expresiones y Control de Flujo.................90


Objetivos del Aprendizaje

90

Ejercicios de Laboratorio

91

Volumen 2: Programacin Orientada a Objetos.............................................95


Unidad 1: Clases y Objetos..............................................................................97
Objetivos del Aprendizaje

97

1. Introduccin

98

2. Clases y Objetos

98

3. Estructura de una Clase Java

101

4. Variables

103

5. Mtodos

108

6. Modificadores de Acceso

113

7. Constructores de una Clase

121

8. Sobrecarga de Mtodo

124

9. Clases Anidadas

127

10. Argumentos de Lnea de Comandos

130

11. Ciclo de Vida de un Objeto

131

12. Manejo de la Memoria en Java

136

13. Enumeraciones

136

Resumen

138

Unidad 1: Examen de Autoevaluacin

139

Respuestas a Unidad 1: Examen de Autoevaluacin

141

Unidad 2: Laboratorio de Clases y Objetos..................................................143


Objetivos del Aprendizaje

143

Ejercicios de Laboratorio

144

Unidad 3: Herencia .........................................................................................147


Objetivos del Aprendizaje

147

1. Introduccin

148

2. Sintaxis para Declarar Clases Usando Herencia en Java

148

3. Conceptos Esenciales de Herencia

152

Resumen

177

Unidad 3: Examen de Autoevaluacin

178

Respuestas a la Unidad 3: Examen de Autoevaluacin

180

Unidad 4: Laboratorio de Herencia ...............................................................181


Objetivos de Aprendizaje

181
ii

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Ejercicios de Laboratorio

Core Java

182

Unidad 5: Clases Abstractas e Interfaces.....................................................183


Objetivos de Aprendizaje

183

1. Introduccin

184

2. Clases Abstractas

184

3. Uso de Clases Abstractas

186

4. Qu son las Interfaces?

194

5. Usar Interfaces Como Referencias

202

6. Heredar de una Interfaz

205

7. Opciones de Herencia en Java

208

Resumen

210

Unidad 5: Examen de Autoevaluacin

211

Respuestas a la Unidad 5: Examen de Autoevaluacin

213

Unidad 6: Laboratorio de Clases Abstractas e Interfaces...........................215


Objetivos de Aprendizaje

215

Ejercicios de Laboratorio

216

Unidad 7: Paquetes.........................................................................................219
Objetivos de Aprendizaje

219

1. Introduccin

220

2. Necesidad de los Paquetes

220

3. Crear Paquetes en Java

222

4. Representacin del Paquete en el Sistema de Archivos

224

5. Paquetes y Proteccin de Acceso

227

6. Usar Miembros de Paquetes

235

7. Agrupar Paquetes

239

8. Despliegue de Paquetes

239

9. Paquetes Incorporados en Java Usados Comnmente

245

Resumen

248

Unidad 7: Examen de Autoevaluacin

249

Respuestas a la Unidad 7: Examen de Autoevaluacin

251

iii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Descripcin del Curso: Core Java


Nombre del Curso
Core Java

Duracin
La duracin del curso es de 108 horas.

Propsito
Este curso ofrece a los estudiantes un estudio del lenguaje Java. El primer volumen del
curso se ocupa de los fundamentos de Java, del impacto de Java en la Web, la
orientacin a objetos en Java, operadores y estructuras de control. Los estudiantes
aprendern sobre las caractersticas de Java, convenciones de nombres, declaracin de
variables y su inicializacin.
El segundo volumen del curso se ocupa de la programacin orientada a objetos.
Proporciona una descripcin de los miembros de una clase Java, del uso de los
mtodos de clase y del manejo de la memoria en Java. Los estudiantes aprendern
sobre los fundamentos de la herencia, de clases, mtodos abstractos y las interfaces.
Tambin aprendern sobre los paquetes incorporados comnmente usados de Java.
El tercer volumen del curso trata de las excepciones y los mtodos para lanzar
excepciones. Los estudiantes aprendern cmo distinguir entre las excepciones
verificadas y no verificadas. Tambin aprendern sobre cmo crear y usar excepciones
definidas por el usuario.
El cuarto volumen del curso proporciona una descripcin de las capacidades para
entrada/salida. Trata de los archivos y los flujos, los flujos de caracteres, las clases
lectoras y escritoras, adems de los archivos de acceso aleatorio. Tambin se ocupa de
la serializacin de objetos, de la interfaz serializable y de la interfaz externalizable. Los
estudiantes estudiarn la clase ObjectOutputStream y la clase ObjectInputStream.
El quinto volumen del curso provee una descripcin de las interfaces de usuario usando
AWT y Swing. Se ocupa de las clases y contenedores de AWT, dibujo y actualizacin de
los componentes de la interfaz del usuario. Tambin trata los mtodos heredados por
los componentes de AWT de las clases componente y contenedor. Los estudiantes
aprendern sobre los administradores de diseo, adems de asociarlos al contenedor.
Adicionalmente, obtendrn informacin sobre el modelo de delegacin de eventos y el
manejo de eventos.
Se proporciona una introduccin a ciertas clases fundamentales de Java. Se ocupa de
la arquitectura MVC y las clases Swing, las diferencias entre AWT y Swing, los
componentes Swing, el API de Java 2D y la representacin en 2D.
El sexto volumen del curso introduce a los applets. Se ocupa del ciclo de vida de un
applet, prueba de applets, carga de un applet, mtodos de dibujo y manejo de eventos.
iv
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Los estudiantes aprendern conceptos tales como: usar el API de applet, localizar y
cargar archivos de datos, mostrar documentos en un navegador web, comunicacin con
otros applet y restricciones de seguridad en applets.
El sptimo volumen del curso contiene una introduccin a multihilos y redes. Estudia el
ciclo de vida de los hilos, creacin y funcionamiento, realizar subclases de la clase de
hilo e implementar la interfaz Runnable. Tambin se ocupa de la sincronizacin de hilos,
de los mtodos y sentencias sincronizadas, adems de la comunicacin entre hilos. Los
estudiantes aprendern sobre el trabajo con URLs y programacin de conectores,
clases orientadas a conexin en Java, envo y recepcin de datagramas.
El octavo volumen de este curso presenta una descripcin del API de colecciones. Se
ocupa del marco de trabajo para colecciones de Java, de las interfaces e
implementaciones de las colecciones. Presenta la conectividad a la base de datos en
Java y las sentencias SQL usadas en los programas Java, adems de los pasos que
implica el acceso a base de datos. Los estudiantes aprendern sobre procedimientos
almacenados, manejo de la transaccin, soporte de cursores, procesamiento de
mltiples conjuntos de resultados, entre otras funcionalidades de JDBC. Para finalizar
se discute acerca de las caractersticas avanzadas, tales como: las consideraciones de
seguridad cuando se trabaja con programas Java, los Java beans y los conceptos de la
internacionalizacin.
El curso incorpora varias sesiones de laboratorios donde los estudiantes obtendrn
experiencia prctica en los conceptos de Core Java.

Audiencia
Estudiantes, Profesionales y Gente de Negocios.

Prerrequisitos
CY410, CY350

v
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Objetivos
Al completar este curso, usted ser capaz de:
Entender las caractersticas principales de Java.

Explicar los principios de orientacin a objetos en Java.

Explicar las diferentes estructuras de control usadas en Java.

Explicar la necesidad y el uso de los constructores de una clase.

Describir cmo se realiza el manejo de la memoria en Java.

Describir cmo crear jerarquas de herencia.

Definir y explicar cmo implementar una interfaz.

Explicar la variable classpath y describir su uso.

Discutir las excepciones y las tcnicas tradicionales para el manejo de errores.

Describir el manejo de excepciones en Java.

Examinar las diferentes formas en las que las excepciones pueden ser lanzadas,
capturadas y manejadas.

Exponer la clase File.

Explicar los diferentes flujos de caracteres y de byte.

Explicar la interfaz Serializable y la clase ObjectInputStream.

Describir algunas clases tiles y algunos GUI en AWT.

Explicar cmo escoger un administrador de diseo y sus responsabilidades.

Explicar cmo implementar el mecanismo de delegacin de eventos.

Describir la arquitectura MVC.

Explicar los administradores de diseo definidos en Swing.

Describir las propiedades de la apariencia de Swing.

Establecer las diferencias entre un applet y una aplicacin.

Describir los mtodos para agregar componentes de UI.

Mencionar las ventajas del API Applet.

Explicar los conceptos de hilos y multihilos.

Explicar cmo crear hilos desde la clase Thread y desde la interfaz Runnable.

Describir el concepto de sincronizacin.

Explicar los mtodos y sentencias sincronizadas.

Exponer los URLs y las excepciones de URL.

Explicar los conectores orientados a conexin y no orientados a conexin.

Describir las interfaces de colecciones.

Describir los algoritmos polimrficos del JDK que operan en las colecciones.

Discutir el API de JDBC.

Explicar el manejo de excepciones en JDBC.


vi
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Explicar el uso de PreparedStatement y CallableStatement en JDBC.

Mencionar algunas de las clases de soporte de JDBC en Java.

Explicar la manipulacin de objetos de una clase.

Exponer las caractersticas de seguridad cuando se trabaja con programas Java.

Explicar el empaquetamiento de componentes Java.

Exponer el API Java 2D.

Agenda
Cada unidad en este curso es de 2 horas de duracin.

vii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Descripcin de Unidades
Volumen 1: Fundamentos de Java
Unidad 1: Visin General de Java
Esta unidad introductoria proporciona una visin general de Java, incluyendo la historia
del desarrollo de Java, fundamentos bsicos de la Programacin Orientada a Objetos y
aspectos bsicos de Java. Tambin cubre la plataforma de Java y su efecto en la
WWW.

Unidad 2: Operadores, Expresiones y Flujo de Control


Esta unidad se ocupa de los elementos fundamentales de Java: tipos de datos y
variables, diferentes tipos de operadores en Java y de la precedencia de operadores.
Tambin se discuten las conversiones de tipo y las estructuras de control en Java.

Unidad 3: Laboratorio de Operadores, Expresiones y Flujo de Control


Esta unidad de Laboratorio permite al estudiante poner en prctica algunos de los
aspectos fundamentales de Java, como operaciones aritmticas, operadores de bits y
lazos en Java. Esta actividad se realiza a travs de un pequeo conjunto de ejercicios.

Volumen 2: Programacin Orientada a Objetos


Unidad 1: Clases y Objetos
El concepto de una clase, el ciclo de vida de un objeto y los constructores de una clase
son algunos de los tpicos tratados en esta unidad. Esta unidad tambin examina las
especificaciones para el control del acceso, cmo declarar variables miembro, mtodos
miembro, la manera de acceder a las clases utilizando mtodos estticos, mtodos
sobrecargados y argumentos en la lnea de comandos. Finalmente, se ofrece una visin
general sobre el recolector de basura.

Unidad 2: Laboratorio de Clases y Objetos


En esta unidad se desarrollan ejercicios de laboratorio para crear clases y objetos,
llamar mtodos de una clase y sobrecargar mtodos de una clase. Tambin proporciona
una ruta de experiencia prctica acerca de los paquetes, el CLASSPATH y su
utilizacin, la proteccin de acceso mientras se usan los paquetes, miembros de
paquetes y cmo importar paquetes. Tambin le permite al estudiante tener una visin
general de los paquetes intrnsecos de Java ms usados.

Unidad 3: Herencia
El principal objetivo de esta unidad es entender los aspectos bsicos de la herencia,
cmo utilizar el modificador sper, cmo crear la herencia multi-nivel y los fundamentos
del mtodo de sobreescritura. Tambin se discute el uso de la palabra clave final para
evitar la sobreescritura y para evitar la herencia.
viii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 4: Laboratorio de Herencia


Esta unidad de laboratorio permite al estudiante tener una mejor comprensin del
concepto de herencia y cmo llamar a los mtodos de la clase base.

Unidad 5: Clases Abstractas e Interfaces


En esta unidad se discute acerca del modificador abstract y las clases y mtodos
abstractos. Tambin se discuten las interfaces, su implementacin total o parcial, el uso
de interfaces y referencias, las variables de una interfaz y cmo heredar desde una
interfaz.

Unidad 6: Laboratorio de Clases Abstractas e Interfaces


Esta unidad de laboratorio le ofrece parcialmente al estudiante una exposicin del uso
de las clases abstractas y la necesidad de usar interfaces.

Unidad 7: Paquetes
Los paquetes son un aspecto importante en el estudio de Java. En esta unidad se
define qu es un paquete, el CLASSPATH y su utilizacin, adems de la proteccin de
acceso mientras se usan los paquetes. Tambin explica cmo utilizar los paquetes
miembro, cmo importar paquetes y se explican algunos de los paquetes intrnsecos de
Java ms utilizados.

Volumen 3: Manejo de Excepciones


Unidad 1: Manejo de Excepciones y Tipos de Excepciones
El lenguaje Java proporciona algunos mecanismos sofisticados para el manejo de
excepciones, en comparacin con otros lenguajes de programacin modernos. Esta
unidad establece qu es una excepcin y discute la importancia del manejo de
excepciones. Proporciona una breve visin del manejo de excepciones en los lenguajes
de programacin y cmo se aplica en Java. Se examinan los tipos de excepciones, su
jerarqua en Java, las declaraciones try y catch, as como la clusula finally en
Java. Proporciona una visin de las excepciones en tiempo de ejecucin (runtime) y los
diferentes mtodos para el lanzamiento y propagacin de excepciones.

Unidad 2: Lanzamiento y Manejo de Excepciones


Esta unidad trata con los mtodos de lanzamiento de excepciones, mtodos para
manejar excepciones y las diferentes formas en que las excepciones pueden ser
lanzadas, capturadas y manipuladas. Tambin se discute el mtodo mediante el cual se
crean y usan las excepciones definidas por el usuario.

Unidad 3: Laboratorio de Lanzamiento y Manejo de Excepciones


Basndose en las unidades 1 y 2, esta unidad de Laboratorio proporciona una ruta para
experimentar en forma prctica cmo manejar excepciones, como usar las clusulas
ix
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

throw y catch aparte de dominar el uso de la clusula throws. Tambin permite al


estudiante aprender a escribir excepciones definidas de usuario.

Volumen 4: Facilidades de Entrada / Salida


Unidad 1: Archivos y Flujos
Esta unidad trata los conceptos File, FileDescriptor, flujos, flujos de caracteres,
flujos byte y acceso aleatorio de archivos.

Unidad 2: Laboratorio de Archivos y Flujos


Esta unidad provee un conjunto de ejercicios para aprender acerca de creacin de
archivos, lectura y escritura desde y hacia archivos. Tambin provee ejercicios para
acceder a directorios y subdirectorios.

Unidad 3: Serializacin de Objetos


La serializacin de Objetos es un tpico importante en Java y esta unidad trata sobre
ese tema, la interfaz Serializable, la interfaz Externalizable, la clase
ObjectOutputStream y la clase ObjectInputStream.

Unidad 4: Laboratorio de Serializacin de Objetos


Esta unidad de laboratorio se construye sobre la base conceptual de la unidad 3 y le
permite al estudiante aprender a realizar la serializacin de Objetos en Java.

Volumen 5: Crear Interfaces Usando AWT y Swing


Unidad 1: Componentes y Contenedores AWT
En esta unidad se discute el abstract window toolkit AWT- (grupo de programas de
ventana abstracta), algunas clases tiles en AWT y algunos componentes GUI en
AWT.

Unidad 2: Laboratorio de Componentes y Contenedores AWT


Este laboratorio le permite al estudiante aprender a usar varios controles que se
incluyen en el AWT, a crear y manejar ventanas y a usar las clases MenuBar, Menu y
FileDialog.

Unidad 3: Administradores de Diseo (Layout Managers)


Esta unidad ofrece una amplia cobertura de los manejadores de diseo y su seleccin.
Se discuten los diferentes administradores de diseo, sus responsabilidades y las reglas
para su aplicacin y uso.

x
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 4: Laboratorio de Administradores de Diseo (Layout Managers)


En esta unidad de laboratorio, los estudiantes practican el uso de varios manejadores
de diseo y trabajan en la creacin de varios controles como TextField, TextArea,
CheckboxGroup y Button.

Unidad 5: Modelo de Delegacin de Eventos y Manejo de Eventos


Esta unidad examina el Modelo de Conduccin de Eventos, los Listeners (Oyentes) y
Adapters (Adaptadores). Tambin provee una manera de implementar el mecanismo
de conduccin de eventos.

Unidad 6: Laboratorio de Modelo de Delegacin de Eventos y Manejo de


Eventos
En esta unidad de laboratorio el estudiante aprende el mecanismo de manejo de
eventos y el uso de la clase PopupMenu.

Unidad 7: Arquitectura MVC y Clases Swing


En esta unidad se discuten en gran detalle la arquitectura MVC y los componentes
Swing. La mayora de los componentes se analizan en detalle, con ejemplos ilustrativos.

Unidad 8: Componentes Swing


Esta unidad trata con las clases swing, las propiedades look y feel (Apariencia) de
Swing y el API Java 2D. Se incluyen detalles de todas las clases y ejemplos dados.

Unidad 9: Laboratorio de Componentes Swing


En esta unidad de Laboratorio, se espera que los estudiantes entiendan el uso del
componente Swing y las caractersticas de las clases Swing.

Volumen 6: Applets
Unidad 1: Escribir y Desplegar Applets
En el lenguaje Java, los applets son uno de los tpicos ms interesantes y significativos.
Esta unidad establece qu es un applet y lo que puede hacer. Provee un resumen de
los applets, su ciclo de vida y cada una de sus fases significativas. Se discuten los
mtodos para responder a eventos (milestones), el uso de los mtodos para dibujar y
manejar eventos, los mtodos para aadir componentes UI y la aplicacin y ventajas del
API en un applet.

Unidad 2: Laboratorio de Escribir y Desplegar Applets


En esta unidad, los estudiantes aprenden a desarrollar applets sencillos, los cuales
interactan con el usuario y realizan comunicaciones entre applets a travs del
programa Cliente-Servidor.
xi
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Volumen 7: Multihilos y Sistema de Redes


Unidad 1: Crear Hilos
Java es conocido por su poder en trminos de hilos. En esta unidad se discuten los
conceptos de hilos y multihilos (threads y multithreading), el ciclo de vida de los hilos, el
API Thread y el mtodo de crear hilos de la clase Thread y la interfaz Runnable.
Tambin se cubren propiedades especiales de los hilos como establecer prioridades y el
ThreadGroup.

Unidad 2: Laboratorio Crear Hilos


Esta unidad proporciona ejercicios para fortalecer la base conceptual presentada en la
unidad 1 de creacin de hilos y ayudar a escribir programas que apliquen hilos en Java.

Unidad 3: Sincronizacin de Hilos


En esta unidad se examinan los conceptos de sincronizacin, mtodos sincronizados y
sentencias sincronizadas. Tambin se discuten los interbloqueos o puntos muertos
(deadlocks) y provee una visin de comunicacin entre hilos.

Unidad 4: Laboratorio de Sincronizacin de Hilos


Esta unidad ha sido diseada para bosquejar el entorno terico en trminos de
sincronizacin de hilos y reforzar el aprendizaje del uso de la sincronizacin de hilos en
la solucin de problemas usando Java.

Unidad 5: URLs y Programacin de Conectores (Sockets)


Esta unidad trata acerca del Uniform Resource Locators URLs (Localizadores de
Recursos Uniformes), la creacin de un URL y la creacin de un URL relativo a otro
URL. Tambin se discuten los tpicos de MalformedURLException, cmo analizar un
URL, leyendo directamente desde un URL, cmo conectarse a un URL, cmo leer
desde un objeto URLConnection, y cmo escribir a un objeto URLConnection. Por
otra parte, abarca los diferentes modos de operaciones de socket, el modo orientado a
conexiones de operacin de sockets, etc.

Unidad 6: Laboratorio de URLs y Programacin de Conectores


Esta unidad de laboratorio permite a los estudiantes practicar el uso de Java trabajando
con URLs y realizar trabajos con conectores en el mbito de programacin.

Volumen 8: Conceptos Avanzados


Unidad 1: API de Colecciones
Esta unidad ayuda a entender el marco de trabajo de las colecciones de Java, las
interfaces de colecciones y el impacto que produjo la inclusin de los Genricos en Java
5.0. Tambin discute algunos algoritmos polimrficos de JDK operando en colecciones y
algunas implementaciones de colecciones.
xii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 2: Laboratorio del API de Colecciones


Esta unidad proporciona ejercicios para ayudar a entender la interfaz collection,
cmo usar ArrayList, y el uso de las interfaces SortedSet, HashSet y TreeSet.
Tambin ayuda a usar la clase iterator y sus mtodos.

Unidad 3: JDBC
Esta unidad trata la conectividad de base de datos en Java y el API JDBC de Java.
Discute las sentencias SQL usadas en los programas de Java y cmo funciona el
manejo de excepciones.

Unidad 4: Laboratorio de JDBC


Existen algunos ejercicios en esta unidad para ayudar a los estudiantes a conectarse a
una base de datos a travs de un programa Java, adems de entender cmo acceder a
la base de datos una vez que se establece una conexin.

Unidad 5: JDBC Avanzado


Se explican algunos conceptos avanzados de JDBC tales como usar las clases
heredadas de Statement, procedimientos almacenados (stored procedures) y otras
funcionalidades JDBC, como por ejemplo el manejo de transacciones.

Unidad 6: Laboratorio de JDBC Avanzado


Esta unidad permite al estudiante escribir cdigo en Java para crear y usar los
procedimientos almacenados, adems de facilitar la comprensin acerca de la forma en
que trabaja la administracin de transacciones.

Unidad 7: Caractersticas Avanzadas


En esta unidad, los objetivos consisten en la capacitacin del trabajo con imgenes y
grficos, incorporar elementos de seguridad mientras se trabaja con programas en Java
y aprender el concepto de internacionalizacin en Java. Tambin se explican los Java
beans y cmo realizar la invocacin remota de mtodos.

Unidad 8: Laboratorio de Caractersticas Avanzadas


En esta unidad, los estudiantes aprendern a convertir un programa Java usando
internacionalizacin y trabajarn con la invocacin de mtodos remotos.

xiii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Volumen 1: Fundamentos de Java

Libro 1: Core Java

Volumen 1: Fundamentos de Java 1


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 1: Visin General de Java


Objetivos del Aprendizaje
Al final de esta unidad, usted ser capaz de:

Discutir la evolucin de Java.

Comparar Java con C++.

Discutir las caractersticas principales de Java.

Explicar la plataforma Java.

Describir el impacto de Java en WWW.

Definir clases y objetos.

Explicar los principios de orientacin a objetos en Java.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 3


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

1. Introduccin
Antes que Java existiera, C y C++ eran los lenguajes de programacin ms usados. C
es un lenguaje de programacin estructurada, mientras que C++ brinda soporte tanto a
la programacin estructurada como a la programacin orientada a objetos. Estos dos
lenguajes de programacin son complejos y tienen algunas limitaciones inherentes.
Aunque Java no fue diseado como solucin a los problemas encontrados en C o C++,
algunas de sus caractersticas han solventado las limitaciones de estos dos lenguajes.
Uno de los objetivos principales detrs de la creacin de Java fue tener un lenguaje
orientado a objetos que fuera poderoso, pero simple. Java ha simplificado muchas de
las estructuras complicadas y ambiguas de C++. Otra ventaja fundamental es que Java
trajo el concepto de la independencia de plataforma. Se aprender acerca de estas
caractersticas en detalle en las prximas secciones.
Sin embargo, antes de continuar, se presenta un breve resumen de la evolucin de
Java.

2. Historia de Java
Patrick Naughton, Mike Sheridan y James Gosling de SUN Microsystems iniciaron un
proyecto secreto llamado "Proyecto Verde" (Green Project) a finales de 1990. El objetivo
de este proyecto era anticiparse a la revolucin en el mundo de la computacin que
estaba por llegar. El equipo decidi intentar introducirse en el mercado de la electrnica
de consumo y desarrollar programas para pequeos dispositivos electrnicos.
Desarrollaron un dispositivo llamado StarSeven (*7), este dispositivo era capaz de
controlar una variedad de plataformas de entretenimiento y dispositivos de uso
domstico, adems de mostrar animaciones simultneamente. *7 usaba un procesador
independiente del lenguaje llamado Oak para adaptarse a una variedad de plataformas
y dispositivos de uso domstico. Tras unos comienzos dudosos, Sun decidi crear una
filial, denominada FirstPerson Inc., para dar margen de maniobra al equipo responsable
del proyecto. Este grupo intent mercadear l *7 a la industria de televisin por cable,
pero la tecnologa usada para desarrollar l *7 estaba adelantada a la tecnologa
existente en la industria de televisin por cable y por esto no fue aceptado.
Afortunadamente para el grupo creador del *7, Internet se estaba volviendo popular en
ese momento. La Internet tena una configuracin de red similar al *7, y estaba siendo
usada cada vez ms para la transferencia de texto, grficos y video, esencialmente
datos estticos. El equipo FirstPerson ampli Oak, transformndolo en un lenguaje que
permita al programador escribir programas que corran en una gran variedad de
dispositivos, a un lenguaje que permita escribir cdigo ejecutable que poda ser
distribuido en Internet.
En el ao 1995, este nuevo lenguaje evolucionado fue llamado Java. Java permita a los
usuarios de Internet transferir contenido esttico a travs de la misma. Adicionalmente,
permita transferir pequeas aplicaciones dinmicas a travs de la red en la forma de
applets de Java. Algunos de los miembros del grupo FirstPerson mostraron el lenguaje
Unidad 1: Visin General de Java

Libro 1: Core Java 4

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

y sus nuevas caractersticas, incluyendo la transferencia de animaciones a travs de la


Internet, en la Conferencia de Diseo, Tecnologa y Entretenimiento en Monterrey.
Sus caractersticas y funcionalidades asombraron a los participantes, ya que la
tecnologa provea un mtodo ms sencillo para transferir datos en la Internet. El equipo
pronto construy el navegador HotJava, y public el cdigo fuente Java gratuitamente
en Internet. En poco tiempo, el nmero de usuarios de la tecnologa Java se increment
rpidamente.
A continuacin se va a comparar Java y C++, ambos lenguajes de programacin
orientado a objetos, para descubrir que ha hecho a Java tan popular.

3. Comparacin entre Java y C++


Java simplifica muchas de las ambigedades encontradas en C++, y es, al mismo
tiempo, un lenguaje de programacin igualmente poderoso. Se ha visto con anterioridad
las ventajas del paradigma de programacin orientada a objetos.
Existen algunas deficiencias en C++, por el hecho de que permite programacin
estructurada. Esto ha sido eliminado en Java, que es un lenguaje puramente orientado
a objetos.
Las principales diferencias entre C++ y Java se listan en la Tabla 1.1.
Java
Es tanto un lenguaje de programacin
como una plataforma de software.
Es un lenguaje puramente orientado
a objetos.
Todas las declaraciones de variables
y mtodos deben estar dentro de la
definicin de la clase.
El lenguaje es independiente de la
plataforma. El cdigo Java, una vez
escrito, puede ser ejecutado en
cualquier plataforma.
Maneja la memoria automticamente.
No se soporta caractersticas como
sobrecarga de operadores y
conversiones automticas en ambos
sentidos.
Una clase no puede heredar
directamente de ms de una clase.
Se da soporte a la herencia mltiple
usando interfaces.
Tiene rutinas de libreras extensibles.

Libro 1: Core Java

C++
Es slo un lenguaje de programacin.
Da soporte tanto a la programacin estructurada
como a la programacin orientada a objetos.
Las declaraciones de variables y funciones
pueden estar presentes fuera de las definiciones
de las clases. No es necesario para un programa
en C++ tener una clase.
El cdigo C++, una vez escrito para una
plataforma, necesita ser compilado de nuevo, y
el cdigo objeto reenlazado para ser ejecutado
en otra plataforma diferente.
Los programadores tienen que hacerse cargo de
liberar la memoria no utilizada.
Da soporte a caractersticas como sobrecarga de
operadores y conversiones automticas en
ambos sentidos.
Una clase puede heredar directamente de ms
de una clase.
Sus rutinas de libreras no son extensibles.

Volumen 1: Fundamentos de Java 5


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

La programacin de redes es ms
fcil. Los objetos pueden ser
accedidos a travs de la red usando
URLs.
Los programadores no pueden usar
apuntadores. Los apuntadores se
usan internamente.
Implementa arreglos verdaderos.

La programacin para redes es compleja, a


menos que se usen APIs de terceros. C++, es un
lenguaje, que no brinda soporte incorporado para
programacin de redes.
Los programadores pueden usar apuntadores.
Se implementan los arreglos con aritmtica de
apuntadores.

Tabla 1.1: Comparacin entre C++ y Java

Aunque las construcciones de programacin de Java (sintaxis) son similares a las de


C++, Java no debe ser interpretado como la versin Internet de C++, ni como un
reemplazo para C++. El equipo FirstPerson cont con programadores expertos para
asegurar que Java permitiera a los programadores tener un control completo sobre la
ejecucin del programa, excepto por las restricciones inherentes al ambiente de
Internet.
Ahora se estudiarn las diversas caractersticas ofrecidas por Java.

4. Caractersticas de Java
Java puede usarse para desarrollar dos tipos de programas:
Aplicaciones: Las aplicaciones son programas independientes que pueden correr en
una computadora, usando la plataforma Java con el soporte del sistema operativo de la
computadora.
Applets: Los applets son programas especiales Java, que pueden usarse para
transmitir informacin en Internet.
Los applets pueden ser incrustados en una pgina HTML usando la etiqueta Applet, y
pueden ejecutarse en un navegador web con soporte para Java. Los applets pueden
adaptarse a la entrada del usuario inteligentemente. Las aplicaciones Java y los applets
pueden ser compilados y ejecutados usando el Kit de Desarrollo de Java (Java
Development Kit JDK).
La Figura 1.1 muestra las diferentes caractersticas de Java.

Unidad 1: Visin General de Java

Libro 1: Core Java 6

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 1.1: Caractersticas de Java

4.1 Simple de Usar


El estilo de programacin en Java est basado en C++, y soporta la mayora de las
caractersticas ofrecidas por C++. De aqu que, los programadores no encontrarn Java
muy difcil de entender y usar. Un programador con un buen conocimiento de los
conceptos de orientado a objetos puede sacar el mximo provecho a Java, ya que se
implementan los conceptos en una forma mucho ms sencilla que en C++.

4.2 Seguridad
Inicialmente, cuando la Internet comenz y Java no era tan conocido, los usuarios de
Internet teman descargar programas ejecutables debido al dao alarmante causado por
la difusin de virus. Las personas que descargaban archivos eran muy cautelosas de
revisar estos archivos cuidadosamente antes de usarlos. Haba tambin programas
maliciosos que recababan informacin acerca de tarjetas de crdito, palabras clave, etc.
del sistema de archivos local. Esto fue, por supuesto, desastroso para las personas que
navegan por la Internet. Java proporcion un modelo de seguridad, que previene el
acceso a los recursos del sistema, y as bloquear cualquier intento malicioso.

4.3 Portabilidad
Existen muchas ocasiones en donde los usuarios de Internet pueden querer descargar
programas y ejecutarlos dinmicamente. Los usuarios pueden estar usando diferentes
Libro 1: Core Java

Volumen 1: Fundamentos de Java 7


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

tipos de plataformas, para permitirles descargar programas y ejecutarlos


dinmicamente, se necesita de un mecanismo para crear cdigo ejecutable que sea
portable entre varias plataformas.
Java solventa este inconveniente de portabilidad con el uso de bytecodes. El compilador
Java (javac) primero convierte el cdigo fuente (archivo con extensin .java) a
bytecodes (archivo con extensin .class), que puede entender el sistema de tiempo
de ejecucin de Java o la Mquina Virtual de Java (Java Virtual Machine JVM); estos
bytecodes son interpretados por el intrprete de Java, y convertidos a una forma
ejecutable que la entiende la plataforma en la cual el sistema de tiempo de ejecucin de
Java se est ejecutando.
El ambiente de tiempo de ejecucin de Java es el ambiente en donde es posible que los
programas puedan ser compilados y ejecutados. Este ambiente administra el manejo de
la memoria y otras necesidades en tiempo de ejecucin durante la ejecucin del
programa. La Mquina Virtual de Java (JVM) es la capa entre el microprocesador y los
archivos class de Java. Realiza la funcionalidad de traducir los bytecodes de Java, a
una forma entendible por la mquina.
Existe otro componente llamado el compilador Just-In-Time (JIT). El compilador JIT
compila los bytecodes a cdigo mquina, hacindolos ms rpidos que la interpretacin
hecha por la JVM.
El sistema de tiempo de ejecucin de Java es especfico a la plataforma en la cual se
ejecuta. Java soporta la portabilidad, porque los bytecodes son interpretados antes de la
ejecucin. La Figura 1.2, explica cmo Java logra la portabilidad.

Figura 1.2: JVM e Independencia de la Plataforma


Unidad 1: Visin General de Java

Libro 1: Core Java 8

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

El sistema de tiempo de ejecucin Java previene que el cdigo acceda a cualquier


recurso fuera de l. De este modo, el sistema de tiempo de ejecucin mejora las
caractersticas de seguridad ya provistas por Java. Los bytecodes de Java tambin son
tiles al mejorar el nivel de seguridad ofrecido por Java. An si Java hubiese sido
diseado para ser compilado justo antes de la ejecucin, en vez de ser interpretado
como actualmente lo es, soportara la portabilidad. Esto se debe a que la ejecucin del
programa est todava en manos del sistema de tiempo de ejecucin de Java. Este
mtodo de compilacin usado para convertir bytecodes a cdigo nativo se llama
compilacin justo a tiempo (Just In Time JIT).
La Figura 1.3 muestra como trabaja el compilador JIT.

Figura 1.3: Compilador JIT y la JVM

4.4 Distribuido
La computacin distribuida es muy til en el ambiente de la Internet, donde los mdulos
de los programas pueden estar presentes en diferentes computadoras alrededor del
mundo. Java fue diseado para brindar soporte TCP/IP. El soporte a redes de Java
permite construir aplicaciones cliente/servidor, adicionalmente Java tiene el paquete de
Invocacin de Mtodos Remota (Remote Method Invocation RMI). Este permite a
programas que se ejecutan en una JVM invocar un mtodo en una clase Java
ejecutndose en otra JVM.

4.5 Orientado a Objetos


C++ tena que mantener las caractersticas y ser compatible con C. Cuando Java
estaba siendo diseado, sus diseadores y desarrolladores no quisieron que Java fuera
compatible al nivel de cdigo fuente con ningn otro lenguaje. Por lo anterior, tuvieron la
opcin de crear un lenguaje orientado a objetos que hace uso de un modelo de objetos
simple, y usa tipos de datos simples no objetos, asegurando un alto rendimiento.

4.6 Robusto
A medida que los usuarios de Java en Internet comenzaron a incrementarse en nmero,
creci tambin la necesidad de ejecutar una aplicacin en diversas plataformas. Estas
plataformas diversas tenan demandas diferentes por parte de las aplicaciones para que
se ejecutaran apropiadamente y por tanto, la aplicacin tena que ocuparse de todas
estas demandas. Para poder hacer esto, la aplicacin deba de ser robusta

Libro 1: Core Java

Volumen 1: Fundamentos de Java 9


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

El diseo de Java hace posible que los programadores identifiquen errores en la misma
etapa de desarrollo. El cdigo puede ser revisado para asegurar confiabilidad colocando
restricciones en ciertas reas claves de la programacin y teniendo un diseo para
evitar los errores ms comunes de programacin. Java est diseado para ser un
lenguaje estrictamente tipado, Por lo tanto, verifica errores de codificacin tanto en
tiempo de compilacin como en tiempo de ejecucin.
Java provee manejo de excepciones para ocuparse de los errores de una manera
sofisticada. La robustez del manejo de excepciones de Java ayuda a construir
programas confiables. Funciones como la recoleccin automtica de basura en Java
hace que los programas sean menos propensos a errores relacionados con la memoria.
Esto a su vez da seguridad a los programadores para predecir el comportamiento del
programa en diversas situaciones.

4.7 Dinmico
Java enlaza el cdigo dinmicamente. Java fue implementado para usar los datos
disponibles en los archivos class en tiempo de ejecucin. Los objetos que se crean y
usan en un programa son verificados y resueltos en tiempo de ejecucin. Esta
caracterstica es til cuando se quiere actualizar el bytecode en un sistema en
ejecucin.

4.8 Fuertemente Tipificado


Java es fuertemente tipificado. Java fue diseado de forma que si se comete cualquier
error en una invocacin de mtodo, se mostrar un mensaje de error al programador en
tiempo de compilacin. Por esta razn, los programadores no necesitan preocuparse de
cometer errores no detectables en las invocaciones de mtodos.

4.9 Interpretado
Los bytecodes de Java son interpretados por la JVM en el lenguaje nativo de la
plataforma subyacente. Los lenguajes interpretados tienen limitaciones de rendimiento
comparados con los lenguajes que son compilados. Java combina las ventajas de la
compilacin e interpretacin. El compilador Java JIT puede ayudar a superar las
limitaciones de rendimiento asociadas a la JVM.

4.10 Arquitectura Neutral


Al compilar un programa en Java, el cdigo resultante es un tipo de cdigo binario
conocido como bytecode. Este cdigo es interpretado por diferentes computadoras de
igual manera, solamente hay que implementar un intrprete para cada plataforma. De
esa manera Java logra ser un lenguaje que no depende de una arquitectura
computacional definida.

Unidad 1: Visin General de Java

Libro 1: Core Java 10

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

4.11 Ambiente Multihilos


Java brinda soporte a la programacin multihilos, que permite que un nico programa
lleve a cabo varias tareas concurrentemente. Los programadores pueden hacer uso de
esto para crear aplicaciones de red interactivas. El sistema en tiempo de ejecucin de
Java (JVM) se implement de forma eficiente, para permitir la fcil sincronizacin de
hilos, que a su vez facilitan la programacin interactiva.
Ahora que se conocen las caractersticas principales de Java, se discute a continuacin
la plataforma de Java.

5. La Plataforma Java
Una plataforma es el entorno sobre el cual se ejecutan los programas. Una plataforma
puede ser una plataforma de software, una plataforma de hardware o una combinacin
de ambos. La plataforma Java es una plataforma de slo software, la cual se puede
ejecutar en varias plataformas de hardware as como en varios sistemas de operativos.
La plataforma Java esta conformada por dos componentes, llamados la JVM y el API de
Java, como se muestra en la Figura 1.4.

Figura 1.4: Los dos Componentes de la Plataforma Java

5.1 JVM
La JVM es una aplicacin ejecutable que representa a un procesador genrico en el
cual corren los bytecodes de Java. Una implementacin particular de esta mquina
virtual, que es escrita para operar en un entorno particular, an brindar soporte al API
general de Java. Esto es lo que hace a Java independiente de la plataforma.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 11


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

La JVM consta de los siguientes tres aspectos:

Especificacin abstracta.

Implementacin concreta.

Instancia en tiempo de ejecucin.

Esto se muestra en la Figura 1.5.

Figura 1.5: Diferentes Aspectos de la JVM

La especificacin Java define la especificacin abstracta de la JVM, que se necesita


para permitir que los programas se ejecuten en ella. La implementacin concreta de la
JVM es la implementacin actual de la especificacin abstracta. La instancia de tiempo
de ejecucin (la instancia de una JVM que est en ejecucin actualmente) soporta la
ejecucin de los programas Java. El cdigo fuente de Java (archivo .java) es
convertido en bytecodes (archivo .class) por el compilador Java. Estos bytecodes son
luego convertidos a cdigo de mquina nativo por alguna JVM que sea especfica a una
plataforma en particular. De aqu que, los archivos .class son portables a cualquier
implementacin de la mquina virtual.
Para entender la diferencia entre los archivos .java y .class, se va a mostrar
brevemente el flujo de un programa Java.

Unidad 1: Visin General de Java

Libro 1: Core Java 12

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

El cdigo fuente Java se ingresa usando un editor.

El comando javac se usa para iniciar el compilador Java, que compila el cdigo
fuente Java (archivo .java) a bytecodes, suponiendo que no hay errores en
tiempo de compilacin. Si existe un error, el programador debe regresar al
editor, corregir los problemas, y ejecutar nuevamente javac hasta que todos los
errores sean solucionados y se obtenga una compilacin limpia.

Una vez compilado, se produce un archivo .class que podr ser usado con
cualquier JVM ejecutndose en cualquier plataforma.

El comando java se usa para iniciar el intrprete Java, y para ejecutar el archivo
.class.

Se ha discutido que los bytecodes Java obtenidos despus de la compilacin en


cualquier JVM pueden ser transferidos a cualquier otra JVM ejecutndose en cualquier
otra plataforma y ser ejecutado all. Esta caracterstica ayudar a los usuarios a
descargar bytecodes Java de la Internet y ejecutarlos en sus JVM sin riesgos de
seguridad. Sin embargo, hay un pequeo problema, los bytecodes descargados no
tienen que haber sido producidos por un compilador Java estndar, por lo que estos
bytecodes pueden estar errneos.
Para resolver este problema, una vez que el bytecode sea descargado, la JVM en la
mquina del usuario inicia un proceso de verificacin del bytecode. Durante este
proceso, los fragmentos del bytecode son probados para verificar su validez. Se revisa
cualquier manipulacin ilegal de apuntadores, violacin de restricciones colocadas para
acceder a las variables y mtodos de las clases, uso ilegal de objetos, etc. Si no se
encuentran ninguna de las violaciones anteriores, y si el bytecode descargado pasa
todas las otras pruebas que el verificador impone, entonces el bytecode es tratado
como un cdigo confiable.
Actualmente, el verificador de bytecode no realiza ninguna suposicin acerca del
bytecode que recibe. El bytecode puede provenir del sistema local o haber sido
descargado de la Internet. Sin importar la fuente, el bytecode es objeto del mismo
proceso de verificacin; esto asegura la confiabilidad del cdigo y tambin protege al
intrprete Java. Dado que la confiabilidad del cdigo fue verificada, el intrprete Java
opera a toda capacidad sin tener que revisar cualquier aspecto de seguridad.
Cuando surge un aspecto vinculado con la seguridad en Java, el administrador de
seguridad de Java juega un papel fundamental. El administrador de seguridad (clase
java.lang.SecurityManager) es una clase definida en Java, que permite a las
aplicaciones Java implementar una poltica apropiada de seguridad. Cuando una
aplicacin Java implementa esta poltica de seguridad, tiene la capacidad de
determinar si la operacin que est a punto de realizarse, es una operacin insegura o
sensible. Tambin se pueden obtener ms detalles de la operacin, y si la operacin se
realiza dentro de un contexto de seguridad que permita a la aplicacin llevar a cabo esa
operacin.
El modelo de seguridad de Java provee una caja de arena (sandbox) que es
configurable, sta protege a las aplicaciones y applets Java de ser atacados por virus,
Libro 1: Core Java

Volumen 1: Fundamentos de Java 13


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

que son difundidos a travs de programas descargados de mquinas no confiables. Las


aplicaciones y applets Java pueden realizar cualquier operacin que este bajo la
supervisin de la caja de arena y nada ms. En este modelo de caja de arena, las
aplicaciones y applets Java pueden descargar cualquier cdigo de cualquier mquina.
El cdigo no se revisa por virus, porque mientras se ejecuta el cdigo, la caja de arena
revisa si viene de una mquina confiable o no.
Si el cdigo proviene de una mquina no confiable, se evita realizar cualquier operacin
que pueda daar al sistema. La ventaja del modelo de caja de arena es que la
aplicacin Java no necesita revisar si el cdigo es confiable, ni necesita revisar por virus
en el cdigo. La caja de arena evita que un virus o cdigo no confiable realicen
operaciones maliciosas.
La caja de arena de Java incluye las caractersticas de seguridad provistas por la JVM,
el administrador de seguridad, el cargador de clases y el verificador de archivos class.
La caja de arena se puede personalizar en dos de sus componentes, son estos: el
administrador de seguridad y el cargador de clases. El administrador de seguridad
puede ser personalizado al escribir clases definidas por el usuario. Las clases definidas
por
el
usuario
pueden
ser
creadas
derivando
de
la
clase
java.lang.SecurityManager y sobrescribiendo los mtodos necesarios. Estos
administradores de seguridad personalizados son tiles cuando se quieren cargar
clases que no son completamente confiables. No se tienen que escribir nuestra propia
caja de arena personalizada para las aplicaciones y applets Java que se escriben da a
da, simplemente se puede usar las cajas de arena estndar que otros crean. Si se
quiere ejecutar un applet en un navegador Web, por ejemplo, se usa la caja de arena
que viene con el navegador Web.
A continuacin se discute el cargador de clases que es el otro componente que puede
personalizarse de la caja de arena, El cargador de clases carga las clases en la JVM.
Los cargadores de clases pueden ser de dos tipos:

Cargador de Clases Primordial.

Objetos Cargadores de Clases.

El cargador de clases primordial es actualmente una parte de la implementacin de la


JVM, mientras que el objeto cargador de clase es un objeto que se usa para cargar una
clase. El cargador de clases primordial carga solamente clases confiables, incluyendo
las clases definidas en el API Java que estn disponibles en el sistema local. Es posible
escribir objetos cargadores de clases propios, que pueden ser personalizados para
cargar clases especficas. El cargador de clases primordial en principio no confa de las
clases cargadas por estos objetos cargadores de clases. Actualmente, estos objetos
cargadores de clases son slo aplicaciones Java que se ejecutan en la JVM.
Considere una clase MiClase que es cargada por un objeto cargador de clases.
Asuma que MiClase carga otras clases tales como OtraClase1 y OtraClase2.
Estas dos clases son actualmente cargadas a travs del mismo cargador de clases que
ha cargado a MiClase.
Unidad 1: Visin General de Java

Libro 1: Core Java 14

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

En Java, las clases son agrupadas dentro de paquetes, es decir, cada paquete tiene un
conjunto de clases. El trmino espacio de nombres se refiere a la entidad que mantiene
los nombres de las clases. Java usa paquetes para este propsito. Dentro de un
espacio de nombres en particular, slo puede existir una clase con un nombre dado. Sin
embargo, puede existir cualquier nmero de cargadores de clases dentro de una JVM.
Cada cargador de clases puede estar asociado a un espacio de nombre diferente. La
misma clase puede ser cargada a travs de diferentes cargadores de clases que estn
asociados a diferentes espacios de nombres. No puede haber ninguna interaccin entre
cargadores de clases que estn presentes en diferentes espacios de nombres, a menos
que el cargador de clase expresamente permita esa interaccin.
Se pueden diferenciar las clases descargadas de la red desde diferentes mquinas en
diferentes espacios de nombres. A estas clases se les restringir el acceso a otra clase
que est en un nombre de espacios diferente. As, se puede usar esta arquitectura de
cargador de clase para evitar cualquier dao causado por cdigo malicioso.

5.2 El API de Java


El API (Application Programming Interface) de Java es una muy buena coleccin de
componentes de software apropiadas para el desarrollo de programas Java. En Java
hay diferentes tipos de programas tales como aplicaciones, applets y Servlets. El API de
Java ayuda al desarrollo y ejecucin de estos diferentes tipos de programas mediante
una amplia librera. El soporte de las diversas caractersticas de Java se realiza a travs
del API. stas son bsicamente libreras o paquetes de componentes relacionados. La
Figura 1.6 muestra las caractersticas provistas por el ncleo del API de Java.

Figura 1.6: Caractersticas Provistas por el Ncleo del API Java


Libro 1: Core Java

Volumen 1: Fundamentos de Java 15


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Se ha visto cmo Java evolucion como una aplicacin de Internet. A continuacin se


discute el impacto que Java ha tenido sobre Internet y la WWW.

6. Impacto de Java en la WWW


Los usuarios de la WWW hacen uso de varios tipos de mquinas, y tienen diferentes
plataformas. As que el problema clave es hacer que la informacin en la Internet sea
compatible con todas las plataformas. Debido a que Java permite la portabilidad, se
logra este punto. Usando la caracterstica de portabilidad, el mismo programa puede ser
ejecutado en diferentes plataformas, con resultados predecibles. La informacin no
necesita ser replicada para soportar diferentes plataformas.
El otro tema principal de los usuarios de la WWW enfrentan es la seguridad. Debido a la
amplia difusin de los virus y programas que pueden capturar informacin como
palabras claves y detalles de las tarjetas de crdito del sistema de archivos local, los
usuarios hasta hace poco, estaban temerosos de descargar cualquier programa
ejecutable desde mquinas no confiables.
Los programas Java no tienen permiso de acceder a cualquier recurso fuera del alcance
de la JVM. Por esto, la JVM controla los intentos de romper la seguridad a travs de
programas Java.
Java tambin hace la programacin de aplicaciones interactivas muy fcil, las cuales se
usan en muchos portales en Internet para atraer clientes.
Java comenz de una manera modesta al permitir que los programas se ejecutaran en
la Internet usando los applets de Java. Sin embargo, esto ha crecido hasta alcanzar un
mayor poder de funcionalidad. Existen varias tecnologas basadas en Java que se usan
para obtener funcionalidades especializadas. Por ejemplo, tecnologas como los Java
Servlets, Java Server Pages (JSP), Enterprise Java Beans (EJB), etc., han otorgado al
programador mucho ms poder para construir aplicaciones robustas y escalables para
Internet.
Considere la Figura 1.7, la cual muestra como las diferentes tecnologas Java se usan
para alcanzar varias funcionalidades en un ambiente Internet.

Unidad 1: Visin General de Java

Libro 1: Core Java 16

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 1.7: Tecnologas Java en Internet

Nota: Todas las tecnologas listadas en la Figura 1.7, excepto la tecnologa applet,
estn basadas en la ejecucin sobre la JVM de una mquina en vez de la JVM de un
navegador. Por lo tanto, slo los applets tienen restricciones en acceder los recursos del
sistema fuera de la JVM.
A continuacin se estudian las diferentes clases y objetos en Java.

7. Clases y Objetos
Una clase es un prototipo que se usa para definir las caractersticas y los
comportamientos que son comunes a todos los objetos de un mismo tipo. Las variables
se usan para representar las caractersticas de los objetos y los mtodos se usan para
representar el comportamiento de los objetos. Se puede declarar una variable
especificando su tipo de datos y el nombre de la variable.
Similarmente, se puede declarar objetos especificando lo siguiente:

Tipo (nombre de clase).

Nombre de Objeto.
int a;
Computador comp;

Libro 1: Core Java

Volumen 1: Fundamentos de Java 17


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

En el fragmento de cdigo anterior, a es el nombre de la variable, e int es su tipo de


datos. Similarmente, comp es el nombre del objeto, y Computador es el tipo del objeto,
es decir, el nombre de la clase. Se pueden declarar muchas variables del mismo tipo de
datos. Similarmente, se pueden declarar muchos objetos del mismo tipo (muchos
objetos de la misma clase).
La Figura 1.8, muestra ms de un objeto de una misma clase.

Figura 1.8: Clases y Objetos Java

La Figura 1.8 muestra una clase llamada Cliente y objetos con los nombres ObjetoA,
ObjetoB y ObjetoC de este tipo. La clase Cliente es una representacin orientada a
objetos del cliente del mundo real, mantiene los datos del cliente. Tpicamente, la clase
tendr variables miembro para mantener informacin, como el ID del cliente, el nombre
del cliente, etc.
Se define una clase en Java usando la palabra reservada class. La sintaxis es la
siguiente:
class NombreClase {
// variables miembro
// funciones miembro
}

Unidad 1: Visin General de Java

Libro 1: Core Java 18

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Considere la clase Computador, que tiene los atributos cpu, monitor, teclado y
mouse. Se pueden crear dos instancias de la clase Computador que tengan diferentes
valores para estos atributos. Estas dos instancias estn representadas por comp1 y
comp2.
Los objetos en Java se crean usando la palabra clave new.
La sintaxis es la siguiente:
NombreClase objecto = new NombreClase();
Los constructores en Java tienen la misma funcionalidad que en C++. Los constructores
en Java pueden aceptar nombres de variables y tipos de variables como argumentos.
A su vez, como en C y C++, donde la funcin main() es el punto de inicio del
programa, se tiene que main() es el punto de inicio del programa Java tambin.
La funcin main() tiene la siguiente declaracin de funcin:
public static void main(String args[]){
// El cdigo principal va aqu
}
As como en C y C++, los programas Java pueden aceptar parmetros por la lnea de
comandos, el main()de Java puede tomar estos argumentos. En C o C++, se pueden
tener parmetros de la lnea de comandos usando int argc y char* argv[]. En
Java, se toman como un arreglo de objetos String. Adems, mientras en C o C++ es
opcional para la funcin main() tomar argumentos desde la lnea de comandos, es
obligatorio que los argumentos de la lnea de comandos estn declarados en la funcin
main() de Java.
Nota: La funcin main() en Java no puede ser global, como en C o C++. En Java,
debe estar presente dentro de una clase Java.
La palabra clave public es un tipo de especificador de acceso en Java. Se vern otros
tipos de especificadores de acceso en el Volumen 2, Unidad 1 - Clases, Objetos y
Referencias.
Las variables miembro son conocidos como miembros, y las funciones miembros como
los mtodos de una clase. No se puede tener la declaracin de la clase separada, y la
definicin de la funcin miembro apareciendo libremente, como en C++. Ambos deben
aparecer dentro del bloque de definicin de la clase.
Observe el Ejemplo 1.1, que tiene el cdigo Java para la clase Computador. En este
momento, la sintaxis del cdigo no es importante, dado que el punto ahora es entender
la relacin entre clases y objetos.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 19


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Ejemplo 1. 1
El siguiente programa representa una computadora.
El cdigo Java comienza aqu...
1.

/*Definicion de la clase Computador comienza aqui*/

2.
3.
4.

class Computador {
boolean cpu, teclado, mouse;
String monitor;

5.
6.

}/*Definicion de la clase Computador termina aqui*/

7.
8.
9.

/*Definicion de la clase ComputadorEjemplo comienza aqui*/


public class ComputadorEjemplo {
/*El metodo main comienza aqui */

10.
11.
12.

public static void main(String[] args) {


//Crear la instancia de la clase Computer
Computador comp1 = new Computador();

13.
14.
15.

Computador comp2 = new Computador();

16.
17.
18.

comp1.monitor = "Negro";
comp1.teclado = true;
comp1.mouse = true;

19.
20.
21.

comp2.cpu = true;
comp2.monitor = "Blanco y negro";

22.
23.
24.

comp1.cpu = true;

comp2.teclado = true;
comp2.mouse = false;
}/* El metodo main termina aqui */

25. }/*Definicion de la clase ComputadorEjemplo termina aqui*/

El cdigo Java termina aqu


Fin del Ejemplo 1.1
Aqu, se tienen dos clases, Computador y ComputadorEjemplo. La clase
Computador define el prototipo para un conjunto de objetos que tienen los mismos
atributos. La clase ComputadorEjemplo crea dos objetos de tipo Computador, y

Unidad 1: Visin General de Java

Libro 1: Core Java 20

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

tambin se muestra que estos dos objetos pueden contener diferentes valores para sus
atributos.
Considere la Figura 1.9 para entender mejor el cdigo anterior.

Figura 1.9: Mltiples Objetos de una Clase

A continuacin se discuten los principios de la programacin orientada a objetos usados


en Java.

8. Orientacin a Objetos en Java


Se sabe que Java brinda soporte a la programacin orientada a objetos. En la
programacin orientada a objetos, los programadores crean objetos de software, que
son modelados como los objetos del mundo real. Se describen los objetos del mundo
real usando sus atributos y comportamiento. Similarmente se describen los objetos de
software usando variables y mtodos. Se tiene un prototipo a partir del cual se crean
objetos del mismo tipo del mundo real. Similarmente, se tiene un prototipo llamado
clase, de la cual se pueden crear muchos objetos de software del mismo tipo. Java
implementa la orientacin a objetos a travs de tres importantes propiedades, que son:

Libro 1: Core Java

Volumen 1: Fundamentos de Java 21


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Encapsulacin.

Herencia.

Polimorfismo.

A continuacin se discuten en detalle cada uno de ellos.

8.1 Encapsulacin
La capacidad de presentacin de informacin dentro de un objeto se divide en dos
partes bien diferenciadas:

Interna: la informacin que necesita el objeto para operar y que es innecesaria


para los dems objetos de la aplicacin. Estos atributos se denominan privados
y tienen como marco de aplicacin nicamente a las operaciones asociadas al
objeto.

Externa La que necesitan el resto de los objetos para interactuar con el objeto
que definimos. Estas propiedades se denominan pblicas y corresponde a la
informacin que necesitan conocer los restantes objetos de la aplicacin
respecto del objeto definido para poder operar.

Se puede imaginar la encapsulacin como introducir el objeto dentro de una caja negra
donde existen dos ranuras denominadas entrada y salida. Si se introducen datos por la
entrada automticamente obtendr un resultado en la salida. No necesita conocer
ningn detalle del funcionamiento interno de la caja.
El trmino encapsulacin indica la capacidad que tienen los objetos de construir una
cpsula a su alrededor, ocultando la informacin que contienen (aquella que es
necesaria para su funcionamiento interno, pero innecesaria para los dems objetos) a
las otras clases que componen la aplicacin.
Esto se ilustra en la Figura 1.10.

Unidad 1: Visin General de Java

Libro 1: Core Java 22

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 1.10: Encapsulacin en una Clase

Esta caracterstica est disponible en Java y se llama encapsulacin.


Tome el ejemplo de un ATM, telecajero. Se puede ir a un ATM a retirar dinero, revisar el
saldo de una cuenta, y depositar dinero. Estas son las funcionalidades proporcionadas a
los usuarios. Ellos no saben cmo estas funcionalidades estn implementadas, y no
estn preocupados por la implementacin. Los usuarios pueden acceder a la
informacin pertinente solo a sus cuentas. Ellos no pueden acceder a la informacin de
otros usuarios, a los usuarios no se les da acceso a saber cmo trabaja el ATM.
Considere la Figura 1.11, que muestra como la encapsulacin se lleva a cabo en una
clase Java. La clase que se muestra es Direccion. Un objeto Direccion es
instanciado y un mtodo es invocado. El cdigo que es privado en la clase Direccion
no es visible para la clase ServicioCliente.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 23


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Figura 1.11: Encapsulacin en el Objeto Direccion

8.2 Herencia
Considere el ejemplo de un profesor de fsica y uno de matemticas. Ambos pertenecen
a una categora general llamada profesores. Ellos tienen ciertos atributos y
comportamiento que son comunes a todos los profesores. Adicionalmente, ellos tienen
ciertos atributos especiales que son comunes a todos los profesores de fsica y
matemticas. Cuando se modela este ejemplo usando objetos de software, se puede
tener una clase llamada Profesor que defina todos los atributos y comportamiento
comunes a todos los profesores. Subsecuentemente, se pueden definir dos clases
ProfesorFisica y ProfesorMatematica, que hereden los atributos y
comportamiento comunes a todos los profesores, desde la clase Profesor. En este
caso, la clase Profesor ser la sper clase de las clases ProfesorFisica y
ProfesorMatematica y estas sern subclases de la clase Profesor.
Algunos lenguajes como C++, permiten la herencia mltiple en la cual una clase puede
heredar de varias clases. En Java, una clase slo puede tener una sper clase. Esto
significa que una clase en Java no puede directamente derivar de varias clases. Sin
embargo, Java soporta herencia mltiple indirectamente usando interfaces. Las
interfaces sern tratadas en detalle en el Volumen 1, Unidad 5 Clases Abstractas e
Interfaces.
La Figura 1.12 muestra un ejemplo de herencia. De esta figura, se puede deducir que
Bicicleta, MonoPatin y Moto tienen propiedades que son comunes a todos los
Unidad 1: Visin General de Java

Libro 1: Core Java 24

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

vehculos de dos ruedas, mientras que Carro, Autobus y Camion tienen propiedades
que son comunes a todos los vehculos de cuatro ruedas. Adems, los vehculos de dos
y cuatro ruedas, a su vez, tienen propiedades que son comunes a los vehculos.

Figura 1.12: Herencia: Clases Como Especializacin de la SuperClase Vehiculo

8.3 Polimorfismo
Se pueden tener muchas situaciones cuando se quieren hacer varias operaciones
similares unas con otras dependiendo de la entrada que se obtenga. Esto se denomina
polimorfismo, formado de dos races griegas, poly y morphus. La palabra poly
significa muchos y 'morphus' significa formas.
En programacin orientada a objetos, polimorfismo significa una sola interfaz y mltiples
implementaciones. En otras palabras, los nombres de mtodos son los mismos, pero
tienen diferentes implementaciones basadas en los parmetros que le son pasados, o
en los objetos sobre los cuales son invocados.
Suponga que se desea implementar a la clase Mamiferos, suponga tambin que uno
de los mtodos que se desea implementar para esta clase, es el que permita a tales
mamferos desplazarse de forma natural, a este mtodo se le llamar desplazar().
Se encontrar entonces conque para algunos mamferos el desplazamiento se realizar
por medio de caminar, como es en el caso de las personas, para otros el
desplazamiento natural ser nadar, como en el caso de los delfines e inclusive para
otros, el desplazamiento se lograr por medio de volar, como sucede con los
murcilagos. Se usa el mismo nombre del mtodo para invocar sus diferentes
implementaciones.
Ahora, se va a comenzar la programacin en Java escribiendo la aplicacin
HolaMundo, que escribe la cadena Hola Mundo en la salida estndar.
Los Ejemplos 1.2 y 1.3 tienen algunos elementos sintcticos, que no se han visto en
detalle hasta ahora. Estos elementos sern cubiertos en las prximas unidades. Estos
ejemplos simplemente ayudarn a exponer al usuario a la sintaxis Java.
Libro 1: Core Java

Volumen 1: Fundamentos de Java 25


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

9. Ejemplo de una Aplicacin Java


Observe el Ejemplo 1.2. La aplicacin Java HolaMundo de este ejemplo imprime la
cadena de caracteres Hola Mundo! en la salida estndar.
Ejemplo 1.2
El cdigo Java comienza aqu...
1. /*Definicion de la clase HolaMundo comienza aqui*/
2. public class HolaMundo {
3.
/*El metodo main comienza aqui */
4.
public static void main(String[] args) {
5.
System.out.println("Hola Mundo!");
6.
}/* El metodo main termina aqui */
7. }/*Definicion de la clase HolaMundo termina aqui*/
El cdigo Java termina aqu
En este programa, HolaMundo es el nombre de la clase, tienen un mtodo (comparable
a una funcin en C o a una funcin miembro en C++) con el nombre main. Este mtodo
tiene una instruccin que imprime Hola Mundo! en la salida estndar (el monitor)
cuando se ejecuta. Esta clase define un prototipo, y se puede crear cualquier nmero de
objetos de este tipo instanciando esta clase.
Ahora que se tiene el cdigo fuente listo, se debe compilar el programa y ejecutarlo. El
programa debe ser almacenado en un archivo bajo el nombre HolaMundo.java.
Usualmente, el nombre del archivo ser el mismo que el nombre de la clase que
contiene el mtodo main(), ya que la ejecucin del programa usualmente comienza
con el mtodo main(). El archivo tendr una extensin .java. Todo archivo Java
puede tener solamente una clase, que sea public.
El prximo paso es compilar el programa para obtener los bytecodes (archivo .class).
La compilacin se realiza usando el comando javac, como sigue:
javac HolaMundo.java
Esto produce un archivo con el nombre HolaMundo.class, que contiene los
bytecodes. Estos bytecodes son interpretados por el interprete Java, y entonces
ejecutados. El intrprete Java se inicia usando el comando java, como se muestra a
continuacin:
java HolaMundo
La salida del programa en el monitor ser:
Hola Mundo!

Unidad 1: Visin General de Java

Libro 1: Core Java 26

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Fin del Ejemplo 1.2


En la prxima seccin, se presenta cmo escribir un applet Java que imprime la cadena
de caracteres Hola Mundo!.

10. Ejemplo de Applet Java


El applet Java HolaMundo que se presenta a continuacin, imprime la cadena de
caracteres Hola Mundo! en el rea del applet.
Ejemplo 1.3
El cdigo Java comienza aqu...
1. import java.applet.Applet;
2. import java.awt.Graphics;
3.
4. /*Definicion de la clase HolaMundo comienza aqui*/
5. public class HolaMundo extends Applet {
6.
7.
8.

/*El metodo paint comienza aqui */


public void paint(Graphics g) {
// Llamar al metodo drawString

9.
10.
11.

// del objeto Graphics


g.drawString("Hola Mundo!", 25, 25);
}/* El metodo paint termina aqui */

12. }/*Definicion de la clase HolaMundo termina aqui*/

El cdigo Java termina aqu


En este applet Java, primero se tienen las instrucciones import, que se usan para
importar las clases Applet y Graphics. Estas son esenciales para un programa
applet. Luego, se tiene la definicin de la clase, con el nombre de la clase HolaMundo.
Esta definicin de la clase usa la palabra reservada extends, seguida del nombre de la
clase Applet. Esto significa que la clase HolaMundo hereda sus caractersticas de la
clase Applet. Se aprender ms acerca de herencia en el Volumen 2, Unidad 3 Herencia. Esta clase tiene un mtodo con el nombre de paint, que imprime Hola
Mundo!. La programacin de Applets ser discutida en el Volumen 6, Unidad 1 Applets.
El cdigo de este ejemplo tambin muestra el uso de los comentarios en Java. Hay
bsicamente tres tipos de comentarios que se usan en Java. Son los siguientes:

Libro 1: Core Java

Volumen 1: Fundamentos de Java 27


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Comentarios de Documentacin: Encerrados dentro de /** */. Estos comentarios se


usan para generar documentacin en las clases en Java.
Bloques de Comentarios: Encerrados dentro de /* */. Estos comentarios se usan
tpicamente antes de un mtodo o clase para describir su funcionalidad.
Comentarios de Implementacin: Comienzan con //. Estos comentarios se usan
tpicamente dentro de la implementacin del mtodo para explicar una expresin o una
lgica de implementacin compleja.
Se necesita escribir un archivo HTML para visualizar este applet. El cdigo para el
archivo HTML requerido para ejecutar el applet HolaMundo se muestra a continuacin:
El cdigo HTML comienza aqu...
<html>
<head>
<title>Hola Mundo</title>
<body>
<applet code="HolaMundo.class" width=200 height=50>
</applet>
</body>
</html>
El cdigo HTML termina aqu
El parmetro incluido en la etiqueta <applet> se usa para invocar el archivo
HolaMundo.class, y ejecutarlo. Este archivo se llamar HolaMundo.html. Se
necesita tener ambos el applet(archivo .class) y el archivo HTML en el mismo
directorio, una vez hecho esto, se puede ejecutar el applet usando el siguiente
comando:
appletviewer HolaMundo.html
La ventana del visualizador de applet se abre, y la salida del applet ser la siguiente:
Hola Mundo!
Fin del Ejemplo 1.3

Unidad 1: Visin General de Java

Libro 1: Core Java 28

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Resumen
Ahora, que ha completado esta unidad, usted debe ser capaz de:

Discutir la evolucin de Java.

Comparar Java con C++.

Mencionar las principales caractersticas de Java.

Explicar la plataforma Java.

Describir el impacto de Java en la WWW.

Definir clases y objetos.

Explicar los principios de orientacin a objetos en Java.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 29


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Unidad 1: Examen de Autoevaluacin


1) Cul de los siguientes lenguajes visualiza los componentes del programa como
objetos?
a) Lenguaje Procedimental
b) Lenguaje Orientado a Objetos
c) Lenguaje de Mquina
d) Ninguno de los anteriores
2) Cul de las siguientes caractersticas describe la arquitectura del lenguaje Java?
a) Orientado a Procedimientos
b) Abstracto
c) Independiente de Plataforma
d) Especfico
3) Cul mtodo deben tener todos los programas de aplicacin Java?
a) start()
b) begin()
c) main()
d) main(String args[])
4) Cul es el comando para ejecutar un programa compilado en Java?
a) javac
b) java
c) run
d) execute
5) En Java, una clase puede tener cualquier nmero de sper clases.
a) Verdadero
b) Falso
6) Cules de los siguientes programas puede acceder a recursos fuera de la JVM?
a) Aplicaciones Java
b) Applets Java
c) Servlets Java
d) Ninguno de los anteriores

Unidad 1: Visin General de Java

Libro 1: Core Java 30

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

7) Cul es la extensin usada para guardar los archivos fuente Java?


a) .java
b) .javac
c) .javax
d) .src
8) Cul de los siguientes es usado para referirse a una subclase?
a) Clase Interna
b) Clase Anidada
c) Clase Derivada
d) Clase Oculta
9) Cul de las siguientes opciones ha hecho popular a Java a travs de la Internet?
a) Applets Java
b) Aplicaciones Java
c) Bytecodes Java
d) Ninguna de las anteriores
10) Cul de las siguientes afirmaciones es cierta acerca de Java?
a) Tiene solo un compilador
b) Tiene solo un interpretador
c) Tiene ambos un compilador y un interpretador
d) Interpreta y luego compila

Libro 1: Core Java

Volumen 1: Fundamentos de Java 31


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Respuestas a la Unidad 1: Examen de Autoevaluacin


1) b
2) c
3) d
4) b
5) b
6) a y c
7) a
8) c
9) a
10) c

Unidad 1: Visin General de Java

Libro 1: Core Java 32

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 2: Operadores, Expresiones y


Control de Flujo
Objetivos del Aprendizaje
Al final de esta unidad, usted ser capaz de:

Mencionar los tipos de datos primitivos usados en Java.

Describir la declaracin e inicializacin de variables en Java.

Discutir los diferentes operadores usados en Java.

Explicar la precedencia de operadores en Java.

Definir los tipos de conversiones automticas y explcitas en Java.

Explicar las diferentes estructuras de control usadas en Java.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 33


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

1. Introduccin
En esta unidad, se discute la sintaxis bsica de Java, se encontrarn muchas
similitudes entre la sintaxis de Java y C++.
Antes de aprender acerca de la sintaxis de programacin de Java, se discuten los tipos
de datos que provee el lenguaje Java.

2. Tipos de Datos en Java


Los tipos de datos en Java son de dos tipos:

Tipos Primitivos: Tipos de datos que mantienen valores primitivos como 10, a,
12.2 etc.

Tipos Referencias: Tipos de datos que mantienen valores de referencia como


objetos y arreglo de referencias.

Adems de los tipos de datos en Java, tambin existen los genricos que nos permiten
especificar el tipo de elemento de un Coleccin en tiempo de compilacin. En lugar de
especificar una lista, especificamos su contenido, por ejemplo: Double (doble).
La Figura 2.1 muestra los tipos de datos que Java soporta.

Figura 2.1: Tipos de Datos en Java


Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 34

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

En la Figura 2.1, bajo los tipos primitivos, se tienen ocho tipos de datos. Los nombres
mostrados en la figura son las palabras claves usadas en Java para denotar estos tipos
de datos. Los tres tipos referencia, es decir, arreglos, clases e interfaz, se les coloca
identificadores definidos por el usuario al escribir cdigo Java. Por ejemplo,
nombre[20] denota a nombre definido por el usuario como tipo arreglo.
A continuacin se ver en detalle los tipos de datos primitivos usados en Java.

2.1 Tipos Primitivos


Los tipos de datos primitivos se usan para definir variables en Java. El tipo de dato
especificado junto con un identificador en el momento de la declaracin de la variable
define el rango de valores que puede ser almacenado en esta variable. Java provee
ocho tipos de datos primitivos. La Tabla 2.1 proporciona el nombre del tipo de dato
primitivo y el tamao ocupado por cada tipo de dato primitivo en memoria.
Tipo de Dato Primitivo

Tamao Ocupado en Memoria

boolean

1 byte

byte

1 byte

char

2 bytes

short

2 bytes

int

4 bytes

Long

8 bytes

Float

4 bytes

Double

8 bytes

Tabla 2.1: Tamao Ocupado por los Tipos de Datos Primitivos en la Memoria

A continuacin se discute cada uno de los ocho tipos de datos en Java, comenzando
con los tipos de datos enteros.
2.1.1 Tipos de Datos Enteros
Los tipos de datos enteros se usan para almacenar valores enteros. La Figura 2.1
muestra cinco tipos diferentes de tipos de datos enteros, estos son: byte, short,
int, long, y char. El rango de valores que estos tipos de datos primitivos pueden
almacenar se muestra a continuacin:

byte

-27 hasta 27 1

short

-215 hasta 215 1

Libro 1: Core Java

Volumen 1: Fundamentos de Java 35


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

int

-231 hasta 231 1

long

-263 hasta 263 1

Las diferentes variables de los tipos de datos enteros se declaran como se muestra en
el siguiente cdigo:
byte b = 1;
short s = 1;
int i = 1;
long l = 1;
En las declaraciones anteriores, a todas las variables se les ha asignado el valor del
literal entero 1. Los literales son valores constantes que son asignados a las variables.
El tipo de dato char se usa para almacenar caracteres. Estos caracteres deben ser
caracteres Unicode. Unicode provee nmeros nicos a los caracteres, que permanecen
igual en cualquier plataforma o lenguaje.
Debido a que se usan nmeros para almacenar caracteres en la mquina, el tipo de
datos char esta dentro de la categora de tipos de datos enteros.
El rango del tipo de datos char se muestra a continuacin:
0 hasta 215

char

Java reserva 2 bytes para almacenar el valor de un char. El siguiente cdigo muestra la
declaracin de una variable char.
char ch = a;
Los literales de carcter se definen usando la comilla simple, mientras que las cadenas
de caracteres se definen usando comillas dobles. Java tambin usa secuencias de
escape, en los caracteres. Una secuencia de escape es un conjunto especial de
caracteres que tienen algn significado especial. Todas las secuencias de escape en
Java comienzan con el caracter \. A continuacin se muestran algunas secuencias de
escape en Java:

\r retorno de carro

\n nueva lnea

\t tabulador

\b borrado a la izquierda

\f comienzo de pgina

\\ - caracter \

\ comilla simple

\" comilla doble

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 36

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Un programa Java puede interactuar con caracteres internacionales, lo cual no es


posible en C o C++, a menos que se programen cada conjunto de caracteres
separadamente.
2.1.2 Tipos de Datos de Punto Flotante
Los tipos de datos de punto flotante se usan para almacenar valores de punto flotante.
Los dos tipos de tipos de datos para punto flotante son float y double.
El rango de estos tipos de datos primitivos es el siguiente:
float
double

-3.4 * 1038 hasta 3.4 * 1038


-1.8 * 10308 hasta 1.8 * 10308

El siguiente cdigo muestra la declaracin de dos variables pertenecientes al tipo de


datos de punto flotante.
float a = 1.1f;
double d = 1.1;
Las variables literales float deben terminar con f o F.
La Figura 2.2 muestra literales que se pueden asignar a float y double.

Figura 2.2: Literales Asignados a float y double

2.1.3 Tipo de Datos boolean


El tipo de datos boolean se usa para almacenar valores booleanos, es decir, true o
false. La palabra clave boolean se usa para denotar el tipo de datos booleano. El
siguiente cdigo muestra la declaracin de una variable boolean.
boolean bool = true;

Libro 1: Core Java

Volumen 1: Fundamentos de Java 37


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

2.1.4 Valores Aceptables Para Diferentes Tipos de Datos Primitivos en Java


La Tabla 2.2 muestra algunos ejemplos de valores aceptables para los diferentes tipos
de datos primitivos en Java.
Tipo de Datos

Entero

Valor Aceptable
2 (se asume int)
2L
0777 (octal)
0xa5fd (hexadecimal)
a, \n, \udddd

Punto Flotante

3.14 (se asume double)


3.12E4
2e12
2.0d
2.0F

Boolean

true, false

Tabla 2.2: Algunos Ejemplos de Valores para los Tipos de Datos en Java

2.1.5 Tamaos de los Tipos de Datos en C, C++, y Java


En lenguajes como C y C++, el tamao del tipo de datos puede variar entre plataformas
y es dependiente de la mquina. Por ejemplo, el tipo de datos entero ocupa 2 bytes en
ciertos compiladores de C, en cambio ocupa 4 bytes en otros.
En Java, sin embargo, el tamao del tipo de datos es independiente de la plataforma en
la cual la aplicacin se ejecuta. El tamao de cada tipo de datos primitivo es el mismo
sin importar la plataforma. Por ejemplo, el tipo de datos entero siempre ocupa 4 bytes
en cualquier implementacin vlida de la JVM. Un valor por defecto est siempre
asociado con los tipos de datos primitivos. Para los tipos de datos enteros, el valor por
defecto es 0. Para los tipos de datos de punto flotante, el valor por defecto es siempre
0.0. Para los tipos de datos caracteres, el valor por defecto es \u0000. El valor por
defecto para los boolean es false.

2.2 Tipos de Referencia


Los tres tipos de referencia provistos por Java son los arreglos, clases e interfaz. No se
entrar en una discusin detallada de estos tres tipos de datos ahora, solo se
mencionar que una referencia es un elemento de datos que mantiene la direccin de
una posicin de memoria. Los arreglos en Java no son referidos como tipos de datos
estructurados como en C o C++. Los arreglos son tipos referencia, donde el
identificador que se usa para identificar al arreglo contiene la direccin del arreglo.
Estos sern tratados en detalle en una seccin posterior en esta unidad.
Java es un lenguaje de programacin orientado a objetos, y por esto todo el esfuerzo en
la programacin esta alrededor de la creacin de clases. Java tambin permite la
creacin de interfaces, que son similares a las clases. Los identificadores usados para
Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 38

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

identificar a las clases e interfaces mantienen la direccin de la posicin de la memoria.


Las clases son analizadas en detalle en el Volumen 2, Unidad 1 Clases, Objetos y
Referencias y las interfaces en el Volumen 2, Unidad 5 Clases Abstractas e
Interfaces. A continuacin se muestra una breve descripcin sobre los genricos.

2.3 Genricos
Java 5.0 introduce nuevas funcionalidades al lenguaje de programacin Java. Una de
esas funcionalidades son los genricos. Puede que usted encuentre construcciones
similares en otros lenguajes pero ver que hay diferencias importantes entre ellas. Los
genricos le permiten hacer abstracciones de tipos de datos. Estos sern tratados en
detalle en el Volumen 8 - Conceptos Avanzados, Unidad 1 API de Colecciones.
Seguidamente, se va a aprender acerca de clases envolventes (wrapper classes), que
esencialmente envuelven los tipos de datos primitivos en clases.

3. Clases Envolventes
Se han discutido varios tipos de datos primitivos de Java. Java tambin provee clases
envolventes para cada uno de estos tipos de datos primitivos. Una clase envolvente da
la funcionalidad de una clase para un tipo de datos primitivo. Estas clases envolventes
tienen mtodos que permiten manipular el tipo de dato primitivo correspondiente que
ellos envuelven.
Los tipos de datos primitivos tienen conjuntos de operaciones que se pueden usar con
ellos. Sin embargo, cuando se quiere proveer algunas funciones utilitarias para un tipo
de dato en particular, se usan las clases envolventes y se proveen funciones primitivas
dentro de las clases envolventes.
Hay ciertas clases, que vienen como parte de la librera de Java, que requieren de un
objeto en vez de una variable de tipo de dato primitivo. Los objetos de las clases
envolventes se pueden usar tambin para este propsito.
Java provee clases envolventes para los ocho tipos de datos primitivos. Se discute a
continuacin las ocho clases envolventes en Java, comenzando por la clase envolvente
Boolean.

3.1 La Clase java.lang.Boolean


La clase Boolean es la representacin en objeto del tipo de dato primitivo boolean.
Esta clase, es una clase envolvente para el tipo primitivo boolean, por lo tanto, tiene
un miembro del tipo boolean. Tambin tiene ciertos mtodos que se pueden usar para
manipular el valor del boolean almacenado internamente.
La clase Boolean tiene el mtodo booleanValue(), que retorna el valor del boolean
que est envuelto en este objeto. Tambin tiene los mtodos equals(), toString()
y hashCode() que son sobrescritos de la clase java.lang.Object.
Libro 1: Core Java

Volumen 1: Fundamentos de Java 39


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

La clase Boolean tiene el mtodo static valueOf() para convertir una


representacin de objeto String en un valor Boolean.

3.2 La Clase java.lang.Byte


La clase Byte es la representacin en objeto del tipo de dato primitivo byte. Esta
clase, por ser una clase envolvente para el tipo de dato primitivo byte, tiene un
miembro del tipo byte. Esta clase tiene mtodos que permiten obtener el valor del
byte almacenado en el objeto Byte en la forma de byte, short, int, float o
double. Esto se hace usando los siguientes mtodos:

byteValue()

shortValue()

intValue()

floatValue()

doubleValue()

La clase Byte tambin tiene mtodos que son sobrescritos


java.lang.Object. Estos mtodos son los siguientes:

equals()

toString()

hashCode()

de

la clase

Adems de estos mtodos, la clase Byte tiene el mtodo static valueOf() para
convertir una representacin de objeto String en un valor byte.

3.3 La Clase java.lang.Short


La clase Short es la representacin en objeto del tipo de dato primitivo short. Esta
clase, por ser una clase envolvente para el tipo primitivo short, tiene un miembro del
tipo short. Esta clase tiene mtodos que permiten obtener el valor del short
almacenado en el objeto Short en la forma de byte, short, int, float o double.
Esto se hace usando los mtodos:

byteValue()

shortValue()

intValue()

floatValue()

doubleValue()

La clase Short tambin tiene los mtodos equals(), toString() y hashCode()


que son sobrescritos de la clase java.lang.Object.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 40

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

La clase Short tiene el mtodo static valueOf() para convertir una representacin
del objeto String en un valor Short.

3.4 La Clase java.lang.Character


La clase Character es la representacin en objeto del tipo de dato primitivo char. La
clase Character, al ser una clase envolvente, tiene un campo del tipo primitivo char.
Se pueden usar los mtodos provistos por esta clase para manipular variables que
mantienen valores del tipo primitivo char. Algunas de las funciones importantes
provistas por esta clase dan la posibilidad de determinar el tipo de carcter y convertir
un carcter en minscula a mayscula y viceversa. Los mtodos definidos en la clase
Character estn basados en la tabla de atributos Unicode. Esta tabla asocia a cada
cdigo Unicode definido con un nombre. Los caracteres estn encerrados dentro de
comillas simples. As, a es el carcter a. Se pueden obtener caracteres especiales
usando secuencias de escape. \n es la secuencia de escape para el carcter de
nueva lnea.
Se puede usar el mtodo charValue() de esta clase para obtener el valor char
almacenado por el objeto en la forma del tipo de dato primitivo char.

3.5 La Clase java.lang.Integer


La clase Integer es la representacin en objeto del tipo de dato primitivo int. Un
objeto Integer tiene un campo, que es del tipo primitivo int. Es posible usar los
mtodos provistos por esta clase para manipular variables que mantienen valores del
tipo primitivo int.
Algunas de las funciones ms importantes provistas por esta clase son la posibilidad de
convertir un int a un String con el mtodo toString(), y de un String a un int
usando el mtodo parseInt(String s). Cuando la JVM encuentra valores int en
el cdigo, los interpretar como enteros. Cuando se usa un nmero como 2, la JVM
asume que es del tipo int. Si se quiere que la JVM lo interprete como algo diferente a
un int, se debe proveer informacin ms especfica. Si se quiere que la JVM piense
que es del tipo long, se debe usar una "L" despus del entero. Los otros tipos de datos
enteros byte y short no pueden ser especificados. Estos sern convertidos al
momento de la asignacin de valores. As, la sentencia byte b = 120; convertir
120 de int a byte, siempre y cuando el valor pertenezca al rango vlido para un byte.
Esta clase tiene mtodos que permiten obtener el valor del int almacenado en el
objeto Integer en la forma de byte, short, int, float o double usando los
mtodos byteValue(), shortValue(), intValue(), floatValue() y
doubleValue() respectivamente.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 41


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

3.6 La Clase java.lang.Long


La clase Long es la representacin en objeto del tipo de dato primitivo long. Esta
clase, por ser una clase envolvente del tipo primitivo long, tiene un miembro del tipo
long. Esta clase tiene mtodos que permiten obtener el valor del long almacenado en
el objeto Long en la forma de byte, short, int, float o double usando los mtodos
byteValue(), longValue(), intValue(), floatValue() y doubleValue()
respectivamente. La clase Long tiene tambin los mtodos equals(), toString() y
hashCode() que son sobrescritos desde la clase java.lang.Object.
La clase Long tiene un mtodo static valueOf() para convertir una representacin
del objeto String en un valor Long.

3.7 La Clase java.lang.Float


La clase Float es la representacin en objeto del tipo de dato primitivo float. Esta
clase, por ser una clase envolvente del tipo primitivo float, tiene un miembro del tipo
float. Tambin tiene mtodos que permiten obtener el valor del float almacenado
en el objeto Float en la forma de byte, short, int, float o double usando los
mtodos
byteValue(),
shortValue(),
intValue(),
floatValue(),
longValue() y doubleValue() respectivamente.
La clase Float tambin tiene los mtodos equals(), toString() y hashCode()
que son sobrescritos de la clase java.lang.Object.
La clase Float tiene el mtodo static valueOf() para convertir una representacin
del objeto String en un valor Float.

3.8 La Clase java.lang.Double


La clase Double es la representacin en objeto del tipo de dato primitivo double. Esta
clase, por ser una clase envolvente para el tipo primitivo double, tiene un miembro del
tipo double. Tambin tiene mtodos que nos permiten obtener el valor del double
almacenado en el objeto Double en la forma de byte, short, int, float o double
usando los mtodos byteValue(), shortValue(), intValue(), floatValue() y
doubleValue() respectivamente.
La clase Double tambin tiene los mtodos equals(), toString() y hashCode()
que son sobrescritos de la clase java.lang.Object, as como el mtodo static
valueOf() para convertir una representacin del objeto String en un valor Double.
Considere el Ejemplo 2.1, que muestra el uso de las clases envolventes en Java.
Ejemplo 2.1
El cdigo Java comienza aqu...
Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 42

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

1. /*Definicion de la clase EnvolventesEjemplo comienza aqui*/


2. public class EnvolventesEjemplo {
3.
/*El metodo main comienza aqui */
4.
5.
6.

public static void main(String args[]) {


Integer i = new Integer(5);
String s = "250.47";

7.
8.
9.

System.out.println("Valor de i es: "


+ i.toString());

10.
11.

System.out.println("Valor de s es: "


+ Float.parseFloat(s));

12.
13.
14.

Float f = Float.valueOf(s);
float primitivoFloat = f.floatValue();

15.
16.
17.

int primitivoInt = f.intValue();

18.
19.
20.

+ primitivoFloat);
System.out.println("Valor del primitivo int es: "
+ primitivoInt);

21.
22.

System.out.println("Valor del primitivo float es: "

}/* El metodo main termina aqui */


}/*Definicion de la clase EnvolventesEjemplo termina aqui*/

El cdigo Java termina aqu


El cdigo anterior usa varios mtodos estticos y mtodos de instancia en las clases
envolventes. El programa muestra el uso de las clases envolventes para Integer y
Float. La salida del cdigo anterior es la siguiente:
Valor de i es: 5
Valor de s es: 250.47
Valor del primitivo float es: 250.47
Valor del primitivo int es: 250
Fin del Ejemplo 2.1
Existen otras dos clases en Java, una de ellas se ocupa de los enteros de precisin
arbitraria inmutables, y la otra de nmeros decimales con signo de precisin arbitraria
inmutables. La primera clase esta representada por java.math.BigInteger y la
segunda clase por java.math.BigDecimal. Dado, que ambas clases tratan tambin
con nmeros en Java, se van a discutir acerca de ellas brevemente.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 43


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

4. Math Clases Colaboradoras sobre los Tipos de Datos


Java provee un nmero de paquetes. Los paquetes son contenedores para las clases,
los cuales sern tratados en detalle en el Volumen 2, Unidad 7 Paquetes. Los tipos
primitivos enteros de Java no pueden efectuar operaciones sobre nmeros largos, por
esto Java provee un paquete llamado Math, que tiene dos clases, son estas:
BigInteger y BigDecimal, para realizar operaciones matemticas sobre nmeros
largos. Se aprender a continuacin acerca de estas dos clases, BigInteger y
BigDecimal.

4.1 La Clase java.math.BigInteger


Esta clase provee la abstraccin de enteros de un tamao de palabra infinito
representados por el tipo de datos int. Esta clase es inmutable, lo que significa que el
valor representado por esta clase no puede cambiar; representa enteros de precisin
arbitraria. BigInteger se representa usando la forma de complemento a dos, como en
el caso del tipo de dato primitivo int. Todos los operadores que se pueden usar con el
tipo de dato primitivo entero tienen operadores anlogos que se pueden usar con
BigInteger. Usando BigInteger, se pueden realizar manipulaciones de bits,
verificar si un nmero es primo, generar un nmero de primo, calcular el Mximo Comn
Divisor, etc.

4.2 La Clase java.math.BigDecimal


Esta clase se usa para representar dgitos a la derecha del punto decimal en una escala
de un entero de 32-bit. BigDecimal usa un valor sin escala que es entero de precisin
arbitraria. Esta clase provee mtodos que permiten realizar operaciones aritmticas
bsicas y manipulaciones de escala, tambin ayuda a comparar dos valores
BigDecimal y a convertir el formato de los valores BigDecimal. La clase
BigDecimal tambin permite especificar el comportamiento del redondeo para los
valores decimales proporcionando ocho modos de redondeo.
En C o C++, se usan arreglos de caracteres para representar cadenas de caracteres
(strings). Java, por el contrario, provee la clase String, que se puede usar para
almacenar y manipular cadenas de caracteres. Se va a examinar el manejo y
manipulacin de String.

5. Manejo de String
El manejo de cadenas de caracteres (string) en Java se hace usando las clases
String o StringBuffer, ambas clases se usan para almacenar y manipular cadenas
de caracteres. Sin embargo, hay una diferencia principal entre estas dos clases en la
forma en la que son manejados por el sistema de tiempo de ejecucin de Java. Se va a
profundizar en estas dos clases para entender la diferencia.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 44

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

5.1 La Clase String


El literal string se usa para almacenar valores string (cadena de caracteres). La clase
String se usa para denotar un literal string. Se puede especificar strings al encerrar el
texto dentro de comillas dobles, es importante notar la diferencia entre comillas simples
y dobles: z no es equivalente a z. La primera es el carcter z, la segunda es una
cadena de caracteres (string) de un carcter. El siguiente cdigo muestra la declaracin
de una variable String.
String str = "Hola";
El fin de una cadena de caracteres es usualmente indicado por \0.
La clase String es inmutable, lo que significa que su valor no puede ser cambiado una
vez que se crea un objeto del tipo String.
Se pueden usar mtodos definidos en la clase String para hacer lo siguiente:

Examinar los diferentes caracteres que componen una cadena de caracteres.

Buscar una sub-cadena dentro de una cadena de caracteres.

Comparar dos cadenas de caracteres.

Crear otra cadena de caracteres que tenga todos los caracteres de la primera
cadena de caracteres en maysculas o minsculas.

Dos cadenas de caracteres pueden ser concatenadas usando el operador "+" como se
muestra en la Figura 2.3. Como String es inmutable, esta concatenacin es
actualmente implementada usando internamente la clase StringBuffer por Java. En
la prxima seccin, se discute la clase StringBuffer.
String uno = "abcde";
String dos = "fghij";
String tres;
tres = uno + dos;
System.out.println(tres);
Figura 2.3: Uso de la Clase String

El objeto tres es creado y tiene el valor abcdefghij.


5.1.1 El paquete java.util.regex
Este paquete est constituido por dos clases: la clase Matcher y la clase Pattern y
por una excepcin, PatternSyntaxException. Las clases son usadas para hacer
corresponder secuencias de caracteres con patrones especificados por expresiones
regulares.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 45


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Una instancia de la clase Pattern representa una expresin regular que es


especificada en forma de secuencias de caracteres con una sintaxis similar a la usada
por Perl.
Las instancias de la clase Matcher son usadas para hacer corresponder secuencias de
caracteres con un patrn dado. La entrada (Input) es proporcionada a las clases
Matcher a travs de la interface CharSequence con el fin de soportar la
correspondencia con caracteres procedentes de una amplia variedad de fuentes de
entrada (archivos, string, etc).
5.1.2 Las clases Pattern y Matcher
La clase Pattern:
Es una representacin compilada de una expresin regular, es decir, representa la
expresin regular que necesita ser compilada. Pertenece al paquete java.util.regex.
La clase Pattern implementa la interfaz Serializable. Para crear una instancia de
la clase Pattern, se puede compilar una expresin regular, especificada como una
cadena de caracteres (String). El patrn resultante luego puede ser usado para crear
un objeto Matcher que puede hacer corresponder secuencias de caracteres arbitrarios
con la expresin regular. Todo el estado involucrado en la realizacin de una
correspondencia (match) reside en el objeto. Por lo tanto, muchos objetos Matcher
pueden compartir el mismo patrn.
Una secuencia de invocacin tpica es:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
El mtodo matches esta definido por esta clase como un recurso para cuando una
expresin regular sea usada slo una vez. Este mtodo compila una expresin y hace la
correspondencia (match) de una secuencia de entrada con sta, en una invocacin
sencilla.
La siguiente sentencia
boolean b = Pattern.matches("a*b", "aaaaab");

es equivalente a las tres sentencias anteriores aunque para correspondencias


repetidas es menos eficiente ya que no permite que el patrn compilado sea reutilizado.
Las instancias de la clase Pattern son inmutables y seguras para ser usadas por
mltiples hilos concurrentes. Las instancias de la clase Matcher no son seguras para
tal uso.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 46

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

La clase Matcher:
La clase Matcher implementa MatchResult.
Esta clase es un motor que realiza operaciones de correspondencia sobre una
secuencia de caracteres interpretando un patrn.
Una instancia de la clase Matcher es creada a partir de un patrn mediante la
invocacin del mtodo matcher de la clase Pattern. Una vez creada, una clase
Matcher puede ser usada para realizar tres tipos diferentes de operaciones de
correspondencia:

El mtodo matches intenta hacer corresponder la secuencia de entrada


completa con el patrn.
Si la correspondencia tiene xito, entonces se puede obtener ms informacin
por intermedio de los mtodos start, end, y group.
Este mtodo retorna verdadero si y slo si la secuencia de entrada completa se
corresponde con este patrn de Matcher.

El mtodo lookingAt intenta hacer corresponder la secuencia de entrada,


comenzando desde el principio de la regin, con el patrn.
Como el mtodo matches, este mtodo siempre comienza al principio de la
regin. La diferencia de ese mtodo es que no requiere que el patrn
completo sea correspondido.
Si la correspondencia tiene xito entonces se puede obtener ms informacin
por medio de los mtodos start, end, y group.
Este mtodo retorna verdadero si y slo si la secuencia de entrada se
corresponde con este patrn de Matcher.

El mtodo find, intenta encontrar la prxima subsecuencia de la secuencia de


entrada que se corresponde con el patrn.
Este mtodo comienza al principio de la regin de la clase Matcher, o si una
invocacin anterior del mtodo fue exitosa y el matcher no ha sido reestablecido
(reset) desde entonces, en el primer caracter no correspondido por la anterior
correspondencia.
Si la correspondencia tiene xito, entonces se puede obtener ms informacin
por intermedio de los mtodos start, end, y group.
Este mtodo retorna verdadero si y slo si una subsecuencia de la secuencia de
entrada se corresponde con el patrn de este Matcher.

Cada uno de estos mtodos retorna un boolean indicando xito o fracaso. Se puede
obtener ms informacin acerca de una correspondencia exitosa haciendo una consulta
del estado del matcher.
Libro 1: Core Java

Volumen 1: Fundamentos de Java 47


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Una clase Matcher encuentra correspondencias en un subconjunto de su entrada


(input) llamado la regin. Por defecto, la regin contiene toda la entrada de Matcher.
La regin puede ser modificada por intermedio del mtodo region y consultada a travs
de los mtodos regionStart and regionEnd. La forma en que los lmites de la regin
interactan con algunos constructores de patrones puede ser cambiada. Ver
useAnchoringBounds y useTransparentBounds para ms detalles.
La clase Matcher tambin define mtodos para reemplazar subsecuencias
correspondidas con nuevas cadenas de caracteres cuyos contenidos pueden ser, si se
desea, computados a partir del resultado de la correspondecia. Los mtodos
appendReplacement y appendTail pueden ser usados sucesivamente para recoger el
resultado dentro de un buffer de cadena de caracteres existente, o el mtodo
replaceAll ms conveniente puede ser usado para crear una cadena de caracteres en
la cual cada subsecuencia correspondida en la secuencia de entrada es reemplazada.
El estado explcito de una clase Matcher incluye los ndices de inicio y culminacin de
la correspondencia exitosa ms reciente. Tambin incluye los ndices de inicio y
culminacin de la subsecuencia de entrada capturada por cada grupo de captura en el
patrn as como un conteo total de tales subsecuencias. Como una conveniencia,
tambin se proveen mtodos para retornar estas subsecuencias capturadas en forma
de caracteres de cadena.
El estado explcito de una clase Matcher inicialmente no est definido. Si se intenta
hacer una consulta de cualquier parte de ste antes de una correspondencia exitosa
esto causar que una IllegalStateException sea lanzada. El estado explcito de
una clase Matcher es computarizada de nuevo por cada operacin de
correspondencia.
El estado implcito de una clase Matcher incluye la secuencia de caracteres de entrada
as como la posicin append, la cual es inicialmente cero y es actualizada por el mtodo
appendReplacement.
Es posible que una clase Matcher sea reestablecida explcitamente al invocar su
mtodo reset() o, si se desea una nueva secuencia de entrada, su mtodo
reset(CharSequence). Cuando se reestablece una clase Matcher, se elimina la
informacin de su estado explcito y se establece la posicin append en cero.
Las instancias de esta clase no deben ser usadas por mltiples hilos concurrentes, ya
que no son seguras.

5.2 La Clase StringBuffer


La clase StringBuffer es similar a la clase String y se usa para denotar a un literal
string. Sin embargo, StringBuffer es mutable, a diferencia de la clase String. Esto
significa que los valores almacenados por objetos de esta clase pueden ser cambiados.
StringBuffer juega un rol vital en la concatenacin de cadenas de caracteres,
actualmente se implementa a travs de la creacin de objetos StringBuffer, y luego
Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 48

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

se usa el mtodo append() sobre los objetos creados. Esto es una alternativa mejor
que usar el operador + sobre dos objetos String.
Los objetos StringBuffer se pueden usar en aplicaciones multihilos, ya que los
mtodos que operan en estos objetos pueden ser sincronizados para evitar la
ocurrencia del interbloqueo. Se aprender acerca de los interbloqueos en detalle en el
Volumen 7, Unidad 3 Sincronizacin de Hilos.
Se han discutido varios tipos de datos soportados por Java, los cuales representan
varios tipos de valores que se pueden usar en programas Java. Estos valores son
almacenados usualmente en la memoria de la pila, y se pueden cambiar cualquier
nmero de veces dentro de un mismo programa Java. Los nombres de las variables o
identificadores se usan para localizar estos valores. A continuacin se discuten los
nombres de variables o identificadores.

5.3 La Clase StringBuilder


Esta clase proporciona un API compatible de StringBuffer, pero no se garantiza su
uso bajo escenarios de sincronizacin. Fue diseada para usarla como el reemplazo de
StringBuffer en donde el string sea utilizado por un solo hilo (generalmente es el
caso). En lo posible, se recomienda que esta clase sea utilizada preferiblemente en
lugar de StringBuffer pues ser ms rpida en la mayora de los casos.
Las operaciones principales en StringBuilder son los mtodos append e insert,
cuando son sobrecargados para aceptar datos de cualquier tipo. Cada uno convierte
con eficacia un dato dado a un string y aade o inserta los caracteres de ese string al
string en construccin. El mtodo append agrega siempre estos caracteres al final de la
secuencia de caracteres en construccin; el mtodo insert agrega los caracteres en
un punto especificado.
Por ejemplo, si x refiere a un objeto StringBuilder que contiene lava, despus de
la llamada x.append(manos) del mtodo hara que la secuencia construida
contenga lavamanos, mientras que x.insert(4,nos) alterara la construccin
de la secuencia para contener lavanosmanos.
Generalmente si sb refiere a una instancia de StringBuilder, entonces
sb.append(x) tiene el mismo efecto que sb.insert(sb.length(), x). Cada
constructor de StringBuilder tiene una capacidad de almacenamiento. Mientras la
longitud de la secuencia de caracteres contenida en el StringBuilder no exceda la
capacidad, no es necesario asignar un nuevo buffer interno. Si desborda el buffer
interno, automticamente se hace ms grande.
Las instancias StringBuilder no son seguras para el uso con mltiples hilos. Si se
necesita o requiere la sincronizacin entonces se recomienda que StringBuffer sea
utilizado.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 49


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

5.4 Diferencias entre String, StringBuilder y StringBuffer


String es inmutable mientras que StringBuffer y StringBuilder pueden
cambiar sus valores.
La nica diferencia entre StringBuffer y StringBuilder es que StringBuilder
es asncrono mientras que StringBuffer es sncrono. Por lo tanto cuando una
aplicacin necesita funcionar solamente con un hilo entonces es mejor utilizar
StringBuilder. StringBuilder es ms eficiente que StringBuffer.
Criterios para elegir entre String, StringBuffer y StringBuilder:

Si el texto no va a cambiar usar la clase String porque un objeto String es


inmutable.

Si el texto puede cambiar y es accedido solamente por un hilo, utilizar un


StringBuilder porque StringBuilder no es sncrono.

Si el texto puede cambiar, y es accedido por mltiples hilos, utilizar un


StringBuffer porque StringBuffer es sncrono.

6. Identificadores
Cuando se escribe un programa se necesita almacenar los valores usados en el
programa. Estos valores se almacenan en la memoria, se necesita tener un mtodo
simple para acceder a estas posiciones en la memoria. Por esto se usa un identificador
o variable para referirnos a estas posiciones en memoria.

6.1 Convenciones de Nombres


Hay algunas reglas que tienen que seguirse al momento de nombrar variables en Java.
Estas son:

Los nombres de variables deben comenzar con una letra, subrayado (_) o dlar
($). Sin embargo, no hay restriccin en el nmero de letras que se pueden usar.

Los nombres de variables pueden contener letras, nmeros, el subrayado (_) y


el carcter dlar ($).

No debe haber espacio entre los caracteres.

No hay lmite en la longitud del nombre de la variable.

Las palabras clave de Java no pueden usarse como nombres de variables.

Para una mejor legibilidad, los nombres de variables deben componerse de dos
o ms palabras significativas. La primera letra de la variable ser siempre en
minsculas y las primeras letras de las palabras subsecuentes en maysculas
(Ejemplo: numeroCuenta).

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 50

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

En el caso de nombres de clase, todas las palabras que son parte del nombre de
la clase deben comenzar con una letra mayscula (Ejemplo: StringBuffer).

Se discute a continuacin cmo se usa una variable.

7. Declaracin e Inicializacin de Variables


Java es un lenguaje fuertemente tipificado, es decir, toda variable debe tener un tipo de
dato asociado. Esto ayuda a saber el tipo del dato almacenado dentro de la variable o el
tipo de dato que necesita ser almacenado dentro de la variable.
Ahora, para usar las variables, stas tienen que ser declaradas. La declaracin e
inicializacin consiste de los dos pasos siguientes:

Especificar el tipo de dato de la variable, seguido por el identificador, como se


muestra a continuacin:
int edad;
Aqu, int es el tipo de dato de la variable, y edad es el identificador.

Inicializar la variable, donde el valor inicial es especificado. La inicializacin de la


variable se muestra a continuacin:
edad = 18;

Se pueden combinar ambas, la declaracin y la inicializacin de la variable, en un


mismo paso, como se muestra en la Figura 2.4.

Figura 2.4: Declaracin e Inicializacin de Variable

A continuacin se discute el alcance de las variables.

7.1 Alcance de una Variable


Todas las sentencias de Java estn especificadas dentro de un bloque (excepto para
las sentencias package e import, que sern discutidas en el Volumen 2, Unidad 7
Paquetes).

Libro 1: Core Java

Volumen 1: Fundamentos de Java 51


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

El inicio de un bloque se marca con un carcter {, y el fin del bloque, con el


correspondiente carcter }. Un bloque puede contener otro bloque (o cualquier nmero
de bloques) dentro de l, estos se denominan bloques anidados.
Considere el caso de tres bloques anidados, como se muestra en la Figura 2.5.

Figura 2.5: Alcance de Variables

El bloque externo contiene al bloque del medio, que a su vez contiene al bloque interno.
Suponga que una variable llamada edad se declara dentro del bloque del medio,
entonces puede ser usada dentro del bloque del medio y del interno, pero no dentro del
bloque externo. El rango de bloques dentro de la cual una variable se puede usar se
conoce como alcance de una variable.
El Ejemplo 2.2 ilustra el alcance de una variable en un programa Java
Ejemplo 2.2
El cdigo Java comienza aqu...
1. public class BloquePrueba {
2.
3.

/* Comienza el 1er bloque */


static int a = 10, b = 20;

4.
5.
6.

public static void main(String args[]) {


/* Comienza el 2do bloque */
int c = 30;

7.
8.
9.

System.out.println(a);
System.out.println(b);
System.out.println(c);

10.
}/* Fin del 2do bloque */
11. }/* Fin del 1er bloque */

El cdigo Java termina aqu


Del cdigo anterior, se puede ver que las variables a y b, declaradas en el primer
bloque (el bloque externo), tambin son visibles en el segundo bloque (el bloque
Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 52

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

interno). Sin embargo, lo contrario no es cierto, las variables declaradas dentro del
segundo bloque no son visibles dentro del primer bloque. El alcance de una variable
est limitado al bloque en la cual es declarada. La palabra clave static se usa para
especificar que estas variables son variables de clase.
Fin del Ejemplo 2.2
Se discute a continuacin acerca de varios operadores usados en Java.

8. Operadores en Java
Cuando se escribe un programa, se usan numerosas expresiones para calcular algunos
valores especficos. Estas expresiones hacen uso de varios operadores y son similares
a expresiones aritmticas que usan muchos operadores. Las variables usadas en estas
expresiones se llaman operandos. Existen algunos operadores que solo necesitan un
operando, son llamados operadores unarios (ejemplo: ++). Los operadores que
requieren dos operandos se llaman operadores binarios (por ejemplo, +), y los
operadores que requieren tres operandos se llaman operadores ternarios (ejemplo:,? :).
Java soporta los siguientes tipos de operadores:

Operadores Aritmticos.

Operadores Relacionales.

Operadores Condicionales.

Operadores Ternarios.

Operadores de Bits.

Operadores de Asignacin.

8.1 Operadores Aritmticos


Los operadores aritmticos se usan para indicar operaciones aritmticas como adicin,
substraccin, multiplicacin, divisin y mdulo. Los operadores aritmticos se muestran
en la Figura 2.6.

Figura 2.6: Operadores Aritmticos


Libro 1: Core Java

Volumen 1: Fundamentos de Java 53


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

+: El operador + se usa para indicar la operacin de adicin. Permite adicionar


valores almacenados en dos o ms variables. La siguiente expresin ilustra el
uso del operador +:
a + b

-: El operador se usa para indicar la operacin de substraccin. Permite


substraer un valor almacenado en una variable de un valor almacenado en otra
variable. La siguiente expresin ilustra el uso del operador :
a - b

*: El operador * se usa para indicar la operacin de multiplicacin. Permite


multiplicar valores almacenados en dos variables. La siguiente expresin ilustra
el uso del operador *:
a * b

/: El operador / se usa para indicar la operacin de divisin. Permite dividir un


valor almacenado en una variable entre un valor almacenado en otra variable. La
siguiente expresin ilustra el uso del operador /:
a / b

%: El operador % se usa para indicar la operacin de mdulo. Permite encontrar


el residuo resultante de dividir un valor almacenado en una variable entre el
valor almacenado en otra variable. La siguiente expresin ilustra el uso del
operador %:
a % b

Entre estos operadores aritmticos, el operador + est sobrecargado. Este operador se


usa para concatenar dos cadenas de caracteres. El siguiente fragmento de cdigo
ilustra esto:
String str1 = "Pedro Perez apoyado sobre una pared. ";
String str2 = "Pedro Perez tuvo una gran caida";
String str3 = str1 + str2;
String str4 = "Pedro Perez apoyado sobre una pared. " +
"Pedro Perez tuvo una gran caida";
En el cdigo anterior, ambos str3 y str4 tendrn ambos el string "Pedro Perez
apoyado sobre una pared. Pedro Perez tuvo una gran caida".
Se puede concatenar un entero con un string, como se muestra en el siguiente cdigo:
String str1 = "Numero de dias de la semana es: ";
int dias = 7;
String str2 = str1 + dias;
Aqu str2 tendr el string "Numero de dias de la semana es: 7".

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 54

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

8.2 Operadores Relacionales


Los operadores relacionales se usan para comparar dos valores almacenados en
variables. Los diferentes operadores relacionales se listan a continuacin:

<: El operador menor que < se usa para determinar si el valor almacenado en
una variable es menor que el valor almacenado en otra variable. Cuando esta
condicin se satisface, el resultado de esta operacin es true, caso contrario el
resultado es false. La siguiente expresin ilustra el uso de este operador:
a < b

>: El operador mayor que > se usa para determinar si el valor almacenado en
una variable es mayor que el valor almacenado en otra variable. Cuando esta
condicin se satisface, el resultado de esta operacin es true, caso contrario el
resultado es false. La siguiente expresin ilustra el uso de este operador:
a > b

<=: El operador menor o igual que <= se usa para determinar si el valor
almacenado en una variable es menor o igual que el valor almacenado en otra
variable. Cuando esta condicin se satisface, el resultado de esta operacin es
true, caso contrario el resultado es false. La siguiente expresin ilustra el uso
de este operador:
a <= b

>=: El operador mayor o igual que >= se usa para determinar si el valor
almacenado en una variable es mayor o igual que el valor almacenado en otra
variable. Cuando esta condicin se satisface, el resultado de esta operacin es
true, caso contrario el resultado es false. La siguiente expresin ilustra el uso
de este operador:
a >= b

==: El operador de igualdad == se usa para determinar si el valor almacenado en


una variable es igual al valor almacenado en otra variable. Cuando esta
condicin se satisface, el resultado de esta operacin es true, caso contrario el
resultado es false. La siguiente expresin ilustra el uso de este operador:
a == b

!=: El operador de no igual != se usa para determinar si el valor almacenado en


una variable es diferente al valor almacenado en otra variable. Cuando esta
condicin se satisface, el resultado de esta operacin es true, caso contrario el
resultado es false. La siguiente expresin ilustra el uso de este operador:
a != b

Tmese como ejemplo, dos nmeros, 35 y 65, y determine que sucede cuando se usan
los diferentes operadores relacionales en ellos.

35 < 65

resulta en true

35 > 65

resulta en false

35 <= 65 resulta en true

Libro 1: Core Java

Volumen 1: Fundamentos de Java 55


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

35 >= 65 resulta en false

35 == 65 resulta en false

35 != 65 resulta en true

A veces durante la ejecucin, puede ser necesario encontrar la clase a la que un objeto
pertenece. El operador instanceof devuelve true o false basado en si el operando
izquierdo es una instancia del operando derecho.
Considere este ejemplo, asumiendo que mc es un objeto definido y MiClase es una
clase Java, el operador instanceof se usa como sigue para saber si mc es una
instancia de la clase MiClase.
mc instanceof MiClase
La sentencia anterior retorna true si es una instancia, false en caso contrario.

8.3 Operadores Condicionales


Generalmente los operadores condicionales se usan en combinacin con los
operadores relacionales para determinar si una condicin es true o false. Los tres
operadores condicionales se listan a continuacin:

&&: El operador && (AND) se usa para determinar si las condiciones a ambos
lados del operador resultan en true o false. Primero se evala el resultado de la
condicin a la izquierda del operando, si resulta en true, entonces el resultado de
la condicin a la derecha del operador es evaluado. Si ambas condiciones
resultan en true, entonces esta operacin tambin resulta en true. Si la condicin
a la izquierda del operador resulta en false, la condicin a la derecha del
operador no es evaluada, y la operacin completa resulta en false. La siguiente
expresin ilustra el uso de este operador:
(a < b) && (b < c)

||: El operador || (OR) se usa para determinar si al menos uno de las dos
condiciones en alguno de los lados de este operador es true. Si la condicin a la
izquierda de este operador resulta en false, entonces la condicin a la derecha
es evaluada, si esta ltima condicin resulta en true, entonces el resultado de la
operacin es true. Si la condicin a la izquierda de este operador es true,
entonces la condicin a la derecha no es evaluada, y el resultado de la
operacin es true. La siguiente expresin ilustra el uso de este operador:
(a < b) || (b < c)

!: El operador ! (NOT) se usar para negar el resultado obtenido en una


operacin. Si el resultado de una operacin es true, entonces el resultado de
esta operacin despus de aplicar el operador ! es false, y al contrario, el caso
que la operacin es false, la operacin completa es true. La siguiente expresin
ilustra el uso del operador NOT:
!(a < b)

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 56

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Estos operadores requieren dos operandos, por esto se denominan operadores


binarios.

8.4 Operador Ternario


Como se mencion anteriormente, en un operador ternario aparecen tres operandos.
Java tiene un solo operador ternario llamado operador ? : . La sintaxis general de este
operador es la siguiente:
variable = expresion ? operando1 : operando2
Aqu, expresion es evaluada. Si expresion retorna true, entonces operando1 se
le asigna a variable. Si expresion retorna false, entonces operando2 se le
asigna a variable.
Se presenta un ejemplo de cdigo para entender mejor este operador. Se tienen dos
variables var1 y var2, se quiere calcular cul de las dos es ms grande, y asignarla a
mayor.
mayor = (var1 > var2) ? var1 : var2
Se entender el uso del operador ternario al tomar diferentes valores para var1 y var2.
var1 = 5 y var2 = 3.
La expresin var1 > var2 evala a true ya que 5 es mayor que 3.
Por lo tanto, el valor de var1, i.e. 5, se le asigna a mayor.
var1 = 6 y var2 = 12.
La expresin var1 > var2 evala a false ya que 12 es mayor que 6.
Por lo tanto, el valor de var2, es decir, 12, se le asigna a mayor.

8.5 Operadores de Bits


Los operadores de bits se usan para realizar operaciones de bits (operaciones sobre
diferentes conjuntos de bits). Los operadores de bits son los siguientes:

&: El operador & (AND) se usa para comparar los patrones de bits de los
operandos a la izquierda y a la derecha bit-por-bit. La operacin resulta en un
conjunto de bits donde las posiciones de los bits que tienen 1 indica que las
posiciones correspondientes en los operandos izquierdo y derecho tambin
tienen el valor de 1.

La tabla de la verdad de un operador da el resultado de aplicar ese operador a las


diferentes combinaciones de entradas. La Tabla 2.2 muestra la tabla de la verdad
para el operador de bits &.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 57


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Patrn de Bits 1

Patrn de Bits 2

Resultado

Tabla 2.2: Tabla de la Verdad del Operador de Bits AND (&)

Sea a = 3 cuyo patrn de bits es 00000011, sea b = 10 cuyo patrn de bits es


00001010. Cuando se efecta la operacin de bits &, c = a & b, el resultado
almacenado en c es 2 cuyo patrn de bits es 00000010. El resultado se obtiene al
realizar la operacin & en cada bit de a con el correspondiente bit de b, como se
muestra en la Figura 2.7.

Figura 2.7: Operador de bits &

|: El operador | (OR) se usa para comparar bit-por-bit los conjuntos de bits a


ambos lados del operador, y resulta en un conjunto de bits que indica si uno de
los patrones de bits tiene 1 en esa posicin.

La Tabla 2.3 muestra la tabla de verdad para el operador de bits OR


Patrn de Bits 1

Patrn de Bits 2

Resultado

Tabla 2.3: Tabla de la Verdad del Operador de Bits OR (|)

Sea a = 3 su patrn de bits es 00000011, sea b = 10 su patrn de bits es 00001010.


Cuando se efecta la operacin de bits |, c = a | b, el resultado almacenado en c es
11 cuyo patrn de bits es 00001011. El resultado se obtiene al realizar la operacin
Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 58

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

OR en cada bit de a con el correspondiente bit de b, como se muestra en la Figura


2.8.

Figura 2.8: Operador de bits |

^: El operador ^ (XOR) se usa para evaluar los conjuntos de bits a ambos lados
del operador, y resulta en un conjunto de bits que indica en que posiciones solo
uno de los patrones de bits tiene un 1.
La Tabla 2.4 muestra la tabla de la verdad para el operador de bits ^.
Patrn de Bits 1

Patrn de Bits 2

Resultado

Tabla 2.4: Tabla de la Verdad del Operador de Bits XOR (^)

Sea a = 3 su patrn de bits es 00000011, sea b = 10 su patrn de bits es 00001010.


Cuando se efecta la operacin de bits ^, c = a ^ b, el resultado almacenado en c es 9
cuyo patrn de bits es 00001001. El resultado se obtiene al realizar la operacin ^ en
cada bit de a con el correspondiente bit de b, como se muestra en la Figura 2.9:

Figura 2.9: Operador de bits ^

Operadores de desplazamiento de bits:


Los tres tipos de operadores de desplazamiento se basan en el mismo concepto que
consiste en desplazar los bits del operando de la izquierda (A) tantas veces como lo
indica el operando de la derecha (B).

Libro 1: Core Java

Volumen 1: Fundamentos de Java 59


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Operador
Sintaxis
Operacin

Gua del Estudiante

<<

>>

>>>

A<<B

A>>B

A>>>B

Desplaza los bits de Desplaza los bits de A


A hacia la izquierda B hacia la derecha B
veces
veces

Desplaza los bits de A


hacia la derecha B
veces, sin signo

Tabla 2.5: Tabla de Operadores de Desplazamiento de bits

Para realizar cualquier tipo de desplazamiento, hay que recordar que el tipo de dato int
es de 32 bits, y el tipo long, 64 bits y tanto short como byte son promovidos a int para
ser representados en 32 bits para estas operaciones.
Si l operando (A) es un nmero negativo entonces la representacin de A se hace a
travs de complemento a dos.

<<: El operador de desplazamiento hacia la izquierda << desplaza a la izquierda


un conjunto de bits una determinada cantidad de veces, en cada desplazamiento
el bit de mayor orden se pierde y se coloca un cero a la derecha del nmero.
>>: El operador de desplazamiento hacia la derecha >> desplaza a la derecha
un conjunto de bits una determinada cantidad de veces, en cada desplazamiento
se rellena el bit ms significativo con su contenido previo y el bit menos
significativo se pierde.
>>>: El operador de desplazamiento hacia la derecha >>> desplaza a la derecha
un conjunto de bits una determinada cantidad de veces, en cada desplazamiento
el bit de menor orden se pierde y se coloca un 0 a la derecha del nmero, este
desplazamiento se denomina Desplazamiento sin Signo.

Si al desplazar bits de un valor numrico, la cantidad (n) de bits a mover supera o iguala
el mximo de bits representable por el tipo de dato (32 bits para int y 64 bits para
long), los bits a desplazar sern n mdulo (%) de 32 o de 64.
Vea los ejemplos mostrados en la Figura 2.10, que muestra el uso de los operadores de
desplazamiento de bits.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 60

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 2.10: Operadores de desplazamiento de bits

8.6 Operadores de Asignacin


Los operadores de asignacin se usan para asignar valores a las variables. El lado
izquierdo de la asignacin es la variable a la cual se le quiere asignar un valor. En el
lado derecho se puede tener un valor o una expresin que resultar en el valor
requerido. Los diferentes operadores de asignacin se muestran en la Tabla 2.6:

Operador

Uso

Equivalente

var1 = var2

var1 = var2

+=

var1 += var2

var1 = var1 + var2

-=

var1 -= var2

var1 = var1 - var2

*=

var1 *= var2

var1 = var1 * var2

/=

var1 /= var2

var1 = var1 / var2

%=

var1 %= var2

var1 = var1 % var2

&=

var1 &= var2

var1 = var1 & var2

|=

var1 |= var2

var1 = var1 | var2

^=

var1 ^= var2

var1 = var1 ^ var2

<<=

var1 <<= var2

var1 = var1 << var2

>>=

var1 >>= var2

var1 = var1 >> var2

>>>=

var1 >>>= var2

var1 = var1 >>> var2

Tabla 2.6: Tabla de Operadores de asignacin

A continuacin se discute el orden de precedencia entre estos operadores.

8.7 Precedencia Entre Operadores


Una expresin puede estar compuesta de muchos operadores y operandos. A mayor
nmero de operadores y operandos en una expresin mayor su complejidad. Por lo
tanto se necesita evaluar la expresin para encontrar su valor. Existe una convencin

Libro 1: Core Java

Volumen 1: Fundamentos de Java 61


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

que se sigue que especifica la precedencia de cada operador sobre los otros. Esto se
llama precedencia de operadores.
La lista siguiente muestra la precedencia de operadores. El operador con ms alta
precedencia encabeza la lista. Conforme se baja en la lista, la precedencia decrece. Los
operadores con igual precedencia se muestran en la misma lnea. Cuando se tienen
operadores con igual precedencia en una expresin, el primer operador, de izquierda a
derecha en la expresin, tiene mayor precedencia.
La Figura 2.11 ilustra la precedencia de los diferentes operadores en Java.

Figura 2.11: Precedencia de Operadores en Java

Las conversiones de un tipo de datos en otro es un punto importante en la


programacin en Java. Se aprender a continuacin cmo se permiten las conversiones
en Java.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 62

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

9. Conversin de Tipos
Puede haber situaciones donde el resultado de una expresin ser de un tipo en
particular, pero tiene que ser asignado a una variable de un tipo diferente. Por ejemplo,
se puede querer asignar el valor de una variable de punto flotante a una variable entera.
Algunas veces, se quiere realizar una operacin entre dos valores de diferentes tipos,
Se puede querer convertir un valor de un tipo en otro tipo. Esto se llama conversin de
tipos, y se puede hacer de dos formas:

Conversin Automtica.

Conversin Explcita.

9.1 Conversin Automtica


Cuando se intenta asignar un valor de un tipo de dato ms pequeo a un tipo de dato
ms grande, el compilador Java automticamente convierte el valor del tipo de dato ms
pequeo al valor correspondiente en el tipo de dato ms grande, y le asigna el valor a la
variable del tipo de dato ms grande. Considere una variable b, del tipo byte, que tiene
el valor de 1. Cuando se intenta asignar esta variable b a una variable a del tipo int,
no hay que preocuparse por errores de incompatibilidad de tipos. El compilador Java
automticamente convierte el valor byte de b a un valor int y se lo asigna a a. Esta
conversin de tipos tambin es conocida como coercin automtica.
El ejemplo ser como sigue:
int a;
byte b = 1;
a = b; //Valor de b convertido a int automticamente

9.2 Conversin Explcita


Para asignar un valor de un tipo de dato de un tamao ms grande a un tipo de dato
ms pequeo, el programador tiene que explcitamente especificar que el valor debe ser
convertido al valor correspondiente en el tipo de dato ms pequeo, y asignarlo a la
variable del tipo de dato ms pequeo. Esto se llama casting de tipos.
Observe la Figura 2.12, que muestra los tipos de datos donde la coercin automtica de
tipos toma lugar, adems de cuando se requiere la conversin explcita.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 63


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Figura 2.12: Conversin Automtica y Casting Explcito

Considere una variable b, del tipo int, que tiene el valor de 1. Cuando se intenta
asignar esta variable b a una variable a del tipo byte, no hay que preocuparse por
errores de incompatibilidad de tipos, al realizar la conversin explcita, el compilador
Java convierte el valor int de b a un valor byte, y se lo asigna a a. La expresin ser
la siguiente:
byte a;
int b = 1;
a = (byte) b;//Valor de b convertido a int explcitamente
La Figura 2.13 muestra varios ejemplos de combinaciones de tipos de datos, en algunos
se aplica la coercin automtica, en otros se requiere la conversin de tipos explcita.

Figura 2.13: Conversin Automtica y Conversin Explcita


Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 64

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Java 5.0 ha incorporado un nuevo tipo de conversin automtica entre las clases
envolventes y los tipos de datos primitivos. Este tipo de conversin se realizaba
manualmente por mtodos proporcionados en las clases envolventes (clases
Wrappers). Bajo este esquema se introducen los siguientes terminos:
Auto-boxing: Se refiere a las conversin automtica de un tipo de dato primitivo a su
correspondiente clase envolvente.
Auto-unboxing: Se refiere a las conversin automtica de una clase envolvente a su
correspondiente tipo de dato primitivo.El proceso manual se tornaba mecnico y
tedioso, por ello fueron integrados los mecanismos de auto-boxing y auto-unboxing para
permitir la conversin de valores primitivos hacia sus respectivos objetos envolventes de
manera directa y sin mayores complicaciones.
El Ejemplo 2.3 ilustra el uso auto-boxing y auto-unboxing en Java 5.0.
Ejemplo 2.3
El cdigo Java comienza aqu...
1. /*Definicion de la clase comienza aqui*/
2. public class ConversionEnvolventePrimitivoEjemplo {
3.
/*El metodo main comienza aqui */
4.
public static void main(String[] args) {
5.
6.

// Contador de vueltas como objeto con


// asignacion de un primitivo

7.
8.
9.

Integer vuelta = 0;
// Parametros
double kilometros = 2.5;

10.
11.
12.

int tiempo = 2;
while (true) {

13.
14.
15.

// Utilizando auto-incremento sobre objeto Integer


System.out.print("Vuelta: " + vuelta++);
// Operacion entre objeto Integer y primitivo double

16.
17.
18.

System.out.print(" Distancia: " + vuelta * kilometros);


// Operacion entre objeto Integer y primitivo int
System.out.println(" Tiempo: " + vuelta * tiempo);

19.
20.
21.

// Comparacion sobre objeto Integer


if (vuelta > 5)
break;

22.

} // Fin del ciclo While

Libro 1: Core Java

Volumen 1: Fundamentos de Java 65


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

23.
}/* El metodo main termina aqui */
24. }/*Definicion de la clase termina aqui*/
El cdigo Java termina aqu
Salida:
Vuelta: 0 Distancia: 2.5 Tiempo: 2
Vuelta: 1 Distancia: 5.0 Tiempo: 4
Vuelta: 2 Distancia: 7.5 Tiempo: 6
Vuelta: 3 Distancia: 10.0 Tiempo: 8
Vuelta: 4 Distancia: 12.5 Tiempo: 10
Vuelta: 5 Distancia: 15.0 Tiempo: 12
Del cdigo anterior se puede observar que no fue necesario hacer ningn tipo de
conversin explicita entre un primitivo y un objeto envolvente en varias ocasiones.
Lo primero fue la asignacin de un entero de tipo int al objeto Integer, sin la
necesidad de usar el operador new. Luego, dentro del bloque while se realizan
operaciones matemticas e incremento en reiteradas ocasiones, para finalizar con la
comparacin sobre el objeto Integer con un primitivo de tipo int.
Fin del Ejemplo 2.3
Se han estudiado los tipos de datos primitivos en Java. A continuacin se aprender
acerca de los arreglos que son uno de los tipos referencias en Java.

10. Arreglos
Los arreglos se usan para almacenar varios valores de un mismo tipo de datos. Asuma
que se necesita almacenar los nombres de 100 empleados de una compaa. Si no se
usan arreglos, se tendran que usar 100 variables diferentes para almacenar los
nombres de los empleados. Los arreglos son tiles en estas situaciones, debido a que
no se tiene que declarar, inicializar y recordar 100 nombres de variables.
El ndice en un arreglo se usa para identificar cada elemento del arreglo. En el ejemplo
anterior, el ndice del primer elemento ser 0, el ndice del segundo, ser 1, y as
sucesivamente. El ndice del 100th elemento ser 99. Por lo tanto, se puede acceder al
nombre de un empleado especfico fcilmente usando el ndice correspondiente al
empleado. Vea la Figura 2.14, que representa los ndices en arreglos en Java.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 66

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 2.14: ndices de Arreglos en Java

En los arreglos tambin se pueden realizar funciones como ordenamiento, bsqueda,


mezcla, etc.
Los arreglos slo pueden almacenar un tipo de valor, donde tipo es cualquier tipo de
datos presente en Java. Considere el caso de un arreglo de enteros, cada entero toma
4 bytes en la memoria. Por lo que, elementos adyacentes en el arreglo, estn
separados por 4 bytes. Similarmente, si se tiene un arreglo de caracteres, los elementos
adyacentes estn separados por 2 bytes, ya que el carcter ocupa 2 bytes cuando se
almacena en la memoria.
La Tabla 2.7 muestra un arreglo de enteros usada para almacenar el pago bsico de
cinco empleados.
4000

5000

12000

6000

7500

Tabla 2.7: Arreglo de Pago Bsico a Empleados (Una Dimensin)

La Tabla 2.8 muestra un arreglo de enteros usado para almacenar la Renta Permitida
para cada empleado. La Renta Permitida se calcula como el 20% del pago bsico del
empleado.
800

1000

2400

1200

1500

Tabla 2.8: Arreglo de Renta Permitida por Empleado (Una Dimensin)

10.1 Crear Arreglos en Java


En Java, se tiene ms de una forma de crear un arreglo. Los arreglos son objetos
propios de Java, a diferencia en C o C++. Por lo que ellos deben crearse usando la
palabra clave new.
int x[] =

new int[5];

Libro 1: Core Java

Volumen 1: Fundamentos de Java 67


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Los arreglos necesitan ser inicializados antes de ser usados.


Nota: Los arreglos en Java mantienen sus tamaos individuales, a diferencia de en C o
C++. Los arreglos tienen un miembro llamado length, que retorna el tamao del
arreglo. El siguiente comando retornar la longitud del arreglo x, que ya ha sido creado.
int size = x.length;
Hay tambin otras formas de crear arreglos en Java.
Considere lo siguiente:
int x[] =
int []x =

{5,2,0};
{5,2,0};

Las instrucciones anteriores inicializan un arreglo con tres valores enteros. El tamao
est implcito en este caso.
Se puede tambin simultneamente crear y asignar valores en los arreglos. Esto se
hace de la siguiente manera:
String [] s = new String[] {"uno", "dos"};
Considere la Figura 2.15, que resume las diferentes formas de crear arreglos en Java.
int x[] = {5, 2, 0};
float arregloFloat[] = new float[10];
String[] s1 = {"uno", "dos"};
String[] s2 = new String[]{"uno", "dos"};
Figura 2.15: Crear de Arreglos en Java

El programa a continuacin declara dos arreglos unidimensionales. Un arreglo se usa


para almacenar el pago bsico de cinco empleados (inicializados con su salario base).
La Renta Permitida de cada empleado se almacena en el segundo arreglo en el ndice
correspondiente donde se almacena el salario base. El Ejemplo 2.4 ilustra como
acceder a cada elemento del arreglo.
Ejemplo 2.4
El cdigo Java comienza aqu
1. /*Definicion de la clase comienza aqui*/
2. public class ArregloUnidimensionalEjemplo {
3.
/*El metodo main comienza aqui */
4.
public static void main(String args[]) {
5.
6.

// Arreglo sueldo basico emppleado


double empSueldo[] = {4000, 5000, 12000,

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 68

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

7.
8.
9.

6000, 7500};
// Arreglo renta permitida por emppleado
double empRenta[] = new double[5];

10.
11.
12.

int i;

13.
14.
15.

empRenta[i] = .2 * empSueldo[i];
}// Fin del ciclo for

16.
17.

System.out.println("Detalle Sueldo basico y Renta");


for (i = 0; i < 5; i++) {

18.
19.
20.

for (i = 0; i < 5; i++) {

System.out.println(empSueldo[i] + "\t" + empRenta[i]);


}// Fin del ciclo for
}/* El metodo main termina aqui */

21. }/* Definicion de la clase termina aqui */


El cdigo Java termina aqu
La salida del cdigo anterior es la siguiente:
Detalle Sueldo basico y Renta
4000.0
800.0
5000.0
1000.0
12000.0
6000.0
7500.0

2400.0
1200.0
1500.0

Fin del Ejemplo 2.4


En el programa anterior se usan dos arreglos separados para almacenar el salario base
y la Renta Permitida de los empleados. Estos son arreglos unidimensionales. En lugar
de usar dos arreglos unidimensionales, puede usar un arreglo bidimensional. Este
arreglo bidimensional puede ser visualizado como una tabla con cinco filas (una por
cada empleado) y dos columnas (una para el salario base y otra para la Renta
Permitida), como se muestra en la Tabla 2.9.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 69


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

4000

800

5000

1000

12000

2400

6000

1200

7500

1500

Tabla 2.9: Arreglo de Salario Base y Renta Permitida por Empleado (Bidimensional)

El Ejemplo 2.5 muestra como trabajar con arreglos de dos dimensiones en Java.
Ejemplo 2.5
El cdigo Java comienza aqu...
1. /*Definicion de la clase comienza aqui*/
2. public class ArregloBidimensionalEjemplo {
3.
/* Metodo main comienza aqui */
4.
public static void main(String args[]) {
5.
6.
7.

// Arreglo sueldo basico y renta


// permitida por emppleado
double empArreglo[][] = {

8.
9.
10.

{ 4000, 0},
{ 5000, 0},
{12000, 0},

11.
12.
13.

{ 6000, 0},
{ 7500, 0}
};

14.
15.
16.

int i, j;
double basico = 0.0;

17.
18.
19.

for (i = 0; i < 5; i++) {


for (j = 0; j < 2; j++) {
if (j == 0)

20.
21.
22.
23.

basico = empArreglo[i][j];
else
empArreglo[i][j] = 0.2 * basico;
}// Fin lazo for

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 70

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

24.
25.
26.

}// Fin lazo for

27.
28.
29.

for (i = 0; i < 5; i++) {


for (j = 0; j < 2; j++)
System.out.print(empArreglo[i][j] + "\t");

System.out.println("Detalle Sueldo basico y Renta");

30.
31.
32.
33.

System.out.println();
}// Fin lazo for
}/* Metodo main termina aqui */
}/* Definicion de la clase termina aqui */

El cdigo Java termina aqu


La salida del cdigo anterior es como sigue:
Detalle Sueldo basico y Renta
4000.0
800.0
5000.0
1000.0
12000.0
6000.0

2400.0
1200.0

7500.0

1500.0

Fin del Ejemplo 2.5


El programa anterior ilustra la creacin y el uso de un arreglo bidimensional en Java.
Seguidamente se estudiar la forma en la cual se pueden aadir ms dimensiones a un
arreglo en Java.
Java provee estructuras de control como otros lenguajes de programacin. A
continuacin se aprender acerca de ellos.

11. Estructuras de Control


Las estructuras de control en Java le permiten al programador controlar el flujo de
ejecucin del programa. Las diferentes estructuras de control (llamadas tambin
construcciones) disponibles en Java son: if-else, for, while, do while y switchcase. Asociadas con estas construcciones estn las sentencias, break y continue.

11.1

La Construccin ifelse

La construccin if-else se usa cuando se necesita decidir cual de los caminos


disponibles va a ser tomado basados en cierta condicin. Si la condicin evaluada es
verdadera, la sentencia que sigue a la construccin if es ejecutada.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 71


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

La sintaxis de la construccin if es como sigue:


if (booleanExp)
sentencia;
La sintaxis de la construccin ifelse es como sigue:
if (booleanExp)
sentencia1;
else
sentencia2;
Java requiere que el resultado de booleanExp sea de tipo Booleano, en caso contrario
el compilador de Java genera un error. Si la condicin que es evaluada es falsa,
entonces las sentencias que siguen a la construccin else son ejecutadas. La
estructura general de la sentencia if-else se muestra a continuacin:
if(booleanExp){
sentencia1;
sentencia2;
.
.
.
sentenciaN;
}
else{
sentencia1;
sentencia2;
.
.
.
sentenciaN;
}
Nota: El punto y coma se usa como delimitador para todas las sentencias en Java. Una
sentencia que termina con un punto y coma se llama una sentencia simple; por el otro
lado, conjuntos de sentencias que estn encerradas dentro de llaves se denominan
sentencias compuestas. Las sentencias compuestas son un conjunto de sentencias
simples que tienen una funcionalidad comn, y por esto se les considera como un
bloque.
Se puede tener una construccin if-else dentro de otra. Esto se conoce como
sentencias if-else anidadas. No existe restriccin en el nivel de complejidad de esta

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 72

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

construccin. La estructura general de una sentencia if-else anidada se muestra a


continuacin:
if(booleanExp1){
.
.
.
if(condicion2){
sentencia1;
else
sentencia1;
.
.
.
}
else{
if(booleanExp2){
sentencia1;
sentencia2;
.
sentenciaN;
}
else
sentencia1;
sentenciaN;
}
Considere el segmento de cdigo mostrado en la Figura 2.16, que ejemplifica el uso de
la construccin if-else.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 73


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Figura 2.16: Uso de la Construccin if-else

11.2 El Ciclo for


El ciclo for se usa para realizar un conjunto de operaciones repetidamente hasta que
alguna condicin se satisfaga o para realizar un conjunto de operaciones infinitamente.
La sintaxis general del ciclo for se muestra a continuacin:
for (inicializacion; booleanExp; incrementoExp)
sentencia;
La sintaxis anterior muestra slo una sentencia dentro del ciclo for. El ciclo for puede
tambin tener sentencias compuestas, encerradas dentro de { }. La estructura general
de un ciclo for con ms de una sentencia se muestra a continuacin:
for(inicializacion; booleanExp; incrementoExp){
sentencia1;
sentencia2;
.
.
.
sentenciaN;
}
Se puede ver que el ciclo for tiene cuatro partes, siendo stas: inicializacin, expresin
booleana, expresin de incremento y cuerpo. El ciclo for usa un contador para llevar el
nmero de veces que el ciclo ha sido ejecutado. Este contador es inicializado a un valor
apropiado en la parte de inicializacin, y es actualizado en la parte de actualizacin,
donde el incremento toma lugar. El contador es revisado contra la condicin requerida
antes que las sentencias en el cuerpo del ciclo sean ejecutadas. Si la condicin resulta
Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 74

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

en true, las sentencias en el cuerpo del ciclo for son ejecutadas, y si resulta en
false, la sentencia siguiente al final del ciclo for se ejecuta.
Se pueden tener ciclos for anidados, en los cuales se tiene un ciclo for dentro de
otro. No hay restriccin en el nmero de ciclos for que se pueden tener dentro de un
ciclo for. La estructura general de un ciclo for anidado se da a continuacin:
for(inicializacion; booleanExp; incrementoExp){
sentencia1;
sentencia2;
for(inicializacion; booleanExp; incrementoExp){
sentencia1;
sentencia2;
.
.
.
sentenciaN;
}
.
.
.
sentenciaN;
}
Considere la Figura 2.17, que muestra el uso del ciclo for en Java. El ciclo for que se
muestra a continuacin calcula la suma de todos los elementos de un arreglo.
int a[] = {1, 2, 3, 4, 5};
int suma = 0;
for (int i = 0; i<a.length; i++){
suma = suma = a[i];
}
System.out.println("suma = " + suma);
Figura 2.17: Uso del Ciclo for

Se puede tener un ciclo infinito tambin, como sigue:


for( ; ; ){
sentencia1;

Libro 1: Core Java

Volumen 1: Fundamentos de Java 75


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

sentencia2;
.
.
sentenciaN;
}
En la discusin de la construccin for, se ha estado usando incrementoExp, para
hacer referencia a la expresin de incremento del contador del ciclo, pero esta
expresin tambin puede ser usada para decrementar este contador.
Java 5.0 ha incorporado una nueva sintaxis para el ciclo for, con el cual se pretende
simplificar su uso.
La nueva sintaxis del ciclo for se muestra a continuacin:
for ([Tipo] identificador : arreglo|coleccion){
sentencia1;
sentencia2;
.
.
sentenciaN;
}
Observe el siguiente ejemplo, que muestra el uso del ciclo for en Java 5.0 con la
nueva sintaxis. El ciclo for que se muestra a continuacin hace lo mismo que el
ejemplo de la Figura 2.17.
int a[] = {1, 2, 3, 4, 5};
int suma = 0;
for (int numero : a) {
suma = suma + numero;
//suma += numero;
}
System.out.println("suma = " + suma);

El uso de las Colecciones sern tratadas en detalle en el Volumen 8 Conceptos


Avanzados, Unidad 1 API de Colecciones.
Tambin se puede alcanzar la misma funcionalidad de ciclos usando los ciclos while en
Java.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 76

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

11.3 El Ciclo while


El ciclo while se usa para realizar un conjunto de operaciones repetidamente hasta
que alguna condicin es satisfecha, o para realizar un conjunto de operaciones
infinitamente.
La sintaxis general del ciclo while es la siguiente:
while (booleanExp)
sentencia;
Como en el ciclo for, el ciclo while puede tambin tener ms de una sentencia en el
cuerpo del ciclo. La estructura general del ciclo while, donde el cuerpo del ciclo tiene
ms de una sentencia, es la siguiente:
while(booleanExp){
sentencia1;
sentencia2;
.
.
.
sentenciaN;
}
Si la condicin booleanExp resulta en true, las sentencias en el cuerpo del ciclo son
ejecutadas, y si resulta en false, la sentencia que sigue al final del ciclo while es
ejecutada.
Un segmento de cdigo escrito usando el ciclo for puede ser convertido en un ciclo
while y viceversa.
La Figura 2.18 muestra el uso del ciclo while para encontrar la suma de todos los
elementos de un arreglo.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 77


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

int a[] = {1, 2, 3, 4, 5};


int suma = 0;
int i = 0;
while (i < a.length){
suma = suma + a[i];
i = i + 1;
// suma += a[i++];
}
System.out.println("suma = " + suma);
Figura 2.18: Uso del Ciclo while

Se pueden tener ciclos while anidados, en los que se tiene un ciclo while dentro de
otro. No hay restriccin en el nmero de ciclos while que se pueden tener dentro de un
ciclo while. La estructura general de esta forma del ciclo while se da a continuacin:
while(booleanExp){
sentencia1;
sentencia2;
while(booleanExp2){
sentencia1;
sentencia2;
.
.
.
sentenciaN;
}
.
.
.
sentenciaN;
}
Tambin se puede tener un ciclo while infinito, como sigue:
while( true ){
sentencia1;
sentencia2;
.
Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 78

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

.
sentenciaN;
}

11.4 El Ciclo do-while


El ciclo do-while se usa para realizar un conjunto de operaciones repetidamente hasta
que alguna condicin sea satisfecha, o para realizar un conjunto de operaciones
infinitamente. La siguiente instruccin muestra la sintaxis general del ciclo do-while.
do {
sentencia;
} while (booleanExp);

La estructura general de un ciclo do-while que tiene ms de una instruccin en su


cuerpo se da a continuacin:
do{
sentencia1;
sentencia2;
.
sentenciaN;
}while(booleanExp);
Note que las sentencias se ejecutan antes de preguntar por la condicin. Si la condicin
resulta en true, las sentencias en el cuerpo del ciclo do-while son ejecutadas
nuevamente, y si el resultado es false, la sentencia que esta despus del final del
ciclo do-while es ejecutada. Esto garantiza que las sentencias en el cuerpo del ciclo
do-while son ejecutadas al menos una vez, a diferencia del ciclo while y el ciclo
for, en donde si la condicin no es cumplida la primera vez nunca se ejecutan las
sentencias ubicadas dentro de estos ciclos.
Se puede comparar el ciclo do-while con el ciclo for, o un ciclo while. El cdigo
escrito usando el ciclo do-while puede ser convertido en un ciclo while o a un ciclo
for y viceversa.
Considere la Figura 2.19, muestra el uso del ciclo do-while para calcular la suma de
todos los elementos de un arreglo.

Libro 1: Core Java

Volumen 1: Fundamentos de Java 79


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

int a[] = {1, 2, 3, 4, 5};


int suma = 0;
int i = 0;
do{
suma = suma + a[i];
i = i + 1;
// suma += a[i++];
}while (i < a.length);
System.out.println("suma = " + suma);
Figura 2.19: Uso del Ciclo do-while

Se pueden tener dos o mas ciclos do-while anidados, en el cual se tienen ciclos dowhile dentro de otros. No hay restriccin en el nmero de ciclos do-while que se
pueden tener dentro de otro ciclo do-while. La estructura general de los ciclos dowhile anidados se muestra a continuacin:
do{
sentencia1;
sentencia2;
do{
sentencia1;
sentencia2;
.
.
.
sentenciaN
} while(booleanExp);
.
.
.
sentenciaN;
} while(booleanExp2);
Se puede tener un ciclo do-while infinito tambin, como sigue:
do {
sentencia1;
sentencia2;
Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 80

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

.
.
sentenciaN;
} while( true );

11.5 La Construccin switch-case


La construccin switch-case se usa para realizar una (o algunas) de varias
operaciones basadas en el resultado de una condicin.
La estructura general de la construccin switch-case se da a continuacin:
switch(valor){
case val1:
sentencia1
sentencia2
.
.
sentenciaN
break;
case val2:
sentencia1
sentencia2
.
.
sentenciaN
break;
.
.
case valN:
sentencia1
sentencia2
.
.
sentenciaN
break;
default:
sentencia1;
sentencia2;

Libro 1: Core Java

Volumen 1: Fundamentos de Java 81


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

.
sentenciaN;
}
Aqu, se usa la sentencia break despus de que todas las instrucciones dentro de un
case particular son ejecutadas. La sentencia break ocasiona que el flujo de control
salga de la construccin switch-case. Si no se usa la sentencia break, todas las
sentencias que estn despus del case que concuerde hasta el fin del bloque, sern
ejecutadas.
A continuacin se aprender acerca de las sentencias break y continue.

11.6 La Sentencia break


La sentencia break se usa para sacar el control del flujo de ejecucin del bloque ms
interno donde es ejecutado de forma que la sentencia siguiente al bloque sea ejecutada.
El siguiente cdigo muestra el uso de la sentencia break en un ciclo for para sacar el
flujo de control fuera del ciclo.
for(int i = 0; i<10; i++){
sentencia1;
.
if(booleanExp)
break;
sentenciaN;
}

11.7 La Sentencia continue


La sentencia continue se usa para regresar el flujo de ejecucin al inicio del bloque
ms interno donde es ejecutada. El siguiente cdigo muestra el uso de la sentencia
continue en un ciclo for. Lleva el flujo de control al inicio del ciclo.
for(int i = 0; i<10; i++){
sentencia1
.
if(condicion)
continue;
sentenciaN
}
Considere la Figura 2.20, que muestra las sentencias break y continue.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 82

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 2.20: Uso de las Sentencias break y continue

11.8 Las Sentencias break y continue con Etiquetas


Las etiquetas permiten identificar las sentencias. Esto se hace ubicando antes de la
sentencia un nombre seguido por dos puntos (:). La sentencia que se identifica se
refiere a cualquier sentencia simple o bloque de sentencias. Su forma general es:
etiqueta:sentencia;
Ya se ha estudiado el uso de la sentencia break. Como se recordar la sentencia
break cambia el control del flujo de ejecucin para que se dirija fuera del mbito donde
se ubicaba dicha sentencia.
Existe otra modalidad de break que hace que el flujo de control salte fuera de un ciclo
identificado con una etiqueta. La sintaxis general se muestra a continuacin:
break etiquetaUno;

//etiquetaUno identifica a un ciclo

De igual manera la sentencia continue se puede utilizar como una sentencia


etiquetada. La diferencia es que esta instruccin hace que el flujo de control se dirija a
una sentencia identificada mediante una etiqueta. La sintaxis de una sentencia
continue con etiqueta es la siguiente:
continue etiquetaDos; //etiquetaDos identifica a un ciclo
Una particularidad de la sentencia continue en comparacin con la sentencia break
es que siendo o no etiquetada slo puede estar ubicada dentro de ciclos iterativos.
El siguiente extracto de cdigo muestra como se utilizan el break y el continue con
etiquetas.
El cdigo Java comienza aqu...

Libro 1: Core Java

Volumen 1: Fundamentos de Java 83


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

1.
2.
3.

Gua del Estudiante

etiquetaUno:
for(int i=0;i<2;i++){
System.out.println("En Ciclo Uno");

4.
5.
6.

etiquetaDos:
for(int j=0;j<2;j++ ){
System.out.println("En Ciclo Dos");

7.
8.
9.

if(j==0)
continue;
if(j==1)

10.
11.

break etiquetaUno;
if(j==2)

12.
continue etiquetaUno;
13.
}
14. }
El cdigo Java termina aqu
Salida:
En Ciclo Uno
En Ciclo Dos
En Ciclo Dos
Cuando j sea igual a 0, el control de flujo permanecer en el ciclo ms interno y
continuar la ejecucin para la iteracin donde j es igual a 1.
Cuando j es igual a 1, el control de flujo sale fuera del ciclo principal y en consecuencia
fuera del ciclo ms interno, terminado as con la ejecucin del cdigo. La variable j
nunca valdr 2.
Si la lnea (10) del fragmento de cdigo anterior se sustituye por la lnea:
break etiquetaDos;
La salida al ejecutar dicha aplicacin ser:
En
En
En
En
En
En

Ciclo
Ciclo
Ciclo
Ciclo
Ciclo
Ciclo

Uno
Dos
Dos
Uno
Dos
Dos

Cuando j es igual a 1, el control de flujo sale fuera del ciclo ms interno nicamente,
permitiendo que el ciclo ms externo realice las dos iteraciones establecidas por su
condicin, es decir, para i =0 e i =1 respectivamente.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 84

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Nota: S la lnea (8) del fragmento de cdigo anterior se sustituye por la lnea:
continue etiquetaUno;
La salida al ejecutar dicha aplicacin ser:
En
En
En
En

Ciclo
Ciclo
Ciclo
Ciclo

Uno
Dos
Uno
Dos

Libro 1: Core Java

Volumen 1: Fundamentos de Java 85


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:

Discutir los tipos de datos primitivos en Java.

Describir la declaracin e inicializacin de variables en Java.

Mencionar los diferentes operadores usados en Java.

Explicar la precedencia de operadores en Java.

Definir los tipos de conversiones automtica y explcita en Java.

Explicar las diferentes estructuras de control usadas en Java.

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 86

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 2: Examen de Autoevaluacin


1) En Java, una variable boolean puede almacenar un valor de 0 o 1.
a) Verdadero
b) Falso
2) Cules de los siguientes pertenecen al tipo de datos entero?
a) array
b) double
c) char
d) byte
3) Cul de las siguientes codificaciones se usa para codificar caracteres en Java?
a) Unicode
b) ASCII
c) Bytecode
d) Codificacin Internacional
4) Qu tipo de operador es '|'?
a) Operador de Bits
b) Operador Lgico
c) Operador Condicional
d) No existe este operador
5) Cul de los siguientes grupos de operadores tienen una prioridad ms alta que
los operadores de igualdad?
a) Unarios
b) Relacionales
c) De Bits
d) De desplazamiento
6) Para cul de los siguientes tipos primitivos estn disponibles clases envolventes?
a) int
b) byte
c) float
d) char

Libro 1: Core Java

Volumen 1: Fundamentos de Java 87


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

7) Qu pasa cuando se usa for(; ;) en un programa Java?


a) Ocurre un error de compilacin
b) No se entra al ciclo
c) El ciclo se ejecuta infinitas veces
d) Ninguna de las anteriores
8) Cul de las siguientes sentencias se usa para salir de un ciclo?
a) break
b) continue
c) exit
d) Todas las anteriores
9) Cul ciclo en Java evala la expresin boolean al final del ciclo?
a) while
b) for
c) switch
d) do-while
10) Un ciclo do-while se ejecuta al menos una vez an si la condicin revisada es
false.
a) Verdadero
b) Falso

Unidad 2: Operadores, Expresiones y Control de Flujo

Libro 1: Core Java 88

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Respuestas a la Unidad 2: Examen de Autoevaluacin


1) b
2) c y d
3) a
4) a
5) a, b y d
6) a, b, c y d
7) c
8) a
9) d
10) a

Libro 1: Core Java

Volumen 1: Fundamentos de Java 89


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Unidad 3: Lab. de Operaciones,


Expresiones y Control de Flujo
Objetivos del Aprendizaje
Al final de esta unidad, usted ser capaz de:

Trabajar con operadores aritmticos.

Usar operadores de bits.

Trabajar con ciclos en Java.

Usar arreglos en Java.

Unidad 3: Lab. de Operaciones, Expresiones y Control de Flujo

Libro 1: Core Java 90

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Ejercicios de Laboratorio
1) Escriba un programa para crear una clase llamada Calculadora que usa
operadores aritmticos y tambin operadores de bits (&, | y ^). Inicialice las
variables con cualquier valor aceptable de su eleccin y demuestre el uso de
estos operadores.
Consejos tiles:

Cree una clase llamada Calculadora.

Declare dos variables enteras e inicialcelas con dos valores (por ejemplo 10 y
5).

Sume, reste, multiplique y divida estas dos variables e imprima los resultado en
la salida estndar.

Realice un AND (&), OR (|) y un XOR (^) bits en estas dos variables e imprima
los resultado en la salida estndar.

2) Escriba un programa en Java usando, un ciclo while o un do-while, para


imprimir el conjunto completo de los nmeros Armstrong de tres dgitos. Un
nmero Armstrong es aquel que satisface la siguiente condicin:
a3 + b3 + c3 = abc.
Este es un ejemplo de un nmero Armstrong : 13 + 53 + 33 = 153
Consejos tiles:

Cree una clase llamada NumerosArmstrong.

Escriba un ciclo for con el valor de la variable contadora variando desde 100
hasta 999.

Extraiga cada dgito de la variable contadora.

Eleve al cubo cada uno de los dgitos y smelos.

Verifique si la suma de los cubos es igual a la variable contadora.

Si son iguales, imprima el mensaje Este es un nmero Armstrong.

3) Se da como entrada para un programa Java una oracin larga terminada con un
carcter nuevalinea. La oracin puede contener letras, dgitos y caracteres
especiales. Se requiere que se escriba un programa de Java que cuente el
nmero de letras, dgitos, espacios en blanco, adems de otros caracteres y los
muestre de la siguiente forma:
Ejemplo :
Entrada
Salida :

: Mustrelos (:,*,; etc.) en una forma adecuada!

Letras
Dgitos
Libro 1: Core Java

: 31
: 0
Unidad 3: Lab. de Operaciones, Expresiones y Control de Flujo 91
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Espacios en blanco
: 6
Otros
: 10
Consejos tiles:

Escriba una clase llamada Contador.

Declare una variable String, str e inicialcela con la oracin por ejemplo.
Mustrelos (:,*,; etc.) en una forma adecuada!\n.

Forme un arreglo de caracteres a partir de la variable str, usando el mtodo


toCharArray() de String.

Cree un ciclo for (haciendo uso de su nueva sintaxis), que opere con el arreglo
de caracteres y asigne cada uno de los elementos en una variable Character
llamada caracter.

Use el mtodo Character.isLetter() para revisar si un carcter en el


arreglo es una letra y cuente el nmero de letras.

Use el mtodo Character.isDigit() para revisar si un carcter en el arreglo


es un dgito y cuente el nmero de dgitos.

Use el mtodo Character.isWhitespace() para revisar si un carcter en el


arreglo es un espacio en blanco y cuente el nmero de espacios en blanco.

Si el carcter en el arreglo no es ni una letra, ni un dgito, ni un espacio en


blanco, se clasifica como otros. Cuente el nmero de caracteres clasificados
como otros.

Imprima el nmero de letras, dgitos, espacios en blanco y otros caracteres en la


salida estndar.

4) Escriba un programa que encuentre el mnimo nmero de billetes tipo moneda


requeridos para formar un monto especfico (no se necesita tomar la entrada del
usuario)
asuma
que
los
billetes
moneda
de
denominaciones
500,100,50,20,10,5,2, y 1 dlar estn disponibles.
Si el monto es 1239,
El programa debe imprimir:
Monedas de 500: 2
Monedas de 100: 2
Monedas de 50: 0
Monedas de 20: 1
Monedas de 10: 1
Monedas de 5: 1
Monedas de 2: 2
Monedas de 1: 0

Unidad 3: Lab. de Operaciones, Expresiones y Control de Flujo

Libro 1: Core Java 92

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Consejo: Puede usar algunos mtodos relacionados a caracteres en la cuarta


pregunta, la cual requiere de la clase Character que est disponible en el
paquete java.lang.
Consejos tiles:

Escriba una clase llamada MinimoMonedas.

Declare una variable entera llamada numero e inicialcela con un entero vlido
(por ejemplo 54321).

5) Calcule la denominacin de 500, 100, 50, 20, 10, 5, 2 y 1 billetes de dlar que
formarn el 54321 e imprmalos en la salida estndar.

Libro 1: Core Java

Unidad 3: Lab. de Operaciones, Expresiones y Control de Flujo 93


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Volumen 2: Programacin Orientada a


Objetos

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 95


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 1: Clases y Objetos


Objetivos del Aprendizaje
Al final de esta unidad, usted ser capaz de:

Explicar los conceptos de clases y objetos.

Discutir acerca de la estructura y miembros de una clase Java.

Definir variables y mtodos en Java.

Explicar los modificadores de acceso.

Explicar la necesidad de y uso de constructores para una clase.

Explicar cmo los mtodos en una clase Java pueden ser sobrecargados.

Definir y usar clases anidadas.

Discutir cmo Java maneja los argumentos de lnea de comandos.

Explicar el ciclo de vida de un objeto.

Describir el manejo de memoria en Java.

Exponer el uso de Enumeraciones.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 97


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

1. Introduccin
En el volumen anterior, se tuvo una visin general de la programacin en Java. Se
estudiaron los operadores, expresiones y sentencias de control de flujo. En esta unidad,
se discuten clases y objetos en Java.
Todos los das, son empleados numerosos objetos en nuestras vidas, algunos de los
cuales tienen ciertas caractersticas comunes que los hacen pertenecer a una categora
particular. Por ejemplo, John Davenport y Edna Smith son estudiantes en una
universidad. Ambos tienen algunos atributos en comn como el nombre, edad, nmero
de identificacin del estudiante, nombre de la universidad, carrera estudiando, estatus
del estudiante, cursos registrados, calificaciones obtenidas, y as sucesivamente, que
son comunes a cualquier estudiante. Aunque ellos comparten este conjunto de
atributos, los valores de los atributos sern diferentes y especficos para cada persona.
Similarmente, el carro de John y el de Edna pertenecen a una categora llamada carro.
Algunos de los atributos comunes a esta categora son: nmero de placa del carro,
fecha de fabricacin, tipo de carro, etc. En un escenario orientado a objetos, John y
Edna son objetos de la clase estudiante y sus carros son objetos de la clase carro. A
continuacin se aprender ms acerca de clases y objetos.

2. Clases y Objetos
Una vez vistos algunos ejemplos del mundo real de clases y objetos, se les va a definir
formalmente.
Una clase es una entidad auto contenida que provee una plantilla (framework) para
definir atributos y comportamiento encontrados comnmente en objetos de software
pertenecientes a un tipo en particular. Los atributos se representan como variables y el
comportamiento como mtodos en una clase Java.
Cualquier instancia creada a partir de la plantilla se denomina un objeto. El proceso a
travs del cual una instancia (objeto) se crea se llama instanciacin.
Se puede modelar el ejemplo de Estudiante, dado anteriormente, en clases y objetos de
software.
Se tendr una clase Estudiante que define atributos como: gnero, nombre, nmero
de identidad, nmero de estudiante, carrera estudiante, estatus, nombre, edad, cursos
registrados, calificaciones obtenidas y otros.
La Figura 1.1 muestra el modelo de software de un estudiante en una clase
Estudiante.

Unidad 1: Clases y Objetos

Libro 1: Core Java 98

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figure 1.1: Modelo de un Estudiante del Mundo Real como Clase

En la figura anterior, se listan algunos de los atributos de la clase Estudiante. Aqu


una variable String se usa para almacenar el nombre del estudiante. El gnero del
estudiante se almacena como carcter (m para indicar masculino y f para indicar
femenino). Una variable entera se usa para almacenar la edad del estudiante.
Una vez modelada la clase, se pueden crear cualquier nmero de objetos de ella. Para
crear un objeto de la clase, se necesita un constructor. Un constructor es un mtodo (un
mtodo es similar a una funcin en C o C++), que tiene el mismo nombre de la clase.
En el ejemplo anterior, se puede usar el mtodo Estudiante() para crear un objeto
de la clase Estudiante, llamado estudiante. El atributo nombre de este objeto ser
el nombre de estudiante Edna Smith. El cdigo Java que permite hacer esto se
muestra a continuacin:
Estudiante estudiante = new Estudiante(Edna Smith);
Un constructor tambin inicializa el objeto con valores por defecto, que pueden ser
definidos dentro del constructor. Esto se ver en detalle en la seccin Constructores de
una Clase.
Un objeto creado de esta forma, para representar a la estudiante Edna Smith, se
muestra en la Figura 1.2.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 99


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Figure 1.2: Un Objeto de la Clase Estudiante

Se pueden obtener los atributos del objeto estudiante usando los mtodos getter
(mtodos que comienzan con la palabra get, como: getNombre, getEdad, etc.) y se
les puede asignar valor a los atributos mediante los mtodos setter (mtodos que
comienzan con la palabra set, como: setNombre, setEdad, etc.).
La Figure 1.3 muestra tres objetos creados de la clase Estudiante para representar
tres estudiantes: Edna Smith, J. McDonald and T. Hughes.

Figura 1.3: Objetos Creados de la Clase Estudiante

Estos objetos son diferentes entre s. Los datos en cada uno de estos objetos son
diferentes, aunque las variables en las que se almacenan tengan el mismo nombre. Los
mtodos que estn disponibles en estos objetos son los mismos. De aqu que sean
llamadas instancias de la clase.
Se ha visto que una clase tiene variables y mtodos. A continuacin se presenta la
estructura de una clase Java.

Unidad 1: Clases y Objetos

Libro 1: Core Java 100

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

3. Estructura de una Clase Java


Una clase Java consiste de una sentencia package, sentencia import, y una
definicin de clase. De stas, las sentencias package e import son opcionales. La
sentencia package es la primera sentencia de un programa Java. Se profundizar la
definicin package en la Unidad 7- Paquetes. La sentencia import va a continuacin
de la sentencia package. La sentencia import importa otras clases Java que la clase
que esta siendo definida puede querer usar. Puede haber ms de una sentencia import
en el mismo programa Java.
Las otras clases son importadas usando la siguiente sintaxis:
import NombreClase;
Las sentencias import son seguidas por la definicin de la clase. De acuerdo a la
sintaxis general de una clase, se requiere slo la palabra reservada class seguida por
el nombre de la clase, como sigue:
class NombreClase{
}
Un programa Java puede tener ms de una clase. Estas clases pueden estar
relacionadas unas con otras. En estos casos, se debe tener una clase con el mtodo
main(), para que la ejecucin del programa comience con esa clase. Un archivo Java
debe tener el mismo nombre que la clase que tenga el mtodo main(), con la
extensin .java siempre y cuando esta clase sea declarada como public.
La Figura 1.4 muestra la estructura general de la definicin de una clase Java.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 101


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Figura 1.4: Estructura de Definicin de una Clase Java

Habiendo comprendido la estructura de una clase Java, se contina con los miembros
de una clase Java.

Unidad 1: Clases y Objetos

Libro 1: Core Java 102

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

3.1 Miembros de una Clase Java


Una clase Java tiene variables miembro y mtodos miembro. Una clase Java usa
modificadores de acceso para otorgar permiso a otras clases para acceder a una
variable o mtodo en particular. Un modificador de acceso especifica el acceso a una a
variable, mtodo o clase.
Esencialmente, los objetos creados a partir de una clase almacenan sus datos en
variables. Un objeto permite que otros objetos tengan acceso a sus datos a travs de
mtodos. Un objeto puede tambin esconder datos a otros objetos a travs de varios
modificadores de acceso.
La Figura 1.5 muestra los miembros de una clase.

Figura 1.5: Miembros Principales de una Clase

Se discuten a continuacin en las secciones siguientes los miembros principales de una


clase, son estos, variables, mtodos y modificadores de acceso.

4. Variables
Las variables disponibles en una clase pueden ser de varios tipos, son estos, variables
de instancia, variables de clase, variables final, variables transient y variables
volatile. Observe cada una de ellas en detalle.

4.1 Variables de Instancia


Algunas variables tienen diferentes valores para diferentes instancias de la clase. Estas
son llamadas variables de instancia. Por ejemplo, la variable nombre en la clase
Estudiante tiene diferentes valores para objetos diferentes, como: Edna Smith, J
McDonald and T Hughes. Aqu, nombre es una variable de instancia.
La Figura 1.6 muestra una definicin de variables de instancia en una clase Java.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 103


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

public class Estudiante {


// Variables de Instancia
String nombre;
char genero;
int edad;
}
Figura 1.6: Variables de Instancia en una Clase Java

Las variables de instancia se usan para representar los atributos de datos de un objeto
particular. Las variables de instancia son creadas cuando el objeto es instanciado. En la
Figura 1.6, nombre, genero y edad son variables de instancia del objeto Estudiante.
Estas se acceden usando la instancia o el objeto creado.

4.2 Variables de Clase


En algunas ocasiones es necesario tener una variable que tenga el mismo valor para
todas las instancias de la clase. Estas variables se denominan variables de clase. Las
variables de clase a veces se les llaman variables static. Slo habr una copia de una
variable de clase en la memoria independientemente del nmero de instancias creadas
de la clase. As si el valor es cambiado en alguna instancia, se reflejar en todas las
instancias de la clase.
Se usa el modificador static para declarar que una variable es una variable de clase.
Para tener acceso a una variable de clase no se necesita crear una instancia de la
clase. Se puede acceder a una variable de clase directamente por su nombre junto con
el nombre de la clase.
Por qu se necesitan variables de clase cuando se puede obtener la misma
funcionalidad usando variables de instancia? Puede haber situaciones en las cuales una
variable necesita ser especificada como una variable de clase. Por ejemplo, considere
una universidad, que asigne un nico ID a cada estudiante. El ID de estudiante es un
nmero secuencial, que es almacenado en algn sitio, es incrementado cuando un
nuevo estudiante ingresa a la universidad. Una variable llamada maxIdAsignado
podra crearse para este caso, maxIdAsignado se mantiene como una variable de
clase y se incrementa en el constructor del objeto luego de asignar su valor al ID del
estudiante. As independientemente del nmero de objetos creados, el mximo ID de
estudiante asignado hasta ahora se mantiene como una variable de clase y se
incrementa en cada instanciacin.
Las variables static son usualmente privadas en la clase.
La Figura 1.7 muestra como una variable de clase es creada y accedida en Java.

Unidad 1: Clases y Objetos

Libro 1: Core Java 104

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

public class Estudiante {


// Variables de clase
static int maxIdAsignado;
// Variables de Instancia
int id;
// Contructor para la clase Estudiante
public Estudiante() {
this.id = maxIdAsignado++;
}
}
Figura 1.7: Variables de Clase en Java

El valor de maxIdAsignado tambin podra accederse fuera del mbito de la clase


como se muestra a continuacin:
Estudiante.maxIdAsignado++;
Note que aqu se coloca el nombre de la clase seguido por un punto y luego el nombre
de la variable de clase. Recuerde que para acceder a las variables de clase no es
necesario crear una instancia de la misma.
Java provee valores por defecto para las variables de instancia y las variables de clase.
Los valores por defecto son aquellos que son asignados cuando el programador no
inicializa explcitamente una variable. Los valores por defecto para los ocho tipos de
datos en Java, para variables de clase y de instancia son los siguientes:
boolean
char
byte

false
(carcter en blanco)
0

short
integer
long

float
double

0.0

0
0
0.0

4.3 Variables Voltil (Volatile)


El compilador Java, en tiempo de compilacin, realiza muchas optimizaciones para
mejorar el desempeo de un programa. El modificador volatile previene al
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 105


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

compilador de realizar ciertas optimizaciones sobre una variable miembro. Le dice al


compilador que el valor de la variable puede ser cambiado inesperadamente por otras
partes del programa. Esta variable miembro se denomina variable volatile. El
compilador, no realiza optimizaciones en estas variables.
Por ejemplo, en un programa multihilos, dos o ms hilos pueden compartir la misma
variable de instancia. Cada hilo puede tener su propia copia privada de una variable
compartida. La copia maestra de la variable reflejar su estado actual. El acceso a la
copia maestra debe ser autorizado en el mismo orden en el que se acceden las copias
privadas.
El modificador volatile se coloca antes de la declaracin de la variable. La sintaxis
se muestra a continuacin:
volatile int var = 100;

4.4 Variables Transitorias (Transient)


El modificador transient se usa en una declaracin de variable para especificar al
sistema de tiempo de ejecucin de Java que la variable no debe ser serializada. Una
variable que no puede ser serializada y que tiene especificado el modificador
transient, se denomina variable transient.
La serializacin es un proceso mediante el cual, los campos no transient de un objeto
son almacenados usando una clase llamada DataOutputStream. El objeto puede ser
de-serializado recuperando el dato almacendo usando la clase DataInputStream. La
serializacin y de-serializacin sern tratados en detalle en el Volumen 4, Unidad 3
Serializacin de Objetos.
Un objeto puede tener datos basura, que no son necesarios al momento de reconstruir
el objeto desde flujos a travs de la de-serializacin. Un objeto puede contener ambas
variables transient y no transient. Las variables transient se pueden usar para
almacenar datos que no sern usados durante el proceso de serializacin. As, los
procesos de serializacin y de-serializacin pueden acelerarse si variables cuyos datos
que no se desea serializar se declaran como transient.
La sintaxis para declarar variables transient en Java es la siguiente:
transient int var = 100;

4.5 Variables Final


El modificador final indica que el miembro tiene un valor constante. Un miembro con
un valor constante no puede ser modificado. Este tipo de variable se denomina una
variable final. En caso de que se trate de cambiar el valor de una variable final en el
programa, entonces se generar un error en tiempo de compilacin. El nombre de una
variable final se representa en letras maysculas por convencin. Como se muestra
aqu:

Unidad 1: Clases y Objetos

Libro 1: Core Java 106

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

final float PI = 3.14;


Las variables miembro final deben ser inicializadas con un valor en el momento de su
declaracin. Si no, el compilador arrojar un mensaje de error, diciendo que la variable
puede no haber sido inicializada.
El modificador static puede ser combinado con la variable final para declarar
constantes de libreras. Esta combinacin es particularmente til al declarar constantes
como: PI, E, etc.
La Figura 1.8 muestra el uso de los modificadores final y static para declarar
constantes de libreras.

public static final double E = 2.718281828459046;


public static final double PI = 3.141592653589793;
public static final double potencia(double a, double b){...};
public static final long redondear(double a){...};

Figura 1.8: Uso de los Modificadores static and final para Constantes de Librera

A continuacin, se va estudiar cmo declarar estas variables.

4.6 Declaracin de Variables Miembro


En la clase Estudiante (referirse a la Figura 1.6), vimos que la variable nombre fue
declarada como sigue:
public class Estudiante {
private String nombre;

}
Aqu, nombre es declarada como una variable miembro, porque la declaracin se hace
dentro del cuerpo de la clase y fuera de cualquier mtodo o constructor de la clase. El
nombre de la variable miembro es nombre, y su tipo de dato es String. El modificador
private indica que nombre como una variable slo puede ser accedida dentro de los
constructors y mtodos de la clase Estudiante.
A continuacin se examinan los mtodos en Java.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 107


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

5. Mtodos
Los mtodos en Java se usan para tener acceso y manipular las variables. Usualmente,
los mtodos se usan para asignar, recuperar, o cambiar los valores almacenados en
una variable. La definicin de mtodos establece el tipo y nombre de los parmetros de
entrada. Los parmetros pasan a ser variables locales del mtodo, tambin el mtodo
puede declarar otras variables locales dentro de ella. Las variables locales pueden ser
de tipo primitivo o referencias a objeto. Ellas no pueden ser referenciadas antes de ser
declaradas y no pueden usarse sin haber sido inicializadas. Un ejemplo se presenta a
continuacin.
public void hacerCualquierCosa() {
MiClase mc;
mc.getNombre();

// Error

mc = new MiClase();
mc.getNombre();

// OK

}
Antes de inicializar mc, no se puede usar mc. El compilador genera un error.
En Java 5.0 se permite establecer un nmero variable de parmetros en los mtodos, al
igual que C. Para lograr esto, se hace uso de la expresin .... Seguidamente, se
presenta un ejemplo de ello:

public void hacerCualquierCosa(int args) {


for (int arg : args)
System.out.println(arg);
}
Observe que el identificador args se convierte en un arreglo que contiene los valores
que fueron enviados cuando fue invocado el mtodo hacerCualquierCosa().
Tambin se puede combinar el uso de parmetros variables con parmetros no
variables, con la restriccin de que la declaracin del parmetro variable solo se puede
hacer al final de la lista de argumentos del mtodo. Se presenta un ejemplo de lo dicho
anteriormente:
public void hacerCualquierCosa(String a, int args) {
System.out.println("a: " + a);
for (int arg : args)
System.out.println(arg);
}

Unidad 1: Clases y Objetos

Libro 1: Core Java 108

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

En Java, los mtodos son de diferentes tipos, son estos, mtodos de instancia y
mtodos de clase. Se vern estos dos tipos en detalle a continuacin.

5.1 Mtodos de Instancia


Ciertos mtodos definidos en una clase operan en variables de instancia de la instancia
actual de una clase. Ellos tambin pueden tener acceso a las variables de clase de esa
clase. Estos mtodos se denominan mtodos de instancia. Las siguientes variables y
mtodos pueden ser accedidos por un mtodo de instancia:

Variables de instancia.

Variables de clase.

Otros mtodos de instancia.

Mtodos de clase.

Un mtodo de instancia, adems de realizar otras actividades para la clase, puede


obtener y asignar valores a las variables de instancia. Un mtodo getter se usa para
obtener el valor de una variable de instancia y normalmente comienza con la palabra
get. La Figura 1.9 muestra como el mtodo getter se usa para recuperar el valor
almacenado en la variable nombre.

public String getNombre(){


return nombre;
}

Figura 1.9: Mtodo Getter para Recuperar el Valor de una Variable de Instancia

Un mtodo setter se usa para asignar valor a variables privadas. Los mtodos setter se
inician con la palabra set. La Figura 1.10 muestra como el mtodo setter se usa para
asignar valor a la variable nombre.

public void setNombre(String nuevoNombre){


nombre = nuevoNombre;
}

Figura 1.10: Mtodo Setter Que Asigna un Valor a una Variable de Instancia

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 109


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

5.2 Mtodos de Clase


Otros mtodos definidos en la clase operan solo en variables de clase. Se pueden
invocar stos mtodos directamente usando el nombre de la clase sin necesidad de
crear una instancia. Estos mtodos se conocen como mtodos de clase o mtodos
estticos. Por ejemplo, un mtodo de clase miMetodoDeClase() de MiClase puede
ser invocado como:
MiClase.miMetodoDeClase()
El modificador static se usa en la declaracin del mtodo de clase. Para acceder a un
mtodo de clase, no se necesita crear una instancia de la clase. Se puede acceder al
mtodo de clase directamente. Un mtodo de clase no puede acceder a variables de
instancia o mtodos de instancia. Acceder a variables o mtodos no estticos desde un
mtodo esttico genera un error en tiempo de compilacin, aunque un mtodo de clase
puede ser accedido a travs de una instancia.
La librera Math y las clases envolventes (wrapper) tienen varios mtodos estticos. La
Figura 1.11 muestra el uso del mtodo esttico parseInt definido en la clase
Integer.

int radio = Integer.parseInt("6");


//parseInt() es un metodo de la clase Integer
double circunferencia = 2 * radio * Math.PI;
//PI es una constante (variable de la clase puplica Math)
Figura 1.11: Uso del Mtodo Esttico parseInt()Definido en la Clase Integer

La clase Math tiene muchas funciones de librera, que tambin estn definidas como
mtodos estticos. As, los mtodos definidos en la clase Math pueden usarse
directamente. La Figura 1.12 muestra el uso de mtodos estticos definidos en la clase
Math.

double valores[] = {11.5, 12.5, -12.5, -13.5};


for(int i=0; i<valores.length; i++){
double actual = valores[i];
System.out.println("Valor: "+actual);
System.out.println("Redondeo hacia arriba: "+Math.ceil(actual));
System.out.println("Redondeo hacia abajo: "+Math.floor(actual));
System.out.println("Redondeo: "+Math.round(actual)+"\n");
}
Figura 1.12: Uso de Mtodos Estticos Definidos en la Clase Math
Unidad 1: Clases y Objetos

Libro 1: Core Java 110

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Cuando un usuario inicia una aplicacin, algn cdigo debe ser ejecutado. Sin una
referencia a objetos, no habr cdigo a ser ejecutado. Java supera esto proveyendo el
mtodo main, que es un mtodo esttico. Este mtodo esttico main es independiente
de un objeto. Dentro del mtodo main, otros objetos pueden ser instanciados.
A continuacin se aprender a cmo usar los mtodos de clase para acceder a la clase.

5.3 Uso de Mtodos de Clase para Acceder a la Clase


Cuando una declaracin de un mtodo tiene el modificador static, indica que el
mtodo es un mtodo de clase y no un mtodo de instancia. Un mtodo de instancia
solamente se puede usar cuando se crea un objeto. Un mtodo de clase se puede usar
independientemente del objeto. No se tiene que instanciar la clase para usar sus
mtodos estticos, pueden ser invocados directamente sin ninguna referencia a un
objeto de la clase. El mtodo main de la clase es un mtodo esttico, y debe ser usado
antes de que cualquier objeto de la clase sea creado. Los mtodos estticos solo
pueden invocar otros mtodos estticos
Si el constructor de una clase se declara como private, no se puede crear un objeto
de la clase. En este caso, se puede acceder a mtodos estticos para usar los mtodos
y variables disponibles en la clase. Sea el Ejemplo 1.1, que muestra como los mtodos
estticos se pueden usar en un programa Java.
Ejemplo 1.1
El siguiente cdigo muestra el uso de mtodos estticos.
El cdigo Java comienza aqu...
1.

/*Definicion de la clase StaticEjemplo comienza aqui*/

2. public class StaticEjemplo {


3.
static int n;
4.
5.
6.
7.

/*El metodo agregar comienza aqui */


static public void agregar(int j, int k) {
n = j + k;

8.
9.
10.

System.out.println(n);
}/* El metodo agregar termina aqui */

11.
12.

/*El metodo main comienza aqui */


public static void main(String[] args) {

13.
agregar(53, 74);
14.
}/* El metodo main termina aqui */
15. }/*Definicion de la clase StaticEjemplo termina aqui*/
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 111


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

El cdigo Java termina aqu


En la clase anterior, se puede acceder directamente al mtodo agregar() de la clase
StaticEjemplo sin crear un objeto de la clase ya que el mtodo agregar() ha sido
declarado como esttico. Dentro del mtodo agregar, se suman dos enteros pasados
como argumentos y se almacena en una variable esttica n de la clase. Finalmente se
imprime el valor de n en la salida estndar.
Fin del Ejemplo 1.1
Si el mtodo agregar() en el ejemplo anterior fuese declarado como pblico, podra
ser accedido desde otras clases como se muestra a continuacin:
StaticEjemplo.agregar();
No hay necesidad de crear un objeto StaticEjemplo para invocar al mtodo esttico.
Antes de concluir la discusin de mtodos en Java, se resume brevemente como Java
permite a los programadores trabajar con los siguientes tipos de mtodos, que son
usados para propsitos especficos:

Mtodos Abstractos.

Mtodos Final.

Mtodos Nativos.

Mtodos Sincronizados.

Aunque los mtodos abstractos son mtodos de instancia, los otros tres pueden ser
mtodos de instancia o de clase.

5.4 Mtodos Abstractos


El modificador abstract se usa para denotar que la implementacin de un mtodo no
est en la clase en la cual el mtodo es declarado. Este mtodo es llamado mtodo
abstracto. Los mtodos abstractos son declarados solo dentro de una clase abstracta
(una clase declarada con el modificador abstract) como se muestra a continuacin:
public abstract int mostrarSalida(int a);
A continuacin se discuten los mtodos final, que son los que no pueden ser
sobrescritos por una subclase.

5.5 Mtodos Final


Una clase puede heredar variables y mtodos definidos en otra clase. La clase desde la
cual las variables y mtodos son heredados se denomina superclase. La clase que
hereda se denomina subclase. Una subclase puede proveer una implementacin
diferente para un mtodo heredado de su superclase. Esto se conoce como sobre

Unidad 1: Clases y Objetos

Libro 1: Core Java 112

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

escritura de mtodo. Si no se quiere que un mtodo sea sobreescrito por sus subclases,
se puede usar el modificador final en la declaracin del mtodo, como sigue:
public final int mostrarSalida(int a);
A continuacin se discute acerca de los mtodos nativos, que permiten que se use el
cdigo escrito en otro lenguaje.

5.6 Mtodos Nativos


Cuando se quiere usar una librera de funciones escritas en otro lenguaje como C o
C++, se usa el modificador native para especificar que la implementacin de este
mtodo no fue hecha en Java.
public native int mostrarSalida(int a);
A continuacin se discuten los mtodos sincronizados, que juegan un papel
fundamental en aplicaciones multihilos.

5.7 Mtodos Sincronizados


En un ambiente multihilos, varios hilos pueden estar operando sobre los mismos datos
simultneamente. Los mtodos que se usan para operar sobre los mismos datos
simultneamente se declaran como synchronized, para asegurar que la informacin
accedida por los hilos est controlada y realizada a salvo de hilos.
public synchronized int mostrarSalida(int a);
Se ha visto el uso de los modificadores public y private en algunos de los ejemplos
anteriores, estos son modificadores de acceso. Se discuten a continuacin.

6. Modificadores de Acceso
Se pueden usar los modificadores de acceso de Java para proteger las variables y
mtodos de una clase de ser accedidos sin garanta por parte de otras clases. Los
modificadores de acceso permitidos por Java son: public, protected, package y
private. Se va a iniciar la revisin con el modificador de acceso public.

6.1 El Modificador de Acceso public


El modificador public no coloca ninguna restriccin en las variables y mtodos de una
clase. Cuando las variables y mtodos de una clase son declarados como public, los
objetos de cualquier clase pueden accederlos. La clase que esta haciendo el acceso no
necesita ser una subclase de la clase accedida o estar presente en el mismo paquete
que la clase accedida. Una clase sin ninguna relacin, que est en un paquete
diferente, puede tambin acceder a variables y mtodos public de una clase. Se debe
tener cuidado antes de declarar una variable o mtodo como public para asegurar
que no habr ningn acceso malicioso por parte de un objeto de una clase externa, que

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 113


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

pueden colocar a los objetos de la clase accedida en un estado inconsistente.


Considere el Ejemplo 1.2, que ilustra el uso de variables y mtodos public.
Ejemplo 1.2
La clase PublicEjemplo que se muestra a continuacin tiene una variable y un
mtodo public.
El cdigo Java comienza aqu...
1. package miPaquete;
2. /*Definicion de la clase PublicEjemplo comienza aqui*/
3. public class PublicEjemplo {
4.
5.
6.

public int secretoAbierto;


public void abrirMetodoSecreto() {
System.out.println("abrirMetodoSecreto");

7.
}
8. }/*Definicion de la clase PublicEjemplo termina aqui*/
El cdigo Java termina aqu
Se va a escribir una clase llamada ClaseNoRelacionada en otroPaquete, que es
totalmente diferente del paquete en el cual est la clase PublicEjemplo.

El cdigo Java comienza aqu...


1. package otroPaquete;
2.
3. import miPaquete.*;
4.
5. //Definicion de la clase ClaseNoRelacionada comienza aqui
6. class ClaseNoRelacionada {
7.
void accesoSecreto() {
8.
PublicEjemplo pe = new PublicEjemplo();
9.
10.
11.

pe.secretoAbiert = 35;
pe.abrirMetodoSecreto();
}

12. }//Definicion de la clase ClaseNoRelacionada termina aqui


El cdigo Java termina aqu

Unidad 1: Clases y Objetos

Libro 1: Core Java 114

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

La clase ClaseNoRelacionada no tiene ninguna relacin con (no es una subclase de)
la clase PublicEjemplo. A pesar de esto, se puede acceder a la variable y al mtodo
public definidos en la clase PublicEjemplo.
Fin del Ejemplo 1.2
A continuacin se discute el modificador de acceso protected, que no es tan
permisivo como el modificador de acceso public.

6.2 El Modificador de Acceso protected


Este modificador permite que variables y mtodos de una clase en particular sean
accedidas por la clase en la que estn definidas, sus subclases y las clases presentes
en el mismo paquete. Por ejemplo, se puede querer que cierta informacin sea
compartida solo por nuestra familia o amigos cercanos. No se quiere que nadie ms
sepa acerca de esto. Cuando se representa este tipo de informacin como objetos de
software creados usando Java, el modificador protected puede ser usado. Esto se
explica en el Ejemplo 1.3.
Ejemplo 1.3
Considere el siguiente ejemplo de la clase ProtectedEjemplo. Tiene una variable
protected y un mtodo protected.
El cdigo Java comienza aqu...
1.
2.

package miPaquete;

3. /*Definicion de la clase ProtectedEjemplo comienza aqui*/


4. public class ProtectedEjemplo {
5.
protected int secretoFamiliar;
6.
7.

protected void metodoSecretoFamiliar() {


System.out.println("metodoSecretoFamiliar");

8.
}
9. }/*Definicion de la clase ProtectedEjemplo termina aqui*/
El cdigo Java termina aqu
Ahora, considere la clase ProtectedHijo, que extiende de la clase
ProtectedEjemplo, pero que est presente en un paquete otroPaquete que es
diferente del paquete en el cual ProtectedEjemplo fue declarada. En este caso, la
clase ProtectedHijo implcitamente obtiene todos los mtodos definidos en
ProtectedEjemplo, pero la clase ProtectedHijo no puede acceder la variable
protected o invocar al mtodo protected de un objeto de la clase
ProtectedEjemplo. Observe:
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 115


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

El cdigo Java comienza aqu...


1.
2.

package otroPaquete;

3. import miPaquete.*;
4.
5. //Definicion de la clase ProtectedHijo comienza aqui
6. class ProtectedHijo extends ProtectedEjemplo {
7.
void accederSecreto(ProtectedEjemplo pe, ProtectedHijo ph) {
8.
pe.secretoFamiliar = 53;
// error
9.
10.
11.

ph.secretoFamiliar = 33;
pe.metodoSecretoFamiliar(); // error
ph.metodoSecretoFamiliar();

12.
}
13. }//Definicion de la clase ProtectedHijo termina aqui

El cdigo Java termina aqu


Ahora se va a considerar otra clase AmigoDeLaFamilia que est en el paquete
miPaquete y no es una subclase de ProtectedEjemplo.
El cdigo Java comienza aqu...
1.

package miPaquete;

2.
3. //Definicion de la clase AmigoDeLaFamilia comienza aqui
4. class AmigoDeLaFamilia {
5.
6.
7.
8.
9.

void accederSecreto() {
ProtectedEjemplo pe = new ProtectedEjemplo();
pe.secretoFamiliar = 53;
pe.metodoSecretoFamiliar();
}

10. }//Definicion de la clase AmigoDeLaFamilia termina aqui

El cdigo Java termina aqu


Se puede ver que AmigoDeLaFamilia puede acceder legalmente a las variables y
mtodos protected de ProtectedEjemplo.
Fin del Ejemplo 1.3
Unidad 1: Clases y Objetos

Libro 1: Core Java 116

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

6.3 El Modificador de Acceso package


El modificador de acceso package se usa cuando no se especifica ni public, ni
protected, ni private como nivel de acceso. Si no se especifica el nivel de acceso
de una variable o un mtodo o una clase usando un modificador de acceso, entonces,
por defecto, el nivel de acceso se asume como package. Esto significa que todas las
clases que estn presentes en el mismo paquete pueden acceder a las variables y
mtodos de la clase accedida. Un paquete es similar a un mdulo. Ada fue uno de los
primeros lenguajes en introducir el concepto de un paquete en los lenguajes de
programacin.
Considere el Ejemplo 1.4, que ilustra el modificador de acceso package.
Ejemplo 1.4
La clase PackageEjemplo que se muestra a continuacin tiene una variable y un
mtodo con acceso package.
El cdigo Java comienza aqu...
1. package miPaquete;
2.
3. /*Definicion de la clase PackageEjemplo comienza aqui*/
4. public class PackageEjemplo {
5.
6.

int secretoEntreAmigos;
void metodoSecretoEntreAmigos(){

7.
System.out.println("metodoSecretoEntreAmigos");
8.
}
9. }/*Definicion de la clase PackageEjemplo termina aqui*/
El cdigo Java termina aqu
La clase PackageEjemplo tiene acceso a la variable secretoEntreAmigos y al
mtodo metodoSecretoEntreAmigos(). Todas las clases presentes en el paquete
miPaquete tienen acceso a la variable secretoEntreAmigos y al mtodo
metodoSecretoEntreAmigos().
Ahora, considere la clase PackageAmigo, que est presente en miPaquete.

El cdigo Java comienza aqu...


1.
2.

package miPaquete;

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 117


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

3. /*Definicion de la clase PackageAmigo comienza aqui*/


4. class PackageAmigo{
5.
void accederSecretoPackage(){
6.
7.
8.

PackageEjemplo pe = new PackageEjemplo();


pe.secretoEntreAmigos = 25;
pe.metodoSecretoEntreAmigos();

9.
}
10. }/*Definicion de la clase PackageAmigo termina aqui*/

El cdigo Java termina aqu


La clase PackageAmigo puede acceder a secretoEntreAmigos y
metodoSecretoEntreAmigos porque PackageAmigo y PackageEjemplo estn en
el mismo paquete.
Considere el siguiente cdigo.
El cdigo Java comienza aqu...
1.
2.

package otroPaquete;

3. import myPackage.*;
4.
5. /*Definicion de la clase PackageHijo comienza aqui*/
6. class PackageHijo extends PackageEjemplo {
7.
void accederMiembrosDePackage(){
8.
9.
10.

PackageEjemplo pe = new PackageEjemplo();


pe.secretoEntreAmigos = 25;
// error
pe.metodoSecretoEntreAmigos(); // error

11.
}
12. }/*Definicion de la clase PackageHijo termina aqui*/

El cdigo Java termina aqu


El cdigo anterior muestra que si hay una subclase de PackageEjemplo en un
paquete diferente, entonces no podr acceder a secretoEntreAmigos o
metodoSecretoEntreAmigos de PackageEjemplo.
Fin del Ejemplo 1.4

Unidad 1: Clases y Objetos

Libro 1: Core Java 118

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

A continuacin se discute el modificador de acceso private, que es el ms restrictivo


de todos los modificadores de acceso.

6.4 El Modificador de Acceso private


El modificador de acceso private se usa para proteger informacin muy confidencial.
Puede haber ocasiones cuando no se quiere que mtodos o variables de una clase en
particular accedan a ciertas variables o mtodos de otra clase especfica. Usando
variables y mtodos privados en una clase se provee la mxima proteccin. Esto se
explica en el Ejemplo 1.5.
Ejemplo 1.5
Aqu la clase NivelAccesoEjemplo tiene una variable private y un mtodo
private.
El cdigo Java comienza aqu...
1.

/*Definicion de la clase NivelAccesoEjemplo comienza aqui*/

2. public class NivelAccesoEjemplo {


3.
private int secreto;
4.
private void metodoSecreto(){
5.
System.out.println("metodoSecreto");
6.
}
7. }/*Definicion de la clase NivelAccesoEjemplo termina aqui*/

El cdigo Java termina aqu


Slo el cdigo dentro de la clase NivelAccesoEjemplo puede leer o modificar la
variable secreto e invocar metodoSecreto(). El cdigo dentro de otra clase no
puede acceder o modificar la variable secreto o invocar a metodoSecreto(). Por
ejemplo, la clase Hacker, definida a continuacin, no puede acceder a secreto o a
metodoSecreto de NivelAccesoEjemplo.
El cdigo Java comienza aqu...
1. /*Definicion de la clase Hacker comienza aqui*/
2. class Hacker {
3.
4.
5.
6.
7.

public static void main(String[] args) {


NivelAccesoEjemplo nae = new NivelAccesoEjemplo();
nae.secreto = 364;
// error
nae.metodoSecreto();

// error

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 119


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

8. }/*Definicion de la clase Hacker termina aqui*/

El cdigo Java termina aqu


Cuando se intenta compilar la clase Hacker, el compilador imprimir un mensaje de
error, similar a este:
Hacker.java:4: secreto has private access in NivelAccesoEjemplo
nae.secreto = 364; // error
^
Hacker.java:5: metodoSecreto() has private access in
NivelAccesoEjemplo
nae.metodoSecreto(); // error
^
2 errors

Nota: Un objeto del tipo NivelAccesoEjemplo puede acceder a los miembros


private de otro objeto de NivelAccesoEjemplo. Esto se muestra en el siguiente
fragmento de cdigo:
El cdigo Java comienza aqu...
1.

/*Definicion de la clase PrivateEjemplo comienza aqui*/

2. class PrivateEjemplo {
3.
private int secreto;
4.
boolean verificarAccesoPrivado(PrivateEjemplo pe){
5.
6.
7.

if (this.secreto == pe.secreto)
return true;
else

8.
return false;
9.
}
10. }/*Definicion de la clase PrivateEjemplo termina aqui*/

El cdigo Java termina aqu


En este caso, la clase PrivateEjemplo tiene un mtodo de instancia que compara el
objeto actual PrivateEjemplo (this) con otro objeto PrivateEjemplo pe, basado
en sus variables secreto. Esto es posible porque objetos del mismo tipo pueden
acceder a miembros private del otro siempre y cuando estn dentro de la clase.
Fin del Ejemplo 1.5
Unidad 1: Clases y Objetos

Libro 1: Core Java 120

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Se van a discutir a continuacin los constructores en Java.

7. Constructores de una Clase


Un constructor se usa esencialmente para inicializar un nuevo objeto creado de un tipo
en particular. Se puede identificar fcilmente el constructor y diferenciarlo de otros
mtodos en la clase porque el constructor tiene el mismo nombre de la clase. Los
constructores tambin son mtodos, pero estn definidos para realizar la tarea de
inicializacin al momento de creacin de objetos.
Todas las clases en Java tienen al menos un constructor. Si el programador no define
ningn constructor para una clase, entonces la clase tendr un constructor por defecto
creado por el sistema de tiempo de ejecucin de Java. El constructor por defecto no
acepta ningn argumento. Tiene una implementacin vaca y no realiza nada.
Java permite tener tantos constructores como se requiera para una clase, la nica
diferencia ser en el nmero o el tipo de argumentos para una clase. Esto se denomina
sobrecarga del constructor, que ser discutida en detalle en la prxima seccin.
La Figura 1.13 muestra los constructores para la clase Student. Se definen tres
constructores, cada uno toma diferentes parmetros.

public Estudiante(){}
public Estudiante(int nuevoId){
id = nuevoId;
}
public Estudiante(int nuevoId, String nuevoNombre){
id = nuevoId;
nombre = nuevoNombre;
}
Figura 1.13: Constructores para la Clase Estudiante

Si el programador define un constructor para una clase, el constructor por defecto no


estar disponible para la clase. Si una clase necesita un constructor que no acepte
argumentos, el programador debe explcitamente definir un constructor sin argumentos.
En la clase Estudiante anterior, se proveen los constructores Estudiante(int),
Estudiante(int, String), por esto el constructor por defecto sin argumentos no
estar disponible, y se encontrar el constructor Estudiante() sin parmetros
explcitamente definido.
Se va a considerar otro ejemplo para entender mejor los constructores en Java. Para
una clase llamada Fibonacci, se tiene el siguiente constructor:

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 121


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

public Fibonacci() {
n = 0;
}

// constructor

Este es un ejemplo de un constructor sin argumentos. Se va a definir otro constructor


para Fibonacci:
public Fibonacci(int numeroDeTerminos) {
n = numeroDeTerminos;
}

// constructor

Ambos constructores tienen el mismo nombre, la nica diferencia es la lista de


parmetros aceptada por estos constructores. El compilador los diferencia dependiendo
del nmero y tipos de argumentos que aceptan. El primer constructor no acepta ningn
parmetro, mientras que el segundo constructor acepta un argumento de tipo int .
Usualmente el constructor usa sus argumentos para inicializar las variables (estado) del
nuevo objeto creado. Cuando se instancia una clase para crear un objeto, se debe
escoger el constructor cuyos argumentos reflejen mejor la forma en que se quiere
inicializar el nuevo objeto. Dependiendo del nmero de argumentos y el tipo de
argumentos que se pasa al constructor, el compilador busca el constructor apropiado
para usarlo. Por ejemplo, cuando se usa el siguiente cdigo, el compilador sabe que
debe elegir el constructor sin argumentos.
new Fibonacci();
De manera similar, cuando se usa la expresin new Fibonacci(53); el compilador
escoge el constructor que acepta un slo entero como su argumento.
El cdigo que se presenta a continuacin invoca el constructor de la superclase de la
clase Fibonacci.
void Fibonacci() {
super();
}
No se ha hecho a Fibonacci una subclase de otra clase. Por defecto, todas las clases
creadas en Java son subclases de la clase Object disponible en el paquete
java.lang. As, en el cdigo anterior, el constructor de la clase Object es invocado.
Usualmente el constructor de una clase toma ventaja del cdigo proporcionado en el
constructor de su superclase. Suponga que se quiere usar el constructor de la
superclase, entonces la sentencia que invoca al constructor de su superclase debe ser
la primera sentencia de su constructor, debido a que debe realizar primero un nivel
superior de inicializacin.
De la discusin en esta seccin, se puede ver que en la declaracin de una clase, es
obligatorio especificar la palabra reservada class y tambin el nombre de la clase. El
resto de los componentes de una declaracin de clase son opcionales. Si una
Unidad 1: Clases y Objetos

Libro 1: Core Java 122

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

declaracin de clase no tiene estos elementos opcionales, los valores por defecto que
usa el compilador Java son: no-public, no-final, no-abstract y sub-clase de la
clase Object. La clase java.lang.Object es la superclase de todas las clases Java
por defecto. Se estudiar en detalle super clases en la Unidad 3 - Herencia de este
volumen. El compilador Java tambin asume que una clase no implementa ninguna
interfaz. Considere el Ejemplo 1.6, un programa que imprime los primeros cinco
trminos de la serie de Fibonacci.
Ejemplo 1.6
Se va a crear una clase en este programa de ejemplo. Se usar esta clase en las
siguientes secciones.
El cdigo Java comienza aqu...
1. /*Definicion de la clase Fibonacci comienza aqui*/
2. public class Fibonacci {
3.
public int a = 0, n; /* variable */
4.
private int b = 1, c, contador = 2; /* variables */
5.
6.
7.

/* Constructor Fibonacci comienza aqui */


public Fibonacci(int numeroDeTerminos) {

8.
9.

n = numeroDeTerminos;
}/* Constructor Fibonacci termina aqui */

10.
11.
12.

/* Metodo cambiarNumeroDeTerminos comienza aqui */


void cambiarNumeroDeTerminos(int numeroDeTerminos) {

13.
14.
15.

n = numeroDeTerminos;
}/* Metodo cambiarNumeroDeTerminos termina aqui */

16.
17.
18.

/* Metodo mostrarSeries comienza aqui */


public void mostrarSeries() {
if (n <= 0) {

19.
20.
21.

System.out.println("Entrada invalida");
System.exit(0);
}

22.
23.
24.

if (n >= 1)
System.out.println(a);
if (n >= 2)

25.
26.

System.out.println(b);
while (contador < n) {

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 123


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

27.
28.
29.

c = a + b;
System.out.println(c);
a = b;

30.
31.
32.

b = c;
contador++;
}

33.
34.
35.

}/* Metodo mostrarSeries termina aqui */

36.
37.

public static void main(String args[]) {


Fibonacci fib = new Fibonacci(5);// 5 trminos

/* Metodo main comienza aqui */

38.
fib.mostrarSeries();
39.
}/* Metodo main termina aqui */
40. }/* Definicion de la clase Fibonacci termina aqui */

El cdigo Java termina aqu


Este programa de ejemplo imprime los nmeros de la serie de Fibonacci, hasta el
nmero de trminos que son requeridos (cinco, en este caso). El nmero de trminos de
la serie a ser impresos se pasa como argumento al constructor. El constructor asigna el
parmetro recibido a una variable de instancia n. cambiarNumeroDeTerminos() se
usa para cambiar el valor de n, si se desea hacerlo despus que el objeto ha sido
creado. El mtodo mostrarSeries() se usa para imprimir la serie de nmeros
Fibonacci en la salida estndar. Se puede ver que hay dos componentes principales
que nos dan la implementacin de la clase, que son, la declaracin de la clase y el
cuerpo de la clase.
La declaracin del ejemplo anterior es simple. Indica que el nombre de la clase es
Fibonacci y que es una clase public. A veces de la declaracin, se puede tambin
identificar la superclase de esa clase y si esta clase puede ser derivada.
Fin del Ejemplo 1.6
As como los constructores pueden ser sobrecargados, otros mtodos tambin pueden
ser sobrecargados en Java. Se va a discutir la sobrecarga de mtodos, mediante la cual
se pueden tener varias implementaciones para el mismo mtodo.

8. Sobrecarga de Mtodo
En la seccin anterior se vio que ms de un constructor puede ser creado para una
clase. De manera similar, Java permite tener dos o ms mtodos con el mismo nombre
dentro de la misma clase. Como con los constructores, los mtodos sobrecargados

Unidad 1: Clases y Objetos

Libro 1: Core Java 124

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

deben tambin tener un nmero diferente de parmetros o diferentes tipos de datos en


los parmetros. Esta caracterstica de Java se llama sobrecarga de mtodos. sta es
una forma de lograr polimorfismo en Java. El compilador detectar un error en tiempo
de compilacin si dos mtodos en una clase tienen el mismo nombre y el mismo
nmero y tipo de parmetros.
Los mtodos sobrecargados pueden tener diferentes tipos de datos de retorno. Pero si
la diferencia entre dos mtodos es slo en cuanto a sus tipos de retorno, el nombre,
nmero, y tipo de argumentos aceptados por el mtodo, y el orden en el cual son
aceptados, son iguales, el compilador no distinguir entre los dos mtodos.
Si dos mtodos son diferentes solo en sus tipos de retorno, esto no se considera una
sobrecarga de mtodos. Sin embargo, si existen dos mtodos que aceptan el mismo
nmero de argumentos y el mismo tipo de argumentos, pero difieren en el orden de los
tipos de datos aceptados por los dos mtodos, entonces s se considera una sobrecarga
de mtodos.
Ejemplo 1.7
El siguiente programa ilustra la sobrecarga de mtodos.
El cdigo Java comienza aqu...
1. /*Definicion de la clase comienza aqui*/
2. public class MetodoSobrecargadoEjemplo {
3.
4.
5.

void mostrarEnPantalla(int a, int b){


System.out.println(a);
System.out.println(b+"\n");

6.
7.
8.

}
void mostrarEnPantalla(int a, char b){

9.
10.
11.

System.out.println(a);
System.out.println(b+"\n");
}

12.
13.
14.

void mostrarEnPantalla(char a, int b){


System.out.println(a);

15.
16.
17.

System.out.println(b+"\n");
}

18.
19.
20.

void mostrarEnPantalla(int a, int b, char c){


System.out.println(a);
System.out.println(b);

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 125


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

21.
22.
23.

System.out.println(c+"\n");
}

24.
25.
26.

void mostrarEnPantalla(int a, char b, float c, String d){


System.out.println(a);
System.out.println(b);

27.
28.
29.

System.out.println(c);
System.out.println(d+"\n");
}

30.
31.

public static void main(String[] args) {

32.
33.
34.

MetodoSobrecargadoEjemplo msce = new


MetodoSobrecargadoEjemplo();
msce.mostrarEnPantalla(53,8965);

35.
36.
37.

msce.mostrarEnPantalla(68, 'g');
msce.mostrarEnPantalla('f', 74);
msce.mostrarEnPantalla(64, 36, 'h');

38.
msce.mostrarEnPantalla(85, 'd', (float) 745.3, "true");
39.
}
40. }/*Definicion de la clase termina aqui*/

El cdigo Java termina aqu


La salida del programa se muestra a continuacin:
53
8965
68
g
f
74
64
36
h

Unidad 1: Clases y Objetos

Libro 1: Core Java 126

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

85
d
745.3
true
En la salida del programa anterior se puede ver en la lnea 37 de la clase
MetodoSobrecargadoEjemplo que a pesar que el tercer argumento pasado al
mtodo fue el carcter h, ese carcter no se imprimi y que en su lugar se imprimi el
valor ASCII del carcter, que es 104. Esto se debe a que el compilador primero busca
por la correspondencia exacta de ambos, tanto del nmero de argumentos como del
tipo de dato de los argumentos.
En un programa, cuando ambas condiciones corresponden con una versin
sobrecargada particular del mtodo, se llama a esa versin particular del mtodo. En la
ausencia de tal correspondencia, el compilador convierte implcitamente el tipo de dato
de los argumentos a algn otro tipo de dato, siempre que esa conversin se permita en
Java.
En el ejemplo anterior, el compilador busca por una correspondencia exacta para el
conjunto de tres tipos de datos. Si se encuentra esa correspondencia, esta versin
particular del mtodo sobrecargado ser invocada. Sin embargo, no existe una
correspondencia directa cuando dos enteros y un carcter son pasados como
argumentos. As que el tercer argumento se convirti implcitamente a un int (Java
permite tal conversin, de int a char y viceversa), hubo una correspondencia con la
versin del mtodo mostrarEnPantalla, la cual toma tres enteros como argumentos.
Se invoc esa versin y por lo tanto se obtuvo la salida anterior.
Fin del Ejemplo 1.7
A continuacin se va a entender el concepto de clases anidadas.

9. Clases Anidadas
Una clase anidada es una clase cuya definicin est dentro de otra clase. Si una clase
contiene a una clase anidada, es conocida como clase exterior.
Las clases anidadas tienen acceso total a los miembros de su clase exterior, incluso a
los miembros privados. Estas clases son consideradas miembro de la clase
contenedora. Ellas pueden ser final o abstract. Ahora como miembro tambin
puede ser private, protected, adems de public o package que es una
posibilidad para cualquier clase.
La forma general de una clase exterior que contiene a una clase anidada se muestra a
continuacin:
class ClaseExterna{

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 127


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante


//miembros de ClaseExterna
public static class ClaseAnidadaEstatica {
//miembros de ClaseAnidadaEstatica
}
private class ClaseInterna {
//miembros de ClaseInterna
}

Existen dos tipos de Clases Anidadas:

Clase Anidada Esttica: esta clase se declara como miembro esttico (static)
de la clase exterior y tiene todas las caractersticas de cualquier otro miembro
esttico.

Clase Interna: Esta clase se declara como miembro no-esttico de la clase


exterior y tienen todas las caractersticas de cualquier otro miembro de instancia.
Una instancia de alguna clase interna slo puede existir si una instancia de la
clase contenedora existe. La clase interna no puede tener miembros estticos
propios.

Un ejemplo de clase anidada se muestra a continuacin:


Ejemplo 1.8
El siguiente programa ilustra una clase anidada.
El cdigo Java comienza aqu...
1. /*Definicion de la clase Carro comienza aqui*/
2. public class Carro {
3.
4.
5.

private String marca;


private int velocidadActual;
private String placa;

6.
7.
8.

private String nombre;

9.
10.
11.

class Acelerador {
private int velocidadMaxima;

12.
13.

Acelerador() {
velocidadMaxima = 180;

14.

/* Definicin de clase anidada */

Unidad 1: Clases y Objetos

Libro 1: Core Java 128

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

15.
16.
17.

Core Java

public void acelerar(int velocidad) {


if ((velocidad + velocidadActual) < velocidadMaxima){

18.
19.
20.

velocidadActual = velocidadActual + velocidad;


}

21.
22.
23.

public void imprimirVelocidad() {


System.out.println("Velocidad: " + velocidadActual);

24.
25.

}/* Fin de la clase anidada Acelerador */

26.
27.
28.

/* Constructor Carro comienza aqui */


Carro(String mar, String nom, String pla) {

29.
30.
31.

marca = mar;
nombre = nom;
placa = pla;

32.
33.
34.

velocidadActual = 0;
}/* Constructor Carro termina aqui */

35.
36.
37.

/* Metodo main comienza aqui */


public static void main(String[] args) {
Carro miCarro = new Carro("Ford", "Focus", "KAA-87X");

38.
39.
40.

Acelerador miAcelerador = miCarro.new Acelerador();


miAcelerador.acelerar(100);
miAcelerador.imprimirVelocidad();

41.
}/* Metodo main termina aqui */
42. }/* Definicion de la clase Carro termina aqui */
El cdigo Java termina aqu
Note que en la lnea 38 se necesita la instancia de la clase Carro para poder crear una
instancia de Acelerador, debido a que esta ltima es un miembro de instancia de la
clase Carro.
Fin del Ejemplo 1.8
Una clase interna tambin puede estar definida dentro de algn mtodo de una clase
externa. Esta representacin es como sigue:
public class ClaseExterna{

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 129


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante


int x;
public void metodoExterno(final int y){
final int z=12;
class ClaseInterna{
public void metodoInterno(){
x=3-y+z;
System.out.println(x);
}
}
}

Este tipo de clase interna puede acceder a todos los miembros de la clase contenedora,
inclusive puede modificarlos. Sin embargo slo tiene acceso a las variables final del
mtodo que la contiene, en el ejemplo, y y z.
Es posible declarar clases internas con o sin nombre. Las clases internas sin nombre
son conocidas como Clases Internas Annimas y sern discutidas para el manejo de
eventos en la Unidad 5 Modelo de Delegacin de Eventos y Manejo de Eventos del
Volumen 5. A continuacin se va a entender cmo tomar entradas del usuario a travs
de argumentos de la lnea de comandos.

10. Argumentos de Lnea de Comandos


Los argumentos de lnea de comandos se pueden usar para suministrar entradas a un
programa durante su ejecucin. La construccin general para los argumentos de lnea
de comandos es como sigue:
java nombreClase argumento1 argumento2 etc
Se pueden dar cualquier nmero de argumentos de lnea de comandos. Estos
argumentos de lnea de comando se guardan en un arreglo de string pasado al mtodo
main().
Ejemplo 1.9
El siguiente programa ilustra el uso de los argumentos de lnea de comandos:
El cdigo Java comienza aqu...
1.

/*Definicion de la clase comienza aqui*/

2. public class LineaDeComandosEjemplo {


3.
public static void main(String[] args) {
4.
for (int i = 0; i < args.length; i++) {
5.
6.

System.out.print("Argumento " + (i+1));


System.out.print(" es args[" + i + "]");

Unidad 1: Clases y Objetos

Libro 1: Core Java 130

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

7.
8.
9.

Core Java

System.out.println(": " + args[i]);


}
}

10. }/* Definicion de la clase termina aqui */

El cdigo Java termina aqu


El programa se ejecuta como sigue:
java Estos son argumentos pasados por linea de comandos
La salida del programa se muestra a continuacin.
Salida:
Argumento 1 es args[0]: Estos
Argumento 2 es args[1]: son
Argumento 3 es args[2]: argumentos
Argumento 4 es args[3]: pasados
Argumento 5 es args[4]: por
Argumento 6 es args[5]: linea
Argumento 7 es args[6]: de
Argumento 8 es args[7]: comandos
Fin del Ejemplo 1.9
Todos los argumentos de la lnea de comandos son interpretados como strings en Java.
El programador puede usar las funciones de conversin para convertirlos a sus valores
numricos usando los mtodos proporcionados en la clase String.
A continuacin se discuten las diferentes etapas en el ciclo de vida de un objeto.

11. Ciclo de Vida de un Objeto


Usualmente, en un programa Java, se crean objetos de varias clases. Estas clases
interactan entre s a travs de mensajes. Una vez que se completa el objetivo para el
cual fue creado el objeto, est listo para recoleccin como basura. Una vez que el
recolector de basura toma el objeto, los recursos que mantena son liberados, para
permitir que otros objetos puedan hacer uso de ellos. El objeto es entonces destruido.
La Figura 1.14 muestra el ciclo de vida de un objeto.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 131


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Figura 1.14: Ciclo de Vida de un Objeto

A continuacin se ver la creacin e instanciacin de objetos.

11.1 Crear Objetos


Como se mencion anteriormente, el proceso de crear objetos de una clase se
denomina instanciacin. El objeto de una clase se conoce como instancia. Tome de
nuevo el Ejemplo 1.6. Se puede usar el operador new para instanciar una clase, como
sigue:
Fibonacci fib = new Fibonacci();
El cdigo anterior realiza tres acciones, son estas, declaracin del objeto, instanciacin
del objeto e inicializacin del objeto. La declaracin del objeto y la instanciacin del
objeto pueden realizarse en pasos separados, como se muestra a continuacin.
Fibonacci fib;
fib = new Fibonacci();
Aqu, la primera lnea es la declaracin del objeto y la segunda, lnea la instanciacin
del objeto. La segunda lnea usa el operador de instanciacin new para crear un nuevo
objeto del tipo Fibonacci. La inicializacin del objeto se hace usando la parte de
cdigo despus del operador new, es decir, Fibonacci(). Esta parte del cdigo
invoca al constructor de la clase Fibonacci, que efecta la inicializacin.
Java permite usar clases e interfaces en forma similar para tipos de datos. Esto es
posible dado que ambos son tipos referencia. En la etapa de declaracin, se crea una
variable que puede guardar los objetos del tipo definido por la clase. En el ejemplo
anterior, la variable fib sirve para guardar objetos del tipo Fibonacci. Esta variable
no puede ser usada para referenciar otro objeto simultneamente.
El operador new que se usa para instanciar una clase, reserva la memoria requerida
pare el nuevo objeto creado. El operador new es seguido por el constructor de la clase
instanciada. Al invocar al constructor inicializa el nuevo objeto creado.

Unidad 1: Clases y Objetos

Libro 1: Core Java 132

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

11.2 Uso de Objetos


Una vez que se crea un objeto de un tipo en particular (clase), se puede usar el objeto
para obtener alguna informacin, cambiar el estado de sus variables, o realizar alguna
tarea. Se pueden manipular sus variables a travs de los mtodos definidos en su clase.
Observe de nuevo la clase Fibonacci del Ejemplo 1.6, se puede modificar el valor de
la variable n accedindola directamente, tambin se puede modificar el valor de la
variable invocando al constructor de la clase.

11.3 Variables Referencia en un Objeto


Hay dos formas de tener acceso a la variable n, que es parte de la instancia de la clase
Fibonacci. El primer mtodo es acceder a la variable directamente. La segunda forma
es a travs de un mtodo (el mtodo cambiarNumeroDeTerminos(), o el
constructor). Se examinar la segunda forma de acceder a variables en la prxima
seccin.
Instanciando la clase Fibonacci como sigue:
Fibonacci fib = new Fibonacci(15);
En este caso, a la variable n se le asigna el valor de 15 por el constructor, porque ha
sido implementado para asignar el valor de su argumento a n. Esta es una manera de
acceder a la variable, es similar a acceder a variables a travs de un mtodo.
Ahora, si se quiere cambiar el valor de la variable n del objeto fib, se puede acceder a
ella como sigue:
fib.n = 20;
Esencialmente, la referencia al objeto (fib en este caso), seguida por ., luego por el
nombre de la variable, es la sintaxis usada para acceder a la variable.
En este caso, se tiene la referencia al objeto. Otra forma de acceder a una variable sin
que la referencia al objeto sea creada, se muestra a continuacin:
int valorN = new Fibonacci(20).n;
Aqu, se crea un nuevo objeto, pero su referencia no es almacenada, porque la
referencia no ser usada posteriormente.
Las referencias a objetos apuntando al mismo tipo de objetos, no necesariamente
tienen el mismo valor en sus variables. Considere las siguientes lneas de cdigo:
Fibonacci fib1 = new Fibonacci(10);
Fibonacci fib2 = new Fibonacci(20);
Aqu, la variable n del objeto fib1 tendr un valor de 10 (el valor de fib1.n es 10) y la
variable n de fib2 tendr un valor de 20 (el valor de fib2.n es 20).
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 133


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

A continuacin se aprender a invocar mtodos en un objeto.

11.4 Invocando los Mtodos de un Objeto


En la seccin anterior se estudi cmo se puede cambiar el valor de la variable n
accedindola directamente. En esta seccin se presenta cmo lograr lo mismo
invocando el mtodo disponible en el objeto de la clase. Considere la misma clase
Fibonacci del Ejemplo 1.6.
Hay tres formas de asignarle valor a n. Una forma es cuando se instancia el objeto. Se
puede asignar un valor entero a la variable n pasndole un valor entero como un
argumento al constructor.
Una vez que el valor ha sido asignado a la variable usando el constructor, la segunda
forma de poder cambiar el valor de la variable n, es accedindola directamente; la
tercera forma es invocando a un mtodo de la clase que permita cambiar el valor de n.
El mtodo cambiarNumeroDeTerminos() es un mtodo provisto por la clase
Fibonacci para modificar el valor de n. Un valor entero es pasado como argumento
del mtodo, y se asigna como el nuevo valor para n.
Fibonacci fib = new Fibonacci(10);
fib.cambiarNumeroDeTerminos(64);
Aqu, se crea un objeto del tipo Fibonacci y se tiene la variable fib como la
referencia al objeto creado. En la siguiente sentencia, mediante la referencia al objeto
accedemos al mtodo cambiarNumeroDeTerminos() del objeto, y se pasa 64 (un
valor entero) como argumento del mtodo. Este mtodo asigna el valor 64 a la variable
n del objeto. Se accede al mtodo dentro del objeto en forma similar a la que se usa
para acceder las variables del objeto.
Primero, se obtiene la referencia al objeto. En este ejemplo, fib es la referencia al
objeto Fibonacci. Despus del nombre de la referencia, se usa el nombre del mtodo
seguido por su lista de argumentos, con un punto entre la referencia al objeto y el
nombre del mtodo. En caso de que el mtodo no tome argumentos, se usa la
referencia seguida por el nombre del mtodo, con un punto entre ellos. Los parntesis
que abren y cierran () deben seguir al nombre del mtodo. Estos para indicar que el
nombre que le sigue a la referencia al objeto es de un mtodo y no de una variable.
Como en el caso de las variables, para acceder a los mtodos de un objeto tambin se
puede usar una expresin que retorne una referencia a un objeto, seguida por el
nombre del mtodo con un punto entre ellos, como se muestra a continuacin:
new Fibonacci(10).cambiarNumeroDeTerminos(64);
Se puede llamar al mtodo printSeries() del objeto Fibonacci directamente, para
imprimir 10 trminos de la serie de nmeros Fibonacci como se muestra a
continuacin:
Unidad 1: Clases y Objetos

Libro 1: Core Java 134

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

new Fibonacci(10).mostrarSeries();
El mtodo mostrarSeries() no retorna ningn valor (indicado por la palabra clave
void). Suponga que se tiene un mtodo que retorna un valor y se quiere guardar el
valor retornado, se puede hacer como se muestra a continuacin:
(Asuma que el mtodo mostrarSeries() retorna un valor entero).
El cdigo Java comienza aqu...
public int mostrarSeries() {
// mtodo
if(n<=0) {
System.out.println("Entrada invalida");
return(0);
}
if(n>=1)
System.out.println(a);
if(n>=2)
System.out.println(b);
while(contador<n) {
c=a+b;
System.out.println(c);
a=b;
b=c;
contador++;
}
return(1);
}
El cdigo Java termina aqu
En el caso anterior el mtodo mostrarSeries() retorna 1 para indicar que la
operacin fue exitosa, o 0 para indicar lo contrario. Si se quiere guardar el valor
retornado por el mtodo en una variable, se hace como sigue:
int exito = new Fibonacci(10).mostrarSeries();
o
Fibonacci fib = new Fibonacci(10);
int exito = fib.mostrarSeries();
En el segundo caso, la referencia al objeto Fibonacci debe ya estar disponible en la
variable fib como se discuti anteriormente en esta seccin. Invocar un mtodo en un
objeto es similar a enviar un mensaje a ese objeto. Si se tienen dos variables de
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 135


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

referencia (digamos, fib y fib1) apuntando a diferentes objetos de la misma clase


Fibonacci, invocar el mismo mtodo en ambos objetos puede retornar resultados
diferentes.
int exito = fib.mostrarSeries();
int exito1 = fib1.mostrarSeries();
En este caso, exito y exito1 pueden tener diferentes valores, debido a que fib y
fib1 son referencias a diferentes objetos de la misma clase.
A continuacin se discute el manejo de la memoria en Java.

12. Manejo de la Memoria en Java


En Java, la memoria se asigna cuando un objeto es creado a partir de una clase. Java
da soporte a un manejo de memoria automtico. Esto significa que la memoria asignada
a un objeto est disponible para este, mientras el objeto este siendo usado en el
programa Java. Despus que el objeto se usa en un programa, el recolector de basura
lo reclama y la memoria asignada a ste es liberada.
A continuacin se estudia el recolector de basura en detalle.

12.1 El Recolector de Basura


Para usar un objeto en un programa Java, se necesita una referencia al objeto. Una
referencia al objeto se usa para encapsular la referencia de los nuevos objetos creados.
Se puede usar esta referencia para examinar y manipular al objeto.
El recolector de basura es un hilo de baja prioridad que se mantiene ejecutando en
segundo plano en una JVM. Se mantiene revisando que un objeto sea alcanzable por
cualquier tipo de referencia. Un objeto es alcanzable si es accesible en el programa. Un
objeto que est actualmente en uso en un programa es accesible por alguna parte del
programa en su etapa actual de ejecucin. Cuando el objeto se torna inalcanzable por
cualquier tipo de referencia, es reclamado para destruccin. La memoria asignada al
objeto es liberada y puede ser usada por otros objetos. Este proceso es conocido como
recoleccin de basura. En lenguajes de programacin como C y C++, la memoria
dinmicamente asignada tiene que ser explcitamente liberada. En Java, el recolector
de basura se encarga de liberar la memoria no utilizada.

13. Enumeraciones
En Java 5.0, aparece la palabra reservada enum que permite definir un conjunto de
valores constantes bajo un mismo espacio de nombres que lo hace ser ms coherente y
legible. Seguidamente, se presenta un ejemplo de ello:
enum Semana {DOMINGO, LUNES, MARTES, MIERCOLES, JUEVES, VIERNES,
SABADO}
Unidad 1: Clases y Objetos

Libro 1: Core Java 136

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

public void diasSemana() {


for (Semana dia : Semana.values())
System.out.println(dia);
}

13.1 Caractersticas de las Enumeraciones


A continuacin se presentan las caractersticas ms relevantes de las enumeraciones:

Las enumeraciones son clases: Cada constante de enumeracin es un objeto


del tipo de la clase enumeracin.

Las enumeraciones extienden de java.lang.Enum: Todas las enumeraciones


extienden implicitamente de java.lang.Enum. No es posible crear una
enumeracin que herede de otra clase debido a la definicin de la clase Enum:
abstract class Enum<E extends Enum<E>>

Sus valores no son tipo de datos enteros: Cada valor declarado es una instancia
de la clase enumeracin en s mismo.

No tienen un constructor pblico: Esto elimina la posibilidad de crear instancias


adicionales no definidas en tiempo de compilacin. Slo aquellas instancias
definidas por enum estn disponibles para su uso.

Sus valores son public, static y final: Impide que sus valores puedan ser
sobreescritos o cambiados. Adems, impide que estos objetos sean superclases
de otras.

Sus valores pueden ser comparados con == o equals().

Las
enumeraciones
implementan
java.io.Serializable.

Las enumeraciones definen el mtodo valueOf(): Devuelve el valor de la


constante de enumeracin basado en el String pasado por parmetro.

Las enumeraciones proveen el mtodo values(): Retorna un arreglo con la


lista de las constantes de la enumeracin.

Las enumeraciones pueden tener constructores, variables de instancia y


mtodos: Los contructores son llamados automticamente cuando se declara
cada constante de enumeracin. Cada constante de enumeracin tiene su
propia copia de las variables de instancia.

Libro 1: Core Java

java.lang.Comparable

Volumen 2: Programacin Orientada a Objetos 137


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:

Explicar los conceptos de clases y objetos.

Discutir acerca de la estructura y miembros de una clase Java.

Definir variables y mtodos en Java.

Explicar los modificadores de acceso.

Explicar la necesidad y uso de los constructores de las clases.

Explicar cmo los mtodos en una clase Java pueden ser sobrecargados.

Mencionar cmo Java maneja los argumentos de la lnea de comandos.

Explicar el ciclo de vida de un objeto.

Describir el manejo de la memoria en Java.

Exponer el uso de Enumeraciones.

Unidad 1: Clases y Objetos

Libro 1: Core Java 138

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 1: Examen de Autoevaluacin


1) Cuando se crea una instancia de una clase, es obligatorio declarar la variable que
ser usada para contener la referencia al objeto.
a) Verdadero
b) Falso
2) Se puede usar el valor de retorno del operador new para acceder a las variables
del objeto recin creado como sigue:
new Fibonacci(10).n;
a) Verdadero
b) Falso
3) Para una clase llamada MiClase, cul de las siguientes es la forma correcta de
definir un constructor sin argumentos?
a) int MiClase() {}
b) void MiClase() {}
c) MiClase(int miObjetoDeClase) {}
d) MiClase() {}
4) Cul de los siguientes debe estar necesariamente presente en una definicin de
una clase?
a) Sentencia import
b) Nombre de la superclase
c) Palabra reservada class
d) Interfaces implementadas
5) La clase X est definida en el paquete p1. La clase Y, que es una subclase de X,
est definida en el paquete p2. Qu tipo de variables declaradas en X pueden ser
accedidas por un objeto de Y?
a) private
b) protected
c) public
d) package

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 139


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

6) Cul de los siguientes tipos de variables en Java no pueden ser serializadas?


a) transient
b) volatile
c) final
d) protected
7) Cul de los siguientes tipos de mtodos pueden usar cdigo en C en un programa
Java?
a) static
b) volatile
c) final
d) native
8) Qu tipo de mtodo puede invocar un mtodo esttico?
a) final
b) volatile
c) private
d) static
9) Es posible para una clase tener dos mtodos como los siguientes?
void metodo1(int j, int k);
int metodo1(int k, int j);
a) Verdadero
b) Falso
10) Cuando un programa Java con una clase MiClase es ejecutado usando la
expresin, "java MiClase hola mundo," Cul de las siguientes es correcta?
a) args[0] tiene "MiClase "
b) args[0] tiene "hola"
c) args[1] tiene "hola"
d) Ninguna de las Anteriores

Unidad 1: Clases y Objetos

Libro 1: Core Java 140

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Respuestas a Unidad 1: Examen de Autoevaluacin


1) b
2) a
3) d
4) c
5) b y c
6) a
7) d
8) d
9) b
10) b

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 141


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 2: Laboratorio de Clases y


Objetos
Objetivos del Aprendizaje
Al final esta unidad, usted ser capaz de:

Crear clases y objetos.

Invocar mtodos de una clase.

Sobrecargar mtodos en una clase.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 143


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Ejercicios de Laboratorio
1) Escriba un programa en Java que tenga dos clases, Empleado y
CalcularSueldo. Empleado tiene los siguientes detalles acerca del empleado:
nombre, cdigo de empleado, horas trabajadas y pago por hora.
CalcularSueldo crea instancias de la clase Empleado, obtiene los detalles del
empleado para calcular los pagos y los imprime en la salida estndar. Use el
constructor de la clase Empleado para asignar valores a las diferentes variables.
Sugerencias tiles:

Escriba una clase llamada Empleado.

Declare variables para almacenar el nombre del empleado, cdigo, horas


trabajadas y pago por hora. El constructor de Empleado toma las variables
declaradas como parmetros y tiene el cdigo para inicializar estas variables.

Escriba una clase llamada CalcularSueldo.

Cree una instancia de Empleado y valores de muestra de los detalles del


empleado se pasan como parmetros al constructor.

El sueldo del empleado se calcula a partir de los detalles del empleado y se


imprime en la salida estndar.
2) Escriba un programa en Java que tenga las clases Area y Usuario. La clase
Area tiene mtodos estticos sobrecargados con el nombre area()que pueden
ser usados para calcular el rea de un circulo, tringulo, rectngulo y un cilindro.
Usuario usa los mtodos de Area para calcular el rea de diferentes figuras
geomtricas y la imprime en la salida estndar.
Sugerencias tiles:

Cree una clase llamada Area.

Escriba cuatro mtodos sobrecargados llamados area que tomen diferentes


nmeros y tipos de datos como parmetros. Estos mtodos se usan para
calcular el rea de un crculo, triangulo, rectngulo y cilindro.

Escriba una clase llamada Usuario que invoque las diferentes versiones de
area() en la clase Area con valores de prueba como parmetros. El valor
retornado se imprime en la salida estndar.

rea del Crculo = 3.14 * radio * radio

rea del triangulo = 0.5 * base * altura

rea del rectngulo = largo * ancho

rea del cilindro = 3.14 * radio * radio * altura

Unidad 2: Laboratorio de Clases y Objetos

Libro 1: Core Java 144

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

3) Cree dos clases llamadas Instructor y Curso. Instructor tiene el nombre


del instructor, nmero de ID del instructor y disciplina. Curso tiene nmero del
curso y el nombre del curso. Escriba mtodos que le permitan guardar y obtener
los datos. Cree una clase llamada CursoInstructor que tenga dos miembros
de datos, son estos, nmero de curso y nmero de ID del instructor. Escriba
mtodos para guardar y obtener los datos. Escriba el mtodo main que cree
objetos de las tres clases y establezca datos en todos estos objetos. El programa
debe ser capaz de buscar e imprimir el nombre de un instructor que ensea un
curso, dado el nmero de curso.
Sugerencias tiles:

Escriba una clase llamada Instructor.

Declare variables para almacenar el nombre del instructor, ID y disciplina.

Escriba mtodos para obtener los valores de estas variables y asignar valores a
estas variables.

Escriba una clase llamada Curso.

Declare variables para almacenar el nmero y nombre del curso.

Escriba mtodos para obtener los valores de estas variables y asignar valores a
estas variables.

Escriba una clase llamada CursoInstructor

Declare variables para almacenar el nmero del curso y el ID del instructor.

Escriba mtodos para obtener los valores de estas variables y asignar valores a
estas variables.

Cree instancias de las clases Instructor, Curso y CursoInstructor

Use el mtodo setter para inicializar las variables de cada clase con valores de
prueba.

Considere un nmero de curso de prueba como entrada y use la clase


CursoInstructor para encontrar al instructor que ensea ese curso e imprimirlo
en la salida estndar.

4) Cree una enumeracin llamada Curso con los nombres de los cursos de su
preferencia. Cree una clase llamada Programa y defina un mtodo esttico que
reciba un nmero variable de cursos e imprima un mensaje particular para cada
uno.
Sugerencias tiles:

Escriba una enumeracin llamada Curso y definale los cursos de su


preferencia.

Cree una clase llamada Programa.

En la clase anterior, defina un mtodo esttico que reciba varios cursos usando
la notacin ....

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 145


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Escriba un for que recorra el conjunto de cursos.

Dentro del cuerpo de la anterior estructura iterativa, cree un switch que


muestre un mensaje en particular para cada curso definico en la enumeracin
Curso.

Pruebe el funcionamiento del mtodo pasandole varias enumeraciones de


Curso.

Unidad 2: Laboratorio de Clases y Objetos

Libro 1: Core Java 146

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 3: Herencia
Objetivos del Aprendizaje
Al final de esta unidad, usted ser capaz de:

Entender los fundamentos de la herencia.

Explicar el uso de las palabras reservadas this y super.

Describir cmo crear una jerarqua de herencia.

Explicar cmo sobrescribir los mtodos.

Explicar el uso de la palabra reservada final.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 147


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

1. Introduccin
La herencia es uno de los fundamentos de la programacin orientada a objetos. Permite
crear una jerarqua entre un grupo de clases que tiene caractersticas similares. Se
puede tener una clase que define los atributos y comportamiento comunes a un grupo
especfico de clases. Todas las clases que son parte de este grupo especfico pueden
heredar los atributos y el comportamiento de esta clase comn.
Se va a entender que es la herencia tomando un ejemplo de la vida real. Asuma que
quiere crear una clase llamada ArbolDePino, que tiene las mismas caractersticas
que la clase Arbol, adems de algunas caractersticas adicionales. Una forma de
hacerlo es rescribiendo las variables miembro (atributos) y los mtodos
(comportamiento) que ya estaban disponibles en la clase Arbol, tambin en la clase
ArbolDePino, y luego aadir las caractersticas especiales a la clase ArbolDePino.
Sin embargo, Java proporciona una forma elegante de hacer lo anterior, usando el
concepto de herencia. De acuerdo con este concepto, la clase ArbolDePino puede ser
una subclase de la clase Arbol. As, la clase ArbolDePino obtiene implcitamente
todas las variables y mtodos que tengan acceso protected, public y package.
Adicionalmente, ArbolDePino puede aadir sus propias caractersticas especiales
adems de las caractersticas de la clase Arbol. Dado que ArbolDePino hereda de la
clase Arbol, puede ser llamado un tipo de Arbol.
La clase que define los atributos y el comportamiento comn se denomina superclase.
Las clases que heredan atributos y comportamiento de la clase general (superclase) se
denominan subclases. Una superclase es una clase que es heredada por otras clases.
A continuacin se discute cmo declarar clases usando la herencia en Java.

2. Sintaxis para Declarar Clases Usando Herencia en


Java
La sintaxis general para declarar una clase que hereda de una superclase es la
siguiente:
class NombreSubClase extends NombreSuperClase {
// cuerpo de la SubClase
}
Una clase no puede ser su propia superclase. Una clase puede tener cualquier nmero
de subclases, pero slo puede tener una nica superclase. Cada subclase de una clase
ser una forma especializada de su superclase.

Unidad 3: Herencia

Libro 1: Core Java 148

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

En el ejemplo anterior, la clase Arbol se llama superclase de la clase ArbolDePino, y


la clase ArbolDePino se llama una subclase de Arbol. Para especificar que la clase
ArbolDePino hereda de Arbol, se debe usar la siguiente declaracin de clase:
class ArbolDePino extends Arbol {}
Se va a volver a revisar el ejemplo de la clase ArbolDePino, que hereda de la clase
Arbol. El cdigo en el Ejemplo 3.1 muestra la declaracin de ambas clases.
Ejemplo 3.1
El ejemplo ilustra como se realiza la herencia en Java. La clase ArbolDePino hereda
de la clase base Arbol.
El cdigo Java comienza aqu...
1.

/*Definicion de la clase Arbol comienza aqui*/

2. class Arbol {
3.
private String nombre;
4.
private int edad;
5.
6.

private boolean conFlores;

7.
8.
9.

public String getNombre() {


return nombre;
}

10.
11.
12.

public void setNombre(String nuevoNombre) {


nombre = nuevoNombre;

13.
14.
15.

}
public int getEdad() {

16.
17.
18.

return edad;
}

19.
20.
21.

public void setEdad(int nuevaEdad) {


edad = nuevaEdad;
}

22.
23.
24.

public boolean isConFlores() {


return conFlores;

25.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 149


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

26.
27.
28.

Gua del Estudiante

public void setConFlores(boolean nuevoConFlores) {


conFlores = nuevoConFlores;

29.
}
30. }/* Definicion de la clase Arbol termina aqui */
31.
32. /* Definicion de la clase ArbolDePino comienza aqui */
33. class ArbolDePino extends Arbol {
34.
private boolean conifero;
35.
36.

public ArbolDePino() {

37.
38.
39.

setNombre("Pino");
conifero = true;
}

40.
41.
42.

public boolean isConifero() {


return conifero;

43.
}
44. }/* Definicion de la clase ArbolDePino termina aqui */
45.
46. /* Definicion de la clase HerenciaEjemplo comienza aqui */
47. public class HerenciaEjemplo {
48.
public static void main(String[] args) {
49.
50.
51.

String nombreSuper;
String nombreSub;
Arbol superClase = new Arbol();

52.
53.
54.

ArbolDePino subClase = new ArbolDePino();

55.
56.
57.

subClase.setEdad(68);
nombreSuper = superClase.getNombre();
nombreSub = subClase.getNombre();

58.
59.

System.out.println("Contenido de Super Clase:");

60.
61.
62.

superClase.setEdad(36);

System.out.println("Nombre Arbol: " + nombreSuper);


System.out.println("Edad Arbol: " + superClase.getEdad());

Unidad 3: Herencia

Libro 1: Core Java 150

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

63.
64.
65.

Core Java

System.out.println("\nContenido de Sub Clase:");


System.out.println("Nombre Arbol: " + nombreSub);
System.out.println("Edad Arbol: " + subClase.getEdad());

66.
System.out.println("Conifero: " + subClase.isConifero());
67.
}
68. }/* Definicion de la clase HerenciaEjemplo termina aqui */

El cdigo Java termina aqu


La salida del programa anterior es como sigue:
Contenido de Super Clase:
Nombre Arbol: null
Edad Arbol: 36
Contenido de Sub Clase:
Nombre Arbol: Pino
Edad Arbol: 68
Conifero: true
De la salida del programa anterior se puede ver que la subclase ArbolDePino obtiene
implcitamente todos los miembros de su superclase Arbol. Por eso la subclase
ArbolDePino tambin tiene las variables de instancia nombre, edad y conFlores
de su superclase. Adicionalmente, ArbolDePino tiene su propia caracterstica
especial. El atributo conifero es una caracterstica especial de la clase
ArbolDePino.
Tambin se puede ver que la clase Arbol es una clase autnoma completamente
independiente. Por lo tanto, una superclase de una subclase puede ser usada por su
cuenta.
Fin del Ejemplo 3.1
Se ha visto como se hereda de una clase en Java.
Una subclase, en su declaracin, usa la palabra reservada extends, seguida por el
nombre de la superclase para especificar su superclase.
Se puede construir la jerarqua de subclases de una superclase en particular. Esto se
llama jerarqua de herencia. Considere la Figura 3.1, que muestra una jerarqua de
herencia.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 151


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Figura 3.1: Jerarqua de Herencia

En esta figura, la clase Examen es la superclase de ExamenSimple,


ExamenPractico y ExamenCertificacion. ExamenPracticoAleatorio es una
subclase de ExamenPractico. Note que ExamenPractico es la superclase de
ExamenPracticoAleatorio.
La jerarqua mostrada en la Figura 3.1 se puede implementar en Java usando la palabra
reservada extends, y otros conceptos de herencia.
A continuacin se examinan algunos de los principales conceptos de herencia en Java.

3. Conceptos Esenciales de Herencia


La herencia en Java tiene los mismos conceptos que en C++. Sin embargo, en Java
estn ms simplificados y existe menos ambigedad que en C++.
El primer concepto que se va a entender es qu componentes de una clase son
heredados.

3.1 Qu es Heredado?
Las variables miembro, tambin conocidas como campos y los mtodos de la clase
base son heredados. Los constructores de la clase base no son heredados. La herencia
no implica automticamente visibilidad o accesibilidad a los miembros de la clase base
en la clase que hereda. Los modificadores de acceso controlan la accesibilidad de los
miembros. As, un miembro de datos privado de la clase base a pesar de que es
heredado por la subclase no es accesible en forma directa por la subclase. Slo usando
un mtodo getter provisto en la clase base, se puede acceder a este miembro privado.

Unidad 3: Herencia

Libro 1: Core Java 152

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Se aprender ahora acerca de la clase Object.

3.2 La Clase Object


Todas las clases en Java heredan de la clase java.lang.Object por defecto. As,
cualquier clase creada por el programador es una subclase de la clase Object. Java
provee ciertos mtodos en la clase Object, que estn disponibles para todas las
clases. Hay varios mtodos tiles definidos en java.lang.Object. Dos de ellos,
ampliamente utilizados son: equals() y toString(). Dado que Object es la clase
base de todas las clases Java, se estudiaran estos dos mtodos.
3.2.1 El Mtodo equals()
El mtodo equals() se usa para comparar dos referencias a objetos en relacin con
los valores que mantienen los objetos. Este mtodo devuelve true slo si las dos
referencias a objetos que son comparadas refieren al mismo objeto, de lo contrario
devuelve false. Si las dos referencias a objetos comparadas usando el mtodo
equals() apuntan a objetos diferentes, que tienen el mismo valor, el mtodo
equals() retorna false.
Considere el Ejemplo 3.2, que compara dos referencias a objeto StringBuffer sb1 y
sb2.
Ejemplo 3.2
El ejemplo muestra el uso del mtodo equals().
El cdigo Java comienza aqu
1. /*Definicion de la clase CompararEjemplo comienza aqui*/
2. public class CompararEjemplo {
3.
4.

/* Metodo main comienza aqui */


public static void main(String[] args) {

5.
6.
7.

StringBuffer sb1 = new StringBuffer("Palabra");


StringBuffer sb2 = sb1;

8.
9.
10.

boolean iguales = sb1.equals(sb2);


System.out.println(iguales);

11.
12.
13.

sb2 = new StringBuffer("Palabra");


iguales = sb1.equals(sb2);
System.out.println(iguales);

14.
}/* Metodo main termina aqui */
15. }/* Definicion de la clase CompararEjemplo termina aqui */
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 153


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

El cdigo Java termina aqu


Despus de ejecutar la sentencia sb1.equals(sb2), iguales tendr un valor true. El
mtodo equals compara las dos referencias a objeto, y retorna el valor como true.
Despus de ejecutar la sentencia sb2 = new StringBuffer("Palabra"), sb2 tiene
una nueva referencia a objeto, de aqu que sb1.equals(sb2) retorne false.
Fin del Ejemplo 3.2
El mtodo equals() realiza una comparacin profunda, compara los valores
almacenados por dos objetos. Otra forma de comparar objetos es usar el operador ==,
que determina si dos referencias hacen referencia al mismo objeto o no.
Por ejemplo, considere el siguiente cdigo:
StringBuffer sb1 = new StringBuffer("Palabra");
StringBuffer sb2 = new StringBuffer("Palabra");
boolean iguales = (sb1 == sb2);
En este caso, iguales tendr el valor false, porque sb1 y sb2 refieren a dos objetos
StringBuffer diferentes, creados usando dos operaciones new, an cuando el valor
almacenado es el mismo ("Palabra"). Si dos referencias apuntan a la misma instancia
de objeto, el operador == retornar true. Considere el siguiente cdigo:
String s1 = "Hola";
String s2 = "Hola";
boolean iguales = (s1 == s2);
En este caso iguales tendr true ya que s1 y s2 refieren a la misma instancia de la
cadena de caracteres "Hola" creada en el repositorio de constantes de string.
Se puede sobreescribir la implementacin de equals que est en la clase
java.lang.Object. Por defecto, chequear la referencia a objeto de dos objetos. Sin
embargo, puede ser sobreescrito para revisar los valores almacenados en los objetos, y
no slo la referencia. Por ejemplo, la clase String tiene una implementacin
sobrecargada de equals() para comparar el valor en estos objetos. Considere el
Ejemplo 3.3, que muestra este concepto.
Ejemplo 3.3
Este ejemplo muestra como el mtodo equals() se usa en la clase String.
El cdigo Java comienza aqu...
1. /*Definicion de la clase StringEjemplo comienza aqui*/
2. public class StringEjemplo {
3.

/* Metodo main comienza aqui */

Unidad 3: Herencia

Libro 1: Core Java 154

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

4.
5.
6.

public static void main(String[] args) {


String str1 = new String("Palabra");
String str2 = str1;

7.
8.
9.

boolean iguales = str1.equals(str2);


System.out.println(iguales);

10.
11.
12.

str2 = new String("Palabra");


iguales = str1.equals(str2);

13.
14.

System.out.println(iguales);
}/* Metodo main termina aqui */

15. }/* Definicion de la clase StringEjemplo termina aqui */

El cdigo Java termina aqu


Despus de ejecutar la segunda sentencia str1.equals(str2), iguales retorna
true, despus de ejecutar la sentencia str2 = new String("Palabra"), str2 tiene
una nueva referencia a objeto. An en este caso, los valores son comparados. De ah
que, str1.equals(str2) devuelve true.
Fin del Ejemplo 3.3
3.2.2 El Mtodo toString()
El mtodo toString() se usa para obtener informacin textual acerca de un objeto.
La implementacin de toString() en la clase Object da el nombre de la clase
seguido por el carcter @, que a su vez es seguido por la representacin hexadecimal
sin signo del cdigo hash asociado con el objeto. Cuando se escriben las clases se
puede sobrescribir este mtodo para dar informacin textual acerca de la clase de la
forma que se quiera.
Hasta ahora, se han visto los diferentes mtodos dentro de la clase Object. Se
considera a continuacin el uso de las palabras reservadas this y super.

3.3 Palabras Reservadas super y this


En el ejemplo de las clases Arbol y ArbolDePino discutido anteriormente,
ArbolDePino es una subclase de la clase Arbol. Este ejemplo no usa ningn
constructor para inicializar sus variables miembro. Por lo tanto, las variables miembro no
son inicializadas con ningn valor por defecto en el programa, ellas tienen los valores
por defecto proporcionados por el sistema.
La palabra reservada super se usa para acceder a los miembros de la superclase
desde la subclase, y la palabra reservada this se usa para acceder a los miembros del
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 155


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

objeto actual. Considere por un momento otro ejemplo, que se muestra en la Figura 3.2,
para entender el uso de la palabra reservada super.

Figura 3.2: Uso de la Palabra Reservada super()

La clase ExamenCertificacion extiende de la clase Examen. El constructor de


ExamenCertificacion inicializa variables de instancia como idVale y idEstudiante.
La variable de instancia fecha est definida como un miembro privado en Examen. sta
ha sido inicializada llamando al constructor de la superclase. Se hizo llamando a
super(new Date()).
Ahora se rescriben las clases Arbol y ArbolDePino ya discutidas para incluir
constructores en ellas. En este caso, la clase Arbol tendr algunos valores por defecto
establecidos para los objetos de tipo Arbol. La clase ArbolDePino puede reutilizar
los valores por defecto establecidos en la clase Arbol, usando la palabra reservada
super.
Por lo tanto, se puede utilizar la palabra reservada super para invocar al constructor de
la superclase. ArbolDePino hereda las variables de instancia nombre y edad de
Arbol. Desde el constructor de ArbolDePino se puede acceder a la variable de
Unidad 3: Herencia

Libro 1: Core Java 156

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

instancia nombre declarada en Arbol usando la palabra reservada super, se puede


tambin usar la palabra reservada super dentro del constructor para invocar a un
mtodo declarado en la superclase.
Similarmente, se puede acceder a la variable de instancia nombre heredada por
ArbolDePino desde Arbol, usando la palabra reservada this en la superclase. En
el programa en el Ejemplo 3.4, la variable nombre es pasada como parmetro a uno de
los constructores de la clase Arbol. Dentro del constructor se puede acceder tanto a la
variables nombre como al parmetro nombre. Para diferenciar entre la variable de
instancia y el parmetro, se accede a la variable de instancia nombre usando la palabra
reservada this (this.nombre). El parmetro nombre se accede sin usar la palabra
reservada this, porque el parmetro no pertenece al objeto, sino que es una variable
local del mtodo. Si el nombre de una variable de instancia no es el mismo que el de un
parmetro de un constructor, no hay necesidad de usar la palabra reservada this para
acceder a las variables de instancia.
Ejemplo 3.4
Este ejemplo ilustra como trabajan las palabras reservadas super y this en la clase
que hereda.
El cdigo Java comienza aqu
1. /*Definicion de la clase Arbol comienza aqui*/
2. class Arbol {
3.
4.

private String nombre;


private int edad;

5.
6.
7.

private boolean conFlores;


public Arbol(String nombre, int edad) {

8.
9.
10.

this.nombre = nombre;
this.edad = edad;
}

11.
12.
13.

public Arbol() {
this.nombre = "Roble";

14.
15.
16.

this.edad = 100;
}

17.
18.
19.

public Arbol(Arbol arbol) {


this.nombre = arbol.nombre;
this.edad = arbol.edad;

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 157


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

20.
21.
22.

Gua del Estudiante

}
public String getNombre() {

23.
24.
25.

return nombre;
}

26.
27.
28.

public void setNombre(String nombre) {


this.nombre = nombre;
}

29.
30.

public int getEdad() {

31.
32.
33.

34.
35.
36.

public void setEdad(int edad) {


this.edad = edad;
}

37.
38.
39.

public boolean isConFlores() {


return conFlores;

40.
41.
42.

return edad;

}
public void setConFlores(boolean conFlores) {

43.
this.conFlores = conFlores;
44.
}
45. }/* Definicion de la clase Arbol termina aqui */
46.
47. /* Definicion de la clase ArbolDePino comienza aqui */
48. class ArbolDePino extends Arbol {
49.
50.
51.

private boolean conifero;

52.
53.

super();
setNombre("Pino");

54.
55.
56.

conifero = true;

public ArbolDePino() {

Unidad 3: Herencia

Libro 1: Core Java 158

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

57.
58.
59.

public ArbolDePino(int edad, boolean conico) {


super("Pino", edad);
conifero = conico;

60.
61.
62.

}
public ArbolDePino(ArbolDePino arbolDePino) {

63.
64.
65.

super(arbolDePino);
conifero = arbolDePino.conifero;
}

66.
67.

public boolean isConifero() {

68.
return conifero;
69.
}
70. }/* Definicion de la clase ArbolDePino termina aqui */
71.
72. /* Definicion de la clase SuperEjemplo comienza aqui */
73. public class SuperEjemplo {
74.
75.
76.

public static void main(String[] args) {


Arbol arbol1 = new Arbol();
System.out.println("Contenido de arbol1:");

77.
78.
79.

System.out.println("Nombre Arbol: "


+ arbol1.getNombre());
System.out.println("Edad Arbol: "

80.
81.
82.

+ arbol1.getEdad());
Arbol arbol2 = new Arbol("Mango", 64);

83.
84.
85.

System.out.println("\nContenido de arbol2:");
System.out.println("Nombre Arbol: "
+ arbol2.getNombre());

86.
87.
88.

System.out.println("Edad Arbol: "


+ arbol2.getEdad());

89.
90.

Arbol arbol3 = new Arbol(arbol2);


System.out.println("\nContenido de arbol3:");

91.
92.
93.

System.out.println("Nombre Arbol: "


+ arbol3.getNombre());
System.out.println("Edad Arbol: "

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 159


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

94.
95.
96.

+ arbol3.getEdad());
ArbolDePino pino1 = new ArbolDePino();

97.
98.
99.

System.out.println("\nContenido de pino1:");
System.out.println("Nombre Arbol: "
+ pino1.getNombre());

100.
101.
102.

System.out.println("Edad Arbol: "


+ pino1.getEdad());
System.out.println("Conifero : "

103.
104.

+ pino1.isConifero());

105.
106.
107.

ArbolDePino pino2 = new ArbolDePino(35, true);


System.out.println("\nContenido de pino2:");
System.out.println("Nombre Arbol: "

108.
109.
110.

+ pino2.getNombre());
System.out.println("Edad Arbol: "
+ pino2.getEdad());

111.
112.
113.

System.out.println("Conifero : "
+ pino2.isConifero());

114.
115.
116.

ArbolDePino pino3 = new ArbolDePino(pino2);


System.out.println("\nContenido de pino3:");
System.out.println("Nombre Arbol: "

117.
118.
119.

+ pino3.getNombre());
System.out.println("Edad Arbol: "
+ pino3.getEdad());

120.
121.
122.

System.out.println("Conifero : "
+ pino3.isConifero());
}

123. }/* Definicion de la clase SuperEjemplo termina aqui */

El cdigo Java termina aqu


La salida de este programa es la siguiente:
Contenido de arbol1:
Nombre Arbol: Roble
Edad Arbol: 100
Unidad 3: Herencia

Libro 1: Core Java 160

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Contenido de arbol2:
Nombre Arbol: Mango
Edad Arbol: 64
Contenido de arbol3:
Nombre Arbol: Mango
Edad Arbol: 64
Contenido de pino1:
Nombre Arbol: Pino
Edad Arbol: 100
Conifero : true
Contenido de pino2:
Nombre Arbol: Pino
Edad Arbol: 35
Conifero : true
Contenido de pino3:
Nombre Arbol: Pino
Edad Arbol: 35
Conifero : true
En este programa, la clase Arbol define tres constructores sobrecargados diferentes.
ArbolDePino usa los tres constructores cuando define sus constructores usando
super().
Fin del Ejemplo 3.4
Teniendo una idea general de la palabra reservada super, se ver en detalle su uso en
la herencia.
3.3.1 Usar super en Clases Derivadas Un Enfoque Detallado
En trminos generales, una subclase se puede referir a su superclase inmediata usando
la palabra reservada super. La palabra reservada super puede usarse en dos formas
diferentes. La primera forma se usa cuando se invoca al constructor de la superclase,
mientras que la segunda se usa para acceder a las variables miembro de la superclase
que han sido ocultadas por las variables miembro de la subclase. En el programa del
Ejemplo 3.4 se vio que el uso de la primera forma de la palabra clave super. El uso de la
segunda forma de la palabra clave super ser ilustrado posteriormente.
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 161


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Una subclase puede ocultar una variable de su superclase teniendo su propia variable
con el mismo nombre que el de la superclase.
La forma general de la palabra reservada super usada por el constructor de la
subclase para llamar al constructor de la superclase es como sigue:
super(listaDeParametros);
Cuando una subclase usa la palabra reservada super en la forma descrita, el
compilador busca por la correspondencia exacta en la lista de parmetros de los
diferentes constructores de la superclase. Si se encuentra una correspondencia, se usa
ese constructor particular, como se ilustr en el programa del Ejemplo 3.4.
Vase el siguiente constructor definido por la clase ArbolDePino.
ArbolDePino(ArbolDePino ap) {
super(ap);
conifero = ap.conifero;
}
En este cdigo, super() se usa con un objeto del tipo ArbolDePino y no del tipo
Arbol. Pero an as, se invoca al constructor de la forma Arbol(Arbol arbol),
esto se debe a que una variable referenciando a un objeto de la superclase tambin
puede usarse para referenciar al objeto de una clase que deriva de ella. Por lo tanto, se
puede pasar el objeto ArbolDePino al constructor Arbol(Arbol arbol). En este
caso, el objeto arbol puede acceder solamente a los miembros presentes en la clase
Arbol. No conoce acerca de los miembros adicionales de la clase ArbolDePino. De
esta forma, el miembro conifero se le asigna valor por separado en el constructor
ArbolDePino() despus de invocar al constructor de la clase Arbol mediante
super(). Usualmente si se usa super(), entonces ser la primera sentencia en el
constructor de una subclase, de lo contrario el compilador generar un error. Aqu
super() permite referir al constructor de la superclase inmediata (Arbol) de la clase
actual (ArbolDePino).
La palabra reservada super tambin sirve para referir a las variables miembro o a los
mtodos miembro de la superclase. Este uso de la palabra reservada super es similar
al uso de la palabra reservada this. La forma general del uso de super se da a
continuacin:
super.nombreDeMiembro
Aqu, nombreDeMiembro puede referir tanto a una variable como a un mtodo de
instancia de la superclase. Se ver en un ejemplo como acceder a un mtodo de la
superclase desde un mtodo en la subclase en la seccin Sobrescritura de Mtodos.
La herencia tiene un comportamiento diferente cuando se usa junto a un modificador de
acceso. A continuacin se considera ese aspecto.

Unidad 3: Herencia

Libro 1: Core Java 162

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

3.3.2 Herencia y Modificadores de Acceso


A continuacin se va a entender si una subclase tiene acceso o no a todas las variables
(atributos) y mtodos (comportamiento) declarados en su superclase, o la superclase de
su superclase, y as sucesivamente. Una subclase puede acceder a todas las variables
y mtodos declarados como public y protected de su superclase. Si la superclase
est presente en el mismo paquete que la subclase, entonces la subclase puede
acceder a todas las variables y mtodos declarados como package en su superclase.
Para ms informacin sobre stos modificadores de acceso refirase a la Unidad 1
Clases y Objetos de este volumen.
Las variables declaradas como private no pueden accederse desde la clase derivada.
En el Ejemplo 3.1, el atributo nombre de Arbol no es accesible por ArbolDePino,
porque est declarado como private, pero dado que Arbol provee una forma de
acceder al atributo nombre a travs de los mtodos getNombre() y setNombre(),
ArbolDePino puede, indirectamente acceder al atributo, y asignarle el valor de
"Arbol" dentro de su constructor.
En la Figura 3.3, el constructor de ArbolDePino accede a la variable private
nombre de Tree, esto no est permitido. Una solucin mejor ser usar el mtodo
setNombre.

Figura 3.3: Herencia y Modificadores de Acceso


Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 163


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

A continuacin se discute acerca de herencia mltiple y jerarqua de herencia en Java.


3.3.3 Herencia Mltiple en Java
Java no soporta directamente la herencia mltiple. Esto significa que una clase no
puede tener ms de una superclase directa. Sin embargo, Java indirectamente ayuda a
implementar la herencia mltiple a travs del uso de interfaces. Esto ser tratado en
detalle en la Unidad 5 Clases Abstractas e Interfaces en este volumen.

3.4 Jerarqua de Herencia


Se aprendi acerca de jerarqua de herencia simple, que consiste de una superclase y
una subclase. En esta seccin, se ver como escribir programas Java que construyen
una jerarqua de herencia multinivel, en la cual una clase que es una subclase de una
clase, ser una superclase de otra.
Se va a alterar el programa del ejemplo anterior para ilustrar una jerarqua de herencia
multinivel. ArbolConifero ser una subclase de Arbol, y ArbolDePino ser una
subclase de ArbolConifero .
Ejemplo 3.5
Este ejemplo muestra como crear una jerarqua de herencia multinivel usando tres
clases. Este ejemplo da una completa descripcin para las tres clases. Los mtodos se
proporcionan para destacar los puntos esenciales de la herencia multinivel.
El cdigo Java comienza aqu...
1. /*Definicion de la clase Arbol comienza aqui*/
2. class Arbol {
3.
4.
5.

protected String nombre;


protected int edad;

6.
7.

public Arbol(String nombre, int edad) {


this.nombre = nombre;

8.
9.
10.

this.edad = edad;
}

11.
12.
13.

public String getNombre() {


return nombre;
}

14.
15.
16.

public int getEdad() {


return edad;

17.

Unidad 3: Herencia

Libro 1: Core Java 164

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

18. }/* Definicion de la clase Arbol termina aqui */


19.
20. /* Definicion de la clase ArbolConifero comienza aqui */
21. class ArbolConifero extends Arbol {
22.
private boolean conifero;
23.
24.
25.
26.

public ArbolConifero(String nombre, int edad) {


super(nombre, edad);
conifero = true;

27.
28.

29.
30.
31.

public boolean isConifero() {


return conifero;
}

32. }/* Definicion de la clase ArbolConifero termina aqui */


33.
34. /* Definicion de la clase ArbolDePino comienza aqui */
35. class ArbolDePino extends ArbolConifero {
36.
private String lugarDondeCrece;
37.
38.
39.
40.

public ArbolDePino(
String nombre,
int edad,

41.
42.
43.

String lugarDondeCrece) {
super(nombre, edad);

44.
45.
46.

this.lugarDondeCrece = lugarDondeCrece;
}

47.
48.
49.

public String getLugarDondeCrece() {


return lugarDondeCrece;
}

50. }/* Definicion de la clase ArbolDePino termina aqui */


51.
52. /* Definicion de la clase comienza aqui */
53. public class JerarquiaHerenciaEjemplo {
54.
public static void main(String[] args) {
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 165


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

55.
56.
57.

ArbolDePino pino = new ArbolDePino(


"Pino",
23,

58.
59.
60.

"Malaysia");
System.out.println("Arbol: " + pino.getNombre());
System.out.println("Edad: " + pino.getEdad());

61.
62.
63.

System.out.println("Conifero: " + pino.isConifero());


System.out.println("Lugar donde crece: "
+ pino.getLugarDondeCrece());

64.
}
65. }/* Definicion de la clase termina aqui */

El cdigo Java termina aqu


La salida de este programa es la siguiente:
Arbol: Pino
Edad: 23
Conifero: true
Lugar donde crece: Malaysia
Del programa anterior se puede ver que la clase ArbolConifero hereda todas las
caractersticas de la clase Arbol y aade aquellas caractersticas que le resultan
especiales (boolean conifero). La clase ArbolDePino hereda las caractersticas
de ambas clases Arbol y ArbolConifero
y aade su variable miembro
lugarDondeCrece. En el mtodo main se crea un objeto ArbolDePino. El
constructor de ArbolDePino invoca al constructor de su superclase usando
super(nombre, edad). Se puede ver del programa anterior que super()se refiere a la
superclase inmediata de la clase que invoca, tambin se puede ver que todos los
parmetros del constructor de la superclase son pasados cuando se invoca, a pesar de
que el constructor de la subclase puede no requerir todos estos parmetros. Estos
parmetros son pasados hacia arriba, desde el nivel ms bajo al ms alto nivel en la
jerarqua.
Fin del Ejemplo 3.5
Se discute a continuacin el orden de construccin de los objetos.
3.4.1 Orden de Construccin de los Objetos
En una jerarqua de herencia, es importante saber el orden de construccin de los
objetos, cuando un objeto de una subclase se crea en la jerarqua. El constructor de la
clase base (superclase) se llama primero, seguido por los constructores de las
subclases, en el mismo orden en el cual las subclases fueron creadas.

Unidad 3: Herencia

Libro 1: Core Java 166

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Ejemplo 3.6
El ejemplo muestra como se construyen los objetos.
El cdigo Java comienza aqu
1.

/*Definicion de la clase X comienza aqui*/

2. class X {
3.
public X() {
4.
System.out.println("Objeto de la clase X construido!");
5.
}
6. }/* Definicion de la clase X termina aqui */
7.
8. /*Definicion de la clase Y comienza aqui*/
9. class Y extends X {
10.
11.
12.

public Y() {
System.out.println("Objeto de la clase Y construido!");
}

13. }/* Definicion de la clase Y termina aqui */


14.
15. /*Definicion de la clase Z comienza aqui*/
16. class Z extends Y {
17.
public Z() {
18.
System.out.println("Objeto de la clase Z construido!");
19.
}
20. }/* Definicion de la clase Z termina aqui */
21.
22. /*Definicion de la clase comienza aqui*/
23. public class OrdenConstruccionObjetosEjemplo {
24.
public static void main(String[] args) {
25.
26.

new Z();
}

27. }/* Definicion de la clase termina aqui */


El cdigo Java termina aqu
La salida del cdigo anterior ser la siguiente:
Objeto de la clase X construido!
Objeto de la clase Y construido!
Objeto de la clase Z construido!
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 167


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Fin del Ejemplo 3.6


El ejemplo anterior muestra que el objeto de la clase base X se construye primero,
seguidos por los objetos de Y y Z.
El sobrescribir mtodos es otro concepto importante en herencia.

3.5 Sobrescritura de Mtodos


En una jerarqua de clases, donde una clase es una subclase de otra clase, si un
mtodo en la subclase tiene la misma firma (el mismo nombre de mtodo, el mismo
nmero de argumentos y los mismos tipos de argumentos en el mismo orden), que un
mtodo en la superclase, entonces el mtodo en la superclase se dice que est
sobrescrito (ocultado) por el mtodo en la subclase. Cuando se invoca un mtodo
sobrescrito desde la subclase, siempre se refiere al mtodo definido dentro de la
subclase. La versin del mtodo que se encuentra en la superclase que est sobrescrita
(oculta) puede ser accedido usando la palabra clave super dentro de la subclase.
Ejemplo 3.7
Este ejemplo ilustra cmo se sobrescriben los mtodos en las clases heredadas.
El cdigo Java comienza aqu...
1. /*Definicion de la clase X comienza aqui*/
2. class X {
3.
4.
5.

int a, b, c;

6.
7.
8.

a = m;
b = n;
}

9.
10.
11.

public int add() {


return (c = a + b);

X(int m, int n) {

12.
}
13. }/* Definicion de la clase X termina aqui */
14.
15. /* Definicion de la clase Y comienza aqui */
16. class Y extends X {
17.
int d;
18.
19.

Y(int m, int n, int o) {

Unidad 3: Herencia

Libro 1: Core Java 168

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

20.
21.
22.

23.
24.
25.

/* Metodo sobrescrito */
public int add() {

26.
27.
28.

super(m, n);
d = o;

int s = super.add();
return (c = s + d);
// return (c = super.add() + d);

29.
}
30. }/* Definicion de la clase Y termina aqui */
31.
32. /* Definicion de la clase comienza aqui */
33. public class SobrescrituraMetodosEjemplo {
34.
35.
36.

public static void main(String[] args) {


X x = new X(42,35);
Y y = new Y(42,35,23);

37.
38.
39.

System.out.println(
"Suma en la super clase: " +
x.add());

40.
41.
42.

System.out.println(
"Suma en la sub-clase: " +
y.add());

43.
}
44. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
La salida del programa es la siguiente:
Suma en la super clase: 77
Suma en la sub-clase: 100
Del programa anterior, se puede ver que cuando se invoca el mtodo add() en el
objeto de la clase Y, se invoca al mtodo add() definido en Y. El mtodo add()
definido en su superclase est sobrescrito u oculto. Cuando los mtodos dentro de la
clase Y quieren acceder al mtodo sobrescrito de la clase X, pueden usar la palabra
reservada super como se mostr en el programa anterior.
Fin del Ejemplo 3.7

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 169


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Si un mtodo en la superclase y en la subclase tienen el mismo nombre, pero sus firmas


son diferentes, entonces los mtodos son sobrecargados y no sobrescritos. En este
caso, el mtodo en la superclase no est oculto y es accesible directamente, sin usar la
palabra reservada super.

3.6 Comportamiento Virtual y Herencia


En Java todos los mtodos son virtuales por defecto. Por virtual se entiende que todos
los mtodos en Java son polimrficos por naturaleza. El comportamiento asociado con
los mtodos polimrficos se denomina comportamiento virtual, ya que el
comportamiento correcto es determinado en tiempo de ejecucin. La Figura 3.4 muestra
dos clases, Examen y ExamenPractico que tienen una relacin de herencia (es decir,
la clase ExamenPractico hereda de la clase Examen). Referencias al objeto
ExamenPractico pueden ser asignadas a objetos del tipo Examen. Ahora, cuando se
invoca a un mtodo de este objeto Examen, se llama al mtodo de la clase derivada
(ExamenPractico). El enlace se realiza en tiempo de ejecucin.
A una referencia a objeto de la superclase se le puede asignar una referencia a
cualquier objeto de su subclase. Esto se usa ampliamente especialmente en el manejo
de excepciones, que ser discutido en el Volumen 3, Unidad 1 Manejo de
Excepciones y Tipos de Excepciones.

Unidad 3: Herencia

Libro 1: Core Java 170

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 3.4: Comportamiento Virtual en Java

El programa en el Ejemplo 3.8 se usa para ilustrar el comportamiento virtual discutido


anteriormente, usando el ejemplo 3.1 de las clases Arbol y ArbolDePino.
Ejemplo 3.8
Este ejemplo muestra como usar comportamiento virtual en un programa Java.
El cdigo Java comienza aqu...
1.

/* Definicion de la clase comienza aqui */

2. public class ComportamientoVirtualEjemplo {


3.
public static void main(String[] args) {
4.
ArbolDePino ap = new ArbolDePino();
5.
6.
7.

Arbol a = new Arbol();


ap.setEdad(75);

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 171


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

8.
9.
10.

System.out.println(
"Valores de la referencia de la sub clase: ");
System.out.println("Nombre: " + ap.getNombre());

11.
12.
13.

System.out.println("Edad: " + ap.getEdad());


System.out.println("Conifero: " + ap.isConifero());

14.
15.
16.

/* Asignando la referencia del objeto


ArbolDePino a la referencia del tipo Arbol */
a = ap;

17.
18.

System.out.println(
"Valores de la referencia de la super clase: ");

19.
20.
21.

System.out.println("Nombre: " + a.getNombre());


System.out.println("Edad: " + a.getEdad());

22.
23.
24.

// Esto generaria un error


// System.out.println("Conifero: " + a.isConifero());
}

25. }/* Definicion de la clase termina aqui */


El cdigo Java termina aqu
La salida del programa es la siguiente:
Valores de la referencia de la sub clase:
Nombre: Pino
Edad: 75
Conifero: true
Valores de la referencia de la super clase:
Nombre: Pino
Edad: 75
En este programa, ap es una referencia al objeto ArbolDePino, y a es una referencia
al objeto Arbol. En la primera parte del programa, se usa directamente ap para
acceder a sus mtodos. En la segunda parte del programa, se le asigna ap a a en la
lnea 16 como sigue:
a = ap;
ArbolDePino es una subclase de Arbol y por eso se le puede asignar ap a a. Esto
implica que la referencia a un objeto de la superclase se le puede asignar la referencia
de su subclase. Cuando se accede a los mtodos de ArbolDePino usando a, no se
puede acceder a isConifero(), porque no est presente en la superclase Arbol.

Unidad 3: Herencia

Libro 1: Core Java 172

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Todos los mtodos definidos en la clase base son accesibles a travs de a. Por lo tanto,
cuando se asigna la referencia a la subclase a una referencia de superclase, solamente
aquellos mtodos que estn disponibles en la superclase pueden ser accedidos usando
la referencia.
Fin del Ejemplo 3.8
El punto a destacar aqu es que la referencia al objeto de superclase que actualmente
referencia a su subclase permite acceder solamente a aquellas variables de la subclase
que han sido heredadas de la superclase. Por esto la referencia a no puede acceder al
miembro conifero, que est presente solamente en ArbolDePino, y no en Arbol.
Esto es as, porque la superclase no conoce de las caractersticas especiales aadidas
por la subclase. Esta es la razn por la que la lnea 23 de la funcin main,
a.isConifero() est comentada.
La asignacin a = new ArbolDePino() es conocida como upcast y es legal en Java.
Sin embargo, no se puede tener ap = new Arbol(), que es referido como downcast.
Si se desea asignar a a ap despus de hacer a = new ArbolDePino(), se debe
realizar una conversin explcita como se muestra a continuacin:
ap = (ArbolDePino) a;
A continuacin se aprender acerca del uso de la palabra reservada final en el
contexto de herencia.

3.7 Herencia y la Palabra Reservada final


Se puede declarar una variable que tenga un valor constante a travs del programa
usando el modificador final sobre la variable. Una variable final puede ser
inicializada solamente una vez dentro de un programa Java, y mantendr el mismo valor
a travs de todo el programa. No se puede cambiar el valor asignado a una variable
final ms adelante en el programa.
Ejemplo 3.9
Este ejemplo ilustra como la palabra clave final se puede usar en las clases.
El cdigo Java comienza aqu
1. /* Definicion de la clase comienza aqui */
2. public class VariableFinalEjemplo {
3.
/* El metodo main comienza aqui */
4.
5.
6.
7.

public static void main(String[] args) {


final int contador = 10;
int a = 10;
System.out.println(

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 173


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

8.
9.
10.

"Valor de la variable contador es: " +


contador);
a = a + contador;

11.
12.
13.

System.out.println(
"Valor de la variable a es: " +
a);

14.
15.
16.

contador++; // Error de compilacion


contador = 25; // Error de compilacion
}/* El metodo main termina aqui */

17. }/* Definicion de la clase termina aqui */


El cdigo Java termina aqu
En este programa se puede inicializar la variable final contador slo una vez y
usarla subsecuentemente dentro del programa sin alterar su valor. Cuando se intenta
actualizar contador o asignarle un nuevo valor, se lanza un error de compilacin como
ocurre en las lneas 14 y 15.
Fin del Ejemplo 3.9
El Ejemplo 3.9 muestra el uso de la palabra clave final para declarar constantes. El
uso de final con las clases derivadas tiene un impacto diferente, que se ver a
continuacin. Uso de la Palabra Reservada final para prevenir la Herencia
Cuando se quiere evitar que una clase se herede, se puede usar el modificador final
en la declaracin de la clase. Cuando se declara una clase como final, Java declara
implcitamente todos los mtodos de la clase tambin como final. No se puede
declarar una clase abstract como final, dado que la clase abstracta requiere que
sus subclases proporcionen las implementaciones completas para todos sus mtodos.
Este concepto ser estudiado en detalle en la Unidad 5 Clases Abstractas e Interfaces
de este volumen.
Ejemplo 3.10
El programa ilustra el uso del modificador final para una clase.
El cdigo Java comienza aqu
1.
2.

final class X {
private int a;

3.
4.
5.

X(int m) {
a = m;
}

6.

public void setA(int m) {

Unidad 3: Herencia

Libro 1: Core Java 174

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

7.
8.
9.
10.
11.
12. }

Core Java

a = m;
}
public int getA() {
return (a);
}

13.
14. /* error de compilacin, Y no puede ser subclase de X */
15. class Y extends X {
16.
17.
18.
19.
20.

public int b;
Y(int m, int n) {
super(m);
b = n;
}

21. }
El cdigo Java termina aqu
Como se discuti, la clase Y no puede heredar de la clase X, porque X fue declarada
como final.
Fin del Ejemplo 3.10
A continuacin se discute el uso de la palabra reservada final para evitar la
sobrescritura de mtodos de una superclase por su subclase.
3.7.1 Uso de la Palabra Reservada final Para Prevenir la Sobrescritura
En esta seccin veremos el uso de la palabra reservada final en la declaracin de los
mtodos para evitar que el mtodo sea sobrescrito.
A pesar de que sobrescribir mtodos es sin duda, una caracterstica importante en Java,
puede haber situaciones donde no se quiere que un mtodo sea sobrescrito por sus
subclases para mejorar el desempeo del programa. Esto se debe a que, en este caso,
el compilador sabe que estos mtodos final no sern sobrescritos por sus subclases,
y directamente remplaza el cdigo fuente por el bytecode, mejorando el rendimiento del
programa. Esto se llama enlace temprano (early binding). Generalmente el compilador
Java resuelve la invocacin de mtodos en tiempo de ejecucin, esto se llama enlace
tardo (late binding). Se puede usar el modificador final al declarar mtodos para
conseguir el enlace temprano.
Considere el Ejemplo 3.11. Se modificar el programa del Ejemplo 3.10, para ilustrar el
uso de final en la declaracin de mtodos para prevenir el sobrescribir.
Ejemplo 3.11
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 175


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

El cdigo Java comienza aqu...


1.
2.

class X {
int a, b, c;

3.
4.
5.

X(int m, int n) {
a = m;

6.
7.
8.

b = n;
}

9.
10.
11.

final int add() {


c = a + b;
return (c);

12.
13. }
14.

15. class Y extends X {


16.
int d;
17.
18.
19.
20.

Y(int m, int n, int o) {


super(m, n);
d = o;

21.
22.
23.

24.
25.

final no puede ser sobrescrito */


public int add() {

/* Error de compilacion: Metodo

26.
27.
28.
29.
30. }

int s = super.add();
c = s + d;
return (c);
}

El cdigo Java termina aqu


En este ejemplo, dado que el mtodo add() ha sido declarado como final en la clase
X, no puede ser sobrescrito en la clase Y, que se extiende de la clase X. Por lo tanto, se
obtiene un error de compilacin.
Fin del Ejemplo 3.11
Unidad 3: Herencia

Libro 1: Core Java 176

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:

Explicar los fundamentos de la herencia.

Explicar el uso de las palabras reservadas super y this.

Describir cmo crear una jerarqua de herencia.

Discutir cmo sobrescribir mtodos.

Explicar el uso de la palabra reservada final.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 177


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Unidad 3: Examen de Autoevaluacin


1) Cul modificador debe usarse para modificar una variable para hacerla
inaccesible por la subclase?
a) protected
b) public
c) package
d) private
2) Una clase que es subclase de una clase puede ser una superclase de alguna otra
clase.
a) Verdadero
b) Falso
3) Por defecto, desde cul de las siguientes heredan todas las clases en Java?
a) Clase Base
b) Clase Super
c) Clase Object
d) Ninguna de las anteriores
4) Una clase puede tener cualquier nmero de superclases directas y subclases.
a) Verdadero
b) Falso
5) Si X es la superclase de Y, cul de las siguientes es un uso correcto?
a) X x = new X(); Y y = new Y(); x = y;
b) X x = new X(); Y y = new Y(); y = x;
6) Cuando a una variable de referencia de una superclase se le asigna una referencia
a una subclase, el acceso est disponible slo para los miembros que se definen
en la superclase.
a) Verdadero
b) Falso

Unidad 3: Herencia

Libro 1: Core Java 178

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

7) Cuando se usa el objeto de una subclase Y que deriva de una clase X, en una
clase externa Z, se puede hacer referencia a los mtodos de la clase X usando la
palabra clave super con el objeto de la clase Y.
a) Verdadero
b) Falso
8) A es la superclase de B, y B es la superclase de C. Cuando un objeto de C es
creado, cul es el orden en el que los constructores se invocan?
a) Slo el constructor de C es invocado
b) Constructor de C, Constructor de B, Constructor de A
c) Constructor de A, Constructor de B, Constructor de C
d) Constructor de A, Constructor de C
9) Cul es la palabra clave usada en Java para detener la sobrescritura de mtodos
en subclases?
a) static
b) stop
c) final
d) private
10) Cuando se usa la palabra clave final con una variable, sta no puede ser
ocultada por una subclase con una variable con el mismo nombre.
a) Verdadero
b) Falso

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 179


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Respuestas a la Unidad 3: Examen de Autoevaluacin


1) d
2) a
3) c
4) b
5) a
6) a
7) b
8) c
9) c
10) b

Unidad 3: Herencia

Libro 1: Core Java 180

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 4: Laboratorio de Herencia


Objetivos de Aprendizaje
Al final de esta unidad, usted ser capaz de:

Trabajar con herencia.

Invocar mtodos de una superclase.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 181


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Ejercicios de Laboratorio
1) Escribir un programa en Java, que tenga una clase llamada Color. La clase
Color tiene un atributo colorNombre que es privado y los siguientes mtodos,
final void setColor(String color);
String getColor();

// la cadena retornada da el color

La clase Blanco hereda de la clase Color y tiene su atributo (private)


colorNombre establecido en Blanco.
Las clases Violeta, ndigo, Azul, Verde, Amarillo, Naranja y Rojo
heredan de la clase Blanco. Todas estas clases tienen una variable privada
llamada colorNombre que es inicializada con "violeta", "ndigo", "azul", verde,
"amarillo", "naranja" y "rojo", respectivamente.
La clase Prisma tiene el siguiente mtodo,
void activatePrisma(Color c);
Este mtodo verifica si el mtodo getColor() retorna "blanco". Si es
verdadero, crea instancias de las clases Violeta, ndigo, Azul, Verde,
Amarillo, Naranja y Rojo e imprime en la salida estndar sus atributos
colorNombre. Si la verificacin resulta en falso.
La clase AntiPrisma tiene el siguiente mtodo,
void activateAntiPrisma(Rojo r, Azul a, Verde v);
Este mtodo verifica si el atributo colorName de r, a y v son "rojo", "azul" y
"verde", respectivamente. Si es verdadero, crea un nuevo objeto Blanco e
imprime el valor de su atributo colorNombre en la salida estndar.
La clase Cientifico usa las clases Prisma y AntiPrisma.
2) Escribir un programa en Java que tenga una clase llamada Bicicleta con
ruedas,
asiento,
velocmetro,
indicador,
frenoDelantero,
frenoTrasero y velocidadCajaActual como atributos. Tambin tiene un
mtodo llamado incrementaVelocidadCaja que realiza los cambios desde 1
hasta 4 y un mtodo llamado decrementaVelocidadCaja que realiza los
cambios desde 4 hasta 1. La clase Bicicleta tambin tiene un mtodo llamado
indicaGiro() que cambia el valor de la variable indicador en forma
concordante. Una clase llamada BicicletaCarrera es subclase de la clase
Bicicleta y sobrescribe el mtodo incrementaVelocidadCaja para hacer
los cambios desde 1 hasta 5, y el mtodo decrementaVelocidadCaja se
sobrescribe para hacer los cambios desde 5 hasta 1. Un Conductor (otra clase)
maneja la Bicicleta y la BicicletaCarrera, una despus de la otra.

Unidad 4: Laboratorio de Herencia

Libro 1: Core Java 182

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 5: Clases Abstractas e


Interfaces
Objetivos de Aprendizaje
Al final de esta unidad, usted ser capaz de:

Explicar clases abstractas.

Diferenciar entre clases abstractas y clases concretas.

Describir cmo definir clases y mtodos abstractos en Java.

Definir una interfaz.

Explicar cmo las interfaces son implementadas y usadas como referencia.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 183


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

1. Introduccin
Se estudi la herencia en Java en la Unidad 3 - Herencia. En esta unidad, se tratar el
tema de clases abstractas e interfaces, las cuales pueden usarse por la herencia.

2. Clases Abstractas
En todas las unidades anteriores, hasta la Unidad 3 Herencia, se han discutido
solamente las clases concretas. Estas clases se denominan as porque se pueden
instanciar objetos de ellas. Existe otro grupo de clases que no pueden instanciarse, se
denominan clases abstractas. Por lo tanto, el operador new no puede usarse en las
clases abstractas.
Las clases abstractas se usan para definir las caractersticas generales de un concepto
abstracto. Una clase abstracta se usa para definir los atributos comunes y el
comportamiento general de un grupo de clases. Las clases abstractas tienen las
definiciones de mtodos que justifican su comportamiento. Una clase abstracta puede
implementar algunos de los mtodos definidos en ella, obtenindose una
implementacin parcial de su comportamiento. Usualmente, no se implementa una gran
parte de la clase (no se da la implementacin de los mtodos), algunas veces, sin
embargo, las clases abstractas pueden implementar todos los mtodos definidos en
ella.
Las clases que heredan de una clase abstracta implementan los mtodos abstractos
definidos en esa clase. En caso de que la subclase no proporcione la implementacin
para todos los mtodos abstractos definidos en la clase abstracta, la subclase misma se
declara como una clase abstracta y la clase que herede de esta subclase abstracta
debe proporcionar la implementacin para sus mtodos abstractos. De lo contrario la
cadena de clases abstractas contina.
Se va a entender el concepto de clases abstractas con dos ejemplos generales.
Considere tres especies de mamferos: jirafas, delfines y ballenas, se pueden modelar
estas especies como clases de software: Jirafa, Delfin y Ballena. Se conoce el
aspecto de estos tres animales, y podemos visualizar cada uno de ellos.
Las jirafas, los delfines y las ballenas pertenecen a la categora llamada mamferos. Se
pueden representar las caractersticas de los mamferos en la forma de una clase
llamada Mamifero. Cundo se piensa en un mamfero se puede visualizar cmo
luce?, No, esto se debe a que un mamfero puede tener el aspecto de una jirafa, un
delfn o una ballena, en nuestro ejemplo. Una clase abstracta puede ser usada para
representar entidades que no pueden ser visualizadas. Mamifero puede ser una clase
abstracta, no se pueden crear instancias de Mamifero. Sin embargo, se pueden crear
instancias de sus subclases, llamadas, Jirafa, Delfin y Ballena.

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 184

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Una de las caractersticas comunes a los mamferos es que ellos dan a luz a sus
pequeos. Sin embargo, las jirafas, delfines y ballenas dan a luz a sus pequeos en
ambientes diferentes. Mientras la jirafa da a luz a su pequeo en tierra, un delfn y una
ballena dan a luz en el agua. Por lo tanto, la clase Mamifero se puede usar solo para
definir las caractersticas que ellos dan a luz a sus pequeos. No se puede usar para
definir donde ellos dan a luz a sus pequeos.
De la discusin anterior est claro que existen algunos patrones genricos de
comportamiento de entidades del mundo real que pueden ser abstrados en una sola
clase, la cual forma la clase base para la herencia. En el ejemplo anterior, Mamifero
es la clase abstracta, que forma la clase base, cuyos atributos y mtodos podrn ser
heredados por otras clases.
Considere otro ejemplo. El concepto de nmero es un concepto abstracto porque no
existe un objeto llamado nmero en la realidad, lo que se tiene en el mundo real son
enteros, nmeros reales, etc., que comparten caractersticas o propiedades comunes.
Estas caractersticas pueden ser abstradas en una clase llamada Numero, que forma la
clase base para las subclases Entero, Real, etc. La clase Numero se define como
clase abstracta, ya que existe tambin slo en abstraccin en el mundo real.
Los dos ejemplos que se han discutido muestran como las clases abstractas son tiles
para definir conceptos abstractos en Java. Otras clases concretas heredan de clases
abstractas para concretizar su definicin abstracta. Antes de avanzar ms en lo
concerniente a clases abstractas, se van a resumir las diferencias entre clases
abstractas y concretas.

2.1 Clases Abstractas vs. Clases Concretas


La Tabla 5.1 ilustra las diferencias entre clases abstractas y concretas.
Clases Abstractas
Se usan
concretas.

para

Clases Concretas
generalizar

No pueden ser instanciadas.

clases Se usan para representar objetos del


mundo real.
Pueden ser instanciadas.

Definen mtodos abstractos para los No definen mtodos abstractos.


cuales la implementacin no es provista.
Pueden o no proveer implementacin para Deben proveer implementacin para todos
cualquiera de los mtodos.
sus mtodos.
Tabla 5.1: Clases Abstractas vs. Clases Concretas

Se va a mencionar a continuacin como Java provee mecanismos para definir y usar


clases abstractas en programas.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 185


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

3. Uso de Clases Abstractas


El modificador abstract que se aprendi en la Unidad 1 Clases y Objetos, se puede
usar de dos formas, ya sea con una clase o con un mtodo. Cuando una clase tiene el
modificador abstract en la declaracin de la clase, se denomina clase abstracta. El
modificador abstract se usa con una clase para indicar que la clase no puede ser
instanciada.
La palabra clave abstract se usa antes de la palabra clave class para definir una
clase como clase abstracta. El siguiente cdigo muestra como declarar una clase
abstract:
abstract class ClaseAbstracta{
// . . .
}
class InstanciacionClaseAbstractaEjemplo{
public static void main(String args[]){
ClaseAbstracta ca = new ClaseAbstracta(); // error
}
}
Cuando se intenta instanciar una clase abstract, como se hizo en la clase
InstanciacionClaseAbstractaEjemplo, el compilador mostrar el siguiente
mensaje de error:
InstanciacionClaseAbstractaEjemplo.java:6: ClaseAbstracta is
abstract; cannot be instantiated
ClaseAbstracta ca = new ClaseAbstracta(); // error
^
1 error
Las clases abstractas pueden tener dos tipos de mtodos: mtodos que tienen
implementacin y mtodos que no tiene implementacin. Los mtodos implementados
en una clase abstracta son mtodos concretos. Los mtodos que no tienen
implementacin son mtodos abstractos. Se van a definir los mtodos abstractos en
Java.

3.1 Definicin de Mtodos Abstractos


El modificador abstract, cuando se usa en una declaracin de mtodo, proporciona
un mtodo abstract. El modificador indica que la implementacin del mtodo no es
provista en la clase. Indica que las subclases que hereden de la clase abstracta, al cual
el mtodo abstracto pertenece, deben proveer la implementacin para el mtodo. Si la
subclase inmediata no provee implementacin para el mtodo abstracto de su
superclase, entonces la subclase tambin se debe definir como una clase abstracta.

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 186

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Los mtodos abstractos pueden estar presentes solamente dentro de una clase
abstracta. La siguiente es la estructura general de la declaracin de un mtodo
abstracto:
abstract tipoRetorno nombreMetodo(argumentos);
La palabra reservada abstract se usa antes de especificar el tipo de retorno del
mtodo. Se puede ver que el cuerpo del mtodo est ausente, lo que significa que la
implementacin del mtodo no se proporciona en la clase.
Una clase abstracta puede contener cualquier nmero de mtodos abstractos. Como se
mencion anteriormente, tambin es posible tener una clase abstracta que de la
implementacin para todos los mtodos definidas en ella y as no tenga ningn mtodo
abstracto. Cuando una clase es declarada como abstracta, no necesariamente debe
contener un mtodo abstracto. Sin embargo cuando existe un mtodo abstracto dentro
de la clase, la clase debe ser declarada como abstracta. Antes de avanzar con ejemplos
de clases y mtodos abstractos, se va a ver como una referencia se puede usar para
una clase abstracta.

3.2 Clases Abstractas y Referencias


Aunque no se puede instanciar una clase abstracta, se puede crear una referencia a
sta. Esto es posible porque Java soporta polimorfismo, que permite que un objeto de
una clase sea referenciado por una referencia a su superclase. Considere el siguiente
fragmento de cdigo:
abstract class Abstracta {
abstract void m1();
}
class Concreta extends Abstracta {
void m1() {
System.out.println("En m1");
}
void m2() {
System.out.println("En m2");
}
}
public class AbstractaEjemplo {
public static void main(String args[]) {
Concreta c = new Concreta();
/* Referencia a la clase Abstracta */
Abstracta referenciaAbstracta;
referenciaAbstracta = c;
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 187


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

referenciaAbstracta.m1();
}
}
En el cdigo anterior, se crea una referencia referenciaAbstracta de la clase
Abstracta, a esta referencia se le pueden asignar referencias de subclases de
Abstracta. Esta caracterstica es muy til para lograr el polimorfismo. Usando
referenciaAbstracta en el cdigo anterior, se puede hacer referencia al mtodo
m1() definido en la clase abstracta.
Una vez aprendido como definir clases y mtodos abstractos, se va a considerar dos
clases llamadas CuentaDeAhorros y CuentaCorriente. La representacin grfica
de la clase CuentaDeAhorros y el cdigo Java que la implementa se muestra en la
Figura 5.2.

CuentaDeAhorros
numero:String
saldo:double
tasaInteres:double

public class CuentaDeAhorros {


private String numero;
private double saldo;
private double tasaInteres;

cerrar():void
calcularIntereses():double
credito(double):void
debito(double):void
getSaldo():double

public
public
public
public
public

void cerrar() {}
double calcularIntereses() {}
void credito(double cantidad){}
void debito(double cantidad){}
double getSaldo() {}

Figura 5.2: Representacin de la Clase CuentaDeAhorros

En el diagrama de la clase CuentaCorriente y el cdigo Java que la implementa se


muestran en la Figura 5.3.

CuentaCorriente
numero:String
saldo:double
comisionMensual:double

public class CuentaCorriente {


private String numero;
private double saldo;
private double comisionMensual

cargarComision():double
cerrar():void
credito(double):void
debito(double):void
getSaldo():double

public
public
public
public
public

double cargarComision() {}
void cerrar() {}
void credito(double cantidad){}
void debito(double cantidad){}
double getSaldo() {}

Figura 5.3: Representacin de la Clase CuentaCorriente

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 188

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

De las Figuras 5.2 y 5.3, se pueden hacer las siguientes observaciones:

Ambas clases tienen algunas funcionalidades en comn.

Es posible crear instancias para ambas clases.

Las similitudes entre estas clases permite definir una jerarqua de herencia.

La forma de implementar las funcionalidades, es sin embargo drsticamente


diferente para ambas clases.

Para estas clases, se puede crear una clase en comn llamada CuentaBancaria, que
tenga funciones definidas en ella, sin la implementacin, esta clase se convierte en
candidata para una clase abstracta.
El diagrama de la clase CuentaBancaria se muestra en la Figura 5.4. Las definiciones
abstractas estn en letra itlica.

Figura 5.4: Clase Abstracta CuentaBancaria

La definicin en Java de la clase CuentaBancaria se muestra en la Figura 5.5.

public abstract class CuentaBancaria {


private String numero;
private double saldo;
public abstract void cerrar();
public void credito(double cantidad) {}
public abstract void debito(double cantidad);
public double getSaldo() {}
}
Figura 5.5: Definicin en Java de la Clase CuentaBancaria
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 189


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Las dos clases, CuentaCorriente y CuentaDeAhorros, pueden ahora ser derivadas


de la clase abstracta CuentaBancaria.

Figura 5.6: Derivando de la Clase Abstracta CuentaBancaria

Las dos clases: CuentaDeAhorros y CuentaCorriente extienden de la clase


abstracta y proveen la implementacin para los mtodos definidos como abstractos. El
cdigo fuente para la clase CuentaCorriente se muestra en la Figura 5.7. Las
implementaciones de los mtodos se muestran en puntos suspensivos.

Figura 5.7: Definicin en Java de la Clase CuentaCorriente

Se van a escribir dos programas Java que usan clases y mtodos abstractos.

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 190

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Ejemplo 5.1
Este ejemplo muestra como un mtodo abstracto se implementa en la subclase V.
El cdigo Java comienza aqu
1. /* Definicion de la clase U comienza aqui */
2. abstract class U {
3.
abstract void metodo1();
4.
5.
6.

void metodo2() {
System.out.println(
"Dentro de metodo2 en la clase U");

7.
}
8. }/* Definicion de la clase U termina aqui */
9.
10. /* Definicion de la clase V comienza aqui */
11. class V extends U {
12.
void metodo1() {
13.
14.

System.out.println(
"Dentro de metodo1 en la clase V");

15.
}
16. }/* Definicion de la clase V termina aqui */
17.
18. /* Definicion de la clase AbstractaEjemplo comienza aqui */
19. public class AbstractaEjemplo {
20.
/* El metodo main comienza aqui */
21.
22.
23.

public static void main(String[] args) {


V subClase = new V();
subClase.metodo1();

24.
subClase.metodo2();
25.
}/* El metodo main termina aqui */
26. }/* Definicion de la clase AbstractaEjemplo termina aqui */
El cdigo Java termina aqu
La salida del programa anterior es la siguiente:
Dentro de metodo1 en la clase V
Dentro de metodo2 en la clase U
De la salida del programa anterior, se puede ver que a pesar de que no se cre un
objeto de la clase U, la clase V implcitamente tiene la implementacin para el metodo2.
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 191


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Ms an, no puede crearse un objeto de la clase U, pues es una clase abstracta.


Tambin se puede notar que la clase abstracta proporciona la implementacin para el
mtodo metodo2, lo cual es perfectamente aceptable.
Fin del Ejemplo 5.1
El prximo ejemplo ilustra como usar una referencia a una clase abstracta.
Ejemplo 5.2
Usando la clase abstracta Poligono, se crean tres subclases, se instancian tres
objetos de estas tres clases y usando la referencia a la clase abstracta se invoca a los
mtodos en las subclases.
El cdigo Java comienza aqu
1. /* Definicion de la clase Poligono comienza aqui */
2. abstract class Poligono {
3.
float dimension1;
4.
5.

float dimension2;

6.
7.
8.

Poligono(float x, float y) {
dimension1 = x;
dimension2 = y;

9.
10.
11.

}
abstract float area();

12. }/* Definicion de la clase Poligono termina aqui */


13.
14. /* Definicion de la clase Cuadrado comienza aqui */
15. class Cuadrado extends Poligono {
16.
Cuadrado(float side) {
17.
super(side, side);
18.
19.
20.

}
float area() {

21.
return (dimension1 * dimension2);
22.
}
23. }/* Definicion de la clase Cuadrado termina aqui */
24.
25. /* Definicion de la clase Triangulo comienza aqui */
Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 192

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

26. class Triangulo extends Poligono {


27.
Triangulo(float base, float altura) {
28.
super(base, altura);
29.
30.
31.

}
float area() {

32.
return ((float) 0.5 * dimension1 * dimension2);
33.
}
34. }/* Definicion de la clase Triangulo termina aqui */
35.
36. /* Definicion de la clase Cilindro comienza aqui */
37. class Cilindro extends Poligono {
38.
Cilindro(float radio, float altura) {
39.
super(radio, altura);
40.
41.
42.
43.
44.
45.

}
float area() {
return ((float) 3.14 * dimension1 *
dimension1 * dimension2);
}

46. }/* Definicion de la clase Cilindro termina aqui */


47.
48. /* Definicion de la clase AbstractaEjemplo comienza aqui */
49. public class AbstractaEjemplo {
50.
/* El metodo main comienza aqui */
51.
public static void main(String[] args) {
52.
53.
54.

Cuadrado cu = new Cuadrado(7);


Triangulo t = new Triangulo(4, 5);
Cilindro ci = new Cilindro(6, 3);

55.
56.
57.

Poligono poligono;

58.
59.

System.out.println(
"Area del cuadrado es: " +

60.
61.
62.

poligono = cu;

poligono.area());
poligono = t;

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 193


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

63.
64.
65.

System.out.println(
"Area del triangulo es: " +
poligono.area());

66.
67.
68.

poligono = ci;
System.out.println(

69.
70.
71.

"Area del cilindro es: " +


poligono.area());
}/* El metodo main termina aqui */

72. }/* Definicion de la clase AbstractaEjemplo termina aqui */


El cdigo Java termina aqu
La salida del programa anterior sera as:
Area del cuadrado es: 49.0
Area del triangulo es: 10.0
Area del cilindro es: 339.12
En el programa anterior se puede ver que las caractersticas de la clase abstracta
Poligono son ms significativas con la implementacin que proporcionan sus
subclases para el mtodo abstracto area(). No se puede tener una implementacin
significativa del mtodo area() en un polgono de dos dimensiones. Por lo tanto, el
mtodo area() se declara como abstracto y su implementacin se deja para sus
subclases. Declarar el mtodo area() como abstracto obliga a que todas sus
subclases no abstractas implementen el mtodo.
Fin del Ejemplo 5.2
En el programa anterior, se crea una referencia a la clase abstracta Poligono, pero no
se crea un objeto del tipo Poligono.
La variable poligono del programa anterior, es slo una referencia a la clase abstracta
Poligono, esta variable permite referenciar objetos de sus subclases. Los mtodos
sobrescritos se resuelven en tiempo de ejecucin usando la variable de referencia de la
superclase.

4. Qu son las Interfaces?


Las interfaces son similares a las clases, en trminos de sintaxis, pero no soportan
ninguna variable de instancia. Una interfaz esencialmente captura los roles que juegan
las diferentes clases que implementan las interfaces. Una interfaz especifica el prototipo
o comportamiento de una clase. Todos los mtodos declarados en una interfaz son
mtodos abstractos, es decir, no se les proporciona implementacin. Una interfaz no
puede ser instanciada. Tanto las clases abstractas como las concretas pueden
Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 194

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

implementar una interfaz. Una clase concreta que implemente la interfaz tiene que
proveer la implementacin para todos los mtodos declarados en la interfaz.
Si la implementacin no se proporciona para aunque sea uno de los mtodos definidos
en la interfaz entonces la clase deber ser declarada como clase abstracta.
Una clase puede implementar cualquier nmero de interfaces. Tambin una misma
interfaz puede ser implementada por cualquier nmero de clases. Las interfaces
implementadas por una clase especifican la interfaz que puede ser usada para la
comunicacin entre la clase y otros objetos. Una interfaz puede extender de otra
interfaz, lo que significa que se puede crear una jerarqua de interfaces. Sin embargo,
una interfaz no puede implementar otra interfaz, ya que la implementacin no es
provista por ninguno de los mtodos declarados en la interfaz.
Clases no relacionadas pueden implementar la misma interfaz, introducindose cierta
relacin entre las clases, sta es una de las ventajas de usar interfaces. Todas las
funcionalidades requeridas por diferentes aplicaciones se guardan dentro de una
interfaz. Por lo tanto, las interfaces actan como sustitutos de la herencia mltiple.
La definicin de interfaz es similar a la definicin de clases. La estructura general se
muestra a continuacin:
modificadorDeAcceso interface nombreInterfaz {
tipoDeDato nombreVar1 = valor;
tipoDeDato nombreVar2 = valor;
.
.
.
tipoDeDato nombreVarN = valor;
tipoDeRetorno nombreMetodo1(listaDeArgumentos);
tipoDeRetorno nombreMetodo2(listaDeArgumentos);
.
.
.
tipoDeRetorno nombreMetodoN(listaDeArgumentos);
}
Usualmente, el modificadorDeAcceso usado es public, de lo contrario no es
mencionado. Cuando el modificadorDeAcceso no se menciona, se considera
package por defecto. Cuando una interfaz se declara como public, cualquier otra
interfaz o clase presente en cualquier paquete puede usarla.
El nombre de una interfaz se especifica en nombreInterfaz, que es un identificador
vlido. Las interfaces pueden declarar variables que son final y static. De tal
forma que, las clases que implementen la interfaz no pueden cambiar sus valores. Las
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 195


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

variables definidas en una interfaz deben ser inicializadas con un valor constante. Si la
interfaz se declara como public, todas las variables y mtodos en la interfaz tienen
acceso pblico.
Considere la Figura 5.8, que muestra la definicin de la interfaz List de Java 1.4.

Figura 5.8: Definicin de la Interfaz List en Java 1.4

La Figura 5.8 muestra la interfaz List definida en el paquete java.util, que es parte
del marco de trabajo para colecciones de Java. Se discute el marco de trabajo para
colecciones en el Volumen 8, Unidad 1 API Colecciones. Esta figura slo muestra
algunos de los mtodos ms usados de la interfaz List.
La Figura 5.9 presenta la definicin de la interfaz List de java 1.4 en formato UML
(Unified Modeling Language). UML es un lenguaje de modelacin para el anlisis y
diseo orientado a objetos.

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 196

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 5.9: Definicin de la interfaz List en Formato UML

UML hace uso del estereotipo <<interface>> para indicar que List es una interfaz y
no una clase.
La Figura 5.10 muestra la clase Vector, que implementa la interfaz List.

Figura 5.10: Definicin de la Clase Vector que Implementa la Interfaz List

La Figura 5.11 muestra la representacin en UML para la clase Vector, que


implementa la interfaz List. En esta figura, se puede ver una lnea punteada seguida

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 197


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

por un triangulo hueco, esta es la notacin UML para indicar que Vector implementa la
interfaz List.
Dos otras clases, LinkedList y ArrayList, implementan tambin List. De manera
que si se entiende la interfaz List, se puede fcilmente entender la operacin de las
clases Vector, LinkedList y ArrayList.

Figura 5.11: Representacin UML de la Clase Vector que Implementa List

No es obligatorio para los mtodos definidos en una interfaz usar la palabra reservada
abstract, ya que todos los mtodos definidos en una interfaz son abstractos por
definicin.
El siguiente cdigo da un ejemplo de declaracin de interfaz:
interface ContestadorAutomatico {
void grabarMensaje(String mensaje);
String getMensajeGrabado();
}
Esta es una declaracin simple de interfaz con dos mtodos, getMensajeGrabado()
y grabarMensaje() en ella. Se debe notar que la implementacin de los mtodos no
se proporciona aqu. Las clases que implementen esta interfaz deben proporcionar la
implementacin de los mtodos. A continuacin se entender por qu se usan las
interfaces.

4.1 Por qu usar Interfaces?


En la seccin anterior, se aprendi que la clase Vector implementa la interfaz List.
Tambin se sabe que la clase Vector puede contener toda la funcionalidad que provee
la interfaz List, sin tener que implementar la interfaz. Las funcionalidades pueden ser
implementadas como mtodos en la clase Vector. Se escoge implementar la interfaz
como una mejor alternativa porque las interfaces definen un protocolo. Una interfaz
puede ser implementada por muchas clases, as, se asegura que todas las clases que
implementan la interfaz se adhieren al protocolo definido en la interfaz. Una clase
Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 198

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Vector, una clase HashTable y cualquier otra clase que requiera el protocolo definido
en la interfaz List puede implementar la interfaz List. Los usuarios de estas clases
saben que todas las clases que implementen la interfaz List proveern los mtodos
add, contains, get, remove, isEmpty etc., porque la interfaz List declara estos
mtodos.

4.2 Implementacin de Interfaces


En la seccin previa, se aprendi a declarar una interfaz. Una vez que la declaracin de
la interfaz se completa, puede ser implementada por una clase. La clase usa la clusula
implements para especificar las interfaces que implementa. Si la clase implementa
mltiples interfaces, los nombres de las interfaces se separan por comas.
Si dos o ms interfaces implementadas por una clase tienen la misma declaracin de
mtodo, la clase slo necesita proveer una implementacin para la declaracin del
mtodo. Los mtodos que implementan las clases deben ser declarados como public
y sus firmas del mtodo deben coincidir con la firma del mtodo declarado en la interfaz
que ellas implementan.
La siguiente es la estructura general de la declaracin de clase para la clase que
implementa una interfaz:
modificadorDeAcceso class nombreClase [extends nombreSuperClase]
[implements interfaz1, interfaz2, ...] {
// cuerpo de la clase
}
Considere el Ejemplo 5.3 para entender cmo una clase implementa una interfaz.
Ejemplo 5.3
El ejemplo muestra como la clase Telefono
ContestadorAutomatico antes mencionada.

implementa

la

interfaz

El cdigo Java comienza aqu


1. /* Definicion de la clase Telefono comienza aqui */
2. public class Telefono implements ContestadorAutomatico{
3.

String mensaje;

4.
5.
6.

String mensajeSaludo = "Regreso despues de las 11pm";

7.
8.
9.

public void grabarMensaje(String mensaje) {


System.out.println("Mensaje grabado: " + mensaje);
this.mensaje = mensaje;

/* El metodo grabarMensaje comienza aqui */

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 199


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

10.
11.
12.

}/* El metodo grabarMensaje termina aqui */

13.
14.
15.

public String getMensajeGrabado() {


System.out.println("Mensaje Saludo: " + mensajeSaludo);
return mensajeSaludo;

/* El metodo getMensajeGrabado comienza aqui */

16.
}/* El metodo getMensajeGrabado termina aqui */
17. }/* Definicion de la clase Telefono termina aqui */
El cdigo Java termina aqu
Se debe notar que los mtodos en la clase anterior Telefono se declaran como
public dado que implementan los mtodos de la interfaz ContestadorAutomatico.
El ejemplo anterior, muestra a la clase Telefono implementando los dos mtodos
declarados en la interfaz ContestadorAutomatico. Cuando se observa la
declaracin de la clase Telefono, se sabe que implementa la interfaz
ContestadorAutomatico, lo que asegura que los dos mtodos declarados en
ContestadorAutomatico sern implementados.
Tambin es posible que la clase Telefono desee definir otras funcionalidades adems
de los mtodos declarados en la interfaz, esto se ilustra en el siguiente extracto de
cdigo:
El cdigo Java comienza aqu
1. /* Definicion de la clase Telefono comienza aqui */
2. public class Telefono implements ContestadorAutomatico{
3.
4.
5.

String mensaje;
String mensajeSaludo = "Regreso despues de las 11pm";
String mensajeBasico = "Hola";

6.
7.
8.

String mensajeInterlocutor1;
String mensajeInterlocutor2;
boolean interlocutor1 = false;

9.
10.
11.

boolean interlocutor2 = false;


boolean respuestaEncendido = false;
// . . .

12.
13.
14.

/* El metodo grabarMensaje comienza aqui */


public void grabarMensaje(String mensaje) {

15.
16.

System.out.println("Mensaje grabado: " + mensaje);


this.mensaje = mensaje;

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 200

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

17.
18.
19.

}/* El metodo grabarMensaje termina aqui */

20.
21.
22.

public String getMensajeGrabado() {


System.out.println("Mensaje Saludo: " + mensajeSaludo);
return mensajeSaludo;

23.
24.
25.

}/* El metodo getMensajeGrabado termina aqui */

26.
27.

String recibirMensajeInterlocutor1() {
return(mensajeInterlocutor1);

28.
29.
30.

}/* El metodo recibirMensajeInterlocutor1 termina aqui */

31.
32.
33.

void enviarMensajeInterlocutor1(String mensaje) {


mensajeInterlocutor2 = mensaje;
}/* El metodo enviarMensajeInterlocutor1 termina aqui */

34.
35.
36.

/* El metodo recibirMensajeInterlocutor2 comienza aqui */


String recibirMensajeInterlocutor2() {

/* El metodo getMensajeGrabado comienza aqui */

/* El metodo recibirMensajeInterlocutor1 comienza aqui */

/* El metodo enviarMensajeInterlocutor1 comienza aqui */

37.
38.
39.

return(mensajeInterlocutor2);
}/* El metodo recibirMensajeInterlocutor2 termina aqui */

40.
41.
42.

/* El metodo enviarMensajeInterlocutor2 comienza aqui */


void enviarMensajeInterlocutor2(String mensaje) {
mensajeInterlocutor1 = mensaje;

43.
}/* El metodo enviarMensajeInterlocutor2 termina aqui */
44. }/* Definicion de la clase Telefono termina aqui */
El cdigo Java termina aqu
El segmento de cdigo anterior muestra que la clase Telefono tiene otros mtodos,
son
estos,
recibirMensajeInterlocutor1(),
enviarMensajeInterlocutor1(), etc.
Fin del Ejemplo 5.3
A continuacin se muestra cmo se usa una referencia a una interfaz.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 201


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

5. Usar Interfaces Como Referencias


Se ha visto como declarar una variable que referencia a un objeto de una clase.
Similarmente, se puede tener una variable de tipo interfaz, que referencia a una
instancia de una clase que implementa esa interfaz. Considere el Ejemplo 5.4.
Ejemplo 5.4
El ejemplo muestra como se usa una referencia a una interfaz.
El cdigo Java comienza aqu
1. /* Definicion de la clase InterfazEjemplo comienza aqui */
2. public class InterfazEjemplo {
3.
/* El metodo main comienza aqui */
4.
5.
6.
7.
8.
9.

public static void main(String[] args) {


String mensaje;
ContestadorAutomatico ca = new Telefono();
mensaje = ca.getMensajeGrabado();
ca.grabarMensaje("Llegare a las 11am Pedro");
System.out.println("Mensaje recibido: " + mensaje);

10.
}/* El metodo main termina aqui */
11. }/* Definicion de la clase InterfazEjemplo termina aqui */
El cdigo Java termina aqu
La salida de este programa es la siguiente:
Mensaje Saludo: Regreso despues de las 11pm
Mensaje grabado: Llegare a las 11am Pedro
Mensaje recibido: Regreso despues de las 11pm
En este programa, a pesar que la variable ca se declara del tipo de la interfaz
ContestadorAutomatico, se le asigna el objeto de la clase Telefono. La variable
ca slo puede usarse para acceder a los mtodos definidos por la interfaz
ContestadorAutomatico.
Cualquier otro mtodo definido en la clase Phone no puede ser accedido por la variable
ca, a pesar de que es asignado el objeto de la clase Telefono. El programa dado no
ilustra el poder polimrfico de una variable de referencia de interfaz. Esto se muestra en
el siguiente cdigo:
El cdigo Java comienza aqu
1. /* Definicion de la clase Telefono2 comienza aqui */
2. class Telefono2 implements ContestadorAutomatico{
Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 202

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

3.
4.
5.

String mensaje;
String mensajeSaludo = "Regreso despues de 1 hora";
// . . .

6.
7.
8.

/* El metodo grabarMensaje comienza aqui */


public void grabarMensaje(String mensaje) {

9.
10.
11.

System.out.println(
"Mensaje grabado en Telefono2: " +
mensaje);

12.
13.

this.mensaje = mensaje;
}/* El metodo grabarMensaje termina aqui */

14.
15.
16.

/* El metodo getMensajeGrabado comienza aqui */


public String getMensajeGrabado() {

17.
18.
19.

System.out.println(
"Mensaje Saludo de Telefono2: " +
mensajeSaludo);

20.
return mensajeSaludo;
21.
}/* El metodo getMensajeGrabado termina aqui */
22. }/* Definicion de la clase Telefono2 termina aqui */
23.
24. /* Definicion de la clase InterfazEjemplo2 comienza aqui */
25. public class InterfazEjemplo2 {
26.
27.
28.
29.
30.
31.

/* El metodo main comienza aqui */


public static void main(String[] args) {
String mensaje;
ContestadorAutomatico ca = new Telefono();
mensaje = ca.getMensajeGrabado();

32.
33.
34.

System.out.println("Mensaje recibido: " + mensaje);


ca.grabarMensaje("Nos encontramos a las 11am Pedro");

35.
36.

Telefono2 t2 = new Telefono2();


ca = t2;

37.
38.
39.

mensaje = ca.getMensajeGrabado();
System.out.println("Mensaje recibido: " + mensaje);
ca.grabarMensaje("Nos encontramos a la 1 pm David");

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 203


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

40.
}/* El metodo main termina aqui */
41. }/* Definicion de la clase InterfazEjemplo2 termina aqui */
El cdigo Java termina aqu
La salida del programa es la siguiente:
Mensaje Saludo: Regreso despues de las 11pm
Mensaje recibido: Regreso despues de las 11pm
Mensaje grabado: Nos encontramos a las 11am Pedro
Mensaje Saludo de Telefono2: Regreso despues de 1 hora
Mensaje recibido: Regreso despues de 1 hora
Mensaje grabado en Telefono2: Nos encontramos a la 1 pm David
Del programa anterior se puede ver que la versin de la implementacin de
ContestadorAutomatico llamada depende del tipo de objeto al que la variable ca
est haciendo referencia en tiempo de ejecucin.
Fin del Ejemplo 5.4
Cuando una clase implementa una interfaz, puede escoger proveer implementacin slo
para algunos de los mtodos declarados en la interfaz. Esta clase entonces debe ser
declarada como una clase abstracta, ya que slo se realiza una implementacin parcial
de la interfaz. Se muestra esto con un ejemplo.
Ejemplo 5.5
Este ejemplo ilustra como una clase que provee implementacin parcial de una interfaz,
resulta en una clase abstracta.
El cdigo Java comienza aqu
1. /* Definicion de la clase Telefono3 comienza aqui */
2. abstract public class Telefono3
3.
4.
5.

implements ContestadorAutomatico {
String mensajeSaludo = "Regreso despues de 1 hora";

6.
7.

/* El metodo getMensajeGrabado comienza aqui */

8.
9.
10.

public String getMensajeGrabado() {


System.out.println(
"Mensaje Saludo de Telefono3: " +

11.
12.

mensajeSaludo);
return mensajeSaludo;

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 204

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

13.
}/* El metodo getMensajeGrabado termina aqui */
14. }/* Definicion de la clase Telefono3 termina aqui */
El cdigo Java termina aqu
La clase Telefono3 implementa slo el mtodo getMensajeGrabado() de la
interfaz ContestadorAutomatico. No implementa el mtodo grabarMensaje()
que est definido en la interfaz ContestadorAutomatico. Como Telefono3 slo da
una implementacin parcial de la interfaz ContestadorAutomatico, debe declararse
como una clase abstracta.
Fin del Ejemplo 5.5
Se discute a continuacin qu son las interfaces marcadoras.

5.1 Interfaces Marcadoras


Las interfaces marcadoras son interfaces vacas sin ninguna declaracin de variables o
mtodos. Una clase que implemente una interfaz marcadora no necesita implementar
ningn mtodo, y no tiene acceso a ninguna variable declarada como final en la
interfaz, porque ninguna existe. La clase slo necesita usar la palabra clave
implements, seguida por el nombre de la interfaz marcadora, en su definicin de
clase. Esto permite que la clase tenga la funcionalidad para la cual se define la interfaz.
Serializable y Cloneable son ejemplos de interfaces marcadoras. Si una clase
implementa la interfaz Serializable, sus objetos pueden ser serializados y
deserializados. Si una clase implementa la interfaz Cloneable, puede crear clones
(copias exactas) de objetos de la clase.
A continuacin se explica cmo crear una jerarqua de interfaces.

6. Heredar de una Interfaz


Se puede crear una jerarqua de interfaces (similar a una jerarqua de clases), en la cual
una interfaz puede heredar de otra interfaz usando la palabra reservada extends.
Una clase no puede heredar de una interfaz. Slo una interfaz puede heredar de otra
interfaz. Considere el Ejemplo 5.6 que consta de un programa Java que extiende una
interfaz de una interfaz existente. La interfaz derivada aade sus propias variables y
mtodos.
Ejemplo 5.6
Este ejemplo muestra como una interfaz se extiende de una interfaz existente y aade
variables y mtodos. Asuma que una interfaz K extiende de una interfaz J. Entonces, K
implcitamente obtiene todas las variables y mtodos declarados en J. K puede aadir
sus propias variables y mtodos a las que ha heredado de J.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 205


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

El cdigo Java comienza aqu


1.
2.

interface J {
void metodo1();

3.
4. }
5.

void metodo2();

6. interface K extends J {
7.
void metodo3();
8.
void metodo4();
9. }
10.
11. interface L extends K {
12.
13.
14. }

void metodo4();
void metodo6();

15.
16. interface M {
17.
void metodo6();
18. }
19.
20. /* Definicion de la clase InterfazEjemplo comienza aqui */
21. class InterfazPrueba implements L, M {
22.
/* El metodo metodo1 comienza aqui */
23.
public void metodo1() {
24.
25.

System.out.println("Dentro de metodo1");
}/* El metodo metodo1 termina aqui */

26.
27.
28.

/* El metodo metodo2 comienza aqui */


public void metodo2() {

29.
30.
31.

System.out.println("Dentro de metodo2");
}/* El metodo metodo2 termina aqui */

32.
33.
34.

/* El metodo metodo3 comienza aqui */


public void metodo3() {
System.out.println("Dentro de metodo3");

35.
36.

}/* El metodo metodo3 termina aqui */

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 206

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

37.
38.
39.

/* El metodo metodo4 comienza aqui */


public void metodo4() {
System.out.println("Dentro de metodo4");

40.
41.
42.

}/* El metodo metodo4 termina aqui */

43.
44.
45.

public void metodo6() {


System.out.println("Dentro de metodo6");
}/* El metodo metodo6 termina aqui */

/* El metodo metodo6 comienza aqui */

46. }/* Definicion de la clase InterfazEjemplo termina aqui */


47.
48. /* Definicion de la clase InterfazEjemplo comienza aqui */
49. public class InterfazEjemplo {
50.
/* El metodo main comienza aqui */
51.
52.
53.
54.
55.
56.

public static void main(String[] args) {


InterfazPrueba ip = new InterfazPrueba();
ip.metodo1();
ip.metodo2();
ip.metodo3();
ip.metodo4();

57.
ip.metodo6();
58.
}/* El metodo main termina aqui */
59. }/* Definicion de la clase InterfazEjemplo termina aqui */
El cdigo Java termina aqu
La salida del programa anterior es la siguiente:
Dentro de metodo1
Dentro de metodo2
Dentro de metodo3
Dentro de metodo4
Dentro de metodo6
En este programa, se ve que la interfaz K y la interfaz L declaran el mismo mtodo
metodo4, a pesar que la interfaz L hereda el metodo4 definido por K. Esto es similar
a sobrescribir mtodos en el caso de clases. La clase InterfazPrueba implementa
las interfaces L y M. Esta clase tiene que proporcionar la implementacin de los
mtodos metodo1, metodo2, metodo3, metodo4 y metodo6, ya que la interfaz L
declara implcitamente todos los mtodos anteriores, dado que los hereda de las
interfaces J y K. Tanto la interfaz L como M declaran el mtodo metodo6, sin embargo
Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 207


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

la clase InterfazPrueba tiene que proporcionar slo una implementacin del mtodo
metodo6, de otro modo ocurre un error de compilacin (duplicate method declaration
error). En caso de que la clase InterfazPrueba no proporcione implementacin para
alguno de los mtodos declarados en las interfaces que implementa, entonces tiene que
ser declarada como abstracta.
Fin del Ejemplo 5.6
Una vez discutidas las clases concretas, abstractas y las interfaces, se van a resumir
las opciones de herencia en Java.

7. Opciones de Herencia en Java


Existen tres tipos de opciones de herencia en Java:

Herencia con clases concretas.

Herencia con clases abstractas.

Herencia Implementacin de interfaces.

La Figura 5.12 ilustra las tres opciones de herencia.

Figura 5.12: Opciones de Herencia en Java

Cuando una clase hereda de otra clase concreta, usa la palabra clave extends. La
superclase concreta puede ser instanciada y adems debe implementar todos los
mtodos definidos en ella. La superclase concreta puede tener variables de instancia
definidas en ella.
Cuando una clase hereda de una clase abstracta, usa la palabra reservada extends.
La superclase abstracta no puede ser instanciada, puede proveer implementacin para
algunos de los mtodos definidos en ella, aunque no se requiere que proporcione
implementaciones para ninguno de sus mtodos. La superclase abstracta puede tener
variables de instancia definidas en ella.

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 208

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Cuando una clase implementa una interfaz, usa la palabra reservada implements. Una
clase puede implementar mltiples interfaces. La interfaz no puede ser instanciada y no
provee implementacin para ninguno de los mtodos en ella. La interfaz no puede
definir variables de instancia.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 209


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:

Diferenciar entre herencia y agregacin.

Discutir sobre clases abstractas.

Diferenciar entre clases abstractas y clases concretas.

Describir cmo se definen las clases y mtodos abstractos en Java.

Definir una interfaz.

Explicar cmo las interfaces son implementadas y usadas como referencias.

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 210

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 5: Examen de Autoevaluacin


1) Cul de las siguientes opciones es falsa acerca de los mtodos abstract?
a) Pueden ser accedidos directamente sin crear un objeto de la clase que los
contiene.
b) No se proporciona su implementacin.
c) Su implementacin es proporcionada por sus subclases.
d) Nunca pueden ser invocados.
2) Una clase abstracta debe contener al menos un mtodo abstracto.
a) Verdadero
b) Falso
3) Cul de las siguientes es la forma correcta para crear una referencia a una clase
abstracta X?
a) X x; x = new X();
b) X x = new X();
c) X x;
d) Ninguna de las anteriores
4) La variable de referencia que hace referencia a una clase abstracta puede ser
inicializada con _______.
a) Un objeto de la clase abstracta
b) Un objeto de la subclase de la clase abstracta
c) La clase abstracta
d) La subclase de la clase abstracta
5) Los mtodos abstract de clases pueden estar presentes slo dentro de una
clase abstract.
a) Verdadero
b) Falso
6) Cul de las siguientes son las maneras correctas de declarar una interfaz?
a) public class X implements interface {}
b) public interface X {}
c) interface X{}
d) public X implements interface {}

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 211


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

7) Las interfaces pueden declarar mtodos abstract.


a) Verdadero
b) Falso
8) Cul de las siguientes es sintcticamente correcta cuando se implementa una
interfaz X que declara dos mtodos void m1() y m2()?
a) class Y extends X {
public void m1() {}
public void m2() {}
}
b) class Y implements X {
public void m1() {}
}
c) class Y extends X {
void m1() {}
}
d) class Y implements X {
public void m1() {}
public void m2() {}
}
9) Implcitamente, todas las variables en una interfaz son de la forma final y
static.
a) Verdadero
b) Falso
10) Cul de las siguientes opciones es falsa acerca de una interfaz?
a) Es posible crear una jerarqua de interfaces.
b) Una variable de tipo interfaz puede hacer referencia a un objeto de la clase
que la implementa
c) Una interfaz que contenga un mtodo abstract declarado en ella no debe
tener el modificador abstract en su declaracin.
d) Las interfaces pueden ser instanciadas.

Unidad 5: Clases Abstractas e Interfaces

Libro 1: Core Java 212

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Respuestas a la Unidad 5: Examen de Autoevaluacin


1) a
2) b
3) c
4) b
5) a
6) b y c
7) a
8) d
9) a
10) d

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 213


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 6: Laboratorio de Clases


Abstractas e Interfaces
Objetivos de Aprendizaje
Al final de esta unidad, usted ser capaz de:

Usar clases abstractas.

Usar interfaces.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 215


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Ejercicios de Laboratorio
1) Escribir un programa en Java que tenga una clase abstracta llamada Fotografia
y una interfaz llamada Clicking. La interfaz Clicking tiene los siguientes
mtodos en ella.
Escena marcoFoto(Escena);
Escena focoFoto(Escena);
Camara setAbertura(Camara);
Camara setVelocidadObturador(Camara);
Camara setVelocidadPelicula(Camara);

La clase Escena tiene los atributos ancho, alto, coordenadaX y


coordenadaY. Tiene los mtodos:
void setAncho(int ancho);
void setAlto(int alto);
void setXCoordenada(int xcoord);
void setYCoordenada(int ycoord);
void setEnfoque(int enfoque);

La clase Camara tiene los atributos abertura, velocidadObturador,


velocidadSyn y velocidadPelicula. Tiene el mtodo:
public static void setVelocidadSyn(int velocidadSyn);
int aberturaPrioridad(int abertura); // el int retornado es
usado para establecer velocidadObturador
int velocidadObturadorPrioridad(int velocidadObturador); //
el int retornado es usado para establecer abertura

Dos clases llamadas Canon y Nikon heredan de la clase Camara. La clase


Nikon tiene el mtodo:
void buenaAfinacionVelocidadObturador(int
velocidadObturador);
La clase Canon tiene el mtodo,
void buenaAfinacinAbertura(int abertura);

La clase Fotografia tiene los atributos escena, claridad, contraste y


enfoque y tiene los siguientes mtodos:
// No se proporciona implementacin
abstract Escena capturaEscena(Escena);
void setEnfoque(int enfoque);
void setClaridad(int claridad);
void setContraste(int contraste);

Unidad 6: Laboratorio de Clases Abstractas e Interfaces

Libro 1: Core Java 216

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

La clase MiFotografia hereda de Fotografia. La clase Fotografo


implementa la interfaz Clicking y usa las clases mencionadas para tomar una
fotografa.

Cree una clase Prueba para verificar el funcionamiento de la Camara y el


mtodo de Fotografia.

Libro 1: Core Java

Volumen 2: Programacin Orientada a Objetos 217


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 7: Paquetes
Objetivos de Aprendizaje
Al final de esta unidad, usted ser capaz de:

Definir y crear un paquete.

Explicar cmo se representan los paquetes en el sistema de archivos.

Discutir las protecciones de acceso en los paquetes.

Describir los miembros de los paquetes.

Discutir cmo importar paquetes.

Explicar las variables classpath y describir su uso.

Explicar los paquetes ms usados que vienen incorporados con Java.

Libro 1: Core Java

Unidad 7: Paquetes 219


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

1. Introduccin
En la unidad anterior, se explicaron las clases abstractas e interfaces en Java. En esta
unidad se aprender acerca de cmo las clases e interfaces pueden ser agrupadas
usando el concepto de paquetes.
Los paquetes son un medio para agrupar clases, interfaces y otros paquetes en una
categora particular.
Un paquete Java es como un directorio, permite de una manera segura almacenar una
clase dentro de l.
Un paquete es un contenedor que almacena la funcionalidad relacionada con clases e
interfaces y otros paquetes, proporcionando acceso protegido y manejo de nombres de
espacio. Un paquete es bsicamente un mecanismo provisto por Java que ayuda a
dividir el espacio de nombre de clase en bloques manejables. Es un mecanismo de
denominacin as como de control de visibilidad. Un paquete no puede tener dos clases
con el mismo nombre.
Se va a explicar la necesidad del uso de los paquetes y las tareas involucradas en el
uso de paquetes.

2. Necesidad de los Paquetes


Existen varias razones por las cuales se necesita agrupar clases.

2.1 Conflictos de Nombres


Alrededor del mundo, muchos programadores desarrollan varias clases Java
simultneamente. Un programador puede no estar al tanto de las clases desarrolladas
por otro programador. Por lo que dos o ms programadores pueden desarrollar clases
con el mismo nombre. Existe entonces la posibilidad de un conflicto de nombres entre
clases desarrolladas por diferentes programadores. Considere la Figura 7.1, donde se
muestran dos conjuntos de libreras que tienen ambas una clase Texto, y una
aplicacin MiAplicacion usa ambas libreras.

Unidad 7: Paquetes

Libro 1: Core Java 220

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 7.1: Conflictos de Nombres en Aplicaciones

Cuando se usa la clase Texto en MiAplicacion, el sistema de tiempo de ejecucin


de Java no sabr a cual clase llamar. Para evitar estos conflictos de nombres, las clases
desarrolladas por un programador para una aplicacin especfica pueden ser agrupadas
bajo un cierto paquete.
Los paquetes Java son similares a los nombres de espacio usados en C++. Ellos
eliminan los conflictos de nombres. Asuma que dos libreras diferentes, A y B, tienen el
mismo nombre de clase X. Si se le asigna a cada clase a un paquete diferente, no se
tendrn conflictos de nombres entre las dos libreras.
Las clases se identifican por nombres de paquete, seguidas por el nombre de la clase
en un programa Java. Una clase Documento, por ejemplo en un paquete p se
identifica como p.Documento.

2.2 Clasificacin
Suponga que se tiene que desarrollar varias aplicaciones Java. Se deben crear clases
para realizar operaciones matemticas y operaciones de transferencias de archivos
para estas aplicaciones. Por lo tanto, puede ser til agrupar todas las clases
relacionadas a las funciones matemticas en un paquete y agrupar todas las clases
relacionadas con las transferencias de archivos en otro paquete. Este tipo de
clasificacin no solo nos ayudar a localizar una clase fcilmente, sino que permitir en
forma fcil reutilizar clases entre las aplicaciones Java.

2.3 Despliegue
Asuma que se tiene que desarrollar una aplicacin y entregarla al cliente. La aplicacin
completa comprende varios mdulos y por tanto se tendrn muchos archivos de clases
(.class). Todas las clases requeridas para desplegar un componente en particular de la
aplicacin pueden ser agrupadas bajo un paquete determinado, esto ayudar al
despliegue de los componentes fcilmente.
Libro 1: Core Java

Unidad 7: Paquetes 221


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

2.4 Alcance de Clases Restringido


A veces se quiere encapsular ciertos datos importantes usados por una aplicacin. Para
esto, se tiene que restringir el acceso a las clases que mantienen estos datos. En este
caso, se pueden agrupar todas las clases que mantienen datos en un paquete, y dar
acceso de paquete a los datos. Esto restringir a otras clases de acceder a los datos.
Para resumir, las ventajas provistas por los paquetes se representa en la Figura 7.2.

Figura 7.2: Ventajas de los Paquetes en Java

Ahora se proceder a ver como crear paquetes en Java.

3. Crear Paquetes en Java


El primer paso en la creacin de un paquete es asignarle un nombre que sea
universalmente nico. Sin embargo, asignar un nombre aleatorio y esperar que sea
Unidad 7: Paquetes

Libro 1: Core Java 222

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

universalmente nico no es buena idea, hay ciertos lineamientos que deben seguirse
para nombrar un paquete.

3.1 Nombrar un Paquete


Las guas para nombrar un paquete son:

Los nombres de los paquetes deben ser jerrquicos. El nombre puede contener
ms de una parte separada por puntos.

El nombre de paquete debe comenzar con el nombre de dominio Internet en


reversa. Por ejemplo, las libreras de clases que provee IBM tiene paquetes que
comienzan por com.ibm.

Despus se aade el nombre del departamento interno al cual el paquete


pertenece. Por ejemplo, IBM Learning Services (ILS) se aade a com.ibm.
Ahora el nombre del paquete es com.ibm.ils.

Despus, el nombre de la aplicacin se aade al nombre del paquete. Por


ejemplo, com.ibm.ils.examen.

Nota: El nombre del paquete no tiene ninguna letra en mayscula. Aunque se


permiten las letras maysculas, es por convencin el tener todas las letras en
minsculas.
En el ejemplo anterior, el paquete exam puede contener varias clases o interfaces
relacionadas funcionalmente. Puede existir otro paquete dentro de ils llamado
monitor. Este llevar el nombre de com.ibm.ils.monitor. As, ambos examen y
monitor estarn al mismo nivel en la jerarqua de nombres del paquete.

3.2 Declaracin de Paquetes


Un paquete es declarado con la palabra reservada package. Una declaracin de
paquete debe ser la primera instruccin en el archivo fuente Java cuando se crea un
paquete. Usar la declaracin de paquete al inicio del archivo asegura que todas las
clases definidas dentro del archivo sern parte del paquete nombrado.
Una instruccin de paquete define un espacio de nombres para almacenar clases.
Cuando la instruccin de paquete es eliminada del archivo, los nombres de clases son
colocados en el paquete por defecto (default package). El paquete por defecto no tiene
nombre y no es til, por lo general, para aplicaciones finales. Se pueden usar el paquete
por defecto para correr programas de prueba. La siguiente es la forma general de la
instruccin de paquete:
package directorio;
En esta instruccin, el nombre del paquete creado es directorio. Tambin, un
programador puede crear una jerarqua de paquetes. Esto puede hacerse dividiendo el
nombre del paquete desde el paquete superior de uno directamente por encima, usando
un punto (.).
La siguiente es la forma de una instruccin de paquete multinivel:
Libro 1: Core Java

Unidad 7: Paquetes 223


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

package directorio.lista.miembros;
Cuando se especifica un nombre de paquete en un archivo, todas las clases definidas
en el archivo pertenecen al paquete especificado. No es obligatorio tener una
instruccin de paquete antes de toda definicin de clase. Sin embargo, un archivo
solamente puede tener una instruccin de paquete.
Dentro de un programa Java, la instruccin de paquete aparece antes de las
instrucciones import, que se usan para importar las clases requeridas por la
aplicacin, como se muestra en la Figura 7.3.

Figura 7.3: Declaracin de Paquete en un Archivo Java

En la Figura 7.3, el paquete com.ibm.ils.examen.dominio contiene la clase


PreguntaExamen. La figura ilustra solo una clase en el paquete. Sin embargo, puede
haber ms de una clase definida en un paquete. Todas las clases definidas, entonces,
pertenecen al mismo paquete com.ibm.ils.examen.dominio.
A continuacin se discute como los paquetes se representan en el sistema de archivos.

4. Representacin del Paquete en el Sistema de


Archivos
Los paquetes se almacenan usualmente en directorios del sistema de archivos. Ellos
estn directamente relacionados a la estructura fsica de las carpetas. Por ejemplo,
considere la clase C, que pertenece a un paquete, x.y a travs de la siguiente
instruccin:
package x.y;
public class C {
Unidad 7: Paquetes

Libro 1: Core Java 224

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

}
La clase C es compilada y colocada en la carpeta X\Y\ bajo algn directorio en el
sistema, por ejemplo:
C:\Ejemplos\x\y\C.class
As, los paquetes corresponden a la estructura fsica de carpetas. Una excepcin a esto
es cuando las clases son empaquetadas dentro de archivos JAR. Se aprender acerca
de archivos JAR en la Unidad 9 Caractersticas Avanzadas del Volumen 8.
El nombre del directorio debe coincidir con el nombre del paquete letra por letra. Esta
correspondencia es sensible a maysculas y minsculas.
Ms de un archivo puede incluir la misma instruccin de paquete, porque la instruccin
de paquete simplemente indica donde las clases definidas pertenecen, y no evita que
otras clases en otros archivos pertenezcan al mismo paquete. Las clases en los
desarrollos del mundo real estn usualmente repartidas en varios archivos. Por ejemplo,
considere el siguiente fragmento de cdigo:
package x.y;
public class AA {
}
class BB {
}
class CC {
}
Este cdigo se almacenar en un archivo llamado AA.class, que es diferente del
anterior C.class, pero ambos tienen la misma instruccin de paquete al comienzo, y
AA.class estar presente en la carpeta fsica C:\Ejemplos\x\y\. As, es posible
tener cualquier nmero de archivos con diferentes definiciones de clases perteneciendo
al mismo paquete. Todo lo que se necesita es el mismo nombre de paquete al inicio del
archivo.
Los paquetes pueden ser comparados a los directorios usados para almacenar archivos
en el sistema de archivos de un sistema de operativo. En el sistema de archivos, es
posible tener subdirectorios dentro de un directorio. Pueden existir subdirectorios con el
mismo nombre bajo diferentes directorios. Sin embargo, no se pueden tener dos
subdirectorios con el mismo nombre bajo un mismo directorio. Reglas similares son
aplicables para los paquetes.
Considere la Figura 7.4, que representa los paquetes en el directorio en forma de rbol.
El paquete representado en la figura es com.ibm.libreria.a, este paquete tiene dos
archivos: Texto.java y Texto.class.

Libro 1: Core Java

Unidad 7: Paquetes 225


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Figura 7.4: Representacin de Paquete en el Sistema de Archivos

Asuma que hay un directorio llamado Root que tiene un subdirectorio llamado
MiDirectorio, que a su vez tiene otro subdirectorio llamado MiSubDirectorio.
Este subdirectorio tiene un archivo llamado miArchivo.txt. Se puede representar
esta estructura como sigue:
Root\MiDirectorio\MiSubDirectorio\miArchivo.txt
Considere una estructura de paquete que tenga un paquete raz com que tiene un
subpaquete ibm, que a su vez tenga otro subpaquete libreria, con dos subpaquetes
a y b. Esta estructura de paquete se puede representar como:
com.ibm.libreria.a
com.ibm.libreria.b
A continuacin se estudia como referenciar a las clases definidas en los paquetes.

4.1 Referencia a las Clases Definidas en los Paquetes


En un programa Java, si se quiere usar una clase ubicada en un paquete en particular,
se debe usar con el nombre completamente calificado, usando el nombre del paquete.
Considere dos clases, ambas llamadas Texto que estn en dos paquetes diferentes,
como se presenta a continuacin:
com.ibm.libreria.a
com.ibm.libreria.b
Estas dos clases son distintas y pueden contener dos implementaciones diferentes. Se
debe referir a estas clases dentro del programa Java, como sigue:
com.ibm.libreria.a.Texto
com.ibm.libreria.b.Texto
Esto se representa en la Figura 7.5.
Unidad 7: Paquetes

Libro 1: Core Java 226

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 7.5: Referencia a Clases por su Nombre de Paquete

El programador tiene que tener en cuenta que la jerarqua de paquete tambin tiene que
ser mantenida en el sistema de archivos del desarrollo en Java.
Ahora, se estudiar como los paquetes ayudan a proteger el acceso a las clases.

5. Paquetes y Proteccin de Acceso


Los paquetes y las clases son maneras de encapsular datos importantes. Los paquetes
encapsulan varias clases y las clases encapsulan variables y mtodos. Como hemos
mencionado, los paquetes son receptculos para las clases y los sub paquetes que son
parte de l, mientras que las clases mantienen datos y cdigo.
La visibilidad y la accesibilidad de los miembros de clase se ubican en una de las
siguientes cuatro categoras:

Sub-clases presentes en el mismo paquete.

No sub-clases presentes en el mismo paquete.

Sub-clases presentes en diferentes paquetes.

Clases no relacionadas presentes en diferentes paquetes.

Existen diversas formas de producir los diferentes niveles de acceso requeridos por las
categoras antes descritas.
Los tres especificadores de acceso, private, public y protected, proveen los
diferentes niveles de acceso. Cualquier miembro de clases declarado como public
puede ser accedido desde cualquier sitio.

Libro 1: Core Java

Unidad 7: Paquetes 227


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Un miembro en una clase sin especificacin de acceso explcita ser visible a las
subclases y otras clases dentro del mismo paquete. Cuando un elemento se declara
protected, ser visible fuera del paquete actual, pero slo para las clases que son
subclases de la clase actual. Cualquier miembro de clases declarado como private
no ser visto fuera de su clase. Estos modificadores de acceso aplican a los miembros
de las clases.
Una clase (no anidada) solo tiene dos posibles niveles de acceso: default y public.
Cuando no se indica el modificador de acceso en la declaracin de la clase, implica que
el nivel de acceso es el acceso por defecto. De aqu que todas las clases que son parte
del paquete donde la clase esta presente, tienen acceso al cdigo de esa clase. Si una
clase es declarada como public, puede ser accedida por cualquier cdigo fuera del
paquete. No se puede declarar una clase (no anidada) como protected o private.
Considere la Figura 7.6, donde se muestra un conjunto de clases en paquetes
diferentes.

Figura 7.6: Clases en Paquetes Diferentes

En la figura anterior se definen cinco clases dentro de dos paquetes,


com.ibm.ils.control y com.ibm.ils.modelo. Las clases A, B, y E estn en
com.ibm.ils.control y las clases C y D, en com.ibm.ils.modelo. La clase A
tiene cuatro mtodos con diferentes niveles de acceso, especificados por los
modificadores de acceso public, protected y private. A continuacin se explicar
cul de estos cuatro mtodos puede ser accedido desde las clases A, B, C, D y E.
Unidad 7: Paquetes

Libro 1: Core Java 228

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Desde la clase A los cuatro mtodos pueden ser accedidos: uno(), dos(),
tres() y cuatro().
Desde la clase B tres mtodos pueden accederse: uno(), dos(), y tres().
Desde la clase C dos mtodos pueden accederse: uno() y dos().
Desde la clase D solo un mtodo puede accederse: uno().
Desde la clase E tres mtodos pueden accederse: uno(), dos(), y tres().
Los mtodos declarados como protected en la clase A pueden accederse por
clases que sean subclases de A.

Se presenta un ejemplo para entender mejor los especificadores de acceso.


Ejemplo 7.1
El siguiente programa ilustra el efecto de diferentes especificadores de acceso sobre
clases en diferentes paquetes.
El cdigo Java comienza aqu...
1.
2.

package paquete1;

3. /* Definicion de la clase MiClase comienza aqui */


4. public class MiClase {
5.
6.
7.

int variableDePaquete = 10;


private int variablePrivada = 20;
protected int variableProtegida = 30;

8.
9.
10.

public int variablePublica = 40;

11.
12.
13.

public MiClase() {
System.out.println(
"Dentro del constructor de MiClase");

/* Constructor MiClase comienza aqui */

14.
15.
16.

System.out.println(
"variableDePaquete = " + variableDePaquete);
System.out.println(

17.
18.
19.

"variablePrivada = " + variablePrivada);


System.out.println(
"variableProtegida = " + variableProtegida);

20.
21.
22.

System.out.println(
"variablePublica = " + variablePublica);
}/* Constructor MiClase termina aqui */

23. }/* Definicion de la clase MiClase termina aqui */

Libro 1: Core Java

Unidad 7: Paquetes 229


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

24. package paquete1;


25.
26. /* Definicion de la clase comienza aqui */
27. public class DeribadaDelMismoPaquete extends MiClase {
28.
/* Constructor DeribadaDelMismoPaquete comienza aqui */
29.
30.
31.
32.
33.

public DeribadaDelMismoPaquete() {
System.out.println(
"Dentro del constructor de DeribadaDelMismoPaquete");
System.out.println(

34.
35.
36.

"variableDePaquete = " + variableDePaquete);


/* Las variables private son accesibles

37.
38.
39.

* solo dentro de la misma clase */


// System.out.println(
//
"variablePrivada = " + variablePrivada);

40.
41.
42.

System.out.println(
"variableProtegida = " + variableProtegida);

43.
44.
45.

System.out.println(
"variablePublica = " + variablePublica);

46.
}/* Constructor DeribadaDelMismoPaquete termina aqui */
47. }/* Definicion de la clase termina aqui */
48. package paquete1;
49.
50. /* Definicion de la clase comienza aqui */
51. public class SinRelacionDelMismoPaquete {
52.
/* Constructor SinRelacionDelMismoPaquete comienza aqui */
53.
public SinRelacionDelMismoPaquete() {
54.
55.
56.
57.
58.
59.

MiClase mc = new MiClase();


System.out.println(
"Dentro del constructor de " +
"SinRelacionDelMismoPaquete");
System.out.println(

Unidad 7: Paquetes

Libro 1: Core Java 230

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

60.
61.
62.

"variableDePaquete = " + mc.variableDePaquete);


/* Las variables private son accesibles

63.
64.
65.

* solo dentro de la misma clase */


// System.out.println(
//
"variablePrivada = " + mc.variablePrivada);

66.
67.
68.

System.out.println(
"variableProtegida = " + mc.variableProtegida);

69.
70.

System.out.println(

71.
"variablePublica = " + mc.variablePublica);
72.
}/* Constructor SinRelacionDelMismoPaquete termina aqui */
73. }/* Definicion de la clase termina aqui */
74. package paquete2;
75.
76. import paquete1.*;
77.
78. /* Definicion de la clase comienza aqui */
79. public class DeribadaDeDiferentePaquete extends MiClase{
80.
/* Constructor DeribadaDeDiferentePaquete comienza aqui */
81.
public DeribadaDeDiferentePaquete() {
82.
83.
84.

System.out.println(
"Dentro del constructor de " +
"DeribadaDeDiferentePaquete");

85.
86.
87.

/* Las variables Package son accesibles solo dentro


* de la misma clase o dentro del mismo paquete */

88.
89.
90.

//System.out.println(
//
"variableDePaquete = " + variableDePaquete);

91.
92.

/* Las variables private son accesibles


* solo dentro de la misma clase */

93.
94.
95.

// System.out.println(
//
"variablePrivada = " + variablePrivada);

96.

System.out.println(

Libro 1: Core Java

Unidad 7: Paquetes 231


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

97.
98.
99.

Gua del Estudiante

"variableProtegida = " + variableProtegida);


System.out.println(

100.
"variablePublica = " + variablePublica);
101.
}/* Constructor DeribadaDeDiferentePaquete termina
*/
102. }/* Definicion de la clase termina aqui */

aqui

103. package paquete2;


104.
105. import paquete1.*;
106.
107. /* Definicion de la clase comienza aqui */
108. public class SinRelacionDeDiferentePaquete {
109.
/*
Constructor
SinRelacionDeDiferentePaquete
aqui*/
110.
public SinRelacionDeDiferentePaquete() {
111.
MiClase mc = new MiClase();

comienza

112.
113.
114.

System.out.println(
"Dentro del constructor de " +
"SinRelacionDeDiferentePaquete");

115.
116.
117.

/* Las variables Package son accesibles solo dentro


* de la misma clase o dentro del mismo paquete */

118.
119.
120.

//System.out.println(
//
"variableDePaquete = " + mc.variableDePaquete);

121.
122.
123.

/* Las variables private son accesibles


* solo dentro de la misma clase */
// System.out.println(

124.
125.

//

126.
127.
128.

/* Las variables protected son accesibles dentro de


* la misma clase o dentro del mismo paquete o dentro
* de una la clase derivada */

129.
130.
131.

//System.out.println(
//
"variableProtegida = " + mc.variableProtegida);

"variablePrivada = " + mc.variablePrivada);

Unidad 7: Paquetes

Libro 1: Core Java 232

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

132.
System.out.println(
133.
"variablePublica = " + mc.variablePublica);
134.
}/*
Constructor
SinRelacionDeDiferentePaquete
aqui*/
135. }/* Definicion de la clase termina aqui */

termina

136. package paquete1;


137.
138. /* Definicion de la clase MainPaquete1 comienza aqui */
139. public class MainPaquete1 {
140.
/* El metodo main comienza aqui */
141.
142.
143.
144.
145.

public static void main(String[] args) {


MiClase mc = new MiClase();
DeribadaDelMismoPaquete dmp =
new DeribadaDelMismoPaquete();
SinRelacionDelMismoPaquete srm =

146.
new SinRelacionDelMismoPaquete();
147.
}/* El metodo main termina aqui */
148. }/* Definicion de la clase MainPaquete1 termina aqui */
149. package paquete2;
150.
151. /* Definicion de la clase MainPaquete2 comienza aqui */
152. public class MainPaquete2{
153.
/* El metodo main comienza aqui */
154.
155.
156.

public static void main(String[] args) {


DeribadaDeDiferentePaquete ddp =
new DeribadaDeDiferentePaquete();

157.
158.
159.

SinRelacionDeDiferentePaquete srd =
new SinRelacionDeDiferentePaquete();
}/* El metodo main termina aqui */

160. }/* Definicion de la clase MainPaquete2 termina aqui */


El cdigo Java termina aqu
Al ejecutar el programa MainPaquete1.java se obtiene la siguiente salida:
Dentro del constructor de MiClase
variableDePaquete = 10
variablePrivada = 20
Libro 1: Core Java

Unidad 7: Paquetes 233


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

variableProtegida = 30
variablePublica = 40
Dentro del constructor de MiClase
variableDePaquete = 10
variablePrivada = 20
variableProtegida = 30
variablePublica = 40
Dentro del constructor de DeribadaDelMismoPaquete
variableDePaquete = 10
variableProtegida = 30
variablePublica = 40
Dentro del constructor de MiClase
variableDePaquete = 10
variablePrivada = 20
variableProtegida = 30
variablePublica = 40
Dentro del constructor de SinRelacionDelMismoPaquete
variableDePaquete = 10
variableProtegida = 30
variablePublica = 40

Al ejecutar el programa MainPquete2.java se obtiene la salida:


Dentro del constructor de MiClase
variableDePaquete = 10
variablePrivada = 20
variableProtegida = 30
variablePublica = 40
Dentro del constructor de DeribadaDeDiferentePaquete
variableProtegida = 30
variablePublica = 40
Dentro del constructor de MiClase
variableDePaquete = 10
variablePrivada = 20
variableProtegida = 30
variablePublica = 40
Dentro del constructor de SinRelacionDeDiferentePaquete
variablePublica = 40
Unidad 7: Paquetes

Libro 1: Core Java 234

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

De esta salida se puede ver que el constructor de la clase MiClase se invoca cada vez
que una clase intenta acceder a sus variables, sea una subclase o una clase no
relacionada.
Fin del Ejemplo 7.1
Se va a discutir a continuacin cmo usar las clases definidas en el mismo paquete.

6. Usar Miembros de Paquetes


Slo los miembros pblicos de un paquete son accesibles fuera del paquete en el que
estn definidos. Para acceder a un miembro pblico del paquete desde fuera de su
paquete, se debe seguir alguno de los siguientes pasos:

Referirse al miembro por su nombre completamente calificado como


com.ibm.ils.examen.dominio, en vez de solo dominio

Importar el miembro del paquete.

Importar el paquete completo del miembro.

Cada uno de los procedimientos dados se ajusta a un tipo particular de situacin.


Usualmente, las clases son referidas por sus nombres cortos, es decir, el nombre
especificado en su declaracin. Estos nombres se pueden usar en situaciones donde la
clase que se est usando est presente en el mismo paquete que la clase actual, o si el
miembro del paquete se ha importado.
Sin embargo, considere una situacin donde se quiere usar un miembro perteneciente a
un paquete diferente, que no ha sido importado. En tales situaciones, el nombre largo
del miembro debe usarse.
Considere una situacin en la que se quiere usar la clase LinkedList, pero sin haber
importado el paquete java.util.*. En ese caso, se tiene que usar el nombre largo de
la clase LinkedList, como se muestra a continuacin:
java.util.LinkedList ll = new java.util.LinkedList();
A pesar de que los nombres largos hacen a un programa ms difcil de leer y escribir.
Se puede solventar, a travs del siguiente enfoque que se va a considerar donde se
importan todas las clases definidas en un paquete en particular.

6.1 Importar un Paquete


Las clases estndar se almacenan en paquetes con nombres, ninguna clase estndar
existe en el paquete por defecto. Si se quiere invocar a las clases con sus nombres de
paquetes, se tiene que ingresar el nombre largo para cada clase. Para evitar esto, Java
tiene la sentencia import, con lo que se puede referenciar ciertas clases, o inclusive
paquetes enteros.

Libro 1: Core Java

Unidad 7: Paquetes 235


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Una vez que la clase es importada, puede ser referida directamente por su nombre.
Debe tenerse en cuenta, sin embargo, que la sentencia import no es obligatoria para
el programador, es un mtodo conveniente de programacin.
En un archivo fuente de Java, la instruccin import viene inmediatamente despus de
la instruccin package, y antes de cualquier definicin de clase. A continuacin se da la
forma general de la instruccin import:
import paquete1[.paquete2].(nombreClase/*);
Aqu, paquete1 es el nombre del paquete de ms alto nivel y paquete2, es un
paquete subordinado dentro del paquete externo. La jerarqua de paquetes no tiene un
lmite de profundidad en la prctica, ms que el que impone el sistema de archivos.
Despus de paquete2, un nombre de clase explcito o (*) se especifica. Esto indica
que el compilador Java debe importar la clase especificada o el paquete completo.
Puede usarse en cualquiera de las siguientes formas, como se muestra a continuacin:
import java.util.Random;
o
import java.util.*;
En Java 5.0, se puede importar tanto las variables estticas como los mtodos estticos
que posee una clase. Esto nos ahorra colocar como prefijo el nombre de la clase que
posee la variable o mtodo esttico. A continuacin, se presenta un ejemplo.
Ejemplo 7.2
El siguiente programa ilustra el uso del import esttico.
El cdigo Java comienza aqu...
1.

import static java.lang.Math.*;

2.
3. /* Definicion de la clase Principal comienza aqui */
4. public class Principal {
5.
6.
7.
8.
9.
10.

/* El metodo main comienza aqui */


public static void main(String[] args) {
System.out.print("PI(");
System.out.print(PI);
System.out.print(") elevado a la 2 es: ");
System.out.println(pow(PI, 2));

11.
}/* El metodo main termina aqui */
12. }/* Definicion de la clase Principal termina aqui */
La salida del cdigo anterior es esta:
PI(3.141592653589793) elevado a la 2 es: 9.869604401089358
Unidad 7: Paquetes

Libro 1: Core Java 236

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

El cdigo Java termina aqu


Se puede ver que no fue necesario colocar la clase Math para hacer uso de la variable
esttica PI y del mtodo esttico pow.
Fin del Ejemplo 7.2
Un punto importante a tener en cuenta es que el uso del mtodo asterisco import
java.util.* puede incrementar el tiempo de compilacin, a pesar de que no afecta
en ninguna forma el rendimiento en tiempo de ejecucin o el tamao de la clase. Esto
es especialmente cierto si el usuario tiene que importar grandes paquetes. Por lo tanto,
puede ser mejor nombrar las clases a ser usadas en vez de importar paquetes
completos.
Considere que se quiere usar las clases Vector y Random del paquete java.util.
Como se discuti no ser eficiente importar todas las clases del paquete java.util.
En vez de eso, se pueden importar slo las clases Vector y Random del paquete
java.util, como se muestra a continuacin:
import java.util.Vector;
import java.util.Random;
Todas las clases estndar incluidas en Java son guardadas en un paquete llamado
java. Las funciones bsicas del lenguaje son guardadas en otro paquete llamado
java.lang. Usualmente, cada paquete/clase a ser usado tiene que ser importado,
pero el compilador implcitamente importa java.lang para todos los programas. Esto
es porque los programas Java, no pueden ejecutarse sin la funcionalidad de
java.lang.
El formato general para importar java.lang se da a continuacin:
import java.lang.*
Asuma que se quiere importar una clase cuyo nombre es el mismo que otra, existente
en un paquete diferente. Considere el caso de la clase Date que est disponible en
java.util y java.sql. Cuando las clases Date definidas en los dos paquetes se
usa dentro del mismo programa, ocurre un conflicto de nombres. El compilador Java se
confunde entre las dos clases. Para evitar esto, hay que referirse a estas dos clases a
travs de sus nombres completamente calificados, especificando tambin la jerarqua
del paquete, como sigue:
java.util.Date
java.sql.Date
Observe el Ejemplo 7.3 para ver como el nombre del paquete se usa junto con el
nombre de la clase durante la creacin de una instancia de la clase.
Ejemplo 7.3

Libro 1: Core Java

Unidad 7: Paquetes 237


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Se usaran clases contenidas en diferentes paquetes para ilustrar lo que se discuti


anteriormente.
El cdigo Java comienza aqu...
1.

package paquete1;

2.
3. /* Definicion de la clase A comienza aqui */
4. public class A {
5.
6.

String mensaje = "Clase en paquete1";


public A() {

7.
System.out.println("Mensaje: " + mensaje);
8.
}
9. }/* Definicion de la clase A termina aqui */
10. package paquete2;
11.
12. /* Definicion de la clase B comienza aqui */
13. public class B {
14.
String mensaje = "Clase en paquete2";
15.
16.
17.

public B() {
System.out.println("Mensaje: " + mensaje);
}

18. }/* Definicion de la clase B termina aqui */


19. package paquete3;
20.
21. import paquete1.A;
22.
23. /* Definicion de la clase Principal comienza aqui */
24. public class Principal {
25.
26.
27.
28.
29.
30.

/* El metodo main comienza aqui */


public static void main(String[] args) {
/* Uso del nombre largo de la clase B */
paquete2.B objPaquete2 = new paquete2.B();
/* Uso del nombre de la clase A sin su paquete */
A objA = new A();

31.
}/* El metodo main termina aqui */
32. }/* Definicion de la clase Principal termina aqui */
Unidad 7: Paquetes

Libro 1: Core Java 238

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

El cdigo Java termina aqu


Se puede ver del programa anterior en la lnea 3 de la clase Principal la sentencia
import paquete1.A;, esto permite luego en la lnea 9 usar el solo el nombre de la
clase para acceder a ella. Por otro lado, a pesar de que no hay una sentencia import
para la clase B del paquete paquete2, en la lnea 10 se puede acceder a esta clase
usando su nombre largo paquete2.B.
Fin del Ejemplo 7.3
A continuacin se discute el empaquetado de paquetes que permite preservar la
estructura de paquetes. El empaquetamiento de paquetes es til durante el despliegue.

7. Agrupar Paquetes
Las clases Java se almacenan en paquetes en aplicaciones de tiempo real, estos
paquetes usan una estructura de rbol de directorios cuando son instalados. Es difcil
almacenar y manejar esta estructura de rbol del directorio de rbol debido a los
aspectos de almacenamiento y rendimiento a considerar. Por esto, la estructura de
rbol de directorios se almacena dentro de un archivo plano que preserva la estructura
del directorio. Los cargadores de clase, en el momento de cargar las clases
empaquetadas, extraen la estructura de rbol del directorio desde el archivo plano.
El empaquetado (archives) es ventajoso porque permite reducir los tiempos de carga de
las clases. Comprimen las clases y por tanto ocupan menos memoria; adicionalmente
permite tener una unidad pequea y sencilla para el despliegue (un nico archivo de
empaquetado).
El empaquetado que soporta la mayora de los ambientes de desarrollo Java es el JAR.
La mayora de las caractersticas de los JAR son similares a las de los archivos TAR
usados en UNIX. JAR comprime los datos usando un formato ZIP, que pueden ser
visualizados usando WinZip.
El cargador de clases de Java sabe como buscar otros dos tipos de empaquetados
archivos zip y cab. Pkzip, Winzip y otros programas crean archivos zip. Los archivos cab
son creados con el utilitario de Microsoft MAKECAB. cab es un acrnimo para archivos
cabinet, estos archivos se usan normalmente cuando se trabaja con la implementacin
Java de Microsoft, JView.
A continuacin se discute cmo el paquete es desplegado.

8. Despliegue de Paquetes
Un paquete puede ser desplegado como una nica unidad. Se puede tambin
empaquetar varios paquetes y desplegarlos juntos. Si un paquete tiene miembros
interdependientes con otros paquetes, entonces stos miembros interdependientes
deben ser desplegados juntos.
Libro 1: Core Java

Unidad 7: Paquetes 239


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Si una aplicacin la componen varios paquetes, la aplicacin o el servidor de


aplicaciones actuar como un objetivo para el despliegue. Los objetivos para el
despliegue pueden referirse a cualquier directorio o empaquetado para localizar
miembros de un paquete.
El cargador de clases de la aplicacin especifica los miembros de paquetes a travs de
un classpath. Se puede especificar el classpath mediante una variable de
ambiente (environment). Las Figuras 7.7 y 7.8 muestran como definir el classpath
usando una variable de ambiente.

Figura 7.7: La Caja de Dilogo de Propiedades de Sistema en Windows 2000

Unidad 7: Paquetes

Libro 1: Core Java 240

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Figura 7.8: Definicin del classpath Usando la Variable de Ambiente

Bajo ambiente Linux, se procede a crear la variable de ambiente de la siguiente forma:

Edite el archivo ~/.bash_profile, donde ~ significa la ruta al directorio home


del usuario. Ejemplo: /home/estudiante1

En el archivo agregamos la siguiente lnea.

export CLASSPATH=ruta1:ruta2
Donde ruta1 y ruta2, se sustituyen por las rutas especficas de los paquetes que se
deseen incluir. Ntese que cada ruta esta separada por el carcter :
Tambin se puede especificar el classpath usando las opciones cp o classpath,
como sigue:
java cp c:\ilscs01\lib com.ibm.ils.prueba.EjecutarExamen
Esto ejecutar el mtodo main de la clase EjecutarExamen en el paquete
com.ibm.ils.prueba. El cargador de la clase buscar el paquete en
c:\ilscs01\lib.
Libro 1: Core Java

Unidad 7: Paquetes 241


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Existen varios tipos de despliegue que una aplicacin Java puede usar. El tipo de
despliegue puede ser un subrbol de directorio, un jar o un zip. Los archivos de
clase (.class) pueden existir en el directorio, o como un archivo zip o como un archivo
JAR. Las tres opciones se pueden usar en la misma aplicacin Java y no necesitan
estar en el mismo directorio, siempre que estn disponibles en el classpath.
Se ha introducido el trmino classpath. Se va a aprender qu son y qu hacen en la
prxima seccin.

8.1 Qu es el classpath?
Un classpath almacena la ubicacin particular que ser usada por Java como la raz
de la jerarqua de paquetes. Aunque los paquetes resuelven problemas desde el punto
de vista de control de acceso y conflictos de nombres, tambin crean dificultades al
compilar y ejecutar programas.
Usualmente los programadores mantienen todas las clases en el paquete por defecto
(sin nombre). Esto les permite compilar el cdigo fuente y luego ejecutar el intrprete de
Java usando el nombre de la clase en la lnea de comandos. El paquete por defecto se
hace corresponder con la carpeta fsica que est en el directorio actual de trabajo
Esto es factible debido a que el directorio actual de trabajo, por defecto (.), est
usualmente en la variable de entorno classpath, que es definida por defecto por el
sistema de tiempo de ejecucin de Java. No sucede lo mismo con paquetes.
Asuma que un programador crea una clase llamada MiClase en el paquete
miDirectorio. Idealmente, la estructura de directorios debe coincidir con el nombre
del paquete. Por lo tanto, el programador crea un directorio llamado miDirectorio
bajo el directorio actual, para guardar el archivo MiClase.java en l. Luego compila
MiClase.java despus de hacer a miDirectorio su directorio actual.
MiClase.class est ahora guardado en miDirectorio. Ahora, cuando se ejecuta
MiClase, se muestra el siguiente mensaje de error:
Exception in thread "main" java.lang.NoClassDefFoundError: MiClase (wrong name:
miDirectorio/MiClase).
Esto ocurre porque la clase ahora est almacenada en un paquete llamado
miDirectorio, y ya no puede ser llamada simplemente MiClase.
En vez de eso, tiene que ser referida nombrando su jerarqua de paquetes, es decir,
como miDirectorio.MiClase. Sin embargo, an esto mostrar un mensaje de error:
Exception in thread "main" java.lang.NoClassDefFoundError:
miDirectorio/MiClase.
La razn para esto estriba en la definicin de la variable classpath del sistema del
programador. El classpath, como se sabe, establece el tope de la jerarqua de clase.
Unidad 7: Paquetes

Libro 1: Core Java 242

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

En este caso, no existe un directorio llamado miDirectorio en el directorio actual de


trabajo debido a que el directorio actual del programador es miDirectorio.
Ante esta coyuntura, el programador puede hacer una de dos cosas: ya sea aadir el
tope de su jerarqua de clases de desarrollo a la variable classpath. Por ejemplo, si
miDirectorio
es
un
subdirectorio
de
C:\Java\Ejemplos,
entonces
C:\Java\Ejemplos se debe aadir a la variable classpath. El otro mtodo es
cambiar de directorio, subiendo un nivel, y luego usar java miDirectorio.MiClase
o java miDirectorio/MiClase en la lnea de comandos para ejecutar el programa.
Esto le permite al programador usar java miDirectorio.MiClase sin importar el
valor de la variable de ambiente.
Observe el Ejemplo 7.4.
Ejemplo 7.4
El siguiente programa ilustra los conceptos involucrados en torno al usar paquetes en
Java.
El cdigo Java comienza aqu...
1.
2.

package inversiones;

3. /* Definicion de la clase Interes comienza aqui */


4. class Interes {
5.
/* El metodo calcularInteres comienza aqui */
6.
7.
8.
9.
10.
11.

float calcularInteres(
float principio,
float anos,
float tarifa) {
return (float) principio * anos * tarifa / 100;

12.
}/* El metodo calcularInteres termina aqui */
13. }/* Definicion de la clase Interes termina aqui */
14. package inversiones;
15.
16. /* Definicion de la clase Inversionista comienza aqui */
17. public class Inversionista {
18.
/* El metodo main comienza aqui */
19.
public static void main(String[] args) {
20.
21.

float p, a, t, si;
p = (float) (Math.random() * 100000);

Libro 1: Core Java

Unidad 7: Paquetes 243


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

22.
23.
24.

a = (float) (Math.random() * 10);


t = (float) (Math.random() * 20);

25.
26.
27.

Interes in = new Interes();


si = in.calcularInteres(p, a, t);

28.
29.
30.

System.out.println("Principio: " + p);


System.out.println("Numero de anos: " + a);
System.out.println("Tarifa de interes: " + t);

31.
32.

System.out.println("Interes simple: " + si);


}/* El metodo main termina aqui */

33. }/* Definicion de la clase Inversionista termina aqui */


El cdigo Java termina aqu
El programa anterior calcula el inters simple cuando se da el monto principal, el
nmero de aos de inversin y la tasa de inters. El mtodo random() disponible en la
clase Math del paquete java.lang se usa para generar nmeros aleatorios. Se debe
importar el paquete java.lang al inicio del programa para poder acceder a la clase
Math disponible en el paquete. Sin embargo, el compilador de Java importa
implcitamente el paquete java.lang en tiempo de compilacin de cualquier programa
Java. Por lo tanto, no se necesita importar el paquete java.lang para que el programa
trabaje.
Ahora se compila y ejecuta el programa para ver cmo trabaja. Despus de escribir el
programa, se tiene que guardar en un directorio llamado inversiones, que es creado
como un subdirectorio del directorio actual. Luego se puede compilar el programa de
dos formas. Se puede compilar el programa desde el directorio inversiones como
sigue:
javac Inversionista.java
Otra forma, es compilarlo desde un directorio un nivel superior al directorio
investments como sigue:
javac inversiones/Inversionista.java
Despus que el programa es compilado exitosamente, se debe ir un nivel superior del
directorio inversiones para ejecutar el programa y dar el siguiente comando en la
lnea de comandos.
java inversiones/Inversionista
o
java inversiones.Inversionista

Unidad 7: Paquetes

Libro 1: Core Java 244

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

No se puede ejecutar el programa desde el mismo directorio inversiones. Se debe ir


un nivel superior y luego ejecutar el programa. La compilacin puede hacerse desde
cualquier directorio. La salida del programa anterior puede ser como sigue
(dependiendo de los nmeros aleatorios que son generados):
Principio: 35830.254
Numero de anos: 3.349063
Tarifa de interes: 4.558226
Interes simple: 5469.77
Fin del Ejemplo 7.4
Ahora, observe algunos paquetes comnmente usados en programas Java.

9. Paquetes Incorporados en Java Usados Comnmente


En esta seccin se presenta una visin general de los paquetes que son ampliamente
usados en Java.

9.1 java.awt
Se pueden usar las clases que estn disponibles en el paquete java.awt para disear
interfaces de usuario para aplicaciones, son tambin tiles cuando se usan grficos e
imgenes en las aplicaciones.

9.2 java.applet
Las clases disponibles en el paquete java.applet definen las caractersticas de los
applets de Java y permite que se programen. Estas clases tambin permiten que un
applet se comunique con su contexto de applet. El contexto del applet es la aplicacin
que carga y corre el applet. El marco de trabajo de applets comprende el applet y el
contexto del applet.

9.3 java.beans
Los componentes Java beans son reutilizables y ampliamente usados en aplicaciones y
applets Java. Para el desarrollo y ejecucin de estos componentes reutilizables se
deben usar las clases disponibles en el paquete java.beans.

9.4 java.io
Se puede obtener entrada del usuario del teclado usando flujos de entrada,
adicionalmente se puede enviar la salida al monitor usando flujos de salida. Estos flujos
tambin son tiles durante la serializacin y la deserealizacin de objetos, as como
cuando se lee de o se escribe a un archivo. Las clases en java.io definen los
diferentes flujos de entrada y salida usados para las funciones descritas anteriormente.

Libro 1: Core Java

Unidad 7: Paquetes 245


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

9.5 java.lang
El paquete java.lang tiene las clases que proveen la funcionalidad bsica de Java.
Este paquete tiene la clase Object, que es la superclase de todas las otras clases en
Java. Algunos mtodos en esta clase proveen implementaciones estndares de
algoritmos para equals(), hashCode(), y toString(). Este paquete tambin tiene
la clase Math, que proporciona la implementacin estndar para muchas funciones
matemticas tiles como: raz cuadrada, exponente, seno, coseno, tangente, etc. Las
clases String y StringBuffer de este paquete tienen varias operaciones que
pueden realizarse sobre cadenas de caracteres.
Puede haber situaciones cuando los tipos de datos primitivos como integer, float,
double, etc. se necesitan en la forma de objeto, para esto se tiene las clases
envolventes (wrapper), que tienen un campo para almacenar el valor del tipo de dato
primitivo.
Este paquete tiene la clase Throwable, que es la raz de todas las clases de errores y
excepciones. Este paquete tiene tambin muchas clases que permiten realizar
operaciones de sistema, como aplicar las polticas de seguridad, crear procesos
externos, etc.

9.6 java.util
Este paquete tiene esencialmente varias clases utilitarias que hacen el esfuerzo de la
programacin ms simple; tiene clases que soportan el modelo de evento, que se usa
en las interfaces de usuario de las aplicaciones. Tambin tiene el marco de trabajo
Collections, que permite manejar una coleccin (grupo) de objetos. Algunas de las
clases utilitarias disponibles en el paquete java.util permiten generar nmeros
aleatorios, buscar la fecha y hora local de acuerdo a la regin de la fecha y hora del
sistema, etc. Provee la clase Vector que almacena una coleccin de referencias a
objetos, puede variar en tamao y contener objetos de diferentes tipos.

9.7 java.math
El paquete math en Java contiene clases que nos ayudan a trabajar con aritmtica
sobre nmeros enteros y decimales de precisin arbitraria. Provee dos clases
BigInteger para enteros y BigDecimal para nmeros decimales.

9.8 java.text
Este paquete contiene clases para manipular texto, fechas, nmeros y mensajes. Las
clases estn diseadas para trabajar independientemente del lenguaje natural usado.
Algunas de las clases provistas en este paquete son: Annotation, DateFormat,
NumberFormat, MessageFormat, etc. Tambin proporciona dos interfaces que
realizan recorridos sobre datos textos.

Unidad 7: Paquetes

Libro 1: Core Java 246

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

9.9 java.net
Este paquete tiene varias clases que permiten construir aplicaciones en red. Usando las
clases Socket y ServerSocket se pueden implementar un sistema cliente/servidor.
Se pueden desarrollar aplicaciones para que un cliente se comunique con cualquier
servidor disponible en la Internet. Tambin, se pueden desarrollador aplicaciones para
un servidor y host en la Internet. La clase URL y otras clases relacionadas permiten
enviar datos a un URL as como recibir datos fcilmente.

9.10 java.rmi
La Invocacin a Mtodos Remota (Remote Method Invocation RMI) permite a un objeto
ejecutndose en una JVM invocar a un mtodo de otro objeto (objeto remoto) que se
est ejecutando en una JVM diferente.

Libro 1: Core Java

Unidad 7: Paquetes 247


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:

Definir y crear un paquete.

Explicar cmo los paquetes se representan en el sistema de archivos.

Discutir acerca de proteccin de acceso en paquetes.

Describir los miembros del paquete.

Discutir cmo importar paquetes.

Explicar las variables classpath y describir su uso.

Explicar los paquetes incorporados ms usados en Java.

Unidad 7: Paquetes

Libro 1: Core Java 248

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Unidad 7: Examen de Autoevaluacin


1) Se pueden tener dos clases con el mismo nombre en dos paquetes diferentes en
Java.
a) Verdadero
b) Falso
2) Se puede usar el mismo nombre de paquete para diferentes definiciones de clases
en diferentes archivos.
a) Verdadero
b) Falso
3) Cules de las siguientes sentencias son verdaderas acerca de la instruccin
package?
a) Debe ser la primera instruccin declarada en un archivo fuente Java.
b) Debe ir despus de las instrucciones import.
c) Se termina con un punto y coma.
d) Asegura que todas las clases definidas en el archivo fuente pertenecen al
paquete.
4) Un programa Java tiene la siguiente instruccin:
package p1.p2.p3.C;
Cul de las siguientes es verdadera acerca de la instruccin?
a) C es el nombre del paquete, y el resto son simplemente nombres de
directorios
b) C es el nombre de la clase, y p1.p2.p3 es el nombre del paquete
c) p1.p2.p3.C es el nombre del paquete
d) p1 es el nombre del directorio, y p2.p3.C es el nombre del paquete
5) Cuando no se especifica el paquete en un archivo fuente, la clase se almacena en
_____________.
a) El paquete java.nombre
b) Un paquete con el mismo nombre que el directorio actual
c) El paquete por defecto (Default package)
d) Ninguna de las anteriores

Libro 1: Core Java

Unidad 7: Paquetes 249


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Core Java

Gua del Estudiante

6) Suponga que existe un programa llamado MiClase.java en un paquete llamado


miPaquete, se puede ejecutar el programa desde el directorio miPaquete.
a) Verdadero
b) Falso
7) Cul de los siguientes paquetes es importado implcitamente por el compilador de
Java para cualquier programa Java?
a) java.awt
b) java.lang
c) java.rmi
d) java.net
8) Para cul de los siguientes ser visible un miembro sin especificacin de acceso
explcito en la definicin de su clase?
a) Subclases en otro paquete
b) Clases en el mismo paquete
c) Ambas
9) Si se tiene una clase sin ningn modificador para especificar su acceso, cul de
los siguientes niveles de acceso se asume que tiene?
a) public
b) protected
c) package
d) private
10) Cul de las siguientes instrucciones se pueden usar para crear un objeto de la
clase Float que est en el paquete java.lang, sin importar el paquete
java.lang?
a) k=new lang.Float()
b) Float f = new Float()
c) Float f= new java.lang.Float()
d) k= new java.lang.Float;

Unidad 7: Paquetes

Libro 1: Core Java 250

Copyright IBM Corp. 2007


Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

Gua del Estudiante

Core Java

Respuestas a la Unidad 7: Examen de Autoevaluacin


1) a
2) a
3) a, c y d
4) b
5) c
6) b
7) b
8) b
9) c
10) b y c

Libro 1: Core Java

Unidad 7: Paquetes 251


Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.

También podría gustarte