Instituto de Educación Superior “San Ignacio de Monterrico” INTRODUCCIÓN Hace quince años, mencionar la palabra “Java” traía a la mente una de dos cosas: Una Isla de Indonesia o una taza de café caliente. Hoy, quienquiera que haya tenido contacto con una página Web, alguna revista de computación, o una sección de negocios de algún diario, tiene otro concepto de Java: el lenguaje de Programación introducido por Sun Microsystems. Se pueden encontrar películas en los principales videoclubes, atletas en una intriga de crímenes y políticos corruptos que han recibido menor atención que Java. El lenguaje ha llegado a ser parte del desarrollo de software, como el líquido mismo del hombre. Por una parte Java mantiene despiertos a los programadores hasta tarde, mientras que ha otros permite dormir mejor después de una jornada de desarrollo de programas. Al redactar este manual usted será guiado por todos los aspectos del desarrollo de programas Java mediante la versión más actual del lenguaje y las mejores técnicas disponibles. Cuando termine de leer este manual, tendrá razones bien fundamentadas por las que Java ha llegado a ser el lenguaje de programación más comentado durante las últimas décadas y las razones de por qué podría ser el lenguaje de programación de mayor uso en los próximos años. Formando Emprendedores De Calidad Para Un Mundo Empresarial 1 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 1 INTRODUCCIÓN A LAS TÉCNICAS DE PROGRAMACIÓN Formando Emprendedores De Calidad Para Un Mundo Empresarial 2 Instituto de Educación Superior “San Ignacio de Monterrico” Para empezar a entender lo que es la programación, primero tenemos que tener ciertos conocimientos sobre todo lo que la rodea. Empezaremos con unas definiciones un poco técnicas, pero que son imprescindibles para el aprendizaje. 1.1 CONCEPTOS GENERALES Tecnología Dentro del campo que nos interesa a nosotros, la tecnología tiene el objetivo de eliminar las tareas repetitivas, facilitando el trabajo y haciéndolo más eficiente así como aumentando la productividad y los beneficios de la empresa. Programación La programación es una de las etapas más importantes del ciclo de vida de un proyecto (explicaremos más adelante lo que es este termino), y requiere un método de trabajo. La programación es el resultado de dicho trabajo. La programación es el instrumento que permite la ejecución de las tareas automatizadas de un sistema informático. Las herramientas que utilizaremos para programar son los lenguajes de programación, a través de las cuales codificaremos los programas. Programa Conjunto de instrucciones entendibles por el ordenador que permiten realizar un trabajo o resolver un problema. Un programa debe ser finito, es decir, tiene que tener un inicio y Formando Emprendedores De Calidad Para Un Mundo Empresarial 3 Instituto de Educación Superior “San Ignacio de Monterrico” un fin. Tiene que estar bien confeccionado para que, al introducir un dato, salga una solución y si se volviese a introducir el mismo dato, saliese de nuevo la misma solución. Metodología de la programación Se entiende como metodología de la programación al conjunto de normas, métodos y anotaciones que nos indican la forma de programar. Cada lenguaje de programación sigue una metodología distinta. Lenguaje de programación Es un conjunto de reglas semánticas así como sintácticas que los programadores usan para la codificación de instrucciones de un programa o algoritmo de programación. Existen varios lenguajes de programación. Entorno de programación o entorno de desarrollo Es el conjunto de herramientas utilizadas para la elaboración de un programa. Recursos Conjunto de componentes hardware que utilizaremos para la elaboración de un programa (cpu, disco duro…..). Una vez conocidos los conceptos básicos necesarios para el aprendizaje de la programación podemos empezar a ver los diferentes tipos de lenguajes de programación. 1.2 OBJETIVOS E IMPORTANCIA DE LAS TÉCNICAS DE PROGRAMACIÓN El curso de Técnicas de programación esta dedicado a mejorar las capacidades analítica y creadora de los programadores explicando las bases de la programación y la creación de algoritmos. Formando Emprendedores De Calidad Para Un Mundo Empresarial 4 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 2 TEORIA DE LOS ALGORITMOS Formando Emprendedores De Calidad Para Un Mundo Empresarial 5 Instituto de Educación Superior “San Ignacio de Monterrico” El desarrollo de algoritmos es un tema fundamental en el diseño de programas o soluciones. Por lo cual, el alumno debe tener buenas bases que le sirvan para poder crear de manera fácil y rápida sus programas. La siguiente documentación pueden servirá a los alumnos, en su labor cotidiana de aprendizaje y también facilitará el desarrollo de su capacidad analítica y creadora, para de esta manera mejorar su destreza en la elaboración de algoritmos que sirven como base para la codificación de los diferentes programas que tendrá que desarrollar a lo largo de su carrera. 2.1 CONCEPTO DE GORITMO La palabra algoritmo se deriva de la traducción al latín de la palabra árabe alkhowarizmi, nombre de un matemático y astrónomo árabe que escribió un tratado sobre manipulación de números y ecuaciones en el siglo IX. Un algoritmo es una serie de pasos organizados que describe el proceso que se debe seguir, para dar solución a un problema específico. 2.2 TIPOS DE ALGORITMOS Existen dos tipos y son llamados así por su naturaleza: Formando Emprendedores De Calidad Para Un Mundo Empresarial 6 Instituto de Educación Superior “San Ignacio de Monterrico” Cualitativos: Son aquellos en los que se describen los pasos utilizando palabras. Cuantitativos: Son aquellos en los que se utilizan cálculos numéricos para definir los pasos del proceso. 2.3 LENGUAJES ALGORÍTMICOS Un Lenguaje algorítmico es una serie de símbolos y reglas que se utilizan para describir de manera explícita un proceso. 2.4 TIPOS DE LENGUAJES ALGORÍTMICOS 2.4.1 Gráficos Es la representación gráfica de las operaciones que realiza un algoritmo (diagrama de flujo). Diagrama de Flujo Un diagrama de flujo es la representación gráfica de un algoritmo. También se puede decir que es la representación detallada en forma gráfica de como deben realizarse los pasos en la computadora para producir resultados. Esta representación gráfica se da cuando varios símbolos (que indican diferentes procesos en la computadora), se relacionan entre si mediante líneas que indican el orden en que se deben ejecutar los procesos. Los símbolos utilizados han sido normalizados por el instituto norteamericano de normalización (ANSI): Formando Emprendedores De Calidad Para Un Mundo Empresarial 7 Instituto de Educación Superior “San Ignacio de Monterrico” Símbolo Descripción Indica el inicio y el final de nuestro diagrama de flujo. Indica la entrada y salida de datos. Símbolo de proceso y nos indica la asignación de un valor en la memoria y/o la ejecución de una operación aritmética. Indica la salida de información por impresora. Conector dentro de página. Representa la continuidad del diagrama dentro de la misma página. Conector fuera de pagina. Representa la continuidad del diagrama en otra pagina. Indica la salida de información en la pantalla o monitor. Símbolo de decisión. Indica la realización de una comparación de valores. Símbolo de Selección Múltiple. Dada una expresión permite escoger una opción de muchas. Formando Emprendedores De Calidad Para Un Mundo Empresarial 8 Instituto de Educación Superior “San Ignacio de Monterrico” Símbolo del Mientras. Dada una expresión al principio de la iteración esta es evaluada; si la condición es verdadera realizará el ciclo, si es falsa la repetición cesará. Símbolo del Para. Esta estructura de control repetitiva se usa generalmente cuando se conoce de antemano el numero de iteraciones. Símbolo Repita Hasta. funciona igual que la estructura Mientras, con la diferencia que al menos una vez hará el grupo de instrucciones y luego evaluará una condición. Si la condición evaluada es falsa continua dentro del ciclo y si es verdadera termina la iteración. Líneas de flujo o dirección. Indican la secuencia en que se realizan operaciones. Recomendaciones para el diseño de Diagramas de Flujo • Se deben usar solamente líneas de flujo horizontal y/o vertical. • Se debe evitar el cruce de líneas utilizando los conectores. • Se deben usar conectores sólo cuando sea necesario. • No deben quedar líneas de flujo sin conectar. Formando Emprendedores De Calidad Para Un Mundo Empresarial 9 las Instituto de Educación Superior “San Ignacio de Monterrico” • Se deben trazar los símbolos de manera que se puedan leer de arriba hacia abajo y de izquierda a derecha. • Todo texto escrito dentro de un símbolo deberá ser escrito claramente, evitando el uso de muchas palabras. 2.4.2 No Gráficos Representa en forma descriptiva las operaciones que debe realizar un algoritmo (pseudocodigo). Pseudocódigo Un pseudocódigo (falso lenguaje), es una serie de normas léxicas y gramaticales parecidas a la mayoría de los lenguajes de programación, pero sin llegar a la rigidez de sintaxis de estos ni a la fluidez del lenguaje coloquial. Esto permite codificar un programa con mayor agilidad que en cualquier lenguaje de programación, con la misma validez semántica, normalmente se utiliza en las fases de análisis o diseño de Software, o en el estudio de un algoritmo. Forma parte de las distintas herramientas de la ingeniería de software. No hay ningún compilador o intérprete de pseudocódigo informático (en el caso de que lo hubiera serían los lectores de dicho pseudocódigo informático, por ej. una idea de un jefe de programación a su personal), y por tanto no puede ser ejecutado en un ordenador, pero las similitudes con la mayoría de los lenguajes informáticos lo hacen fácilmente convertible. El pseudocódigo describe un algoritmo utilizando una mezcla de frases en lenguaje común, instrucciones de programación y palabras clave que definen las estructuras básicas. Su objetivo es permitir que el programador se centre en los aspectos lógicos de la solución a un problema. No siendo el pseudocódigo un lenguaje formal, varían de un programador a otro, es decir, no hay una estructura semántica ni arquitectura estándar. Es una herramienta ágil para el estudio y diseño de aplicaciones, veamos un ejemplo, que podríamos definir como: lenguaje imperativo, de tercera generación, según el método de programación estructurada. Pseudocódigo = Pseudo (Supuesto) + Código (Instrucción). Formando Emprendedores De Calidad Para Un Mundo Empresarial 10 Instituto de Educación Superior “San Ignacio de Monterrico” ejemplo INICIO Edad: Entero ESCRIBA “cual es tu edad?” Lea Edad SI Edad >=18 entonces ESCRIBA “Eres mayor de Edad” FINSI ESCRIBA “fin del algoritmo” FIN Formando Emprendedores De Calidad Para Un Mundo Empresarial 11 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 3 LA COMPLEJIDAD DEL SOFTWARE FACTORES DE CALIDAD Formando Emprendedores De Calidad Para Un Mundo Empresarial 12 Instituto de Educación Superior “San Ignacio de Monterrico” El software Existen diferentes aplicaciones de software Sistemas, gestión, de ingeniería y científico, empotrado, computadoras personales, basado en Web, de Inteligencia Artificial (Pressman). El software es un producto Genérico. Organización que desarrolla software lo vende al mercado abierto. Personalizado. Sistemas requerimos por un cliente en particular (Sommerville). 3.1 QUÉ ES EL SOFTWARE Programas, documentos asociados y la configuración de datos que se necesitan para hacer que estos programas operen de manera correcta en la computadora (Sommerville). Los Programas que se ejecutan dentro de una computadora de cualquier tamaño y arquitectura, documentos que comprenden formularios virtuales e impresos y datos que combinan números y texto. También incluye representaciones de información de audio, video e imágenes (Pressman). 3.2 FACTORES QUE IMPACTAN LA CREACIÓN DE SOFTWARE El desarrollo de un producto depende de los siguientes elementos: • Número de personas involucradas en el desarrollo • Tamaño (líneas de código) • Tiempo dedicado a la elaboración del producto Formando Emprendedores De Calidad Para Un Mundo Empresarial 13 Instituto de Educación Superior “San Ignacio de Monterrico” • Recursos para la construcción del software Conforme un producto/sistema de software requiera más de algunos de los elementos, el producto será más complejo. 3.3 COMPLEJIDAD DEL SOFTWARE El término Complejidad significa: Complicado, difícil, conjunto de varias cosas. En términos del software: • Indica la cantidad de elementos de un sistema (complejidad cuantitativa). • Indica las interacciones potenciales (conectividad) y el número de estados posibles que se producen a través de éstos (variedad, variabilidad). El término Variedad significa: número de elementos discretos en un sistema. El término Variabilidad, Índice máximo de relaciones posibles (hipotéticamente n!). El término Sistema significa Conjunto de elementos interrelacionados entre sí y que tienen un objetivo común. 3.4 SISTEMAS DE SOFTWARE - SIMPLES CARACTERÍSTICAS • Propósito muy limitado. • Ciclo de vida corto (definición, desarrollo, mantenimiento). • Se reemplazan cuando necesitan mantenimiento: No correcciones No reutilización No extensión de funcionalidad. En general, construido por una persona 3.5 SISTEMAS DE SOFTWARE COMPLEJOS - CARACTERÍSTICAS • Exhiben un conjunto muy rico de comportamientos. • Ciclo de vida largo. • Muchos usuarios dependen de él. Formando Emprendedores De Calidad Para Un Mundo Empresarial 14 Instituto de Educación Superior “San Ignacio de Monterrico” • Construidos por un grupo de personas. • Resulta difícil (o imposible) para un individuo comprender TODAS las sutilezas del sistema. Por tanto, la complejidad es una propiedad esencial de todos los sistemas de software de gran tamaño. Se puede dominar, pero NO eliminar Formando Emprendedores De Calidad Para Un Mundo Empresarial 15 Instituto de Educación Superior “San Ignacio de Monterrico” 3.6 ¿POR QUÉ EL SOFTWARE ES COMPLEJO? La complejidad se deriva de cuatro elementos (Booch): • Complejidad del dominio del problema. • Dificultad para gestionar el proceso de desarrollo. • Flexibilidad que se puede alcanzar a través del software. • Problemas en la caracterización del comportamiento en sistemas discretos Formando Emprendedores De Calidad Para Un Mundo Empresarial 16 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 4 EVOLUCIÓN DE LOS LENGUAJES DE PROGRAMACIÓN Formando Emprendedores De Calidad Para Un Mundo Empresarial 17 Instituto de Educación Superior “San Ignacio de Monterrico” Un lenguaje de programación es un lenguaje inventado para controlar una máquina, (normalmente, un ordenador). Hay muchísimos, de toda clase de tipos y características, inventados para facilitar el abordaje de distintos problemas, el mantenimiento del software, su reutilización, mejorar la productividad, etc. Los lenguajes de programación se pueden clasificar según varios criterios. He procurado reunir todos los que me parecen relevantes, diez en total. Hay que tener en cuenta también, que en la práctica, la mayoría de lenguajes no pueden ser puramente clasificados en una categoría, pues surgen incorporando ideas de otros lenguajes y de otras filosofías de programación, pero no importa al establecer las clasificaciones, pues el auténtico objetivo de las mismas es mostrar los rangos, las posibilidades y tipos de lenguajes que hay. 4.1 NIVEL DE ABSTRACCIÓN Según el nivel de abstracción, o sea, según el grado de cercanía a la máquina: • Lenguajes de bajo nivel: La programación se realiza teniendo muy en cuenta las características del procesador. Ejemplo: Lenguajes ensamblador. • Lenguajes de nivel medio: Permiten un mayor grado de abstracción pero al mismo tiempo mantienen algunas cualidades de los lenguajes de bajo nivel. Ejemplo: C puede realizar operaciones lógicas y de desplazamiento con bits, tratar todos los tipos de datos como lo que son en realidad a bajo nivel (números), etc. Formando Emprendedores De Calidad Para Un Mundo Empresarial 18 Instituto de Educación Superior “San Ignacio de Monterrico” • Lenguajes de alto nivel: Más parecidos al lenguaje humano. Manejan conceptos, tipos de datos, etc., de una manera cercana al pensamiento humano ignorando (abstrayéndose) del funcionamiento de la máquina. Ejemplos: Java, Ruby. Hay quien sólo considera lenguajes de bajo nivel y de alto nivel, (en ese caso, C es considerado de alto nivel). 4.2 PROPÓSITO Según el propósito, es decir, el tipo de problemas a tratar con ellos: • Lenguajes de propósito general: Aptos para todo tipo de tareas: Ejemplo: C. • Lenguajes de propósito específico: Hechos para un objetivo muy concreto. Ejemplo: Csound (para crear ficheros de audio). •Lenguajes de programación de sistemas: Diseñados para realizar sistemas operativos o drivers. Ejemplo: C. • Lenguajes de script: Para realizar tareas varias de control y auxiliares. Antiguamente eran los llamados lenguajes de procesamiento por lotes (batch) o JCL (”Job Control Languages”). Se subdividen en varias clases (de shell, de GUI, de programación web, etc.). Ejemplos: bash (shell), mIRC script, JavaScript (programación web). 4.3 EVOLUCIÓN HISTÓRICA Con el paso del tiempo, se va incrementando el nivel de abstracción, pero en la práctica, los de una generación no terminan de sustituir a los de la anterior: • Lenguajes de primera generación (1GL): Código máquina. • Lenguajes de segunda generación (2GL): Lenguajes ensamblador. • Lenguajes de tercera generación (3GL): La mayoría de los lenguajes modernos, diseñados para facilitar la programación a los humanos. Ejemplos: C, Java. • Lenguajes de cuarta generación (4GL): Diseñados con un propósito concreto, o sea, para abordar un tipo concreto de problemas. Ejemplos: NATURAL, Mathematica. Formando Emprendedores De Calidad Para Un Mundo Empresarial 19 Instituto de Educación Superior “San Ignacio de Monterrico” • Lenguajes de quinta generación (5GL): La intención es que el programador establezca el qué problema ha de ser resuelto y las condiciones a reunir, y la máquina lo resuelve. Se usan en inteligencia artificial. Ejemplo: Prolog. 4.4 MANERA DE EJECUTARSE Según la manera de ejecutarse: • Lenguajes compilados: Un programa traductor traduce el código del programa (código fuente) en código máquina (código objeto). Otro programa, el enlazador, unirá los ficheros de código objeto del programa principal con los de las librerías para producir el programa ejecutable. Ejemplo: C. • Lenguajes interpretados: Un programa (intérprete), ejecuta las instrucciones del programa de manera directa. Ejemplo: Lisp. También los hay mixtos, como Java, que primero pasan por una fase de compilación en la que el código fuente se transforma en “bytecode”, y este “bytecode” puede ser ejecutado luego (interpretado) en ordenadores con distintas arquitecturas (procesadores) que tengan todos instalados la misma “máquina virtual” Java. 4.5 MANERA DE ABORDAR LA TAREA A REALIZAR Según la manera de abordar la tarea a realizar, pueden ser: • Lenguajes imperativos: Indican cómo hay que hacer la tarea, es decir, expresan los pasos a realizar. Ejemplo: C. • Lenguajes declarativos: Indican qué hay que hacer. Ejemplos: Lisp, Prolog. Otros ejemplos de lenguajes declarativos, pero que no son lenguajes de programación, son HTML (para describir páginas web) o SQL (para consultar bases de datos). 4.6 PARADIGMA DE PROGRAMACIÓN El paradigma de programación es el estilo de programación empleado. Algunos lenguajes soportan varios paradigmas, y otros sólo uno. Se puede decir que históricamente han ido Formando Emprendedores De Calidad Para Un Mundo Empresarial 20 Instituto de Educación Superior “San Ignacio de Monterrico” apareciendo para facilitar la tarea de programar según el tipo de problema a abordar, o para facilitar el mantenimiento del software, o por otra cuestión similar, por lo que todos corresponden a lenguajes de alto nivel (o nivel medio), estando los lenguajes ensambladores “atados” a la arquitectura de su procesador correspondiente. Los principales son: • Lenguajes de programación procedural: Divide el problema en partes más pequeñas, que serán realizadas por subprogramas (subrutinas, funciones, procedimientos), que se llaman unas a otras para ser ejecutadas. Ejemplos: C, Pascal. • Lenguajes de programación orientada a objetos: Crean un sistema de clases y objetos siguiendo el ejemplo del mundo real, en el que unos objetos realizan acciones y se comunican con otros objetos. Ejemplos: C++, Java. • Lenguajes de programación funcional: La tarea se realiza evaluando funciones, (como en Matemáticas), de manera recursiva. Ejemplo: Lisp. • Lenguajes de programación lógica: La tarea a realizar se expresa empleando lógica formal matemática. Expresa qué computar. Ejemplo: Prolog. Hay muchos paradigmas de programación: Programación genérica, programación reflexiva, programación orientada a procesos, etc. 4.7 LUGAR DE EJECUCIÓN En sistemas distribuidos, según dónde se ejecute: • Lenguajes de servidor: Se ejecutan en el servidor. Ejemplo: PHP es el más utilizado en servidores web. • Lenguajes de cliente: Se ejecutan en el cliente. Ejemplo: JavaScript en navegadores web. 4.8 ADMISIÓN O NO DE CONCURRENCIA Según admitan o no concurrencia de procesos, esto es, la ejecución simultánea de varios procesos lanzados por el programa: Formando Emprendedores De Calidad Para Un Mundo Empresarial 21 Instituto de Educación Superior “San Ignacio de Monterrico” • Lenguajes concurrentes: Ejemplo: Ada. • Lenguajes no concurrentes: Ejemplo: C. 4.9 INTERACTIVIDAD Según la interactividad del programa con el usuario u otros programas: • Lenguajes orientados a sucesos: El flujo del programa es controlado por la interacción con el usuario o por mensajes de otros programas/sistema operativo, como editores de texto, interfaces gráficos de usuario (GUI) o kernels. Ejemplo: VisualBasic, lenguajes de programación declarativos. • Lenguajes no orientados a sucesos: El flujo del programa no depende de sucesos exteriores, sino que se conoce de antemano, siendo los procesos batch el ejemplo más claro (actualizaciones de bases de datos, colas de impresión de documentos, etc.). Ejemplos: Lenguajes de programación imperativos. 4.10 REALIZACIÓN VISUAL Según la realización visual o no del programa: • Lenguajes de programación visual: El programa se realiza moviendo bloques de construcción de programas (objetos visuales) en un interfaz adecuado para ello. No confundir con entornos de programación visual, como Microsoft Visual Studio y sus lenguajes de programación textuales (como Visual C#). Ejemplo: Mindscript. • Lenguajes de programación textual: El código del programa se realiza escribiéndolo. Ejemplos: C, Java, Lisp. Formando Emprendedores De Calidad Para Un Mundo Empresarial 22 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 5 TECNOLOGÍA ORIENTADA A OBJETOS (EL NUEVO PARADIGMA) Formando Emprendedores De Calidad Para Un Mundo Empresarial 23 Instituto de Educación Superior “San Ignacio de Monterrico” La Programación Orientada a Objetos (POO u OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas de computadora. Está basado en varias técnicas, incluyendo herencia, modularidad, polimorfismo, y encapsulamiento. Su uso se popularizó a principios de la década de 1990. Actualmente son muchos los lenguajes de programación que soportan la orientación a objetos. 5.1 INTRODUCCIÓN Los objetos son entidades que combinan estado, comportamiento e identidad: El estado está compuesto de datos, serán uno o varios atributos a los que se habrán asignado unos valores concretos (datos). El comportamiento está definido por los procedimientos o métodos con que puede operar dicho objeto, es decir, qué operaciones se pueden realizar con él. La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras palabras, es su identificador (concepto análogo al de identificador de una variable o una constante). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar. Formando Emprendedores De Calidad Para Un Mundo Empresarial 24 Instituto de Educación Superior “San Ignacio de Monterrico” De esta forma, un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos que favorecen la comunicación entre ellos. Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separan ni deben separarse el estado y el comportamiento. Los métodos (comportamiento) y atributos (estado) están estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de métodos para poder tratar los atributos con los que cuenta. El programador debe pensar indistintamente en ambos conceptos, sin separar ni darle mayor importancia a ninguno de ellos, hacerlo podría producir el hábito erróneo de crear clases contenedoras de información por un lado y clases con métodos que manejen a las primeras por el otro. De esta manera se estaría realizando una programación estructurada camuflada en un lenguaje de programación orientado a objetos. Esto difiere de la programación estructurada tradicional, en la que los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programación estructurada anima al programador a pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programación estructurada sólo se escriben funciones que procesan datos. Los programadores que emplean éste nuevo paradigma, en cambio, primero definen objetos para luego enviarles mensajes solicitándoles que realicen sus métodos por sí mismos. 5.2 ORIGEN Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Al parecer, en este centro, trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron Formando Emprendedores De Calidad Para Un Mundo Empresarial 25 Instituto de Educación Superior “San Ignacio de Monterrico” refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos. La programación orientada a objetos tomó posición como el estilo de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++, una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para las cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos. Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, entre otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y a la capacidad de mantenimiento del código. Los lenguajes orientados a objetos "puros", por otra parte, carecían de las características de las cuales muchos programadores habían venido a depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características imperativas de maneras "seguras". El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparición de Internet, y a la implementación de la máquina virtual de Java en la mayoría de navegadores. PHP en su versión 5 se ha ido modificando y soporta una orientación completa a objetos, cumpliendo todas las características propias de la orientación a objetos. 5.3 FUNDAMENTOS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS (POO) En la vida real podemos observar que estamos rodeados de objetos, por ejemplo una mesa, una silla, un bolígrafo, etc. y todos ellos podrían clasificarse (con mayor o menor detalle) atendiendo a una definición. Además, sabemos que a pesar de existir muchos tipos de mesas, todas ellas tienen unas características comunes. En definitiva, es posible concluir que pueden hacerse dos distinciones: • Por una parte tenemos el concepto de lo que es una mesa. Formando Emprendedores De Calidad Para Un Mundo Empresarial 26 Instituto de Educación Superior “San Ignacio de Monterrico” • Por otra parte tenemos mesas concretas. Esta idea fue trasladada a la informática y surgieron los conceptos de clase y objeto. Podemos decir que una clase es un concepto sobre una entidad abstracta que define cómo serán todos los objetos que existan de ese tipo. Por tanto, un objeto es una concreción mientras que una clase es una abstracción. Si trasladamos la definición anterior a la jerga técnica informática, podemos decir que una clase es un prototipo que define las propiedades y los métodos comunes a múltiples objetos de un mismo tipo. Sería como una plantilla para la creación de objetos. Por su parte, un objeto es un conjunto de propiedades y métodos capaces de manipular dichas propiedades. Objetos en el Mundo Real 5.3.1 PROGRAMACIÓN ORIENTADA A OBJETOS Es un paradigma de programación que define los programas en términos de "clases de objetos", La programación orientada a objetos (POO), expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar. La POO hace que los problemas sean más sencillos, al permitir dividir el problema. Está división se hace en objetos, de forma que cada objeto funcione de forma totalmente independiente. Un objeto es un elemento del programa que posee sus propios datos y su Formando Emprendedores De Calidad Para Un Mundo Empresarial 27 Instituto de Educación Superior “San Ignacio de Monterrico” propio funcionamiento. Es decir un objeto está formado por datos (propiedades) y funciones que es capaz de realizar el objeto (métodos). Podemos decir que un lenguaje está orientado a objetos si soporta objetos como una característica fundamental del mismo. Pero, ¿qué significa soportar objetos? Fundamentalmente consiste en que el lenguaje permita las siguientes características: Encapsulación, Herencia, Polimorfismo. 5.3.2 ¿QUÉ SON LAS CLASES? Las clases son las plantillas para hacer objetos. Una clase sirve para definir una serie de objetos con propiedades (atributos), comportamientos (operaciones o métodos), y semántica comunes. Hay que pensar en una clase como un molde. A través de las clases se obtienen los objetos en sí. Es decir antes de poder utilizar un objeto se debe definir la clase a la que pertenece, esa definición incluye: a) Sus atributos. Es decir, los datos miembros de esa clase. Los datos pueden ser públicos (accesibles desde otra clase) o privados (sólo accesibles por código de su propia clase. También se las llama campos. b) Sus métodos. Las funciones miembro de la clase. Son las acciones (u operaciones) que puede realizar la clase. c) Código de inicialización. Para crear una clase normalmente hace falta realizar operaciones previas (es lo que se conoce como el constructor de la clase). d) Otras clases. Dentro de una clase se pueden definir otras clases (clases internas, son consideradas como asociaciones dentro de UML). Formando Emprendedores De Calidad Para Un Mundo Empresarial 28 Instituto de Educación Superior “San Ignacio de Monterrico” Diversas Definiciones de Clases 5.3.3 ¿QUÉ SON LOS OBJETOS? Se les llama instancias de clase. Son un elemento en sí de la clase, un objeto se crea utilizando el llamado constructor de la clase. El constructor es el método que permite iniciar el objeto. Un objeto contiene en sí mismo la información y los métodos o funciones necesarios para manipular esa información. Lo más importante de los objetos es que permiten tener un control total sobre 'quién' o 'qué' puede acceder a sus miembros, es decir, los objetos pueden tener miembros públicos a los que podrán acceder otros objetos o miembros privados a los que sólo puede acceder él. Estos miembros pueden ser tanto variables como funciones. Notación de Clase y Objeto en UML 5.4 PROPIEDADES DE LA POO Formando Emprendedores De Calidad Para Un Mundo Empresarial 29 Instituto de Educación Superior “San Ignacio de Monterrico” 5.4.1 ENCAPSULAMIENTO Un objeto es un conjunto de propiedades y métodos, es decir, datos y programas relacionados entre sí como si estuvieran encerrados en una cápsula. Son inaccesibles e impiden conocer cómo está distribuida la información dentro de ellos. Esto implica que las peticiones de información a un objeto deben hacerse mediante mensajes dirigidos a él. Un mensaje es una simple llamada a un método del objeto con el que se quiere comunicar. El hecho de ser una cápsula, algo cerrado e inaccesible, favorecerá la depuración de aplicaciones y la reutilización del código en caso de migrarlo a otros entornos también permite reducir el potencial de errores que pudieran ocurrir. Hagamos una comparación con lo que sería la vida real. Cuando montamos en un coche nos limitados a dar a la llave contacto y el motor arranca. Es muy simple, pero esa simpleza nos la brinda la encapsulación. La realidad es que ocurren muchas cosas: contacto eléctrico, funcionamiento del motor de arranque, apertura del paso de combustible, etc. Pero, ¿necesitamos saber realmente lo que ocurre para hacer uso de él? No, nos basta con saber que para arrancarlo necesitamos introducir la llave en el contacto y girarla. La esencia del encapsulamiento es que cuando un objeto trae consigo su funcionalidad esta ultima se oculta, por ejemplo: por lo general la mayoría de gente que ve televisión no sabe, o no se preocupa de la complejidad electrónica que hay de detrás de la pantalla ni de todas las operaciones que tienen que ocurrir para mostrar una imagen en la pantalla es decir la televisión hace lo que tiene que hacer sin mostrarnos el proceso necesario para ello, y por suerte, la mayoría de los artefactos electrodomésticos funcionan así. Encapsulamiento Formando Emprendedores De Calidad Para Un Mundo Empresarial 30 Instituto de Educación Superior “San Ignacio de Monterrico” 5.4.2 HERENCIA La herencia es una característica que permite la creación de clases a partir de otras. Esto conlleva tanto la reutilización del código, como la especialización de las clases. La reutilización del código viene dada porque podemos definir clases nuevas partiendo de otras ya existentes. En este caso se heredan sus propiedades y métodos. La especialización de las clases viene por añadidura ya que, al definir una clase partiendo de otra, lo que estamos es creando una nueva clase más especializada. Visto lo anterior podemos ya intuir que las clases pueden organizarse jerárquicamente. Esta jerarquía viene determinada por el uso realizado de la herencia. Con esta organización empezamos a tener términos como: clase padre, clase hija, superclase (o clase raíz) y clase final. A continuación vamos a explicarlos: • Clase padre o superclase: se dice que una clase es padre de otra cuando sirve como punto de partida para crear a esta última. • Clase hija o subclase: es aquella clase que hereda de otra, y es hija con respecto a su clase padre o su superclase. • Clase final: toda aquella clase que no puede tener hijas. Herencia En el grafico anterior se representa una jerarquía de clases de figuras geométricas. En la cima de la jerarquía tenemos la clase “Figura”, y es la clase padre de las clases “Circulo” y “Poligono”. La clase “Circulo” es una clase hija de la clase “Figura” y también es una Formando Emprendedores De Calidad Para Un Mundo Empresarial 31 Instituto de Educación Superior “San Ignacio de Monterrico” clase final. La clase “Poligono” es clase hija de la clase “Figura” y clase padre de las clases “Rectangulo” y “Triangulo”. El resto de relaciones que faltan serían similares a las ya explicadas. La herencia puede ser de dos tipos: simple y compuesta. La diferencia entre ambas es que en el caso de herencia compuesta se permite heredar de más de una clase. En otras palabras, se trata de que una clase hija pueda tener más de una clase padre. 5.4.3 POLIMORFISMO Consiste en la posibilidad de tener métodos con el mismo nombre en distintas clases. Al hablar de métodos en distintas clases nos estamos refiriendo a métodos distintos y por tanto con comportamientos distintos a pesar de que tengan el mismo nombre. El polimorfismo permite poder enviar un mismo mensaje (recordemos que un mensaje es una invocación a un método) a objetos de clases diferentes. Estos objetos recibirán el mismo mensaje pero responderán a él de formas diferentes. Por ejemplo, un mensaje “+” para un objeto entero significaría una suma, mientras que para un objeto string (cadena de caracteres) significaría la concatenación. Polimorfismo En él grafico podemos ver una jerarquía de clases en la que todas las clases que la componen tienen un método llamado “dibujar()”. Todos tienen el mismo nombre pero cada uno de ellos podrá tener una funcionalidad distinta. En este ejemplo concreto, una posible interpretación podría ser que tenemos dos clases hijas que redefinen el método “dibujar()” de su clase padre. Probablemente el método “dibujar()” de la clase padre sea un método abstracto (no se ha implementado, sólo se ha definido) ya que para dibujar un polígono es necesario saber el tipo de polígono del que se trata. Por tanto, las clases Formando Emprendedores De Calidad Para Un Mundo Empresarial 32 Instituto de Educación Superior “San Ignacio de Monterrico” hijas de la clase “Poligono” se ven obligadas a implementar el método “dibujar()” que será distinto en cada caso. Esto es un claro ejemplo de polimorfismo. 5.4.4 PRINCIPIO DE OCULTACIÓN Consiste en que cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que específica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos. En programación orientada a objetos el principio de ocultación hace referencia a que los atributos privados de un objeto no pueden ser modificados ni obtenidos a no ser que se haga a través de algún módulo (funciones, métodos y en algunos lenguajes también llamados propiedades del objeto). Un objeto oculta lo que hace a otros objetos y al mundo exterior, pero un objeto necesita presentar un “rostro” al mundo exterior para poder inicializar sus operaciones en el ejemplo de la televisión, Esta tiene que mostrar diversos botones en el control remoto y en si misma que permiten realizar operaciones para ajustar los niveles de volumen, la selección de canales, etc. Estos botones se conocen como interfaces. Formando Emprendedores De Calidad Para Un Mundo Empresarial 33 Instituto de Educación Superior “San Ignacio de Monterrico” Principio de Ocultación 5.4.5 ABSTRACCIÓN Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción. La abstracción se refiere a quitar las propiedades y acciones de un objeto para dejar solo aquellas que sean necesarias, que quiere decir esto ultimo que diferentes tipos de problemas requieren diferentes cantidades de información aun si estos problemas pertenecen a un área en común. Algunos términos importantes se derivan de los anteriores como: Método: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio Formando Emprendedores De Calidad Para Un Mundo Empresarial 34 Instituto de Educación Superior “San Ignacio de Monterrico” en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema. Evento: un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera. Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó. Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método. Estado interno: es una variable que se declara privada, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase. Componentes de un objeto: atributos, identidad, relaciones y métodos. Representación de un objeto: un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes. En comparación con un lenguaje imperativo, una "variable", no es más que un contenedor interno del atributo del objeto o de un estado interno, así como la "función" es un procedimiento interno del método del objeto. 5.5 CARACTERÍSTICAS DE LA PROGRAMACIÓN ORIENTA A OBJETOS a) Simple. Ofrece la funcionalidad de un lenguaje potente pero sin las características menos usadas y más confusas de éstos. El ejemplo más claro puede ser el recolector de basura, que Formando Emprendedores De Calidad Para Un Mundo Empresarial 35 Instituto de Educación Superior “San Ignacio de Monterrico” evita que andemos preocupándonos de liberar memoria. Otro ejemplo podría ser la supresión de los punteros. b) Lenguaje de objetos. ¿Por qué "de" objetos y no "orientado a" objetos? Por que, al contrario de otros lenguajes como C++, no es un lenguaje modificado para poder trabajar con objetos sino que es un lenguaje creado para trabajar con objetos desde cero. De hecho, TODO lo que hay en Java son objetos. Java soporta las tres características básicas de la orientación a objetos: encapsulación, herencia y polimorfismo. c) Distribuido. Proporciona las librerías y herramientas necesarias para que las aplicaciones puedan ser distribuidas. Se ha desarrollado con extensas capacidades de interconexión a red y soporta varios protocolos de red. d) Robusto. Realiza variadas comprobaciones tanto en tiempo de compilación como de ejecución. Entre ellas podemos mencionar la comprobación de tipos y la comprobación de límites de arrays. e) Portable. Esto no se refiere a la independencia de la plataforma, si no a la portabilidad en cuanto a desarrollo. Por ejemplo, los enteros son siempre enteros de 32 bits en complemento a 2, con independencia de la plataforma. f) Multiplataforma. Como mencionamos antes, no es necesario recompilar las aplicaciones Java para los distintos sistemas en que van a ser explotadas. g) Multihilo. Permite múltiples hilos de ejecución, es decir, muchas actividades simultáneas dentro del mismo programa. Las ventajas de esto son un mejor rendimiento interactivo (el usuario no percibe tanto la ocupación de la máquina) y un mejor comportamiento en tiempo real (aunque sea algo muy limitado por el sistema operativo). h) Dinámico. Formando Emprendedores De Calidad Para Un Mundo Empresarial 36 Instituto de Educación Superior “San Ignacio de Monterrico” Cuando una aplicación se lanza, no se cargan todas las librerías que requiere, sino que la carga es bajo demanda. Las librerías nuevas o actualizadas no paralizarán las aplicaciones en funcionamiento. 5.6 LENGUAJES ORIENTADOS A OBJETOS Entre los lenguajes orientados a objetos se destacan los siguientes: • ABAP • ActionScript • ActionScript 3 • Ada • C++ • C# • Clarion • Lenguaje de programación D • Object Pascal (Delphi) • Gambas • Harbour • Eiffel • Java • JavaScript (la herencia se realiza por medio de la programación basada en prototipos) • Lexico (en castellano) • Objective-C • Ocaml Formando Emprendedores De Calidad Para Un Mundo Empresarial 37 Instituto de Educación Superior “San Ignacio de Monterrico” • Oz • PHP (en su versión 5) • Python • Ruby • Smalltalk • Magik (SmallWorld) • VB.NET • Visual FoxPro (en su versión 6) • Visual Basic • XBase++ • Gambas • Flex builder (adobe) Muchos de estos lenguajes de programación no son puramente orientados a objetos, sino que son híbridos que combinan la POO con otros paradigmas. Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados añadiendo extensiones orientadas a objetos a un lenguaje de programación clásico. Un nuevo paso en la abstracción de paradigmas de programación es la Programación Orientada a Aspectos (POA). Aunque es todavía una metodología en estado de maduración, cada vez atrae a más investigadores e incluso proyectos comerciales en todo el mundo. Formando Emprendedores De Calidad Para Un Mundo Empresarial 38 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 6 LENGUAJE JAVA – SINTAXIS Y CONCEPTOS BÁSICOS Formando Emprendedores De Calidad Para Un Mundo Empresarial 39 Instituto de Educación Superior “San Ignacio de Monterrico” 6.1 IDENTIFICADORES Los identificadores sirven para nombrar variables, propiedades, métodos, clases, objetos, interfaces y cualquier otra entidad que sea necesario identificar para poder usar. En Java, un nombre de identificador debe empezar con una letra, un símbolo de subrayado (_) o un símbolo dólar ($). El resto de los caracteres empleados pueden ser letras o números. No existe una longitud máxima y se distinguen las mayúsculas de las minúsculas. 6.2 VARIABLES Una variable es un nombre que contiene un valor que puede cambiar a lo largo del programa es decir representan direcciones de memoria en las que podemos alojar temporalmente la información que necesitemos, y por otro, nos ofrecen la facilidad de referirnos a ellas mediante un nombre. Una declaración de variable se compone de dos partes: su tipo y su nombre. Adicionalmente puede indicarse un valor para su inicialización. El tipo de la variable determina los valores que puede contener y las operaciones que se podrán realizar con ella. Según el tipo de información que contienen pueden ser variables de tipos primitivos o variables de referencia. Desde el punto de vista del papel que desempeñan, las variables pueden ser: • Variable miembro de una clase: Se definen dentro de la clase y fuera de cualquier método. Formando Emprendedores De Calidad Para Un Mundo Empresarial 40 Instituto de Educación Superior “San Ignacio de Monterrico” • Variables locales: Se definen dentro de un método o, más en general, dentro de cualquier bloque entre llaves ({ }). Se crean dentro del bloque y se destruyen al finalizar dicho bloque. Existe una serie de palabras reservadas las cuales tienen un significado especial para Java y por lo tanto no se pueden utilizar como nombres de variables. Dichas palabras son: abstract char double for boolean class else goto* break const* extends if byte continue final implements case default finally import catch do float instanceof int package static throws interface private super transient long protected switch try native public synchronized void new return this volatile null short throw while (*) Son palabras reservadas, pero no se utilizan en la actual implementación del lenguaje Java. 6.3 ÁMBITO DE VARIABLES Se denomina visibilidad, ámbito o alcance de una variable, a la parte de una aplicación en la que dicha variable es accesible. En otras palabras, la parte en la cual puede usarse dicha variable. Como norma general, podemos decir que las variables declaradas dentro de un bloque (entre llaves) son visibles y existen dentro de ese bloque. Por ejemplo, las variables declaradas al principio de una función existen mientras se ejecute la función, las declaradas dentro de un bloque “if” sólo serán accesibles y válidas dentro de dicho bloque y las variables miembro de una clase son válidas mientras existe el objeto. Las variables miembro de una clase declarada como pública (public), serán accesibles mediante una referencia a un objeto de dicha clase usando el operador punto. Por su parte, las declaradas como privadas (private) no son accesibles desde otras clases. Las funciones miembro de una clase tienen acceso directo a todas las variables miembro de la clase sin necesidad de anteponer el nombre de un objeto de la clase. Sin embargo, las funciones miembro de una clase “B” derivada de otra “A”, tienen acceso a todas las variables miembro de “A” declaradas como públicas o protegidas (protected), pero no a las declaradas como privadas. Una clase hija sólo puede acceder directamente a las variables y función miembro de su clase padre declaradas como públicas o protegidas. Formando Emprendedores De Calidad Para Un Mundo Empresarial 41 Instituto de Educación Superior “San Ignacio de Monterrico” Otra característica del lenguaje Java consiste en que es posible declarar una variable dentro de un bloque con el mismo nombre que una variable miembro, pero no con el nombre de otra variable local que ya existiera. La variable declarada dentro del bloque oculta a la variable miembro en ese bloque. Para acceder a la variable miembro oculta sería necesario que usáramos el operador this. Sintaxis: [modificador] <nombreDeTipo> <nombreDeVariable> [= <inicializador>]; Adicionalmente a las declaraciones de Acceso, las variables pueden ser declaradas como: • Static. Variable de clase. (Solo existe una copia por clase con acceso compartido entre todas las instancias de la misma.). Este calificador indica que el objeto no necesita de un objeto para poder utilizarlo sino que se le utiliza directamente a través de la clase. • Final. Declara la variable como constante. Este calificador indica que el elemento no podrá ser modificado por nada, solo podrá ser utilizada. En caso de que sea una variable de tipo primitivo indica que el valor no podrá ser cambiado. Para objetos, la referencia del mismo no podrá apuntar a un nuevo objeto, pero el objeto aun es capaz de ser modificado. MODIFICADORES (Niveles de Acceso) • Public. El campo es accesible de forma general sin restricciones. Es decir indica que el elemento puede ser utilizado dentro de la clase, dentro de las clases descendientes y desde cualquier objeto de la clase. • Protected. El campo es accesible desde cualquier subclase (tanto dentro como fuera del paquete) y a todo método dentro del paquete. Es decir indica que el elemento puede ser utilizado dentro de la clase, dentro de las clases descendientes, mas no desde un objeto de la clase. • Default (Package o tambien denominado Friendly). El campo es accesible a todos los métodos dentro del paquete. Es el acceso por defecto. • Private. El campo es restringido a la clase que lo declara. Formando Emprendedores De Calidad Para Un Mundo Empresarial 42 Instituto de Educación Superior “San Ignacio de Monterrico” 6.4 TIPOS DE DATOS PRIMITIVOS Declarar un variable de tipo primitiva reserva de por si el espacio de memoria necesario. • Byte Entero muy pequeño. • Short Entero Corto. • Int Entero normal. • Long Entero largo. • Char Carácter. • Float Número real de precisión simple. • Double Número real de doble precisión. • Boolean Valor lógico. • Void Tipo Vació. De no asignarse un valor de inicio, el compilador por defecto asignará uno. Tipos Precisión Valor Por Defecto Byte 8 bits 0 Short 16 bits 0 Int 32 bits 0 Long 64 bits 0 Char 16 bits \u0000 Float 32 bits +0.0f Double 64 bits +0.0d Boolean - false 6.5 ORGANIZACIÓN • Paquetes (Packages): son un grupo o librería de clases desarrolladas en java que se utilizan para algo específico. Las principales clases de java son las siguientes (incluidas en el JDK): o java.applet: Creado para soportar la creación de applet Java, el paquete java.applet permite a las aplicaciones ser descargadas sobre una red y ejecutarse dentro de una sandbox.. Formando Emprendedores De Calidad Para Un Mundo Empresarial 43 Instituto de Educación Superior “San Ignacio de Monterrico” o java.awt: La Abstract Window Toolkit contiene rutinas para soportar operaciones básicas GUI y utiliza ventanas básicas desde el sistema nativo subyacente. o java.awt.event: Soporte y procesamiento de eventos para controles awt. o java.io: El paquete java.io contiene clases que soportan entrada/salida. Las clases del paquete son principalmente streams; sin embargo, se incluye una clase para ficheros de acceso aleatorio. o java.lang: El paquete Java java.lang contiene clases fundamentales e interfaces fuertemente relacionadas con el lenguaje y el sistema runtime. Esto incluye las clases raíz que forman la jerarquía de clases, tipos relacionados con la definición del lenguaje, excepciones básicas, funciones matemáticas, Hilos, funciones de seguridad, así como también alguna información sobre el sistema nativo subyacente. o java.net: El paquete java.net suminista rutinas especiales IO para redes, permitiendo las peticiones HTTP, así como también otras transacciones comunes. o java.util: Las estructuras de datos que agregan objetos son el foco del paquete java.util. En el paquete está incluida la API Collections, una jerarquía organizada de estructura de datos influenciada fuertemente por consideraciones de patrones de diseño. o javax.swing: Swing es una colección de rutinas que se construyen sobre java.awt para suministrar un toolkit de widgets independiente de plataforma. o javax.swing.event: Soporte y procesamiento de eventos para controles swing. o java.math: El paquete java.math soporta aritmética multiprecision (incluyendo operaciones aritméticas modulares) y suministra generadores de números primos multiprecision usados para la generación de claves criptográficas. 6.5.1 Instrucción Import Hay código que se puede utilizar en los programas que realicemos en Java. Se importan clases de objetos que están contenidas, a su vez, en paquetes estándares. Formando Emprendedores De Calidad Para Un Mundo Empresarial 44 Instituto de Educación Superior “San Ignacio de Monterrico” Por ejemplo la clase Date es una de las más utilizadas, sirve para manipular fechas. Si alguien quisiera utilizar en su código objetos de esta clase, necesita incluir una instrucción que permita utilizar esta clase. La sintaxis de esta instrucción es: import paquete.subpaquete.subsubapquete....clase Esta instrucción se coloca arriba del todo en el código. Para la clase Date sería: import java.util.Date Lo que significa, importar en el código la clase Date que se encuentra dentro del paquete útil que, a su vez, está dentro del gran paquete llamado java. También se puede utilizar el asterisco en esta forma: import java.util.* Esto significa que se va a incluir en el código todas las clases que están dentro del paquete util de java. 6.5.2 Comentarios En java al igual que en otros lenguajes existen los comentarios que son: //Comentario de una línea. /* …*/ Comentario de Varias líneas. /** Comentario de Documentación * Esta aplicación realiza lo siguiente: … * @autor Nilton Alexis Gómez Flores * @version 1.0 Ejemplo // J003.java = dibuja 2 circunferencias import java.awt.*; import java.awt.event.*; class J003 extends Frame { public J003() { setTitle("Dos circunferencias"); } Formando Emprendedores De Calidad Para Un Mundo Empresarial 45 Instituto de Educación Superior “San Ignacio de Monterrico” public static void main(String [] args) { Frame f=new J003(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(300,200); f.setVisible(true); } public void paint(Graphics g){ g.setColor(Color.red); g.drawOval(10,30,30,30); g.setColor(Color.blue); g.drawOval(35,30,30,30); g.drawString("Dos circunferencias",40,100); } } f.setSize(600,400) Determina el tamaño de la ventana: 1ª coordenada = 600 = anchura en píxels, 2ª coordenada = 400 = altura en píxels. g.setColor(Color,red) Establece el rojo como color de dibujo. g.drawOval(10,30,30,30) Dibuja una circunferencia cuyo “vértice” superior izquierdo se encuentra en el punto 10,30. La tercera coordenada es el diametro horizontal y la cuarta el diámetro vertical. Como los dos diámetros son iguales, resulta una circunferencia. Si fueran distintos, seria una elipse. g.drawString(“Dos circunferencias”,40,100) “Dibuja” el texto que hay entre comillas en el punto de coordenadas 40,100 (1ª coordenada= distáncia horizontal Formando Emprendedores De Calidad Para Un Mundo Empresarial 46 Instituto de Educación Superior “San Ignacio de Monterrico” desde el borde izquierdo, 2ª coordenada = distáncia vertical desde el borde superior). 6.6 CONVERSIÓN ENTRE TIPOS (CASTING) Hay veces en las que se deseará realizar algo como: int a;byte b=12; a=b; La duda está en si esto se puede realizar. La respuesta es que sí. Sí porque un dato byte es más pequeño que uno int y Java le convertirá de forma implícita. Sin embargo en: int a=1;byte b; b=a; El compilador devolverá error aunque el número 1 sea válido para un dato byte. Para ello hay que hacer un casting. Eso significa poner el tipo deseado entre paréntesis delante de la expresión. int a=1;byte b; b= (byte) a; //No da error En el siguiente ejemplo: byte n1=100, n2=100, n3; n3= n1 * n2 /100; Aunque el resultado es 100, y ese resultado es válido para un tipo byte; lo que ocurrirá en realidad es que ocurrirá un error. Eso es debido a que primero multiplica 100 * 100 y como eso da 10000, no tiene más remedio el compilador que pasarlo a entero y así quedará aunque se vuelva a dividir. La solución correcta sería: n3 = (byte) (n1 * n2 / 100); Más ejemplos de CASTING int a = 24; byte b = (byte) a; short c = (short) a; long d = (long) a; 6.7 OPERADORES 6.7.1 Operadores Aritméticos Formando Emprendedores De Calidad Para Un Mundo Empresarial 47 Instituto de Educación Superior “San Ignacio de Monterrico” Hay que tener en cuenta que el resultado de estos operadores varía notablemente si usamos enteros o si usamos números de coma flotante. Por ejemplo: double resultado1, d1=14, d2=5; int resultado2, i1=14, i2=5; resultado1= d1 / d2; resultado2= i1 / i2; resultado1 valdrá 2.8 mientras que resultado2 valdrá 2. Es más incluso: double resultado; int i1=7,i2=2; resultado=i1/i2; //Resultado valdrá 3 resultado=(double)i1/(double)i2; //Resultado valdrá 3.5 El operador del módulo (%) para calcular el resto de una división entera. Ejemplo: int resultado, i1=14, i2=5; resultado = i1 % i2; //El resultado será 4 6.7.2 Operadores Relacionales Sirven para comparar valores. Siempre devuelven valores booleanos. Son: 6.7.3 Operadores Lógicos Formando Emprendedores De Calidad Para Un Mundo Empresarial 48 Instituto de Educación Superior “San Ignacio de Monterrico” También devuelven valores booleanos. Los operadores lógicos (AND, OR y NOT), sirven para evaluar condiciones complejas. NOT sirve para negar una condición. Ejemplo: boolean mayorDeEdad, menorDeEdad; int edad = 21; mayorDeEdad = edad >= 18; //mayorDeEdad será true menorDeEdad = !mayorDeEdad; //menorDeEdad será false El operador && (AND) sirve para evaluar dos expresiones de modo que si ambas son ciertas, el resultado será true sino el resultado será false. Ejemplo: boolean carnetConducir=true; int edad=20; boolean puedeConducir= (edad>=18) && carnetConducir; //Si la edad es de al menos 18 años y carnetConducir es //true, puedeConducir es true El operador || (OR) sirve también para evaluar dos expresiones. El resultado será trae si al menos uno de las expresiones es true. Ejemplo: boolean nieva =true, llueve=false, graniza=false; boolean malTiempo= nieva || llueve || graniza; 6.7.4 Operadores De Bit Manipulan los bits de los números. Son: Formando Emprendedores De Calidad Para Un Mundo Empresarial 49 Instituto de Educación Superior “San Ignacio de Monterrico” 6.7.5 Operadores De Asignación Permiten asignar valores a una variable. El fundamental es “=”. Pero sin embargo se pueden usar expresiones más complejas como: x += 3; En el ejemplo anterior lo que se hace es sumar 3 a la x (es lo mismo x+=3, que x=x+3). Eso se puede hacer también con todos estos operadores: También se pueden concatenar asignaciones: x1 = x2 = x3 = 5; Otros operadores de asignación son “++” (incremento) y “- -“ (decremento). Ejemplo: x++; //esto es x=x+1; x--; //esto es x=x-1; Pero hay dos formas de utilizar el incremento y el decremento. Se puede usar por ejemplo x++ o ++x. La diferencia estriba en el modo en el que se comporta la asignación. Ejemplo: int x=5, y=5, z; z=x++; //z vale 5, x vale 6 z=++y; //z vale 6, y vale 6 Formando Emprendedores De Calidad Para Un Mundo Empresarial 50 Instituto de Educación Superior “San Ignacio de Monterrico” 6.7.6 Operador ? Este operador (conocido como if de una línea) permite ejecutar una instrucción u otra según el valor de la expresión. Sintaxis: expresionlogica?valorSiVerdadero:valorSiFalso; Ejemplo: paga=(edad>18)?6000:3000; En este caso si la variable edad es mayor de 18, la paga será de 6000, sino será de 3000. Se evalúa una condición y según es cierta o no se devuelve un valor u otro. Nótese que esta función ha de devolver un valor y no una expresión correcta. Es decir, no funcionaría: (edad>18)? paga=6000: paga=3000; /ERROR!!!! 6.7.7 Operador Entero De Concatenación De Cadenas Cuando una cadena de texto y una expresión que no sea de tipo cadena se combinan usando el operador de concatenación de cadenas (+), el resultado es una nueva cadena. Dependiendo de la expresión y de su contenido, podremos obtener los siguientes resultados: • Si la expresión es un tipo de referencia con valor null, se obtendrá una nueva cadena igual a la cadena original más la cadena “null”. • Si la expresión es un tipo de referencia con valor distinto de null, se obtendrá una cadena igual a la original más el valor devuelto por el método toString() del tipo de referencia. • Si la expresión es un tipo primitivo, se obtendrá una cadena igual a la original más el valor del tipo primitivo representado como cadena. Veamos unos ejemplos sobre las posibles concatenaciones expuestas: String inicial = “ABC”; String nulo = null; String nonulo = “def”; Formando Emprendedores De Calidad Para Un Mundo Empresarial 51 Instituto de Educación Superior “San Ignacio de Monterrico” byte numero = 23; String caso1 = inicial + nulo; // Se asigna a la variable el valor “ABCnull” String caso2 = inicial + nonulo; // Se asigna a la variable el valor “ABCdef” String caso3 = inicial + numero; // Se asigna a la variable el valor “ABC23” 6.7.8 Operadores De Referencias Se trata de operadores que operan sobre valores de tipo de referencia, esto es, sobre referencias a objetos, interfaces y arrays. Existen distintas categorías y vamos a verlas detalladamente a continuación. 6.7.9 Operadores De Referencias Para Acceso A Campos El acceso a los campos se realiza mediante el operador punto (.), por ello esta notación también recibe el nombre de notación de punto. En este tipo de expresiones, el elemento que está a la izquierda del punto identifica a la clase, objeto o interfaz a la que pertenece el elemento que está a la derecha del punto. Por ejemplo, para referirnos a la constante “MAX_VALUE” de la clase “Float” lo haríamos con la siguiente expresión: “Float.MAX_VALUE”. Existen dos calificadores especiales que se pueden utilizar para acceder a los campos desde el interior de un objeto. Estos calificadores son las palabras this y super. La primera hace referencia al objeto al que está asociado el método. La segunda se utiliza para hacer referencia a los campos de la clase padre. 6.7.10 Operadores De Referencias Para Invocación De Métodos La invocación de métodos, al igual que para el acceso a campos, se realiza mediante el operador punto. También pueden usarse los calificadores this y super. Ambos ofrecen la misma funcionalidad que tienen los correspondientes para el acceso a campos. 6.7.11 Operadores De Conversión De Tipos De Referencia Formando Emprendedores De Calidad Para Un Mundo Empresarial 52 Instituto de Educación Superior “San Ignacio de Monterrico” Las operaciones de conversión de tipos se utilizan para convertir una referencia de objeto a un cierto tipo. Pero existen ciertos requisitos para permitir la conversión. El tipo de un objeto sólo puede convertirse al de su propia clase, al de una de sus superclases, al de una interfaz que sea implementada por su propia clase o al de una interfaz que sea implementada por alguna de sus superclases. Los tipos de referencia se convierten usando como operador el nombre entre paréntesis de la clase a la cual se quiere convertir y anteponiéndolo a la expresión a convertir. En el siguiente ejemplo se supone la existencia de dos clases: “FiguraGeometrica” y “Rectangulo”, donde la segunda es descendiente de la primera. FiguraGeometrica figura = new Rectangulo (); Rectangulo rectangulo = (Rectangulo) figura; 6.7.12 Operador De Tipo De Referencia En Java es sumamente importante la clase a la que pertenece un tipo de referencia. Puesto que se permite la conversión entre tipos, se hace necesario que podamos comprobar desde el código si una determinada conversión puede realizarse. Para determinar si un objeto es una instancia de una clase concreta, disponemos del operador instanceof que devuelve un valor booleano o genera una excepción. El primer operando debe ser un tipo de referencia y el segundo debe ser un nombre de clase. Vamos a ver en la siguiente relación los posibles casos: • Si el primer operando es null (significaría que no apunta a ningún objeto instanciado), el resultado es false. • Si el primer operando es distinto de null y es posible convertirlo a la clase que especifica el segundo operando, el resultado será true. • Si el primer operando es distinto de null y no es un descendiente del tipo especificado por el segundo operando, la instrucción es ilegal y causaría un error de ejecución. En el siguiente ejemplo se resumen los comportamientos que se acaban de describir: String s1 = “texto”; String s2 = null; boolean b1 = s1 instanceof String; // “b1” toma el valor true Formando Emprendedores De Calidad Para Un Mundo Empresarial 53 Instituto de Educación Superior “San Ignacio de Monterrico” boolean b2 = s2 instanceof String; // “b2” toma el valor false 6.8 PRECEDENCIA A veces hay expresiones con operadores que resultan confusas. Por ejemplo en: resultado = 8 + 4 / 2; Es difícil saber el resultado. ¿Cuál es? ¿Seis o diez? La respuesta es 10 y la razón es que el operador de división siempre precede en el orden de ejecución al de la suma. Es decir, siempre se ejecuta antes la división que la suma. Siempre se pueden usar paréntesis para forzar el orden deseado: resultado = (8 + 4) / 2; Ahora no hay duda, el resultado es seis. No obstante el orden de precedencia de los operadores Java es: En la tabla anterior los operadores con mayor precedencia está en la parte superior, los de menor precedencia en la parte inferior. De izquierda a derecha la precedencia es la misma. Es decir, tiene la misma precedencia el operador de suma que el de resta. Esto último provoca conflictos, por ejemplo en: resultado = 9 / 3 * 3; El resultado podría ser uno ó nueve. En este caso el resultado es nueve, porque la división y el producto tienen la misma precedencia; por ello el compilador de Java realiza primero la operación que este más a la izquierda, que en este caso es la división. Una vez más los paréntesis podrían evitar estos conflictos. Formando Emprendedores De Calidad Para Un Mundo Empresarial 54 Instituto de Educación Superior “San Ignacio de Monterrico” 6.9 CONSTANTES 6.9.1 Constantes Literales Por su parte, las constantes literales son representaciones literales de datos en el código fuente. Estos valores se emplean para inicializar variables o para usarlas en expresiones en las que se requieren valores constantes. Las constantes literales pueden usarse para referirse explícitamente a uno de los tipos siguientes: int, long, float, double, boolean, char, String y null. En caso de que necesitáramos representar un tipo primitivo distinto de los indicados, podríamos hacer una conversión explícita al tipo deseado. Por otra parte, los objetos no pueden ser representados mediante estas constantes, y por tanto, no existen constantes literales de tipo de referencia. 6.9.2 Constantes Enteras Las constantes enteras se representan por un valor que está formado sólo por dígitos numéricos y no tienen la coma decimal. Si el número no comienza por cero, representa un número decimal (en base 10). Para representar constantes de tipo “long” se emplea el mismo método pero añadiendo al final la letra “L”. Está permitido el empleo de la letra “L” en minúsculas, pero no debe usarse ya que puede confundirse con el número uno. Además de representaciones en formato decimal, se pueden representar constantes en los formatos octal y hexadecimal. Las constantes octales se representan anteponiendo un cero al propio número, que además, sólo podrá estar formado por los dígitos del 0 al 7. Por su parte, las constantes hexadecimales se representan anteponiendo 0x o 0X y permitiendo que los dígitos del número puedan ser del 0 al 9 y las letras de la A a la F (en mayúsculas o minúsculas). Las constantes octales y hexadecimales son de tipo entero a menos que estén seguidas por la letra “L”, en cuyo caso serían de tipo long. int a = 1002; // Tipo int long b = 1002L; // Tipo long int c = 053; // Tipo int en octal Formando Emprendedores De Calidad Para Un Mundo Empresarial 55 Instituto de Educación Superior “San Ignacio de Monterrico” int d = 053L; // Tipo long en octal int e = 0X002B ; // Tipo int en hexadecimal int f = 0X002BL; // Tipo long en hexadecimal El tipo char es un tipo entero, no obstante se trata de un tipo especial pensado para almacenar caracteres Unicode. Estos últimos son similares a los caracteres ASCII en que están pensados para almacenar símbolos, números y caracteres. Sin embargo, el rango del tipo char es mucho mayor porque permite representar caracteres de casi todos los idiomas del mundo. Las constantes literales de tipo char pueden representarse de dos formas distintas: • Encerrando un único carácter entre comillas simples. • Utilizando una secuencia de escape, que es muy útil para representar caracteres que no pueden escribirse mediante el teclado. La secuencia de escape se representa por una barra inclinada inversa (\) seguida de un número octal de tres dígitos, o bien por la barra seguida de la letra “u” y de un número hexadecimal de cuatro dígitos. La secuencia de escape también debe ir encerrada entre comillas simples. También existe una serie de secuencias de escape especiales que se utilizan para representar algunos de los caracteres ASCII más comunes. En la siguiente tabla se relacionan todos. 6.9.3 Constantes De Coma Flotante Formando Emprendedores De Calidad Para Un Mundo Empresarial 56 Instituto de Educación Superior “San Ignacio de Monterrico” Se expresan mediante un valor numérico que incluya al menos una posición decimal. A menos que se indique otra cosa, las constantes de coma flotante serán de tipo double. Para denotar que la constante sea de tipo float es necesario posponer la letra “f” o “F”. Por claridad, también pueden expresarse las constantes de tipo double posponiendo la letra “d” o “D” al número. Este tipo de constantes también pueden expresarse mediante la notación exponencial, que define un número en dos partes: la mantisa y el exponente. La mantisa es un número en coma flotante con un dígito significativo y cierto número de decimales. El exponente es un número que representa la potencia de 10 que multiplica a la mantisa. Entre la mantisa y el exponente se debe poner la letra “e” o “E”. double a = 123.4; // Tipo double float b = 123.4F; // Tipo float double c = 4.502e-12; // Tipo double en notación exponencial. 6.9.4 Constantes De Cadena Las constantes de cadena se representan por una secuencia de caracteres encerrados entre comillas dobles. Dentro de ellas se pueden incluir las secuencias de escape que antes mencionamos. Veamos algunos ejemplos: String a = “Texto simple”; // Texto simple String b = “Esta es la letra \u0041”; // Usando una secuencia de escape para representar la letra “A” String c = “El proceso ha terminado.\nPulse una tecla”; // Texto en dos líneas 6.9.5 Constantes Booleanas Existen dos: true y false. Al contrario que en otros lenguajes de programación, ninguna de estas constantes puede ser representada mediante un valor entero usando como criterio la igualdad a cero. Formando Emprendedores De Calidad Para Un Mundo Empresarial 57 Instituto de Educación Superior “San Ignacio de Monterrico” 6.9.6 Constante “Null” Existe una constante nula (null) que podemos usarla para representar el valor null. Formando Emprendedores De Calidad Para Un Mundo Empresarial 58 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 7 SOFTWARE JAVA Formando Emprendedores De Calidad Para Un Mundo Empresarial 59 Instituto de Educación Superior “San Ignacio de Monterrico” El software de Java contempla 3 plataformas para el desarrollo de aplicaciones: 7.1 J2SE (JAVA 2 STANDARD EDITION) Es el conjunto de herramientas software que permite el desarrollo y la ejecución de programas Java destinados al lado cliente. Se le suele llamar SDK (Software Development Kit) o Kit de Desarrollo de Programas. Es gratuito y de libre distribución. Se puede descargar desde la página oficial de Sun Microsystems relacionada con Java http://java.sun.com/. Dentro del J2SE se incluyen el compilador y la JVM (Java Virtual Machine) o Máquina virtual de Java. También se la conoce como Intérprete de Java. Cada plataforma tiene su propia versión. En la página de Java dentro de Sun puede descargarse el J2SE para Windows, Linux, Solaris, etc. Si se trabaja con sistemas operativos menos corrientes como MacOS de Apple, AIX de IBM, HP-UX de Hewlett-Packard, etc. conviene ir a http://lopica.sourceforge.net/vm.html 7.2 J2EE (JAVA 2 ENTERPRISE EDITION) Plataforma del lenguaje Java destinada al desarrollo de aplicaciones empresariales estructuradas típicamente en tres capas: capa de presentación de datos, capa de lógica de negocio y capa de datos persistentes (bases de datos). Se compone de un conjunto de estándares y bibliotecas Java que permiten la creación de las aplicaciones empresariales anteriormente citadas. Esta plataforma se utiliza sobre todo para programación en servidores. Sin conocer lo fundamental de J2SE, resulta inviable introducirse en J2EE. 7.3 J2ME (JAVA 2 MICRO EDITION) Plataforma del lenguaje Java destinada al desarrollo de aplicaciones para pequeños dispositivos móviles de memoria limitada, poca capacidad de procesamiento y con Formando Emprendedores De Calidad Para Un Mundo Empresarial 60 Instituto de Educación Superior “San Ignacio de Monterrico” interfaces gráficas limitadas. Típicamente teléfonos móviles, PDAs (Personal Assistent Digital), Pockets PCs, televisiones, relojes, sistemas de ayuda para automóviles, tarjetas, etc. Como en J2EE, la base para programar mediante J2ME, es J2SE. 7.4 EL ENTORNO DE DESARROLLO DE JAVA Existen distintos programas comerciales que permiten desarrollar código Java. La compañía Sun, creadora de Java, distribuye gratuitamente el Java(tm) Development Kit (JDK). Se trata de un conjunto de programas y librerías que permiten desarrollar, compilar y ejecutar programas en Java. Incorpora además la posibilidad de ejecutar parcialmente el programa, deteniendo la ejecución en el punto deseado y estudiando en cada momento el valor de cada una de las variables (con el denominado Debugger). Cualquier programador con un mínimo de experiencia sabe que una parte muy importante (muchas veces la mayor parte) del tiempo destinado a la elaboración de un programa se destina a la detección y corrección de errores. Existe también una versión reducida del JDK, denominada JRE (Java Runtime Environment) destinada únicamente a ejecutar código Java (no permite compilar). Los IDEs (Integrated Development Environment), tal y como su nombre indica, son entornos de desarrollo integrados. En un mismo programa es posible escribir el código Java, compilarlo y ejecutarlo sin tener que cambiar de aplicación. Algunos incluyen una herramienta para realizar Debug gráficamente, frente a la versión que incorpora el JDK basada en la utilización de una consola (denominada habitualmente ventana de comandos de MS-DOS, en Windows NT/95/98) bastante difícil y pesada de utilizar. Estos entornos integrados permiten desarrollar las aplicaciones de forma mucho más rápida, incorporando en muchos casos librerías con componentes ya desarrollados, los cuales se incorporan al proyecto o programa. Como inconvenientes se pueden señalar algunos fallos de compatibilidad entre plataformas, y ficheros resultantes de mayor tamaño que los basados en clases estándar. Algunos IDEs que podemos citar son: Jcreator, Netbeans, Eclipse y Jdeveloper entre otros. 7.5 BYTECODES Formando Emprendedores De Calidad Para Un Mundo Empresarial 61 Instituto de Educación Superior “San Ignacio de Monterrico” Un programa C o C++ es totalmente ejecutable y eso hace que no sea independiente de la plataforma y que su tamaño normalmente se dispare ya que dentro del código final hay que incluir las librerías de la plataforma. Proceso de compilación de un programa C++ Los programas Java no son ejecutables, no se compilan como los programas en C o C+ +. En su lugar son interpretados por una aplicación conocida como la máquina virtual de Java (JVM). Gracias a ello no tienen porque incluir todo el código y librerías propias de cada sistema. Previamente el código fuente en Java se tiene que precompilar generando un código (que no es directamente ejecutable) previo conocido como bytecode o J-code. Ese código (generado normalmente en archivos con extensión class) es el que es ejecutado por la máquina virtual de Java que interpreta las instrucciones de los bytecodes, ejecutando el código de la aplicación. El bytecode se puede ejecutar en cualquier plataforma, lo único que se requiere es que esa plataforma posea un intérprete adecuado (la máquina virtual de esa plataforma). 7.6 LA JAVA VIRTUAL MACHINE La existencia de distintos tipos de procesadores y ordenadores llevó a los ingenieros de Sun a la conclusión de que era muy importante conseguir un software que no dependiera del tipo de procesador utilizado. Se planteó la necesidad de conseguir un código capaz de ejecutarse en cualquier tipo de máquina. Una vez compilado no debería ser necesaria ninguna modificación por el hecho de cambiar de procesador o de ejecutarlo en otra máquina. La clave consistió en desarrollar un código “neutro” el cual estuviera preparado Formando Emprendedores De Calidad Para Un Mundo Empresarial 62 Instituto de Educación Superior “San Ignacio de Monterrico” para ser ejecutado sobre una “máquina hipotética o virtual”, denominada Java Virtual Machina (JVM). Es esta JVM quien interpreta este código neutro convirtiéndolo a código particular de la CPU utilizada. Se evita tener que realizar un programa diferente para cada CPU o plataforma. La JVM es el intérprete de Java. Ejecuta los “bytecodes” (ficheros compilados con extensión *.class) creados por el compilador de Java (javac.exe). Tiene numerosas opciones entre las que destaca la posibilidad de utilizar el denominado JIT (Just-In-Time Compiler), que puede mejorar entre 10 y 20 veces la velocidad de ejecución de un programa. La JVM, además es un programa muy pequeño y que se distribuye gratuitamente para prácticamente todos los sistemas operativos. A este método de ejecución de programas en tiempo real se le llama Just in Time (JIT). Proceso de compilación de un programa Java 7.7 LAS VARIABLES PATH Y CLASSPATH Para poder compilar y ejecutar las aplicaciones Java es necesario tener acceso al directorio en el que se encuentran el compilador y el intérprete. Para poder compilar y ejecutar cómodamente deberíamos añadir el directorio “\bin” del JDK a la variable de entorno PATH. Para los usuarios de DOS y Windows, desde el símbolo del sistema tendremos que escribir: set PATH=%PATH%;c:\java\bin En la explicación anterior sólo se cambia la variable de entorno PATH para la sesión en curso (la ventana actual). La variable de entorno PATH no es específica de Java, si no que más bien es un mecanismo de los sistemas operativos para localizar programas que no se encuentran en el directorio actual. Pero ahora vamos con otra variable de entorno que sí lo es, estamos hablando de CLASSPATH. Formando Emprendedores De Calidad Para Un Mundo Empresarial 63 Instituto de Educación Superior “San Ignacio de Monterrico” Java carga dinámicamente las clases según la necesidad, pero ¿dónde busca esas clases?. Este es el papel de la variable de entorno CLASSPATH, indicar a Java donde buscar las clases y librerías propias (el API de Java) y las clases de usuario. A partir del JDK versión 1.1.4 sólo es necesario usar esta variable para indicar las clases de usuario. Veamos un ejemplo. Supongamos que disponemos de una librería de clases que vamos a usar habitualmente y que está comprimida en un fichero llamado “milibreria.zip”. También nos interesa usar un conjunto de clases sin comprimir que están todas situadas en un mismo directorio llamado “misclases”. Para los usuarios de DOS y Windows, la librería está en “c:\desarrollo\libreria” y el conjunto de clases está en “c:\desarrollo\clases”. Desde el símbolo del sistema tendremos que escribir: set CLASSPATH=.;c:\desarrollo\libreria\milibreria.zip;c:\desarrollo\misclases Para que los cambios en las variables path y classpath sean permanentes hay que comprobar que la carpeta con los ejecutables del kit de desarrollo esten incluidos en la variable de entorno path. Esto lo podemos comprobar escribiendo path en la línea de comandos. Si la carpeta del kit de desarrollo no está incluida, habrá que hacerlo. Para ello en Windows 2000 o XP: 1. Pulsar el botón derecho sobre Mi PC y elegir Propiedades 2. Ir al apartado Opciones avanzadas 3. Hacer clic sobre el botón Variables de entorno 4. Añadir a la lista de la variable Path la ruta a la carpeta con los programas del JDK. Ejemplo de contenido de la variable path: PATH=C:\WINNT\SYSTEM32;C:\WINNT;C:\WINNT\SYSTEM32\WBEM;C:\Archivos de programa\Microsoft Visual Studio\Common\Tools\WinNT;C:\Archivos de programa\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Archivos de programa\Microsoft Visual Studio\Common\Tools;C:\Archivos de programa\Microsoft Visual Studio\VC98\bin;C:\Archivos de programa\j2sdk_nb\j2sdk1.4.2\bin En negrita está señalada la ruta a la carpeta de ejecutables (carpeta bin) del kit de desarrollo. Está carpeta varía según la instalación, para acceder a la variable CLASSPATH: si estamos en un windows NT-2000-XP: 5. Pulsar el botón derecho sobre Mi PC y elegir Propiedades 6. Ir al apartado Opciones avanzadas 7. Hacer clic sobre el botón Variables de entorno 8. Añadir la variable CLASSPATH en la que escribiremos simplemente un punto: Formando Emprendedores De Calidad Para Un Mundo Empresarial 64 Instituto de Educación Superior “San Ignacio de Monterrico” classpath=. Noten que en CLASSPATH agregué el directorio actual (.), para poder compilar y ejecutar desde cualquier directorio. 7.8 COMPILACIÓN Y EJECUCION DE CODIGO JAVA El compilador Java es una de las herramientas de desarrollo incluidas en el JDK. Realiza un análisis de sintaxis del código escrito en los ficheros fuente de Java (con extensión *.java). Si no encuentra errores en el código genera los ficheros compilados (con extensión *.class). En otro caso muestra la línea o líneas erróneas. En el JDK de Sun dicho compilador se llama javac.exe. Tiene numerosas opciones, algunas de las cuales varían de una versión a otra. Se aconseja consultar la documentación de la versión del JDK utilizada para obtener una información detallada de las distintas posibilidades. La compilación del código java se realiza mediante el programa javac incluido en el software de desarrollo de java. La forma de compilar es (desde la línea de comandos): javac archivo.java El resultado de esto es un archivo con el mismo nombre que el archivo java pero con la extensión class. Esto ya es el archivo con el código en forma de bytecodes. Es decir con el código precompilado. Si la clase es ejecutable (sólo lo son si contienen el método main), el código se puede interpretar usando el programa java del kit de desarrollo. Sintaxis: java archivo.class Estos comandos hay que escribirlos desde la línea de comandos de en la carpeta en la que se encuentre el programa. Pero antes hay que asegurarse de que los programas del kit de desarrollo son accesibles desde cualquier carpeta del sistema. Para ello hay que comprobar que la carpeta con los ejecutables del kit de desarrollo está incluida en la variable de entorno path. JAVA .java javac Java Bytecode java Environment Java VM .class Compilación de un programa Java Formando Emprendedores De Calidad Para Un Mundo Empresarial 65 Instituto de Educación Superior “San Ignacio de Monterrico” 7.9 TIPOS DE ARCHIVOS • java: Es la extensión de los archivos fuente del lenguaje java, ejem. bienvenido.java, Miapplet.java. • class: El resultado de compilar un archivo fuente java es un archivo en byte-code con extensión class, ejem. bienvenido.class, Miapplet.class. El comando usado para compilar los arhivos con extensión java es javac y para su ejecución el comando java que vienen incluidos en el JDK (Java Development Kit) de Sun Microsystems. • jar/zip: Las clases desarrolladas en java suelen por lo general guardarse en estos tipos de archivos comprimidos. 7.10 EJEMPLO DE PRUEBA Ejemplo 1 //archivo con el nombre Bienvenido.java class Bienvenido { public static void main(String [] args) { System.out.println("Bienvenido a Java!"); } } Grábalo en TuCarpeta con el nombre Bienvenido.java luego compila y ejecuta el programa anterior, es decir: javac Bienvenido.java java Bienvenido Línea 1: es un simple comentario de tipo línea en el que hemos colocado el nombre del fichero. El compilador ignorará todo lo que va desde los caracteres “//” hasta el final de la línea. Los comentarios son de mucha utilidad, tanto para otras personas que tengan que revisar el código, como para nosotros mismos en futuras revisiones. Formando Emprendedores De Calidad Para Un Mundo Empresarial 66 Instituto de Educación Superior “San Ignacio de Monterrico” Línea 2: declara el nombre de la clase. Usamos la palabra reservada class seguida del nombre que queremos darle a nuestra clase, en este caso es “Bienvenido”. Ya sabemos que Java es un lenguaje orientado a objetos, por tanto, nuestro programa ha de ser definido como una clase. Por convención, las clases Java se definen con la primera letra en mayúsculas. Ejemplo 2 class J001 { public static void main(String [] args) { System.out.println("Hola\nQue tal"); System.out.println("Uno\nDos\nTres\nCuatro"); } } Ejemplo 3 class J002 { public static void main(String [] args) { System.out.println("Hola"); System.out.println("Adios"); System.out.println(""); System.out.print("Pues vale"); System.out.print("Eso"); System.out.print("Vale"); } } println(“mensaje”) Escribe el “mensaje” y luego se produce un cambio de línea que equivale a pulsar [Return] print(“mensaje”) Escribe el “mensaje” y el cursor se sitúa al final del mensaje y en la misma línea. Para recordarlo piensa en la siguiente “fórmula”: println = print + ln (línea nueva) Formando Emprendedores De Calidad Para Un Mundo Empresarial 67 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 8 TEORIAS DE OBJETOS Formando Emprendedores De Calidad Para Un Mundo Empresarial 68 Instituto de Educación Superior “San Ignacio de Monterrico” 8.1 ESTRUCTURA DE UNA CLASE Definir Atributos De La Clase (Variables, Propiedades O Datos De La Clases) Cuando se definen los datos de una determinada clase, se debe indicar el tipo de propiedad que es (String, int, double, int[][],...) y el especificador de acceso (public, private,...). El especificador indica en qué partes del código ese dato será visible. Especificadores De Acceso Formando Emprendedores De Calidad Para Un Mundo Empresarial 69 Instituto de Educación Superior “San Ignacio de Monterrico” Se trata de una palabra que antecede a la declaración de una clase, método o propiedad de clase. Hay tres posibilidades: public, protected y private. Una cuarta posibilidad es no utilizar ninguna de estas tres palabras; entonces se dice que se ha utilizado el modificador por defecto (friendly). Los especificadores determinan el alcance de la visibilidad del elemento al que se refieren. Referidos por ejemplo a un método, pueden hacer que el método sea visible sólo para la clase que lo utiliza (private), para éstas y las heredadas (protected), para todas las clases del mismo paquete (friendly) o para cualquier clase del tipo que sea (public). En la siguiente tabla se puede observar la visibilidad de cada especificador: Ejemplo: class Persona { public String nombre;//Se puede acceder desde cualquier clase private int contraseña;//Sólo se puede acceder desde la //clase Persona protected String dirección; //Acceden a esta propiedad //esta clase y sus descendientes Por lo general las propiedades de una clase suelen ser privadas o protegidas, a no ser que se trate de un valor constante, en cuyo caso se declararán como públicos. Formando Emprendedores De Calidad Para Un Mundo Empresarial 70 Instituto de Educación Superior “San Ignacio de Monterrico” Las variables locales de una clase pueden ser inicializadas. class auto{ public nRuedas=4; La clase persona en UML. El signo + significa public, el signo # protected y el signo - private 8.2 DEFINIR MÉTODOS DE CLASE (OPERACIONES O FUNCIONES DE CLASE) Un método es una llamada a una operación de un determinado objeto. Al realizar esta llamada (también se le llama enviar un mensaje), el control del programa pasa a ese método y lo mantendrá hasta que el método finalice o se haga uso de return. Para que un método pueda trabajar, normalmente hay que pasarle unos datos en forma de argumentos o parámetros, cada uno de los cuales se separa por comas. Ejemplos de llamadas: balón.botar(); //sin argumentos miCoche.acelerar(10); ficha.comer(posición15);//posición 15 - variable que se pasa como argumento partida.empezarPartida(“18:15”,colores); Formando Emprendedores De Calidad Para Un Mundo Empresarial 71 Instituto de Educación Superior “San Ignacio de Monterrico” Los métodos de la clase se definen dentro de ésta. Hay que indicar un modificador de acceso (public, private, protected o ninguno, al igual que ocurre con las variables y con la propia clase) y un tipo de datos, que indica qué tipo de valores devuelve el método. Esto último se debe a que los métodos son funciones que pueden devolver un determinado valor (un entero, un texto, un valor lógico,...) mediante el comando return. Si el método no devuelve ningún valor, entonces se utiliza el tipo void que significa que no devuelve valores (en ese caso el método no tendrá instrucción return). El último detalle a tener en cuenta es que los métodos casi siempre necesitan datos para realizar la operación, estos datos van entre paréntesis y se les llama argumentos. Al definir el método hay que indicar que argumentos se necesitan y de qué tipo son. Ejemplo: public class vehiculo { /** Función principal */ int ruedas; private double velocidad=0; String nombre; /** Aumenta la velocidad*/ public void acelerar(double cantidad) { velocidad += cantidad; } /** Disminuye la velocidad*/ public void frenar(double cantidad) { velocidad -= cantidad; } /** Devuelve la velocidad*/ public double obtenerVelocidad(){ Formando Emprendedores De Calidad Para Un Mundo Empresarial 72 Instituto de Educación Superior “San Ignacio de Monterrico” return velocidad; } public static void main(String args[]){ vehiculo miCoche = new vehiculo(); miCoche.acelerar(12); miCoche.frenar(5); System.out.println(miCoche.obtenerVelocidad()); } // Da 7.0 En la clase anterior, los métodos acelerar y frenar son de tipo void por eso no tienen sentencia return. Sin embargo el método obtenerVelocidad es de tipo double por lo que su resultado es devuelto por la sentencia return y puede ser escrito en pantalla. Versión UML de la clase Coche 8.3 ARGUMENTOS POR VALOR Y POR REFERENCIA En todos los lenguajes éste es un tema muy importante. Los argumentos son los datos que recibe un método y que necesita para funcionar. Ejemplo: public class Matemáticas { Formando Emprendedores De Calidad Para Un Mundo Empresarial 73 Instituto de Educación Superior “San Ignacio de Monterrico” public double factorial(int n){ double resultado; for (resultado=n;n>1;n--) resultado*=n; return resultado; } ... public static void main(String args[]){ Matemáticas m1=new Matemáticas(); double x=m1.factorial(25);//Llamada al método } En el ejemplo anterior, el valor 25 es un argumento requerido por el método factorial para que éste devuelva el resultado (que será el factorial de 25). En el código del método factorial, este valor 25 es copiado a la variable n, que es la encargada de almacenar y utilizar este valor. Se dice que los argumentos son por valor, si la función recibe una copia de esos datos, es decir la variable que se pasa como argumento no estará afectada por el código. Ejemplo: class prueba { public void metodo1(int entero){ entero=18; ... } ... public static void main(String args[]){ int x=24; Formando Emprendedores De Calidad Para Un Mundo Empresarial 74 Instituto de Educación Superior “San Ignacio de Monterrico” prueba miPrueba = new prueba(); miPrueba.metodo1(x); System.out.println(x); //Escribe 24, no 18 } Este es un ejemplo de paso de parámetros por valor. La variable x se pasa como argumento o parámetro para el método metodo1, allí la variable entero recibe una copia del valor de x en la variable entero, y a esa copia se le asigna el valor 18. Sin embargo la variable x no está afectada por esta asignación. Sin embargo en este otro caso: class prueba { public void metodo1(int[] entero){ entero[0]=18; ... } ... public static void main(String args[]){ int x[]={24,24}; prueba miPrueba = new prueba(); miPrueba.metodo1(x); System.out.println(x[0]); //Escribe 18, no 24 Aquí sí que la variable x está afectada por la asignación entero[0]=18. La razón es porque en este caso el método no recibe el valor de esta variable, sino la referencia, es decir la dirección física de esta variable. entero no es una replica de x, es la propia x llamada de otra forma. Formando Emprendedores De Calidad Para Un Mundo Empresarial 75 Instituto de Educación Superior “San Ignacio de Monterrico” Los tipos básicos (int, double, char, boolean, float, short y byte) se pasan por valor. También se pasan por valor las variables String. Los objetos y arrays se pasan por referencia. Formando Emprendedores De Calidad Para Un Mundo Empresarial 76 Instituto de Educación Superior “San Ignacio de Monterrico” 8.4 MÉTODOS Y CONSTRUCTORES Los métodos son funciones que pueden ser llamadas dentro de la clase o por otras clases. El constructor es un tipo específico de método que siempre tiene el mismo nombre que la clase. Cuando se declara una clase en Java, se pueden declarar uno o más constructores opcionales que realizan la inicialización cuando se instancia (se crea una ocurrencia) un objeto de dicha clase. Utilizando el código de ejemplo anterior, cuando se crea una nueva instancia de MiClase, se crean (instancian) todos los métodos y variables, y se llama al constructor de la clase: MiClase mc; mc = new MiClase(); La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new no consume memoria, simplemente es una declaración de tipo. Después de ser instanciado un nuevo objeto mc, el valor de i en el objeto mc será igual a 10. Se puede referenciar la variable (de instancia) i con el nombre del objeto: mc.i++; // incrementa la instancia de i de mc Al tener mc todas las variables y métodos de MiClase, se puede usar la primera sintaxis para llamar al método Suma_a_i() utilizando el nuevo nombre de clase mc: mc.Suma_a_i( 10 ); y ahora la variable mc.i vale 21. Formando Emprendedores De Calidad Para Un Mundo Empresarial 77 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 9 ESTRUCTURAS DE CONTROL DE FLUJO Formando Emprendedores De Calidad Para Un Mundo Empresarial 78 Instituto de Educación Superior “San Ignacio de Monterrico” 9.1 IF Permite crear estructuras condicionales simples; en las que al cumplirse una condición se ejecuta una serie de instrucciones. Se puede hacer que otro conjunto de instrucciones se ejecute si la condición es falsa. La condición es cualquier expresión que devuelva un resultado de true o false. La sintaxis de la instrucción if es: if (condición) { instrucciones que se ejecutan si la condición es true } else { instrucciones que se ejecutan si la condición es false } La parte else es opcional. Ejemplo: if ((diasemana>=1) && (diasemana<=5)){ trabajar = true; } else { trabajar = false; } Se pueden anidar varios if a la vez. De modo que se comprueban varios valores. Ejemplo: if (diasemana==1) dia=”Lunes”; else if (diasemana==2) dia=”Martes”; Formando Emprendedores De Calidad Para Un Mundo Empresarial 79 Instituto de Educación Superior “San Ignacio de Monterrico” else if (diasemana==3) dia=”Miércoles”; else if (diasemana==4) dia=”Jueves”; else if (diasemana==5) dia=”Viernes”; else if (diasemana==6) dia=”Sábado”; else if (diasemana==7) dia=”Domingo”; else dia=”?”; 9.2 SWITCH Es la estructura condicional compleja porque permite evaluar varios valores a la vez. Sintaxis: switch (expresión) { case valor1: sentencias si la expresiona es igual al valor1; [break] case valor2: sentencias si la expresiona es igual al valor2; [break] . . default: sentencias que se ejecutan si no se cumple ninguna de las anteriores } Esta instrucción evalúa una expresión (que debe ser short, int, byte o char), y según el valor de la misma ejecuta instrucciones. Cada case contiene un valor de la expresión; si efectivamente la expresión equivale a ese valor, se ejecutan las instrucciones de ese case y de los siguientes. Formando Emprendedores De Calidad Para Un Mundo Empresarial 80 Instituto de Educación Superior “San Ignacio de Monterrico” La instrucción break se utiliza para salir del switch. De tal modo que si queremos que para un determinado valor se ejecuten las instrucciones de un apartado case y sólo las de ese apartado, entonces habrá que finalizar ese case con un break. El bloque default sirve para ejecutar instrucciones para los casos en los que la expresión no se ajuste a ningún case. Ejemplo 1: switch (diasemana) { case 1: dia=”Lunes”; break; case 2: dia=”Martes”; break; case 3: dia=”Miércoles”; break; case 4: dia=”Jueves”; break; case 5: dia=”Viernes”; break; case 6: dia=”Sábado”; break; Formando Emprendedores De Calidad Para Un Mundo Empresarial 81 Instituto de Educación Superior “San Ignacio de Monterrico” case 7: dia=”Domingo”; break; default: dia=”?”; } Ejemplo 2: switch (diasemana) { case 1: case 2: case 3: case 4: case 5: laborable=true; break; case 6: case 7: laborable=false; } 9.3 WHILE Formando Emprendedores De Calidad Para Un Mundo Empresarial 82 Instituto de Educación Superior “San Ignacio de Monterrico” La instrucción while permite crear bucles. Un bucle es un conjunto de sentencias que se repiten si se cumple una determinada condición. Los bucles while agrupan instrucciones las cuales se ejecutan continuamente hasta que una condición que se evalúa sea falsa. La condición se mira antes de entrar dentro del while y cada vez que se termina de ejecutar las instrucciones del while Sintaxis: while (condición) { sentencias que se ejecutan si la condición es true } Ejemplo (cálculo del factorial de un número, el factorial de 4 sería: 4*3*2*1): //factorial de 4 int n=4, factorial=1, temporal=n; while (temporal>0) { factorial*=temporal--; } 9.4 DO WHILE Crea un bucle muy similar al anterior, en la que también las instrucciones del bucle se ejecutan hasta que una condición pasa a ser falsa. La diferencia estriba en que en este tipo de bucle la condición se evalúa después de ejecutar las instrucciones; lo cual significa que al menos el bucle se ejecuta una vez. Sintaxis: do { instrucciones } while (condición) 9.5 FOR Formando Emprendedores De Calidad Para Un Mundo Empresarial 83 Instituto de Educación Superior “San Ignacio de Monterrico” Es un bucle más complejo especialmente pensado para rellenar arrays o para ejecutar instrucciones controladas por un contador. Una vez más se ejecutan una serie de instrucciones en el caso de que se cumpla una determinada condición. Sintaxis: for (expresiónInicial; condición; expresiónEncadavuelta) { instrucciones; } La expresión inicial es una instrucción que se ejecuta una sola vez: al entrar por primera vez en el bucle for (normalmente esa expresión lo que hace es dar valor inicial al contador del bucle). La condición es cualquier expresión que devuelve un valor lógico. En el caso de que esa expresión sea verdadera se ejecutan las instrucciones. Cuando la condición pasa a ser falsa, el bucle deja de ejecutarse. La condición se valora cada vez que se terminan de ejecutar las instrucciones del bucle. Después de ejecutarse las instrucciones interiores del bucle, se realiza la expresión que tiene lugar tras ejecutarse las instrucciones del bucle (que, generalmente, incrementa o decrementa al contador). Luego se vuelve a evaluar la condición y así sucesivamente hasta que la condición sea falsa. Ejemplo (factorial): //factorial de 4 int n=4, factorial=1, temporal=n; for (temporal=n;temporal>0;temporal--){ factorial *=temporal; } Sentencias De Salida De Un Bucle Formando Emprendedores De Calidad Para Un Mundo Empresarial 84 Instituto de Educación Superior “San Ignacio de Monterrico” 9.6 BREAK Es una sentencia que permite salir del bucle en el que se encuentra inmediatamente. Hay que intentar evitar su uso ya que produce malos hábitos al programar. 9.7 CONTINUE Instrucción que siempre va colocada dentro de un bucle y que hace que el flujo del programa ignore el resto de instrucciones del bucle; dicho de otra forma, va hasta la siguiente iteración del bucle. Al igual que ocurría con break, hay que intentar evitar su uso. Formando Emprendedores De Calidad Para Un Mundo Empresarial 85 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 10 CLASE MATH Y STRING Formando Emprendedores De Calidad Para Un Mundo Empresarial 86 Instituto de Educación Superior “San Ignacio de Monterrico” 10.1 CLASE STRING Para Java las cadenas de texto son objetos especiales. Los textos deben manejarse creando objetos de tipo String. Ejemplo: String texto1 = “¡Prueba de texto!”; Las cadenas pueden ocupar varias líneas utilizando el operador de concatenación “+”. String texto2 =”Este es un texto que ocupa “ + “varias líneas, no obstante se puede “+“perfectamente encadenar”; También se pueden crear objetos String sin utilizar constantes entrecomilladas, usando otros constructores: char[] palabra = {‘P’,’a’,’l’,’b’,’r’,’a’};//Array de char String cadena = new String(palabra); byte[] datos = {97,98,99}; String codificada = new String (datos, “8859_1”); En el último ejemplo la cadena codificada se crea desde un array de tipo byte que contiene números que serán interpretados como códigos Unicode. Al asignar, el valor 8859_1 indica la tabla de códigos a utilizar. Comparación Entre Objetos String Formando Emprendedores De Calidad Para Un Mundo Empresarial 87 Instituto de Educación Superior “San Ignacio de Monterrico” Los objetos String no pueden compararse directamente con los operadores de comparación. En su lugar se deben utilizar estas expresiones: • cadena1.equals(cadena2). El resultado es true si la cadena1 es igual a la cadena2. Ambas cadenas son variables de tipo String. • cadena1.equalsIgnoreCase(cadena2). Como la anterior, pero en este caso no se tienen en cuentas mayúsculas y minúsculas. • s1.compareTo(s2). Compara ambas cadenas, considerando el orden alfabético. Si la primera cadena es mayor en orden alfabético que la segunda devuelve 1, si son iguales devuelve 0 y si es la segunda la mayor devuelve -1. Hay que tener en cuenta que el orden no es el del alfabeto español, sino que usa la tabla ASCII, en esa tabla la letra ñ es mucho mayor que la o. • s1.compareToIgnoreCase(s2). Igual que la anterior, sólo que además ignora las mayúsculas (disponible desde Java 1.2) 10.2 STRING.VALUEOF Este método pertenece no sólo a la clase String, sino a otras y siempre es un método que convierte valores de una clase a otra. En el caso de los objetos String, permite convertir valores que no son de cadena a forma de cadena. Ejemplos: String numero = String.valueOf(1234); String fecha = String.valueOf(new Date()); En el ejemplo se observa que este método pertenece a la clase String directamente, no hay que utilizar el nombre del objeto creado (como se verá más adelante, es un método estático). 10.3 LA CLASE MATH Se echan de menos operadores matemáticos más potentes en Java. Por ello se ha incluido una clase especial llamada Math dentro del paquete java.lang Para poder utilizar esta clase, se debe incluir esta instrucción: Formando Emprendedores De Calidad Para Un Mundo Empresarial 88 Instituto de Educación Superior “San Ignacio de Monterrico” import java.lang.Math; Esta clase posee métodos muy interesantes para realizar cálculos matemáticos complejos. Por ejemplo: double x= Math.pow(3,3); //x es 33 Math posee dos constantes, que son: Por otro lado posee numerosos métodos que son: Formando Emprendedores De Calidad Para Un Mundo Empresarial 89 Instituto de Educación Superior “San Ignacio de Monterrico” Formando Emprendedores De Calidad Para Un Mundo Empresarial 90 Instituto de Educación Superior “San Ignacio de Monterrico” CAPITULO 11 ARREGLOS Formando Emprendedores De Calidad Para Un Mundo Empresarial 91 Instituto de Educación Superior “San Ignacio de Monterrico” 11.1 ARRAYS UNIDIMENSIONALES Un array es una colección de valores de un mismo tipo engrosados en la misma variable. De forma que se puede acceder a cada valor independientemente. Para Java además un array es un objeto que tiene propiedades que se pueden manipular. Los arrays solucionan problemas concernientes al manejo de muchas variables que se refieren a datos similares. Por ejemplo si tuviéramos la necesidad de almacenar las notas de una clase con 18 alumnos, necesitaríamos 18 variables, con la tremenda lentitud de manejo que supone eso. Solamente calcular la nota media requeriría una tremenda línea de código. Almacenar las notas supondría al menos 18 líneas de código. Gracias a los arrays se puede crear un conjunto de variables con el mismo nombre. La diferencia será que un número (índice del array) distinguirá a cada variable. En el caso de las notas, se puede crear un array llamado notas, que representa a todas las notas de la clase. Para poner la nota del primer alumno se usaría notas[0], el segundo sería notas[1], etc. (los corchetes permiten especificar el índice en concreto del array). La declaración de un array unidimensional se hace con esta sintaxis: tipo nombre[]; Ejemplo: double cuentas[]; //Declara un array que almacenará valores doubles Formando Emprendedores De Calidad Para Un Mundo Empresarial 92 Instituto de Educación Superior “San Ignacio de Monterrico” Declara un array de tipo double. Esta declaración indica para qué servirá el array, pero no reserva espacio en la RAM al no saberse todavía el tamaño del mismo. Tras la declaración del array, se tiene que iniciar. Eso lo realiza el operador new, que es el que realmente crea el array indicando un tamaño. Cuando se usa new es cuando se reserva el espacio necesario en memoria. Un array no inicializado es un array null. Ejemplo: int notas[]; //sería válido también int[] notas; notas = new int[3]; //indica que el array constará de tres //valores de tipo int //También se puede hacer todo a la vez //int notas[]=new int[3]; En el ejemplo anterior se crea un array de tres enteros (con los tipos básicos se crea en memoria el array y se inicializan los valores, los números se inician a 0). Los valores del array se asignan utilizando el índice del mismo entre corchetes: notas[2]=8; También se pueden asignar valores al array en la propia declaración: int notas[] = {8, 7, 9}; int notas2[]= new int[] {8,7,9};//Equivalente a la anterior Esto declara e inicializa un array de tres elementos. En el ejemplo lo que significa es que notas[0] vale 8, notas[1] vale 7 y notas[2] vale 9. En Java (como en otros lenguajes) el primer elemento de un array es el cero. El primer elemento del array notas, es notas[0]. Se pueden declarar arrays a cualquier tipo de datos (enteros, booleanos, doubles, ... e incluso objetos). Formando Emprendedores De Calidad Para Un Mundo Empresarial 93 Instituto de Educación Superior “San Ignacio de Monterrico” La ventaja de usar arrays (volviendo al caso de las notas) es que gracias a un simple bucle for se puede rellenar o leer fácilmente todos los elementos de un array: //Calcular la media de las 18 notas suma=0; for (int i=0;i<=17;i++){ suma+=nota[i]; } media=suma/18; A un array se le puede inicializar las veces que haga falta: int notas[]=new notas[16]; ... notas=new notas[25]; Pero hay que tener en cuenta que el segundo new hace que se pierda el contenido anterior. Realmente un array es una referencia a valores que se almacenan en memoria mediante el operador new, si el operador new se utiliza en la misma referencia, el anterior contenido se queda sin referencia y, por lo tanto se pierde. Un array se puede asignar a otro array (si son del mismo tipo): int notas[]; int ejemplo[]=new int[18]; notas=ejemplo; En el último punto, notas equivale a ejemplo. Esta asignación provoca que cualquier cambio en notas también cambie el array ejemplos. Es decir esta asignación anterior, no copia los valores del array, sino que notas y ejemplo son referencias al mismo array. Formando Emprendedores De Calidad Para Un Mundo Empresarial 94 Instituto de Educación Superior “San Ignacio de Monterrico” Ejemplo: int notas[]={3,3,3}; int ejemplo[]=notas; ejemplo= notas; ejemplo[0]=8; System.out.println(notas[0]);//Escribirá el número 8 11.2 ARRAYS MULTIDIMENSIONALES Los arrays además pueden tener varias dimensiones. Entonces se habla de arrays de arrays (arrays que contienen arrays) Ejemplo: int notas[][]; notas es un array que contiene arrays de enteros notas = new int[3][12];//notas está compuesto por 3 arrays //de 12 enteros cada uno notas[0][0]=9;//el primer valor es 0 Puede haber más dimensiones incluso (notas[3][2][7]). Los arrays multidimensionales se pueden inicializar de forma más creativa incluso. Ejemplo: int notas[][]=new int[5][];//Hay 5 arrays de enteros notas[0]=new int[100]; //El primer array es de 100 enteros notas[1]=new int[230]; //El segundo de 230 notas[2]=new int[400]; notas[3]=new int[100]; Formando Emprendedores De Calidad Para Un Mundo Empresarial 95 Instituto de Educación Superior “San Ignacio de Monterrico” notas[4]=new int[200]; Hay que tener en cuenta que en el ejemplo anterior, notas[0] es un array de 100 enteros. Mientras que notas, es un array de 5 arrays de enteros. Se pueden utilizar más de dos dimensiones si es necesario. 11.3 LONGITUD DE UN ARRAY Los arrays poseen un método que permite determinar cuánto mide un array. Se trata de length. Ejemplo (continuando del anterior): System.out.println(notas.length); //Sale 5 System.out.println(notas[2].length); //Sale 400 11.4 LA CLASE ARRAYS En el paquete java.utils se encuentra una clase estática llamada Arrays. Una clase estática permite ser utilizada como si fuera un objeto (como ocurre con Math). Esta clase posee métodos muy interesantes para utilizar sobre arrays. Su uso es Arrays.método(argumentos); 11.4.1 Fill Permite rellenar todo un array unidimensional con un determinado valor. Sus argumentos son el array a rellenar y el valor deseado: int valores[]=new int[23]; Arrays.fill(valores,-1);//Todo el array vale -1 También permite decidir desde que índice hasta qué índice rellenamos: Formando Emprendedores De Calidad Para Un Mundo Empresarial 96 Instituto de Educación Superior “San Ignacio de Monterrico” Arrays.fill(valores,5,8,-1);//Del elemento 5 al 7 valdrán -1 11.4.2 Equals Compara dos arrays y devuelve true si son iguales. Se consideran iguales si son del mismo tipo, tamaño y contienen los mismos valores. 11.4.3 Sort Permite ordenar un array en orden ascendente. Se pueden ordenar sólo una serie de elementos desde un determinado punto hasta un determinado punto. int x[]={4,5,2,3,7,8,2,3,9,5}; Arrays.sort(x);//Estará ordenado Arrays.sort(x,2,5);//Ordena del 2º al 4º elemento 11.4.4 BinarySearch Permite buscar un elemento de forma ultrarrápida en un array ordenado (en un array desordenado sus resultados son impredecibles). Devuelve el índice en el que está colocado el elemento. Ejemplo: int x[]={1,2,3,4,5,6,7,8,9,10,11,12}; Arrays.sort(x); System.out.println(Arrays.binarySearch(x,8));//Da 7 11.4.5 System.arraysCopy Formando Emprendedores De Calidad Para Un Mundo Empresarial 97 Instituto de Educación Superior “San Ignacio de Monterrico” La clase System también posee un método relacionado con los arrays, dicho método permite copiar un array en otro. Recibe cinco argumentos: el array que se copia, el índice desde que se empieza a copia en el origen, el array destino de la copia, el índice desde el que se copia en el destino, y el tamaño de la copia (número de elementos de la copia). int uno[]={1,1,2}; int dos[]={3,3,3,3,3,3,3,3,3}; System.arraycopy(uno, 0, dos, 0, uno.length); for (int i=0;i<=8;i++){ System.out.print(dos[i]+" "); } //Sale 112333333 Formando Emprendedores De Calidad Para Un Mundo Empresarial 98 Instituto de Educación Superior “San Ignacio de Monterrico” BIBLIOGRAFIA • 1001 Tips Para Programar Con Java de Vásquez Paragulla. • Java 2 de Ceballos F. J. • Programación en Java con Jbuilder: Erika Alarcón HerreraChristian Crovetto Huerta • El descubrimiento de Java Mark Samns Formando Emprendedores De Calidad Para Un Mundo Empresarial 99