Você está na página 1de 240

INTRODUCCIN AL LENGUAJE DE PROGRAMACIN JAVA

Elkin Doney Surez Gmez


Magister en Administracin Universidad Externado de Colombia Ingeniero Lder de Proyectos Universidad Industrial de Santander

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 1

Tabla de Contenido Capitulo I. Desarrollo de Software. 1.1. Introduccin. 1.2. Ingeniera del Software. 1.3. Qu es el Software? 1.3.1. Evolucin del Software 1.3.2. Aplicaciones del Software 1.3.3. Software nuevas tecnologas 1.3.4. Producto Software 1.4. Calidad del Software. 1.4.1. ISO 9000-3 1.4.2. ISO 9126 1.4.3. IEEE 830 1.4.4. Mtricas 1.5. Modelos de Desarrollo 1.5.1. Modelo en Cascada. 1.5.2. Modelo Proceso V 1.5.3. Modelo Evolutivo 1.5.4. Modelo Incremental 1.5.5. Modelo Espiral 1.6. El lenguaje UML. 1.6.1. Estructuras bsicas del lenguaje UML 1.6.2. Elementos 1.6.3. Relaciones 1.6.4. Diagramas UML 1.6.4.1. Casos de Uso 1.6.4.2. Actividades 1.6.4.3. Clases 1.6.4.4. Objetos 1.6.4.5. Secuencia 1.6.4.6. Colaboracin 1.6.4.7. Estados 1.6.4.8. Componentes 1.6.4.9. Despliegue 1.7. Ejercicios Capitulo II. Programacin Orientada a Objetos. 2.1. Introduccin. 2.2. Conceptos. 2.2.1. Objeto. 2.2.2. Clase. 2.2.3. atributo 2.2.4. Mensaje. 2.2.5. Encadenamiento. 2.2.6. Encapsulamiento. 2.2.7. Herencia. 2.2.7.1. Simple. 2.2.7.2. Mltiple. 2.2.8. Polimorfismo. 2.2.9. Instancia.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 2

2.2.10. Subclase. 2.2.11. Superclase. Capitulo III. Arquitectura JAVA SE 3.1. Introduccin. 3.2. Orgenes de Java. 3.2.1. El lenguaje de programacin Java. 3.2.2. Caractersticas de Java. 3.2.3. El entorno de desarrollo Java. 3.2.4. La maquina virtual Java. 3.2.5. El API de Java. 3.3. Configuracin del Entorno Java. 3.4. Eclipse. 3.4.1. Ejecutar eclipse. 3.4.2. Creacin de proyectos. 3.4.3. Windows Builder Pro. 3.5. Arquitectura JAVA SE. 3.6. Comentarios. 3.7. Identificadores. 3.8. Keywords. 3.9. Tipos de datos primitivos. 3.9.1. Boolean. 3.9.2. Char. 3.9.3. Enteros. 3.9.4. Punto Flotante. 3.9.5. String. 3.10. Control de Flujo. 3.10.1. Estamentos de decisin. 3.10.1.1. If / else. 3.10.1.2. Switch. 3.10.2. Estamentos de Ciclos. 3.10.2.1. For. 3.10.2.2. While. 3.10.2.3. Do / While. 3.10.3. Control de Flujo especial. 3.10.4. Arreglos. 3.11.Operadores y asignaciones. 3.11.1. Casting y promocin. 3.11.2. Operadores 3.11.2.1. Operadores Unarios. 3.11.2.2. Operadores Aritmticos. 3.11.2.3. Operadores Shift. 3.11.2.4. Operadores de relacin. 3.11.2.5. Operadores Lgicos. 3.11.2.5.1. Operadores lgicos corto circuito. 3.11.3. Operador ternario. 3.11.4. Operadores de Asignacin. 3.12.Estructura de los Archivos Java. 3.12.1. Paquetes. 3.12.2. Importar paquetes. 3.12.3. Mtodo Main Principal. 3.12.4. Reglas para declarar archivos fuente

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 3

3.13.Modificadores de Acceso. 3.13.1. Modificadores de visibilidad. 3.13.1.1. Modificador public. 3.13.1.2. Modificador private. 3.13.1.3. Modificador default. 3.13.1.4. Modificador protected. 3.13.2. Modificadores de comportamiento. 3.13.2.1. Modificador static. 3.13.2.2. Modificador abstract. 3.13.2.3. Modificador final. 3.13.2.4. Modificador synchronized. 3.13.2.5. Modificador native. 3.13.2.6. Modificador transient. 3.13.2.7. Modificador volatile. 3.13.2.8. Modificador strictfp. 3.14.Declaracin y control de acceso. 3.14.1. Clases. 3.14.2. Mtodos. 3.14.3. Variables. 3.15. Constructores. 3.16. Sobre carga y sobre escritura. 3.17. Clases anidadas. 3.18. Clases annimas. 3.19. Interfaces. 3.20. Excepciones. 3.20.1. Programado excepciones de usuario. 3.21. Aserciones. 3.21.1. Utilizando aserciones apropiadamente. 3.22. Threads. 3.22.1. Mtodos en la clase Threads. 3.22.2. Cdigo sincronizado 3.23. Enumerados 3.24. Varargs. 3.25. Garbage Collector. 3.26. Ejercicios. 3.27. Evaluacin.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 4

Capitulo I. Desarrollo del Software

1.1.

Introduccin

Para el desarrollo de software Orientado a Objetos no basta usar un lenguaje Orientado a Objetos. Tambin se necesitar realizar un anlisis y diseo Orientado a Objetos. El modelamiento visual es la clave para realizar el anlisis OO. Desde los inicios del desarrollo de software OO han existido diferentes metodologas para hacer esto del modelamiento, pero sin lugar a duda, el Lenguaje de Modelamiento Unificado (UML) puso fin a la guerra de metodologas. Segn los mismos diseadores del lenguaje UML, ste tiene como fin modelar cualquier tipo de sistemas (no solamente de Software) usando los conceptos de la Orientacin a Objetos, y adems, este lenguaje debe ser entendible para los humanos y mquinas. Actualmente en la industria del desarrollo de software tenemos al UML como un estndar para el modelamiento de sistemas OO. Fue la empresa Racional que cre estas definiciones y especificaciones del estndar UML, y lo abri al mercado. La misma empresa cre uno de los programas ms conocidos hoy en da para este fin; el Racional Rose, pero tambin existen otros programas como el Poseidon que trae licencias del tipo community edition que permiten su uso libremente. El UML consta de todos los elementos y diagramas que permiten modelar los sistemas en base al paradigma orientado a objetos. Los modelos orientados a objetos cuando se construyen en forma correcta, son fciles de comunicar, cambiar, expandir, validar y verificar. Este modelamiento en UML es flexible al cambio y permite crear componentes plenamente reutilizables.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 5

1.2.

Ingeniera del Software

Es el estudio de los principios y metodologas para el desarrollo y mantenimiento de sistemas de software.

Aplicacin prctica del conocimiento cientfico en el diseo y construccin de programa de computadora y la documentacin asociada requerida para desarrollar, operar y mantener la aplicacin.

1.3.

Qu es el Software? Programas que se ejecutan para proporcionar una funcin. Estructuras de datos que permiten a los programas manipular adecuadamente la informacin. El software es un conjunto de tems u objetos que forman una configuracin que concluye: programas, documentos, datos. El software se desarrolla o construye; no se manufactura en el sentido clsico. El software no se desgasta. El software es complejo. A pesar de que la industria tiene una tendencia hacia la construccin por componentes, la mayora del software aun se construye a la medida.

1.3.1. Evolucin del software Primera era (1950 1965) o Sistemas batch. o Software a la medida o Distribucin limitada Segunda era (1965 1975) o Multiusuario o Bases de datos o Sistemas de tiempo real Tercera era (1975 1988) o Sistemas distribuidos o Inteligencia artificial Cuarta era (1988 2000) o Sistemas personales

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 6

o Sistemas expertos o Redes neuronales o Redes de computadoras o Software de sistemas. 1.3.2. Aplicaciones software Software de sistemas Software de aplicacin Software cientfico y de ingeniera Software empotrado Software de lnea de producto Aplicaciones basadas en web (web applications). Software de inteligencia

1.3.3. Software nuevas categoras Computacin obicua redes inalmbricas. Alimentacin de la red (Netsourcing) la Web es una maquina computacional. Fuente abierta (open source). Tambien o Minera de datos (data mining) o Computacin Grid (Grid computing) o Cognitive mechines o Software para nanotecnologas

1.3.4. Producto Software Ejecutable Programas fuente Manuales Documentos de requerimiento Documento de diseo Planes de pruebas.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 7

1.4.

Calidad del Software

La calidad es planeada y construida durante todo el desarrollo del sistema. El american Heritage Dictionary define calidad como una caracterstica o atributo de algo como un atributo de un elemento, la calidad se refiere a caractersticas mensurables, es decir: cosas que se pueden comparar para conocer estndares, como longitud, color, propiedades elctricas y maleabilidad. Sin embargo, el software principalmente es una entidad intelectual, es ms difcil de caracterizar que los objetos fsicos. Diseo: Caracterstica que especifica los ingenieros para un elemento dado. Corcondancia: Grado de cumplimiento de las especificaciones del diseo durante su desarrollo. Control de Calida: Inspecciones, revisiones y pruebas utilizadas a lo largo de todo el proceso del software con el fin de asegurar que el producto cumpla con los requisitos solicitados. Garanta de Calidad: Auditoria necesaria para conocer y gestionar datos relacionados con la calidad de un producto.

1.4.1. ISO 9000-3 Serie de normas gua para seleccionar las estrategias de mejoramiento de los procesos de desarrollo de software.

Fase 1: Especificacin del producto y planificacin preliminar. o Anlisis de requisitos del mercadeo. o Presupuesto y cronograma preliminar. o Estimacin detallada para la realizacin de la fase 2.

Fase 2: Especificacin de requisitos y planificacin detallada. o Prototipo de factibilidad (opcional). o Especificacin de requisitos del software. o Plan de desarrollo del producto. o Plan de documentacin. o Plan de pruebas del sistema.

Fase 3: Diseo del producto. o Documentacin del diseo. o Especificacin del plan de pruebas de sistema.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 8

Fase 4: Pruebas: Pruebas Fase 5: Evaluacin del producto. o Evaluacin Alfa. o Evaluacin Beta.

Fase 6: Release del producto. Fase 7: Mantenimiento y extensin.

1.4.2. ISO 9126 Es un estndar internacional para la evaluacin de software. El estndar se divide en cuatro porciones que trata: modelo de la calidad; mtrica externa; mtrica interna y mtrica funcional de la calidad. El modelo de la calidad establecido en la primera parte del estndar ISO 9126-1, clasifica calidad del software en un sistema estructurado de caractersticas como sigue a continuacin.

Funcionalidad: Se puede definir como el correcto funcionamiento tcnico del sitio Web. Tambin puede definirse como utilidad objetiva o la capacidad tcnica de la aplicacin para soportar las tareas que el usuario desea realizar.

Confiabilidad: Capacidad del software para mantener su nivel de funcionamiento bajo condiciones indicadas por un periodo del tiempo indicado. o o Madurez: Subcaracterstica que indica la frecuencia con que ocurre los fallos. Recuperabilidad: Subcaracterstica que Indica la capacidad del sistema para restablecer su nivel de respuesta despus de un fallo critico o error de hardware. o Tolerancia de avera: Subcaracterstica que indica el grado en que el sistema mantiene un nivel de respuesta ante fallos del sistema o interfaces.

Usabilidad: Se refiere a la facilidad de uso del sistema, sin un esfuerzo adicional por parte del usuario; es decir con solo verlo ya sabe que hacer de acuerdo con los tipos de interfaz. o o Facilidad de aprendizaje: Caractersticas del software que influyen en el esfuerzo del usuario para aprender. Comprensin: Caractersticas del software que influyen en el esfuerzo del usuario para facilitar el manejo de la aplicacin.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 9

Operabilidad: Caractersticas del software que influyen en el esfuerzo del usuario para operar y controlar el sistema de manera adecuada.

Eficacia: Relacin entre el nivel de funcionamiento del software y la cantidad de recursos de computo usados. o Comportamiento en el tiempo: Caractersticas del software que influyen en el tiempo de respuesta, procesado y productividad cuando se ejecuta su funcin. o Comportamiento del recurso: Caractersticas de software que influyen en el nmero de recursos usados, y la duracin de su uso, cuando se lleva acabo su funcin.

Mantenibilidad: Hace referencia a que el software pueda evolucionar para cumplir con necesidades futuras del usuario. o o o o Estabilidad: Subcaracterstica que indica volumen de riesgos de efectos inesperados tras una modificacin. Capacidad de ser analizado: Subcaracterstica que indica la cantidad de esfuerzo requerido para diagnosticar la causa de un fallo. Cambiabilidad: Indica la cantidad de esfuerzo requerido para una modificacin o correccin de un defecto. Facilidad de prueba: Subcaracterstica que indica la capacidad del software para permitir que sea validado tras ser modificado

Portabilidad: Se refiere a la capacidad del software de ser trasferido de un ambiente o entorno a otro. o o Facilidad de instalacin: Caractersticas del software que influyen en el esfuerzo requerido para instalar el software en un entorno especificado. Adaptabilidad: Caractersticas del software que influyen en las posibilidades de adaptacin a diferentes entornos especificados.

1.4.3. IEEE 830 El estndar IEEE- 830 de 1998 describe una serie de recomendaciones prcticas para la creacin de una buena especificacin de requisitos de software (ERS), es decir una ERS correcta precisa, verificable, consistente y modificable.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 10

El estndar IEEE- 830 maneja la siguiente estructura:


Tabla de contenido 1. Introduccin Objetivo mbito Definiciones, siglas y abreviaturas Referencias Visin global 2. Descripcin general Perspectiva del producto 2.1.1 Interfaces del sistema 2.1.2 Interfaces del usuario 2.1.3 Interfaces de hardware 2.1.4 Interfaces de software 2.1.5 Interfaces de comunicacin 2.1.6 Restriccin de memoria 2.1.7 Operaciones 2.1.8 Requerimientos de adaptacin del sitio 2.2 Funciones del producto 2.3 Caractersticas del usuario 2.4 Restricciones 2.5 Suposiciones y dependencias 2.6 Distribucin de requerimientos 3. Requerimientos especficos 4. Informacin de apoyo Apndices ndice

1.4.4. Mtricas El estndar IEEE define mtrica como una medida cuantitativa del grado en que en un sistema, componente o proceso posee un atributo determinado.

Teniendo en cuenta las caractersticas del modelo de calidad antes mencionada, se establecer la definicin de cada una de ellas y sus respectivas caractersticas, para posteriormente establecer unas mtricas sencillas para el sistema a realizar.

Usabilidad: Se valora al considerar los factores humanos la esttica consistencia y documentacin generales. La usabilidad tiene en cuenta las siguientes

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 11

caractersticas, para posteriormente establecer unas mtricas sencillas para el sistema a realizar. Funcionalidad: Se estima al evaluar el conjunto de caractersticas y capacidades del programa, la generalidad de las funciones que se entregan y la seguridad de la aplicacin Web en su totalidad. En la funcionalidad se observan las siguientes caractersticas: capacidad de recuperacin y de bsqueda, servicios de bsqueda ya navegacin y servicio y servicios relacionados con el dominio de la aplicacin Fiabilidad: Se evala al medir la frecuencia y la severidad de las fallas la precisin de los resultados de salida, la medida del momento de fallas, la habilidad de recuperarse de las fallas y la previsibilidad del programa. La fiabilidad cuenta con las siguientes caractersticas: proceso correcto de enlace, la recuperacin de errores y la validacin y recuperacin de la entrada del usuario. Eficiencia: Se mide con la velocidad de procesamiento, tiempo de respuesta, consumo de recursos, rendimiento y eficacia. L a eficiencia evala la calidad de la aplicacin Web basndose en las siguientes caractersticas: rendimiento del

tiempo de respuesta, velocidad de generacin de pginas y la velocidad de generacin de grficos. Capacidad de Mantenimiento: El esfuerzo necesario para localizar y corregir un error del programa. Las caractersticas usadas en este tem son la facilidad de correccin, la adaptabilidad y la extensibilidad. Mtricas del Proceso: La nica de forma racional de mejorar cualquier proceso es medir sus atributos, desarrollar un conjunto de mtricas significativas segn estos atributos y utilizar estas mtricas para proporcionar indicadores que conducirn a una estrategia de mejora. Mtricas del Proyecto: Estas mtricas son tcticas, es decir le ayuda al gestor del proyecto y a su equipo para adaptar el flujo de trabajo de proyecto y las actividades tcnicas a realizar.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 12

1.5.

Modelos de Desarrollo Beneficios de adoptar una metodologa formal de desarrollo. o Permite cumplir con mayor precisin los tiempos y recursos asignados al proyecto. o Permite una alta sintona entre las necesidades de cliente y el producto suministrado. o Permite el desarrollo de soluciones estandarizadas y amigables al usuario. o Asegura una calidad mucho mayor al software. o Permite el seguimiento y control de auditoria mucho mayor por parte del contratante. o Establece procedimientos formales homogneos para el acceso a la informacin. Facilita mantenimiento de las aplicaciones. o Simplifica y hace ms relevante la documentacin.

Requisitos que debe cumplir una metodologa: o Universal. o Integral. o Coherente. o Cumplimiento total. o Simple.

1.5.1. Modelo en Cascada Definicin de requerimientos Anlisis de requerimientos Diseo arquitectnico Diseo detallado Pruebas

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 13

Se utiliza cuando: o o o o o Los requerimientos se pueden defirnir facil y rpidamente a partir del conocimiento del rea de estudio. Se tiene una definicin estable del producto, con variaciones minimas de los requisitos. Se trabaja con tecnologias conocidas. Se construye una version del mantenimiento del producto. Se migra un producto a una nueva plataforma.

Ventajas: o o o Presenta el proyecto con una estructura que ayuda a minimizar el esfuerzo intil. Ayuda a localizar errores en las primeras etapas del proyecto aun bajo costo (si se tiene una definicin estable del producto). Permite enfrentarse a la complejidad de la forma ordenada (en proyectos complejos comprendidos totalmente).

Problemas y Riesgos: o o o o o o No proporciona resultados del software hasta el final del ciclo. El cliente tiene contacto con el producto solo hasta el final de desarrollo. Dificultad para especificar exactamente los requerimientos al comienzo del proyecto. No permite flexibilidad en los cambio. Olvidar algo puede suponer un error costoso. Discontinuidad de sus etapas, hasta no terminar una no se da inicio a la siguiente. Gran cantidad de documentacin.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 14

1.5.2. Modelo Proceso V

Definicin de requerimientos Anlisis de requerimientos Diseo arquitectnico Diseo detallado Codificacin

Prueba aceptacin
Prueba sistema

Prueba integracin Prueba unitaria

El Modelo V tiende a ser muy relacionado con el Modelo de Cascada puesto que es una evolucin del mismo. Puede notarse que su primera mitad es similar al Modelo en Cascada, y la otra mitad tiene como finalidad hacer pruebas e integracin asociado a cada una de las etapas de la mitad anterior. Se puede identificar una ventaja principal con respecto al Modelo Cascada ms simple, y se refiere a que este modelo involucra chequeos de cada una de las etapas del modelo de cascada.

Problemas y Riesgos: o El riesgo es mayor que el de otros modelos, pues en lugar de hacer pruebas de aceptacin al final de cada etapa, las pruebas comienzan a efectuarse luego de haber terminado la implementacin, lo que puede traer como consecuencia un roll-back de todo un proceso que cost tiempo y dinero. o o El modelo no contempla la posibilidad de retornar a etapas inmediatamente anteriores, cosa que en la realidad puede ocurrir. Se toma toda la complejidad del problema de una vez y no en iteraciones o ciclos de desarrollo, lo que disminuye el riesgo.

A pesar de todo lo antes mencionado, definitivamente se trata de un modelo ms robusto y completo que el Modelo de Cascada, y puede producir software de mayor calidad que con el modelo de cascada.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 15

1.5.3. Modelo Evolutivo


Idea del producto

Prototipo

Pruebas

Pruebas

Prototipo evolutivo

Versin 1

Versin 2

Prototipo evolutivo

Pruebas

Versin 3 Se utiliza cuando: o Cuando no se conoce al principio todos los requerimientos del sistemas. o Cuando hay tecnologas nuevas que desconoce el equipo de desarrollo. o Los requerimientos cambian con rapidez. o No se identifica fcilmente el rea de aplicacin. Ventajas y Caracteristicas: o El producto final cumplir con todos lo requerimientos del cliente. o Metodologa cclica. o Requiere personal calificado. o Trabajo permanente con usuarios. o No aplicable a software grande. Problemas y Riesgos: o Imposibilidad de conocer al comienzo del proyecto lo que se tardara en crear un producto aceptable. o Se puede degenerar fcilmente en un desarrollo sin ninguna planeacion (con el esquema de codificar y corregir).

1.5.4. Modelo Incremental Se utiliza cuando: o Se conoce exactamente lo que se va a construir. o Cuando halla problemas de tiempo. o Cuando el Software a usar sea moduralizable. o Cuando el equipo de trabajo lleva mucho tiempo trabajando juntos.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 16

o El nmero de modulos es mximo 6 (seis). Ventajas y Caractersticas. o Presenta signos tangibles de progreso en el proyecto. o Proporciona una funcionalidad util al cliente antes de entregar 100% el proyecto. o Se puede entregar las prestaciones ms importantes al inicio. o Metodologa rpida. o Entrega de productos entre seis (6) o doce (12) meses. o Es iterativa y cclica. o Produce software por bloques. Problemas y Riesgos: o No funciona sin una planificacin adecuada tanto para niveles tecnicos como para niveles de gestin.

Kernel 1

Kernel 1
1 1

Kernel 1
1

2
1

3
1

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 17

1.5.5. Modelo Espiral Kernel+funcionalidad Clave+componentes Menos importantes+ Kernel+ Kernel+ Funcionalidad Clave+ Componentes Menos importantes+ Kernel+ Funcionalidad Clave

Se utiliza cuando: o Es aplicable a todo tipo de desarrollo de software, especialmente en aquellos donde no se conocen bien los requerimientos del sistema. o Cuando se tienen proyectos que requieran alta calidad y precisin en los productos. o Cuando se tiene personal con experiencia. o Cuando no hay problemas de presupuestos. o Cuando se puede entregar el producto por segmentos o versiones.

Ventajas y Caractersticas: o Las primeras iteraciones son menos costosas. o Mientras los costos suben los riesgos bajan. o Proporciona bastante control de gestin o Reduccin contina del nivel de riesgo en el proyecto. o Mejor visibilidad en el progreso. o Una de las pocas metodologas que hace anlisis de riesgos. o Se requiere de bastante tiempo para entregar un producto final. o Se requiere personal calificado. o Es evolutiva.

Problemas y Riesgos: o Requiere mayor planificacin. o Requiere mayor seguimiento del proyecto. o Modelo complicado. o El cliente no siempre esta predispuesto a ser parte integral del desarrollo del software.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 18

1.6.

El lenguaje UML

(Lenguaje Unificado de Modelado). Es una creacin de Ivn Jacobson, Grady Booch y Jame Rumbaugh, quienes a finales de los 80s y principio de los 90s crearon cada uno por aparte una metodologa para anlisis y diseo de sistemas Orientados a Objetos. Ellos ingresaron a trabajar a la empresa Rational Software y all unificaron criterios para definir un lenguaje de modelado al que llamaron UML y que lanzaron en 1997. Es un lenguaje grfico para visualizar, especificar, construir y documentar los componentes de un sistema software. La visin general de UML es:

Modelo: es una simplificacin de la realidad. Por que modelamos: para construir modelos o comprender mejor el sistema que estamos desarrollando. Las principales caractersticas de UML son: o Permite organizar procesos de diseo de tal forma que los analistas, clientes, desarrolladores y otras personas involucradas en el desarrollo del sistema lo comprendan y convengan con l. o Permite reducir el periodo de tiempo de desarrollo. Cuando los plazos se encuentran muy cerca uno del otro es absolutamente necesario contar con un diseo slido. o Un anteproyecto bien diseado facilitara la conversin. Si el diseo es slido, un cambio en la implementacin proceder sin problemas. UML

Es un

Lenguaje Estndar

Que Permite

Visualizar

Especificar

Construir

Documentar

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 19

Visualizar: porque permite a los desarrolladores representar grficamente, el proceso de modelado aplicado a sus proyectos software. UML combina unos smbolos grficos con una semntica bien definida, lo que permite elaborar modelos totalmente comprensibles.

Especificar: cubre la especificacin de todas las decisiones de anlisis, diseo e implementacin que deben realizarse al desarrollar y desplegar un sistema con gran cantidad de software.

Construir: aunque UML no es un lenguaje de programacin, tiene una relacin directa con las plataformas de desarrollo como Java, C++, Visual Basic, inclusive, con bases de datos relacionales y/o orientados a objetos.Es posible la generacin de cdigo a partir de un modelo en UML.

Documentar: porque documenta toda clase de artefactos que produce una organizacin software adems de cdigo ejecutable. Estos artefactos incluyen: requisitos, arquitectura, diseo, cdigo fuente, planificacin de proyectos, pruebas, prototipos y versiones.

1.6.1. Estructuras bsicas del lenguaje UML

UML proporciona a los desarrolladores un vocabulario, que incluye tres categoras, tal como se muestra en la figura siguiente:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 20

UML

ELEMENTOS

RELACIONES
Dependencia Asociacin Generalizacin Realizacin

DIAGRAMAS Caso de uso Clase Objeto Secuencia Colaboracin Estados Actividad Componente Despliegue

Estructurales
Caso de uso Clase Clase Activa Interfaz Componente Colaboracin Nodo

Comportamiento
Interaccin Maquina de estado

Agrupacin
Paquete Modelo Subsistema Marco del trabajo

Anotacin
Nota

1.6.2. Elementos

Son de UML. Se utilizan para los bloques bsicos de construccin orientados a escribir modelos bien formados. Estos se clasifican en:

Elementos Estructurales: Son los nombres de los modelos UML. En su mayora son las partes estticas de un modelo, y representan cosas que son conceptuales o materiales. En total, hay siete tipos de elementos estructurales:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 21

Clases: Es una descripcin de un conjunto de objetos que comparten los mismos atributos, operaciones, relaciones y semntica. Una clase implementa una o ms interfaces.
TMensaje1 +ip +puerto +nombre +create() +empacar() +desempacar()

Interfaz: Coleccin de operaciones que especifican un servicio de una clase o componente.

IUJugador o

Colaboracion: Define una interaccin y es una sociedad de roles y otros elementos que colaboran para proporcionar un comportamiento cooperativo mayor que la suma de los comportamientos de los elementos.

Ejecucin de Un Juego

Caso de Uso: Descripcin de un conjunto de secuencias de acciones que un sistema ejecuta y que produce un resultado observable de inters para un actor particular. Se utiliza para estructurar los aspectos de comportamiento de un modelo.
Unirse al Juego

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 22

Clase Activa: Es una clase cuyos objetos tienen uno o ms procesos o hilos de ejecucin y por lo tanto pueden dar origen a actividades de control. U na clase activa es igual que una clase, excepto en que sus objetos representan elementos cuyo comportamiento es concurrente con otros elementos.

Componente: Es una parte fsica y reemplazable de un sistema que representa el empaquetamiento fsico de diferentes elementos lgicos, como clases, interfaces y colaboraciones.

Nodo: Es un elemento fsico que existe en tiempo de ejecucin y representa un recurso computacional, que por lo general dispone de algo de memoria y, con frecuencia, capacidad de procesamiento.

Central de juego

Elementos de comportamiento: Son las partes dinmicas de los modelos UML. Representan comportamiento en el tiempo y el espacio. Semnticamente stos estn conectados normalmente a diversos elementos estructurales como clases, objetos y colaboraciones. Hay dos tipos principales de elementos de comportamiento: o Interaccion: Comportamiento que comprende un conjunto de mensajes intercambiables entre un conjunto de objetos, dentro un ambiente en particular.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 23

o Mquina de Estados: Comportamiento que especifica la secuencia de estados por las que pasa un objeto o interaccin durante su vida.
Esperando Jugadores

Elementos de agrupacin: son las partes organizativas de los modelos UML. Elementos de anotacin: Son comentarios que se pueden aplicar para describir, clarificar y hacer observaciones sobre cualquier elemento de un modelo.
o

Paquete (Agrupacin): Los paquetes se utilizan para organizar los elementos de modelado en partes mayores que se pueden manipular como un grupo. Pueden emplearse para representar diferentes vistas de la arquitectura del sistema.

Nota (Anotacin): Las notas se utilizan para especificar cosas como requisitos, observaciones, revisiones y explicaciones, adems de representar restricciones.

1.6.3. Relaciones

Son los bloques bsicos de construccin para relaciones de UML. Se utilizan para escribir modelos bien formados. Como se observa en la siguiente tabla, estos se clasifican en:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 24

Relacin

Descripcin Relacin semntica entre dos elementos, en la cual un

Representacin

Dependencia

cambio a un elemento (el elemento independiente) puede afectar a la semntica del otro (el elemento dependiente Relacin estructural que describe un conjunto de enlaces,
0..4 Jugador 1

Asociacin

los cuales son conexiones entre objetos. A menudo incluye la multiplicidad y los nombres de rol. Relacin de especializacin / generalizacin en la cual los

equipo

Generalizacin

elementos del elemento especializado (el hijo) pueden sustituir a los objetos del elemento general ( el padre). Relacin semntica entre clasificadores, en donde un

Realizacin

clasificador (clases, interfaces, seales, nodos, casos de uso y subsistemas) especifica un contrato que otro garantiza que cumplir.

1.6.4. Diagramas UML

1.6.4.1.

Casos de Uso

Representa las funciones del sistema desde el punto de vista del usuario. Se utilizan para la comunicacin con los usuarios y para expresar de forma clara y sencilla los requisitos. Un caso de uso describe que hace un sistema (o un subsistema, clase o una interfaz) pero no especifica cmo lo hace.

Actor: Conjunto coherente de roles que juegan los usuarios de los casos de uso cuando interactan con stos.
o o o

Principales: personas que usan el sistema. Secundarios: personas que mantienen o administran el sistema. Otros sistemas: sistemas con los que el sistema interacta.

Caso de Uso. Es una operacin desarrollada por el sistema, va acompaada de un nombre significativo.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 25

actor nombre del sistema

Catalogo Telefnico

caso de uso

revisar estado Vendedor hacer pedido

comunicacin entre actor y caso de uso

Cliente

rellenar pedido

Mensajero

nombre caso de uso

establecer Crdito

Supervisor lmite del sistema

La descripcin del caso de uso contiene los siguientes tems:


o o o o o o

Cdigo y nombre del caso de uso Descripcin Actores Prioridad(alta, media, baja) Riesgo (alto, medio, bajo). Precondiciones (desde el punto de vista del funcionamiento del caso de uso con el usuario)

o o o o

Flujo normal de eventos Flujos alternos Poscondiciones ( que debe hacer el sistema al finalizar el caso de uso) Requerimientos no funcionales

Preguntas tiles para encontrar casos de uso en un sistema de Software:


o o

Qu tareas realiza el actor? El actor crea, almacena, cambia, elimina o lee informacin del sistema?

Qu casos de uso crearn, almacenarn, cambiarn, leern esta informacin?

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 26

o o

El actor necesita informarle al sistema sobre cambios externos? Qu casos de uso darn soporte y mantenimiento al sistema?

Extends: Refleja situaciones particulares en un caso de uso que puede ser tratadas y extendidas por otro.

Depositar tem

<<extends>> <<extends> >>

<<extends> >

Depositar Botella

Depositar Tarro

Depositar Jaba

Uses: Es una simple relacin de inclusin, es decir, los escenarios y situaciones posibles detalladas segun caso de uso estan incluidas en otro caso de uso.

Depositar tem <<uses>>

Generar reporte diario <<uses>>

Imprimir

Validar producto Crear Producto

include

extends
Crear Pack del Producto

Vendedor

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 27

extends
Maneja Clientes

Agregar Cliente

Eliminar Cliente

Modificar Cliente Realiza Pagos

Empleado

1.6.4.2.

Actividades

Tipo especial de diagrama de estados que muestra un flujo de actividades dentro de un sistema. Cubren la vista dinmica y son importantes al modelar el funcionamiento de un sistema y resaltan el flujo de control entre objetos. Despus de crear los casos de uso, se pueden realizar los diagramas de actividades para presentar grficamente las actividades o flujos de eventos dentro de los casos de uso. El diagrama de actividades puede extender la descripcin de los casos de usos. Son similares a un diagrama de flujo que describe el orden de las actividades de un proceso. Se debe realizar un diagrama de actividades por cada caso de uso.

Actividad 1

Actividad 2

A cada actividad se le representa por un rectngulo con las esquinas redondeadas. Una flecha representa un cambio de una a otra actividad.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 28

Abrir aplicacin para procesamiento de texto

Crear Archivo

Guardar Archivo

Teclear el documento [grficos requeridos] [no se requieren grficos] [tablas requeridas] [no se requieren tablas]
Guardar el Archivo Abrir y usar la hora de clculo Abrir y utilizar el paquete de grficos

Imprimir Documento

Imprimir (Archivo)

Imprimir(archivo)

Salir del paquete de oficina

Imprimir

:impresora

1.6.4.3.

Clases

Bosquejan la arquitectura esttica del sistema en funcin de clases y sus asociaciones. Un diagrama de clase es una notacin grfica utilizada para representar un conjunto de objetos que comparten atributos y caractersticas comunes. Un diagrama de clase consiste de uno o ms rectngulos con una seccin para el nombre de la clase, otra para los atributos y otra para las operaciones.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 29

Los diagramas de clases son utilizados para ilustrar las relaciones entre clases y son el fundamento para el proceso de diseo. Las clases participan principalmente en cuatro relaciones:

Asociacin: Se determina la multiplicidad. Cuando existe multiplicidad de muchos a muchos en una relacin entre clases, esta relacin se debe romper de la misma manera como se realiza en un modelo entidad-relacin.

Agregacin: Forma especial de asociacin que especifica una relacin todoparte entre el agregado (el todo) y un componente (la parte)

Composicin: Forma de agregacin con fuerte pertenencia y un tiempo de vida coincidente entre las partes y el todo; las partes con una multiplicidad no fija pueden ser creadas despus del propio compuesto, pero una vez creadas viven y mueren con l; tales partes tambin pueden ser eliminadas explcitamente antes de la eliminacin del compuesto

Generalizacin: Se refiere a una relacin entre una clase general (superclase o padre) y una versin ms especfica de dicha clase (subclase o hija).

1.6.4.4.

Objetos

El diagrama de objetos es una instancia de un diagrama de clases y presenta los detalles de un estado del sistema en un punto del tiempo determinado. En UML el diagrama de objetos representa los objetos y sus relaciones en tiempo de ejecucin.

1.6.4.5.

Secuencia

Representan un conjunto de elementos de un sistema que interaccionan entre ellos organizados en secuencias de tiempo. Ivar Jacobson identific tres tipos principales de clases en un sistema orientado a objetos: entidad, interfaz y control.

Clases Entidad: Las clases entidad modelan el mundo real. Clases Interfaz: Son el puente entre el sistema y los usuarios. Los objetos que forman una interfaz grfica de usuario son ejemplos de clases interfaz. Estas clases frecuentemente hacen parte de una ventana, o un objeto impresora.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 30

Clases de control: Las clases de control implementan la lgica del negocio, que no puede ser fcilmente implementada en una clase entidad o interfaz. Las clases de control representan conceptos para mantener el sistema unido.

Los diagramas de secuencia presentan grficamente los objetos que toman parte en un escenario particular y muestra sus interacciones a travs del tiempo.

Los pasos para elaborar este tipo de diagramas son:


o o o o

Seleccione un caso de uso Coloque el actor en el diagrama Identifique las clases de interfaz Identifique las clases de entidad

El diagrama de secuencias consta de objetos que se representan del modo usual:


o

Rectngulos con nombre (subrayados), mensajes representados por lneas continuas con una punta de flechas y el tiempo representado como una progresin vertical.

Un mensaje puede ser:


o o

Simple: Es la transferencia del control de un objeto a otro Sincrnico: Si un objeto enva un mensaje sincrnico, esperar la respuesta de tal mensaje antes de continuar con su trabajo. Asincrnico: No esperara una respuesta antes de continuar.
SIMPLE SINCRONICO ASINCRONICO

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 31

Mansura de Agua

Tambor

Drenaje

Abastecimiento de agua Permanecer inmvil

Detenerse

Girar de un lado a otro Vaciar el agua jabonosa Reabastecer de Agua Girar de un lado a otro Vaciar el agua de enjuague Detenerse Girar en un solo sentido

Detenerse

1.6.4.6.

Colaboracin

Son parecidos a los diagramas de secuencia pero dan mayor libertad para distribuir los objetos. Junto con los de secuencias se denominan, diagramas de interaccin. Representan la interaccin entre elementos de un sistema y se organiza con respecto a espacio y tiempo. Es una representacin espacial de los objetos, sus enlaces y sus interacciones. A diferencia de los diagramas de secuencia, pueden mostrar el contexto de la operacin (cules objetos son atributos, cules temporales,...) y ciclos en la ejecucin.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 32

3: DarVueltas(int)

m : MquinaCaf <<association>>
1: Servir( )

p : Producto

2: (i=1..n) Servir(int)

Ingredientes : ingredientes

Los diagramas de colaboracin tienen dos caractersticas que los distinguen de los diagramas de secuencia: o En primer lugar, el camino. Para indicar como se enlaza un objeto a otro, se puede asociar un estereotipo de camino al extremo ms lejano de un enlace. Normalmente, solo se necesita representar

explcitamente el camino del enlace para los caminos local, parameter, global y self (pero no association). o En segundo lugar, est el nmero de secuencia. Para indicar la ordenacin temporal de un mensaje, se precede de un nmero (comenzando con el mensaje nmero 1), que se incrementa secuencialmente por cada nuevo mensaje en el flujo de control.

1.6.4.7.

Estados

Representan el estado de un elemento del sistema, las condiciones y respuestas que da a ciertos eventos a los que es expuesto. Un diagrama de transicin de estados muestra como cambia un objeto a travs del tiempo. Todos los objetos tienen un estado y su valor lo determina el valor de sus atributos. Un estado de un objeto es una de las posibles condiciones en las cuales puede existir.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 33

1 estado inicial es el que posee un objeto cuando es creado y es obligatorio. Slo es permitido un estado inicial. Un evento es una ocurrencia que sucede en un punto del tiempo. El estado del objeto determina la respuesta a los diferentes eventos. Una transicin es un cambio hecho de un estado original a un estado sucesor como resultado de un estmulo. Una accin es una operacin que est asociada con una transicin. El nombre de una accin es mostrada en la flecha de la transicin precedida por un /.

1.6.4.8.

Componentes

Muestra la organizacin y las dependencias entre un conjunto de componentes. Cubren la vista de implementacin esttica de un sistema. Los componentes son grupos de piezas de software que representan todo el sistema, sus relaciones y son responsables por las operaciones dentro del sistema. Los diagramas de componentes muestran el empaquetamiento fsico del cdigo. Esto puede ser una clase, un archivo comprimido, un paquete, un ejecutable, libreras compartidas, bases de datos, entre otras. Cuando un componente colabora con otro, esta colaboracin es representada como una dependencia entre el componente cliente y el componente servicio. Smbolo: Es un rectngulo que tiene otros dos sobrepuestos en su lado izquierdo. Se debe colocar el nombre del componente dentro del smbolo.

Calculadora.java

Adicin de Informacin al smbolo del componente: Muestra si el componente es miembro de un paquete. Tambin puede agregar informacin que muestra algn detalle del componente.
Herramientas:: Calculadora.java
ProcesadorTextos.exe Clases: ProcesadorTextos VerificadorOrtografico ContadorPalabras

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 34

Como representar la interfaces: Muestra como un rectngulo que contiene la informacin que se relacin, se conecta por la lnea discontinua ly la flecha sin rellenar
<<interfaz>> ElementoDeEscucha AWTEventMulticaster

CambioAlEstadoDelElemento()

1.6.4.9.

Despliegue

Muestra un conjunto de nodos y sus relaciones. Representa el despliegue de los componentes y subsistemas sobre los dispositivos fsicos. Algunos sistemas corren sobre una misma plataforma, mientras que otros estn distribuidos en una serie de mquinas. Existen diversas razones para construir soluciones distribuidas. UML utiliza el diagrama de distribucin para mostrar que el sistema corre a travs de diferentes plataformas. Los diagramas de distribucin consisten de nodos los cuales representan algn dispositivo de hardware como servidores, estaciones de trabajo, PCs, sensores, telfonos, entre otros y muestran la configuracin de los nodos, procesos, componentes y objetos que residen en ellos en tiempo de ejecucin. Las conexiones entre los nodos corresponden a las conexiones de red entre ellos, presentadas como estereotipos.

1.7.

Ejercicicios

I. Al comenzar cada semestre, los estudiantes requieren un catlogo que contiene la lista de los cursos ofrecidos para cada semestre. La informacin de cada curso, como el profesor, facultad y prerrequisitos sern incluidos para ayudar a los estudiantes en la toma de decisiones. El nuevo sistema le permitir a los estudiantes seleccionar cuatro cursos para el semestre entrante. Adems, cada estudiante indicar dos alternativas en caso de que un curso ofrecido se llene o sea cancelado. Ningn curso ofrecido tendr ms de 20 estudiantes, ni menos de 3 estudiantes. Un curso con menos de 3 estudiantes

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 35

ser cancelado. Una vez el proceso de matrcula es completado por el estudiante, el sistema de matrcula enva la informacin al sistema financiero. Los profesores deben acceder el sistema en lnea para indicar cul curso ensear. Tambin necesitan conocer cules estudiantes estn matriculados para su curso. Para cada semestre, existe un perodo de tiempo en el cual el estudiante puede cambiar su horario. Los estudiantes accedern el sistema durante este tiempo y aadir y cancelar cursos. a. Casos de uso.

Actores:
o o o o

Estudiantes Profesores Sistema financiero Administrador de sistema

casos de uso
o

Estudiante

Matricular

Profesores

Seleccionar cursos a dictar Revisar listado de alumnos

Administrador de sistema

Mantener informacin del curso Mantener informacin del estudiante Mantener informacin del profesor Generar catlogo.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 36

Sistema
Matricular

Estudiante

Revisar listado

Seleccionar curso

Mantener informacin Profesor

Mantener informacin Curso

Administrador Mantener informacin Estudiante Generar Catalgo

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 37

b. Diagrama de Clases para el ejemplo: Sistema acadmico.

c. Diagrama de Secuencia para el ejemplo: Sistema acadmico.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 38

d. Refinar el diagrama de clases del sistema acadmico. e. Hacer el diagrama de secuencia para el caso de uso: Mantener informacin del curso. II. Modele una jerarqua de clases de redes, teniendo en cuenta que una red puede ser de rea local (Local rea Network o LAN) o de rea amplia (Wide rea Network o WAN), y que una red local est | formada por PCs, hub, y cada PC por teclado, CPU, monitor y mouse, y las redes amplias estn formadas por otras redes. (Diagrama de clases) III. Una entidad financiera se dedica a prestar dinero con garanta de joyas. El cliente se acerca a la ventanilla con la joya y su documento de identidad, para que sean evaluados por un tasador quien indica el kilataje y el peso de la joya en gramos, registrndolo en el volante de tasacin. Con estos datos el sistema calcula el importe a ser prestado. Si el cliente es nuevo se procede a ingresar sus datos, en caso de estar registrado solo se verifican los datos. Luego se llena el contrato con los datos del cliente, la descripcin de la joya y el valor del prstamo, para finalmente firmarlos. Con este documento se dirige a ventanilla para recibir el monto prestado. (Diagrama de casos de uso) IV. En un cajero automtico de un banco, se pueden realizar tres tipos de transacciones: retiro, consulta de movimientos, y transferencias entre cuentas del mismo banco. Muestre un diagrama de secuencia para cada una de las transacciones dadas. V. A partir de estos tres casos tpicos: a. Construya los diagramas de casos de uso para cada caso tpico descripto. b. Elabore los diagramas de secuencia inicial y los contratos

correspondientes. Caso Tpico: Solicitud de Crdito. Actores: Cliente, Vendedor, Oficial de Crdito. Finalidad: Solicitar la financiacin para la compra de unidad. Resumen: El cliente, interesado en adquirir un auto a travs de financiacin, debe llenar la Planilla de Solicitud de crdito con sus datos personales. Entrega la solicitud al vendedor de turno. La planilla es revisada por el vendedor quin la remite al Oficial de Crdito. El oficial de crdito controla los datos de la solicitud. Si todo est correcto, la misma es firmada por el cliente y el oficial a de crdito.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 39

Referencia Cruzada: se relaciona con el caso tpico de Anlisis de Viabilidad del Crdito.

Caso Tpico: Anlisis de viabilidad del Crdito. Actores: Ente Financiador, Veraz, Oficial de Crdito. Finalidad: Efectuar la evaluacin y anlisis sobre la viabilidad del crdito. Resumen: El Ente financiador procede a solicitar un informe tcnico al Veraz sobre el solicitante de financiacin y su estado de deudas. Con el resultado de ste informe y toda la documentacin recibida, el Ente Financiador realiza un acuerdo base con las distintas alternativas que se le pueden ofrecer al cliente, informa al oficial de crdito el resultado y le enva el acuerdo. Referencia Cruzada: Se relaciona con el caso tpico Acuerdo Final del Crdito.

Caso Tpico: Acuerdo Final del Crdito Actores: Oficial del crdito, Cliente, Ente Financiador. Propsito: Otorgar Financiacin al cliente interesado en adquirir un auto a la empresa. Resumen: El oficial de crdito controla el informe VERAZ y procede a la evaluacin definitiva del cliente. Si est de acuerdo en otorgar la financiacin firma, junto al cliente interesado, el acuerdo final del crdito. En el acuerdo final se detalla el PLAN DE FINANCIACIN que son las alternativas elegidas por el cliente, entre las propuestas por el Ente financiador. Una vez que el cliente acepta y firma el acuerdo final del crdito, el oficial de crdito es el encargado de hacer registrar y archivar toda la dicumentacin en la carpeta de crdito. Referencia Cruzada: Se relaciona con el caso tpico de Anlisis de viabilidad del crdito. VI. Responsa falso y verdadero segn corresponda. a. ( ) La generalizacin en UML es lo mismo que la herencia. b. ( ) La generalizacin en UML lleva implcito el principio de clasificacin. c. ( ) El principio de clasificacin es lo mismo que la herencia. d. ( ) Un estereotipo es un mecanismo de extensin de UML. e. ( ) Los estereotipos son el nico mecanismo de extensin de UML. f. ( ) UML es un lenguaje que slo permite describir modelos conceptuales de datos.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 40

Capitulo II. Programacin Orientada a Objetos

2.1. Introduccin

Cuando programamos en lenguajes como C, Pascal, Cobol, Fortran, se debe tener en cuenta dos aspectos a la hora de abordar un problema que requiere una solucin informtica: que datos se van a manejar en la aplicacin y que cdigo, distribuido en funciones y/o procedimientos van a manipular tal informacin (un pensamiento en trminos de mquinas). A esta forma de programacin comnmente se le llama programacin estructurada. Pero que ocurre si nuestra aplicacin, requiere un cambio en una estructura de datos que se utiliza de manera recurrente en varias funciones de la aplicacin?, normalmente habr que realizar cambios en cada uno de los procedimientos que utiliza tal estructura, lo que redundara en un trabajo bastante tedioso, que en aplicaciones que contienen miles de lneas de cdigo, consumira una considerable cantidad de tiempo, y adems se tornara bastante difcil la correccin de errores y la depuracin del cdigo.

La programacin orientada a objetos (P.O.O) cambia esta perspectiva. En este estilo de programacin pensamos en trminos de objetos (si rpidamente revisamos nuestro ambiente, nos damos cuenta que estamos rodeados de objetos tales como carros, edificios, escuelas, hospitales, etc), lo que nos acerca ms a la manera de pensar de la gente. Cada objeto est constituido por sus propios datos y mtodos, lo que implica que, si se requiere un cambio en una estructura de datos especial, se realiza el cambio en el objeto que la contiene, sin causar mayores traumatismos al resto del cdigo de la aplicacin que hace uso de tal recurso.

Existen razones un poco ms tcnicas que motivan el uso del paradigma de la programacin orientada a objetos, algunas de stas son:

Abstraccin: Los sistemas software construidos con lenguajes de programacin de ms alto nivel reducen la complejidad, en trminos de que existe una alta disminucin en las lneas de cdigo utilizadas para programar una aplicacin, si se hiciera en un lenguaje de ms bajo nivel. En la P.O.O, se definen dos niveles de abstraccin: el nivel ms alto, es en trminos de Objetos, que lo utilizamos para describir el que de la aplicacin, mientras que el nivel ms bajo,

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 41

constituido por los datos y los procedimientos(o funciones) es utilizado para describir los detalles o el como. Los objetos como estructura bsica sirven para separar el que de una aplicacin del como, o su implementacin, al contrario de la programacin estructurada donde el que y el como se resuelven a la vez.

Modularidad: En la P.O.O la modularidad del sistema se da en base a Objetos, un nivel ms alto que los datos y funciones. El nmero final de mdulos, o sea objetos, es menor que el nmero original de datos y funciones.

Extensibilidad: Las aplicaciones software tienden a ser modificadas y ampliadas durante el transcurso de su vida. Con el paradigma de la Orientacin a objetos, los cambios se dan a dos niveles: modificacin externa o interna de los objetos. Los cambios internos a los objetos, afectan principalmente al propio objeto, mientras que los cambios externos a los objetos afectarn de mayor forma al resto del sistema.

Reutilizacin: Con la orientacin a objetos, el objeto es la unidad de reutilizacin ms pequea, pudindose aprovechar definiciones similares de objetos dentro de la misma aplicacin o incluso en distintas aplicaciones.

Originalmente, la programacin orientada a objetos se pens para un sistema de simulacin donde se quera modelar el comportamiento de objetos reales. Los conceptos de la P.O.O. (especficamente el concepto de clase y herencia) fueron implementados por primera vez en el lenguaje Simula 67, el cual es una extensin de otro ms antiguo llamado ALGOL 60, este lenguaje fue diseado en 1967 en la universidad de Oslo. Aunque Simula fue el padre de este paradigma, realmente fue SmallTak quien dio el paso definitivo y este es el que se debe considerar como el primer lenguaje de programacin orientado a objetos.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 42

2.2. Conceptos.

Los conceptos orientados a objetos (OO) estn bien establecidas en el mundo de la Ingeniera del Software. A continuacin se presentan las descripciones abreviadas de conceptos OO que se encuentran con frecuencia durante el modelado de anlisis. 2.2.1. Objeto

Entidad constituida por caractersticas y comportamientos. Instancia de una clase. Los objetos pueden ser (la figura, muestra algunos objetos):

Cosas tangibles: libro, televisor, computador, carro. Roles o papeles jugados y representados por personas: gerente, cliente. Organizaciones: empresa, equipo, rea de trabajo. Lugares: sala de embarque, bodega, gerencia. Incidentes: accidente, vuelo. Interacciones: relacionan varios objetos.

----Edificio ---- Mdico---- Cuenta bancaria----Accidente----

Un objeto consta de:

Estado: El estado de un objeto abarca todas las propiedades (caractersticas) de este, y los valores actuales de cada una de esas propiedades.

Comportamiento: El comportamiento viene definido por un conjunto de operaciones (mtodos), aplicables al objeto y definidos en su clase de pertenencia.

Identidad: Identidad es la propiedad de un objeto que lo lleva a distinguirse de otros. Todos los objetos tienen una identidad.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 43

Ejemplo de Objetos:

El objeto Camilo (identidad), tiene el siguiente estado:

ATRIBUTOS O PROPIEDADES

VALOR ATRIBUTO O PROPIEDAD

nombre: numeroTarjetaProfesional: especialidad:

Camilo Serrano 800963-963 Internista

El objeto Camilo puede tener los siguientes comportamientos (mtodos):


Diagnosticar. Curar. Prevenir enfermedades.

2.2.2. Clase

La clase es una agrupacin de objetos con caractersticas similares. Es una coleccin de objetos que comparten las mismas caractersticas y mtodos. Todos los objetos de una clase tienen los mismos atributos y comportamientos, son diferentes nicamente en los datos que contienen sus variables (o atributos).

Cada clase se representa en un rectngulo con tres compartimientos:


Nombre de la clase. Atributos de la clase. Operaciones de la clase

En la siguiente figura se muestran ms ejemplos de clases y objetos:


Clase: VehculoObjetos: avin, carro, barco Clase: AnimalObjetos: guila, asno, len, elefante Clase: FiguraObjetos: tringulo, hexgono, rombo, crculo Clase: PuntoObjetos: (1,3), (2,2), (2,1), (5,2.5).

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 44

Ejemplos de Clases y Objetos

Ejemplo de Clases:

Motocicleta color cilindraje velicidadMaxima arrancar() acelerar() frenar()

Las clases se relacionan con los objetos, en que un objeto es una instancia de una clase. Esto es, en el ejemplo anterior, la clase Motocicleta puede tener como instancias u objetos: Moto_Juan, Moto_Pedro etc.

Moto_Pedro

Moto_Juan

color: negro color: rojo cilindraje: 20 cilindraje: 30 velcidadMaxima: 80 km/h velocidadMaxima: 20 km/h

arrancar() acelerar() frenar()

arrancar() acelerar() frenar()

Una clase puede contener mtodos con el mismo nombre pero que difieren o bien en el nmero o en el tipo de parmetros que recibe dicho mtodo. Por ejemplo en la clase motocicleta, se puede definir el mtodo arrancar(int x) y mantener el mtodo

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 45

arrancar(), sin presentar ningn tipo de conflicto. A esto se le denomina Sobrecarga de mtodos. 2.2.3 Atributo

Coleccin de valores de los datos que describen una clase. Son datos miembros de una clase. Los datos pueden ser pblicos (accesibles desde otra clase) o privados (solo accesibles por cdigo de su propia clase). Tambin se les llama campos. Los atributos almacenan informacin relevante para la clase o para los objetos; por tanto, el nombre que se asigna a un atributo debe ser representativo de la informacin que almacena, de otro modo ser muy difcil saber que tipo de informacin representa. La primera letra del nombre de un atributo es minscula.

Ocultamiento de informacin:
o o

El valor de los atributos se oculta. Los objetos ofrecen operaciones para consultar el valor de los atributos.

Los otros objetos conocen y modifican los atributos por medio de operaciones.

Objectos recuerdan su informacin:


o o o

Los objectos guardan la informacin de sistema. Cada atributo tiene tipo, nombre y valor. El conjunto de valores de los atributos se denomina estado.

2.2.4. Mensaje

Los mtodos son los procedimientos que se invocan cuando un objeto recibe un mensaje. Un mensaje es una llamada a un mtodo. Cuando un objeto emisor enva un mensaje a un objeto receptor, tiene que especificarse lo siguiente:

Un receptor Un nombre de mensaje Argumentos o parmetros (si se necesitan).

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 46

Ejemplo de Mensaje:

Camilo.diagnosticar(). Se le enva el mensaje diagnosticar (llamada al mtodo diagnosticar de la clase mdico) al objeto Camilo, que es una instancia de la clase mdico.

La nica forma de comunicacin entre objetos son los mensajes. Los mensajes se usan de tres formas:
o o o

Ejecutar un cmputo y retornar el resultado. Devolver el valor de un atributo del objeto. Cambiar el valor de algn atributo del objeto.

Los mtodos son los servicios que un objeto le puede proveer a otro. Para que un objeto pueda enviar un mensaje a otro, debe existir un encadenamiento entre ellos.

2.2.5. Encadenamiento

Relacion bidimenccionales entre objetos que permiten enviar mensajes entre ellos.

: Persona nombre = Juna Perez

: Compaia nombre = Microsoft

: Consecionario nombre = MadiAutos : Carro marca = Mercedes modelo = 300E

: Carro marca = Mercedes modelo = 280E

2.2.6. Encapsulamiento

Es el mecanismo que permite juntar el cdigo y los datos. El encapsulado es como un envoltorio protector que evita que otro cdigo que est afuera pueda acceder arbitrariamente al cdigo o a los datos. El acceso al cdigo y a los datos se realiza de forma controlada a travs de una interfaz bien definida. Las clases pueden ser declaradas como pblicas public y como package (accesibles solo para otras clases

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 47

del package). La variable miembro y los mtodos pueden ser public, private, protected y package. De esta forma se puede controlar el acceso y evitar un uso inadecuado.

Separar los aspectos externos del objeto de los detalles internos de implementacin. Incluir dentro de un objeto todo lo que necesita, de tal forma que ningn otro objeto necesite conocer su estructura interna.

2.2.7. Herencia

La herencia es el proceso mediante el cual una clase adquiere las propiedades de otra(s) clase(s). Es una relacin entre clases en la cual una clase hija (derivada o subclase) hereda los atributos y mtodos de una clase padre (o superclase).

Relacin de jeraquia entre clases. Una de las claves principales de la reutilizacin. Todas las clases pertenecen a una jerarqua. Una clase incorpora todas las caracterisiticas de otra clase: atributos y operaciones.

Persona

Jugador (Representacion UML)

La herencia permite factorizar comportamiento y atributos. La jerarquizacin facilita el entendimiento del sistema (en pocos niveles). Se comprueba con la pregunta: es un tipo de?.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 48

Ejemplo de Herencia:

En la figura, la clase padre o superclase es Vehculo. Las clases hijas o las subclases son: Vehculo terrestre y Vehculo Areo. Esto significa que, la clase Vehculo terrestre, adems de tener como atributos kilometraje y velocidad, tambin tendr como atributos la marca, capacidad y modelo definido en la clase padre. Igualmente adems de tener el comportamiento cargar() tambin tendr transportar() como comportamiento, ya que esta definido en la superclase. Una clase derivada puede aadir nuevas variables y mtodos y/o redefinir las variables y mtodos heredados.

Vehculo marca Vehculo capacidad modelo transportar()

Vehculo_Terrestre kilometraje velocidad cargar()

Vehiculo_Areo aerolnea horarioVuelo volar()

Existen dos tipos de herencia:

Herencia simple: Proceso mediante el cual una clase adquiere las atributos y mtodos de sola una clase padre.
Miembro identificacin validarIngreso()

Empleado

salario
calcularSueldo()

Estudiante numeroSemestre retornarSemestre()

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 49

Herencia mltiple: Proceso mediante el cual una clase adquiere los atributos y mtodos de varias superclases. Una clase combina varias abstracciones.

Acutico

Terrestre

Anfibio

2.2.8. Poliformismo

Es la propiedad que indica, literalmente, la posibilidad que una entidad tome muchas formas, especficamente se refiere a que una caracterstica de una clase puede tomar varias formas. El polimorfismo representa en nuestro caso, la posibilidad de desencadenar operaciones distintas en respuesta a un mismo mensaje.

Dos o ms objectos responden al mismo mensaje de manera diferente.

rotar()

Figura Geomtrica

Ejemplo de Polimorfismo:

Cuando se describe la clase mamferos se puede observar que la operacin comer es una operacin fundamental en la vida de los mamferos, de modo que cada tipo de mamfero debe poder realizar la operacin o funcin comer. Esta accin se ejecutar de diferente forma, segn sea el objeto mamfero sobre el que se aplique.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 50

Mamfero comer()

Comer

Len

Oso

Tigre

Operaciones con el mismo nombre, pero deferente semntica, pueden ser invocados sobre objetos de diferentes tipos.

Bailarina.bailar()

Profesora.bailar()

Joven.bailar()

El mtodo ligado al mensaje se selecciona en tiempo de ejecucin. El mtodo solo puede ser ejecutado si el objeto que recibe el mensaje tiene un mtodo con el mismo nombre (propio o heredado).

El cliente no necesita saber el tipo de objecto con quien se comunican. Capacidad de varios objetos a responder al mismo mensaje. La misma operacin existe en varias clases. Cada clase tiene una forma diferente de hacer la operacin. El nombre y la semntica de la operacin es igual.

2.2.9. Instancia

Se llama instancia a todo objeto que derive de algn otro. De esta forma, todos los objetos son instancias de algn otro, menos la clase Object que es la madre de todas.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 51

2.2.10. Subclase

Una especializacin de la superclase. Una subclase puede heredar tanto los atributos como las operaciones de una superclase. Cada subclase hereda los mtodos de la superclase pero tiene la posibilidad de modificar localmente el comportamiento de estos mtodos.

2.2.11. Superclase

Tambin llamada una clase bsica, es una generalizacin de un conjunto de clases que estn relacionadas con ellas.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 52

Capitulo III. Arquitectura JAVA SE

3.1. Introduccin

La plataforma Java tradicional, el JDK o Standard Edition (SE), sigue un ritmo de evolucin constante con la aparicin de nuevas versiones aproximadamente cada dos aos. La versin 6, ahora llamada Java SE 6, est disponible desde el 11 de Diciembre de 2006. Lo primero que llama la atencin es el cambio de nomenclatura, que en muchos casos causa confusin. Hemos pasado del nombre tradicional de J2SE 1.4.x a J2SE 5.0 (tambin conocido como J2SE 1.5 o JDK 1.5), y a partir de la versin 6 a Java SE 6 (equivalente a J2SE 1.6, JDK1.6 o JDK 6).

Sun Java SE 7 es la primera versin construida a partir del cdigo de OpenJDK, el proyecto al que Sun ha contribuido su implementacin de Java, Adems de mejoras generales en rendimiento, estabilidad y calidad de cada nueva versin, tambin se tiene soporte directo de XML en el cdigo, mejoras en empaquetamiento de librerias y clases (superpackages). Aun as, lo ms importante de esta versin es que al tener licencia adicional GPL podr formar parte del core de distribuciones libres de linux como Debian, Ubuntu o Fedora lo que contribuir a una rpida popularizacin.

Este capitulo realiza una exploracion aserca de la historia, caracterisiticas, ventajas, desventajas y fundamenos lenguaje de programacin Java e introduccin al estudio de la plataforma JAVA SE.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 53

3.2. Origenes de Java

En 1985, E. Stroustrup extendi el lenguaje de programacin C a C++, es decir C con conceptos de clases y objetos, tambin por esas fechas se creo desde sus bases el lenguaje EIFFEL. En 1995 apareci el ms reciente lenguaje OO, Java desarrollado por SUN, que hereda conceptos de C++. El lenguaje de desarrollo ms extendido para aplicaciones Web, el PHP 5, trae todas las caractersticas necesarias para desarrollar software orientado a objetos. Adems de otros lenguajes que fueron evolucionando, como el Pascal a Delphi. Finalmente tambin otros lenguajes script como el ActionScript que si bien no es totalmente orientado a objetos pero s posee las caractersticas.

Los orgenes de Java se remontan al ao 1990, cuando un equipo de la compaa Sun Microsystems investigaba, bajo la direccin del ingeniero James Gosling, en el diseo y elaboracin de software para pequeos dispositivos electrnicos de consumo.

En un primer momento se pens en la utilizacin de lenguajes de programacin como C o C++, pero para poder compilar un programa en estos lenguajes es preciso adaptarlo a las caractersticas de la plataforma en la que debe funcionar, esta situacin constitua un gran inconveniente para las compaas dedicadas a la construccin de dispositivos electrnicos, pues cada pocas semanas aparecen en el mercado versiones ms potentes y baratas de los chips utilizados, y por lo tanto, el software que se haba diseado para un chip determinado deba modificarse y adaptarse para explotar las caractersticas de los chips de reciente aparicin.

Se hace patente la necesidad de introducir un nuevo lenguaje de programacin, que permita desarrollar programas independientes del tipo de plataforma. Los dispositivos que se pretenden fabricar son calculadoras, relojes, equipos de msica, cafeteras, etc, que no tienen una gran capacidad computacional, por lo que el nuevo lenguaje debe ser capaz de generar programas pequeos y rpidos, adems de ser fiables y robustos.

La primera versin de este nuevo lenguaje se denomin Oak (roble), pero ms tarde Sun descubri que este nombre estaba ya registrado, y lo tuvieron que cambiar, el nuevo nombre fue Java (una de las versiones sobre el significado del nombre es que

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 54

Java es un trmino popularmente empleado en California para designar caf de buena calidad).

A comienzos de 1993 aparecieron nuevas herramientas grficas para facilitar la comunicacin y navegacin por Internet, se concibi la idea de aplicar tcnicas de documentos con enlaces de tipo hipertextual para facilitar la navegacin por Internet, y se desarroll el primer browser (navegador Web o visualizador) de lo que se comenz a denominar World Wide Web. Esta herramienta era denominada Mosaic.

El equipo de James Gosling se plante como objetivo la utilizacin de Java como lenguaje en el que escribir aplicaciones que pudiesen funcionar a travs de Internet. Como resultado de su trabajo se desarroll un nuevo navegador completamente escrito en Java, llamado HotJava. Este navegador permita la integracin de pequeas aplicaciones en el interior de las pginas Web. El desarrollo de HotJava hizo patente que las caractersticas de Java se adaptan perfectamente a las peculiaridades de Internet.

A partir de su primera y sencilla versin Java ha ido creciendo progresiva y espectacularmente para pasar a ofrecer un potente y complejo lenguaje con el que se pueden abarcar una gran cantidad de campos. Java normalmente se refiere a la combinacin de tres cosas:

El lenguaje de programacin Java (un lenguaje de programacin orientado a objetos y de alto nivel). La mquina virtual de Java (una mquina virtual de alto rendimiento que ejecuta el bytecode en una plataforma de ordenador especfica; normalmente abreviada JVM).

La plataforma Java, una JVM que ejecuta el bytecode compilado de Java, normalmente llamando a un conjunto de libreras estndar como las proporcionadas por Java Standard Edition (SE) o Enterprise Edition (EE). Aunque estn unidos a propsito, el lenguaje no implica la JVM, ni viceversa.

Con plataforma nos referimos al ambiente de hardware y software en donde el programa se ejecuta, por ejemplo, plataformas como Linux, Solaris, Windows 2003 y MacOS. En casi todos los casos las plataformas son descritas como la combinacin

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 55

del sistema operativo y el hardware. La plataforma Java se diferencia de estas plataformas, es que es una plataforma slo de software y se ejecuta sobre las otras plataformas de hardware. En conclusin la plataforma Java tiene 2 componentes:

La mquina virtual de Java (JVM). El Java API (Application Programming Interface).

3.2.1. El lenguaje de programacin Java

Java est influenciado de varias maneras por C, C++ y Smalltalk, y tambin por ideas que ha tomado prestadas de otros lenguajes. Su sintaxis fue diseada para ser familiar a aquellos que estaban familiarizados con los lenguajes que descienden ms directamente de C, pero tiene los principios de la orientacin a objetos ms asumidos que C++, objetos fuertemente tipados y un sistema ms justo e inflexible de excepciones que requiere que cada mtodo que se llame trate cualquier tipo de excepcin o especifique que puede lanzarlas. La recogida de basura es automtica, de esta manera se evita al programador tener que liberar la memoria usada por los objetos que ya no se van a emplear. Tradicionalmente los lenguajes de programacin se han dividido en: compilados e interpretados. Los compilados necesitan ser traducidos por un programa llamado compilador al lenguaje mquina, que es el que entiende el ordenador. Como ejemplo de estos lenguajes podramos citar a C, C++, Visual Basic, Clipper, etc. Los interpretados, en cambio, son traducidos mientras se ejecutan, por ejemplo HTML,

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 56

WML o XML, por lo cual no necesitan ser compilados. As pues la diferencia entre estos lenguajes radica en la manera de ejecutarlos. Mientras que los compilados slo se compilan una vez y lo hacen pasando todo el programa a cdigo mquina (si da un error aunque sea en la ultima lnea no podramos ejecutar nada de nada), en el momento que lo hemos compilado correctamente se genera un archivo .exe que se puede ejecutar tantas veces como queramos sin tener que volver a compilar. Los interpretados en cambio, cada vez que los queramos ejecutar tendremos que interpretarlos lnea a lnea, es ms lento, pero puede ocurrir un error en la ultima lnea y a diferencia de los compilados, el programa se ejecuta justo hasta la lnea que produce el error. Java est diseado para que un programa escrito en este lenguaje sea ejecutado independientemente de la plataforma (hardware, software y sistema operativo) en la que se est actuando. Esta portabilidad se consigue haciendo de Java un lenguaje medio interpretado medio compilado. Se coge el cdigo fuente, se compila a un lenguaje intermedio cercano al lenguaje mquina pero independiente del ordenador y el sistema operativo en que se ejecuta (llamado en el mundo Java bytecodes).

Finalmente, se interpreta ese lenguaje intermedio por medio de un programa denominado mquina virtual de Java (JVM), que s depende de la plataforma.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 57

Los Java bytecodes permiten el ya conocido write once, run anywhere (compila una sola vez y ejectalo donde quieras). Podemos compilar nuestros programas a bytecodes en cualquier plataforma que tenga el compilador Java. Los bytecodes luego pueden ejecutarse en cualquier implementacin de la mquina virtual de Java (JVM). Esto significa que mientras el ordenador tenga un JVM, el mismo programa escrito en Java puede ejecutarse en Windows, Solaris, iMac, Linux, etc. 3.2.2. Caractersticas de Java

Podemos empezar diciendo que el lenguaje Java es de alto nivel (*) y sus caractersticas y ventajas ms importantes son:

Lenguaje orientado a objetos, sencillo y de gran rendimiento. Creacin de aplicaciones distribuidas. Licencias. Java es Open Source (Software libre o Cdigo abierto). La infraestructura para desarrollar en Java es gratuita, aunque algunos proveedores de servidores de aplicaciones o frameworks tienen costo. A partir del 13 de Noviembre de 2006, ya es un proyecto completamente libre, tiene la licencia elegida es GPL v2, que cuenta con el apoyo de Free Software Foundation (FSF). Lo que permiti contar con una gran variedad de proveedores.

Multiplataforma: Es un lenguaje independiente de la plataforma. Una aplicacin Java puede correr sobre diversos ambientes.

Interoperabilidad Multilenguaje. A partir de la versin 6 Java soporta aplicaciones con componentes en otros lenguajes (RUBY).

Documentacin. Java ofrece mucha documentacin de ayuda (herramientas, debuggers, editores), apoyado con un gran nmero de libreras que son soportadas por diversas empresas como IBM, Oracle, Jakarta, adems de encontrarse otra gran cantidad desarrolladas por terceros. Esto simplifica el desarrollo y la implementacin. De esta manera, se prev que las aplicaciones en Java sean cada vez ms rpidas, fiables y sencillas de escribir.

Java es un estndar abierto. Es abierto a todo el que quiera participar en la evolucin de Java, con esa intencin se cre el JCP (organismo que controla la evolucin de Java), el cual se integra con ms de 700 empresas, entre las que se hallan todas las grandes empresas como Sun, IBM, SAP, BEA, IONA,

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 58

Oracle, Nokia, Siemens, Siebel, Motorola entre otras, es decir Java no pertenece solamente a Sun.

Reutilizacin. Los desarrollos de una aplicacin permiten un alto grado de reutilizacin de componentes, por lo tanto un desarrollo en Java nunca empieza desde cero. Java implementa consigo un gran nmero de clases, incluidas gratuitamente en su entorno de desarrollo, para realizar muy variadas tareas que permiten al desarrollador centrarse en el negocio y no en la implementacin.

Seguridad. Provee diversos mecanismos de seguridad tanto a nivel de cdigo (un programa Java no se ve afectado por virus informticos) como a nivel de autenticacin y autorizacin de usuarios.

Es Multihilo. El beneficio de ser multihilo consiste en un mejor rendimiento interactivo y mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real est limitado a las capacidades del sistema operativo subyacente (Unix, Windows, etc.), an supera a los entornos de flujo nico de programa (single-threaded) tanto en facilidad de desarrollo como en rendimiento.

Extendible. Se puede extender para soportar otros servidores de aplicaciones y bases de datos. Adicionalmente, los componentes de software generados, se pueden extender acorde a las necesidades requeridas. Los componentes de cdigo generados para los proyectos, se pueden personalizar fcilmente dependiendo de necesidades y estndares particulares de cada aplicacin.

Se puede desarrollar con IDEs muy robustos. Algunos de ellos Open-Source como: NetBeans y Eclipse.

Alta conectividad con Bases de Datos, ERP, Sistemas legados (AS-400, CICS) y otros sistemas.

Es ms solicitado en el mercado de software por su gran cantidad de frameworks (Spring, Struts, Hibernate, etc) que facilitan el desarrollo de proyectos.

Escalabilidad. Puede cambiarse la configuracin y fcilmente adaptarlo a nuevas capacidades.

Desventajas de Java:

Curva de aprendizaje larga comparado con otros lenguajes. Java es una tecnologa que posee una gran variedad de conceptos que pueden confundir

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 59

(Servlets, JSP, Struts, Java Server Faces, Hibernate, EJB). Como existen muchas alternativas en la arquitectura de la aplicacin es complicado evaluar cual es la mejor combinacin por lo que se requiere de un arquitecto que sepa elegir la arquitectura ms adecuada para la problemtica.

La demanda de desarrolladores con un buen nivel de desarrollo en Java es complicado.

El cambio de arquitectura puede afectar dramticamente el desempeo. El desconocimiento de los frameworks puede llevar a desarrollar desde cero. Hay ambientes que no soportan la ltima versin de Java.

(*) Lenguajes de alto nivel: son aquellos en los que las instrucciones o sentencias son escritas con palabras similares a las de los lenguajes humanos (mayormente en ingls). Esto facilita la escritura y comprensin del cdigo al programador. 3.2.3. El entorno de desarrollo Java

En el mercado hay diversas aplicaciones comerciales que permiten desarrollar cdigo Java. La empresa Sun, quien creo Java, distrubuye gratuitamente el JDK (Java Development Kit). Se trata de un conjunto de programas y libreras que permiten desarrollar, compilar y ejecutar programas Java.

JRE (Java Runtime Enviroment): Entorno de ejecucin que sirve para poder ejecutar programas Java ya hechos. Este paquete provee la mquina virtual de Java JVM, para que el cdigo sea interpretado, independientemente del hardware del ordenador. Adems, contiene todo el conjunto de APIs indispensables para que todo cdigo Java pueda ejecutarse.

JDK (Java Development Kit) o SDK (Software Development Kit): Es un software que provee los componentes de desarrollo para la creacion, compilacion y ejecucion de programas en Java. Puede instalarse en una

computadora local o en una unidad de red. En la unidad de red se puede tener la aplicacin distribuida en varias computadoras y trabajar como una sola aplicacin.

IDE (Entorno de Desarrollo Integrado): Es un entorno de programacin que ha sido empaquetado como un programa de aplicacin, es decir, consiste en un

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 60

editor de cdigo, un compilador, un depurador y un constructor de interfaz grfica GUI. Es posible que un mismo IDE pueda funcionar con varios lenguajes de programacin.
o

NetBeans: El IDE ms popular, realizando integradamente en Java (y por tanto es multiplataforma). Consume bastantes recursos y tiene una arquitectura extendible con modulos especficos para desarrollo web, aplicaciones mviles, diseo UML.

Eclipse: El entorno de desarrollo Java gratuito mas utilizado. Tambien permite el desarrollo en C++ y otros lenguajes de programacin.

MyEclipse: Es la ms asequible y completa JEE e IDE de Desarrollo Web. Herramienta suite de fuente abierta Eclipse plataforma. UML,

MyEclipse es el Eclipse plugin de base Solucin para todas:

AJAX, Web, Servicios Web, JEE, JSP, XML, Struts, JSF, Persistencia de Java, EJB. Es la versin comercial de Eclipse.

3.2.4. La maquina virtual Java

Es el entorno en el que se ejecutan los programas Java, su misin principal es la de garantizar la portabilidad de las aplicaciones Java. Define esencialmente un ordenador abstracto y especifica las instrucciones (bytecodes) que este ordenador puede ejecutar. El intrprete Java especfico ejecuta las instrucciones que se guardan en los archivos cuya extensin es .class. Las tareas principales de la JVM son las siguientes:

Reservar espacio en memoria para los objetos creados. Liberar la memoria no usada (garbage collection). Asignar variables a registros y pilas. Llamar al sistema husped para ciertas funciones, como los accesos a los dispositivos.

Vigilar el cumplimiento de las normas de seguridad de las aplicaciones Java.

Esta ltima tarea, es una de las ms importantes que realiza la JVM. Adems, las propias especificaciones del lenguaje Java contribuyen extraordinariamente a este objetivo:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 61

Las referencias a arrays son verificadas en el momento de la ejecucin del programa.

No hay manera de manipular de forma directa los punteros. La JVM gestiona automticamente el uso de la memoria, de modo que no queden huecos.

No se permiten realizar ciertas conversiones (casting) entre distintos tipos de datos.

3.2.5. El API de Java Est formado por una amplia jerarqua de clases que cubren una gran cantidad de aspectos relacionados con el desarrollo de software en general. Esta organizado en packages ordenados por temas. El JSE permite la utilizacin de todos estos packages en el desarrollo de programas Java y el JRE permite la ejecucin de programas que usan cualquiera de las clases del API. La documentacin que acompaa al JSE contiene un manual de referencia completo ordenado por packages y clases de todo el contenido del API. Su consulta resulta imprescindible para cualquier desarrollo. 3.3. Configuracin del Entorno Java

Para poder crear, compilar y ejecutar aplicaciones Java debemos descargar e instalar el Software necesario (JDK) y fijar o modificar el valor de las variables de entorno (JAVA_HOME, PATH y CLASSPATH) del sistema.

JDK: Para la instalacin de este Software se requiere de una serie de pasos que son:
o o o o

Descargar el JDK 1.x de la web de SUN. Hacer doble click sobre jdk-x-windows-i586. Esperar unos instantes mientras se prepara la instalacin. Se abrir una ventana de bienvenida al proceso de instalacin e iremos al siguiente paso (Next).

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 62

Se mostrara la licencia del producto, la cual aceptaremos para proceder la instalacin.

Se muestra el directorio donde se instalara el programa, por defecto C:\Archivos de programa\Java\jdk1.6.0, si se desea se podr cambiar la ubicacin (Change). Tambien se puede visualizar los

componentes a instalar del programa.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 63

Se exhibir el proceso de instalacin del JDK 1.6, el cual tomara unos minutos.

Para instalar Java es necesario instalar JSE Development Kit (JDK) y JSE Environment (JRE). Por tanto se instalara el JDK y el JRE.

Se abrir una nueva ventana (JSE Runtime Environment) donde se deber seleccionar la ubicacin donde se desea instalar el JRE.

Se visualizara el proceso de instalacin que tardara unos minutos.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 64

Se concluye el proceso de instalacin satisfactoriamente (Finish).

Variable JAVA_HOME. Es una variable de entorno que apunta al directorio donde qued instalado el JDK.
o

Pulsa con el botn derecho del ratn sobre "Mi PC" y selecciona "Propiedades".

Selecciona la pestaa "Opciones avanzadas" y pulsa en el botn inferior "Variables de entorno".

Crear la variable de entorno JAVA_HOME.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 65

Pulse Aceptar.

Variable PATH. Especifica la ruta de acceso a los archivos ejecutables ms importantes del sistema; la modificacin de esta variable permite accesar los ejecutables Java (Javac, Javadoc, Java) proporcionadas con el JDK de cualquier directorio.
o

Tanto en el cuadro superior como el inferior, busca una variable que se llama "Path", haz click sobre ella y pulsa el botn "Modificar" (si aparece en los dos cuadros, haz lo siguiente dos veces).

En el cuadro de valor de variable, aade al final (cuidado, sin borrar nada y poner punto y coma (;) si el final del valor no lo tiene), la direccion donde esta la carpeta "bin" del JDK.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 66

Pulse Aceptar.

Variable CLASSPATH. Indica los directorios en los que se encuentran las clases de Java que queremos ejecutar. La configuracin de esta variable permite hacer uso de las APIs instaladas en el JDK.

Para crear la primera aplicacin Java, abra el bloc de notas y dijite el siguiente cdigo y guarde el archivo como MiClase.Java.

public class MiClase{ public static void main(String args[]){ System.out.println("Bienvenido al lenguaje de programacin Java"); } }
Para compilar el archivo, abra una consola de DOS y ubica el directorio donde se guardo el archivo MiClase.Java. Dijite el comando Javac MiClase.Java si todo sale bien no debe aparecer ningn mensaje en la lnea de comando y debe aparecer un archivo llamado MiClase.class en el mismo directorio del archivo MiClase.Java.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 67

Para ejecutar la aplicacin, en la misma consola de DOS digite la instruccin: Java MiClase. En la lnea de comandos deber aparecer: Bienvenido al lenguaje de programacin Java. 3.4. Eclipse El IDE Eclipse se puede obtener bajndolo directamente del sitio web oficial del

www.eclipse.org. Eclipse es, en el fondo, nicamente un armazn (workbench) sobre el que se pueden montar herramientas de desarrollo para cualquier lenguaje,

mediante la implementacin de los plugins adecuados. La arquitectura de plugins de Eclipse permite, dems de integrar diversos lenguajes sobre un mismo IDE, introducir otras aplicaciones accesorias que pueden resultar tiles durante el proceso de desarrollo como: herramientas UML, editores visuales de interfaces, ayuda en lnea para libreras, etc. Algunos de los plugins mas importantes es el JDT, plugin para el lenguaje Java, y el CDT, plugin para el lenguaje C/C++ En su origen, el Proyecto Eclipse era un proyecto de desarrollo OpenSource, soportado y mantenido en su totalidad por IBM. Bajo la direccin de IBM, se fund el Consorcio Eclipse al cual se unieron algunas empresas importantes como Rational, HP o Borland. Desde el da 2 de febrero de 2004, el Consorcio Eclipse es independiente de IBM y entre otras, est formado por las empresas: HP, QNX, IBM, Intel, SAP, Fujitsu, Hitachi, Novell, Oracle, Palm, Ericsson y RedHat, adems de algunas universidades e institutos tecnolgicos. Como Eclipse est escrito en Java, en necesario, para su ejecucin, que exista un JRE (Java Runtime Environment) instalado previamente en el sistema. La descarga bsica del entorno Eclipse incluye algunos de los plugins ms bsicos, pero siempre es deseable obtener alguna funcionalidad extra. Para ello, es necesario instalar nuevos plugins. En el apartado Community del sitio web oficial de Eclipse se pueden encontrar enlaces a cientos de plugins. Para aadir un nuevo plugin, basta con descomprimir el archivo descargado en el subdirectorio Plugins de la carpeta donde est instalado Eclipse. La prxima vez que se ejecute Eclipse, automticamente, se reconocern y aadirn los nuevos plugins instalados.

El entorno de desarrollo Eclipse, incluyendo sus plugins, est desarrollado por completo en el lenguaje Java. Un problema habitual en herramientas Java (como

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 68

NetBeans) es que son demasiado pesadas. Es decir, necesitan una mquina muy potente para poder ejecutarse de forma satisfactoria. En gran medida, estas necesidades vienen determinadas por el uso del API Swing para su interfaz grfico. Swing es una librera de widgets portable a cualquier plataforma que disponga de una mquina virtual Java pero a costa de no aprovechar las capacidades nativas del sistema donde se ejecuta, lo cual supone una ejecucin sensiblemente ms lenta que la de las aplicaciones nativas. SWT es una librera de widgets equivalente a Swing en la cual, se aprovechan los widgets nativos del sistema sobre el que se ejecuta. El hecho de aprovechar los widgets nativos, permite que la ejecucin de interfaces de usuario sea mucho ms rpida y fluida que si se utilizase Swing y, adems, siempre dispone del Look and Feel del sistema, sin necesidad de emularlo.

La contrapartida es que la librera SWT es nativa, es decir, es necesario disponer de una librera SWT especfica para cada sistema operativo. Existen versiones de SWT para los S.O. ms habituales, incluyendo Windows, Linux, HP-UX, MacOS, etc.

3.4.1. Ejecutar Eclipse

Eclipse no requiere de instalacin, vienen con un ejecutable que permite lanzar directamente el IDE Eclipse, solo tenemos que descomprimirlo en la carpeta donde queramos tenerlo instalado. Para ejecutarlo solo hay que arrancar el fichero Eclipse.exe.

Se tiene que crear las carpetas en las que guardar informacin sobre workspaces, logs, etc. Si se desea se podr cambiar la ubicacin (Change)

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 69

El entorno de Eclipse de describe a contuniacion:


Vistas Barra de Perspectivas

Barra de Herramientas principal

Editores Explorador de paquetes

Editores. Los Editores son el lugar donde se escribirn los programas. Es posible tener varios Editores abiertos a la vez, apilados uno encima de otro. En la parte superior de la ventana de Editores, se mostrarn solapas que permiten acceder a cada uno de los Editores abiertos (o bien cerrarlos directamente).

Vistas. Sirven para cualquier cosa, desde navegar por un rbol de directorios, hasta mostrar el contenido de una consulta SQL. Se puede decir que las Vistas son ventanas auxiliares para mostrar informacin, requerir datos, etc. Para seleccionar qu Vistas se deben mostrar, se utiliza la opcin Show View en el men Window. El Explorador de paquetes es una vista que muestra el rbol de directorios de los proyectos (cuando los haya).

Barra de Herramientas Pricipal. Contiene accesos directos a las operaciones mas usuales (guardar, abrir, etc.), botones que permiten lanzar la ejecucin de

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 70

herramientas externas y tareas relacionadas con el Editor activo (ejecutar un programa, depurar, etc.).

La barra de Perspectivas. Contiene accesos directos a las Perspectivas que se estn utilizando en el proyecto. Una Perspectiva es un conjunto de

ventanas (Editores y Vistas) relacionadas entre s. Por ejemplo, existe una Perspectiva Java que facilita el desarrollo de aplicaciones Java y que incluye, adems del Editor, Vistas para navegar por las clases, los paquetes, etc.

3.4.2. Creacin de Proyectos

Para poder realizar un programa en Eclipse es necesario crear un proyecto. Un Proyecto agrupa a un conjunto de recursos relacionados entre s (cdigo fuente, diagramas de clases o documentacin). Se puede crear un nuevo proyecto desde el men File\New\Project o desde la barra de herramientas principal o desde el explorador de paquetes (abriendo el men contextual y la opcin New\Project).

Cualquiera de estas tres opciones lanzar el wizard de creacin de proyectos. Para iniciar un proyecto Java se debe seleccionar la opcin Java \Java Project, despus un nombre y una ubicacin para el nuevo Proyecto, se puede opcionalmente realizar algunas configuraciones como son:

Crear un subdirectorio para almacenar el cdigo y un subdirectorio diferente para almacenar las clases compiladas.

Indicar las dependencias del nuevo proyecto respecto a proyectos anteriores (existentes en el mismo workspace).

Indicar la ubicacin de libreras (.jar) que necesita el proyecto y/o definir variables de entorno.

Definir el orden de bsqueda de los classpaths que se manejan, principalmente para solucionar conflictos en caso de que haya clases con el mismo nombre cualificado.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 71

Es siempre recomendable definir una carpeta (por ejemplo, de nombre src) para contener el cdigo y otra (de nombre bin, por ejemplo) donde se dejarn los .class generados. En la pestaa Libraries, se pueden aadir todos los .jar que sean necesarios (con el botn Add External Jars). Todas estas configuraciones pueden modificarse en cualquier momento a travs del men Project\Properties\Java Build Path.

A modo de ejemplo, vamos a crear un Proyecto Java, cuyo nombre ser MiProyecto. Su ubicacin ser la carpeta por defecto y no requerir ningn .jar extra en el classpath. Adems, se configurar como carpeta para el cdigo, el directorio MiProyecto/src y para las clases compiladas, se utilizar la carpeta MiProyecto/bin.

Ahora se puede crear dentro de la carpeta src, paquetes package para agrupar las clases que poseen relacin por sus caractersticas. Para crear un nuevo paquete se da clic derecho sobre la carpeta en este caso src opcin New\Package.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 72

El modo ms directo de crear una nueva clase (o interface) es utilizar el wizard de creacin de clases se puede lanzar dando clic derecho sobre el paquete que se desea crear la clase, en este caso Clases opcin New\Class. El wizard de creacin de clases, se compone de un nico formulario en el que se debe indicar las caractersticas de la nueva clase o interface que se quiere crear: nombre, superclase, interfaces que implementa, etc. Aprovechando el proyecto MiProyecto que se ha creado y el paquete Clases, se puede ahora crear una nueva clase, utilizando el wizard. Esta clase se llamar MiClase.

Ahora en la seccin del editor, dijite el cdigo que se ejecuto anteriormente por DOS.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 73

Consola

La compilacin es una tarea que se lanza automticamente al guardar los cambios realizados en el cdigo. Por esta razn es prcticamente innecesario controlar manualmente la compilacin de los proyectos. En caso de necesidad, existe una opcin en la entrada Project del men principal, llamada Rebuild Project que

permite lanzar todo el proceso de compilacin completo (tambin existe la entrada Rebuild All para re-compilar todos los proyectos abiertos).

Boton depurador

Boton de Ejecucin

Boton depurador: Provoca la ejecucin paso a paso de los programas. Boton de Ejecucion. Si se oprime el propio botn, en este caso, se repetir la ltima ejecucin realizada, o bien sobre la flecha a su lado lo cual permite ver el men de ejecucin. El men de ejecucin, a su vez tiene dos partes. La entrada Run As permite ejecutar directamente la clase que se est mostrando en la ventana del Editor activo, utilizando la configuracin de ejecucin por defecto. La entrada Run, permite definir nuevas

configuraciones de ejecucin.

La consola es la vista sobre la cual se redirecciona tanto la entrada como la salida estndar, del programa que se est depurando (o ejecutando).

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 74

Cuando se deja de escribir durante un determinado intervalo de tiempo se muestran, si los hay, todos los trminos (palabras reservadas, nombres de metodos, de

variables, de campos, etc.) que empiecen por los caracteres escritos. Si se escriben determinados caracteres (como el punto, por ejemplo) se puede provocar la ejecucin del mecanismo de code completion sin necesidad de esperar a que pase el tiempo establecido.

Los templates son plantillas de cdigo (generalmente porciones de cdigo de uso habitual y muy repetitivo) que se escriben automticamente. A la ventana de configuracin de templates se accede a travs del men principal en la opcin Window\Preferences\Java\Editor\Templates.

Para formatear el cdigo que muestra el Editor activo, basta con seleccionar la entrada Source\Format del men contextual que aparece al pulsar con el botn derecho del ratn sobre el propio Editor. Para generar Javadoc con Eclipse, seleccionar la opcin Generate Javadoc del men Project.

3.4.3. Windows Builder Pro Instantiations ofrece un paquete, que incluye Swing Designer, SWT Designer (para desarrollos en SWT) y GWT Designer (para desarrollos en Google Web Toolkit). El editor visual es el mismo para todos ellos. Con WindowsBuilder Pro se pueden crear ventanas complicadas en cuestin de minutos. Este programa puede ser descargardo con crack. Los pasos para la instalacin del paquete se presentan a continuacion.

Hacer doble clic sobre Designer_v6.7.0_win32_x86 y luego clic en ejecutar. Se abre una ventana de presentacion del paquete.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 75

Se abre una ventana de bienvenida al proceso de instalacin.

Se Acepta la licencia.

Se muestra el directorio donde se instalara el programa, por defecto C:\Archivos de programa\Instantiations, si se desea se podr cambiar la ubicacin (Change).

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 76

Se recomienda instalar los IDEs Eclipse o MyEclipse antes de instalar Window Builder Pro, para luego seleccionar los productos existentes a los cuales le vamos agregar este paquete.

La siguiente ventana permite limpiar la cache de configuracin de informacin Eclipse.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 77

Se verifica la correcta instalacin del paquete e iremos al siguiente paso (Next) para finalizar el proceso de instalacin.

Al ejecutar Eclipse nos ubicamos en el men Windows\Preferences y deber aparacercer el Designer. Luego damos clic en Designer\Registration and Activation, para resgistrar y activar el producto.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 78

El cdigo generado se presenta a contuniacin:


package Clases; import Java.awt.BorderLayout; import Javax.swing.JFrame; import Javax.swing.JLabel; import Javax.swing.JPanel; public class MiFrame extends JFrame { private JLabel label; private JPanel panel; public MiFrame() { super(); getContentPane().add(getPanel(), BorderLayout.CENTER); } /** * @return */ protected JPanel getPanel() { if (panel == null) { panel = new JPanel(); panel.add(getLabel()); } return panel; } /** * @return */ protected JLabel getLabel() { if (label == null) { label = new JLabel(); label.setText("New JLabel"); } return label; } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 79

3.5. Arquitectura JAVA SE Plataforma base del lenguaje Java donde puedes hacer aplicaciones Stand Alone, tanto JAVA EE y JAVA ME se basan en JAVA SE. Es el conjunto de herramientas software que permite el desarrollo y la ejecucin de programas Java. Es gratuito y de libre distribucin. Dentro del JSE se incluyen el compilador y la JVM (Java Virtual Machine), que tambin se conoce como Intrprete de Java.

Java Standard Edition, comprende las libreras bsicas del lenguaje, as como las APIs ms comnes.

Paquetes
java.applet java.awt java.awt.color java.awt.datatransfer Proporciona las clases necesarias para crear un applet. Contiene todas las clases para crear interfaces de usuario, graficos e imgenes. Proporciona las clases para espacios de color. Proporciona las interfaces y clases para la transferencia de datos entre y dentro de las aplicaciones. Drag-and-Drop proporciona un mecanismo para transferir informacin entre dos entidades asociados de manera lgica con elementos de presentacin en el GUI. Proporciona las interfaces y clases para tipos de eventos disparados por los componentes AWT. Ofrece clases y la interfaz en relacin con las fuentes. Proporciona las clases de Java 2D para definir y realizar operaciones sobre los objetos relacionados con la geometra bidimensional. Proporciona clases e interfaces para la entrada del mtodo framework.

java.awt.dnd

java.awt.event

java.awt.font java.awt.geom

java.awt.im

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 80

java.awt.im.spi

java.awt.image java.awt.image.renderable

java.awt.print java.beans java.beans.beancontext java.io

java.lang java.lang.annotation java.lang.instrument

java.lang.management

java.lang.ref

java.lang.reflect

java.math

java.net java.nio

Proporciona las interfaces que permiten el desarrollo de mtodos de entrada que se pueden utilizar con cualquier entorno de ejecucin de Java. Ofrece clases para crear y modificar imgenes. Proporciona clases e interfaces para la produccin de prestacin independiente de las imgenes. Proporciona clases e interfaces para una impresin general de la API. Componentes basados en la arquitectura JavaBeansTM. Proporciona clases e interfaces relacionados el contexto bean. Proporciona sistema de entrada y salida a travs de flujos de datos, serializacin y el sistema de archivos. Ofrece clases que son fundamentales para el diseo del lenguaje de programacin Java. Ofrece biblioteca de apoyo para el lenguaje de programacin Java anotacin instalacin. Provee servicios que permiten el lenguaje de programacin Java, como instrumento para que los programas se ejecuten en la JVM. Proporciona la interfaz de gestin para el seguimiento y la gestin de la mquina virtual Java, as como el sistema operativo en el cual la mquina virtual Java est corriendo. Proporciona material de referencia de clases de objetos, que apoyan un limitado grado de interaccin con el recolector de basura. Proporciona clases e interfaces para la obtencin de informacin acerca de reflexin clases y objetos. Ofrece clases para la realizacin de precisin arbitraria de la aritmtica entera (BigInteger) y de precisin arbitraria aritmtica decimal (BigDecimal). Proporciona las clases para la ejecucin de aplicaciones en red. Define buffers, que son contenedores de datos, y ofre|ce una visin general de la NIO otros paquetes. Define canales, que representan las conexiones a las entidades que son capaces de realizar operaciones de E / S, tales como archivos y tomas de corriente; define selectores, para multiplexada, no el bloque de operaciones de E / S. Prestador de servicios para las clases del paquete Java.nio.channels. Define caracteres, decodificadores y codificadores, para traducir entre bytes y caracteres Unicode.

java.nio.channels

java.nio.channels.spi java.nio.charset

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 81

java.nio.charset.spi java.rmi java.rmi.activation java.rmi.dgc java.rmi.registry java.rmi.server java.security java.security.acl

Prestador de servicios para las clases del paquete Java.nio.charset. Proporciona el paquete RMI. Brinda apoyo para la activacin de objetos RMI. Proporciona clases e interfaz para RMI distribuida de garbage-collection (DGC). Proporciona una clase y dos interfaces para el registro RMI. Proporciona clases e interfaces para para apoyar el lado del servidor de RMI. Proporciona las clases e interfaces para la seguridad del framework. Las clases e interfaces en este paquete han sido sustituidos por clases en el paquete Java.security. Proporciona clases e interfaces para el anlisis sintctico y la gestin de certificados, listas de revocacin de certificados (CRL), y la certificacin paths. Proporciona las interfaces para la generacin de RSA (Rivest, Shamir y Adleman AsymmetricCipher algorithm) claves, tal como se define en el Laboratorio de RSA. Proporciona clases e interfaces para las especificaciones de la llave y los parmetros del algoritmo. Proporciona el API para acceder y procesar datos almacenados en una fuente de datos (normalmente una base de datos relacional), utilizando el lenguaje de programacin Java. Proporciona clases e interfaces para el manejo de texto, fechas, nmeros Proveedor de servicios de las clases en el paquete Java.text. Contiene las colecciones Framework. Utilidad de las clases comnmente til para la programacin concurrente. Un pequeo conjunto clases toolkit que apoyan la programacin en variables de bloque sun hilos seguro. Proporciona clases e interfaces de un Framework para el bloque y espera de los metodos de sincronizacion y monitores. Ofrece clases para leer y escribir el JAR (Java Archive) formato de archivo, que se basa en la estandar del formato ZIP con un archivo de manifiesto opcional. Proporciona las clases e interfaces de la plataforma J2SE. Este paquete permite a las aplicaciones guardar y recuperar el usuario, preferencia del sistema y datos de la configuracin.

java.security.cert

java.security.interfaces

java.security.spec

java.sql

java.text java.text.spi java.util java.util.logging java.util.concurrent.atomic

java.util.concurrent.locks

java.util.jar

java.util.logging java.util.prefs

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 82

java.util.zip

Proporciona clases de lectura y escritura del formato estndar ZIP y GZIP. Define un contrato entre los componentes de la usuario-interface y una tecnologa del asistencia que proporcionan acceso a esos componentes. Provee las clases e interfaces para operaciones criptogrficas. Provee a las interfaces las llaves de DiffieHellman como se define en los PKCS #3 de Laboratorios de RSA. Provee clases e interfaces para la llave de especificaciones y especificaciones de algoritmos. El paquete principal de I/O (entrada y salida) de imgenes de java API. Paquete que contiene las clases pblicas usadas para la creacin de bmp.

javax.accessibility

javax.crypto javax.crypto.interfaces

javax.crypto.spec

javax.imageio

javax.imageio.plugins.bmp

javax.imageio.plugins.jpeg Clases que soportan la creacin de JPGE. javax.lang.model Clases y jerarquas de paquetes usados para el modelo de programacin del lenguaje de java. Interface usada para el modelo de elementos del lenguaje de programacin de java. Interface usada para el modelo de los tipos de lenguaje de java. Proporciona las principales clases para Java Direccin de Extensiones. Proporciona las clases que llevan a cabo carga dinmica adelantada. Proporciona la definicin de las clases de monitoreo. El conector de RMI es un conector para el JMX, API Remoto que acostumbra a RMI transmitir al cliente, pide a un servidor de MBean remoto.

javax.lang.model.element

javax.lang.model.type

javax.management javax.management.loading

javax.management.monitor

javax.management.remote.rmi

javax.net javax.net.ssl

Proporciona clases para aplicaciones de red. Proporciona clases para el paquete de seguridad de sockets. Proporciona las clases e interfaces

javax.print

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 83

principales para el servicio de impresin javax.rmi javax.rmi.corba javax.rmi.ssl Proporciona aplicaciones de RMIClientSocketFactory y RMIServerSocketFactory encima de la Capa de Seguridad de Soquects (SSL) o Capa de seguridad de Transporte (TLS) protocolos. javax.security.auth.spi Este paquete proporciona la interface a ser usada para llevar a cabo mdulos de autenticacin de paquetes. Proporciona clases para certificados de llaves pblicas. Proporciona el API para servidor de acceso de la fuente de datos lateral y proceso del JavaTM del lenguaje de programacin. Las interfaces normales y las clases bajas para JDBC las aplicaciones de RowSet. Proporciona los componentes JBUTTON, JLABEL ect. de Java. Contiene usuarios APIs para RMI-IIOP. Contiene portabilidad APIs para RMI-IIOP.

javax.security.cert

javax.sql

javax.sql.rowset

javax.swing

javax.swing.border

Proporciona clases e interfaces para dibujar fronteras especializadas alrededor de un componente de Swing. Contiene las clases e interfaces usadas por el componente de JColorChooser. Proporciona eventos componentes de Swing. disparados por

javax.swing.colorchooser

javax.swing.event

javax.swing.filechooser javax.swing.plaf.basic

Contiene las clases e interfaces usadas por el componente de JFileChooser. Proporciona interfaz de usuario de objetos construidos con arreglo a los principios bsicos lookAndFeel. Proporciona interfaz de usuario de los objetos que combinan 2 o mas lookAndFeel. Proporciona clases e interfaces para hacer frente a javax.swing.JTable. Proporciona clases e interfaces para hacer frente a javax.swing.JTree. Permite a los desarrolladores proporcionar apoyo para deshacer / rehacer en aplicaciones tales como editores de texto.

javax.swing.plaf.multi

javax.swing.table

javax.swing.tree javax.swing.undo

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 84

javax.tools

javax.xml.bind.util javax.xml.crypto javax.xml.crypto.dsig.keyinfo

Proporciona las interfaces de herramientas que pueden ser invocadas de un programa, por ejemplo, compiladores. Utilidades cliente de clases de utilidad. Comn para las clases de criptografa XML. Clases para analizar el procesamiento y llaves de informacin de elementos y estructuras. Proporciona clases que permiten el procesamiento de documentos XML. Proporciona el API para la creacin y fomento de mensajes SOAP. Este paquete proporciona una API para la validacin de documentos XML. Este paquete contiene el ncleo JAX-WS API.

javax.xml.parsers javax.xml.soap javax.xml.validation javax.xml.ws

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 85

3.6. Comentarios Los comentarios son notas que puede aadir el desarrollador en un programa de Java, son utilizados para hacer aclaraciones y darle legibilidad al cdigo desarrollado, Java soporta tres tipos de comentarios.

// Es utilizado para realizar un comentario en una sola lnea.


System.out.println("hola"); // imprime hola en la pantalla.

/* */ Se utiliza cuando se desea hacer un comentario en varias lneas.


/*Este es un ejemplo que muestra cmo se hace un comentario multilnea.*/

/** */ Es utilizado para gernerar automaticamente la documentacin Javadoc.


/** * Retorna un objecto tipo imagen que puede ser pintado sobre * la pantalla. El argumento url debe tener un valor absoluto * {@link URL}. El argumento nombre es especificado en base * a la url. * <p> * Este mtodo siempre retorna inmediatamente, sin importar * si existe o no la imagen. Cuando este applet intente * pintar una imagen en la pantalla, los datos son leidos. * Los grficos primitivos del dibujo implementaran * la imagen. * * @param url Una URL absoluta danto la ruta fsica de * la imgen * @param nombre El nombre de la imgen, relativo al * argumento url * @return La imgen especifcada en la URL * @see Image */ public Image getImagen(URL url, String nombre) { try { return getImagen(new URL(url, nombre)); } catch (MalformedURLException e) { return null; } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 86

Estos comentarios deben ser colocados inmediatamente antes de la declaracin de una variable, mtodo o clase. Para que el generador de documentacin Javadoc pueda construir de manera adecuada el html de informacin.

Javadoc es una herramienta para documentar el cdigo mediante comentarios, pero a la vez provee una herramienta que permite extraer esa documentacin de forma que sea til para el usuario de la misma. Bsicamente Javadoc es un programa, que toma los comentarios que se colocan en el cdigo con marcas especiales y construye un archivo HTML con clases, mtodos y la documentacin que corresponde. Este HTML tiene el formato de toda la documentacin estndar de Java provista por Sun. La documentacin a ser utilizada por Javadoc se escribe en comentarios que comienzan con /** (notar el doble *) y que terminan con */. A la vez, dentro de estos comentarios se puede escribir cdigo HTML y operadores para que interprete Javadoc (generalmente precedidos por @). Aparte de los comentarios propios, la utilidad Javadoc nos proporciona una serie de etiquetas para completar la informacin que queremos dar de una determinada clase o mtodo. Hay dos tipos de etiquetas: o o Etiquetas de bloque: slo se pueden utilizar en la seccin de etiquetas que sigue a la descripcin principal. Son de la forma: @etiqueta. Etiquetas inline: se pueden utilizar tanto en la descripcin principal como en la seccin de etiquetas. Son de la forma: {@tag}, es decir, se escriben entre los smbolos de llaves.

A continuacin se presentan algunas etiquetas: o

@author nombre: Indica el autor de la clase en el argumento nombre. Un comentario de este tipo puede tener ms de un autor en cuyo caso podemos usar tantas etiquetas de este tipo como autores hayan colaborado en la creacin del cdigo fuente o bien podemos ponerlos a todos en una sola etiqueta. En ste ltimo caso, Javadoc inserta una (,) y un espacio entre los diferentes nombres.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 87

@deprecated comentario: Aade un comentario indicando que este API no debera volver a usarse, aunque aun siga perteneciendo a la distribucin del SDK que estemos utilizando, por estar desautorizado o "desfasado". No obstante, sto es slo una advertencia que nosotros damos a los usuarios de nuestras API's, al igual que las distribuciones de Sun hacen con nosotros. Realmente, lo que estamos haciendo al decir que una determinada API est desfasada es prevenir de que en un futuro podrn surgir incompatibilidades si seguimos usndolas ya que ste es el paso a previo a la desaparicin del API en concreto.

o o

@exception nombre-clase descripcin: Esta etiqueta acta exactamente igual que @throws. {@link nombre etiqueta}: Inserta un enlace autocontenido que apunta a nombre. Esta etiqueta acepta exactamente la misma sintxis que la etiqueta @see, que se describe ms abajo, pero genera un enlace autocontenido en vez de colocar el enlace en la seccin "See Also". Dado que esta etiqueta usa los carcteres { } para separarla del resto del texto inline, si necesitas emplear el caracter "}" dentro de la etiqueta debes usar la notacin HTML &#125.

@param parmetro descripcin: Aade un parmetro y su descripcin a la seccin "Parameters" de la documentacin HTML que generar. Por tanto, para cada mtodo emplearemos tantas etiquetas de este estilo como parmetros de entrada tenga dicho mtodo.

o o

@return descripcin: Aade a la seccin "Returns" de la documentacin HTML que va a generar la descripcin del tipo que devuelve el mtodo. @see referencia: Aade un cabecero "See Also" con un enlace o texto que apunta a una referencia. El comentario de la documentacin puede contener cualquier nmero de etiquetas de este tipo y todas, al generar la documentacin, se agruparn bajo el mismo cabecero.

@since texto: Indica con texto desde cundo se cre este paquete, clase o mtodo. Normalmente se pone la versin de nuestra API en que se incluy, as en posteriores versiones sabremos a qu revisin pertenece o en qu revisin se aadi.

@serial field-description: Su uso est destinado a sealar un campo serializable. Por defecto, todos los campos (variables) son susceptibles de

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 88

ser serializados lo cual no quiere decir que nuestra aplicacin lo tenga que hacer. Por tanto, sala slo cuando tengas una variable serializable. o @serialField field-name field-typefield-description: Documenta un

componente ObjectStreamField de un miembro serialPersistentFields de una clase Serializable. Esta etiqueta se debera usar para cada componente ObjectStreamField. o @serialData data-description: Se emplea para describir los datos escritos por el mtodo writeObject y todos los datos escritos por el mtodo Externalizable.writeExternal. Esta etiqueta puede ser usada en aquellas clases o mtodos que intervengan los mtodos writeObject, readObject, writeExternal, and readExternal. o @throws nombre-clase descripcin: Esta etiqueta es la gemela de @exception. En ambos casos, se aade una cabecera "Throws" a la documentacin generada con el nombre de la excepcin que puede ser lanzada por el mtodo (nombre-clase) y una descripcin de por qu se lanza. o @version version: Aade un cabecero a la documentacin generada con la versin de esta clase. Por versin, normalmente nos referimos a la versin del software que contiene esta clase o miembro. o o o

Etiquetas para la documentacin de Paquetes: @see @since @author {@link}. Etiquetas para la documentacin de Clases e Interfaces: @see @since @author {@link}. Etiquetas para la documentacin de Constructores y Mtodos: @see @since @param @return (mtodos; no constructores) @throws

@exception {@link}. o Etiquetas para la documentacin de Atributos: @see @since {@link} {@value}. 3.7. Identificadores Los identificadores son el medio por el cual el lenguaje Java asigna un nombre a una clase, variable o mtodo. Existe una regla para los identificadores que indica que debe comenzarse por alguna letra del alfabeto. Bien sea mayscula, o por los caracteres especiales $ _, el resto de caracteres como por ejemplo los dgitos no pueden ser

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 89

utilizados para comenzar un identificador.

El contenido restante del identificador,

podr estar conformado por dgitos, letras y los caracteres especiales anteriormente mencionados. Es posible utilizar cdigo Unicode para declarar un identificador. Por ejemplo:
char \u0061 = 'x'; /*Compila y corre sin ningn problema, en este caso se crea una variable cuyo nombre es el cdigo Unicote 61, es decir, la letra a */ System.out.println(a);

Si se trata de acceder a la variable, a travs de un system.out.println(a), se obtiene el valor asignado a la variable que en este caso es x. De tal manera, cualquier carcter dentro de un cdigo, puede ser reemplazado por su equivalente de valor Unicode. 3.8. Keywords

Los keywords o palabras claves, son como su nombre lo indican, palabras que no pueden ser utilizadas como identificadores para dar nombre a variables, mtodos o clases. En total son 49 palabras claves todas son declaradas en minsculas, a

continuacin se enumeran las palabras claves:

Abstract assert bolean break byte case catch char class const

continue default do double else extends final finally flota for

goto if implementes import instanceof int interface long native new

package private protected public return short static strictfp super switch

synchronized this throw throws transient try Void Volatile While

Las dos palabras en negrilla (const y goto), no tienen ningn significado en el lenguaje Java. Cuando se disearon las primeras versiones del lenguaje, se supuso que estas dos palabras podran ser utilizadas para satisfacer las necesidades de algunos programadores. Sin embargo, nunca se aplicaron.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 90

Tambin se debe comentar que las palabras true, false y null tampoco pueden ser utilizadas como identificadores, estas tres palabras se conocen con el nombre de literales o palabras reservadas. No son consideradas palabras clave por el hecho de que no aportan ninguna funcionalidad al lenguaje, simplemente aportan un valor a tomarse en cuenta en una porcin de cdigo. 3.9. Tipos de datos primitivos El lenguaje de programacin de Java posee mltiples maneras de construir tipos de datos y bsicamente se dividen en dos amplias categoras, tipos primitivos y tipos de clases. Los tipos primitivos son simples valores, no son objetos. Los tipos de clases son utilizados para tipos de datos ms complejos, incluyendo los tipos que usted pueda crear. Los tipos de clases son usados para crear objetos.

Existen ocho tipos de datos primitivos:


byte, short int long float, double boolean char

Los enteros los flotantes El bolean El carcter

3.9.1 Boolean A diferencia de otros lenguajes en donde pueden utilizarse los dgitos para representar un estado boolean, en Java la nica forma de representar este tipo de dado es a travs de las palabras reservadas true y false. Por defecto, cuando Java inicializa una variable de tipo boolean, la inicializa en false.

A pesar del aspecto no orientado a objetos de los tipos de datos primitivos los diseadores del lenguaje crearon clases para satisfacer esta desventaja, las cuales poseen una utilidad superior a los mismos tipos de datos. Estas clases se conocen con el nombre de clases wrapper, clases que proveen un mecanismo para almacenar valores primitivos dentro de objetos y poder ofrecer actividades reservadas exclusivamente para los objetos.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 91

Para el tipo de boolean la clase wrapper es la clase Boolean. Todas las clases wrapper estn incluidas dentro del paquete Java.Lang. Existen dos formas de inicializar un objeto de tipo Boolean, la primera manera pasando como argumento un booleano y la segunda forma pasando como argumento un string, en donde cualquier string distinto del string true se considera false ejemplos:
Boolean Boolean Boolean Boolean Boolean Boolean a b c d e f = = = = = = new new new new new new Boolean Boolean Boolean Boolean Boolean Boolean ("cualquier cosa"); // False (false); // False (null); // False ("false"); // False ("true"); // True () // Error de complicacin

Es importante mencionar que un objeto de tipo Boolean no puede ser utilizado como una expresin tradicional de bolanos. Por ejemplo:
Boolean b = new Boolean ("true"); if (b) // Error de compilacin

3.9.2. Char El char se crea con un tamao en memoria de 16 bits sin signo, es decir que se extiende desde 0 hasta 215 - 1. Se acepta esta cantidad de caracteres porque Java trabaja con el formato de caracteres Unicode, esto para dar posibilidad de la utilizacin de smbolos que pueden emplearse en diversos idiomas, cosa contraria al cdigo ASCII, en donde solamente existen 255 caracteres. De tal manera, el conjunto de caracteres Unicode alcanza los 65535 caracteres, que se extienden en formato hexadecimal desde el 0000 hasta ffff. En Java, para referirse a un carcter a travs de su nmero Unicode se coloca la expresin \uXXXX. Es decir que para la letra A el nmero Unicode es \u0041 que es decimal equivale a 65. Es posible utilizar distintos tipos de formatos para representar un carcter en Java. Ejemplo:

char c = 65; // El valor de c es A char c = '\u0041'; // El valor de c es A char c = 'A'; // El valor de c es A

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 92

Una variable de tipo char es inicializada a travs del cdigo Unicode \u000. El carcter \ se utiliza como carcter de escape a travs del cual se pueden representar caracteres especiales o realizar alguna actividad, a continuacin se muestran las posibles representaciones con el carcter \:

\t \r \n \b \f \xxx

Tabulacin Retorno de carro Cambio de lnea Espacio hace atrs (borrar) Salto de pgina Representacin octal de un carcter; xxx debe estar comprendido entre un valor de 000 y 377

\uxxxx \ \\ \

Representacin Unicode de un carcter, donde xxxx es un formato hexadecimal comprendido entre 0000 y FFFF. Carcter Carcter \ Carcter

Observe el siguiente ejemplo:

char char char char

a = '\u000A'; b = '\u000D'; al = 10; bl = 13;

En teora, el cdigo Unicote asignado a la variable a, representa el cdigo ASCII 10, que como es conocido, este cdigo simboliza el cambio de lnea para una cadena de caracteres. En Java, la primera lnea de este ejemplo arroja un error de complicacin, esto debido al proceso que se utiliza para compilar, en donde lo primero a efectuarse ebebebebe en un archivo Java es validar sintcticamente en formato Unicode todo lo reflejado en ese archivo, de esta manera el encontrarse son la sentencia \u000A se interpreta como si se estuviese efectuando realmente un cambio de lnea, por lo que realmente para Java la primera lnea del ejemplo es considerada de la forma:
char a = ;

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 93

Al igual sucede con la segunda lnea del ejemplo, en donde el cdigo Unicode \u000D representa el retorno de carro, es decir, se producira al igual un error de compilacin. Las ltimas dos lneas, pasan la prueba sintctica y para en esos casos si se asignan a las variables a1 y b1, el cambio de lnea y retorno de carro respectivamente.

La clase Wrapper del tipo de dato char es la clase Character, la nica manera de instanciar un objeto de esta clase, es pasando como argumento un carcter. En las clase Character son mucho los mtodos que se tienen a disposicin para utilizar, como: CharValue (), toString () o compareTo (). 3.9.3. Enteros

El tipo de dato entero se subdivide en cuatro distintos tipos de datos numricos, que pueden ser tanto negativos como positivos, es decir que son tipos de datos con signo. Se diferencian en la cantidad de informacin que pueden almacenar.

Tipo de dato byte short int long

Bits

Rango de valores

8 bits 16 bits 32 bits 64 bits

-128 hasta 127 -32768 hasta 32787 -2 hasta 2 -1 -263 hata 263 -1

El bit mas significativo de un tipo de dato entero es utilizado para representar el signo, donde el valor 1 significa negativo y 0 significa positivo. El resto de bits representan el valor almacenado.

Todos los tipos de datos numricos se pueden escribir en formato decimal, octal o hexadecimal, al comenzar con 0 se le indica a Java que se trata de un octal y cuando se comienza con 0x se le indica que se trata de un hexadecimal, por defecto, cuando se crea una variable numrica su formato es decimal, una caracterstica a mencionar es que si se realiza operaciones sobre variables numricas que se encuentran en formatos octal o hexadecimal el resultado siempre va a ser expresado como un nmero en formato decimal.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 94

Por defecto Java toma el tipo de dato int como el tipo numrico estndar, es decir por ejemplo, si se va a asignar un literal long a una variable de tipo de dato long, si no se le indica a Java que la informacin asignada se trata de un long, ser considerada como un tipo de dato int. Ejemplos:

f long

a = 5; // Literal asignado de tipo int long b = 5L; // Literal asignado de tipo long long c = 2147483684; /* No compila, esto debido a que no se le indic a Java que el dato asignado sea de tipo long, por defecto, se considera que el literal asignado es de tipo int, y segn los lmites de int, el nmero asignado no esta contemplado en el rango de valores. */

De tal forma la letra L bien sea mayscula o minscula es el elemento necesar io para indicarle Java de que el dato asignado a una variable de tipo long, sea realmente un long. De igual manera, se puede conseguir un octal de tipo long, o un hexadecimal de tipo long:
long b = long B = minscula.*/ 042L; 0xBAACL;/*La L puede ser tanto en mayscula como en

Para los tipos de datos enteros las clases wrapper respectivas se conocen con los nombres de Byte, Short, Integer y Long. 3.9.4. Punto Flotante Existen dos tipos de datos dentro de este conjunto numrico, estos son el tipo de dato float y el tipo de dato double. La diferencia fundamental entre uno y otro radica en el proceso de precisin de nmeros decimales. Matemticamente, se comprueba que el tipo de dato double posee mucha ms precisin que es el tipo de dato float esto principalmente por el hecho de que double trabaja en base a 64 bits de precisin, mucho mayor a los 32 bits que utiliza float. Ejemplo:
System.out.println (1.0/3.14); System.out.println (1.0F/3.14F); // Resultado 0.3184713375796178 // Resultado 0.3184713

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 95

El clculo de precisin esta fundamentado en el estndar lEEE Standard for Binary Floating-Point Arithmetic, ANSI/lEEE Standard 754-1985 (lEEE, New York). Este estndar incluye nmeros positivos y negativos que contienen signo y magnitud, ceros positivos y negativos, infinitos positivos y negativos, y un valor especial conocido como NaN (Not a Number) usado para representar el resultado de ciertas operaciones invlidas como por ejemplo dividir cero entre cero.

El rango de valores de cualquier dato punto flotante puede ser expresado de la forma (s x m x 2E-N+1, donde s es +1 -1, m es un entero positivo menor a 2N y E es un entero entre (2K-1 -2) y 2K-1 - 1.

Parmetro K N

Float 8 24

Double 11 53

Por efecto, los literales punto flotante son considerados de tipo de dato double, por lo que si se desea construir una variable de tipo float y asignar un valor punto flotante, se debe colocar el sufijo F (mayscula o minscula) al literal que se pretende asignar.

Observe algunos ejemplos.


float float float float float float int g a b c d e f = = = = = = = 2.0; 2.0F; 2.0f; 10F; 10; 10L; 10.0; /* // // /* /* // // Error de complicacin, por defecto la asignacin se considera de tipo double*/ Compila Compila Compila, se produce un casting implcito a punto flotante */ Compila, al igual se produce un casting implcito */ Compila No compila

Todos los tipos de dato entero siempre pueden ser asignados a un tipo de dato punto flotante, por ejemplo observese el caso en donde se asigna un literal de tipo long a una variable de tipo float (float f = 10L), pudiese tender a confundirse esta asignacin, debido a que el tipo de dato long que es de 64 bits es mayor al del tipo de dato float que es de 32 bits, sin embargo, por reglas matemticas, todo nmero entero puede ser expresado a travs de un nmero decimal.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 96

Observe los siguientes ejemplos:

double double double double

a b c d

= 3; = 3.0; = 3.0d; = 2.0f;

Para estas ltimas cuatro pruebas, no existen ningn error de compilacin. Para el ejemplo double d = 2.0d, puede comentarse la caracterstica de que un valor de tipo double puede ser expresado colocado al final del literal el carcter D, en mayscula o minscula. Para el ultimo ejemplo double f = 2.0f, compila sin ningn inconveniente, ya que el valor asignado float de 32 bits cabe en la variable double de 64 bits.

Tanto para los float como para los double, se puede utilizar el carcter E, en mayscula o minscula, para indicar el exponente al cual va a estar elevado el literal, dicho exponente puede ser negativo o positivo y si no se coloca ningn signo implcitamente se considera positivo. Observe algunos ejemplos.
float float a b = = 1.2e-20f; 1.2E20f;

Las clases wrapper respectivas de los tipos de dato float y double son Float y Double. 3.9.5. String String es una de las muchas clases que se pueden conseguir dentro del paquete Java.lang. Los strings en Java como en muchos otros lenguajes son manejados a travs de arreglos de caracteres, por lo que en un objeto de un tipo de dato String se almacena una variable con una referencia a memoria donde est ubicado otro objeto que contiene el arreglo de caracteres.

Una de las principales peculiaridades de esta clase es que puede ser utilizada como un tipo de dato primitivo adicional, es decir, que se puede hacer algo como lo siguiente:
String var = "Hola";

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 97

Es posible hacer esta asignacin, ya que debido a la popular utilizacin por parte de los programadores de esta clase, se decidi dar la oportunidad de poder inicializarla como si fuera un tipo de dato primitivo. Sin embargo, cuando se crean strings de esta forma, el objeto que almacena el arreglo de caracteres que representa el String es almacenado dentro de una seccin de memoria conocida con el nombre de pool de string; esto con la finalidad de que si se crea otra variable que va a contener la misma informacin, no se tenga que crear un espacio en memoria distinto con la misma informacin del arreglo de caracteres, sino que ambas variables apunten al mismo objeto en memoria que contienen dicho arreglo, es decir, supngase el siguiente ejemplo:
String var String var2 = "Hola"; = "Hola";

En tiempo de complicacin, Java reconoce que ambas variables var y var2 contendrn la misma informacin, por lo que en tiempo de ejecucin ambas variables referencian hacia un mismo objeto almacenado en memoria. Observe el siguiente grfico.
Stack var1=0xdefa var2=0xdefa 0xdefa Heap

Objeto de String char value[]

Pool de String Hola

Ambas variables siguiendo la tcnica de pool de string, apuntan hacia una misma posicin en memoria, por lo que si se desea realizar una comparacin entre ambas variables el resultado ser verdadero, es decir:
if(var == var2){}// el resultado de la comparacin es verdadero

De acuerdo a lo anterior, hay una serie de caractersticas en donde se ven involucrados los objetos de tipo String, esta serie de caractersticas estn relacionadas

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 98

a la utilizacin del operador de igualdad == y la utilizacin del mtodo equals de la clase String.

En trminos generales, cuando se utiliza el operador == para realizar la comparacin de objetos la comparacin que se realiza es una comparacin de los apuntadores a memoria, es decir, las referencias de memoria. Cuando se utiliza el mtodo equals de una clase, si dicha clase sobrescribi este mtodo, se realiza la implementacin especificada en dicho mtodo, sino, se efecta la implementacin hecha por la clase Object que bsicamente es la misma operacin efectuada por el operador ==. En el caso de la clase String el mtodo equals esta sobrescrito, es decir, que lo que se compara realmente es el conjunto de caracteres de dicho string con otro conjunto de caracteres propuestos a comparar.

Observe el siguiente caso:


String var = new String ("Hola"); String var2 = new String ("Hola"); System.out.println (var == var2); System.out.println (var.equals(var2));

En la primera comparacin utilizando el operador == el resultado arrojado ser falso, debido a que para este caso ambas variables estn apuntando hacia dos objetos distintos en memoria, a pesar de que poseen la misma informacin. Sin embargo, la segunda comparacin en donde se utiliza el mtodo sobrescrito equals, el resultado ser verdadero, ya que se realiza una comparacin de los arreglos de caracteres.

Ejemplos adicionales:

String hola = "Hola"; String var = "la"; System. out.println (hola == "Hola"); // verdadero System.out.println (hola == "Ho"+"la"); // verdadero System.out.println (hola == "Ho"+var); // Falso

Para estos estamentos de comparacin los dos primeros casos los resultados son verdaderos debido a que la comparacin se realiza con un literal, es decir, un dato que

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 99

es obtenido en tiempo de compilacin, por lo que Java puede asociar dicho literal a una cadena de caracteres ya creada en el pool de String. Pero para la tercera

comparacin el resultado ser falso, ya que la creacin del string ocurre en tiempo de ejecucin, y en ese caso la concatenacin producir un nuevo objeto en memoria con la informacin hola.

Por ltimo y no por menos importante, los objetos de tipo String son inmutables, es decir son objetos que una vez que se le asigna un valor, este valor nunca puede ser modificado. Lo importante a resaltar de esta caracterstica es que a pesar de la

inmutabilidad de los objetos de String la variable e la cual est asignada la referencia no lo es. Observe el siguiente ejemplo:
String var = "Hola"; String var2 = var; System.out.println (var2 == var); // verdadero var = var.concat ("Luis"); System.out.println(var2 == var); // Falso

Segn estos estamentos de cdigo se est construyendo una variable var que almacenar una referencia a un objeto de tipo String, luego esta referencia se asignar a una nueva variable llamda var2, por lo que ambas variables referenciarn a un mismo objeto existente en memoria que almacena el arreglo de caracteres Hola.

Para el ltimo estamento de cdigo, el mtodo involucrado implica la concatenacin del String Luis al final del String Hola, sin embargo, debido a la inmutabilidad de los objetos de tipo String se construir un nuevo objeto de tipo String. Cuyo valor asociado ser Hola Luis y ser referenciado a travs de la variable var.

Observe algunos ejemplos adicionales:

String var = "Hola"; var.concat ("Luis"); System.out.println ("var="+var); //La salida es var=Hola String var1 = "Java"; String var2 = "Objeto"; var1.concat ("Clase"); var2.concat (var1); var1 += " Metodo"; System.out.println (var1 + " " + var2); // La salida es Java Metodo Objeto

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 100

3.10. Control de Flujo

3.10.1. Estamentos de decisin

Los estamentos

if y switch son comnmente conocidos como los estamentos de

decisin. Cuando se utiliza en una porcin de cdigo se le est indicando a Java que evale una determinada expresin booleana para determinar el curso de las decisiones a tomar.

3.10.1.1. If / else

La sentencia if siempre debe evaluar una expresin que arroje un resultado booleano. Los tipos de if sintticamente correctos pueden ser los siguientes:

if(expresin boolena){ ... } if(expresin booleana){ ... } else{ ... } if(expresin booleana){ ... } else if(expresin booleana){ ... }

Es posible que se pueda declarar un if sin bloque de cdigo, en ese caso solamente se tomar en cuenta un solo estamento de cdigo. Observe el siguiente ejemplo:

if z a

(x > 3) y = 2 = 8; = y + x;

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 101

En este cdigo, se pudiese pensar que todos los estamentos corresponden a la condicin del if, sin embargo los ultimas dos lneas del cdigo se ejecutarn no importa lo que suceda, debido a que no pertenecen al alcance de if. Una caracterstica a resaltar del if, es que siempre la expresin booleana debe ir entre parntesis, siempre se va a obtener un error sintctico si la expresin a evaluar no se encuentra dentro de parntesis.

Otra caracterstica adicional a tener presente, se puede observar con un ejemplo como el siguiente:
Boolean b = true; if (b=false) System.out.println("ok");

Quizs por error humano en el proceso de comparacin del if desconociendo el significado de los operadores se utiliz el operador de asignacin =, en vez del operador del igualdad == sin embargo Java compilar sin ningn inconveniente; pero cuando se ejecute, en el if se producir una asignacin y no una comparacin, produciendo por lo tanto que el resultado de la asignacin sea el valor que considere el if para tomar un camino de desicin. Es decir, que para el ejemplo anterior, la evaluacin de la expresin booleana dentro del if, siempre producira un resultado falso. 3.10.1.2. Switch

Una manera de simular la utilizacin de mltiples estamentos if es a travs de la utilizacin de un switch.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 102

La sintaxis del switch es la siguiente:


switch(x){ case valor_1: . . . break; case valor_2: . . . break; case valor_n: . . . break; default: . . . }

El siwtch tiene la peculiaridad de solamente aceptar los tipos de datos byte, short, int y char como argumentos en estos bloques de desicin. La otra caracterstica importante del switch, es que se debe utilizar la sentencia break; para indicarle a Java que hasta ah llega la ejecucin de un caso determinado, es decir, si no se coloca break en ninguno de los posibles casos, y si la condicin del switch cae en el primer caso, se ejecutarn todos los casos por debajo de este.

La sentencia default indica que cuando el valor pasado en el switch no coincide con ninguno de los posibles casos, se debe ejecutar el bloque de cdigo del default. El bloque default, puede ser opcional, es decir, que se puede o no considerar este caso en particular. Y adicionalmente la condicin default no hace falta colocarse al final de las condiciones del switch. Observe el siguiente ejemplo.
int x = 5; switch (x){ case 2: System.out.println ("2"); default: System.out.println ("default"); break; case 3: System.out.println ("3"); }

Si se ejecuta esta porcin de cdigo podr observar que la salida por pantalla ser default, de esta manera se comprueba que no importa el orden en que se coloquen los casos a evaluar ni tampoco el orden donde se coloque el caso default.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 103

Observe este ejemplo:


int x = 5; switch (x){ case 2: System.out.println ("2"); case 2: System.out.println ("2"); // Error de compilacin case 3: System.out.println ("3"); }

El ejemplo anterior produce un error de compilacin debido a que dos casos dentro de un switch no pueden utilizar el mismo valor de decisin.

Es importante mencionar que el argumento que recibe cada uno de los casos deben ser del mismo tipo de dato que el argumento que recibe el switch, adicionalmente con una gran e importante limitante, que si se utiliza variables como argumentos de algunos de los casos, esas variables debieron ser declaradas finales. Observe este ejemplo.
int primero = 1; int segundo = 2; int x = 1; switch(x){ // Error de compilacin case primero : System.out.println("primero"); break; case segundo : System.out.println("segundo"); break; }

El ejemplo anterior produce un error de compilacin debido a que los argumentos que pueden tratar los casos a evaluar deben ser literales o constantes del mismo tipo de dato que el argumento que recibe el switch. De tal forma, que para solucionar el error de compilacin lo recomendado sera declarar con el modificador final a las variables primero y segundo. Observe otro ejemplo.
byte g = 2; switch (g){ case 23: case 128: }

// Error de compilacin

Este cdigo no compilar debido a que para el segundo caso a evaluar el argumento asignado es demasiado largo para un tipo de dato byte, que es el tipo de dato a considerar en el switch.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 104

3.10.2. Estamentos Ciclos

Los ciclos en Java se pueden realizar de tres maneras distintas: while, do_while y for. A travs de los ciclos usted puede repetir un bloque de cdigo tantas veces como la condicin de parada este en true. 3.10.2.1. For

La sentencia for es quizs una de las ms utilizadas para realizar iteraciones. Es muy til cuando usted ya conoce cuantas veces se necesita ejecutar una porcin de cdigo. La declaracin de un for tiene tres partes fundamentales: la declaracin e

inicializacin de variables a utilizar, la condicin booleana de parada, y la forma a travs del cual el ciclo iterar, todas separadas por punto y coma. La sintaxis es la siguiente.
for(variables iteracin){ . . . } involucradas; condicin de parada; condicin de

Una peculiaridad de for es que se puede utilizar ms de una variable que influya en la condicin del for. Por ejemplo:
for(int i = 0, j = 0, c = 0; i < 10; i++, j++, c++){}

En este ejemplo y para todos los ejemplos donde se requieran en el for ms de una variable a utilizar, es necesario que todas las variables involucradas sean de un mismo tipo de dato. Adicionalmente, el tiempo de vida de estas variables declaradas en un for seran igual al tiempo de vida del for.

Ejemplos:
for(int i = 0; i < 10; i++){ System.out.println(i); } System.out.println(i);// Error de compilacin, la variable i tiene // un alcance solamente dentro del for.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 105

Es importante conocer cual es el proceso que se lleva a cabo durante cada iteracin en un for, para esto observe el siguiente ejemplo:
for(int i = 0; i < 1; // Bloque de cdigo } i++){

El ciclo del cdigo anterior se ejecuta solamente una vez. La primera vez que se entra en el ciclo, se construye la variable i y se inicializa a 0, luego se verifica la condicin de parada que en este caso Java verifica que la variable i sea menor que 1 (cosa que es verdad), y luego el bloque de cdigo de for es ejecutado. Una vez que se ejecuta el bloque de cdigo, la expresin de iteracin es ejecuatada, incrementando el valor de la variable en 1, seguidamente es evaluada la condicin de parada para entrar nuevamente en la porcin de cdigo de ciclo. Este proceso se repite hasta que la condicin de parada se haga falso. Es necesario resaltar de este ejemplo, que usted en la expresin de iteracin pudo haber colocado cualquier expresin vlida, es decir, que no necesariamente tuvo que colocar una expresin que incremente el ndice de iteracin del ciclo. Observe el siguiente ejemplo.
for(int i = 0; i < 1; System.out.println("interaccin")){ // Bloque de cdigo }

Esta ejecucin de cdigo quedar en un ciclo infinito, debido a que en la llamada al estamento de iteracin no se proporciona ningn mecanismo para hacer que se detenga la condicin de parada.

El estamento de iteracin siempre ser el ltimo proceso en ejecutarse para cada uno de los ciclos dentro de un for, a menos que algn estamento dentro del bloque de cdigo del ciclo produzca la interrupcin de este. Por ejemplo, los estamentos break, return, System.exit () o una excepcin causar que un for termine abruptamente sin la ejecucin del estamento de iteracin.
Boolean Hacer(){ for (int x=0; x < 10; x++){ System.out.println("Dentro del ciclo"); return true; } return true; } Ing. Elkin Surez G. edsuarez@uis.edu.co Pgina 106

El for solamente se ejecutar una sola vez, debido a la sentencia return que causa que todo el mtodo completo termine su ejecucin.

Ninguna de las tres secciones de la declaracin de for es requerida. El siguiente ejemplo es perfectamente legal:
for( ; ; ){ System.out.println("Interacin infinita"); }

El for anterior produce un ciclo infinito, debido a que no hay ninguna variable declarada, ningn estamento de iteracin y ninguna condicin de parada que origine la finalizacin del ciclo. Es importante conocer que la ausencia de las secciones de inicializacin de variables e incremento, convierten al for en un while el siguiente ejemplo demuestra esta afirmacin:
int i = 0; for(; i <10;){ i++; // Bloque de codigo }

Algo tambin interesante, es que si Java consigue un punto y coma despus de haber declarado el for, este lo va a considerar como una sentencia, por lo que el ciclo se ejecutar sin ejecutar ninguna sentencia del ciclo y luego el bloque declarado para el for va a ser considerado como un bloque de cdigo sin nombre.
for(int i = 0; i < 15; i++);{ /* Este punto y coma hace que se comporte de una forma distinta a objetivo del for */ System.out.println("Hola");

3.10.2.2. While

La sintaxis es:
while (condicin booleana){ ... } // siempre entre parntesis

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 107

3.10.2.3. Do/ While

La sintaxis es:

do{ ... }while(condicin booleana); // Hay que colocar ; si no, no compila.

La diferencia entre estos dos ciclos es que el do/while se ejecuta al menos una vez.

3.10.3. Control de flujo especial

Se puede utilizar lo que se conocen como etiquetas, o label. Estan juntos con las sentencias break y continue le dan una utilidad extra a la utilizacin de los ciclos. Ciclos con etiquetas son comunes cuando se pretende establecer un algoritmo con ciclos anidados y se necesita indicar en cual de los ciclos anidados se desea continuar o se desea romper. Para la declaracin de una etiqueta se siguen las mismas

convenciones de Java como si se tratase del caso de la declaracin del nombre de alguna variable. Observe el siguiente ejemplo:
caso1: for(int i = 0; i <10; i++){ while(i<10){ System.out.println("Java"); break caso1; } System.out.println("Continua ejecutandose el for"); //No se ejecuta esta sentencia }

Para este ejemplo la palabra Java se imprimir una vez, luego la sentencia break romper todos los ciclos anidados hasta llegar al ciclo con la etiqueta caso1. Por lo que nunca se imprimir la frase Continua ejecutndose el for si en el estamento del break no se menciona ningn nombre de etiqueta la sentencia break romper el primer ciclo ms cercano al cual pertenezca y en ese caso si se imprimir el ltimo estamento por pantalla.

Como regla general, las etiquetas solamente pueden ir antes de un for, while o do while, es importante saber que se pueda utilizar una etiqueta por cualquier parte de un

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 108

cdigo en Java y va a compilar sin ningn inconveniente, sin embargo, si se pretende utilizar una etiqueta debe ir siempre atada a alguno de los ciclos anteriormente citados.

Ejemplo:
caso1: if(true){ ... }// Compila sin problema.

Observe este otro ejemplo:


casol: if(true){ ... } while(true){ continue casol; } /* En este caso no va a compilar ya que la etiquetas solamente tiene utilidad con ciclos.*/

Por ultimo con las sentencias break o continue no se puede acceder a una etiqueta ms interna desde donde se est invocando.

Para concluir la sentencia break hace que el control de flujo del programa pase a la sentencia que esta inmediatamente despus del cierre del switch o del bucle y continue tambien hace que se dejen de ejecutar las instrucciones del bloque pero el ciclo contina en el siguiente paso. 3.10.4. Arreglos

Un arreglo se puede considerar como un objeto en donde se agrupan elementos de un mismo tipo, bien sea primitivos o clases. Los arreglos son declarados comenzando por mencionar el tipo de dato de los elementos que agrupar el arreglo, seguido de un par de corchetes a la derecha o izquierda y el nombre del arreglo determinado.

Ejemplo.
int [] identificador; Object identificador [];

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 109

No hay inconvenientes con espacios en blanco dejados, por ejemplos:


int [ ] identificador; // compila sin ningn problema.

Nos se puede incluir el tamao del arreglo en la declaracin, como por ejemplo es posible hacerlo en otros lenguajes de programacin. El siguiente ejemplo produce un error de compilacin:
int [5] variable; // Error de compilacin

Para declarar un arreglo de ms de una dimensin, se declara de la forma el arreglo del arreglo y as sucesivamente si se quiere hacer de ms de dos dimensiones.
tipo_dato [] [] identificador; tipo_dato identificador [] []; tipo_dato [] identificador [];

Una vez declarado el arreglo se procede a instanciar el arreglo, la instanciacin significa la creacin del objeto en memoria. Para construir el arreglo Java necesita saber cual es el tamao en memoria que necesita ocupar este arreglo, por lo que es necesario especificar el tamao del mismo. Existen varias formas de inicializar, se describe a continuacin.
tipo_dato [] identificador = new tipo_dato [nmero]; /* Se instancia el arreglo de una cantidad de elementos definida por el nmero dentro de los corchetes. */ tipo_dato [] identificador; identificador = new tipo_dato[nmero];

Cuando se instancia el arreglo, siempre se le debe de indicar el nmero de elementos que va a contener el mismo, no se puede dejar en blanco la cantidad de elementos. De tal forma, un arreglo con la longitud n puede ser indexado desde 0 hasta n-1. Importante acotar el hecho de que el valor indexado puede ser del tipo de dato int, short, byte o char.
tipo_dato [] identificador = new tipo_dato [] /* Se instancia el arreglo pero no se indica la cantidad, produce error de compilacin.*/

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 110

Se puede instanciar el arreglo dinmicamente, pero siempre hay que indicarle a Java la cantidad de elementos que va a poseer el arreglo:

int p = 5; char arreglo [] = new char[p];

Con la inicializacin del arreglo, se crean elementos del tipo de dato del arreglo con el valor por defecto, es decir, si es un arreglo de tipo de dato entero se inicializa con el valor por defecto null, y as sucesivamente para el resto de los tipos de datos. Las formas validas de inicializar e instanciar un arreglo son las siguientes:
String arreglo [] = {"Hola","Mundo"}; String arreglo2 [] = { "Hola", "Mundo"};

En estos casos Java automticamente determina que el arreglo va ser de dos elementos. Otras formas validas seran:
String arreglo [] = new String [2]; arreglo [0] = "Hola"; arreglo [1] = "Mundo"; String arreglo1 []; arreglo1 = new String [2]; String arreglo2 [] = new String []{"Hola", "Mundo"}; String arreglo3 [] = new String [2]{"Hola", "Mundo"}; // No compila

Un arreglo puede ser de longitud cero. Es decir un cdigo como el siguiente compila y corre sin ningn incoveniente:

String arreglo [] = new String [0];

Si se trata de acceder a un elemento que no se encuentra dentro de los limites del arreglo, se producir un error de ejecucin mas no de compilacin, la excepcin disparada ser Java.lang.ArrayIndexOutOfBoundsException, al igual que puede ocurrir si se declara el tamao del arreglo negativo, compila no corre.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 111

En los arreglos multidimensionales Java tiene la caracterstica de construir arreglos multidimensionales no rectangulares, es decir, por ejemplo, la primera fila del arreglo pudiese ser de 5 elementos y la segunda fila de 15 elementos. Para instanciarlo se puede proceder de las siguientes maneras:

tipo_dato [][] identificador = new tipo_dato [5][4]; /* De esta manera se va a instanciar un arreglo multidimensional rectangular, de 5 filas y 4 columnas.*/ tipo_dato [][] identificador = new tipo_dato[5][]; identificador [0] = new tipo_dato [3]; identificador [1] = new tipo_dato [6]; /* De esta forma se crean arreglos multidimensionales no rectangulares (la primera fila tendr 3 columnas y la segunda tendr 6 columnas).*/

Java no hace casting de arreglos para los datos primitivos, es decir, por ejemplo, si se declara un arreglo de tipo byte, y se asigna a un arreglo de tipo entero, se producir un error de compilacin. Ejemplo:
byte a [] = {1,2,3} ; int b [] = a; // Error de compilacin

Sin embargo con los objetos, se permite un casting de arreglos siempre y cuando se cumplan con las reglas jerrquicas de herencia. Esto ocurre debido a que el hijo cumple con todas las especificaciones del padre (todo esto se ver en detalle ms adelante en la seccin de polimorfismo).

Otra caracterstica interesante a mencionar se demuestra con el siguiente cdigo:


float [][] f[][], g[][][], h[] ; // Esta declaracin es equivalente a estas declaraciones: float [] [] [] [] f; float [] [] [] [] [] g; float [] [] [] h;

3.11. Operadores y asignaciones

3.11.1. Casting y Promocin

El casting implica el valor de una variable de un tipo de dato a otra variable de otro tipo de dato de menor envergadura. Java podr hacerlo, mientras que los tipos de datos

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 112

sean compatibles, es decir, un casting entre un tipo de dato boolean y entero, es imposible de realizar. El casting es muy comn en los tipos de datos y en instancias de clases. A continuacin algunos ejemplos de casting con tipos de datos primitivos:
long int long int l i l i = = = = 99L; l; 99L; (int) l;

Para el primer caso, se produce un error de compilacin, debido a que el tamao de la variable l es de 64 bits y al tratar de asignarla a una variable i de 32 bits, existen informacin que puede perderse en la asignacin. De tal forma, Java a travs del casting da la potestad de poder hacer esta asignacin, quedando a riesgo del programador que pueda perderse informacin. Esto seria lo que se debera realizar para poder asignar un dato de una variable a otro dato de otra variable de menor envergadura, por lo que el segundo caso compila sin ningn inconveniente.
int i = 129; byte b = (byte) i;

Se debe realizar un casting, ya que se trata de asignar una variable de 32 bits a una variable de 8 bits. Pero si se observa detalladamente este caso, el valor de la variable b luego del casting va a ser -127. La razn se fundamenta en el hecho de que Java simplemente trunca los bits ms significativos que no encajen en la nueva asignacin. En otras palabras, se pierden los bits ms a la izquierda que se pretenden almacenar en la variable de menor envergadura. En el ejemplo anterior la variable i almacena un entero de 32 bits que representa el nmero 129, es decir, la representacin en bit en la siguiente:

00000000000000000000000010000001

Al hacer el casting a byte de este dato almacenado, Java eliminar los 24 bits ms significativos del dato, quedando solamente una representacin de 8 bits, es decir:

10000001

Ahora como todos los enteros en Java son con signo, el bit ms a la izquierda de un nmero representa el signo (no forma parte del valor de la variable), por lo que para

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 113

este caso el resultado representa un nmero negativo (el 1 es usado para representar la negatividad). Para encontrar el valor de un nmero negativo se utiliza la notacin de complemento a 2, por lo cual en este ejemplo el conjunto de bits reflejan el nmero 127. Y si aplicamos el signo, la representacin final ser -127.

10000001 11111110 Negacin

________________ complemento a 2 11111111 _______________ Menos 127 Resultado en decimal sumar 1

Analizando este mismo ejemplo matemticamente, el rango de valores positivos de un byte se extiende de 0 a 127, por lo que al tratar de asignar un valor por encima de este rango lo que se conoce como perdida de informacin, ocurriendo que la data restante por asignar recorrer el rango de posibles valores de un tipo de dato hasta satisfacer la necesidad de la asignacin, en este caso especifico, el entero i se puede asignar hasta el limite de byte que es 127, por lo que se debe de comenzar en el inicio del rango de byte que es -128, para satisfacer la necesidad restante de data del entero i. Si el valor de i fuese 129, el valor de b seria -127.

Este proceso de casting, en donde al llevar al limite extremo positivo se debe de comenzar por el extremo negativo para continuar con el proceso de asignacin.
for(byte i = 0; i < 128; i++){ System.out.println(i); }

Compila sin ningn problema y al ejecutarlo se produce un bucle infinito. Lo que sucede es que debido a que el tipo de dato byte tiene un limite mximo positivo de 127 y como la condicin de parada nunca se cumple, ya que al llegar a 127 el valor de la variable i regresa al limite inferior, el proceso queda encerrado en un ciclo infinito

Cuando se asigna un valor en punto flotante a un tipo entero se produce una conversin de tipo diferente, truncado el componente fraccional (siempre que se haga mediante un casting). Por ejemplo, si se asigna el valor 1.23 a un entero el valor resultante ser simplemente 1. El valor 0.23 habr sido truncado.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 114

La promocin es el proceso de tratar de asignar el valor de una variable de un tipo de dato a una variable de otro tipo de dato de mayor envergadura, esta accin la realiza Java de forma automtica.
byte b = 5 ; short s = b; // se efecta una promocin automtica a short double d = 10; // se efecta una promocin automtica a double

Una caracterstica importante a resaltar, es el hecho de que Java por defecto tiene que para las operaciones con tipos de datos enteros, el tipo de dato por defecto es el entero es decir, cada vez que se vaya a hacer alguna operacin o cada vez que se pase un dato entero como argumento, Java considera a ese dato como int. Observe algunos ejemplos:
short short short c = a a = 5; b = 6; c; + b; // Error de compilacin.

Se obtendr un error de compilacin, ya que el operador suma trabaja en base a entero, por lo que se realiza una promocin automtica a entero de las variables de tipo short a y b, y como el resultado es obtenido en tipo de dato int, al tratar de asignarla a la variable c de menor envergadura, se produce un error de compilacin. Se pudiese remplazar la ultima lnea, por la siguiente c = (short) (a+b), en donde se efecta un casting de la operacin suma, compilara y correr sin ningn inconveniente. De acuerdo con lo anterior, la promocin numrica es siempre efectuada cuando operaciones son usadas sobre enteros o nmeros puntos flotantes. Existen cuatro reglas que se deben recordar:

Si uno de los operadores es un double, el otro operando es convertido a un double.

Si uno de los operandos es un float, el otro operando es convertido a un float. Si uno de los operandos es un long, el otro operando es convertido a un long. De cualquier otra forma, los operandos son convertidos a enteros.

Cuando uno de los operandos es un String es una operacin +, el otro operando es convertido a un objeto String. Ejemplos: 123.4 + 66 resulta en 123.466

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 115

Algo importante a mencionar, es que con literales no aplica lo anteriormente descrito, ya que Java automticamente trasforma los literales al tipo de dato adecuado, considerado el hecho de que los literales se encuentre en el rango de valores posibles del tipo de dato, es decir, algo como lo siguiente compila sin ningn problema.
short c = 5 + 6;

Con respecto a argumentos pasados en un mtodo, suponga que tiene un mtodo que recibe como argumento una variable de tipo byte y suponga que la invoca de esta forma:
public void metodo (byte var){ } public void metodo2(){ metodo(5); /* Se genera un error de compilacin, ya que por defecto Java trabaja en base a entero.*/ }

Una caracterstica adicional a mencionar es cuando se trabaja con constantes. Observe la siguiente prueba:
int i = -20; final int j = 20; // constante final int k = i; // el valor es determinado en rutime byte b1 = j; /* Esta prueba tiende a confundir debido a que se puede creer que como la variable j es un entero no va a caber en el byte, sin embargo debido a que se trata de una constante ya determinada que no va a cambiar el valor. Java la considera como una simple asignacin de un valor a una variable, por lo que el casting no es necesario.*/ byte b2 = (byte) i ; /* En este proceso si es requerido hacer el casting. */ byte b3 = (byte) k; /* En esto caso k igual es una constante pero esta determinado por un valor en tiempo de ejecucin, por lo que es necesario hacer un casting. Algo colocado de esta forma no compila byte b3 = k. */

3.11.2. Operadores Los operadores Java se encargan de producir nuevos valores a partir de uno o ms operadores. El resultado de la mayora de las operaciones sern un resultado boolean o numrico. A diferencia de otros lenguajes los operadores Java no pueden ser sobrecargados, es decir, no se pueden cambiar la funcionalidad asociada a estos. A continuacin, se entrar en detalle en cada uno de los grupos de operadores

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 116

existentes, estos se muestran en cuanto a su nivel de precedencia, es decir, de mayor a menor precedencia. 3.11.2.1. Operadores unarios

Operador Incremento Decremento Positivo Negativo Complemento Negacin Casting

smbolo ++ -+ ~ ! (date type)

Son los que tienen mayor precedencia de todos los operadores existentes en Java y tienen una asociacin de derecha a izquierda. El orden en el que se muestran no aporta ningn significado adicional, si es un estamento de cdigo se aplican dos operadores unarios, Java ejecutar el primero ms a la derecha del estamento, siguiendo la regla anteriormente mencionada.

Algunas caractersticas que deben tomar en cuenta, con respecto a los operadores de incremento y decremento son las siguientes:
a = 5; b = a++; /* En el caso de aplicar el operador incremental de manera postfija, primero se asigna el valor de la variable en la expresin y luego se incrementa (b = 5, a = 6). */ b = ++a; /* En el caso de aplicar el operador de manera prefija, primero se incrementa la variable y luego se utiliza en la asignacin de la expresin (b = 6, a = 6). */

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 117

Observe este ejemplo que involucra el operador (data type)


short c = 1; short b = 2; short e = (short) c + b // Error de compilacin /* Esto pudiese confundir, pero conociendo que el operador (data type) es de mayor precedencia que el operador +, se ejecutara primero el casting antes de hacer la suma, y en este caso al tratar de un operador unario este operador solamente utilizar la variable c. por lo que una vez hecho el casting el operador suma har una promocin respectiva a entero de los operadores y el resultado se obtendr en entero.*/ short e = (short) (c + b); /*Para este ejemplo, la operacin de casting ser aplicada a toda la operacin.*/

El operador complemento (~), es una operacin unaria de bits, que se encarga de realizar una negacin de bits, el 1 lo coloca como 0 y viceversa, al realizarse el complemento de un nmero, matemticamente lo que sucede es que se suma una unidad al dato y se le cambia de signo.
System.out.println (~3);// el resultado impreso por pantalla ser -4

El operador negacin (!), es utilizado exclusivamente bajo operaciones booleana, la utilidad de este es negar el estado actual de un valor booleano.
System.out.println (!true); // el resultado es "false"

Oradores Aritmticos
3.11.2.2. Operadores Aritmeticos

Operador Multiplicacin Divisin Residuo Suma Resta

Smbolo * / % + -

Estos operadores numricos tienen una asociacin de izquierda a derecha pero tienen una mayor precedencia los operadores * / % que los operadores + -.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 118

Algunos ejemplos:
3+4 -7 = 0 /* Como tienen una misma precedencia se aplica reglas de asociacin en este caso de izquierda a derecha, a asociacin seria: (3+4)7. */ 3+4*7 = 31 /* El * tiene mayor precedencia que el +. Por lo que primero se realiza la multiplicacin y luego la suma, es decir: 3+(4*7)*/

Una caracterstica del operador suma (+) es que cuando unos de sus operadores es un String, este operador cambia su funcionalidad y realiza labores de concatenacin.

Sobre el operador divisin (/), puede saber que si divide un nmero entre 0 nunca se producir un error de compilacin, pero si es posible un error de ejecucin. Si el nmero a dividir se trata de un tipo de dato entero, se producir una excepcin aritmtica y si el tipo de dato es u punto flotante se obtendr una constante conocida con el nombre de infinity o-infinity, dependiendo de si el nmero decimal fuese positivo o negativo.

El operador residuo (%) devuelve el residuo de dividir x entre y, sin embargo si la x es negativa, entonces el residuo tambin va a ser negativo. Es decir:
System.out.println(-3%2); System.out.println(3%-2); // El resultado obtenido es -1 // El resultado obtenido es 1

Otro dato importante sobre el operador %, es que puede ser aplicado a tipos de datos flotantes, y el resultado obtenido del residuo tambin ser un punto flotante.

Estas son algunas de las pruebas que se pueden hacer y los respectivos resultados infinitos:
Calculo 7.0/0 0.0 / 0.0 7.0 / Infinity Resultado infinity NaN 0.0

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 119

Infinity / Infinity Infinity/ 7.0 7.0 % 0 0.0 % 0.0 7.0 % Infinity Infinity % Infinity Infinity % 7.0 0.0 * Infiniti 7.0 * infiniti 7.0 + infiniti

NaN Infinity NaN NaN NaN NaN NaN NaN Infinity Infinity

Infinity para: Double.POSITIVE_INFINITY, Float.POSITIVE_INFINITY

No se puede utilizar la constante NaN como un literal para realizar alguna operacin aritmtica, se obtiene error de compilacin. 3.11.2.3. Operadores Shift
Operador Left Shift Right Shift Right Shift sin signo Smbolo << >> >>>

Tiene una precedencia por debajo a todos los descritos hasta los momentos y tienen una asociacin de izquierda a derecha. Estos operadores son quizs los de menos utilidad para los programadores Java.

Los operadores shift mueven los bits de un nmero hacia la izquierda o la derecha. Produciendo un nuevo nmero. Estos operadores solamente pueden ser utilizados en base a tipos de daros enteros (no aplican a tipos de datos flotante, produce error de compilacin).

Cuando se aplica un left shift (<<) se indica a Java que tome el primer operando y lo multiplique por dos elevado al segundo operando, es decir A (2 ).
B

<<

B es equivalente a A x

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 120

Por lo que para este ejemplo 3 << 2, el resultado de aplicar el left shift equivale a realizar la operacin matemtica 3 x 22, es decir, el resultado ser 12.
System.out.println(3<<2); // el resultado obtenido es 12

El operador right shift (>>), implica matemticamente que el primer operando es divido entre 2 elevado al segundo operando, a >> b -> a / (2B).

En el caso del right shift sin signo >>> se comporta igual que el right shift, pero no importa si el nmero es positivo o negativo, siempre va a aadir un 0, por la parte ms significativa. 3.11.2.4. Operadores de relacin

Operador Menor Mayor Menor o igual Mayor o igual Instancia de Igualdad Desigualdad < > <= >= instanceof == !=

smbolo

Java cuenta con los siguientes operadores relacionales, los (== y !=)

identifican

igualdad o desigualdad de nivel de precedencia, es decir que los operadores instanceof >, <, >= y < = tienen un nivel de precedencia mayor que los operadores == y !=. Es decir una expresin como la siguiente: 3 == 5 >= 0, es equivalente a la expresin 3 == (5>=0).

Estos operadores al igual tienen una asociacin de izquierda a derecha.

No se

realizara mucho nfasis en estos operadores ya que no existe ningn conocimiento relevantemente a mencionar sobre ellos, lo nico a recordar es que cuando se utiliza al igual que el resto de operadores, los datos son promovidos segn las reglas ya conocidas.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 121

Tambin hay que recordar que no se pueden hacer comparaciones con bolanos y datos numricos.

Para todos los operadores, exceptuando el operador de desigualdad (!=), van a retornar falso si uno de los operadores es NaN.
System.out.println(2.34 < Double.NaN); // El resultado sera false System.out.println(2.34 > Double.NaN); // El resultado sera false System.out.println(2.34 != Double.NaN);// El resultado sera true

El operador instanceof, se utiliza para comprobar que un objeto instanciado de una determinada clase, pertenece a un orden jerrquico de clases. Del lado izquierdo del operador se coloca el nombre de la variable que apunta hacia un objeto determinado en memoria y del lado derecho del operador se coloca la clase o interfaz a la cual se cree que ese determinado objeto se encuentra instanciado.

Algunas caractersticas adicionales a conocer para poder utilizar correctamente el operador instanceof son:

Todos los objetos son instancias de la clase Object. Cualquier objeto que implemente una interfaz se considera una instancia de esa interfaz. Cualquier clase A que es subclase de una clase B es una instancia de esa clase B. El literal null no es instancia de ningn tipo de clase. No se puede aplicar el operador intanceof entre un objeto y un tipo de clase que no tienen entre ambas ninguna relacin, se obtendr un error de compilacin.

3.11.2.5.

Operadores Lgicos

Operador Y O O Exclusivo

Smbolo & l ^

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 122

Estos operadores tienen la siguiente precedencia, & tiene mayor precedencia que ^, y por supuesto todos estos tienen una mayor precedencia que los descritos hasta el momento. Al igual que los anteriores tienen una asociacin de izquierda a derecha.

Las caractersticas de estos dos operadores es que se utilizan para realizar operaciones binarias, aunque tambin se utilizan para realizar operaciones booleanas.

Es decir, en una condicin se puede utilizar esos operadores, siempre y cuando los operadores sean valores bolanos, y si se tratan de tipos de datos enteros, realizara una operacin binaria determinada.

De tal manera, al hacer lo siguiente: 2 & 3. Se efectuar una operacin binaria aplacando al patrn de reglas booleanas del Y (tabla de verdad del Y), para este caso el resultado es 2.

00000010 &0 0 0 0 0 0 1 1 _______________ 00000010 Para los operadores, se aplicaran las reglas booleanas respectivas. En el caso de aplicar el operador O al ejercicio anterior 2 I 3, el resultado ser 3.

00000010 l00000011 ______________ 00000011

Y en el caso de aplicar 2 ^ 3, el resultado ser 1. Las reglas del O exclusivo implican que el resultado ser falso cuando ambos operandos tengan el mismo valor, y en caso contrario retornar true.

00000010 ^00 000011 ________________ 00000001

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 123

3.11.2.5.1. Operadores lgicos Corto - Circuito

Operador Y O

Smbolo && ll

Es recomendado utilizar para las condiciones de control de flujo, los operadores que se conocen como el corto-circuito, && (Y) y ll (O), la caracterstica de estos es que solamente estn diseados para datos bolanos, no se pueden aplicar a datos enteros, poseen unas propiedades para aumentar el rendimiento de las operaciones, que son importantes mencionar: Si el primer operando de la operacin && es false, el segundo no se evala, ya que segn las reglas booleanas del Y el resultado va a ser falso. Si el primer operando de la operacin ll es true, el segundo no se evala. Por que el resultado va a ser true.

Su nivel de precedencia est por debajo de los operadores lgicos y en este orden && y ll. Es decir el operador && es de mayor precedencia que el operador ll.

Observe el siguiente ejemplo:


public class Operadores{ public static void main(String arg []){ if(calcularValor(2) || noseEjecuta()){ System.out.println("Java es lo mximo"); } if(calcularValor(9) && noseEjecuta()){ System.out.println("Java es lo mejor"); } } public static boolean calcularValor(int var){ if (var < 5)return true; return false; } public static boolean noseEjecuta(){ System.out.println ("No se ejecuta"); return true; } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 124

Al ejecutarse este ejercicio, por pantalla solamente se imprimir el mensaje Java es lo mximo. Lo importante a resaltar de este ejemplo, es que para ambos controles de flujo donde se utiliza los operadores corto circuito en ninguno de los casos se llegan a ejecutar la llamada de mtodos noseEjecuta. Demostrando las propiedades a conocer sobre ambos operadores.
Devuelve verdadero si op1 y op2 son ambos verdaderos, condicionalmente evala op2. op1 y op2 son ambos verdaderos, siempre evala op1 y op2. || | op1 || op2 op1 | op2 op1 o op2 son verdaderos, condicionalmente evala op2. op1 o op2 son verdaderos, siempre evala op1 y op2.

Operador && &

Uso op1 && op2 op1 & op2

3.11.3. Operador Ternario

Operador Ternario

Simbolo ?:

Su precedencia est por debajo de todos los datos anteriores y tiene una asociacin de derecha a izquierda. La idea del operador ternario es hacer un if resumido, lo nico a destacar, es que como es un operador, la operacin tiene que estar asignada a alguna variable.
short valor = 9; String resultado = (valor > 9)?"Mayor que 9":"Menor que 9"; System.out.println("Resultado "+resultado);/*Imprime: Resultado Menor que 9. */

La sintaxis es:
tipo_dato variable = (expresin booleana)?(Si es true se devuelve esto):(Sino se devuelve esto otro);

Una caractersticas importante de este operador, es que los resultados que se deben obtener tienen que ser de un mismo tipo de dato, por ejemplo, no se puede tener en

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 125

una operacin ternaria que en un caso que devuelva String y que para el otro caso devuelva un entero. 3.11.4. Operadores de Asignacin

Operadores = *= /= %= += -= <<= >>= >>>= &= ^= |=

Todos poseen la misma precedencia y se asocian de derecha a izquierda. Sintacticamente es lo mismo hacer x = x + y que esto: x += y, sin embargo, existe una propiedad a resaltar cuando se utiliza estos operadores. Por ejemplo:
short x; short y; x = x + y; /* No se hace un casting implcito y arroja un error de compilacin, para que este no se produzca, se le debe indicar a Java que ste consciente de la posible prdida de informacin */ x += y; /* Este ejemplo compila sin ningn inconveniente */

Java hace un casting implcito del resultado en el estamento x+=y, es decir, no produce un error de compilacin.

3.12.

Estructura de los archivos Java

Lo primero que se debe recordar es que la estructura de construccin de un archivo fuente de Java, es la siguiente:

package Import class y/o interface

Ese orden debe de permanecer intacto, sino se van a obtener errores de compilacin. Se tiene la posibilidad de crear varias clases en un mismo archivo. Mientras que ninguna de las clases sea pblica, es posible darle cualquier nombre al archivo que almacena las clases.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 126

class B{} class C{} // Ambas clases pudiesen estar en un archivo llamado por ejemplo A.Java. Y compilara sin ningn problema.

Si alguna de las clases es pblica, el nombre del archivo en este caso debe ser igual al nombre de esta clase, debido a esta regla solamente puede existir una clase pblica por archivo (aunque pudiese existir una clase pblica y varias otras clases sin visibilidad en un mismo archivo).

Existen una caracterstica de la declaracin del nombre de las clases que dice que estos nombres deben estar comprendidos dentro del cdigo ASCII ya que no todos los sistemas operativos trabajan con el cdigo de caracteres Unicode con el que trabaja Java.

3.12.1. Paquetes

A travs del comando package se provee una forma para agrupar algunas clases que poseen relacin por sus caractersticas, la utilidad ms esencial de la utilizacin de esta sentencia es para la creacin de libreras. Existen una serie de caractersticas que deben conocerse acerca del estamento package para su buen funcionamiento.

El nombre que se utiliza para el package debe coincidir fsicamente con el nombre del directorio en donde se pretende almacenar dicha clase.

Por ejemplo, la clase contenida dentro del paquete Carpeta, debe ser almacenada dentro de un directorio llamado Carpeta. Al momento de compilar no importa donde est ubicado el cdigo fuente ya que Java no verifica realmente que la clase se encuentre dentro del directorio, sin embargo, en tiempo de ejecucin siguiendo las reglas de carga de clases. Java busca un directorio que se llame en este caso

Carpeta y buscar dentro la clase especificada, es por esto, que si se trata de ejecutar la clase dentro del directorio, se va a obtener un error de ejecucin ya que no est consiguiendo la clase como tal, la idea es que desde afuera del directorio Carpeta se ejecute la clase de la siguiente manera java Carpeta.Prueba

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 127

package Carpeta; public class Prueba{ public static void main(String args[]){ System.out.println("Ejecucion de la clase prueba"); } }

Se haba comentado que se poda compilar la clase perteneciente a un paquete desde cualquier parte, ya que Java no verificaba realmente si la clase esta en la determinada carpeta. Sin embargo, supngase el siguiente ejemplo en donde se tiene clases que pertenecen a un mismo paquete (ClaseA y ClaseB) y la ClaseA necesita las caractersticas de claseB, a travs de un mtodo main principal.

package Carpeta; public class ClaseA { public static void main(String args []){ ClaseB obj = new ClaseB(); } } package Carpeta; public class ClaseB { public ClaseB(){ System.out.println("Ejecucin ClaseB"); } }

En este caso, siempre se compila dentro del directorio, se va a obtener un error de compilacin ya que como la claseA pertenece a un package llamado carpeta, Java tratara de comprobar que todas las clases que se esten utilizando pertenezcan al igual a ese paquete, cosa entonces que no esta ocurriendo y por ende se obtiene error de compilacin. La manera de poder compilar correctamente estas dos clases es que despus afuera de la carpeta se ejecute javac Carpeta\ClaseA.java y para ejecutar el programa, se haga de la forma java Carpeta.ClaseA.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 128

3.12.2. Importantes paquetes

La

sentencia import, es la que se encarga de importar clases pertenecientes a

paquetes que se necesitan para la clase que se est desarrollando.

Sobre el ejemplo anterior de las dos clases en un mismo paquete, se haba comentado que Java buscar las clases que necesite dentro del paquete al que pertenece, pero adems de ese paquete buscar dentro de los directorios que se le indique a travs de la sentencia import. Especficamente, en el ejemplo anterior Java busca dentro del directorio Carpeta por las clases a utilizar, sino las consigue ah, busca en los directorios especificados por la sentencia import, en este caso no se utiliza ninguna sentencia import, pero Java por defecto importa el directorio java.lang.*, buscar en ese directorio por clases que utilize la clase a compilar, si no las consigue, entonces se obtiene un error de compilacin. Se puede comentar que al colocar la siguiente lnea de import:

import java.lang.*;

No implica que Java vaya a tomar todas las clases que pertenecen a dicho paquete, sino que simplemente servir como referencia para buscar clases dentro de dicho directorio. Sin embargo si se coloca la siguiente lnea de import

import java.lang.math;

En este caso Java solo va a tomar en cuenta la clase Math dentro de ese directorio, por lo que si estuviese utilizando alguna otra clase perteneciente a ese paquete el compilador de Java no lo va a considerar. En trminos generales, lo que debe quedar claro es que por lo nico que se ver afectado el rendimiento de la aplicacin, es que el momento de la carga de carga de clases tomar un poco ms de tiempo la bsqueda de la necesarias cuando se usa java.lang.*

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 129

Tambin vale la pena mencionar que es posible referirse a una clase especfica en un paquete sin utilizar la sentencia import, para esto cuando se vaya a intanciar la clase se debe colocar la ruta completa donde este ubicada la clase, por ejemplo:

Java.lang.Match

objeto

= new Java.lang.Match();

3.12.3. Mtodo Main Principal

Con este mtodo se le indica a Java que debe comenzar la aplicacin, desde ah es donde se llamaran e instanciaran todos los metodos necesarios, para ejecutar la aplicacin, algunas caracteristicas de este metodo main que se deben de tomar en cuenta son las siguientes:

El orden de los dos primeros parmetros modificadores no importa, es decir, lo siguiente es valido:

public static void main(String args[]){} static public void main(String arg []){}

Vale la pena esta ejecucin, por ejemplo si se escribe la siguiente sentencia:


public static void main(String args []){} ; ; ; ; ; ; ; ; ; ;

Compila sin ningn problema. Java considera el punto y coma como un fin de instruccin, y en este caso estos fines de instrucciones no conllevan ninguna sentencia.

Se debe comentar adems que se puede definir un mtodo que se llame main dentro de una clase y mientras no se coloquen los modificadores anteriormente descritos y el argumento que recibe, Java no lo considerar como el punto de partida de la aplicacin, sino simplemente un mtodo ms de la clase.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 130

public class PruebaMain{ public static void main(String arg){ System.out.println("Ejecucin de un metodo llamado main"); } }

Para el ejemplo anterior, Java complicar sin ningn inconveniente pero al momento de ejecutarse producir un error de ejecucin comentando que no se consigui un metodo main dentro de la clase.

Por ltimo en un mtodo main principal, dado a que es esttico, la nica forma de poder acceder a las variables y mtodos de clase es creando una istancia de la misma clase del mtodo main principal. Este es uno de los errores ms comunes que

cometen los programadores, al declarar el mtodo main principal y utilizar elementos no estticos dentro del mtodo.

Siguiendo las reglas de los modificadores que se puntualizarn a continuacin, un mtodo main principal puede ser declarado de la siguiente manera:
final public static void main (String args []) {}

3.12.4. Reglas para declarar archivos fuente Slo puede haber una clase pblica por cada archivo fuente. Los comentarios pueden aparecer en el principio o final de cualquier lnea de cdigo, son independientes de las reglas que se mencionan. Si existe una clase pblica en un archivo, el nombre del archivo debe de coincidir con el nombre de dicha clase. Si una clase es parte de un paquete, la sentencia package debe de aparecer en la primera lnea de cdigo, antes de cualquier sentencia import o declaracin de clases y mtodos. Si existen sentencias import, debe de aparecer despus de la declaracin del paquete (en caso de haber alguno) y antes de la declaracin de la(s) clase(s). Si no hay una declaracin de paquete, la sentencia import debe de ser la primera en aparecer en el cdigo. Si no hay sentencias package o import, la declaracin de la clase debe de aparecer primero.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 131

Las declaraciones de paquete e import aplican para todas las clases nombradas en un archivo, no es posible tener varias clases en un archivo y que cada clase pertenezca a un paquete diferente o utilice diferentes import's.

Un archivo puede tener ms de una clase no pblica. Un archivo sin clases pblicas puede tener cualquier nombre, aunque no coincida con el nombre de ninguna de sus clases.

3.13.

Modificadores de acceso

Los modificadores de acceso controlan quienes pueden utilizar cada una de las caractersticas de la clase que estamos definiendo. Las caractersticas de una clase son: la misma clase, sus variables miembro, sus mtodos y sus constructores. Las nicas variables que pueden ser controladas por los modificadores de acceso son las variables a nivel de clase. Aquellas que estn declaradas y se utilizan dentro de un mtodo pueden no tener modificadores de acceso. Esto tiene sentido ya que una variable de mtodo solo puede ser utilizada dentro del propio mtodo. En total son 12 modificadores el default (no se escribe nada), public, private, protected, final, abstract, static, volatile, transient, native, synchronized y strictfp y son agrupados en dos categoras. 3.13.1. Modificadores de Visibilidad

La ocultacin de la informacin en Java se realiza a travs de los modificadores de visibilidad.

3.13.1.1. Modificador public

El modificador pblico es el ms comn y el ms fcil de comprender.

Puede

aplicarse a una clase, mtodo o variable, este modificador implica que todo el universo puede tener acceso a ese componente, es decir, si se declara una clase pblica el resto de las clases tienen acceso a ella, si se declara un mtodo pblico todos tienen acceso a ese mtodo siempre y lo mismo ocurre con las variables declaradas pblicas.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 132

3.13.1.2. Modificador Private

Este modificador slo se puede utilizar en los mtodos, variables, y clases o interfaces internas. En las clases no se pueden utilizar ya que no tienen sentido que se declare una clase privada (rompe con los paradigmas OO). Algo como esto es incorrecto:

private class PruebaMain{}// Error de compilacin

Cuando se declara una variable o mtodo de tipo privado, se est indicando que solamente la misma clase va a tener acceso a ella. Absolutamente ms nadie podr tener acceso a esa informacin. Esto principalmente es utilizado para aplicar los

conceptos de encapsulacin y herencia eficientemente. 3.13.1.3. Modificador default

El modificador por default, se puede utilizar tanto en una clase, mtodo o variable, este modificador indica que solamente podr acceder al elemento aquellas clases o subclases que pertenecen al mismo paquete, incluida la misma clase que posee el elemento por default. Un elemento con el modificador de acceso default no posee ningn modificador precediendo la declaracin. A continuacin algunos ejemplos de elementos que utiliza el modificador por default:

Dos clases pblicas, ClaseA y claseB dentro de un paquete, claseB llama a un mtodo de la claseA que est declarando por default.
package Carpeta; public class ClaseA{ void metodoClaseA(){ System.out.println("Ejecucin del Metodo de la Clase A"); } } package Carpeta; public class ClaseB{ public static void main(String args[]){ ClaseA obj = new ClaseA(); obj.metodoClaseA(); } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 133

Ahora siguiendo las reglas de compilacin para clases dentro de un paquete, esto compilar sin ningn problema, ya que el modificador default puede ser utilizado por clases que pertenece al mismo paquete. Supnga ahora el mismo ejemplo, pero

ahora ClaseB hereda los mtodos de la ClaseA, es decir ClaseB es una subclase de la ClaseA.
package Carpeta; public class ClaseB extends ClaseA{ public void metodoClaseB(){ metodoClaseA(); } }

Sin ningn problema va a compilar y correr, ya que la regla del default indica que se podr tener acceso a esta informacin clases o subclases que pertenezcan al mismo paquete.

Sin embargo, puede ocurrir que por ejemplo se tratase de acceder desde otro paquete, en ese caso no compilara, ya que la regla del default lo impide. Observe un ejemplo en el que una clase de otro paquete desea heredar las caractersticas de la claseA:

package Carpeta2; public class ClaseC extends ClaseA{ public void metodoClaseB(){ metodoClaseA(); } }

Se obtendr un error de compilacin, ya que el metodoClaseA fue declarado como default y la regla impide que clases que no pertenezcan al paquete puedan tener acceso a esta informacin. Adicionalmente, si la clase claseA est declarada como default, tambin producir un error de compilacin por la misma razn descrita.

Mientras se tenga la clase pblica se tendr que preocuparse de los modificadores que puedan poseer las variables y mtodos. Si la clase estuviera declarada como default solamente aquellas clases o subclase del mismo paquete puedan acceder a ella.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 134

3.13.1.4.

Modificador protected

El modificador protected solamente se aplica a los mtodos, variables y clases o interfase internas. Java no acepta la declaracin de una clase de tipo protected. Algo como esto no su puede hacer.
protected class PruebaMain{} // Error en compilacin

La principal diferencia con el modificador default, es que protected permite acceder al elemento desde una subclase que no pertenece al paquete. Por ejemplo, suponga una clase ClaseA dentro de un paquete, con un mtodo declarado como protected.
package Carpeta; public class ClaseA{ protected void metodoClaseA(){ System.out.println("Ejecucin del Metodo de la Clase A"); } }

Ahora desde otro paquete se tiene una subclase ClaseC, es decir una clase que hereda la clase ClaseA. Java sin ningn inconveniente compilar esta clase, ya que por regla de protected se puede acceder desde el mismo paquete o desde una subclase fuera del paquete. Observe el cdigo de esta ClaseC.
package Carpeta2; import Carpeta.ClaseA; public class ClaseC extends ClaseA { public void metodoClaseC(){ metodoClaseA(); } }

Sin embargo, al tratar de hacer una instanciacin, es decir que la ClaseC no se comporte como una subclase si no como una clase del universo, se obtendr un error de compilacin, ya que segn las reglas de protected, el universo no tiene acceso a estos elementos.
package Carpeta2; import Carpeta.ClaseA; public class ClaseC{ public static void main(String args[]){ ClaseA obj = new ClaseA(); obj.metodoClaseA(); } } Ing. Elkin Surez G. edsuarez@uis.edu.co Pgina 135

En la siguiente tabla se muestra todas las posibilidades combinaciones de visibilidad, dichas combinaciones son importantes recordarlas.

Visibilidad

Public

Protected

Default

Private

Desde la misma clase Desde cualquier clase del mismo paquete Desde subclase del mismo paquete Desde una subclase fuera del paquete

Si Si Si Si

Si Si Si Si No

Si Si Si No No

Si No No No No

Desde cualquier no_subclase fuera del Si paquete

El objetivo es ocultar en lo posible los detalles de implementacion de las clases permitiendo el acceso solo a traves de la interfaz (miembros publicos). En Java para conseguir esto se debe tener en cuenta que:

Las variables miembro (atributos) se deben declarar como privados. El acceso a las variables miembro se realizara solo a traves de las operaciones pblicas (crear mtodos del tipo get/set para acceder a ellas). Operaciones publicas de creacin, consulta y modificacion.

Los modificadores de visibilidad permiten: Evitar accesos directos. Controlar los accesos. Simplificar el trabajo del desarrollador. No tener problemas al cambiar la implementacin del paquete mientras no se cambie la interfaz. 3.13.2. Modificadores de Comportamiento

3.13.2.1.

Modificador static

Java acepta que se utilize el modificador static para los mtodos, variables y clases internas. Es decir, algo como lo siguiente no se puede hacer:
static class ClaseC {} // Error en compilacin

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 136

Sin embargo, se puede decir que una clase puede ser considerada como esttica cuando sus mtodos y variables son declarados estticos.

La caracterstica del modificador static implica que solamente se crear en memoria un espacio para el elemento declarado, sin importar la cantidad de instanciaciones se pudiese obtener de la clase que contenga ese elemento esttico. Por ejemplo,

observe el siguiente ejemplo:


public class ClaseEstatica{ public static int p = 0; public static void main(String args []){ ClaseEstatica obj = new ClaseEstatica(); obj.p = 5; ClaseEstatica obj2 = new ClaseEstatica(); obj2.p = 15; System.out.println ("el valor de p "+obj.p+" y el valor de p2 "+obj2.p); } } // Lo que se imprime por pantalla sera: El valor de p 15 y el // valor de p2 15

Para ambas instancias el valor de la variable esttica p va a ser el mismo. Es importante recordar que no se puede utilizar en un mtodo esttico variables que no sean estticas o mtodos que no sean estticos se obtendran un error de compilacin. El caso ms comn es cuando se declara una variable de instancia de la clase, y se crea un mtodo main principal y se trata de utilizar dicha variable dentro de ese mtodo.

public class ClaseEstatica{ public int p = 0; public static void main(String args []){ p = 5; // Error en compilacin } }

Con respecto a los mtodos estticos se puede decir que no es necesario que se instancien las clases que contienen dichos mtodos estticos, simplemente se hacen las llamadas desde la clase donde se quieren que se ejecute dicho mtodo esttico. Es importante acotar que tambin para las variables no es necesario realizar una

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 137

instanciacin de la variable esttica, esta se puede acceder automticamente sin instanciar la clase. Observe el siguiente ejemplo:
public class ClaseEstatica{ static String test = "JSE"; public static String getTest() { return test; } } class ClaseTest{ public static void main(String args[]){ System.out.println("valor = "+ClaseEstatica.getTest()); } }

En trminos generales, cuando se crea un objeto de una clase, es decir que se produce una instanciacin, Java llama al constructor de dicha clase para inicializar posibles atributos de la clase. Cuando se utiliza mtodos o variables estticas de una clase, en ningn momento se va a llamar el constructor de dicha clase. Ejemplo:

public class ClaseEstatica{ private static int i = 5; ClaseEstatica(){ i = 10; } public static int getI() { return i; } } class ClaseTest{ public static void main(String args[]){ System.out.println("valor = "+ClaseEstatica.getI()); }// El valor de i seguira en 5. }

Una propiedad que se debe conocer es que todas las caractersticas estticas siempre quedan activas durante todo el tiempo de vida de la aplicacin, no importa que no se tengan objetos cargados de la clase que contiene estos elementos estticos.

Otras dos caractersticas adicionales es que un mtodo esttico no puede ser sobrescrito para no ser esttico en una clase hija. Como tambin un mtodo no

estatico no puede ser sobrescrito para que sea esttico en una clase hija.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 138

3.13.2.2.

Modificador Abstract

El modificador abstract solamente se utiliza en las clases y en los mtodos, a travs de este modificador se permite crear prototipos de clases para que puedan ser utilizados por otros programadores, los cuales se encargan de la implementacin.

Las caractersticas de este modificador son las siguientes:

Los mtodos abstractos no se deben implementar, es decir, simplemente se declara el mtodo como abstracto y se coloca punto y coma al final. Esto para que luego la clase hija herede ese mtodo y lo pueda implementar. Ejemplo de esto es:
public abstract void metodoAbstracto(); // Compila sin ningun problema public abstract void metodoAbstracto(){}; /*No compila, las llaves en Java son consideradas para la creacin de una porcin de codigo.*/

Al declarar un mtodo abstracto siempre se debe declarar la clase como abstracta, sino producir un error de compilacin, algo como la siguiente no se puede hacer:

public class ClaseAbstracta { public abstract void metodoAbstracto(); // Se produce arror de compilacin }

Para corregir el error anterior, se debe entonces declarar la clase abstracta:

public abstract class ClaseAbstracta { public abstract void metodoAbstracto(); }

Las clases abstractas no se pueden instanciar, solamente se pueden heredar, lo siguiente no est permitido por Java:
public abstract class ClaseAbstracta { public abstract void metodoAbstracto(); public static void main(String args []){ ClaseAbstracta obj = ClaseAbstracta(); //Error de compilacin } } Ing. Elkin Surez G. edsuarez@uis.edu.co Pgina 139

La idea de las clases abstractas es que en una clase ms general se pueda declarar prototipos de mtodos abstractos a ser utilizados por obligacin por sus clases hijas, debido a que la implementacin de estos mtodos en dichas subclases puede variar. Adicionalmente, se puede comentar que es posible tener mtodos no abstractos dentro de una clase abstracta, que se encarguen de realizar acciones dentro de esa clase abstracta, para que adicionalmente pueda ser utilizados en las clases hijas. Incluso, hasta se puede declarar una clase abstracta y no definir ningn mtodo abstracto, eso compila sin ningn inconveniente.
public abstract class ClaseAbstracta { public void metodoAbstracto(){ } }

Ahora, cuando una clase hija hereda una clase abstracta padre, la idea es que ella va a tener que implementar todos los mtodos abstractos del padre, sino se implementan todos los mtodos abstractos ella misma debe declararse como abstracta para que Java permita la compilacin. Observe el siguiente ejemplo, en donde una clase

abstracta padre tiene dos mtodos abstractos a implementar por alguna clase hija que lo herede:
public abstract class ClaseAbstracta { public abstract void metodo1(); public abstract void metodo2( ); }

Una clase hija que intente extender de la clase ClaseAbstracta y que solamente implemente uno de los mtodos, producir un error de compilacin, Java le indicar que clase hija debe ser declarada abstracta, ya que no se han implementado todos los mtodos abstractos de la clase ClaseAbstracta.
public class ClaseHijaAbstracta extends ClaseAbstracta{ public void metodo1() { System.out.println("Clases Abstractas"); } }//Error de compilacin

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 140

Algo como el siguiente ejemplo, en donde se declar la clase hija como abstracta si sera correcto:
public abstract class ClaseHijaAbstracta extends ClaseAbstracta{ public void metodo1() { System.out.println("Clases Abstractas"); } }

Este cdigo compila sin ningn problema, la clase hija es considerada como una clase abstracta, sin embargo, si se necesita crear una instanciacin de esta clase hija, no se puede realizar, debido a que las clases abstractas no pueden instanciarse. De tal manera, si se implementan todos los mtodos abstractos en la clase hija, en ese caso si es posible efectuar una implementacin de esta clase.

public class ClaseHijaAbstracta extends ClaseAbstracta{ public static void main (String args[]){ ClaseHijaAbstracta obj = new ClaseHijaAbstracta(); obj.metodo1(); obj.metodo2(); } public void metodo1() { } public void metodo2() { } }

3.13.2.3.

Modificador Final

El modificador final puede ser aplicado para una clase, mtodo o variable. Cuando se utiliza este modificador para una clase, se le indica a Java que no se quiere que esa clase sea heredada por alguna otra clase. Por ejemplo, si se tiene una clase final, que intenta ser heredada por alguna clase, se producir un error de compilacin.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 141

public final class ClaseFinal{ } public class ClaseHijaFinal extends ClaseFinal{ }// Error de compilacin

Java comentar para este ejemplo que la ClaseHijaFinal no puede heredar de la clase final ClaseFinal, sin embargo, si es posible realizar instaciaciones de esa clase declarada final desde cualquier otra clase.

Cuando el modificador final se utiliza en un mtodo, se le indica a Java que ese mtodo no puede ser sobrescrito, es decir, si desea que la clase pueda ser heredada pero que los mtodos no sean modificados por la clase hija. Sin ningn problema, se puede tener una clase y varios mtodos finales y heredarlos en alguna otra clase, pero se va a obtener error de compilacin si se sobrescriben.

Con respecto a las variables, el modificador final se utiliza para denotar a las variables como constantes, es decir, si se declara a una variable de tipo final, se le indica a Java que la trate como una constante a la cual no se le permitir modificar su valor. Si se intenta modificar se obtiene un error de compilacin, por ejemplo:
public class Clase { final int entero = 5; public static void main (String args []) { Clase obj = new Clase (); obj.entero = 6; // Error de compilacin } }

Una caracterstica importante a resaltar sobre las variables que se declaran con el modificador final, es que siempre se deben de inicializar o se obtendr un error de compilacin. Observe el siguiente caso:
public class Clase { final int valor; Clase(int v) { valor = v; } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 142

Para este caso compila sin ningn inconveniente, ya que en el constructor de la clase se est inicializando la constante, sin embargo, si el constructor no se especifica, se obtendra un error de compilacin. Acorde con esto, toda variable que se declare final debe ser inicializada bien sea cuando sea declarada o cuando se inicialice una vez en el constructor de la clase, en cualquier otro caso se obtendr un error de compilacin. Para las variables que se declaren finales dentro de los mtodos, se puede observar la caracterstica que pueden ser inicializadas en tiempo de ejecucin, es decir, en mtodo se puede tener una variable final no inicializada y luego poder inicializarla ms tarde. Por ejemplo:
public class Clase { public void metodo() { final int entero; entero = 5; } }

Pero una vez que se le asigne algn valor ya no podr ser modificado. Tambin debe recordad que el modificador final es el nico modificador que se le puede colocar a una variable local, es decir, a una variable dentro de un mtodo, por lo tanto, un mtodo puede tener sus propias constantes.

Si se tiene una variable de tipo final y esa variable hace referencia a un objeto de una clase, es decir, que se va a tener como constante va a ser la referencia echa a esa clase, es decir, que se puede modificar sin ningn problema el contenido de la clase instanciada. Lo nico es que luego esa variable de referencia no podr apuntar hacia ningn otro objeto.

3.13.2.4.

Modificador Synchronized

Este modificador se utiliza dentro de la teora de Threads, y es para prevenir que ms de un threads acceda a un bloque de cdigo al mismo tiempo. Solamente puede ser utilizado en los mtodos.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 143

3.13.2.5.

Modificador native

Este modificador solamente se utiliza para los mtodos e indica que el cuerpo de cdigo de ese mtodo estar escrito en un lenguaje que no es Java. Para utilizar entonces el modificador native, la declaracin es muy parecida a la de un mtodo abstracto, es decir, el mtodo no tendr cuerpo. Por ejemplo:
public native void pantallaHolaMundo();

3.13.2.6. Modificador transient

Se utiliza solamente para variables, sirve para indicar que una variable no puede ser serializada. Un objeto es serializado cuando puede ser transformado en una

secuencia de bytes para poder enviarse a travs de la red, guardase en un archivo, etc. Una clase se convierte serializable cuando implementa la interfaz Serializable. En ocasiones puede interesar que un atributo concreto de un objeto no sea serializado. Esto se consigue utilizando el modificador transient, que informa a Java que no interesa mantener el valor de ese atributo para serializado. En general, eso es lo que se debera saber acerca de ese modificador. 3.13.2.7. Modificador Volatile

Tambin este modificador es exclusivo para las variables. La utilidad se fundamenta en los conceptos de ejecucin de procesos en paralelo, es decir, threads. A menos que se utilicen mtodos o bloques sincronizados, no existe la seguridad de que un valor actualizado por un thread se actualice en memoria antes que otros threads vean el valor modificado. Para conseguir esto, se utiliza el modificador volatile, que lo que consigue es que cada vez que se vaya a utilizar esa variable se lea el valor ms actualizado del mismo en la memoria. Sin embargo, hay que acotar que como este modificador se basa en la teora de threads, no esta 100% garantizado que los hilos puedan leer siempre el valor actualizado.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 144

3.13.2.8. Modificador strictfp

La exactitud con decimales, siempre ha sido una ardua tarea para las empresas que disean procesadores, tanto es as que el resultado de una suma con decimales en un procesador, tanto es as que el resultado de un procesador Intel P IV. Java a pesar de que es plataforma independiente, depende del procesador para realizar clculos matemticos. De esta manera, al realizar alguna operacin con elementos punto

flotante obedece en gran parte de la implementacin del procesador para obtener un resultado. Por lo que dependiendo del procesador el resultado de una operacin

punto flotante puede variar.

Tratando de cumplir con uno de los requisitos que ha hecho popular a Java como es el de la independencia de plataforma, y siguiendo un estndar matemtico avalado por el IEEE; se puede conseguir que el resultado sea el mismo en cualquier procesador, a traves del modificador strictfp se le indica a Java que las operaciones a realizar con elementos punto flotante sigan ese estndar. Este modificador solamente puede ser utilizado en las clases o mtodos.

3.14. Declaracin y control de acceso

3.14.1. Clases

Se enumeran a continuacin, las posibles combinaciones de modificadores que se pudieran tener para una clase:
<public <public <public <public <public <public o o o o o o default> default> default> default> default> default> class Clase{} <strictfp> class Clase{} <abstract> class Clase{} <final> class Clase{} <strictfp> <abstract> class Clase{} <strictfp> <final> class Clase{}

Algo importante a mencionar es que el orden en que se coloquen los modificadores no importa, lo substancial que se debe recordar es no mezclar modificadores que segn sus conceptos tericos no deberan ir juntos, por ejemplo, nunca se puede declarar una clase con los modificadores abstract y final, ya que tericamente con el

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 145

modificador abstract se est suponiendo que esa clase debe ser heredada y con el modificador final se indica a Java que esa clase no debe ser heredada.
public abstract final Clase{}//Error de compilacin

Ahondando un poco sobre la estructura completa a seguir en las declaraciones de las clases, se debe primero mencionar que segn el paradigma Orientados a Objetos y las peculiaridades de Java, una clase hija solamente puede heredar de una clase padre, de esta forma, para realizar herencia se utiliza la sentencia extends, si no se utiliza la sentencia, automticamente la clase heredar de la clase Object, esta clase puede considerarse como la clase Padre o la clase root de Java. En ella se consiguen las funciones bsicas que pueden aplicarse a cualquier objeto. En la declaracin de las clases, tambin se puede utilizar la sentencia implements para simular la herencia mltiple que por ejemplo en C++ se utiliza. Algo importante, es que solamente se puede utilizar el comando implements con objetos que sean interfaces.

La sintaxis estndar que se debe de seguir en estricto para declarar una clase es la siguiente:
<modificadores> class Clase <extends> ClasePadre <implements> Interfase1, Interfase2, ....{ //No importa el orden del contenido de una clase <variables de instancia> <constructores> <mtodos, clases internas, interfaces internas> }

class: Palabra reservada, de carcter obligatorio en la declaracion de una clase. Clase: Corresponde al nombre de la clase. extends: Esta palabra se utiliza para indicar, que la clase que se esta declarando hereda de una superclase o clase padre. ClasePadre: Nombre de la clase padre o superclase. implements: Esta palabra se utiliza para indicar, que la clase que se esta declarando implementara una interface (entendiendose como interface, una clase que no implementa sus metodos).

Interfase1, Interfase2: Nombre de las interfaces a implementar

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 146

3.14.2. Mtodos

Con respecto a los mtodos, se pueden entonces utilizar los modificadores de visibilidad private, default, protected y public, junto con los modificadores final, static, abstract, synchronized y native. A continuacin se muestran las posibles

combinaciones de modificadores que Java no permite ejecutar con respecto a los mtodos:
<public o protected o default o private><static><abstract> metodo(){}

Esta declarcin no es permitida, la razn radical en un conflicto de conceptos ya que el modificador abstract se utiliza para que las clases que hereden de una clase abstracta implementen los mtodos abstractos, y al declarar mtodos estticos existen una regla que indica que si se heredan dichos mtodos no se puedan sobrescribir.
<public o protected o default> <final> <abstract> metodo(){}

Al igual que el caso anterior, existe un conflicto de conceptos, el modificador final en un mtodo indica que no se puede implementar si es heredado y abstact en un mtodo es para todo lo contrario.

En trminos generales un mtodo abstracto no puede ser declarado como final, static, synchronized, native, strictfp o private. De tal manera, tenga en mente las posibles combinaciones de estos modificadores que puedan ocurrir al tratar de combinarse a un mtodo abstracto, ya que para todos esos casos siempre se producir un error de compilacin.

La sintaxis estndar puede ser utilizada para declaracin de cualquier mtodo es la siguiente:

<modificadores> tipo_dato_retorno metodo(lista_argumentos_opcional) <throws> excepciones_arrojar{ <variables locales> /*Las variables, no pueden llevar ningn modificador, exceptuando final.*/ <clases internas locales> <estamentos de cdigo> }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 147

tipo_dato_retorno: Indica el tipo de dato que retorna el metodo, si el metodo no retorna ningun valor se coloca en tipo_dato_retorno la paladra void. metodo: Nombre del metodo. lista_argumentos_opcional: Indica los parmetros que recibira el metodo. Se debe indicar el tipo de dato y el nombre de la variable que el metodo recibira como parmetro. Si son varios argumentos, se separa la lista por comas.

throws: Esta palabra indica que se realizara manejo de excepciones. excepciones_arrojar: Indica la lista de excepciones que se manipularan.

Con respecto al tipo de dato de retorno para un mtodo puede ser cualquiera de los tipos de datos primitivos ya conocidos, como tambin puede retornarse algn objeto de alguna determinada clase. Si no se desea que el mtodo devuelva algn resultado se utiliza la palabra clave void para indicar que el mtodo se comporta como un procedimiento y no como una funcin. Algo importante a resaltar sobre los tipos de

datos de retorno es que Java acepta la posibilidad que se devuelvan arreglos de un determinado tipo de dato. El arreglo de retorno puede ser del nmero de dimensiones que se necesita. Por ejemplo:
public int [] metodo(){}

Con respecto al nombre del mtodo, hay que recordar que se deben de seguir los estndares ya establecidos para declarar un identificador.

La lista de argumentos que recibe un mtodo puede ser opcional, se puede o no colocar una lista de argumentos; lo importante es que siempre la declaracin de un mtodo debe estar acompaada por parntesis que abren y cierran, seguido por el bloque de cdigo correspondiente, si no se tratase claro est, de un mtodo abstracto o nativo, en donde nose puede colocar bloque de cdigo. En la lista de argumentos, el mtodo puede recibir variables declaradas por el mtodo como constantes. ejemplo.
public int metodo(final int variable){}

Por

Esta caracterstica tiene la principal finalidad de pasar a la funcin un argumento de slo lectura y no se pueda modificar dicho argumento luego dentro del cuerpo del mtodo.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 148

Es importante resaltar que el orden en que se coloquen los argumentos afecta un concepto terico dentro del paradigma Orientado a Objetos, conocido como la sobrecarga. Esta caracterstica se ver mas adelante en donde se establecern una serie de reglas. Al igual ocurre si el mtodo arroja excepciones, existen una serie de reglas que sern presentadas en su debido momento.

Con respecto al cuerpo del mtodo, se puede utilizar variables que tendrn el mismo tiempo de vida que el mtodo; adems se pueden declarar clases internas que pertenezcan exclusivamente el mtodo, como adems cualquier conjunto de estamentos vlidos para realizar alguna actividad especifica. 3.14.3. Variables

Para las variables se pueden utilizar los modificadores de visibilidad, private, default, protected y public en combinacin con el resto de modificadores static, final, transient y volatile.

Las posibles combinaciones que se pueden utilizar en la declaracin de una variable son las siguientes:

<public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable; <public o protected o <tipo_dato> variable;

default o private> default o private><final> default o private><final> default o private><static> default o private><transient> default o private><volatile> default o private><final><static> default o private><final><transient> default o private><static><transient> default o private><volatile><transient> default o private><static><volatile> default o private><final><static><transient> default o rivate><static><transient><volatile>

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 149

Las variables transient pueden ser declaradas tanto estticas, finales o como voltiles. Cuando se le indica a Java que una variable se debe comportar como final y esttica, esta variable solamente puede ser inicializada bien sea cuando se declara la variable o cuando se inicialize la primera vez dentro de algn bloque de cdigo esttico.

Ejemplo:

public class Clase{ public final static int variable; static{ variable = 5;// Valido, se puede hacer } Clase(){ variable = 5;// Invalido, error de compilacin } }

Las posibles combinaciones no permitidas por el compilador de Java, son las siguientes:
<public o protected o default o private> <final> <volatile>

<tipo_dato> variable;

Esta combinacin es invlida, ya que no existe relacin terica entre estos modificadores, es ilgico que Java trate de gastar recursos para comprobar el estado de una variable, si la misma no va a sufrir ningn cambio durante el tiempo de vida de la aplicacin ya que se trata de una constante.

Esta combinacin de modificadores tambin es invlida, por el mismo principio anterior:


<public o protected o default o private><final><static> <volatile><transient> <tipo_dato> variable;

3.15. Constructores

Los constructores se utilizan para inicializar la instanciacin de una clase, Las principales caractersticas asociadas a un constructor son las siguientes:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 150

El constructor o los constructores que se elaboren deben poseer el mismo nombre de la clase que se est creando, adems los constructores no deben retornar absolutamente nada, es decir, ni siquiera void. Las Sintaxis estndar que se utiliza para los constructores se muestran a continuacin:

<modificador de visibilidad> Clase(posibles argumentos){ posibles sentencias; }

El modificador del constructor solamente puede ser public, private, default o protected. Cuando se declara el constructor privado implica que esa clase no se puede instanciar, y este tipo de declaracin es utilizada para implementar parte de una tcnica de programacin conocida con el nombre de patrn de diseo Singleton.

Otra caracterstica es que los constructores no pueden ser heredados.

Es importante destacar que si se declara una clase sin constructor automticamente Java asigna uno con cero parmetros, que se conoce con el nombre de constructor por defecto; sin embargo, si se crea algn constructor, Java no crear el constructor por defecto, incluso, si crea algn constructor que recibe algn parmetro y no se crea manualmente el constructor por defecto, cuando se trate de instanciar la clase a partir del constructor sin parmetros, Java arrojar un error de compilacin. Por ejemplo:
public class Clase{ Clase(int i){ } public static void main (String args []){ Clase obj = new Clase();// Error de compilacin } }

Se obtienen un error de compilacin ya que existe el constructor sin parmetros (constructor por defecto). Sin embargo, si se declaran varios constructores y adems el constructor sin parmetros Java compilar y correr sin problemas:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 151

public class Clase{ Clase(int i){ } Clase(){ } public static void main (String args []){ Clase obj = new Clase(); } }

Existen dos sentencias, this() y super(), que se encuentran muy relacionadas al concepto de los constructores. La sentencia this se utiliza para referirse a la instancia actual de una clase, es decir, se le indica a Java que todo lo que se referencia con this pertenece a la clase. El siguiente cdigo muestra esta afirmacin:

public class Clase{ int var = 5; void metodo(){ int var = 6; this.var = var;//this.var se refier a la variable de clase } }

En los constructores, la sentencia this es utilizada para invocar a otros constructores que poseen una lista de argumentos distintos, es decir que existen lo que se conoce como una sobrecarga de constructores. Por ejemplo:
public class Clase{ Clase(){ this("Otro constructor"); } Clase(String var){ System.out.println (var); } public static void main(String args[]){ Clase obj = new Clase(); } }//Imprime: Otro constructor

Nunca se pudo haber hecho la llamada a un constructor utilizando su nombre:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 152

public class Clase{ Clase(){ Clase("Otro constructor"); /*Error de compilacin. No se puede invocar a otro constructor llamandolo por su nombre, debe utilizarse la senencia this.*/ } Clase(String var){ System.out.println (var); } }

Es importante resaltar el hecho de que si va a utilizar la sentencia this dentro de alguno de los constructores para llamar a otro, es vital que siempre se coloque la sentencia de la llamada this como el primer estamento de cdigo dentro del constructor, sino , se obtiene un error de compilacin.

Con respecto a la sentencia super(), esta es utilizada cuando se quiere invocar bien sea los elementos de la clase padre de la que proviene la clase que se esta instanciando, o se desea invocar alguno de los constructores de la clase padre. Si no se extiende de ninguna clase hay que saber que se va a extender por defecto de la clase Objetc.

A continuacin, se mostrar un ejemplo a travs del cual se realizar un anlisis en profundidad de todas las caractersticas relacionadas a los constructores con el objetivo de mostrar en detalle todo el proceso de inicializacin de un objeto:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 153

public class ClasePadre { int var = 15; static int var2 = 3; ClasePadre (){ System.out.println ("Ejecucin del constructor Padre sin parmetros"); } { var = 16; System.out.println("Ejecucin del bloqueo no esttico del padre, var -> "+var); } static{ System.out.println("Ejecucin del bloqueo esttico del padre, var2 -> "+var2); } ClasePadre(int var){ System.out.println ("Ejecucin del constructor var = "+ var); } } public class ClaseHijo extends ClasePadre{ ClaseHijo(){ this("Test"); System.out.println("Ejecucin del constructor Hijo"); } ClaseHijo(String variable){ System.out.println (var); System.out.println("Ejecucin del Segundo constructor Hijo -> "+variable); } public int metodo(){ return super.var; } static{ System.out.println("Ejecucin del bloque estatico del hijo"); } public static void main(String args []) { ClaseHijo obj= new ClaseHijo(); } }

El resultado de este ejemplo es el siguiente:


Ejecucin Ejecucin Ejecucin Ejecucin 16 Ejecucin Ejecucin del del del del bloqueo estatico del padre, var2 -> 3 bloque estatico del hijo bloqueo no estatico del padre, var -> 16 constructor Padre sin parmetros

del Segundo constructor Hijo -> Test del constructor Hijo

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 154

Cuando se realiza una instanciacin de una clase, ocurre una serie de procesos siempre en un mismo orden. Primero se cargan los elementos estticos siempre en el orden en el que aparezcan, luego las variables de instancia, los bloques de cdigo no estticos, y por ltimo se ejecuta el constructor. Esto claro, para una clase; pero hay que recordar que por las caractersticas de Java, la carga de clases se hace desde la clase ms general hasta la ms especificada. En el ejemplo anterior, la clase padre se carga primero a pesar de que se instancia un objeto de la clase hija .De tal

manera, que primero se ejecuta en el orden ya descrito, las caractersticas de la clase padre y luego las caractersticas de la clase hija. Tambin es importante acotar, de que a pesar de que la clase padre no extiende de ninguna otra, por defecto, esta clase extender de la clase Object, por lo que siempre se inicializa las caractersticas de la clase Objct inicialmente.

En estos ejemplos se utilizaran bloques de cdigos estticos y bloques de cdigo no esttico. La principal utilidad de estos bloques de cdigo es quizs para poder

inicializar variables a travs de alguna porcin de cdigo como por ejemplo un ciclo. La principal diferencia entre los dos bosques de cdigo, es que el bloque de cdigo esttico, solamente se va a cargar una sola vez cuando Java carga la clase, es decir, que no es necesario que se instancie algn objeto de la clase, ya que todos los elementos estticos son cargados al momento de cargar la clase. Para el caso de los bloques no estticos, estos se cargan cuando se realiza la instanciacin de una clase, adems se van a cargar cada vez, que se realice una instanciacin de la clase.

Si en el main principal del ejemplo anterior no se produjera ninguna instanciacin de la clase hija, este sera el resultado que se va a obtener por pantalla, esto es debido a que siempre los bloques estticos y variables estticas son cargados en memoria a pesar de que no se produzca ninguna instanciacin.
Ejecucin del bloqueo estatico del padre, var2 -> 3 Ejecucin del bloque estatico del hijo

Adicionalmente se quiere hacer nfasis en el hecho de que Java carga los bloques de cdigo esttico y no estticos de acorde a como los va encontrando en el archivo compilado de Java. Es decir, observe el siguiente ejemplo:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 155

public class ClaseEstatica { static{ System.out.println("Ejecucin del bloqueo esttico"); } static ClaseEstatica a = new ClaseEstatica(); ClaseEstatica(){ System.out.println("Construccin del objeto Clase"); } public static void main(String args[]){} }

El resultado de compilar y ejecutar este cdigo es el siguiente:

Ejecucin del bloqueo esttico Construccin del objeto Clase

Queda demostrada que Java carga los bloqueos de cdigo y las variables en el orden en el que aparecen en el cdigo fuente de archivo.

Se coment que cuando se instancia la clase hija, antes de inicializarse sus caractersticas, se inicializan primero las caractersticas de su clase padre. Esto debe a que en un constructor, Java por defecto en la primera lnea del mismo siempre ejecuta una sentencia super(), esto para poder llamar al constructor del padre de la clase que se est creado, de esta forma en la clase ClaseHija cuando se instancia la clase, Java hace una super clase de la que extiende la ClasePadre y esta de la que extiende, que en este caso es la clase Object, luego se inicializa las caractersticas segn el orden establecido y se llama a los constructores para cada una de las clases en el orden jerrquico: Object, ClasePadre y ClaseHija.

Existen una serie de reglas, con respecto con las sentencias super y this, dentro de los constructores.

Por ejemplo, si se declara un constructor con una serie de argumentos en la clase ClasePadre y no se declara el constructor por defecto, no sea crea el constructor por defecto:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 156

public class ClasePadre { public ClasePadre (int argumento1, String argumento2){ System.out.println("Ejecucin del constructor con parmetros"); } }

Por lo tanto, si se trata de crear un objeto de la clase ClaseHija, a travs de la forma ClaseHija obj = new ClaseHija(), Java va a tratar de hacer un super implcito al constructor de la clase ClasePadre() sin conseguir xito en su bsqueda. manera Java arroja un error de compilacin en este caso. De tal

Para poder llamar al constructor con parmetros en el padre desde la clase hija, es necesario realizar un super explcito en el constructor de la clase hija, por ejemplo, de la siguiente forma:

public class ClaseHija extends ClasePadre{ public ClaseHija(){ super (1, "Constructor"); /*Llamada explicita al constructor del Padre.*/ System.out.println ("Ejecucin del constructor por defecto del Hijo"); } }

Al igual que para this, la sentencia super dentro de constructores solamente puede ser invocada en la primera lnea de constructor, entonces segn esta regla, nunca es posible combinar en un mismo constructor la utilizacin de this y super.

3.16. Sobre Carga y Sobre Escritura

La esencia de la sobrescritura es que pueda utilizar un mtodo preestablecido por un padre y reimplementarlo por un hijo, o mejor an, utilizar la implementacin del padre y aadirle ms funcionalidad en el hijo. La sobrescritura en combinacin con la herencia, conforma uno de los aspectos del paradigma Orientado a Objetos ms interesantes y poderosos, este concepto se conoce con el nombre de polimorfismo.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 157

La principal restriccin en cuanto a la sobreescritura es que la clase hija debe tener misma firma del mtodo que el padre, es decir que se debe tener el mismo nombre del mtodo, debe recibir los mismos parmetros y devolver el mismo tipo de dato, tanto en el padre como en el hijo, sino Java no considera que est sobrescribiendo un mtodo. A continuacin, un primer ejemplo en donde se practica la sobrescritura:
public class ClasePadre{ public int metodoPadre(int variable){ return variable; } } public class ClaseHijo extends ClasePadre{ public int metodoPadre(int variable){ return variable++; } }

Otra caracterstica importante de la sobrescritura es que el mtodo que est siendo sobrescrito no debe ser ms restrictivo que el mtodo original, es decir, que si en el padre hay un mtodo publico que se quiere sobrescribir en la clase hija, no es permitido que este mtodo se convierta en private en el hijo. Algo que si es posible es que si en el padre el mtodo es protected, en el hijo pudiese ser protected o public, es decir, no existe inconveniente que el mtodo sobrescrito en el hijo sea menos restrictivo que en el padre.

Se podr sobrescribir un mtodo en una clase hija siempre y cuando en la clase padre el acceso de visibilidad sea el adecuado, si en el padre se tiene un mtodo privado ser imposible que el hijo pueda tener acceso a este mtodo y por lo tanto sobrescribirlo. De tal manera, entran en el juego de la sobrescritura las reglas de visibilidad ya conocidas.

Existe una regla que indica que no es posible sobrescribir un mtodo esttico para que se convierta en un mtodo no esttico en el hijo, como adems no es posible sobrescribir un mtodo no esttico para que se convierta esttico en el hijo.

Tambin por condiciones tericas, un mtodo declarado como final, no puede ser sobrescrito en una clase que hereda dicho mtodo.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 158

Con respecto a la sobrecarga, la idea de este concepto es la de declarar un mtodo varias veces para que pueda recibir diferentes tipos de parmetros y as comportarse de acorde a esos parmetros. Es decir, intentar hacer un mtodo que reciba parmetros opcionales. Las reglas que se deben de considerar al aplicar la sobrecarga son las siguientes:

Cuando se aplica la sobrecarga. Los mtodos deben de llamarse con el mismo nombre y la lista de argumentos debe ser completamente distinta, de tal forma que Java pueda compartir el cdigo suponiendo que se esta produciendo una sobrecarga.

Otra de las caractersticas, es que el tipo de dato de retorno puede ser tambin distinto, pero solamente el tipo de datos de retorno no es suficiente para que java considere que se esta sobrecargando un mtodo.

Java toma en cuenta el orden el que se pasan los argumentos en un mtodo, por lo que algo como lo siguiente compilara sin ningn problema:
public class ClaseSobreCarga { public void metodo(int variable, String nombre){ System.out.println("Ejecucin del metodo"); } public void metodo(String nombre, int var) { System.out.println("Ejecucion de otro metodo"); } }

Para este ejemplo, se esta recibiendo como argumentos los mismos tipos de datos pero en orden distinto. Java lo considera como sobrecarga.

La sobrecarga se puede tomar en consideracin para mtodos que se encuentran en una misma clase. Como tambin la sobrecarga puede confeccionarse a travs de la herencia, esto quiere decir, que en mtodo sobrecargado puede estar en una misma clase o pudiese estar en una clase que la deriva.

No influyen en la sobrecarga los modificadores de acceso, por lo que se puede tener un mtodo public y en mtodo sobrecargado private y static.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 159

Como se mencionaba al inicio el polimorfismo es uno de los conceptos mas importantes dentro del paradigma Orientado a Objetos. Este concepto implica el hecho de la creacin de un objeto de una clase determinada a partir de las caractersticas provistas por una subclase de esta, es, decir, algo como esto:

ClasePadre obj = new ClaseHija(); /* Solo puede acceder a lo del padre, los atributos y metodos propios del hijo no pueden ser accesados. Si el hijo tiene mtodos heredados se ejecuta el del hijo.*/

La idea con esta instanciacion,

es la de transmitir el comportamiento de

funcionalidades que solamente conoce un padre a partir de un hijo. Es decir, los mtodos que estn siendo sobrescritos por un hijo podrn ser invocados por una variable de tipo padre. Sin embargo, el hijo podr poseer informacin que no necesariamente conozca el padre, y en ese caso la variable de tipo padre no podr nunca acceder a la informacin especfica del hijo. Observe el siguiente ejemplo:
public class ClasePadre{ int entero = 5; void metodoPadre () { System.out.println("Ejecucin del mtodo del padre"); } } public class ClaseHijo extends ClasePadre{ int entero = 10; void metodoPadre(){ System.out.println("Ejecucin del mtodo del hijo"); } public static void main(String args []){ ClasePadre obj = new ClaseHijo (); obj.metodoPadre(); /* se ejecuta la implementacion del hijo.*/ System.out.println(obj.entero); // Imprime 5. /* Si se quiere imprimir el valor del entero de la clase hijo, se debe recuperar la funcionalidad haciendo casting a la subclase.*/ System.out.println(((ClaseHijo)obj).entero);/* Imprime 10. */ } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 160

El resultado que se obtendr de la invocacin del mtodo es la ejecucin de la implementacin del mtodo de la clase hija, es decir que por pantalla se mostrara Ejecucin del mtodo del hijo.

Si se indaga ms en el proceso que involucra el polimorfismo se pueden sacar unas cuantas conclusiones. Cuando se coloca las siguientes sentencias dentro de Java:
ClasePadre obj; obj = new ClaseHijo ();

Lo que ocurre es lo siguiente: a la variable obj se le asigna un tipo de dato que corresponde a la clase ClasePadre, o sea, ese tipo de dato est conformado por los variables y las firmas de los mtodos que posee ClasePadre. Hasta ese instante, an no se han inicializado ninguna de las variables posibles que pueda poseer la clase Padre. En la siguiente lnea de cdigo, a la variable obj se le asigna una instanciacion y en tiempo de compilacin, Java verifica que los tipos de datos sean compatibles.

Debido a que la ClaseHija extiende de la ClasePadre, hereda todas las caractersticas de esta clase, por consiguiente, la ClaseHija posee las caractersticas del tipo de dato de la clase ClasePadre, por lo tanto Java permitir compilar. Ya en tiempo de

ejecucin, lo que se va a cargar en memoria va a ser un objeto de la ClaseHija, es decir, en memoria van a estar las variables y metodos propios de la clase ClaseHija, como adems las variables y mtodos que hered de su padre ClasePadre. En

aquellos mtodos que tienen una misma firma tanto en el padre con en el hijo, solamente va a quedar en memoria el mtodo ms actualizado, es decir el del hijo, por esta razn es que la variable obj del tipo de dato ClasePadre tiene acceso a los mtodos sobrescritos realizados por el hijo, y adems es por esto que la variable obj no puede tener acceso a variables y mtodos exclusivos del hijo, ya que el tipo de dato de la variable obj indica que solamente debe poseer las caractersticas del tipo de dato de la clase ClasePadre.

Del anlisis anterior, se puede introducir el concepto de casting de objetos, en donde se podr recuperar el 100% de funcionalidad de un objeto de tipo Hijo referenciado por una variable de tipo Padre. En los ejemplos anteriores, se observa como a partir de una variable de tipo ClasePadre se poda instanciar un objeto de tipo ClaseHijo, sin embargo, el objeto como tal no se le puede aprovechar al mximo de su funcionalidad

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 161

debido a que este objeto est siendo accesado por una variable de ClasePadre, de tal manera para recuperar la completa funcionalidad del objeto ClaseHijo Java permite hacer un casting adecuado. Observe este ejemplo:

ClasePadre obj = new ClaseHijo (); ClaseHijo obj2 = (ClaseHijo) obj; /*Se recupera la funcionalidad del objeto construido de tipo Sin embargo una construccin de un hijo a partir de un padre, no se puede efectuar: ClaseHijo.*/

ClaseHijo obj = new ClasePadre();//No compila

Esto sucede por el hecho de que el tipo de dato de la variable obj, no coincide con el tipo de dato de la instanciacion, ya que si se detalla el tipo de dato de la ClaseHijo posee unas caractersticas propias y unas heredadas en la clase ClasePadre y el tipo de dato de la instanciacion no puede cumplir con todas las propiedades demandadas por el tipo de dato ClaseHija. Para finalizar el concepto de polimorfismo, es posible realizar las siguientes conclusiones puntuales, Java siempre permitir compilar lo siguiente:
Clase obj = new Clase(); Clase obj2 = new SubClase();

Adems, Java siempre permitir hacer un casting de objetos adecuado entre objetos que pertenezcan a una misma jerarqua de clases.
Clase obj = new SubClase(); SubClase obj2 = (SubClase) obj; SubClase obj3 = new SubClase();

Supngase la siguiente jerarqua de clases:


public class ClaseAbuelo extends Object{} public class ClasePadre extends ClaseAbuelo{} public class ClaseHijo extends ClasePadre{}

Se puede hacer un mtodo de la ClaseHijo que reciba como parmetro una clase ClaseAbuelo, y a ese mtodo se le podr pasar cualquiera de las otras clases ClasePadre o claseHijo o la misma ClaseAbuelo.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 162

Con la sentencia instanceof se verifica el tipo de clase que se esta ejecutando, es necesario hacer esto debido a que al pasarle al mtodo un objeto de tipo ClasePadre, las caractersticas propias de ese objeto se ocultan y solamente se tiene acceso a las caractersticas particulares de ClaseAbuelo. presenta el siguiente ejemplo. Suponiendo la jerarqua anterior se

public class ClaseHijo extends ClasePadre{ void metodo(ClaseAbuelo obj){ if (obj instanceof ClaseAbuelo){ System.out.println("Es un abuelo"); } if (obj instanceof ClasePadre) { System.out.println("Es un padre"); } if (obj instanceof ClaseHijo) { System .out.println("Es un hijo"); } } public static void main(String args[]){ ClaseHijo hijo = new ClaseHijo(); hijo.metodo(hijo); } }

En el mensaje que se obtiene por pantalla es el siguiente: Es un abuelo Es un padre Es un hijo. Esto debido a que el hijo como extiende del padre y el padre como extiende del abuelo, el hijo puede comportarse como los tres, por lo tanto es una instancia de los tres.

A continuacin se mostrar una serie de ejemplos de polimorfismo con su respectivo anlisis:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 163

public class ClasePadre{ private String cadena = "pap"; void imprimir(){ System.out.println(cadena); } public String getCadena(){ return cadena; } } public class ClaseHijo extends ClasePadre{ private String cadena = "Hijo"; void imprimir(){ super.imprimir(); // se imprime pap System.out.println(cadena);// se imprime hijo } } public class ClaseTest{ public static void main (String[] args) ClaseHijo objHijo = new objHijo.imprimir(); {

ClaseHijo();

/* Se va a observar por pantalla pap hijo, esto se debe a que desde la implementacin del mtodo imprimir de la variable hijo se hace la invocacin al mtodo imprimir de la clase ClasePadre a travs de super.imprimir() . Puede tender a confundir el hecho de que existira una sobreescritura devariables, que para este caso seria de la variable cadena.sin embargo, un mtodo especifico en una clase siempre tendra acceso a la variables propias de esa clase, por lo tanto el metodo imprimir de la clase ClasePadre tendra acceso a la variable cadena da la clase ClasePadre.Y el metodo imprimir de la clase ClaseHijo, tendra acceso a su variable cadena respectiva.*/ ClasePadre objPadre = new ClasePadre(); System.out.println(objPadre.getCadena());//Imprime pap System.out.println(objHijo.getCadena()); /* En ete caso se imprime pap, debido a que ClaseHijo hereda ese metodo mas no lo sobrescribe, por lo que el metodo va a alcanzar exclusivamente a las variables definidas en la clase ClasePadre.*/ } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 164

Observe este otro ejemplo:


public class Test{ public static void main (String args[]){ new ClaseHijo().imprimir(); } } class ClaseAbuelo{ public double dinero = 50000.00; public double getDinero(){ return dinero; } } class ClasePadre extends ClaseAbuelo { public double dinero = 100000.00; public double getDinero() { return dinero; } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 165

class ClaseHijo extends ClasePadre{ private double dinero = 200000.00; public double getDinero() { return dinero; } public void imprimir(){ System.out.println("El hijo tiene "+this.getDinero()); // Llama al mtodo getDinero del hijo. System.out.println("El padre tiene "+super.getDinero()); // Llama al mtodo getDinero del padre. super.super.getDinero(); /* Produce un error de compilacin, ya que una clase solamente solamente puede invocar a mtodos que pertenezcan a alguna clase en un nivel superior. Para este caso, para acceder a la implementacin de dos niveles mas arriba, es decir el abuelo, no se puede. No es posible hacer una invocacin de super.super. Si hubiese algun mtodo heredado no sobrescrito en el hijo que perteneciese al abuelo, se pudiese invocar pero como parte del hijo, para este caso, las variables que pueda estar utilizando el mtodo heredado con variables que pertenezcan al abuelo. */ /* Se puede hacer algo como lo siguiente, en donde se hace casting al objeto como tal. Con respecto a los mtodos, se ejecutara la implementacion del hijo ya que segn las reglas establecidas, la implementacin del mtodo no se determina hasta el momento de la ejecucin de la aplicacin, cosa que para las variables no ocurre. */ System.out.println("El hijo tiene "+((ClasePadre)this).getDinero()); // Se ejecuta el mtodo del hijo. System.out.println("El hijo tiene "+((ClaseAbuelo)this).getDinero()); // Se ejecuta el mtodo del hijo. System.out.println("El padre tiene "+((ClasePadre)this).dinero); // Imprime la variable del padre. System.out.println("El abuelo tiene "+((ClaseAbuelo)this).dinero); // Imprime la variable del abuelo. System.out.println("El hijo tiene "+this.dinero); //Imprime la variable hijo. } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 166

3.17. Clases Anidadas

Las clases anidadas son miembros de otras clases. El termino clase anidada puede utilizarse para referirse a cualquier clase dentro de otra, la cual pudiese ser esttica. El trmino de clase interna solamente puede utilizarse para referise a las clases anidadas que no son estticas.

Estas clases anidadas son miembros adicionales de la clase que las contiene, pudiendo poseer todos los posibles modificadores de visibilidad como en el caso de los mtodos y variables. Por lo tanto, una clase anidada puede ser, private, default, protected o public. Las propiedades de cada uno de esos modificadores se mantienen. Por ejemplo, si una clase interna es declarada protected, podr ser accedida por todas las clases y subclases dentro de un paquete y las subclases fuera de este paquete.

Otra caracterstica de las clases anidadas es que ellas pueden tener acceso a las variables y mtodos de la clase externa sin ningn problema, ms bien, hasta se pueden modificar dichas variables o realizar operaciones con los mtodos.

A continuacin, se presenta un ejemplo en donde se muestra la utilizacin de una variable que pertenece a una clase externa y es utilizada por la clase interna, adems se observa como se instancia una clase interna:
public class Clase { int var = 5; public class ClaseAnidada{ public void metodo(){ System.out.println("Ejecucion del mtodo de la clase anidada"); var++; } } public static void main(String args[]){ Clase obj = new Clase(); ClaseAnidada obj2 = obj.new ClaseAnidada(); obj2.metodo() ; System.out.println ("valor de var "+obj.var); } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 167

Lo que se observara por pantalla se lo siguiente:


Ejecucion del mtodo de la clase anidada valor de var 6

El valor de la variable var esta en 6, esto se debe a que dicha variable declarada en la clase externa esta siendo utilizada por la clase interna en uno de sus mtodos.

Otra forma de instanciacion seria la siguiente:


public class Clase { int var = 5; public class ClaseAnidada{ public void metodo(){ System.out.println("Ejecucion del mtodo de la clase anidada"); var++; } } public static void main(String args[]){ ClaseAnidada obj = new Clase().new ClaseAnidada(); obj.metodo(); } }

Una recomendacin con respecto a la utilizacin del concepto de herencia en una clase anidada, puede ser descrita a travs del siguiente ejemplo:
public class Clase { int var = 5; public class ClaseAnidada extends Clase{ public void metodo (){ System.out.println("Ejecucin del metodo de la clase anidada"); var++; } } public static void main(String[] args) { Clase obj = new Clase(); ClaseAnidada obj2 = new Clase().new ClaseAnidada(); obj2.metodo(); System.out.println("Valor de var en la clase anidada "+obj2.var); System.out.println("Valor de var en la clase externa "+obj.var); } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 168

Analizando estos cdigos, se puede observar que se tiene una clase anidada que hace un extends a la clase externa, lo que implica que la clase anidada va a convertirse en una subclase de su clase externa, por lo tanto va a heredar todas las variables y mtodos de la superclase. Es por esto que al imprimir el valor de var para la clase anidada va ser 6 y para la clase externa va a ser 5, ya que ahora las caractersticas de la clase externa pertenecen como caracteristicas propias de la clase anidada.

Otro ejemplo que se puede comentar de las clases anidadas es el siguiente:


public class Clase{ private int var = 1; public class ClaseAnidada{ private int var = 2; public void metodo(int var) { System.out.println("Var como argumento de mtodo "+var) ; System.out.println("Var como variable de la clase anidada "+this.var); System.out.println("Var como variable de la clase externa "+Clase.this.var); } } public static void main (String arg[]){ Clase obj = new Clase(); ClaseAnidada obj2 = obj.new ClaseAnidada(); obj2.metodo(3); } }

Para este ejemplo, se quiere mostrar como Java toma encuenta el alcance de las variables; el alcance se extiende desde adentro hacia fuera, es decir, que en el

mtodo dentro de la clase anidada al llamar la variable var, se accede a la variable declarada mas interna que tenga ese nombre. Para acceder a la varible var de la clase anidada desde el mtodo se utiliza la palabra clave this seguida del nombre de la variable y para tener acceso a la variable var de la clase externa se utiliza la sintaxis Clase.this.var. Si se coloca solamente Clase.var, Java esta considerando que esa variable es esttica y de esa forma arroja un error de compilacin.

Como se comentaba al inicio, se dice que una clase anidada que no es esttica tambin se le puede llamar clase interna y para aquellas clases que son declaradas estticas, solamente se debera utilizar la terminologa anidada.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 169

Cuando se declara se construye una clase anidada esttica, no es necesario que se tenga una referencia de un objeto de su clase que la engloba.
Externa.Interna objeto = new Externa.Interna();

Hay que mencionar que si se van a declarar variables o mtodos estticos dentro de una clase interna, es necesario que se declare tambin a la clase interna como esttica, sino se obtendr un error de compilacin. Si se declara la clase interna como esttica, esta clase no va a poder tener acceso a los elementos de la clase externa, a menos que estos sean estticos.

public class Clase{ public int var; public static class ClaseInterna{ public static void metodo(){ var++;// Error de compilacin } } }

Algo importante tambin que mencionar es que una clase anidada esttica puede contener elementos no estticos, para ese caso desde un contexto esttico no se puede acceder directamente a los elementos no estticos, por lo que es necesaria en esos casos instanciar esa clase esttica.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 170

public class Clase{ public static class ClaseInterna{ public static void metodo(){ System.out.println("Ejecucin de mtodo esttico de clase interna"); } public void metodo2(){ System.out.println("Ejecucin del mtodo no esttico de la clase interna"); } } public static void main (String arg []){ ClaseInterna.metodo(); /*Como se trata de una clase interna esttica, es posible acceder directamente a las propiedades de dicha clase sin tener que realizar una instanciacion.*/ ClaseInterna.metodo2();//Error de compilacin. /*No se puede invocar automticamente este mtodo ya que es necesario crear un objeto de dicha clase para poder tener acceso a dicha informacin de este mtodo.*/ } }

Por ultimo cabe descatar tambin, que una clase anidada puede ir dentro de un mtodo de la clase externa, pero para este caso la clase interna va a tener acceso a todas las variables excepto aquellas declaradas dentro del mtodo, exceptuando las que se declaran como constantes dentro de este.

Es decir las variables que se pasan como argumentos y el resto de variables locales no van hacer accedidas por la clase interna contenida dentro del mtodo, a menos que esas variables locales se declaren finales. Esto se debe a que esa clase interna pudiese vivir fuera del mtodo, por lo que el mtodo puede terminar su ejecucin y destruirse y la clase interna continuar en memoria, entonces se pueden alcanzar las variables finales declaradas dentro del mtodo, porque en tiempo de compilacin Java hace una copia de esas constantes para poder ser utilizadas por la clase interna.

Este

tipo de clase internas no pueden llevar ningn modificador, ni pueden ser

declaradas estticas, por lo que no pueden contener elementos estticos. Puesto que los nombres de clases locales no son visibles fuera del contexto local, las referencias de estas clases no se pueden declarar afuera. Su funcionalidad se podra alcanzar tan solamente va referencias de objetos de tipo Object retornados por los mtodos.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 171

Por ejemplo:
public class Clase{ public Object metodo(){ /* No seria correcto colocar el tipo de dato de las clase Interna, debido a que este tipo de clases no son visibles fuera del contexto del metodo, es por esto que debe utilizarse como tipo de dato de retorno la clase Object.*/ class Interna{} return new Interna(); } public static void main (String args []) Clase obj = new Clase(); Object objeto = obj.metodo(); } } {

3.18. Clases Annimas

La utilizacin de estas clases, como su nombre lo indica, es para que no se utilize un nombre para declarar una clase, estas clases son muy populares para aadir listeners o eventos en una interfaz grfica.

Las caractersticas de estas clases son las siguientes: una clase annima no puede ser abstracta, siempre va a ser considerada como una clase interna, no puede ser esttica y siempre es considerada final, por ltimo, una clase annima no puede poseer constructores.

A continuacin se presenta un ejemplo de definicin de clase annima en relacin con el AWT:


unObjeto.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { ... } }); /* new nombreInterfaz(){ ... }); Obligatorio () vacios, porque la interfaz no tiene constructor, La clase anonima que implementa una interfaz implicitamente hereda de Object.*/

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 172

Las clases annimas pueden implementar un interfaz o heredar de una clase. Sin embargo, no se utiliza las palabras claves implements o extends respectivamente. Las clases annimas se construyen realizando una instanciacin bien sea de la clase o de la interfaz que se necesite. En caso de instanciar de una interfaz, se requiere implementar todos sus mtodos, y en caso de instanciar de una clase, se hereda todos sus mtodos con la posibilidad de sobrescribirlos.

Segn el ejemplo anterior el ActionListener(), se refiere a la interfaz que se quiere implementar, no se necesita utilizar la sentencia implements, tambin si se desea se puede extender de alguna clase dependiendo especficamente de que tipo de clase reciba como argumento el mtodo. Observe un ejemplo en detalle:
public abstract class Clase{ public Clase(){ System.out.println("Constructor"); } public abstract void comer(); } public class Prueba{ public void metodo(Clase obj){ obj.comer(); } public static void main(String args []){ Prueba obj = new Prueba(); /* Se construye una clase anonima a partir de la clase abstracta Clase, en este caso al ser una clase abstracta es necesario implementar los mtodos que son abstractos.*/ obj.metodo(new Clase(){ public void comer(){ System.out.println ("Comiendo"); } }); } } /* new nombreSuperClase(argumentos){ ... }); Lista de argumentos que acepta el constructor de la superclase.*/

Las clases anonimas se pueden usar en tres contextos: En en llamado de un metodo. En el retorno de un metodo. En la inicializacion de un Objeto.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 173

3.19. Interfaces

La interfaz tiene una utilidad parecida a la del modificador abstract, ms bien, tiene como misin llevar el concepto de clase abstracta un poco ms lejos. Una interfaz es como una clase abstracta pero que no permite que ninguno de sus mtodos sea implementado. Adems, con las interfaces se crea el concepto de la herencia mltiple en Java. De tal manera, la regla indica que en una interfaz no se debe realizar

ninguna implementacin de mtodos, sino proveer la firma con la cual otras clases puedan efectuar la implementacin.

Las interfaces tienen la caracterstica de que las variables que se declaren dentro de ellas van a ser consideradas como constantes y estticas en aquellas clases donde se implemente la interfaz. Es decir, si dentro de una interfaz se declara una variable, va a ser considerada como final y static en la clase que lo implementa. Es importante acotar que segn este concepto solamente se pueden utilizar los modificadores public, static o final en la declaracin de las variables en una interfaz, sino se utiliza ningn modificador, por defecto las variables son estticas y finales. ejemplo. A continuacin un

public interface Interfaz { int var = 5; } public class Clase implements Interfaz{ public static void main (String args []){ System.out.println(Clase.var); Clase.var = 6; // Error de compilacin System.out.println(Interfaz.var); /* Es possible acceder a la variable como si se tratase de una variable esttica, pero nunca modificarla debido a que adicionalmente estas variables con constantes.*/ } }

Se obtendr un error de compilacin si se intenta colocar por ejemplo otro tipo de modificador que no sea public, static y final a alguna variable dentro de una interfaz.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 174

public interface Interfaz{ protected int var = 5;//Error de compilacin }

Cabe mencionar tambin, que al igual que en las clases, a la interfaces solamente se le pueden colocar los modificadores public o defaul. Para los mtodos que se vayan a declarar, la restriccin es que pueden tener cuerpo, es decir, lo siguiente no se puede hacer dentro de una interfaz:
public interface Interfaz{ public void metodo(){}//Error de compilacin. }

Lo correcto es hacer lo siguiente:


public interface Interfaz{ public void metodo();//Compila ya que no tiene cuerpo. }

Cuando desde una clase se realiza la implementacin de una interfaz, es necesario implementar todos los mtodos de la interfaz, es decir, a lo mejor slo se necesita la firma de alguno de los mtodos, sin embargo el resto de los mtodos al menos deben ser declarados con un cuerpo vaco. Si no se desea implementar todos los mtodos de la interfaz en la clase y no se desea colocar el resto de los mtodos con cuerpo vaco, esta clase se debe de convertir en abstracta para que pueda compilar.

public interface Interfaz{ public void metodo1(); public void metodo2(); } public class Clase implements Interfaz{ public void metodo1(){ System.out.println("Interfaces"); } public static void main(String args[]){ Clase obj = new Clase(); obj.metodo1(); } }//Error de compilacin

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 175

Para este ejemplo solamente fue implementado el metodo1, Java va arrojar un error de compilacin que indica que se debe declarar la clase abstracta. Pero si se declara la clase abstracta entonces no es posible instanciar dicha clase, de tal forma, lo mejor es implementar el mtodo que falta que en este caso sera metodo2.

Con colocar algo como lo siguiente sera suficiente para que la aplicacin se compile y ejecute:

public interface Interfaz{ public void metodo1(); public void metodo2(); } public class Clase implements Interfaz{ public void metodo1(){ System.out.println("Interfaces"); } public void metodo2(){} public static void main(String args[]){ Clase obj = new Clase(); obj.metodo1(); } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 176

Suponga el siguiente segmento de cdigo

public interface Interfaz1{ public void metodo1(); public void metodo2(); } public interface Interfaz2 extends Interfaz1{ public void metodo3(); public void metodo4(); } public class Clase implements Interfaz1{ public void metodo1() { } public void metodo2() { } public void metodo3() { } public void metodo4() { System.out.println("Java SE"); } public static void main(String args[]){ Clase obj = new Clase(); obj.metodo4(); } }

Se puede hacer que la interfaz2 herede de una interfaz1, por lo que al implementar la interfaz2 en una clase hay que implementar todos los mtodos de ambas interfaces. No es posible que una clase extienda de una interfaz ya que se obtendr un error de compilacin.

Ya que una interfaz se comporta como una clase abstracta, no se puede instanciar, tampoco se le puede agregar constructores.

Una caracterstica relevante a comentar sobre los mtodos declarados en las interfaces, es que estos pueden tener exclusivamente el modificador de visibilidad public y solamente se puede utilizar el modificador abstract para declarar firmas de mtodos. La utilizacin de algn otro modificador generara error de compilacin. Al tener exclusivamente la visibilidad public, no importa que se declare el modificador o no, siempre va a considerar public. El siguiente ejemplo muestra este comentario:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 177

public interface Interfaz { void metodo(); } public class Clase implements Interfaz{ public void metodo() { } }

En la interfaz el mtodo es pblico, y en la clase debe ser declarada como pblico, segn las reglas de la sobreescritura, al sobrescribir un mtodo este no debe ser ms restrictivo de quien lo est heredando.

Es posible tener dos interfaces, y que cada uno posea un mtodo con una firma idntica, y sin una clase implemente ambas interfaces, solamente se debera de implementar un mtodo, ya que poseen la misma firma. Por lo tanto para este caso, no existe manera de indicar especficamente la implementacin de un mtodo de una particular interfaz.
public interface Interfaz1{ void metodo(); } public interface Interfaz2{ void metodo(); } public class Clase implements Interfaz1,Interfaz2{ public void metodo1(){ } }

3.20. Excepciones

Las excepciones se pueden considerar como situaciones en las cuales sucede algo imprevisto, y a travs de Java existe el mecanismo que permite controlarlas. Tericamente existen dos tipos de excepciones: aquellas que son posibles de manipular, es decir, las que el programador puede predecir que sucedan, las cuales son llamadas excepciones chequeadas (checked), y son las que al compilar hacen que Java informe que se necesita capturar dicha excepcin. Y existen aquellas excepciones que ocurren en tiempo de ejecucin, y son las ms difciles de detectar,

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 178

por lo tanto Java no obliga a capturar esas posibles excepciones, estas se llaman no chequeadas (uncheked).

Para cada una de las posibles excepciones, existen una clase destinada a simbolizar dicha excepcin. En general, todas las excepciones derivan de la clase Thorowable, esta se divide en dos. Las de tipo Error y las de tipo Exception. Las de tipo Error se pueden considerar excepciones no chequeadas (Java no obliga a capturarlas) y las de tipo Exception son excepciones chequeadas (Java obliga a capturarlas). Dentro de la jerarqua de Excepcin, existe una subclase con el nombre de RutimeException, esta ltima es una jerarqua de clases tambin consideradas excepciones no chequeadas. Por lo tanto, las excepciones tipo Error o RuntimeException son las nicas jerarquas de clases que Java no obliga a capturar.

Throwable

Error

Exception

RuntimeException

Cuando se ejecuta un metodo, y dentro de este metodo ocurre el error, se va a tener la posibilidad de que el mismo se encargue de resolver el problema o se asigne la resolucin del inconveniente al metodo que invoco al que produjo el error, de tal manera, si el metodo que produjo la invocacin tampoco tiene la solucin. Java lo asigna al otro posible metodo que haya invocado el problema y as sucesivamente hasta llegar al metodo inicial que produce todas las invocaciones, el cual es el main principal. En caso de que no se haya conseguido la solucin, entonces el thread de la

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 179

aplicacin muere, por lo que la aplicacin deja de funcionar abruptamente. Por ejemplo:

public class Clase{ public void metodo1(){ try{ metodo2(); } catch (ArrayIndexOutOfBoundsException e){ System.out.println("Error capturado..."); } } En el metodo2 produce una excepcin, el error se produce cuando se intenta public se void metodo2(){ int[] vector = {1,2}; acceder en la lnea 12 a una posicin que no existe en un arreglo. La excepcin System.out.println(vector[2]) ; } generada tiene el nombre ArrayIndexOfBoundsException, este es una excepcin public static void main(String a[]){ dentro de la jerarqua lo tanto java no obliga a capturar. Como ClaseRuntimeException,por obj = new Clase(); obj.metodo1(); } }

En el metodo2 se produce la excepcion, el error se produce cuando se intenta acceder a una posicin que no existe del arreglo. La excepcion generada tiene el nombre de ArrayIndexOutOfBoundsException, que es una excepcion dentro de la jerarquia RuntimeException, por lo tanto Java obliga a capturar. En el metodo2 no se esta controlando la excepcin, esta se transfiere al metodo que llamo a metodo2, que en este caso es metodo1, metodo1 si controla la excepcin, por lo tanto se observara un mensaje por pantalla que indique Error capturado. Si metodo1 no tuviera el manejo de la excepcin, esta se pasa al metodo que llamo a metodo1, que en este caso es el main y como este tampoco controla la excepcin se produce un error abrupto de la aplicacin.

Para capturar entonces una excepcin se utiliza try/catch. Dentro del bloque de cdigo del try se colocan las sentencias que sean consideradas criticas y luego en el catch se van a capturar aquellas excepciones que posiblementemente sucedan, mientras mas excepciones se capturen, mas posibilidad se tendr de solventar el problema por el cual pudiese pasar la aplicacin en un determinado momento.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 180

public class Clase{ public void metodo(){ try{} catch(Error e){} } }

Al menos se debe colocar un catch, por cada try y siempre es necesario cuando se utiliza un catch especificar la excepcin a capturar.

Un cdigo como el siguiente no es permitido:


public class Clase{ public void metodo(){ try{} System.out.println("Excepciones..."); catch(Throwable e){} } }

Produce un error ya que el try y catch deben estar juntos. Se puede por ejemplo colocar try anidadas, siempre y cuando cumplan con las reglas anteriormente descritas.

Existe una caracterstica del catch que hay que mencionar, y es que se pueden capturar todas las posibilidades excepciones a controlar, sin embargo, esta captura debe seguir un orden jerrquico que va de la excepcin ms especfica a la ms general. Por ejemplo, si se esta capturando una excepcin Exception antes de capturar una excepcin mas especifica como IOException, se obtenedra un error de compilacin, debido a esta regla de captura de excepciones. Siempre es necesario tomar en cuenta la captura de las excepciones de la ms especfica a la ms general:
import java.io.IOException; public class Clase{ public static void main(String arg []){ try{} catch (IOException e){} catch (Exception e ){} } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 181

Con respecto al proceso de captura de errores, es importante mencionar que cuando se utilize un catch para capturar alguna excepcin de tipo chequeada, si especficamente ese error no se produce dentro del bloque de cdigo try, Java arrojara un error de compilacin indicando que ese error nunca se producir.

En la sintaxis de captura de una excepcin, es posible utilizar adicionalmente la sentencia finally, esta sentencia indica que pase lo que pase durante la ejecucin del try o catch, esa seccin de cdigo siempre se va a ejecutar. Es importante no incluir en esta seccin de cdigo algn elemento crtico que pueda ocasionar un error, porque este segmento no se contempla un posible error y puede hacer que el programa termine abruptamente. El nico caso posible en el que el finally no se ejecute es cuando se tenga una salida abrupta, por ejemplo, System.exit ().

De tal forma, se puede mezclar un try/finally o try/catch/finally. Cuando se utilizan las sentencias try/finally sin catch, compila sin ningn problema, pero en tiempo de ejecucin, si se produce alguna excepcin la aplicacin termina abruptamente; algo importante a mencionar con respecto a esta ejecucin es que primero se ejecuta el try, luego el finally y posteriormente se muestra la excepcin en tiempo de ejecucin.

Utilizando, el otro posible caso try/catch/finally, al producirse la excepcin dentro del try, se ejecuta el catch y por ultimo el bloque de cdigo finally. Si se desea capturar alguna otra excepcin dentro del catch o el finally se aplica el mismo concepto de la captura de excepciones.

Observe el siguiente ejemplo:


public class Clase{ public static String metodo(int valor) { int cociente = 0; try{ cociente = 3 / valor; return "return try"; } catch (Exception e) { System.out.println(e); return "return catch"; } finally { System.out.println("ejecuto finally"); } } public static void main(String[] args) { System.out.println(metodo(0)); System.out.println(metodo(2)); } } Ing. Elkin Surez G. edsuarez@uis.edu.co Pgina 182

Primero se ejecuta el finally y luego se ejecuta el return, bien el del try o bien el del catch. Si el finally tiene tambin un return, pues que se ejecuta el return del finally y el return del try o del catch se ignoran. Si el finally lleva un return, este es el que manda. Esto permite usar el finally para, por ejemplo, el cierre de conexiones con base de datos. En el try ejecutamos la operacin con la base de datos y podemos hacer el return normalmente. En el catch tratamos la excepciones y devolvemos el valor que queramos que devuelva nuestro mtodo en caso de error. En el finally hacemos el close() del ResultSet, el Statement o el Connection, segn sea nuestro programa, y tendremos la garanta de que se ejecuta, pase lo que pase. Segn las especificaciones de Java, es una mala practica que en el bloque de cdigo finally se retorne lo que devuelva un metodo, sin embargo Java compilara y correr sin ningn inconveniente pero en tiempo de compilacin arrojara un warning. Por lo tanto es recomendado colocar los return de un metodo bien sea fuera del mecanismo de captura de errores o dentro del bloque try y catch. Observe el siguiente ejemplo:
public class Clase{ public String metodo(){ try{ return "try"; } catch (Exception e){ return "execepcion"; } finally{} System.out.println("no se ejecutar");/* Error de compilacin.*/ } }

Por ultimo, al

hacer referencia a las excepciones, es posible utiliza la sentencia

throws, esta se utiliza al final de la declaracin del mtodo e indica que todas las excepciones que se coloquen en el throws, van a tener que ser implementadas en el mtodo que invoque al mtodo que tenga throws. Es decir, cuando se hace un throws en un mtodo, no es necesario realizar el try/catch en la implementacin porque se

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 183

obliga a que los mtodos que llamen a ese mtodo con throws, van a tener que implementar el proceso de captura try/catch.

En el throws no existe alguna regla que impida colocar las excepciones en cualquier orden jerrquico. Es decir, por ejemplo se puede tener un mtodo que haga un throws de Exception e IOException, y no importa el orden en que se coloquen estas excepciones en el throws:
import java.io.IOException; public class Clase{ public void metodo() throws Exception, IOException{ } public static void main(String[] args){ Clase obj = new Clase(); try { obj.metodo(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }

Con respecto al throws existe una regla muy importante a mencionar, la cual aplica cuando se utiliza la sobrescritura de mtodos. La regla indica que si se va a

sobrescribir un mtodo que hace algn throws, el mtodo sobrescrito no puede arrojar throws ms generales que los que arroja el padre.

Es decir, si en un mtodo padre se arroja IOException, en el mtodo sobrescrito no se puede arrojar un Exception, por lo tanto las excepciones que se arrojan en un mtodo sobrescrito nunca deben estar por encima de la jerarqua de excepciones que arroja el mtodo a sobrescribir.
import java.io.IOException; public class ClasePadre{ public void metodo()throws IOException{ } } class Hijo extends ClasePadre{ public void metodo()throws Exception{ //Error de compilacion. } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 184

Sin embargo, si se tiene un mtodo padre que arroja un IOException, en el mtodo sobrescrito se podra arrojar IOException o cualquiera de sus subclases. Tambin se tendra la posibilidad de no arrojar ninguna excepcin, observe el siguiente ejemplo donde se demuestra la ltima afirmacin.

public class ClasePadre{ public void metodo()throws Exception{ } } class Hijo extends ClasePadre{ public void metodo(){ } }

Algo importante a mencionar, es que en un mtodo, sino se coloca la sentencia throws, por defecto se realizar un throws de RutimeException, por lo que se debe tener en cuenta esta accin al momento de la regla de la sobrescritura. Es decir, en el mtodo de la clase se pudiese obviar el throws y en el mtodo sobrescrito de la clase hija arrojar la clase RutimeException o algunas de sus subclase y Java compilar sin ningn inconveniente.
public class ClasePadre{ public void metodo(){ } } class Hijo extends ClasePadre{ public void metodo() throws ArrayIndexOutOfBoundsException{ } }

Pero nunca en el mtodo sobrescrito pudiese haber arrojado una excepcin de tipo chequeada.
public class ClasePadre{ public void metodo(){ } } class Hijo extends ClasePadre{ public void metodo() throws Exception{ //Error de compilacin. } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 185

Estas reglas de sobrescritura y excepciones no aplican para la sobrecarga de mtodos, por lo que no existe ninguna restriccin que limita la sobrecarga de mtodos y excepciones. Un detalle con respecto a la sobrescritura y la sobrecarga, es que cuando se hereda un mtodo de una clase y se sobrescribe pero tambin se sobrecarga, este mtodo se puede considerar sobrecargado, por lo que el comando throws no aplica.

3.20.1. Programado excepciones de usuario

Para programar excepciones, es necesario derivar de la clase Exception. A continuacin un ejemplo de cmo se elabora una excepcin personalizada:

public class APIException extends Exception{ public APIException(String mensaje){ super(mensaje); } public void mensaje(){ System.out.println("Error..."); } } public class APIAuditoria { public void metodo() throws APIException{ throw new APIException("Error personalizado"); } } public class Clase{ private APIAuditoria auditoria = null; public void modificar(){ if(auditoria == null){ auditoria = new APIAuditoria(); } try { auditoria.metodo(); } catch (APIException e) { e.printStackTrace(); e.mensaje(); } } public static void main(String[] args){ Clase obj = new Clase(); obj.modificar(); } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 186

3.21. Aserciones

Especficamente, estn hechas para dejarle probar asunciones (verdades) durante la etapa de desarrollo de su aplicacin, sin la necesidad de gastar tiempo ni sobrecarga de cdigo en el proceso de escribir un control de posibles errores que han asumido nunca sucedern en un programa una vez puesto en marcha el mismo.

La idea es que si tiene conocimiento de que un resultado dentro de su aplicacin debe de comportarse de alguna forma, las aserciones se utilizarn para considerar un caso excepcional en el que ese resultado se pueda comportar de forma distinta. Esto

tambin se puede controlar a travs de una excepcin, pero se considera una buena prctica utilizar las aserciones, porque estas solamente se utilizaran en un momento particular y no durante la ejecucin normal de la aplicacin.

La sintaxis es la siguiente:
assert expresion_booleana;

La expresin boolean siempre debe arrojar un resultado verdadero para que la posicin sea aceptada, si la expresin boolenana produce un resultado falso Java termina abruptamente a travs de una excepcin que se conoce con el nombre de AssertionError.

Tambin es posible utilizar la siguiente sintaxis:


assert expresion_booleana : expresion_cualquier_tipo;

Esta forma tiene utilidad cuando la expresin booleana arroja un resultado falso, la segunda expresin sin importar el tipo de dato se convierte a String y es pasado como suplemento al constructor de la excepcin AssertionError para que imprima esa expresin cuando se arroja el mensaje de la excepcin por pantalla. Este

comportamiento es til cuando se posee una gran cantidad de aserciones a lo largo de la aplicacin y se desea identificar especficamente en que Asercin fue que se produjo el inconveniente.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 187

Observe el siguiente ejemplo:

public class SinAsercion{ private void metodo(int num){ if(num >= 0){ System.out.println ("Todo bien"); } else{ System.out.println("El nmero es negativo"); } } }

Usted pudiese estar seguro que la variable num nunca ser negativa, por lo tanto no le har falta escribir alguna porcin de cdigo que controle ese posible error; adicionalmente, en tiempo de ejecucin, si usted no desea ejecutar la sentencia if-else ya que considera que es casi improbable que suceda ese caso, a travs de las aserciones se le ofrece la posibilidad de tomar o no en cuenta aquellos casos improbables, sin la necesidad de la utilizacin de sentencias de verificacin como los if-else y generando una excepcin fcil de manejar. Observe el siguiente cdigo, que es la versin del ejemplo anterior utilizando aserciones.
public class ConAsercion{ private void metodo(int num){ assert(num>=0);// Se produce una excepcin. /* AssertionError si es resultado es falso. Si el resultado es es verdadero contina ejecutandose la aplicacin. */ } }

3.21.1. Utilizando Aserciones Apropiadamente

En general, las aserciones pueden ser utilizadas donde y cuando usted considere ms apropiado. Sin embargo, existen una serie de buenas prcticas aprobadas por Sun, que describen cuando realmente es apropiado utilizar la potencialidad de este mecanismo.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 188

No utilize las aserciones para validar argumentos de un mtodo pblico: Resulta inapropiado debido a como se trata de un mtodo pblico, este puede ser invocado por cualquier clase desde prcticamente un universo de posibles localizaciones. Por lo tanto no se le puede dar tanta responsabilidad a una asercin en un proceso de verificacin de argumentos. Lo recomendado en estos casos, es realizar la verificacin exhaustiva a travs de tcnicas conocidas como los if/else.

Utilize las aserciones para validar argumentos de un mtodo privado: Si usted escribe un mtodo privado, ciertamente tiene un control total sobre quin posiblemente pudiese utilizar ese mtodo. Por lo tanto si usted asume que la lgica de llamadas a ese mtodo es la correcta, puede considerar la utilizacin de una asercin para verificar esa verdad.

No utilize las aserciones para validar los argumentos de lnea de comando: Este es realmente un caso especial de no utilizar aserciones para validar argumentos de un mtodo pblico. Si un programa requiere argumentos de lnea de comando, es recomendable que utilize mecanismos de control de excepciones.

Utilize las aserciones incluso en mtodos pblicos, para verificar casos que usted considere que nunca se producirn: Esto incluye bloques de cdigo que nunca sern alcanzados, considere el siguiente ejemplo donde se utilize un switch.

public class Asercion { public void metodo(int num){ switch(num){ case 2: //Hacer algo. case 3: //Hacer algo diferente. default: assert false; } } }

Si usted asume que una porcin de cdigo nunca ser alcanzaba, como en el ejemplo anterior donde se coloca una asercin en el default del switch, se producir una

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 189

excepcin de tipo AssertioError cuando se produzca el caso excepcional de que variable no encaje en ninguno de los posibles casos del switch.

Ejemplos de buena utilizacin de las aserciones dentro de este segmento de buenas prcticas; son las invariaciones internas, control de flujo invariante y las postcondicones. El control de flujo invariante es una tcnica descrita en el ejemplo anterior, para explicar la otras dos tcnicas observe los siguientes ejemplos: o

Invariacin interna

if(x>0){ // ... } else{ assert (x==0) // ... }

Poscondicin: son asunciones echas acerca del valor o conjuntos de valores al complementarse la ejecucin de un mtodo. Un simple

ejemplo sera la prueba de la poscondicin despus de ejecutarse el mtodo de extraer de una pila, la pila deber contener un elemento menos despus de que el mtodo halla sido ejecutado
public void pop(){ int size = this.getContadorPila(); if (size == 0){ throw new RuntimeException("Pila vacia"); } // Hacer el trabajo para pop // Probar la post-condicion assert(this.getContadorpila() == size-1); }

No utilize la aserciones para generar un comportamiento determinado en la aplicacin.

El siguiente cdigo a pesar de que funciona, seria una muy mala practica aplicarlo:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 190

public class Asercion { int x = 0; public void hacerAlgo(){ assert(modificarComportamiento()); // Continua ejecutandose } public boolean modificarComportamiento(){ x++; return true; } }

La utilizacin de aserciones no garantiza que siempre se ejecuten. Por lo tanto la invocacin de un metodo dentro de la expresin booleana de la asercin puede producir que el metodo no se ejecute, y si este, esta generando cambios significativos en la aplicacin, producir grandes estragos en el desenvolvimiento normal de la misma. 3.22. Threads

Un thread a un proceso individual que realiza alguna accin y consume los recursos del sistema, compartiendo o compitiendo con el resto de procesos que se ejecutan en el sistema operativo. La forma en como se distribuyen los recursos para cada uno de los procesos le corresponde al sistema operativo, por lo tanto siempre debe de tener en cuenta que la manera en como se ejecutan varios threads en java, depende de gran parte de cmo se encuentra implementado el sistema operativo.

Se puede crear threads en java de dos formas distintas:

Entendiendo de la clase Thread. Implementando la interface Runnable.

Por reglas de diseo, es mejor utilizar la implementacin de Runnable, ya que como Java solamente soporta la herencia simple, al heredar exclusivamente de Thread ya no es posible poder heredar otras propiedades o caractersticas que se necesiten de alguna otra clase.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 191

En ambas tcnicas, el comportamiento relacionado a un thread esta contenido dentro de un metodo llamado run(). Es decir, es necesario implementar o sobrescribir el mtodo run() con el algoritmo o el comportamiento que se desea agregar en un

proceso en paralelo con el resto de aplicaciones.


public class HiloImplementado implements Runnable { public void run() { for(int i=0; i<500; i++){ System.out.println("Hilo for: "+i); } } }

public class HiloImplementado extends Thread { public void run() { for(int i=0; i<500; i++){ System.out.println("Hilo for: "+i); } } }

Una vez agregada la funcionalidad dentro del metodo run(), la invocacin de este no implica que se pondr ejecutar un proceso en paralelo, lo adecuado es invocar un metodo llamado start(), el cual se encargara de tomar el algoritmo que se encuentra dentro del metodo y ejecutarlo en un thread individual. Por lo tanto si no se invoca start(), no se ejecuta un posible thread. Observe algunos ejemplos:
public class HiloImplementado implements Runnable { public void run() { for(int i=0; i<500; i++){ System.out.println("Hilo for: "+i); } } } public class TestHilo{ public static void main(String args[]){ HiloImplementado obj = new HiloImplementado(); Thread obj2 = new Thread(obj); obj2.start(); } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 192

public class HiloImplementado extends Thread { public void run() { for(int i=0; i<500; i++){ System.out.println("Hilo for: "+i); } } public static void main(String args[]){ new HiloImplementado().start(); } }

En ambos casos, la invocacin del metodo start() implica que el JVM y el sistema operativo manejarn dos procesos, el proceso donde se encuentra ejecutando el main principal y el proceso del algoritmo localizado en la implementacin del metodo run(). Por lo tanto, si en el main existiese un algoritmo despus de la invocacin de start(), simulando un procesamiento en el paralelo ese algoritmo se ejecutara junto con el algoritmo localizado dentro del metodo run.

Observe el siguiente ejemplo:


public class HiloExtendido extends Thread { public void run() { while(true){ System.out.println("hilo"); } } public static void main(String args[]){ new HiloExtendido().start(); while(true){ System.out.println("main"); } } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 193

Un posible resultado que pudiese observar por pantalla seria el siguiente: main main main main hilo hilo hilo

hilo main Es decir, en el main principal existe un ciclo infinito que esta compartiendo recursos del sistema con el ciclo infinito encontrado en el mtodo run, ambos compitiendo por unos instantes de utilizacin de recursos del sistema. Lo importante a resaltar de esta ejecucin de los dos procesos se ve alterada de acorde a la implementacin del sistema operativo, es decir, siempre recuerde que el orden en que los threads son ejecutados, depende exclusivamente del sistema operativo por lo tanto no es posible determinar si un thread A pudiese ejecutarse antes que un thread B.

Observe el siguiente ejemplo, se trata del mismo ejemplo anterior, pero con la nica diferencia que en vez de invocar el mtodo start () se invoca el mtodo run():

public class HiloExtendido extends Thread { public void run() { while(true){ System.out.println("hilo"); } } public static void main(String args[]){ new HiloExtendido().run(); while(true){ System.out.println("main"); } } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 194

Un posible resultado que pudiese observar por pantalla seria el siguiente: hilo hilo hilo hilo hilo Debe recordar que el nico mtodo que se utiliza para poner a correr un proceso en paralelo es el mtodo start(), por lo tanto la invocacin del mtodo run() simplemente producir que se ejecute solamente un proceso, generando que la aplicacin se estanque en el ciclo infinito producido por el mtodo run y nunca se alcanzar a ejecutar el ciclo infinito que se encuentra en las siguientes lneas del mtodo main principal.

Un thread puede estar en cinco posibles estados:


Waiting

New

Runnable

Running

Dead

New: El thread ha sido inicializado, sin embargo todava no se ha invocado el metodo start(). En este punto, el thread no se considera vivo, por lo tanto si se invoca al mtodo isAlive(), en este estado se debe arrojar un resultado falso.

Runnable: El thread est disponible para ejecutarse, pero el sistema operativo no le ha dado la oportunidad de utilizar los recursos del sistema. Un thread entra siempre en este estado una vez invocando el mtodo start(), es decir, directamente no entra en ejecucin, sino debe esperar que el sistema operativo decida. Un thread adicionalmente entra en este estado despus de bien sea haber pasado un tiempo ejecutndose, o haber regresado de un estado de espera o bloqueo.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 195

Running: El thread se est ejecutando. Tiene a disposicin todos los recursos del sistema; si durante el tiempo que le otorg el sistema operativo no le da tiempo de ejecutarse completamente, el thread regresa al estado Runnable esperando por una nueva oportunidad que le ofrezca el sistema operativo.

Waiting: El thread se encuentra en un estado de espera, realmente dentro de este estado se puede considerar tres posibles combinaciones. o o o El thread se queda esperando por alguna respuesta de algn otro thread. El thread se bloquea debido a que no hay recursos disponibles. El thread se duerme por un tiempo determinado.

Dead: El thread se ha ejecutado por completo, en este estado el thread no puede volver a ser reiniciado, es decir, no puede invocarse nuevamente el mtodo start(), producir un error de ejecucin no de compilacin. Sin embargo, en este estado, pueden invocarse el resto de mtodos disponibles en la clase thread.

3.22.1. Metodos en la clase Thread

A continuacin se comenta sobre los mtodos ms importantes contenidos dentro de la clase thread.

isAlive(): Utilizado para identificar si un thread especifico esta disponible para ejecutarse (public static final bolean isAlive()). sleep(): El mtodo sleep es un mtodo esttico a travs del cual se fuerza el thread actual a aumentar su tiempo de ejecucin, es decir, que sea ms lento. Razones pueden existir muchas, unas de las tantas es que no se desea que un thread consuma recursos durante todo el tiempo, es decir, por ejemplo una aplicacin de cliente de correo, esta puede poseer un thread que este continuamente revisando por nuevos correos en el servidor, pero en vez de estar haciendo a cada instante, se le puede asignar un contador de tiempo para que cada cinco (5) minutos por ejemplo efectu su tarea.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 196

try { Thread.sleep(5*60*1000); } catch (InterruptedException e) { e.printStackTrace(); }

Es importante mencionar que cada vez que se utilice el mtodo esttico sleep(), es necesario capturar una excepcin conocida con el nombre de InterruptedException, por lo tanto usted debe de capturar esta excepcin o arrojarla el la firma del mtodo.

Par invocar el mtodo sleep, es necesario pasar como parmetro la cantidad de milisegundos que el thread debe esperar (public static void sleep(long millis)), una vez transcurrido ese tiempo de espera, automticamente el thread no continua ejecutndose sino que debe esperar en el estado operativo le ofrezca la posibilidad de ejecutarse. Runnable a que el sistema

El mtodo sleep tambin puede se invocado asignndole como parmetros la cantidad de milisegundos y nanosegundos. (public static void sleep(long millis, int nanos)).

Yield(): Para comprender correctamente la utilidad de este mtodo es necesario introducir el concepto de las prioridades de los threads. En la teora Java controla la ejecucin de los threads siguiendo la propiedad asociada a cada uno de estos, por lo tanto se dice que si un thread A tiene una prioridad mayor que la de un thread B, el thread A debe ejecutarse primero. Sin embargo, en la prctica todo queda delegado a la decisin del sistema operativo, por lo que se desconoce que thread debera ejecutarse primero.

De todas formas, siguiendo este concepto terico todos los threads tienen asociada una prioridad, la cual se extende de uno a diez, siendo uno la menor y diez la mayor prioridad. La clase thread ofrece dos mtodos a travs de los cuales se pueden obtener y modificar el valor de su prioridad, respectivamente estos mtodos son getPriority() y setPriority(int priority). Todos los threads cuando se crean tienen una prioridad normal, es decir, una prioridad cinco. Dentro de la clase thread existen tres constantes con las que se denotan, la prioridad minina, normal y mxima.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 197

Thread.MIN_PRIORITY; //1 Thread.NORM_PRIORITY; //5 Thread.MAX_PRIORITY; //10

Acorde con todo esto, la funcin del mtodo yield() es poner en espera a un thread, es decir, dormirlo por un determinado tiempo, y Java dar la posibilidad de ejecutarse a aquellos threads que tenga la misma prioridad que el thread que se fue a dormir.

Importante a mencionar del mtodo yield(), es que este no recibe ningn parmetro de inicializacin, por lo tanto lo que hace es detener su ejecucin y buscar algn thread en el estado Runnable con la misma prioridad que el que se detuvo, con una posible probabilidad de que Java pudiese escoger el mismo thread que se detuvo.

Join(): El mtodo no esttico join() permite a un thread terminar de ejecutarse antes de cualquier otro pudiese ejecutarse. La utilidad principal de este

mtodo es permitir que si usted posee un thread B que no puede hacer su trabajo hasta que un thread A complete su tarea, entonces usted pueda obligar a que el thread B espere por el thread A. Observe el siguiente ejemplo:

public class HiloExtendido extends Thread { public void run(){ while(true){ System.out.println("Hilo ejecutandose"); } } public static void main(String args []){ HiloExtendido obj = new HiloExtendido(); obj.start(); try{ obj.join(); } catch (InterruptedException e){ } while(true){ System.out.println("Continua ejecutandose"); } } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 198

Para este ejemplo, el thread B (el main principal) espera a que el thread A (la instancia de HiloExtendido) termine de ejecutarse, para que el thread B pueda continuar ejecutndose. Es decir, el main principal detendr su ejecucin hasta que la instancia de HiloExtendido termine, sin embargo, segn la implementacin del mtodo run del HiloExtendido, el main principal deber quedarse esperando infinitivamente ya que la instancia de HiloExtendido nunca termina. Lo que se desea demostrar con este

ejemplo, es entonces el estado en el que queda un thread B, es decir, esperando hasta que un thread A por el cual se quedo esperando termine.

Join, al igual es un mtodo al cual se le debe capturar la excepcin InterrumpedException, por lo tanto cada vez que se utilize es necesario, capturar o arrojar la excepcin.

Este mtodo se puede ejecutar de tres maneras, la primera es sin parmetros, a travs de esta invocacin el thread B debe esperar hasta que el thread A muera, la segunda opcin el thread B debe esperar por n milisegundos a que el thread A muera, si no ha muerto el thread B cambia su estado a Runnable para poder en algn momento ejecutarse y la tercera opcin es idntica a la segunda pero incluyendo nanosegundos.

currentThead(): Este mtodo retorna una referencia del thread actual que se est ejecutando. Estas referencias es til para conocer en un momento

especfico por ejemplo cual es el thread que utiliza los recursos del sistema. Observe el siguiente ejemplo:
public class Clase { public static void main(String[] args) { System.out.println("Nombre del Thread :"+Thread.currentThread().getName()); } }

Por pantalla se observar el siguiente mensaje Nombre del thread: main. El thread donde se ejecuta el main principal, por defecto recibe el nombre de main. Todos los threads que usted construya tendrn un nombre asociado por defecto, adems de cambiarle los nombres asociados a estos. Observe el siguiente ejemplo:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 199

public class HiloExtendido extends Thread { public void run() { System.out.println("Nombre del thread: "+currentThread().getName()); } Al compilar y ejecutar este cdigo observar el siguiente public static void main(String[] args) {mensaje Nombre del thread: HiloExtendido obj =a new HiloExtendido(); hilo. Si usted no le asocia un nombre un threas, por defecto se le asigna el nombre obj.setName("hilo"); Thread-#, siendo # el nmero de thread especifico. Por ejemplo, si usted no le obj.start(); } }

3.22.2. Cdigo Sincronizado

Qu sucedera si dos threads tienen acceso a una misma instancia de un objeto determinado, y ambos threads invocan mtodos en ese objeto y a su vez ambos threads modifican el estado del objeto?. Sencillamente ocurrira que se corrompera el comportamiento normal del objeto.

Supnga el ejemplo donde un objeto de una cuenta corriente de un banco est siendo accedido al mismo tiempo por dos threads, el thread Luis y el thread Maria. Ambos threads desean invocar el mtodo retirar dinero del objeto cuenta, ambos threads han visto que en la cuenta hay $100 y ambos threads al mismo tiempo tratarn de retirar los $100, alguno de los dos va a quedar completamente disgustado al darse de cuenta que a pesar de haber visto los $100 en la cuenta al invocar el mtodo retirar este le indique que hay suficiente dinero disponible.

A travs del concepto de la sincronizacin, si un thread A accede a un objeto sincronizado solamente ese thread A tendr acceso a dicho objeto, si algn otro thread B desea acceder, tendr que esperar en una cola hasta que thread A disponga de los derechos de utilizacin.

Para ejemplo anterior, el thread Luis pudo acceder primero al objeto cuenta que ahora est sincronizando y el thread Maria debe esperar en una cola a que el thread Luis deje de utilizar ese objeto para que luego Maria pueda tener acceso al mismo.

En trminos de tecnologa Java, se puede comentar que todo objeto posee lo que se conoce como una bandera de sincronizacin la cual es activada nica y

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 200

exclusivamente cuando se utiliza el concepto de sincronizacin dentro de un cdigo Java. La palabra clave a utilizar es synchronized y puede considerarlo como un

modificador que solamente puede ser utilizado con los mtodos o bloques de cdigo.

Tenga en cuenta el siguiente ejemplo en el que un objeto puede tener dos mtodos, uno sincronizado y el otro no, todos los threads podrn siempre tener acceso al mtodo no sincronizado, es decir, no se verifica la bandera de sincronizacin. Pero si ahora varios threads acceder el mtodo sincronizado, Java verificar que la bandera de sincronizacin es disponible, sino est los threads tendrn que esperar en una cola de bloqueo para ese objeto en particular. Cuando este disponible la bandera, los que estn en esa cola se pelearn por quin tomara los derechos de utilizacin de la bandera y quin lo tome se ira al estado Runnable donde esperar que el sistema operativo le posibilite ejecutarse.

Considere a travs de este concepto, los estados por los cuales puede pasar un thread durante su tiempo de vida.

IMAGEN LIBRO PAG. 209000

A continuacin un ejemplo en donde se demuestre el concepto de la sincronizacin, se cuenta con dos threads que acceden a un mismo mtodo, pero al estar sincronizado

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 201

ese mtodo, ambos threads no podrn actuar al mismo tiempo, y el que no logre entrar de primero se queda esperando hasta que termine el otro.

public class ClaseSincronizada{ public synchronized void metodo(String hilo){ for(int i=0; i<5000; i++){ System.out.println("Hilo #: "+hilo); } } } class HiloA implements Runnable{ private ClaseSincronizada sincronizada = null; public HiloA(ClaseSincronizada sincronizada) { this.sincronizada = sincronizada; } public void run(){ this.sincronizada.metodo("A"); System.out.println("Termino el hilo A"); } } class HiloB implements Runnable{ private ClaseSincronizada sincronizada = null; public HiloB(ClaseSincronizada sincronizada) { this.sincronizada = sincronizada; } public void run(){ this.sincronizada.metodo("B"); System.out.println("Termino el hilo B"); } } public class ClaseTest { public static void main(String[] args){ ClaseSincronizada obj = new ClaseSincronizada(); HiloA obj2 = new HiloA(obj); HiloB obj3 = new HiloB(obj); Thread obj4 = new Thread(obj2); Thread obj5 = new Thread(obj3); obj4.start(); obj5.start(); } }

Para este caso al tener el mtodo sincronizado dentro de la clase ClaseSincronizada, la bandera de sincronizacin se activa cuando algn thread necesita del servicio localizado dentro de ese mtodo. Especficamente aqu suceder que primero se

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 202

ejecutara completamente el thread con el nombre obj4 y luego se ejecutar por completo el thread obj5.

En general, usted debe recordar las siguientes caractersticas al momento de pensar en el concepto de la sincronizacin:

Solamente los mtodos pueden ser sincronizados, para las variables no est permitido. Cada objeto posee una nica bandera del bloqueo. Se recomienda que no todos los mtodos dentro de un objeto sean sincronizados. De esta forma, mltiples threads podr acceder a los mtodos no sincronizados del objeto.

Si dos mtodos estn sincronizados en una clase, solamente un thread puede acceder a uno de los dos metodos. En otras palabras, una vez que el thread adquirir la bandera del bloqueo del objeto, ningn otro thread puede acceder a los mtodos sincronizados de ese objeto.

Si un thread se duerme, este se lleva la bandera de bloqueo consigo. Un thread puede adquirir ms de una bandera de bloqueo al mismo tiempo, es decir puede acceder a mtodos sincronizados de objetos distintos y adquirir todas sus banderas de bloqueo.

Puede aplicar el concepto de sincronizacin a un bloque de cdigo en vez de todo el mtodo. ya que puede existir que no sea necesaria la sincronizacin de todo el algoritmo de un mtodo determinado.

public class ClaseSincronizada{ public void metodo(String hilo){ synchronized(this){ for(int i=0; i<5000; i++){ System.out.println("Hilo #: "+hilo); } // Acceso a porcin sincronizada... } } }

Metodos estticos pueden ser sincronizados.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 203

Lo ultimo que usted debe conocer sobre los threads, es como estos pueden comunicarse mientras estn bloqueados. Es decir, suponga una aplicacin de correo que posee un threadA encargado de avisar que hay nuevos mensajes en el buzn y un threadB encargado de colocar los correos en el buzn. El threadA pudiese estar verificando cada dos segundos por nuevos correos en el buzn, sin embargo se considera esto una prdida de recursos del sistema. Por lo que lo ms conveniente sera que este ThreadA se fuese a dormir esperando a que alguien le notificase, en este caso el ThreadB, de que hay nuevos correos en el buzn. Los mtodos wait(), notify() y notifyAll() se utiliza especficamente para esta labor, hacer que un thread pueda esperar (wait ()) por alguna notificacin (notify( ) y notifyAll()).

Algo muy importante a mencionar es que estos mtodos solamente pueden ser invocados dentro de un contexto sincronizado, es por esto la relacin con los threads, sin embargo estos mtodos a pesar de estar relacionados a la teora de Threads pertenecen a la clase java.lang.Object. Observe el siguiente ejemplo:
class ThreadA{ public static void main(String[] args){ ThreadB b = new ThreadB(); b.start(); synchronized(b){ try { System.out.println("Esperando por b..."); b.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Total "+b.getTotal()); } } class ThreadB extends Thread{ private int total = 0; public void run() { synchronized(this) { for(int i=0; i<100; i++){ total += i; } notify(); } } public int getTotal() { return total; } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 204

En este ejemplo, el ThreadA contiene el thread del main y el ThreadB es un thread que realiza un clculo. Una vez que en la lnea b.start() se invoque este mtodo del TheradB, el ThreadA continuar ejecutndose hace la lnea 15, para prevenir esto. En la linea 10, se utiliza el mtodo wait() sin embargo para poder invocar el mtodo wait() del threadB es necesario pedir por la bandera de sincronizacin, es por esto que en la lnea 7 el ThreadA se sincroniza con el ThreadB es decir, el ThreadA pide por la bandera del ThreadB.

Es importante tambin mencionar que de acorde al ejemplo anterior el threadA adquiere la bandera del bloqueo del threadB, sin embargo cuando el threadA se va a esperar por alguna notificacin, el ThreadA suelta la bandera de bloqueo del threadB, este suceso no acontece cuando se invoca al mtodo sleep de un thread, el cual al dormirse se lleva consigo las posibles banderas de bloqueo que halla adquirido.

Algo a resaltar sobre la invocacin de los mtodos wait() y notify(), es que al invocar el mtodo wait() inmediatamente se suelta la bandera de bloqueo sobre el objeto sincronizado, sin embargo al invocar el mtodo notify() no ocurre lo mismo, sino que el thread debe salir del contexto sincronizado para poder soltar la bandera de bloqueo, por lo que no importa si el mtodo notify() es invocado al inicio o al final del contexto de sincronizacin.

Al mtodo wait() puede asignarsele como parmetros al igual que el mtodo sleep() la cantidad de milisegundos y nanosegundos que debe esperar a travs de los mtodos sobrecargados wait(long timeout) y wait(long timeout, int nanos)

Considere a travs de este ltimo concepto, los estados por los cuales pueda pasar un thread durante su tiempo de vida.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 205

FIGURA PAGINA 215000

Por ultimo y no menos importante, en la mayora de los escenarios existe ms de un thread compitiendo por un objeto sincronizado, por lo tanto, mas de un thread se queda esperando a que se le notifique, es por esto que es preferible notificar a todos los threads que en vez de a uno solo, esta accin se logra a travs del mtodo notifyAll().

3.23. Enumerados

Java permite que una variable tenga solo un valor dentro de un conjunto de valores predefinidos, en otras palabras, valores dentro de una lista enumerada. Los tipos enumerados sirven para restringir la seleccin de valores a algunos previamente definidos. Un tipo de enumerado es un tipo de dato que contiene un conjunto de valores constantes. Los tipos de enumerados se deben usar para:

Tipos de enumerados naturales: das de la semana, fases de la luna, estaciones. Conjuntos donde sepamos todos los valores posibles: opciones de un men, etc. Reemplazo de los flags (EnumSet).

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 206

En el lenguaje de programacin Java, permite definir un tipo enum mediante el uso de la palabra clave enum.

public enum Instrumento { GUITARRA, TROMPETA, BATERIA, BAJO }; public class ClaseEnumerado { enum TamanoCafe{GRANDE, MEDIANO, CHICO} public ClaseEnumerado(){} public static void main(String... args){ System.out.println(Instrumento.BAJO); System.out.println(TamanoCafe.MEDIANO); DiasSemana diasSemana = new DiasSemana(); System.out.println(new DiasSemana().dias.MIERCOLES); } } class DiasSemana{ enum Dias{LUNES, MARTES, MIERCOLES, VIERNES, SABADO, DOMINGO} Dias dias; }

No es necesario que las constantes dentro de los enums estn en maysculas pero en las convenciones de cdigo de Sun se pide hacerlo de esta manera. Se debe tomar en cuenta que un tipo enumerado puede ser declarado dentro o fuera de una clase, pero no dentro de un mtodo. El punto y coma (;) al final de la declaracin del tipo numerado es opcional.

Al ejecutar el cdigo anterior, obtenemos:


BAJO MEDIANO MIERCOLES

Debido a que los tipos enumerados son como una clase de tipo especial en Java, hay muchas cosas que se pueden realizar dentro de un enum, adems de declarar constantes, un tipo enumerado puede contener constructores, mtodos y variables.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 207

public enum DiasSemana { LUNES(0){ public String getNombre(){ }, MARTES(1){ public String getNombre(){ }, MIERCOLES(2){ public String getNombre(){ }, JUEVES(3){ public String getNombre(){ }, VIERNES(4){ public String getNombre(){ }, SABADO(5){ public String getNombre(){ }, DOMINGO(6){ public String getNombre(){ }; private final int codigo; return "Lunes"; } return "Martes"; } return "Mircoles"; } return "Jueves"; } return "Viernes"; } return "Sbado"; } return "Domingo"; }

public abstract String getNombre(); private DiasSemana(int codigo){ this.codigo = codigo; } public int getId(){ return codigo; } public static DiasSemana valorDeId(int codigo){ for (DiasSemana dia : DiasSemana.values()){ if (dia.codigo == codigo){ return dia; } } throw new IllegalArgumentException("Da de semana invalido: " + codigo); } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 208

public class Semana { private DiasSemana dia = null; public static void main(String[] args){ Semana obj = new Semana(); Semana obj2 = new Semana(); obj.dia = DiasSemana.MARTES; obj2.dia = DiasSemana.DOMINGO; System.out.println("Da "+obj.dia.getNombre()+" Cdigo "+obj.dia.getId()); System.out.println("Da "+obj2.dia.getNombre()+" Cdigo "+obj2.dia.getId()); System.out.println("Da "+DiasSemana.valorDeId(5).getNombre()); System.out.println("Cdigo del da mircoles "+DiasSemana.MIERCOLES.getId()); } }

Al ejecutar el cdigo anterior, obtenemos:


Da Martes Cdigo 1 Da Domingo Cdigo 6 Da Sbado Cdigo del da mircoles 2

Algunos puntos importantes sobre los constructores de los tipos enumerados: No se puede invocar al constructor directamente, este se invoca una vez que se crea el tipo enumerado y es definido por los argumentos utilizados para crearlo. Se puede definir ms de un argumento en un constructor de un tipo enumerado, asi mismo, se puede definir ms de un constructor para un tipo enumerado siempre y cuando este tenga argumentos diferentes (sobrecargar el constructor). 3.24. Varargs

Varargs (Variable Arguments) nos permite especificar que un mtodo puede tomar mltiples argumentos de un mismo tipo, es decir, permite que pasar un nmero indeterminado de argumentos a un mtodo, por ejemplo:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 209

public class Varargs { public static void main(String[] args){ Varargs obj = new Varargs(); obj.metodo("Java", "6", "JSE", new Integer(5)); } public void metodo(Object... args){ for(Object object: args){ System.out.println(object); } } }

Al ejecutar el cdigo anterior, obtenemos


Java 6 JSE 5

Varargs se aplica teniendo en cuenta las siguientes reglas sintcticas y semnticas:

El tipo de datos debe estar seguido de tres puntos (...) type... El argumento variable debe ser el ltimo en la lista de argumentos del mtodo. Es interpretado como type[].

De esta forma vemos que varargs lo que hace es ocultar el proceso de transformar el argumento variable en un type[], creandolo con los parmetros pasados al mtodo para luego invocar al mtodo propiamente dicho pasndole el type[].

Una de las principales ventajas de varargs es que nos permite reducir el nmero de mtodos escritos para resolver una funcionalidad, en lugar de tener 4 o 5 mtodos con diferentes listas de argumentos, podemos hacer uno solo con argumentos variables. Sin embargo el problema que surge con esto es que podemos llegar a tener un cdigo que se preocupe mas por como trabajar con los argumentos variables que por la lgica de negocios que este debe resolver, por eso hay que tener cuidado. Cundo usar Varargs? Si est diseando su propio API, se recomienda usarlo con moderacin. Slo cuando el beneficio es convincente. No sobrecargue un mtodo varargs.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 210

En clientes, cuando el API los soporta: reflection, message formatting, printf.

3.25. Garbage Collector

Cuando un programa no hace ms referencia a un objeto, este no se puede recuperar, por lo que se convierte en inalcanzable, es decir no se utiliza ms y puede ser recogido por el garbage collector.

No se puede forzar la ejecucin del recolector de basura, solamente se le puede sugerir que se ejecute con el metodo de la clase System.gc(), por ende es desconocido cuando un objeto sera recolectado. A traves del metodos finalize(), que es de la clase Object, se limpian todas las referencias a memoria de todos los objetos que ya no estan siendo utilizados por el JVM. Por medio del metodo runFinalization(), se aumenta la probabilidad de que los objetos que estan esperando por el garbage Collector sean recojidos.

Las variables locales en los mtodos pierden alcance cuando el metodo que las ocupa termina. A partir de ese momento esos mtodos son elegibles para el recolector de basura. Cada vez que el mtodo vuelve a estar en el alcance del programa, las variables locales se vuelven a crear.

2.26. Ejercicios I. Programa que permite almacenar las coordenadas en tres dimensiones x, y, z de un punto en el espacio. El archivo PuntoTest (metodo main()) ofrece las opciones de sumar y restar varios puntos lo cual es otro punto, con coordenadas xr, yr, zr donde xr=xi+xi...yr=yi+yi....,zr=zi+zi+zi......El archivo Punto lee e imprime cada punto y el resultado de la suma y la resta entre los puntos.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 211

import import import public

java.io.BufferedReader; java.io.IOException; java.io.InputStreamReader; class Punto { private float x = 0.0f; private float y = 0.0f; private float z = 0.0f; public Punto() { } public void leer() throws IOException { BufferedReader lector = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Digite el valor de x: "); this.x = Float.parseFloat(lector.readLine()); System.out.print("Digite el valor de y: "); this.y = Float.parseFloat(lector.readLine()); System.out.print("Digite el valor de z: "); this.z = Float.parseFloat(lector.readLine()); } public void imprimir() { System.out.println("valor de x: " + this.x); System.out.println("valor de y: " + this.y); System.out.println("valor de z: " + this.z); } public float getX() { return x; } public float getY() { return y; } public float getZ() { return z; } public void setX(float x) { this.x = x; } public void setY(float y) { this.y = y; } public void setZ(float z) { this.z = z; }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 212

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class PuntoTest { public static void main(String args[]) throws IOException { int cantidad = 0; short opcion = 0; BufferedReader leer = null; Punto vector[] = null; Punto resultado = null; // BufferedReader para leer de consola leer = new BufferedReader(new InputStreamReader(System.in)); // Mximo nmero de puntos a almacenar en el arreglo vector = new Punto[20]; // resultado, es un objeto de tipo punto para almacenar el resultado // de las operaciones resultado = new Punto(); do { System.out.println("1. Leer los puntos"); System.out.println("2. Imprimir los puntos"); System.out.println("3. Sumar los puntos"); System.out.println("4. Restar los puntos"); System.out.println("5. Para Salir"); System.out.print("Digite la opcion "); // Leemos una lnea como string y convertimos el string a un nmero opcion = Short.parseShort(leer.readLine()); System.out.println(); switch (opcion) { case 1: System.out.print("Digite nmero de puntos a almacenar: "); cantidad = Integer.parseInt(leer.readLine()); for (int i = 0; i < cantidad; i++) { System.out.println(); System.out.println("*******Punto No " + (i + 1) + "*******"); System.out.println(); vector[i] = new Punto(); vector[i].leer(); } break; case 2: for (int i = 0; i < cantidad; i++) { vector[i].imprimir(); } break; case 3: // Los acumuladores se inicializan en 0 resultado.setX(0.0f); resultado.setY(0.0f); resultado.setZ(0.0f); for (int i = 0; i < cantidad; i++) { resultado.setX(resultado.getX() + vector[i].getX()); resultado.setY(resultado.getY() + vector[i].getY()); resultado.setZ(resultado.getZ() + vector[i].getZ()); } resultado.imprimir(); break; case 4: // Los acumuladores se inicializan con el valor de la // primera posicin del vector resultado.setX(vector[0].getX()); resultado.setY(vector[0].getY()); resultado.setZ(vector[0].getZ()); // El ciclo lo empezamos en 1 for (int i = 1; i < cantidad; i++) { resultado.setX(resultado.getX() - vector[i].getX()); resultado.setY(resultado.getY() - vector[i].getY()); resultado.setZ(resultado.getZ() - vector[i].getZ()); } resultado.imprimir(); break; default: return; } System.out.println(); } while (opcion < 6 && opcion > 0); } } Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 213

II. La case Matriz, implementa las estructuras de datos y metodos necesarios para manejar matrices cuadradas de nmeros enteros, cuya capacidad puede definir el usuario. Esta clase incluye los siguientes metodos: void asignarDatos(int[] vector): Rellena el contenido de la matriz por filas con los datos pasados desde un vector unidimensional. void suma(Matriz matriz): Suma los valores de la propia clase con los valores de una matriz pasada como argumento. void producto(Matriz matriz): Multiplica los valores de la propia clase con los valores de una matriz pasada como argumento. void traspuesta(): Calcula la traspuesta de la matriz. void mostrar(): muestra el contenido de la matriz.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 214

public class Matriz{ private int tamano = 3; private int[][] datos = null; public Matriz() { this.datos = new int[this.tamano][this.tamano]; } public Matriz(int tamano) { this.tamano = tamano; this.datos = new int[this.tamano][this.tamano]; } public void asignarDatos(int[] vector){ int posicion = 0; if(vector.length < this.tamano * this.tamano){ System.out.println("No hay datos suficientes"); } for(int i = 0; i < this.tamano; i++) { for(int j = 0; j < this.tamano; j++){ datos[i][j] = vector[posicion]; posicion++; } } } public int getDatos(int i, int j) { if (i < 0 || i >= this.tamano || j < 0 || j >= this.tamano){ System.out.println("No hay datos suficientes"); return -1; } return datos[i][j]; } public void suma(Matriz matriz) { if (matriz.tamano != this.tamano) { System.out.println("Tamanos no compatibles"); } else{ for(int i = 0; i < this.tamano; i++) { for (int j = 0; j < this.tamano; j++) { datos[i][j] += matriz.getDatos(i, j); } } } } public void producto(Matriz matriz) { int aux; int[][] datosAux = new int[this.tamano][this.tamano]; if (matriz.tamano != this.tamano) { System.out.println("Tamanos no compatibles"); } else{ for(int i = 0; i < this.tamano; i++) { for (int j = 0; j < this.tamano; j++) { datosAux[i][j] = datos[i][j]; } } for (int i = 0; i < this.tamano; i++) { for (int j = 0; j < this.tamano; j++) { aux = 0; for (int k = 0; k < this.tamano; k++) { aux += datosAux[i][k] * matriz.getDatos(k, j); } datos[i][j] = aux; } } } } public void traspuesta() { int auxiliar; for (int i = 0; i < this.tamano; i++) { for (int j = 0; j < this.tamano; j++) { if (i < j) { auxiliar = datos[i][j]; datos[i][j] = datos[j][i]; datos[j][i] = auxiliar; } } } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 215

public void mostrar() { for (int i = 0; i < this.tamano; i++) { for (int j = 0; j < this.tamano; j++) { System.out.print(datos[i][j] + "\t"); } System.out.println(); } System.out.println(); } public static void main(String args[]) { // Se crea dos matrices de tamao 3x3 Matriz matriz1 = new Matriz(3); Matriz matriz2 = new Matriz(3); int[] vector1 = { 3, 2, 1, 1, 2, 3, 2, 3, 1 }; int[] vector2 = { 1 , 1 , 2 , 2 , 1 , 1 , 1 , 2 , 1 }; // Se llena la primera matriz con los datos del primer vector matriz1.asignarDatos(vector1); // Se llena la segunda matriz con los datos del segundo vector matriz2.asignarDatos(vector2); // Se Muestra el contenido de ambas matrices matriz1.mostrar(); matriz2.mostrar(); //Se multiplicar la primera matriz por la segunda matriz y se muestra el resultado matriz1.producto(matriz2); matriz1.mostrar(); // Se suma la primera matriz por la segunda y muestra el resultado. matriz1.suma(matriz2); matriz1.mostrar(); // Se calcular la traspuesta de la primera matriz y se muestra el resultado. matriz1.traspuesta(); matriz1.mostrar(); } }

III. Jerarquia de clases utilizadas:

Geometria

Rectangulo

Circulo Dibujable CirculoGrafico

Dibujable

RectanguloGrafico

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 216

La clase Figura, presenta un enumerado con id y nombre de la figura.


public enum Figura { RECTANGULO{ public int getId(){ return 1; } public String getNombre(){ return "Rectangulo"; } }, CIRCULO{ public int getId(){ return 2; } public String getNombre(){ return "Circulo"; } }, CUADRADO{ public int getId(){ return 3; } public String getNombre(){ return "Cuadrado"; } }; public abstract int getId(); public abstract String getNombre(); }

La clase Geometria es la base de la jerarqua. En realidad no es la base, pues en Java la clase base es siempre la clase Object. Siempre que no se diga explcitamente que una clase deriva de otra, deriva implcitamente de la clase Object (definida en el package java.lang). La clase Geometria se declara como publica para permitir que sea utilizada por cualquier otra clase, y como abstracta para indicar que no se permite crear objetos de esta clase. La clase Geometria define los mtodos get y set para modificar (haciendo uso del enumerado anterior) y recuperar el tipo de fgura y

declara los mtodos: perimetro() y area(). Ambos mtodos como abstractos para indicar que no se da ninguna definicin es decir ningn cdigo para ellos.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 217

public abstract class Geometria { private Figura tipoFigura = null; public Figura getTipoFigura() { return tipoFigura; } public void setTipoFigura(Figura tipoFigura) { this.tipoFigura = tipoFigura; } public abstract double perimetro(); public abstract double area(); }

La clase Rectangulo deriva de Geometria y define cinco variables miembro de tipo private con su mtodo get y set. Se define la variable static, estas variables se caracterizan por se propias de la clase y no de cada objeto. En efecto, la variable numRectangulos pretende llevar el nmero de objetos que se han creado de esta clase. Las variables x1, x2, x3, x4 representan las cordenadas de dos vrtices opuestos del rectngulo. Los constructores son un ejemplo tipico de mtodos sobrecargados, en este caso hay dos constructores, el segundo de los cuales no tiene ningn parmetro, por lo que se le llama constructor por defecto y en realidad no tiene cdigo para inicializar las variables miembro, limitndose a llamar al constructor general previamente creado, utilizando para ello la palabra this seguida del valor por defecto de los argumentos. El primer constructor recibe cuatro argumetos con cuatro valores que se asignan a las cuatro variables miembro, se setea el tipo de figura y se incrementa el valor de la variable numRectangulos. Los mtodos perimetro() y area() coinciden con la clase Geometria, pero aqu va seguida del cuerpo del mtodo entre llaves, las formulas utilizadas son propias de un rectngulo.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 218

public class Rectangulo extends Geometria{ private private private private private static double double double double int numRectangulos = 0; x1 = 0.0d; x2 = 0.0d; y1 = 0.0d; y2 = 0.0d;

public Rectangulo(double x1, double y1, double x2, double y2){ this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.setTipoFigura(Figura.RECTANGULO); Rectangulo.numRectangulos++; } public Rectangulo(){ this(0.0d,0.0d,1.0d,1.0d); } public double area(){ return ((x2-x1)*(y2-y1)); } public double perimetro(){ return 2.0 * ((x2-x1)+(y2-y1)); } public double getX1(){ return x1; } public double getX2(){ return x2; } public double getY1(){ return y1; } public double getY2(){ return y2; } public static int getNumRectangulos(){ return numRectangulos; } public static void setNumRectangulos(int numRectangulos){ Rectangulo.numRectangulos = numRectangulos; } }

La clase Circulo tambin deriva de Geometria y se define la variable PI como static y final. Una variable final tiene como caracteristica el que su valor no puede ser modificado, o lo que es lo mismo, es una constante. Es muy lgico definir como constante y tambin es razonable que sea una constante static de la clase Crculo, de forma que sea compartida por todos los mtodos y objetos que se creen. Para las variables declaradas de tipo final no se le genera mtodos get y set.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 219

Tambien se definen las variables miembro x, y, z que son las cordenadas del centro y el radio del crculo y los mtodos perimetro () y area(), declarados como abstract en el clase Geometria. El mtodo mayor() que es un mtodo de objeto para comparar crculos, uno de los crculos le llega como argumento implcito y el otro como argumento explicito, la sentencia return devuelve una referencia al objeto cuyo radio sea mayor. La definicin del otro mtodo mayor(), que en este caso es un mtodo de clase (definido como static), y por lo tanto no tiene argumento implcito. Los dos objetos a comparar se deben pasar como argumentos explicitos, lo que hace el cdigo muy fcil de entender. Es importante considerar que en ambos casos lo que devuelve como valor de retorno no es el objeto que constituye el mayor crculo, si no una referencia.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 220

public class Circulo extends Geometria { private private private private private static static double double double int numCirculos = 0; final double PI = Math.PI; x = 0.0d; y = 0.0d; r = 0.0d;

public Circulo(double x, double y, double r){ this.x = x; this.y = y; this.r = r; this.setTipoFigura(Figura.CIRCULO); Circulo.numCirculos++; } public Circulo(double r){ this(0.0d, 0.0d, r); } public Circulo(Circulo c){ this.x = c.x; this.y = c.y; this.r = c.r; this.setTipoFigura(Figura.CIRCULO); Circulo.numCirculos++; } public Circulo() { this(0.0d, 0.0d, 1.0d); } public double area(){ return Circulo.PI*r*r; } public double perimetro() { return 2.0*Circulo.PI*r; } public Circulo mayor(Circulo c){ if(this.r>=c.r){ return this; } else{ return c; } } public static Circulo mayor(Circulo c1, Circulo c2){ if(c1.r>=c2.r){ return c1; } else{ return c2; } } public double getX(){ return x; } public double getY(){ return y; } public double getR(){ return r; } public static int getNumCirculos(){ return numCirculos; } public static void setNumCirculos(int numCirculos){ Circulo.numCirculos = numCirculos; } } Ing. Elkin Surez G. edsuarez@uis.edu.co Pgina 221

Una interface es un cojunto de mtodos declarados (sin implementacin, es decir sin definir el cdigo de dichos mtodos). Cuando una clase implementa una determinada interface, se compromete a dar una definicin a todos los mtodos de la interface. En cierta forma una interface se parece a una clase astract cuyos mtodos son todos absract. Las ventajas de las interfaces es que no estn sometidas a las rgidas normas de las clases; por ejemplo, una clase no puede heredar de dos clases abstract, pero si puede implementar varias interfaces La interfaz Dibujable est dirigida a incorporar, en las clases que la implementen, las capacidas de dibujar sus objetos.
import java.awt.Graphics; public interface Dibujable { public void setPosition(double x, double y); public void dibujar(Graphics dw); }

La clase RectanguloGrafico deriva de Rectangulo e implementa la interfaz Dibujable. Se importa dos clases del paquete java.awt, otra posibilidad sera importar clases de dicho paquete con la sentencia (import java.awt.*;). Se define una nueva variable miembro que se suma a las que ya se tiene por herencia, esta nueva variable es un objeto de la clase Color y el constructor de la clase, al cual le llegan los cinco argumentos necesarios para dar valor a todas las variables miembro definidas en el superclase, al cual se hace referencia con la palabra super. Se implementan los mtodos de la interface, dibujar() recibe como argumento un objeto dw de la clase Graphics, esta clase define un contexto para realizar operaciones graficas en un panel, tales como el color de las lneas, el color de fondo, el tipo de letra a utilizar en los rotulos, etc.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 222

import java.awt.Color; import java.awt.Graphics; public class RectanguloGrafico extends Rectangulo implements Dibujable{ private Color color = null; public RectanguloGrafico(double x1, double y1, double x2, double y2, Color color){ super(x1,y1,x2,y2); this.color = color; } public void dibujar(Graphics dw) { dw.setColor(this.color); dw.drawRect((int)getX1(),(int)getY1(), (int)(getX2()-getX1()), (int)(getY2()-getY1()) ); } public void setPosition(double x, double y){} }

La clase CirculoGrafico deriva de la clase Crculo e implementa la interface Dibujable. Esta clase es muy similar a la clase RectanguloGrafico y no requiere explicaciones especiales.

import java.awt.Color; import java.awt.Graphics; public class CirculoGrafico extends Circulo implements Dibujable{ private Color color = null; public CirculoGrafico(double x, double y, double r, Color color){ super(x, y, r); this.color = color; } public void dibujar(Graphics dw) { dw.setColor(this.color); dw.drawOval((int)(getX()-getR()), (int)(getY()-getR()), (int)(2*getR()), (int)(2*getR()) ); } public void setPosition(double x, double y){} }

La clase Panel es muy importante porque es la responsable final de que los rectngulos y crculos aparezcan dibujados en la pantalla. Esta clase deriva de la clase JPanel, que deriva de JComponent, que deriva de Container y que finalmente deriva de Component. La sentencia (Dibujable dibujable) crea una referencia de la clase Dibujable que puede apuntar o contener objetos de cualquier clase que implemente dicha interfaz. La sentencia (Iterator iterator) crea una referencia a un objeto de la interface Iterator definifida en el paquete java.util. La interface Iterator propociona los metodos

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 223

hasNext(), que chequea si la coleccin de elementos que se esta recorriendo tiene mas elementos y Netx(), que devuelve el siguiente elemento de la Collection. En La sentencia (dibujable.dibujar(g)) se aplica el metodo dibujar() al objeto referenciado por dibujable, que forma parte del Iterator iterator, a partir de la lista lista. La ventaja del metodo paint() asi programado es que es absolutamente general: en ningun momento se hace referencia a las clases RectanguloGrafico y CirculoGrafico, cuyos objetos son realmente los que se van a dibujar. Esto permite aadir nuevas clases como TrianguloGrafico, PoligonoGrafico, LineaGrafica, etc. Esta es una ventaja cuando se trata de crear programas extendibles (que puedan crecer), flexibles (que se puedan modificar) y reutilizables (que se puedan incorporar a otras aplicaciones).
import import import import import public java.awt.BorderLayout; java.awt.Graphics; java.util.ArrayList; java.util.Iterator; javax.swing.JPanel; class Panel extends JPanel {

private ArrayList lista = null; public Panel(){ super(new BorderLayout()); } public void paint(Graphics g) { Dibujable dibujable = null; Iterator iterator = null; iterator = this.lista.iterator(); while(iterator.hasNext()){ dibujable = (Dibujable) iterator.next(); dibujable.dibujar(g); } } public void setLista(ArrayList lista) { this.lista = lista; } }

La clase Dialogo admite otra ventana como "padre". Si se le pasa una ventana como padre, este Dialogo nunca se ir detrs y quedar oculto por su ventana padre. El Dialogo hereda el icono de la esquina superior izquierda de su ventana padre.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 224

import import import import import import import

java.awt.BorderLayout; java.awt.Dialog; java.awt.Frame; java.awt.Window; java.util.ArrayList; javax.swing.JDialog; Clases.Panel;

public class Dialogo extends JDialog{ private Panel panel = null;

public Dialogo(Frame papa, String titulo,ArrayList lista) { super(papa,true); inicializar(titulo, lista); } public Dialogo(Dialog papa, String titulo,ArrayList lista) { super(papa,true); inicializar(titulo, lista); } public Dialogo(String titulo,ArrayList lista) { this((Frame) null, titulo,lista); } /** * Mtodo usado para inicializar los componentes del * dilogo. * @param titulo, de la vetana. * @param lista, valores que se van a grficar. * en el panel. */ protected void inicializar(String titulo,ArrayList lista){ //Permite aadir el panel al Dialogo getContentPane().add(getPanel(), BorderLayout.CENTER); // Permite cerrar el dilogo setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); // A travs del mtodo set, se setea los valores // de la lista al panel getPanel().setLista(lista); // Tamao de la ventana this.setBounds(0, 0, 500,400); // Ttulo para el Dialogo this.setTitle(titulo); } /** * Mtodo usado para construir el panel. * @return Panel. */ protected Panel getPanel() { if (panel == null) { panel = new Panel(); } return panel; } /** * Mtodo que permite ejecutar el dilogo. * @param papa, si un Frame o un Dialog. * @param titulo, de la ventana. * @param lista, valores que se van a graficar. */ public static void ejecutar(Window papa, String titulo, ArrayList lista){ if (papa instanceof Frame){ new Dialogo((Frame) papa,titulo,lista).setVisible(true); } else if (papa instanceof Dialog){ new Dialogo((Dialog) papa,titulo,lista).setVisible(true); } else{ new Dialogo((Frame) null,titulo,lista).setVisible(true); } } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 225

La clase Frame o clase principal de la aplicacin, encargada de tener las diferentes opciones para invocar el dialogo y ver los clculos de las diferentes figuras geomtricas.
import import import import import import import import import import import import import import import import import import import java.awt.BorderLayout; java.awt.Color; java.awt.Dimension; java.awt.Font; java.awt.KeyboardFocusManager; java.awt.Window; java.awt.event.ActionEvent; java.awt.event.ActionListener; java.awt.event.WindowAdapter; java.awt.event.WindowEvent; java.util.ArrayList; javax.swing.ImageIcon; javax.swing.JButton; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JPanel; javax.swing.JScrollPane; javax.swing.JTextArea; javax.swing.UIManager;

public class Frame extends JFrame{ private JLabel tituloLabel; private JButton circuloRectanguloButton; private JButton RectanguloButton; private JButton circuloButton; private JTextArea textArea; private JScrollPane resultadoScrollPane; private JPanel resultadoPanel; private Window ventanaActiva; private ArrayList lista; public Frame() { super(); setIconImage(new ImageIcon("C:\\Imagenes\\circulo_48x48.png").getImage()); inicializar(); } /** * Mtodo que inicializar los componentes de Frame * */ protected void inicializar(){ try { UIManager.setLookAndFeel("com.jgoodies.looks.windows.WindowsLookAndFeel"); } catch (Exception ex) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e){} } getContentPane().add(getResultadoPanel(), BorderLayout.NORTH); getContentPane().add(getResultadoScrollPane()); this.setBounds(0, 0, 468,470); this.setResizable(false); // Clase annima para utilizar el evento windowClosing this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ // Permite cerrar la ventana System.exit(0); } }); }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 226

/** * Mtodo para construir el Panel y modificar * propiedades del mismo. * @return JPanel */ protected JPanel getResultadoPanel() { if (resultadoPanel == null) { resultadoPanel = new JPanel(); resultadoPanel.setLayout(null); resultadoPanel.setSize(492, 80); resultadoPanel.setPreferredSize(new Dimension(0, 140)); resultadoPanel.add(getCirculoButton()); resultadoPanel.add(getRectanguloButton()); resultadoPanel.add(getCirculoRectanguloButton()); resultadoPanel.add(getTituloLabel()); } return resultadoPanel; } /** * Mtodo para construir el ScrollPanel y modificar * propiedades del mismo. * @return JScrollPanel. */ protected JScrollPane getResultadoScrollPane() { if (resultadoScrollPane == null) { resultadoScrollPane = new JScrollPane(); resultadoScrollPane.setViewportView(getTextArea()); } return resultadoScrollPane; } /** * Mtodo para contruir un TextArea. * @return JTextArea */ protected JTextArea getTextArea() { if (textArea == null) { textArea = new JTextArea(); } return textArea; } /** * Mtodo para construir un Button y modificar * propiedades del mismo, adems posee la clase * annima del ActionPerformed para el evento clic * del mouse. * @return JButton */ protected JButton getCirculoButton() { if (circuloButton == null) { circuloButton = new JButton(); circuloButton.setFont(new Font("", Font.PLAIN, 11)); circuloButton.setBounds(102, 82, 48, 48); circuloButton.setIcon(new ImageIcon("C:\\Imagenes\\circulo_ gris_48x48.png")); circuloButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ lista = new ArrayList(); Circulo.setNumCirculos(0); circulo(); } }); circuloButton.setToolTipText(Figura.CIRCULO.getNombre()); } return circuloButton; }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 227

/** * Mtodo para construir un Button y modificar * propiedades del mismo, adems posee la clase * annima del ActionPerformed para el evento clic * del mouse. * @return JButton */ protected JButton getRectanguloButton() { if (RectanguloButton == null) { RectanguloButton = new JButton(); RectanguloButton.setIcon(new ImageIcon("C:\\Imagenes\\rectangulo_48x48.png")); RectanguloButton.setFont(new Font("", Font.PLAIN, 11)); RectanguloButton.setBounds(196, 34, 48, 48); RectanguloButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { lista = new ArrayList(); Rectangulo.setNumRectangulos(0); rectangulo(); } }); RectanguloButton.setToolTipText(Figura.RECTANGULO.getNombre()); } return RectanguloButton; } /** * Mtodo para construir un Button y modificar * propiedades del mismo, adems posee la clase * annima del ActionPerformed para el evento clic * del mouse. * @return JButton */ protected JButton getCirculoRectanguloButton() { if (circuloRectanguloButton == null) { circuloRectanguloButton = new JButton(); circuloRectanguloButton.setFont(new Font("", Font.PLAIN, 11)); circuloRectanguloButton.setBounds(282, 82, 48, 48); circuloRectanguloButton.setIcon(new ImageIcon("C:\\Imagenes\\circulo_48x48.png")); circuloRectanguloButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { lista = new ArrayList(); Circulo.setNumCirculos(0); Rectangulo.setNumRectangulos(0); rectanguloCirculo(); } }); circuloRectanguloButton.setToolTipText(Figura.CIRCULO.getNombre()+" "+ Figura.RECTANGULO.getNombre()); } return circuloRectanguloButton; } /** * Mtodo para construir una Label y modificar * propiedades de la misma. * @return JLabel. */ protected JLabel getTituloLabel(){ if (tituloLabel == null) { tituloLabel = new JLabel(); tituloLabel.setFont(new Font("", Font.BOLD, 14)); tituloLabel.setText("Figuras Geomtricas"); tituloLabel.setBounds(145, 5, 160, 23); } return tituloLabel; }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 228

/** * Mtodo usado para las operaciones bsicas del Crculo * */ private void circulo(){
CirculoGrafico circuloGrafico = null; Circulo circulo = null; Circulo circulo2 = null; Circulo circulo3 = null; String cadena = ""; String enter = "\r\n"; try{ circulo = new Circulo(2.0,2.0,4.0); cadena = armarCadena(circulo,cadena,enter); circulo2 = new Circulo(1.0,1.0,2.0); cadena = armarCadena(circulo2,cadena,enter); circulo3 = new Circulo(0.0,0.0,3.0); cadena = armarCadena(circulo3,cadena,enter); circulo = circulo2.mayor(circulo3); cadena += "El mayor radio entre Circulo 2 y Circulo 3 es "+circulo.getR()+"."+enter; circulo = new Circulo(); cadena = armarCadena(circulo,cadena,enter); circulo = Circulo.mayor(circulo2, circulo3); cadena += "El mayor radio entre Circulo 3 y Circulo 4 es "+circulo.getR()+"."+enter; circuloGrafico = new CirculoGrafico(250,180,120, Color.YELLOW); cadena = armarCadena(circuloGrafico,cadena,enter); getTextArea().setText(cadena); lista.add(circuloGrafico); ventanaActiva = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); Dialogo.ejecutar(ventanaActiva, circuloGrafico.getTipoFigura().getNombre(), lista); } catch(IllegalAccessException e) { e.printStackTrace(); } } /**

* Mtodo usado para las operaciones bsicas del Rectngulo * */ private void rectangulo(){ RectanguloGrafico rectanguloGrafico = null; Rectangulo rectangulo = null; Rectangulo rectangulo2 = null; String cadena = ""; String enter = "\r\n"; try { rectangulo = new Rectangulo(3.5,3.5,10,5); cadena = armarCadena(rectangulo,cadena,enter); rectangulo2 = new Rectangulo(); cadena = armarCadena(rectangulo2,cadena,enter); rectanguloGrafico = new RectanguloGrafico(130,70,350,250,Color.ORANGE); cadena = armarCadena(rectanguloGrafico,cadena,enter); getTextArea().setText(cadena); lista.add(rectanguloGrafico);
ventanaActiva = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); Dialogo.ejecutar(ventanaActiva, rectanguloGrafico.getTipoFigura().getNombre(), lista);

} catch(IllegalAccessException e) { e.printStackTrace(); } }

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 229

/** * Mtodo usado para las operaciones bsicas del Rectngulo y Crculo * */ private void rectanguloCirculo(){ CirculoGrafico circuloGrafico RectanguloGrafico rectanguloGrafico CirculoGrafico circuloGrafico2 String cadena = ""; String enter = "\r\n"; String titulo = ""; try { circuloGrafico = new CirculoGrafico(200,200,100, Color.red); cadena = armarCadena(circuloGrafico,cadena,enter); circuloGrafico2 = new CirculoGrafico(300,200,100, Color.blue); cadena = armarCadena(circuloGrafico,cadena,enter); rectanguloGrafico = new RectanguloGrafico(50,50,450,350,Color.green); cadena = armarCadena(rectanguloGrafico,cadena,enter); getTextArea().setText(cadena); lista.add(circuloGrafico); lista.add(circuloGrafico2); lista.add(rectanguloGrafico); titulo = circuloGrafico.getTipoFigura().getNombre()+" y "+rectanguloGrafico.getTipoFigura().getNombre(); ventanaActiva = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); Dialogo.ejecutar(ventanaActiva,titulo, lista); } catch(IllegalAccessException e) { e.printStackTrace(); } } /** * Mtodo usado para armar la cadena con las operaciones de las * distintas fguras geomtricas. * @param objeto, corresponde a un Circulo, Rectngulo o Tringulo etc. * @param cadena, variable pasada por referencia para concatenar los valores. * @param enter, cadena para salto de linea en la concatenacin. * @return cadena, para ser mostrada en el JTextArea. * @throws IllegalAccessException, lanzada cuado no encuentra la implementacin * del objeto. */ private String armarCadena(Object objeto, String cadena, String enter) throws IllegalAccessException{ if(objeto instanceof Circulo){ cadena += Figura.CIRCULO.getNombre()+" "+Circulo.getNumCirculos()+enter; cadena += "Radio = "+((Circulo)objeto).getR()+" Unidades."+enter; cadena += "Centro = ("+((Circulo)objeto).getX()+" "+((Circulo)objeto).getY()+ ") Unidades."+enter; cadena += "rea = "+((Circulo)objeto).area()+enter; cadena += "Perimetro = "+((Circulo)objeto).perimetro()+enter; cadena += enter; } else if(objeto instanceof Rectangulo){ cadena += Figura.RECTANGULO.getNombre()+" "+Rectangulo.getNumRectangulos()+enter; cadena += "Lados = "+((Rectangulo)objeto).getX1()+" cm. "+((Rectangulo)objeto).getY1()+" cm. "+ ((Rectangulo)objeto).getX2()+" cm. "+((Rectangulo)objeto).getY2()+" cm. "+enter; cadena += "rea = "+((Rectangulo)objeto).area()+enter; cadena += "Perimetro = "+((Rectangulo)objeto).perimetro()+enter; cadena += enter; } else{ throw new IllegalAccessException("Falta implementar el casting para este objeto"); } return cadena; } public static void main(String[] args){ Frame frame = new Frame(); frame.setVisible(true); } } = null; = null; = null;

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 230

Al ejecutar la clase frame se muestra la siguiente ventana con los botones de: Circulo, Rectangulo y Crculo y Rectangulo, cada uno de ellos con su ToolTipText y un TextArea en la parte inferior para visualizar los clculos de cada una de las figuras.

Si se da clic en el boton Circulo y Rectangulo, aparece el dilogo y se muestra las figuras.

Tambien se observa el resultado de los clculos en el frame.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 231

Es muy importante entender los conceptos explicados; esto puede facilitar mucho la comprensin de los capitulos que sigue: Estructuras de Datos y SWING. Se puede prcticar con este ejemplo creando objetos ms en el programa principal o introduciendo alguna otra pequea modificacion.

IV. Realizar una especificacin de clase que permita representar la informacin de un husped de hotel. El hotel guarda la informacin del nombre del cliente, su nmero de cdula, la habitacin que ocupa, el tipo de habitacin (1, 2,3) y el da en el que ingres al hotel. La liquidacin de las facturas se realiza mensualmente, por lo tanto slo se almacena la fecha del da en el que ingres el cliente, dentro del mes en curso. La clase deber proporcionar mtodos que permitan: Leer de teclado y asignar los datos a un husped. Visualizar la informacin de un husped. Calcular el valor de la factura de un cliente. Teniendo en cuenta el da de salida. Las habitaciones de tipo 1 cancelan un valor de $30000 por da de alojamiento, las de tipo 2 cancelan $20000 por da y las de tipo 3 $10000 por da. Y mostar la informacin de la factura por pantalla. Cambiar al husped de habitacin. Esta opcin deber facturar la

cantidad de das que haya estado en la actual habitacin. Registrar el nuevo tipo y nmero de habitacin, considerando que la fecha de ingreso en la nueva habitacin es la fecha de salida en la anterior habitacin es la misma fecha de salida. La clase de aplicacin que contiene el mtodo main (clase Test) deber proporcionar opciones para crear un husped, visualizar la informacin, dar salida a un husped y cambiar de habitacin, dentro de un men. V. Hacer un programa en Java que permita guardar los datos de un vendedor: nombre, categoria, y las ventas que se han realizado en los ultimos 6 meses. Ademas realizar una especificacion de objeto para el elemento Empresa con nombre, telefono y direccion. Permitir realizar las siguientes opciones:

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 232

Calcular e imprimir las ventas totales de cada vendedor durante el semestre anterior. Calcula el valor de sus comisiones si se liquidan a partir de un basico + un porcentaje sobre las ventas totales segun la categoria. 1 2 3 5 15% 10% 8% 7%

Calcular e imprimir el total a cancelar por la nomina de vendedores. Generar un listado con los datos de los vendedores en un determinado mes de ventas. Generar un listado con nombre, ventas del ltimo semestre y el valor de las comisiones.

VI. Realiazar una especificacin de Objeto(s) que implementen el algoritmo de la ruta mas corta Dijkstra. VII. Hacer un programa en Java que permita simular el juego de las torres de Hanoi. VIII. Hacer un programa en Java que permite leer desde teclado los numeros comprendidos entre n y m y verifique cual de ellos es un nmero primo. IX. Realizar una especificacin de Objeto Calculadora, que permita hacer operaciones basica: suma, resta, multiplicacin, division, a traves de un men.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 233

3.27. Evaluacin

I. Modulo I. Los siguientes enunciados constan de cuatro posibles respuestas, usted debe marcar con una x la letra que corresponda a la respuesta que considere correcta.

1. Caractersticas del lenguaje Java. a. Java no dispone de macros (#define) pero permite declarar registros mediante la palabra reservada struct. b. el byte-code generado con un JDK estndar se puede interpretar en cualquier plataforma sin importar en modo alguno la mquina donde fue generado. c. Los ficheros de byte-code no se pueden descompilar. d. Las afirmaciones a y b son verdaderas.

2. Componentes de la plataforma Java. a. La plataforma Java consta de dos partes: la mquina virtual Java y el API Java. b. Aunque cada plataforma implementa su propia mquina virtual, no todas disponen del mismo API. c. La mquina virtual Java se estructura en tres componentes bsicos: CPU, memoria y entrada/salida. d. Todas las afirmaciones anteriores son verdaderas.

3. Tipos de datos en Java a. El tipo de dato int en Java ocupa 32 bits de longitud en cualquier implementacin de la mquina virtual. b. El tipo de dato short en Java slo puede almacenar nmeros positivos (>= 0). c. El tipo de dato char en Java ocupa un byte. d. El tipo de dato float en Java permite representar un dato en flotante de 64 bits en el formato IEEE 754.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 234

4. Palabras reservadas del lenguaje Java. a. final, continue, extends y endif son palabras reservadas de Java. b. default, break, import y package son palabras reservadas de Java. c. super, finally, implemented e inherits son palabras reservadas de Java. d. Todas las afirmaciones anteriores son falsas.

5. Conversin entre tipos de datos en Java. a. La conversin de un double a un float en Java es una conversin implcita. b. La conversin de un char a un int en Java es una conversin implcita. c. La conversin de un boolean a un int en Java es una conversin implcita. d. En Java todas las conversiones deben hacerse de forma explcita.

6. Operadores en Java. a. El resultado de una operacin de relacin (<, >, <=, >=, !=, ==) es un valor entero que puede ser utilizado como condicin en una sentencia if. b. Java no dispone de operadores de cortocircuito al estilo de Pascal. c. En Java existen operadores unitarios como por ejemplo el operador de complemento a 1 (~). d. El operador new de Java tiene ms prioridad que el operador ++.

7. Acerca del mtodo main de la clase principal de un programa Java. a. El mtodo main es un mtodo esttico. b. El mtodo main devuelve un int. c. Desde el mtodo main se puede acceder a las variables miembro de los objetos del programa. d. Las afirmaciones a y c son verdaderas.

8. Sobre los mtodos declarados como static en Java. a. Slo pueden llamar a otros mtodos static. b. Slo pueden acceder a atributos declarados como static. c. No pueden hacer uso de this ni super. d. Todas las afirmaciones anteriores son verdaderas.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 235

9. Mtodos redefinidos en Java. a. Redefinir un mtodo heredado significa volver a codificarlo en la subclase con el mismo nombre, la misma lista de parmetros y el mismo tipo del valor de retorno que tena en la superclase. b. Cuando en una subclase se redefine un mtodo de una superclase, se oculta el mtodo de la superclase, pero no las sobrecargas que existan del mismo en dicha superclase. c. No se puede redefinir un mtodo en una subclase y hacer que su control de acceso sea ms restrictivo que el original. d. Todas las afirmaciones anteriores son verdaderas.

10. Programacin multihilo en Java. a. El mtodo isAlive devuelve true cuando el hilo sobre el que se invoca est en estado suspendido. b. El mtodo join permite que dos hilos hijo terminen al mismo tiempo. c. En Java existen hilos que no pertenecen a ningn grupo de hilos. d. El modificador synchronized aplicado sobre un mtodo, posibilita que dos hilos accedan concurrentemente a dicho mtodo.

II. Modulo II. Los siguientes enunciados constan de cuatro posibles respuestas, usted debe marcar con una x la letra que corresponda a la respuesta que considere incorrecta.

11. Estructura del lenguaje Java. a. Java no proporciona mecanismos de sobrecarga de operadores aritmticos. b. Los operadores + y += son sobrecargados automticamente para concatenar cadenas o para convertir otros tipos de datos a cadenas. c. Al contrario que C++, Java trata a los arrays como objetos reales. d. Java permite la utilizacin de aritmtica de punteros con referencias de tipo const.

12. Sentencias de control en Java. a. La sentencia switch puede incluir cualquier nmero de clusulas case.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 236

b. La clusula default de la sentencia switch puede estar en cualquier parte del bloque switch y no necesariamente al final. c. El compilador de Java detecta los bucles for infinitos y genera un error en tiempo de compilacin. d. Se pueden anidar sentencias switch unas dentro de otras.

13. Sobre los paquetes en Java. a. Las clases de usuario que se guardan en un fichero cuando se escribe un programa, pertenecen automticamente al paquete java.lang. b. Todas las clases del paquete java.lang son importadas de manera automtica por todos los programas Java. c. Todas las clases de usuario definidas en el mismo fichero debern obligatoriamente pertenecer al mismo paquete. d. Un paquete puede contener subpaquetes.

14. Sobre el control de acceso a los miembros de una clase. a. Un miembro declarado sin modificadores de acceso puede ser accedido por cualquier clase perteneciente al mismo paquete y subpaquetes. b. Un miembro declarado con el modificador protected puede ser accedido desde una subclase de diferente paquete. c. Un miembro declarado como private slo puede ser accedido desde los mtodos de su propia clase. d. Un miembro declarado como public puede ser accedido desde cualquier lugar.

15. Variables, mtodos y clases finales en Java. a. Cuando se declara una variable como final, se transforma en una constante. b. Declarar una referencia final a un objeto supone que esa referencia slo pueda utilizarse para referenciar a ese objeto. c. Un mtodo declarado como final no puede ser redefinido en ninguna subclase. d. Cuando una clase se declara como final, se impide que de esa clase se puedan crear instancias con el operador new.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 237

16. La variable CLASSPATH. a. Se utiliza por el compilador y el intrprete de Java para localizar las clases necesarias en tiempo de compilacin y ejecucin. b. Es una variable de entorno del Sistema Operativo. c. Existe en Windows y Linux y tiene la misma funcin. d. El directorio actual siempre est incluido por defecto en la variable CLASSPATH.

17. Variables, mtodos y clases abstractas en Java. a. Una clase abstracta puede contener el mismo tipo de miembros que una clase normal y adems puede contener mtodos abstractos. b. Cuando una clase contiene algn mtodo abstracto, debe ser definida obligatoriamente como abstracta. c. No se puede aplicar el modificador abstract a la definicin de variables de tipos bsicos de Java. d. Los mtodos abstractos pueden ser codificados en la misma clase abstracta en la que residen.

18. Conversin de objetos en Java. a. Para la conversin de objetos de distintas clases, Java exige que dichas clases estn relacionadas por herencia. b. El compilador realiza una conversin implcita de una subclase a una superclase siempre que se necesite. c. No se puede acceder a las variables exclusivas de la subclase a travs de una referencia de la superclase. d. Todas las afirmaciones anteriores son falsas.

19. Sobre clases abstractas e interfaces en Java. a. Una clase no puede heredar de dos clases abstractas, pero s puede heredar una clase abstracta e implementar una o ms interfaces. b. Las interfaces tiene una jerarqua propia, independiente y ms flexible que la de las clases, ya que tienen permitida la herencia mltiple. c. El nombre de una interfaz no se pueden utilizar como una referencia.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 238

d. Las constantes definidas en una interfaz se pueden utilizar en cualquier clase (aunque no implemente la interfaz) precedindolas del nombre de la interfaz.

20. Clases internas en Java. a. Se pueden declarar clases e interfaces internas estticas. b. En Java existen clases internas miembro, pero no existen interfaces internas miembro. c. Las clases internas locales se pueden crear en un iniciador static. d. Todas las afirmaciones anteriores son falsas.

21. Gestin de excepciones en Java. a. Todas las clases que implementan excepciones en Java heredan (directa o indirectamente) de la clase Exception. b. Las clases derivadas de Exception pueden pertenecer a distintos paquetes de Java. c. La misma secuencia de cdigo contenida en una sentencia try puede activar ms de un tipo de excepcin. d. La clusula throws en la declaracin de un mtodo permite listar los tipos de excepciones que ese mtodo puede lanzar.

22. Generacin de archivos de documentacin en Java. a. El programa javadoc reconoce tipos especiales de comentarios que se insertan en el cdigo fuente generado. b. La etiqueta @throws es similar a la etiqueta @exception. c. Los doclets son programas Java que especifican el contenido y el formato de la salida de javadoc. d. La etiqueta @serial se utiliza para indicar la versin del programa o mtodo sobre el que se aplica.

III. Modulo III. Responda falso o verdadero segn corresponda.

23. ( ) Si los constructores de una clase son privados es posible crear objetos, definiendo un mtodo esttico publico en la clase, se crea un objeto de la clase y se devuelve.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 239

24. ( ) Es posible definir arrays bidimensionales de la forma a[i][j], donde cada final a[i] puede tener distinta longitud. 25. ( ) No es posible declarar arrays con memoria esttica. 26. ( ) Hola es un array. 27. ( ) Un array es un Objeto. 28. ( ) El bloque finally siempre debe ser el ultimo, situndose despus de los bloques try y catch. 29. ( ) Las interfaces en Java solo pueden ser implementadas, no existe herencia de interfaces. 30. ( ) Las prioridades de los hilos no tienen ningn efecto sobre el tiempo que estos pasan ejecutndose en la CPU.

Ing. Elkin Surez G. edsuarez@uis.edu.co

Pgina 240

Você também pode gostar