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 6. Impacto de Java en la WWW 7. Clases y Objetos 8. Orientacin a Objetos en Java 9. Ejemplo de una Aplicacin Java 10. Ejemplo de Applet Java Resumen Unidad 1: Examen de Autoevaluacin Respuestas a la Unidad 1: Examen de Autoevaluacin Objetivos del Aprendizaje 1. Introduccin 2. Tipos de Datos en Java 3. Clases Envolventes 4. Math Clases Colaboradoras sobre los Tipos de Datos 5. Manejo de String 6. Identificadores 7. Declaracin e Inicializacin de Variables 8. Operadores en Java 9. Conversin de Tipos 10. Arreglos 11. Estructuras de Control Resumen Unidad 2: Examen de Autoevaluacin
Copyright IBM Corp. 2007 Los materiales del curso no pueden ser reproducidos total o parcialmente sin el previo permiso escrito de IBM.

3 4 4 5 6 11 16 17 21 26 27 29 30 32 33 34 34 39 44 44 50 51 53 63 66 71 86 87
i

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

Core Java

Gua del Estudiante

Respuestas a la Unidad 2: Examen de Autoevaluacin Objetivos del Aprendizaje Ejercicios de Laboratorio

89 90 91

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

Volumen 2: Programacin Orientada a Objetos.............................................95 Unidad 1: Clases y Objetos..............................................................................97


Objetivos del Aprendizaje 1. Introduccin 2. Clases y Objetos 3. Estructura de una Clase Java 4. Variables 5. Mtodos 6. Modificadores de Acceso 7. Constructores de una Clase 8. Sobrecarga de Mtodo 9. Clases Anidadas 10. Argumentos de Lnea de Comandos 11. Ciclo de Vida de un Objeto 12. Manejo de la Memoria en Java 13. Enumeraciones Resumen Unidad 1: Examen de Autoevaluacin Respuestas a Unidad 1: Examen de Autoevaluacin Objetivos del Aprendizaje Ejercicios de Laboratorio Objetivos del Aprendizaje 1. Introduccin 2. Sintaxis para Declarar Clases Usando Herencia en Java 3. Conceptos Esenciales de Herencia Resumen Unidad 3: Examen de Autoevaluacin Respuestas a la Unidad 3: Examen de Autoevaluacin Objetivos de Aprendizaje
Copyright IBM Corp. 2007 Los materiales del curso no pueden ser reproducidos total o parcialmente sin el previo permiso escrito de IBM.

97 98 98 101 103 108 113 121 124 127 130 131 136 136 138 139 141 143 144 147 148 148 152 177 178 180 181
ii

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

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

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

Gua del Estudiante

Core Java

Ejercicios de Laboratorio Objetivos de Aprendizaje 1. Introduccin 2. Clases Abstractas 3. Uso de Clases Abstractas 4. Qu son las Interfaces? 5. Usar Interfaces Como Referencias 6. Heredar de una Interfaz 7. Opciones de Herencia en Java Resumen Unidad 5: Examen de Autoevaluacin Respuestas a la Unidad 5: Examen de Autoevaluacin Objetivos de Aprendizaje Ejercicios de Laboratorio Objetivos de Aprendizaje 1. Introduccin 2. Necesidad de los Paquetes 3. Crear Paquetes en Java 4. Representacin del Paquete en el Sistema de Archivos 5. Paquetes y Proteccin de Acceso 6. Usar Miembros de Paquetes 7. Agrupar Paquetes 8. Despliegue de Paquetes 9. Paquetes Incorporados en Java Usados Comnmente Resumen Unidad 7: Examen de Autoevaluacin Respuestas a la Unidad 7: Examen de Autoevaluacin

182 183 184 184 186 194 202 205 208 210 211 213 215 216 219 220 220 222 224 227 235 239 239 245 248 249 251

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

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

Unidad 7: Paquetes.........................................................................................219

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

Libro 1: Core Java

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

