Capítulo 1: Conceptos Básicos 1.1 Introducción 1.1.1 Antecedentes La POO permite fabricar programas de forma más parecida al pensamiento humano, de hecho simplifica el problema dividiéndolo en objetos y permitiendo centrarse en cada objeto, para en esa forma eliminar la complejidad. Cada objeto se programa de forma autónoma y esa es la principal virtud. La Programación Orientada a Objetos tiene las siguientes ventajas respecto a otros paradigmas de la programación: Fomenta la reutilización y extensión del código. Facilita el mantenimiento del software. Permite crear sistemas más complejos. Agiliza el desarrollo de software. Facilita la creación de programas visuales. Facilita el trabajo en equipo. Permite relacionar el sistema con el mundo real. Los principales inconvenientes serían los siguientes: Se tiene que conocer muy bien la metodología Orientada a Objetos para poder sacar provecho de sus beneficios. Al principio del desarrollo de una aplicación pareciera presentar gran cantidad de código, pero esto a la larga se convierte en un beneficio debido a la reutilización. Al aparecer la programación orientada a objetos (en los ochenta), aparecieron varios lenguajes orientados a objetos y también se realizaron versiones orientadas a objetos (o semi-orientadas a objetos) de lenguajes clásicos. Una de las más famosas fue el lenguaje orientado a objetos creado a partir del C tradicional. Se le llamó C++ indicando con esa simbología que era un incremento del lenguaje C. La principal ventaja que añadió C++ al C fue el soporte para objetos (POO). C++ pasó a ser el lenguaje de programación más popular a principios de los 90 (sigue siendo un lenguaje muy utilizado). Otras adaptaciones famosas fueron: El paso de Pascal a Turbo Pascal y posteriormente a Delphi. El paso de Basic a QuickBasic y después a Visual Basic. Pero el crecimiento vertiginoso de Internet iba a propiciar un profundo cambio. Fig.1.1 Aparición de distintos lenguajes de programación Java es un lenguaje de programación creado para satisfacer una necesidad de la época (así aparecen todos los lenguajes) planteada por nuevos requerimientos hacia los lenguajes existentes. 1.1.2 Aparición de Java En 1991, la empresa Sun Microsystems crea el lenguaje Oak (de la mano del llamado proyecto Green). Mediante este lenguaje se pretendía crear un sistema de televisión interactiva. Este lenguaje sólo se llegó a utilizar de forma interna. Su propósito era crear un lenguaje independiente de la plataforma y para uso en dispositivos electrónicos. Se intentaba con este lenguaje paliar el problema fundamental del C++; que consiste en que al compilar se produce un fichero ejecutable cuyo código sólo vale para la plataforma en la que se realizó la compilación. Sun deseaba un lenguaje para programar pequeños dispositivos electrónicos. La dificultad de estos dispositivos es que cambian continuamente y para que un programa funcione en el siguiente dispositivo aparecido, hay que rescribir el código. Por eso Sun quería crear un lenguaje independiente del dispositivo. En 1995 pasa a llamarse Java y se da a conocer al público. Adquiere notoriedad rápidamente. Java pasa a ser un lenguaje totalmente independiente de la plataforma y a la vez potente y orientado a objetos. Esa filosofía y su facilidad para crear aplicaciones para redes TCP/IP ha hecho que sea uno de los lenguajes más utilizados en la actualidad. La versión actual de Java es el llamado Java SE 6. Actualmente la empresa Oracle Corporation adquirió los derechos sobre la empresa Sun Microsystems, y es quien hoy en día está a cargo del seguimiento de Java así como de otros productos ofrecidos originalmente por Sun, entre los que se encuentra el popular manejador de bases de datos MySQL entre otros. Sus ventajas son: Su sintaxis es similar a C y C++ No hay apuntadores (lo que lo hace más seguro) Muy preparado para aplicaciones TCP/IP Implementa excepciones de forma nativa Es interpretado / precompilado Permite multihilos (Multi-thread) Tipos de datos y control de sintaxis más rigurosa Totalmente orientado a objetos Es independiente de la plataforma Quizá la ventaja más importante es la independencia de plataforma, y posiblemente la segunda característica más importante es que es orientado a objetos, los programas orientados a objetos son más fáciles de entender y consumen menos tiempo al momento de darles mantenimiento a diferencia de los programas no orientados a objetos. 1.1.3 Crecimiento de Java Java ha madurado inmensamente en años recientes, particularmente desde la introducción de Java 2. La amplitud de funciones provistas por el núcleo de Java ha crecido increíblemente. Java provee al desarrollador con herramientas para construir diversos tipos de aplicaciones, ya sean graficas, de acceso a bases de datos o de comunicación con computadoras remotas a través de una red. Prácticamente cualquier tipo de aplicación puede ser programada en Java de manera efectiva, con la conveniencia implícita de la portabilidad. Por supuesto, Java todavía está en desarrollo y en constante crecimiento. 1.1.4 Programas en Java Hay dos tipos básicos de programas que se pueden escribir en Java. Programas que pueden ser empotrados en una página web (applets, servlets), y programas autónomos llamados aplicaciones Java. Las aplicaciones Java se pueden subdividir en aplicaciones de consola, las cuales solamente soportan la salida de caracteres a la pantalla de la computadora (aplicaciones de consola, por ejemplo salida a la línea de comandos de Windows) y en aplicaciones con ventanas (aplicaciones graficas), en las cuales se pueden crear y manipular múltiples ventanas además de menús, barras de herramientas, ventanas de dialogo, botones, etc. 1.1.5 Proceso de compilación 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. En Java la independencia de plataforma se consigue ya que el código Java no se compila, sino que se precompila, de tal forma que se crea un código intermedio que no es ejecutable. Para ejecutarle hace falta pasarle por un intérprete que va ejecutando cada línea. Ese intérprete suele ser la máquina virtual de Java. Fig.1.2 Proceso de compilación de un Programa C++ Fig.1.3 Proceso de compilación de un Programa Java 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). 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 que sea para esa plataforma). La máquina virtual de Java, 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). En Java la unidad fundamental del código es la clase. Son las clases las que se distribuyen en el formato bytecode de Java. Estas clases se cargan dinámicamente durante la ejecución del programa Java. 1.1.6 Kit de desarrollo de Java (JDK) Para escribir en Java hacen falta los programas que realizan el precompilado y la interpretación del código, Hay entornos que permiten la creación de los bytecodes y que incluyen herramientas con capacidad de ejecutar aplicaciones de todo tipo. El más famoso (que además es gratuito) es el Java Developer Kit (JDK) de Sun/Oracle, que se encuentra disponible en la dirección : http://java.sun.com/javase/downloads/index.jsp. No hay que confundir el JDK con el JRE. El JDK es como ya mencione el kit de desarrollo necesarios para realizar aplicaciones, mientras que el JRE es el interprete el cual es el encargado de ejecutar las aplicaciones hechas en Java, existe una versión JRE para cada plataforma, este interprete incluye lo que se conoce como JVM (Maquina Virtual de Java) y se puede descargar desde: http://java.com/en/download/inc/windows_upgrade_ie.jsp . 1.1.7 Versiones A través de los años Java ha venido creciendo considerablemente, a continuación se muestra una breve evolución: Tabla 1.1 Versiones del lenguaje java. 1.2 Estructura de archivos en Java Al llevar a cabo la instalación del kit de desarrollo de java, se crearán en el disco duro una serie de directorios los cuales contendrán diversos archivos para el correcto funcionamiento de Java, normalmente la carpeta raíz se nombra de acuerdo a la versión instalada en ese momento. Sin embargo tal directorio raíz puede ser nombrado de forma diferente, según criterio del usuario. Fig.1.4 – Estructura de directorios en Java 1.3 Escritura de programas en Java Los archivos con código fuente en Java deben guardarse con la extensión .java. Como se ha comentado cualquier editor de texto basta para crearle. Algunos detalles importantes básicos son: En java hay diferencia entre mayúsculas y minúsculas (como en C++). Cada línea de código debe terminar con ; Los comentarios: Si son de una línea debe comenzar con “//” // comentario de una sola línea Si ocupan más de una línea deben comenzar con “/*” y terminar con “*/” /* Comentario de varias líneas */ También se pueden incluir comentarios javadoc /** forma de manejo de comentarios * para generación de documentación automatica * mediante el comando javadoc * @author jcarlos */ Más adelante veremos un poco más acerca del manejo de este último tipo de comentarios javadoc. 1.4 Entornos de Desarrollo Integrados (IDE) El código en Java se puede escribir en cualquier editor de texto. Y para compilar el código en bytecodes, sólo hace falta descargar la versión del JDK deseada. Sin embargo, la escritura y compilación de programas así utilizada es un poco incomoda. Por ello numerosas empresas fabrican sus propios entornos de edición, algunos incluyen el compilador y otras utilizan el propio JDK de Sun. Existen diversos entornos de desarrollo para trabajar con Java por ejemplo Eclipse, Microsoft Visual J++, Visual J#, JBuilder y NetBeans, éste ultimo sin duda uno de los más populares. NetBeans es un entorno gratuito de código abierto para la generación de código en diversos lenguajes (especialmente pensado para Java). Contiene prácticamente todo lo que se suele pedir a un IDE, editor avanzado de código, depurador, diversos lenguajes, extensiones de todo tipo (CORBA, Servlets, etc.). Incluye además un servidor de aplicaciones Tomcat para probar aplicaciones de servidor. Se descarga en www.netbeans.org. 1.5 Estructura básica de una aplicación en Java En Java la unidad fundamental del código es la clase. Son las clases las que se distribuyen en el formato bytecode de Java. Estas clases se cargan dinámicamente durante la ejecución del programa Java. Resumamos como se estructura un programa en Java: Un programa en Java siempre consiste de una o más clases Típicamente se coloca el código de programa para cada clase en un archivo por separado, y se le debe dar a cada archivo el mismo nombre con que la clase haya sido definida dentro de él. Un archivo fuente de Java debe tener la extensión .java Tales archivos pueden estar organizados dentro de carpetas o mejor dicho en paquetes (package). Fig.1.6 Estructura básica de un programa en Java Fig.1.7 Detalle de instrucción para dar salida a pantalla Fig.1.8 Detalle de la estructura básica de un programa en Java 1.6 Variables y tipos de datos 1.6.1 Variables Las variables se utilizan para almacenar datos asociados a nombres. Cada variable tiene un nombre que sirve de referencia para introducir datos o acceder a ellos. Un ejemplo de utilización de variable es Edad = 23; en este caso, introducimos el valor numérico 23 en la variable con nombre Edad. Curso Los nombres de las variables, en Java, pueden tener cualquier longitud y deben comenzar con una letra, el símbolo de subrayado “_” o el signo de dólar ”$”. El resto de los caracteres del nombre pueden ser cualquiera, salvo los que pueden dar lugar a confusión, como los operadores (+, -, *, etc.). Por ejemplo, sería correcto el nombre de variable MiAmigoMasQuerido, pero no el de MiAmigo+Querido, puesto que en este último caso el compilador interpretaría que hay que sumar el contenido de la variable MiAmigo con el contenido de la variable Querido. Los nombres de variables tampoco deberán tener espacios en blanco. Por último, los nombres de variables no deben coincidir con palabras reservadas (tales como public, static, class, vois, main, etc.). Puesto que estos identificadores tienen un significado especial para el compilador. En Java, por convención los identificadores de variables suelen definirse empezando por un carácter en minúscula, por ejemplo contador. Si en el identificador existe más de una palabra, los comienzos del resto de las palabras se ponen con mayúsculas, ejemplo: contadorDeAciertos. Veamos una serie de casos de identificadores de variables correctos e incorrectos: 1.6.2 Declaración de Variables Antes de poder utilizar una variable, ésta se debe declarar. Lo cual se debe hacer de esta forma: tipo nombrevariable; Donde: - tipo es el tipo de datos que almacenará la variable (texto, números enteros, etc.) - nombrevariable es el nombre con el que se conocerá la variable. Ejemplos: int dias; boolean decision; 1.6.3 Tipos de datos primitivos A continuación se establece una relación de los tipos de datos primitivos que proporciona el lenguaje: Tipo boolean byte short int Bytes que ocupa 2 1 2 4 long double float char 8 8 4 2 Rango de valores true, false -128 a +127 -32,768 a 32767 -2,147,483,648 2,147,483,647 -9 · 1018 a 9 · 1018 -1.79 · 10308 a 1.79 · 10308 -3.4 · 1038 a 3.4 · 1038 Caracteres (en Unicode) a 1.6.4 Conversión de tipos (Casting) Conversión automática de tipos Cuando el tipo del resultado de una expresión aritmética a la derecha de un operador de asignación difiere del tipo de la variable del lado izquierdo, se aplicará una conversión automática al resultado de tal manera que no haya posibilidad de pérdida de información. Secuencia de conversión de un tipo a otro se daría de la siguiente manera de forma natural. byte short int long float double Conversión explicita de 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 1.7 Operadores Aritméticos, Lógicos y de Comparación ¿Qué operadores hay en Java? Esta es la lista: -- (decremento) - (resta) ! (No lógico) != (distinto) % (módulo) %= (asignación del módulo) & (AND a nivel de bit) && (AND) &= (asignación de AND) * (multiplicación) *= (asignación del producto) / (división) /= (asignación de la división) ?: (if-then-else) ^ (Xor a nivel de bit) ^= (asignación de Xor) | (OR a nivel de bit) || (OR) |= (asignación de OR) - (NOT unario a nivel de bit) + (suma) ++ (incremento) += (asignación de la suma) < (menor que) << (desplazamiento de bits hacia la izquierda) <<= (asignación del desplazamiento de bits a la izquierda) <= (menor o igual que) = (asignación) -= (asignación de la resta) == (igual a) > (mayor que) >= (mayor o igual que) >> (desplazamiento a la derecha) >>= (asignación del desplazamiento a la derecha) >>> (desplazamiento a la derecha con relleno de ceros) >>>= (asignación del desplazamiento a la derecha con relleno de ceros) Precedencia de operadores Precedencia de operadores Asociatividad (), [], postfijo ++, postfijo -unario +, unario -, prefijo ++, prefijo --, ~, ! (type), new *, /, % +, <<, >>, >>> < ,<= , >, >=, instanceof ==, != & ^ | && || ?: =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, |=, ^= Izquierda Derecha Izquierda Izquierda Izquierda Izquierda Izquierda Izquierda Izquierda Izquierda Izquierda Izquierda Izquierda Izquierda Derecha