Gua del Estudiante 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. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. /*Definicion de la clase Computador comienza aqui*/ class Computador { boolean cpu, teclado, mouse; String monitor; }/*Definicion de la clase Computador termina aqui*/ /*Definicion de la clase ComputadorEjemplo comienza aqui*/ public class ComputadorEjemplo { /*El metodo main comienza aqui */ public static void main(String[] args) { //Crear la instancia de la clase Computer Computador comp1 = new Computador(); Computador comp2 = new Computador(); comp1.cpu = true; comp1.monitor = "Negro"; comp1.teclado = true; comp1.mouse = true; comp2.cpu = true; comp2.monitor = "Blanco y negro"; 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. 9. 10. 11. /*El metodo paint comienza aqui */ public void paint(Graphics g) { // Llamar al metodo drawString // 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 boolean byte char short int Long Float Double Tamao Ocupado en Memoria 1 byte 1 byte 2 bytes 2 bytes 4 bytes 8 bytes 4 bytes 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 short -27 hasta 27 1 -215 hasta 215 1
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.

Libro 1: Core Java

Core Java

Gua del Estudiante

int long

-231 hasta 231 1 -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: char 0 hasta 215

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 Valor Aceptable 2 (se asume int) 2L 0777 (octal) 0xa5fd (hexadecimal) a, \n, \udddd 3.14 (se asume double) 3.12E4 2e12 2.0d 2.0F

Entero

Punto Flotante

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() de la clase

La clase Byte tambin tiene mtodos que son sobrescritos java.lang.Object. Estos mtodos son los siguientes: equals() toString() hashCode()

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. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. public static void main(String args[]) { Integer i = new Integer(5); String s = "250.47"; System.out.println("Valor de i es: " + i.toString()); System.out.println("Valor de s es: " + Float.parseFloat(s)); Float f = Float.valueOf(s); float primitivoFloat = f.floatValue(); int primitivoInt = f.intValue(); System.out.println("Valor del primitivo float es: " + primitivoFloat); System.out.println("Valor del primitivo int es: " + primitivoInt); }/* 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. 4. 5. 6. 7. 8. 9. /* Comienza el 1er bloque */ static int a = 10, b = 20; public static void main(String args[]) { /* Comienza el 2do bloque */ int c = 30; 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 35 > 65 resulta en true 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 0 0 1 1

Patrn de Bits 2 0 1 0 1

Resultado 0 0 0 1

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 0 0 1 1 Patrn de Bits 2 0 1 0 1 Resultado 0 1 1 1

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 0 0 1 1 Patrn de Bits 2 0 1 0 1 Resultado 0 1 1 0

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

Gua del Estudiante

Operador Sintaxis Operacin

<< A<<B

>> A>>B

>>> A>>>B Desplaza los bits de A hacia la derecha B veces, sin signo

Desplaza los bits de Desplaza los bits de A A hacia la izquierda B hacia la derecha B veces veces

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 var1 = var2 var1 += var2 var1 -= var2 var1 *= var2 var1 /= var2 var1 %= var2 var1 &= var2 var1 |= var2 var1 ^= var2 var1 <<= var2 var1 >>= var2 var1 >>>= var2

Equivalente var1 = var2 var1 = var1 + var2 var1 = var1 - var2 var1 = var1 * var2 var1 = var1 / var2 var1 = var1 % var2 var1 = var1 & var2 var1 = var1 | var2 var1 = var1 ^ var2 var1 = var1 << var2 var1 = 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. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. // Contador de vueltas como objeto con // asignacion de un primitivo Integer vuelta = 0; // Parametros double kilometros = 2.5; int tiempo = 2; while (true) { // Utilizando auto-incremento sobre objeto Integer System.out.print("Vuelta: " + vuelta++); // Operacion entre objeto Integer y primitivo double System.out.print(" Distancia: " + vuelta * kilometros); // Operacion entre objeto Integer y primitivo int System.out.println(" Tiempo: " + vuelta * tiempo); // Comparacion sobre objeto Integer if (vuelta > 5) break; } // Fin del ciclo While
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.

Libro 1: Core Java

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. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.

6000, 7500}; // Arreglo renta permitida por emppleado double empRenta[] = new double[5]; int i; for (i = 0; i < 5; i++) { empRenta[i] = .2 * empSueldo[i]; }// Fin del ciclo for System.out.println("Detalle Sueldo basico y Renta"); 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 5000 12000 6000 7500

800 1000 2400 1200 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. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. // Arreglo sueldo basico y renta // permitida por emppleado double empArreglo[][] = { { 4000, 0}, { 5000, 0}, {12000, 0}, { 6000, 0}, { 7500, 0} }; int i, j; double basico = 0.0; for (i = 0; i < 5; i++) { for (j = 0; j < 2; j++) { if (j == 0) 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. 27. 28. 29. 30. 31. 32. 33.

}// Fin lazo for System.out.println("Detalle Sueldo basico y Renta"); for (i = 0; i < 5; i++) { for (j = 0; j < 2; j++) System.out.print(empArreglo[i][j] + "\t"); 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 7500.0 2400.0 1200.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

Gua del Estudiante

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

etiquetaUno: for(int i=0;i<2;i++){ System.out.println("En Ciclo Uno"); etiquetaDos: for(int j=0;j<2;j++ ){ System.out.println("En Ciclo Dos"); if(j==0) continue; if(j==1) 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 : Letras Dgitos
Libro 1: Core Java

: Mustrelos (:,*,; etc.) en una forma adecuada! : 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: 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. Escriba una clase llamada MinimoMonedas. Declare una variable entera llamada numero e inicialcela con un entero vlido (por ejemplo 54321).

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 short integer long float double 0 0 0 0.0 0.0 false (carcter en blanco) 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(); mc = new MiClase(); mc.getNombre(); } 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: // Error // OK

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. 8. 9. 10. 11. 12. /*El metodo agregar comienza aqui */ static public void agregar(int j, int k) { n = j + k; System.out.println(n); }/* El metodo agregar termina aqui */ /*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. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. /* Constructor Fibonacci comienza aqui */ public Fibonacci(int numeroDeTerminos) { n = numeroDeTerminos; }/* Constructor Fibonacci termina aqui */ /* Metodo cambiarNumeroDeTerminos comienza aqui */ void cambiarNumeroDeTerminos(int numeroDeTerminos) { n = numeroDeTerminos; }/* Metodo cambiarNumeroDeTerminos termina aqui */ /* Metodo mostrarSeries comienza aqui */ public void mostrarSeries() { if (n <= 0) { System.out.println("Entrada invalida"); System.exit(0); } if (n >= 1) System.out.println(a); if (n >= 2) System.out.println(b); while (contador < n) {
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.

Libro 1: Core Java

Core Java

Gua del Estudiante

27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.

c = a + b; System.out.println(c); a = b; b = c; contador++; } }/* Metodo mostrarSeries termina aqui */ /* Metodo main comienza aqui */ public static void main(String args[]) { Fibonacci fib = new Fibonacci(5);// 5 trminos

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. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. void mostrarEnPantalla(int a, int b){ System.out.println(a); System.out.println(b+"\n"); } void mostrarEnPantalla(int a, char b){ System.out.println(a); System.out.println(b+"\n"); } void mostrarEnPantalla(char a, int b){ System.out.println(a); System.out.println(b+"\n"); } void mostrarEnPantalla(int a, int b, char c){ System.out.println(a); System.out.println(b);
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.

Libro 1: Core Java

Core Java

Gua del Estudiante

21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.

System.out.println(c+"\n"); } void mostrarEnPantalla(int a, char b, float c, String d){ System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d+"\n"); } public static void main(String[] args) { MetodoSobrecargadoEjemplo msce = new MetodoSobrecargadoEjemplo(); msce.mostrarEnPantalla(53,8965); 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 //miembros de ClaseExterna public static class ClaseAnidadaEstatica { //miembros de ClaseAnidadaEstatica } private class ClaseInterna { //miembros de ClaseInterna } }

Gua del Estudiante

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. 6. 7. 8. 9. 10. 11. 12. 13. 14. private String marca; private int velocidadActual; private String placa; private String nombre; /* Definicin de clase anidada */ class Acelerador { private int velocidadMaxima; Acelerador() { velocidadMaxima = 180; }

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

Core Java

15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.

public void acelerar(int velocidad) { if ((velocidad + velocidadActual) < velocidadMaxima){ velocidadActual = velocidadActual + velocidad; } } public void imprimirVelocidad() { System.out.println("Velocidad: " + velocidadActual); } }/* Fin de la clase anidada Acelerador */ /* Constructor Carro comienza aqui */ Carro(String mar, String nom, String pla) { marca = mar; nombre = nom; placa = pla; velocidadActual = 0; }/* Constructor Carro termina aqui */ /* Metodo main comienza aqui */ public static void main(String[] args) { Carro miCarro = new Carro("Ford", "Focus", "KAA-87X"); 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 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); } } } }

Gua del Estudiante

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 + "]");
Libro 1: Core Java 130

Unidad 1: Clases y Objetos

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.

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. java.lang.Comparable y

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

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

Libro 1: Core Java

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. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. private boolean conFlores; public String getNombre() { return nombre; } public void setNombre(String nuevoNombre) { nombre = nuevoNombre; } public int getEdad() { return edad; } public void setEdad(int nuevaEdad) { edad = nuevaEdad; } public boolean isConFlores() { return conFlores; }
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.

Libro 1: Core Java

Core Java

Gua del Estudiante

26. 27. 28.

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. 37. 38. 39. 40. 41. 42. public ArbolDePino() { setNombre("Pino"); conifero = true; } 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. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. String nombreSuper; String nombreSub; Arbol superClase = new Arbol(); ArbolDePino subClase = new ArbolDePino(); superClase.setEdad(36); subClase.setEdad(68); nombreSuper = superClase.getNombre(); nombreSub = subClase.getNombre(); System.out.println("Contenido de Super Clase:"); 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

Core Java

63. 64. 65.

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. 5. 6. 7. 8. 9. 10. 11. 12. 13. /* Metodo main comienza aqui */ public static void main(String[] args) { StringBuffer sb1 = new StringBuffer("Palabra"); StringBuffer sb2 = sb1; boolean iguales = sb1.equals(sb2); System.out.println(iguales); 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 */
Libro 1: Core Java 154

Unidad 3: Herencia

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. 7. 8. 9. 10. 11. 12. 13. 14.

public static void main(String[] args) { String str1 = new String("Palabra"); String str2 = str1; boolean iguales = str1.equals(str2); System.out.println(iguales); str2 = new String("Palabra"); iguales = str1.equals(str2); 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. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. private String nombre; private int edad; private boolean conFlores; public Arbol(String nombre, int edad) { this.nombre = nombre; this.edad = edad; } public Arbol() { this.nombre = "Roble"; this.edad = 100; } public Arbol(Arbol arbol) { this.nombre = arbol.nombre; this.edad = arbol.edad;
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.

Libro 1: Core Java

Core Java

Gua del Estudiante

20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.

} public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } public boolean isConFlores() { return conFlores; } 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. 52. 53. 54. 55. 56. } private boolean conifero; public ArbolDePino() { super(); setNombre("Pino"); conifero = true;

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. 60. 61. 62. 63. 64. 65. 66. 67.

public ArbolDePino(int edad, boolean conico) { super("Pino", edad); conifero = conico; } public ArbolDePino(ArbolDePino arbolDePino) { super(arbolDePino); conifero = arbolDePino.conifero; } 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. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. public static void main(String[] args) { Arbol arbol1 = new Arbol(); System.out.println("Contenido de arbol1:"); System.out.println("Nombre Arbol: " + arbol1.getNombre()); System.out.println("Edad Arbol: " + arbol1.getEdad()); Arbol arbol2 = new Arbol("Mango", 64); System.out.println("\nContenido de arbol2:"); System.out.println("Nombre Arbol: " + arbol2.getNombre()); System.out.println("Edad Arbol: " + arbol2.getEdad()); Arbol arbol3 = new Arbol(arbol2); System.out.println("\nContenido de arbol3:"); System.out.println("Nombre Arbol: " + arbol3.getNombre()); System.out.println("Edad Arbol: "
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.

Libro 1: Core Java

Core Java

Gua del Estudiante

94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122.

+ arbol3.getEdad()); ArbolDePino pino1 = new ArbolDePino(); System.out.println("\nContenido de pino1:"); System.out.println("Nombre Arbol: " + pino1.getNombre()); System.out.println("Edad Arbol: " + pino1.getEdad()); System.out.println("Conifero : " + pino1.isConifero()); ArbolDePino pino2 = new ArbolDePino(35, true); System.out.println("\nContenido de pino2:"); System.out.println("Nombre Arbol: " + pino2.getNombre()); System.out.println("Edad Arbol: " + pino2.getEdad()); System.out.println("Conifero : " + pino2.isConifero()); ArbolDePino pino3 = new ArbolDePino(pino2); System.out.println("\nContenido de pino3:"); System.out.println("Nombre Arbol: " + pino3.getNombre()); System.out.println("Edad Arbol: " + pino3.getEdad()); 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. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. protected String nombre; protected int edad; public Arbol(String nombre, int edad) { this.nombre = nombre; this.edad = edad; } public String getNombre() { return nombre; } public int getEdad() { return edad; }
Libro 1: Core Java 164

Unidad 3: Herencia

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. 27. 28. 29. 30. 31. public ArbolConifero(String nombre, int edad) { super(nombre, edad); conifero = true; } 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. 41. 42. 43. 44. 45. 46. 47. 48. 49. } public String getLugarDondeCrece() { return lugarDondeCrece; } public ArbolDePino( String nombre, int edad, String lugarDondeCrece) { super(nombre, edad); this.lugarDondeCrece = 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. 58. 59. 60. 61. 62. 63.

ArbolDePino pino = new ArbolDePino( "Pino", 23, "Malaysia"); System.out.println("Arbol: " + pino.getNombre()); System.out.println("Edad: " + pino.getEdad()); 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. 6. 7. 8. 9. 10. 11. int a, b, c; X(int m, int n) { a = m; b = n; } public int add() { return (c = a + b);

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) {
Libro 1: Core Java 168

Unidad 3: Herencia

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. 26. 27. 28.

super(m, n); d = o; } /* Metodo sobrescrito */ public int add() { 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. 37. 38. 39. 40. 41. 42. public static void main(String[] args) { X x = new X(42,35); Y y = new Y(42,35,23); System.out.println( "Suma en la super clase: " + x.add()); 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. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.

System.out.println( "Valores de la referencia de la sub clase: "); System.out.println("Nombre: " + ap.getNombre()); System.out.println("Edad: " + ap.getEdad()); System.out.println("Conifero: " + ap.isConifero()); /* Asignando la referencia del objeto ArbolDePino a la referencia del tipo Arbol */ a = ap; System.out.println( "Valores de la referencia de la super clase: "); System.out.println("Nombre: " + a.getNombre()); System.out.println("Edad: " + a.getEdad()); // 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. 11. 12. 13. 14. 15. 16.

"Valor de la variable contador es: " + contador); a = a + contador; System.out.println( "Valor de la variable a es: " + a); 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. 3. 4. 5. 6. final class X { private int a; X(int m) { a = m; } 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

Core Java

7. 8. 9. 10. 11. 12. }

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

public int b; Y(int m, int n) { super(m); b = n; }

Core Java

Gua del Estudiante

El cdigo Java comienza aqu... 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. } 14. class X { int a, b, c; X(int m, int n) { a = m; b = n; } final int add() { c = a + b; return (c); }

15. class Y extends X { 16. int d; 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. } } Y(int m, int n, int o) { super(m, n); d = o; } /* Error de compilacion: Metodo final no puede ser sobrescrito */ public int add() { 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 generalizar Clases Concretas clases Se usan para representar objetos del mundo real. Pueden ser instanciadas.

No 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 cerrar():void calcularIntereses():double credito(double):void debito(double):void getSaldo():double

public class CuentaDeAhorros { private String numero; private double saldo; private double tasaInteres; 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 cargarComision():double cerrar():void credito(double):void debito(double):void getSaldo():double

public class CuentaCorriente { private String numero; private double saldo; private double comisionMensual 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. 6. 7. 8. 9. 10. 11. float dimension2; Poligono(float x, float y) { dimension1 = x; dimension2 = y; } 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. 55. 56. 57. 58. 59. 60. 61. 62. Cuadrado cu = new Cuadrado(7); Triangulo t = new Triangulo(4, 5); Cilindro ci = new Cilindro(6, 3); Poligono poligono; poligono = cu; System.out.println( "Area del cuadrado es: " + poligono.area()); poligono = t;
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.

Libro 1: Core Java

Core Java

Gua del Estudiante

63. 64. 65. 66. 67. 68. 69. 70. 71.

System.out.println( "Area del triangulo es: " + poligono.area()); poligono = ci; System.out.println( "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. El cdigo Java comienza aqu 1. /* Definicion de la clase Telefono comienza aqui */ 2. public class Telefono implements ContestadorAutomatico{ 3. 4. 5. 6. 7. 8. 9. String mensaje; String mensajeSaludo = "Regreso despues de las 11pm"; /* El metodo grabarMensaje comienza aqui */ public void grabarMensaje(String mensaje) { System.out.println("Mensaje grabado: " + mensaje); this.mensaje = mensaje; implementa la interfaz

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. 13. 14. 15.

}/* El metodo grabarMensaje termina aqui */ /* El metodo getMensajeGrabado comienza aqui */ public String getMensajeGrabado() { System.out.println("Mensaje Saludo: " + mensajeSaludo); return mensajeSaludo;

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. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. String mensaje; String mensajeSaludo = "Regreso despues de las 11pm"; String mensajeBasico = "Hola"; String mensajeInterlocutor1; String mensajeInterlocutor2; boolean interlocutor1 = false; boolean interlocutor2 = false; boolean respuestaEncendido = false; // . . . /* El metodo grabarMensaje comienza aqui */ public void grabarMensaje(String mensaje) { 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. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.

}/* El metodo grabarMensaje termina aqui */ /* El metodo getMensajeGrabado comienza aqui */ public String getMensajeGrabado() { System.out.println("Mensaje Saludo: " + mensajeSaludo); return mensajeSaludo; }/* El metodo getMensajeGrabado termina aqui */ /* El metodo recibirMensajeInterlocutor1 comienza aqui */ String recibirMensajeInterlocutor1() { return(mensajeInterlocutor1); }/* El metodo recibirMensajeInterlocutor1 termina aqui */ /* El metodo enviarMensajeInterlocutor1 comienza aqui */ void enviarMensajeInterlocutor1(String mensaje) { mensajeInterlocutor2 = mensaje; }/* El metodo enviarMensajeInterlocutor1 termina aqui */ /* El metodo recibirMensajeInterlocutor2 comienza aqui */ String recibirMensajeInterlocutor2() { return(mensajeInterlocutor2); }/* El metodo recibirMensajeInterlocutor2 termina aqui */ /* 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. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.

String mensaje; String mensajeSaludo = "Regreso despues de 1 hora"; // . . . /* El metodo grabarMensaje comienza aqui */ public void grabarMensaje(String mensaje) { System.out.println( "Mensaje grabado en Telefono2: " + mensaje); this.mensaje = mensaje; }/* El metodo grabarMensaje termina aqui */ /* El metodo getMensajeGrabado comienza aqui */ public String getMensajeGrabado() { 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. 32. 33. 34. 35. 36. 37. 38. 39. /* El metodo main comienza aqui */ public static void main(String[] args) { String mensaje; ContestadorAutomatico ca = new Telefono(); mensaje = ca.getMensajeGrabado(); System.out.println("Mensaje recibido: " + mensaje); ca.grabarMensaje("Nos encontramos a las 11am Pedro"); Telefono2 t2 = new Telefono2(); ca = t2; mensaje = ca.getMensajeGrabado(); System.out.println("Mensaje recibido: " + mensaje); ca.grabarMensaje("Nos encontramos a la 1 pm David");
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.

Libro 1: Core Java

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. 6. 7. 8. 9. 10. 11. 12. implements ContestadorAutomatico { String mensajeSaludo = "Regreso despues de 1 hora"; /* El metodo getMensajeGrabado comienza aqui */ public String getMensajeGrabado() { System.out.println( "Mensaje Saludo de Telefono3: " + 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(); void metodo2();

3. 4. } 5.

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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. System.out.println("Dentro de metodo1"); }/* El metodo metodo1 termina aqui */ /* El metodo metodo2 comienza aqui */ public void metodo2() { System.out.println("Dentro de metodo2"); }/* El metodo metodo2 termina aqui */ /* El metodo metodo3 comienza aqui */ public void metodo3() { System.out.println("Dentro de metodo3"); }/* 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. 40. 41. 42. 43. 44. 45.

/* El metodo metodo4 comienza aqui */ public void metodo4() { System.out.println("Dentro de metodo4"); }/* El metodo metodo4 termina aqui */ /* El metodo metodo6 comienza aqui */ public void metodo6() { System.out.println("Dentro de metodo6"); }/* El metodo metodo6 termina 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. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. int variableDePaquete = 10; private int variablePrivada = 20; protected int variableProtegida = 30; public int variablePublica = 40; /* Constructor MiClase comienza aqui */ public MiClase() { System.out.println( "Dentro del constructor de MiClase"); System.out.println( "variableDePaquete = " + variableDePaquete); System.out.println( "variablePrivada = " + variablePrivada); System.out.println( "variableProtegida = " + variableProtegida); 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. public DeribadaDelMismoPaquete() { System.out.println( "Dentro del constructor de DeribadaDelMismoPaquete"); System.out.println( "variableDePaquete = " + variableDePaquete); /* Las variables private son accesibles * solo dentro de la misma clase */ // System.out.println( // "variablePrivada = " + variablePrivada); System.out.println( "variableProtegida = " + variableProtegida); 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(
Libro 1: Core Java 230

Unidad 7: Paquetes

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. 63. 64. 65. 66. 67. 68. 69. 70.

"variableDePaquete = " + mc.variableDePaquete); /* Las variables private son accesibles * solo dentro de la misma clase */ // System.out.println( // "variablePrivada = " + mc.variablePrivada); System.out.println( "variableProtegida = " + mc.variableProtegida); 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. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. System.out.println( "Dentro del constructor de " + "DeribadaDeDiferentePaquete"); /* Las variables Package son accesibles solo dentro * de la misma clase o dentro del mismo paquete */ //System.out.println( // "variableDePaquete = " + variableDePaquete); /* Las variables private son accesibles * solo dentro de la misma clase */ // System.out.println( // "variablePrivada = " + variablePrivada); System.out.println(
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.

Libro 1: Core Java

Core Java

Gua del Estudiante

97. 98. 99.

"variableProtegida = " + variableProtegida); System.out.println( aqui

100. "variablePublica = " + variablePublica); 101. }/* Constructor DeribadaDeDiferentePaquete termina */ 102. }/* Definicion de la clase termina 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(); 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. System.out.println( "Dentro del constructor de " + "SinRelacionDeDiferentePaquete"); /* Las variables Package son accesibles solo dentro * de la misma clase o dentro del mismo paquete */

comienza

//System.out.println( // "variableDePaquete = " + mc.variableDePaquete); /* Las variables private son accesibles * solo dentro de la misma clase */ // System.out.println( // "variablePrivada = " + mc.variablePrivada);

/* Las variables protected son accesibles dentro de * la misma clase o dentro del mismo paquete o dentro * de una la clase derivada */ //System.out.println( // "variableProtegida = " + mc.variableProtegida);

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 */ 136. package paquete1; 137.

termina

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. 157. 158. 159. public static void main(String[] args) { DeribadaDeDiferentePaquete ddp = new DeribadaDeDiferentePaquete(); 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);
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.

Libro 1: Core Java

Core Java

Gua del Estudiante

22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.

a = (float) (Math.random() * 10); t = (float) (Math.random() * 20); Interes in = new Interes(); si = in.calcularInteres(p, a, t); System.out.println("Principio: " + p); System.out.println("Numero de anos: " + a); System.out.println("Tarifa de interes: " + t); 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