Introducción al lenguaje de programación Java. Amilcar Meneses Viveros

Introducci´on al lenguaje de programaci´on Java Amilcar Meneses Viveros June 10, 2002 Contenido 1 Componentes y principios de una computadora 1.1 1.2 1.3 Componentes l´ogicos de una computadora . . . . . . . . . . . . . . . . . . . 3 1.1.1 La Unidad Central de Procesos (CPU) . . . . . . . . . . . . . . . . . 3 1.1.2 La memoria principal . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.3 Los dispositivos de entrada y salida . . . . . . . . . . . . . . . . . . . 4 Aritm´etica binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.1 N´ umeros negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Creando programas: c´odigo de m´aquina, otros lenguajes, y el lenguaje de programaci´on Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2 Desarrollo de software 2.1 3 11 Paradigmas de Programaci´on . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1.1 Desarrollo de productos . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2 Desarrollo de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3 Componentes principales de un programa Java . . . . . . . . . . . . . . . . . 15 2.3.1 El kit de desarrollo de Java (JDK) . . . . . . . . . . . . . . . . . . . 17 2.3.2 Desarrollando un programa en Java . . . . . . . . . . . . . . . . . . . 17 Programas con tecnolog´ıa a objetos Java, y programas procedurales . . . . . 18 2.4 1 3 Reglas del lenguaje Java y herramientas 3.1 20 Comentarios, declaraciones, bloques de c´odigo, y espacios en blanco . . . . . 21 3.1.1 Estilo de comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.1.2 Declaraciones o proposiciones . . . . . . . . . . . . . . . . . . . . . . 22 3.1.3 Espacios en blanco . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2 Identificadores, palabras reservadas, y palabras clave . . . . . . . . . . . . . 22 3.3 Variables y constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.4 Valores literales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.5 Convenci´on de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4 Constructores de programas Java sencillos 4.1 4.2 28 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.1.1 Operadores unarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.1.2 Operadores aritm´eticos. . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.1.3 Operadores relacionales . . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.1.4 Operadores l´ogicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.1.5 Operadores para manejo de bits. . . . . . . . . . . . . . . . . . . . . 31 4.1.6 Operador terciario de asignaci´on condicional. . . . . . . . . . . . . . . 31 4.1.7 Operadores de asignamiento . . . . . . . . . . . . . . . . . . . . . . . 31 Constructores if y while . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.2.1 El constructor if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.2.2 El constructor while . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5 Constructores de programas Java avanzados 2 34 5.1 5.2 Ciclos for y do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.1.1 El constructor for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.1.2 El constructor do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Declaraciones switch, break y continue . . . . . . . . . . . . . . . . . . . . 35 5.2.1 La declaraci´on switch . . . . . . . . . . . . . . . . . . . . . . . . . . 35 5.2.2 La declaraci´on break . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.2.3 La declaraci´on continue . . . . . . . . . . . . . . . . . . . . . . . . . 37 6 Orientaci´ on a Objetos 38 6.1 Encapsulamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.2 Las clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.2.1 39 6.3 Campos y m´etodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . Restricciones al acceso de datos (modificadores public y private) . . . . . 40 6.3.1 El identificador public . . . . . . . . . . . . . . . . . . . . . . . . . . 40 6.3.2 El identificador private . . . . . . . . . . . . . . . . . . . . . . . . . 41 7 M´ etodos 7.1 43 Escribiendo e invocando m´etodos . . . . . . . . . . . . . . . . . . . . . . . . 43 7.1.1 M´etodos de la instancia . . . . . . . . . . . . . . . . . . . . . . . . . 44 7.2 M´etodos de la clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 7.3 Referencia this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 7.4 Paso de par´ametros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 7.5 Sobrecarga de m´etodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3 8 Arreglos 52 8.1 Declarando e instanciando arreglos . . . . . . . . . . . . . . . . . . . . . . . 52 8.2 Inicializando arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 8.3 Arreglo de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 9 Orientaci´ on a Objetos avanzada 56 9.1 Constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 9.2 La herencia es una relaci´on “es un” . . . . . . . . . . . . . . . . . . . . . . . 58 9.3 La composici´on es una relaci´on “tiene un” . . . . . . . . . . . . . . . . . . . 59 9.4 Clases abstractas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 9.5 Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4 Introducci´ on El desarrollo de tecnolog´ıas de software a evolucionado desde el inicio de la computaci´on. Actualmente la tecnolog´ıa de vanguardia es la Orientaci´ on a Objetos, sin embargo ´esta no debe considerarse s´olo como una tecnolog´ıa de moda y pasajera, pues bastante trabajo de investigaci´on en diferentes ramas de las ciencias de la computaci´on la respaldan como una tecnolog´ıa s´olida y con fuertes perspectivas para el futuro de la programaci´on. Existen diferentes lenguajes orientados a objetos, como son Small Talk, Objective C, C++ y Java. Particularmente, Java est´a alcanzando una popularidad notoria en el desarrollo de software orientado a objetos por diferentes razones, entre las que destacan: lenguaje totalmente orientado a objetos, su alta portabilidad y ser un lenguaje lenguaje muy utilizado en la tecnolog´ıa Web. En este manual est´a dirigido a aquellas personas que tengan algunos conocimientos b´asicos de computaci´on y que deseen aprender a programar utilizando tecnolog´ıa Java. Este manual esta dividido en nueve cap´ıtulos, en los dos primeros se discuten principios b´asicos de computaci´on y de desarrollo de software. En el tercer cap´ıtulo se discute la insfraestructura de Java y los componentes principales de un programa Java. En los cap´ıtulos cuatro y cinco se discuten las declaraciones para el flujo de control del programa Java. En el sexto cap´ıtulo se ver´an los primeros elemento escenciales de la orientaci´on a objeotos: la abstracci´on y el encapsulamiento. El s´eptimo cap´ıtulo se discute la manera de construir m´etodos. El octavo cap´ıtulo se centra en el manejo de arreglos. Y finalmente, el noveno cap´ıtulo se utiliza para discutir algunos aspectos avanzados de la orientaci´on a objetos y su implantaci´on en Java. 5 Cap´ıtulo 1 Componentes y principios de una computadora Existen diferentes definiciones de computadora, muchos autores se refieren a este t´ermino como un componente electr´onico capaz de procesar una entrada. Otros se refieren a una computadora como la implantaci´on de una m´aquina universal de Turing. Algunos ven a la computadora como una m´aquina con capacidad de simular otras m´aquinas. En este cap´ıtulo discutiremos los componentes l´ogicos de una computadora y sus principios b´asicos de funcionamiento. 1.1 Componentes l´ ogicos de una computadora El esquema m´as sencillo de una computadora contiene una Unidad Central de Procesos (CPU), memoria principal y dispositivos de entrada y salida, ver figura 1. Adicionalmente, se ha agregado un canal de comunicaci´on entre los dispositivos de entrada y salida y la memoria para acelerar la transferencia de datos entre estos componentes. 1.1.1 La Unidad Central de Procesos (CPU) La parte principal de la computadora es el CPU, tambi´en conocido como procesador. Esta unidad se encarga de buscar instrucciones en la memoria y ejecutarlas. Para ejecutar una instrucci´on se sigue una secuencia de pasos que varia de procesador a procesador, pero la idea general es la siguiente: 6 1. Se busca una instrucci´on en una localidad de memoria. 2. Se decodifica para saber si la instrucci´on tiene datos con los que operar´a. 3. En caso de tener datos se cargan (de la memoria, de los registros del procesador, o de alg´ un dispositivo de entrada/salida). 4. Se ejecuta la instrucci´on. 5. Se almacena el resultado en la memoria. Para este prop´osito, el CPU contiene dos uniades internas: la Unidad Aritm´etica L´ogica (ALU) y la Unidad de Control (CU). La ALU se encarga de realizar operaciones aritm´eticas y l´ogicas, y la CU se encarga de coordinar las actividades internas y determina que operaciones se deben realizar y en que orden. 1.1.2 La memoria principal Existen diferentes tipos de memoria, aqui nos referimos a la memoria principal denominada RAM (memoria de acceso aleatorio). En esta memoria se almacenan los programas y datos con que se vana procesar. Las instrucciones que ejecuta el CPU las busca en esta memoria a trav´es de direcciones. De hecho, para hacer referencia a una localidad de memoria o byte se hace a trav´es de una direcci´on de memoria. La cantidad de memoria disponible en una computadora est´a relacionada con la capacidad que tenga el procesador, es decir, el procesador puede hacer una combinaci´on entre el n´ umero de bits que utilice para hacer referencia a una localidad de memoria y la incorporaci´on de diferentes mecanismos de rendimiento de manejo de memoria, como son paginaci´on y segmentaci´on. La memoria principal tiene laracter´ıstica de ser vol´atil, es decir, lo que est´e almacenado en esta memoria se pierde cuando se apaga la computadora. 1.1.3 Los dispositivos de entrada y salida Estos dispositivos forman el conjunto de perif´ericos conectados a la computadora, tienen la caracter´ıstica de proporcionar la interfaz con el usuario, proporcionar la comunicaci´on con algun otro dispositivo electr´onico (por ejemplo modems), y de proporcionar dispositivos de almacenamiento secundario (como son discos duros y cintas magn´eticas). Los dispositivos que realizan la interfaz con usuario establecen el puente de comunicaci´on la computadora y el hombre. Estos dispositivos han evolucionado tanto, que el uso de una computadora resulta extremadamente sencillo e intuitivo. Estos dispositivos i 4ncluyen al teclado, rat´on, monitor, graficadores e impresoras, entre otros. 7 Los dispositivos de comunicaci´on con otros dispositivos electr´onicos (incluyendo computadoras) se utilizan para enviar informaci´on a la computadora desde un lugar remoto. Estos dispositivos incluyen modems y tarjetas de red. Los dispositivos de almacenamiento se utilizan para respaldar la informaci´on que se encuentra en la memoria RAM. A estos dispositivos tambi´en se les conoce como dispositivos de almacenamiento secundario. A diferencia de la memoria RAM estos dispositivos son mec´anicos, lo que provoca que sean mas lentos. Dispositovs de este tipos son los discos duros, discos flexibles, cintas magn´eticas y discos ´opticos. 1.2 Aritm´ etica binaria Una computadora trabaja en base 2 debido a que u ´nicamente puede distinguir entre los dos valores posibles de un bit: 0 y 1. . Los datos en una computadora est´an en bloques de 8 bits que conforman 1 byte. Una colecci´on de d´ıgitos binarios (bits) pueden representar cualquier valor. El valor de de un n´ umero binario se basa en la posici´on relativa de cada bit y en la presencia del valor 1. El siguiente n´ umero binario tiene todos los bits encendidos. Valor por posici\’on: Valor del bit: 128 64 32 16 8 4 2 1 1 1 1 1 1 1 1 1 Se asume que el bit m´as a la derecha tiene el valor de 1, el siguiente 2, el siguiente 4, y asi en potencias de 2. En este caso el valor de los bits encendidos es 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255( ´o 28 − 1). Para el valor binario de 00100110, el valor de los bits encendidos es 2 + 4 + 32 = 38. Una computadora ejecuta aritm´etica u ´nicamente en forma binaria. La operaci´on b´asica que realiza una computadora es una suma, veamos: Suma binaria La suma binaria se basa en la siguiente regla de suma: 0+0 = 0 8 0+1 1+0 1+1 1+1+1 = = = = 1 1 10 11 Note que las dos u ´ltimas operaciones acarrean 1 bit. Veamos ahora el resultado de sumar 65 m´as 42: Binario 01000001 00101010 01101011 Decimal 65 42 107 Y verificamos que 01101011 es 1 + 2 + 8 + 32 + 64 = 107. 1.2.1 N´ umeros negativos Hasta el momento hemos visto n´ umeros positivos. Para establecer el signo en n´ umeros binarios se toma el bit m´as a la izquierda como signo, tal que si esta en cero entonces es positivo y si est´a en uno entonces es negativo. As´ı, un n´ umero negativo contiene un bit encendido en la posici´on m´as a la izquierda, y adem´as se expresa en notaci´on complemento a dos. Esto es, para representar un n´ umero binario como negativo, hay que invertir todos los bits y sumarle 1. Veremos el ejemplo del n´ umero 01000001: Numero 65 01000001 Bits invertidos 10111110 Sumando 1 10111111 (es igual a -65) Si sumamos los bits encendidos de este nuevo n´ umero no obtenemos 65. Sin embargo, recuerde que un n´ umero negativo se identifica por el bit encendido m´as a la izquierda. Para determinar el valor absoluto de un n´ umero negativo hay que repetir la operaci´on anterior: invertir bits y sumar 1: Valor binario 10111111 Bits invertidos 01000000 Sumando 1 01000001 (es igual a +65) La suma de +65 y −65 debe ser 0, veamos: 9 01000001 10111111 (1)00000000 (+65) (-65) El valor de los ocho primeros bits (de derecha a izquierda) son 0. El bit de acarreo de la izquierda se pierde, con lo que el resultado es correcto. Realizar la resta es muy sencilla: invertir el signo del n´ umero que se va a sustraer y sumar los dos n´ umeros. Por ejemplo, restemos 42 a 65. La representaci´on binaria de 42 es 00101010 y su complemento a dos es 11010110: 65 01000001 +(-42) 11010110 23 (1)00010111 El resultado 23 es correcto. Nuevamente el bit de signo de acarreo se ignora. Si la justificaci´on del complemento a dos no es suficientemente clara, considere la siguiente proposici´on: ?Qu´e n´ umero tengo que sumar a 00000001 para obtener un 00000000?. En t´erminos de n´ umeros decimales la respuesta es −1. Para n´ umeros binarios, la respuesta es 11111111, como sigue: Resultado 00000000 11111111 (1)00000000 Ignorando el acarreo, se observa que el n´ umero 11111111 es equivalente al n´ umero decimal −1. Se puede observar que el patr´on de n´ umeros binarios decrese en valor: +3 +2 +1 0 -1 -2 -3 00000011 00000010 00000001 00000000 11111111 11111110 11111101 Y como se puede ver, el valor 0 de los bits indica su valor: trate el valor de posici´on de cada bit apagado como si fuera un bit encendido, sume sus valores y agrege 1. 10 1.3 Creando programas: c´ odigo de m´ aquina, otros lenguajes, y el lenguaje de programaci´ on Java Un programa que se quiere ejecutar debe almacenarse en la memoria principal de la computadora. Este programa se encuentra como una secuencia de bytes, cuando un procesador lee estos bytes lo decodifica para saber el tipo de instrucci´on que se ejecutar´a. Esta representaci´on de instrucciones en bytes se le conoce como lenguaje de m´aquina, ya que cada procesador codifica de manera diferente sus instrucciones. En las primeras computadoras, su programarci´on consist´ıa en meter una secuencia de ceros y unos, y el programador deb´ıa conocer el lenguaje de m´aquina. Sin embargo esto era muy tardado y era imposible encontrar errores en programas grandes. As´ı, se ide´o asociar mnem´onicos al c´odigo de m´aquina, lo cual di´o origen a los lenguajes ensambladores, de hecho programar en ensamblador es programar en c´odigo de m´aquina, porlo que a estos lenguajes se les conoce como lenguajes de bajo nivel. La programaci´on se hizo un poco mas sencilla, pero s´olo los expertos pod´ıan programar, y los programas no eran portables, es decir, no pod´ıan pasar de una computadora a otra si ten´ıan diferentes instrucciones de m´aquina. Para facilitar la tarea de programaci´on se ide´o hacer un lenguaje de programaci´on que fuera f´acil de entender para el programador y que utilizara algunas reglas del lenguaje natural, as´ı a finales de la d´ecada de los 60 aparecieron los primeros lenguajes de alto nivel como FORTRAN, COBOL y ALGOL. Hasta la fecha han surgido una gran cantidad de lenguajes de programaci´on de alto nivel, sin embargo la mayor´ıa sigue el siguiente patr´on para poder ejecutarse. 1. Se escribe el programa en lenguaje de alto nivel 2. Se convierte el programa de alto nivel a lenguaje de bajo nivel 3. Se ejecuta. Al proceso de conversi´on de un programa de alto nivel a un programa de bajo nivel, se le conoce como compilaci´on, y al programa que lo hace, se le denomina compilador. As´ı podemos encontar un compilador para cada lenguaje de programaci´on. Como se ha mencionado existe una gran cantidad de lenguajes de programaci´on, entre los que destacan por su popularidad C. Este lenguaje fue exitoso debido a que el c´odigo del sistema operativo UNIX estaba escrito en este lenguaje (UNIX fue el primer sistema operativo que se escribi´o en lenguaje de alto nivel), por lo que si alguien quer´ıa tener este sistema operativo en su m´aquina, s´olo deb´ıa construir un compilador de C, esta tarea no es muy f´acil, pero involucra menos trabajo que construir todo un sistema operativo. C ha sido tan popular que 11 otros lenguajes se han desarrollado a partir de ´el, por ejemplo: C++, Objective C y Java. Este u ´ltimo lenguaje es el que a nosotros nos interesa. Java es otro lenguaje de programaci´on de computadoras, sin embargo tiene dos grandes ventajas a su favor: los programas compilados en Java corren en casi todas las plataformas que tengan la m´aquina virtual de Java y es un lenguaje de programaci´on otientado a objetos. El punto d´ebil de los programas escritos en C, y de la mayor´ıa de los programas escritos con otros lenguajes de alto nivel, es que como est´an en c´odigo de m´aquina (o c´odigo objeto), estos programas no pueden ejecutarse en otra computadora a menos que se lleve el programa en alto nivel (c´odigo fuente) y se compile. Los programas en Java tiene la ventaja de que est´an codificados con las instrucciones de la m´aquina virtual de Java. Una m´aquina virtual es una m´aquina que no existe, sin embargo, existe un programa que se encarga de simularla, es decir, de simular las instrucciones de la m´aquina de Java con las instrucciones del procesador sobre el cual se est´a ejecutando. De esta forma, cuando deseemos ejecutar un programa Java en una computadora espec´ıfica, se debe ejecutar sobre la m´aquina virtual de Java. La presencia de ´esta maquina virtual lo hace ideal para resolver problemsa de programaci´on en el World Wide Web. El Web es la red mundial de computadoras, y por ende, las plataformas (hardware y sistema operativo) var´ıan mucho, sin embargo esto no es impedimento para ejecutar programas de Java. Por otro lado, Java es un lenguaje de programaci´on orientado a objetos, lo cual de dar´a muchas facilidades de dise˜ no, desarrollo y mantenimiento de sistemas de software. Ejercicios Defina que es una computadora 1. ¿Qu´e es la memoria RAM? 2. ¿Para que se utiliza el DMA? 3. Mencione 2 dispositivos que se utilicen como entrada y salida. 4. ¿Cual es la secuencia de pasos que sigue un procesador para ejecutar una instrucci´on? 5. ¿Cual es el valor decimal del n´ umero binario 00111101? 6. Realice la suma binaria de los n´ umeros 00010001 y 00001111, y verifique el resultado en decimal. 7. ¿Cual es la representaci´on binaria del n´ umero -8? 8. ¿Realice la substracci´on de 11000110 y 00010011? 9. ¿Cual es la funci´on de un compilador? 12 Laboratorio 1. Determine los dispositivos de entrada y salida de su computadora. 2. Determine cual es el procesador de su computadora 3. Determine cual es el sistema operatio de su computadora 13 Cap´ıtulo 2 Desarrollo de software Debido a que el desarrollo de grandes sistemas de informaci´on contiene una gran cantidad de casos de estudio y gran cantidad de m´odulos de c´odigo, se genera que el desarrollo de programas sea una tarea compleja y costosa. De hecho generar sistemas con una buena confiabilidad1 es un reto para todos lo equipos de desarrollo de software. Podemos procurar la confiabilidad de un sistema de software a trav´es de metodolog´ıas para el dise˜ no y mantenimiento de sistemas. La metodolog´ıa que parece ser la m´as existosa el la orientada a objetos. 2.1 Paradigmas de Programaci´ on Todos los lenguajes de programaci´on proporcionan niveles de abstracci´on, esta abstracci´on va ´ıntimamente relacionada con el paradigma, o m´etodo, de programaci´on. Sin embargo se puede debatir entre la complejidad del problema a resolver con el tipo de abstracci´on que se utilice. Los principales paradigmas de programaci´on son: • Imperativos • Funcionales • Orientados a Objetos 1 Entendamos confiabilidad como “habilidad del sistema para complir su tarea predefinida (a pesar de las fallas de hardware y software)” 14 Los lenguajes imperativos son lenguajes como FORTRAN, BASIC y C, lo cuales eran abstracciones del lenguaje ensamblador y la forma de programar giraba en torno al algoritmo que resolv´ıa el problema. Adem´as estos lenguajes estaban pensados para realizar una programaci´on basada en procedimientos, donde un procedimiento principal llamaba a subprocedimientos (o si prefiere subrutinas y/o funciones) para resolver el problema que se deseaba atacar. Los lenguajes funcionales intentan realizar una modelaci´on del problema a resolver, bajo la premisa “todos los problemas tienen una soluci´on algor´ıtmica” o “todos los problemas se pueden representar mediante listas”, o los convierten a una cadena de desiciones. Ejemplos de estos lenguajes son LISP, APL y Prolog. Con el paradigma orientado a objetos se intenta que los problemas se resuelvan en el espacio soluci´on, debido a que en los dos enfoques anteriores se debe realizar un mapeo a estructuras (lenguaje imperativo) o a una cadena inicial (lenguajes funcionales). En este paradigma se intenta representar a los elementos del espacio del problema como si fueran objetos del espacio soluci´on. La idea es que el programa permita describir la soluci´on del problema en t´erminos del problema. Alan Kay engloba en cinco puntos las caracter´ısticas de Smalltalk, el primer lenguaje orientado a objetos exitoso, y uno de los lenguajes en los que se basa Java. Estas caracter´ısticas representan un enfoque de programaci´on orientada a objetos pura. 1. Cualquier cosa es un objeto 2. Un programa es un conjunto de objetos que se dicen unos a otros que hacer, mediante el envio de mensajes. 3. Cada objeto tiene su propia memoria hecha de otros objetos 4. Cada objeto tiene un tipo 5. Todos los objetos de un tipo particulas pueden recibir el mismo mensaje. El paradigma orientado a objetos ayuda en la confiabilidad del software debido a que los sistema desarrollado bajo esta tecnolog´ıa son altamente modulares, se procura la robust´es a trav´es de una adecuada definici´on de la interfaz de cada tipo de objeto, y adem´as procuran un alto grado de reutilizaci´on de c´odigo ya probado. 2.1.1 Desarrollo de productos El t´ermino producto lo debemos entender como un sistema de software que ha tenido todo un proceso similar al industrial, donde se inicia con una serie de piezas b´asicas que conforme se juntan van formando un sistema m´as complejo. 15 Cuando se desarrollan productos se deben determinar distintos aspectos del mismo, por ejemplo: hardware donde se ejecutar´a, el modelo del producto, el paradigma que se utilizar´a para su desarrollo, y finalmente las herramientas para llevarlo a cabo. Esto podr´ıa considerarse como un an´alisis de requiereminetos, sin embargo, si se llega a realizar un buen modelo, t´ecnolog´ıa y herramientas de desarrollo, el producto se podr´a migrar a otras plataformas de manera sencilla. Otro aspecto a considerar es la evoluci´on del producto, ya que ´este siempre puede evolucionar de tal forma que siempre que un producto se termine, no indica que su etapa de desarrollo ha concluido, imagine por ejemplo el desarrollo de un procesador de palabras, en una primera estapa puede considerarse que se ha terminado el producto si el sistema es capaz de realizar las operaciones fundamentales de este tipo de sistema, como son: capturar y editar informaci´on del teclado, guardar esta informaci´on en un archivo, recuperar la informaci´on del archivo, mandar a imprimir la informaci´on, y proporcionar ayuda al usuario, como es mostrar el n´ umero de rengl´on y columna, incorporar opciones para insertar cortes de p´agina, manejo de tipos de letras (fonts), etre otras cosas. En una segunda versi´on del producto se le puede agregar el manejo de la justificaci´on de texto. En una tercera versi´on del producto se le podr´ıa agregar el corrector ortogr´afico. Finalmente se podr´ıa llegar a una cuarta versi´on del sistema, donde se le incluya un paquete gr´afico. Esto es, un producto evoluciona con el tiempo, y esta evoluci´on es m´as sencilla cuando se modula el sistema de manera clara, y se escribe en un lenguaje portable. El desarrollo de un sistema puuede considerarse como un proceso lento, donde la evoluvi´on y finalizaci´on de cada versi´on del producto puede llevar varios a˜ nos de trabajo. El desarrollo del producto est´a muy ligado al concepto del ciclo de vida del software, en el ciclo de vida del software podemos distinguir tres partes principales: 1. Requierimientos 2. Desarrollo del software 3. Sistema final En el an´alisis de requerimientos se intentan clarificar los objetivos principales y secundarios que espera el cliente hacerca del producto. La etapa de desarrollo de software intentar´a pasar la lista de requerimientos del producto a un sistema de software que garantice que se cumplen los objetivos del cliente. Cuando se tiene el sistema final se entra en una etapa de mantenimiento del producto donde se corrigen las variaciones que sufran algunos objetivos iniciales (los objetivos no son est´aticos pues tambi´en cambian con el paso del tiempo), y a partir de aqui surgen las nuevas versiones del produco. 16 2.2 Desarrollo de Software La fase en el desarrollo de un producto que une el conjunto de requisitos con el producto final, se encuentra el desarrollo de software. En esta fase se realiza el an´alisis de requerimientos y se realizan las pruebas de verificaci´on de todos y cada uno de los componentes del sistema, as´ı como del sistema en s´ı. Existen diferentes m´etodos para realizar el desarrollo de software: • M´etodo de cascada, donde cada fase se inicia despu´es de terminar la enterior. • M´etodo espiral, similar al m´etodo de cascada, s´olo que en la u ´ltima fase se vuelve a realizar un an´alisis de requeremientos para verificar si debe salir una nueva versi´on del producto. • M´etodo por prototipos, donde el sistema se inicia con un prototipo donde se puede trabajar directamente los requisitos y, de esta manera, agregar o quitar cosas al sistema. Este m´etodo va refinando el prototipo hasta llegar al sistema final. Dependiendo de cada paradigma de programaci´on que se utilice se realizar´a el an´alisi y dise˜ no del sistema. En la programaci´on estructural (lenguajes imperativos), se procede a plantear el algoritmo central y depu´es se define una estructura de datos y las funciones que la modificaran. En el m´etodo funcional se procede a verificar una secuencia inicial (o estado inicial) y las reglan que lo afectan (los eventos que afectan a los estados) y las condiciones de finalizacion exitosa (el estado final). Finalmente, en el paradigma orientado a objetos se buscan los objetos y sus interfaces del espacio problema. Bruce Eckel[3] define varias fases para el dise˜ no y desarrollo de software, estas fases son: 1. Hacer un plan: Definir las herramientas para el dise˜ no, modelado, construcci´on y pruebas. Establecer una calendarizaci´on a las diferentes fases. 2. Definir lo que estamos haciendo: Revisar el an´alisis de requeremientos y eliminar ambigedades. Obtener un modelo general, independiente del paradigma que se pretenda utilizar. 3. Definir c´omo lo vamos a hacer: Definir el paradigma de programaci´on que se va a utilizar, y dividir el sistema en m´odulos para un an´alisis y manejo m´as sencillo. Si se realiza con el paradigma orientado a objetos, se aconseja utilizar el lenguaje de modelaci´on UML. 4. Construirlo: Se programan las funciones, procedimientos, o clases de objetos que hayan resultado de las fases anteriores. 17 5. Iterarlo: En esta etapa se prueban los diferentes m´odulo al iterarlos con otros, incluyendo al sistema total. 2.3 Componentes principales de un programa Java Para escribir programas en Java, antes que nada, debe considerar que por omisi´on en Java todos es Orientado a Objetos, es decir, no es como los lenguajes C y Objective C, donde se permite agregar c´odigo C (paradigma estructural), que se consideran como lenguajes h´ıbridos (permiten programas en los paradigmas estructural y orientado a objetos). Los elementos principales en un programa Java son: clases, variables, m´etodos y handles. En Java todo lo que se maneja son objetos, y el programado es el responsable de construir los objetos. El programador no puede manipular el objeto al objeto directamente, esto se realiza a trav´es de handles. Por ejemplo: String s; String a = new String("Hola"); En este ejemplo s y a son dos handles de tipo String, s no hace referencia a ning´ un objeto, sin embargo, el handle a hace referencia al objeto String que tiene la secuencia de car´acteres “Hola”. Esto es, un objeto contiene a sus elemetos (en este caso a la secuencia de car´acteres), y los handles s´olo hacen referencia a los objetos. De hecho dos handles pueden hacer referencia al mismo objeto, por ejemplo considerando el ejemplo anterior podemos tener la siguiente declaraci´on: s = a; Entonces ambos handles hacen referemcia al mismo objeto String. Otra diferencia entre los handles y los objetos es su localizaci´on en el ´area de la memoria. Los handles se almacenan en el ´area de pila (en el ´area local de almacenamiento para cada funci´on), y los objetos se almacenan en una parte del ´area de datos denominada heap. Las clases definen el tipo de un objeto. En las clases se agrupan las variables y funciones que act´ uan sobre estas variables y que, en conjunto, caracterizan el comportamiento de los objetos. Las variables son regiones de memoria en los cuales se almacenan datos. Para los objetos las variables definen el estado que puede tener un objeto. 18 Los m´etodos (o funciones miembro) son partes del programa que act´ uan sobre las variables. Son los responsables de que un objetos realice un acci´on de terminada. Primer programa en Java Veamos pues un programa sencillo en Java. // Hola.java import java.util.*; public class Hola { public static void main(String[] args) { String s = new String("Hola mundo\n"); System.out.println(s); } } En este ejemplo sencillo podemos notar algunos puntos importantes: la primera linea del programa es un comentario, que indica que el nombre del programa Java es “Hola.java”2 . La siguente l´ınea muestra la declaraci´on import java.util.*; la cual inidica que se incluir´an las las bibliotecas utiler´ıas est´andares de Java. Los objetos de la clase String, y del sistema se encuentran definidos en esta librer´ıa. La clase que se muestra en el ej

7 downloads 9 Views 221KB Size

Recommend Stories


1 Introducción al lenguaje de programación Java
Java Básico PROTECO 1 Introducción al lenguaje de programación Java Como cualquier idioma humano, Java provee una manera de expresar conceptos. En c

LENGUAJE JAVA Pag.1 JAVA
LENGUAJE JAVA JAVA Qué es java 3 Lenguaje de objetos 3 Independiente de la plataforma 4 Algunas características… 4 El java development kit 5 Empecemo

Tema 2. El lenguaje JAVA
Tema 2. El lenguaje JAVA n n Nomenclatura habitual Variables n n n n n Operadores n n n Tipos de variables Tipos primitivos Referencias Arrays Op

EJERCICIOS DE PROGRAMACION EN LENGUAJE JAVA
www.cartagena99.com EJERCICIOS DE PROGRAMACION EN LENGUAJE JAVA EJERCICIOS DE PROGRAMACION EN LENGUAJE JAVA..........................................

UNIDAD I: LA POO Y EL LENGUAJE DE PROGRAMACION JAVA
UNIDAD I: LA POO Y EL LENGUAJE DE PROGRAMACION JAVA 1.1 Introducción a la POO. 1.1.1. Que es programación orientada a objetos (POO). 1.1.2. Historia d

Viveros forestales
Ingenieria de montes. Invernaderos: cultivo. Plantas. Envases y substratos. Semilla y planta. Riego

Story Transcript

Introducci´on al lenguaje de programaci´on Java

Amilcar Meneses Viveros

June 10, 2002

Contenido

1 Componentes y principios de una computadora 1.1

1.2

1.3

Componentes l´ogicos de una computadora . . . . . . . . . . . . . . . . . . .

3

1.1.1

La Unidad Central de Procesos (CPU) . . . . . . . . . . . . . . . . .

3

1.1.2

La memoria principal . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

1.1.3

Los dispositivos de entrada y salida . . . . . . . . . . . . . . . . . . .

4

Aritm´etica binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

1.2.1

N´ umeros negativos . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

Creando programas: c´odigo de m´aquina, otros lenguajes, y el lenguaje de programaci´on Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

2 Desarrollo de software 2.1

3

11

Paradigmas de Programaci´on . . . . . . . . . . . . . . . . . . . . . . . . . .

11

2.1.1

Desarrollo de productos . . . . . . . . . . . . . . . . . . . . . . . . .

12

2.2

Desarrollo de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

2.3

Componentes principales de un programa Java . . . . . . . . . . . . . . . . .

15

2.3.1

El kit de desarrollo de Java (JDK) . . . . . . . . . . . . . . . . . . .

17

2.3.2

Desarrollando un programa en Java . . . . . . . . . . . . . . . . . . .

17

Programas con tecnolog´ıa a objetos Java, y programas procedurales . . . . .

18

2.4

1

3 Reglas del lenguaje Java y herramientas 3.1

20

Comentarios, declaraciones, bloques de c´odigo, y espacios en blanco . . . . .

21

3.1.1

Estilo de comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

3.1.2

Declaraciones o proposiciones . . . . . . . . . . . . . . . . . . . . . .

22

3.1.3

Espacios en blanco . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

3.2

Identificadores, palabras reservadas, y palabras clave . . . . . . . . . . . . .

22

3.3

Variables y constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

3.4

Valores literales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

3.5

Convenci´on de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

4 Constructores de programas Java sencillos 4.1

4.2

28

Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

4.1.1

Operadores unarios . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

4.1.2

Operadores aritm´eticos. . . . . . . . . . . . . . . . . . . . . . . . . .

30

4.1.3

Operadores relacionales . . . . . . . . . . . . . . . . . . . . . . . . . .

30

4.1.4

Operadores l´ogicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

4.1.5

Operadores para manejo de bits.

. . . . . . . . . . . . . . . . . . . .

31

4.1.6

Operador terciario de asignaci´on condicional. . . . . . . . . . . . . . .

31

4.1.7

Operadores de asignamiento . . . . . . . . . . . . . . . . . . . . . . .

31

Constructores if y while . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

4.2.1

El constructor if . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

4.2.2

El constructor while . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

5 Constructores de programas Java avanzados 2

34

5.1

5.2

Ciclos for y do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

5.1.1

El constructor for . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

5.1.2

El constructor do . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

Declaraciones switch, break y continue . . . . . . . . . . . . . . . . . . . .

35

5.2.1

La declaraci´on switch . . . . . . . . . . . . . . . . . . . . . . . . . .

35

5.2.2

La declaraci´on break . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

5.2.3

La declaraci´on continue . . . . . . . . . . . . . . . . . . . . . . . . .

37

6 Orientaci´ on a Objetos

38

6.1

Encapsulamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

6.2

Las clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

6.2.1

39

6.3

Campos y m´etodos . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Restricciones al acceso de datos (modificadores public y private)

. . . . .

40

6.3.1

El identificador public . . . . . . . . . . . . . . . . . . . . . . . . . .

40

6.3.2

El identificador private . . . . . . . . . . . . . . . . . . . . . . . . .

41

7 M´ etodos 7.1

43

Escribiendo e invocando m´etodos . . . . . . . . . . . . . . . . . . . . . . . .

43

7.1.1

M´etodos de la instancia . . . . . . . . . . . . . . . . . . . . . . . . .

44

7.2

M´etodos de la clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

7.3

Referencia this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

7.4

Paso de par´ametros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

7.5

Sobrecarga de m´etodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

3

8 Arreglos

52

8.1

Declarando e instanciando arreglos . . . . . . . . . . . . . . . . . . . . . . .

52

8.2

Inicializando arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

8.3

Arreglo de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

55

9 Orientaci´ on a Objetos avanzada

56

9.1

Constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

56

9.2

La herencia es una relaci´on “es un” . . . . . . . . . . . . . . . . . . . . . . .

58

9.3

La composici´on es una relaci´on “tiene un” . . . . . . . . . . . . . . . . . . .

59

9.4

Clases abstractas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

59

9.5

Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

4

Introducci´ on El desarrollo de tecnolog´ıas de software a evolucionado desde el inicio de la computaci´on. Actualmente la tecnolog´ıa de vanguardia es la Orientaci´ on a Objetos, sin embargo ´esta no debe considerarse s´olo como una tecnolog´ıa de moda y pasajera, pues bastante trabajo de investigaci´on en diferentes ramas de las ciencias de la computaci´on la respaldan como una tecnolog´ıa s´olida y con fuertes perspectivas para el futuro de la programaci´on. Existen diferentes lenguajes orientados a objetos, como son Small Talk, Objective C, C++ y Java. Particularmente, Java est´a alcanzando una popularidad notoria en el desarrollo de software orientado a objetos por diferentes razones, entre las que destacan: lenguaje totalmente orientado a objetos, su alta portabilidad y ser un lenguaje lenguaje muy utilizado en la tecnolog´ıa Web. En este manual est´a dirigido a aquellas personas que tengan algunos conocimientos b´asicos de computaci´on y que deseen aprender a programar utilizando tecnolog´ıa Java. Este manual esta dividido en nueve cap´ıtulos, en los dos primeros se discuten principios b´asicos de computaci´on y de desarrollo de software. En el tercer cap´ıtulo se discute la insfraestructura de Java y los componentes principales de un programa Java. En los cap´ıtulos cuatro y cinco se discuten las declaraciones para el flujo de control del programa Java. En el sexto cap´ıtulo se ver´an los primeros elemento escenciales de la orientaci´on a objeotos: la abstracci´on y el encapsulamiento. El s´eptimo cap´ıtulo se discute la manera de construir m´etodos. El octavo cap´ıtulo se centra en el manejo de arreglos. Y finalmente, el noveno cap´ıtulo se utiliza para discutir algunos aspectos avanzados de la orientaci´on a objetos y su implantaci´on en Java.

5

Cap´ıtulo 1 Componentes y principios de una computadora Existen diferentes definiciones de computadora, muchos autores se refieren a este t´ermino como un componente electr´onico capaz de procesar una entrada. Otros se refieren a una computadora como la implantaci´on de una m´aquina universal de Turing. Algunos ven a la computadora como una m´aquina con capacidad de simular otras m´aquinas. En este cap´ıtulo discutiremos los componentes l´ogicos de una computadora y sus principios b´asicos de funcionamiento.

1.1

Componentes l´ ogicos de una computadora

El esquema m´as sencillo de una computadora contiene una Unidad Central de Procesos (CPU), memoria principal y dispositivos de entrada y salida, ver figura 1. Adicionalmente, se ha agregado un canal de comunicaci´on entre los dispositivos de entrada y salida y la memoria para acelerar la transferencia de datos entre estos componentes.

1.1.1

La Unidad Central de Procesos (CPU)

La parte principal de la computadora es el CPU, tambi´en conocido como procesador. Esta unidad se encarga de buscar instrucciones en la memoria y ejecutarlas. Para ejecutar una instrucci´on se sigue una secuencia de pasos que varia de procesador a procesador, pero la idea general es la siguiente:

6

1. Se busca una instrucci´on en una localidad de memoria. 2. Se decodifica para saber si la instrucci´on tiene datos con los que operar´a. 3. En caso de tener datos se cargan (de la memoria, de los registros del procesador, o de alg´ un dispositivo de entrada/salida). 4. Se ejecuta la instrucci´on. 5. Se almacena el resultado en la memoria. Para este prop´osito, el CPU contiene dos uniades internas: la Unidad Aritm´etica L´ogica (ALU) y la Unidad de Control (CU). La ALU se encarga de realizar operaciones aritm´eticas y l´ogicas, y la CU se encarga de coordinar las actividades internas y determina que operaciones se deben realizar y en que orden.

1.1.2

La memoria principal

Existen diferentes tipos de memoria, aqui nos referimos a la memoria principal denominada RAM (memoria de acceso aleatorio). En esta memoria se almacenan los programas y datos con que se vana procesar. Las instrucciones que ejecuta el CPU las busca en esta memoria a trav´es de direcciones. De hecho, para hacer referencia a una localidad de memoria o byte se hace a trav´es de una direcci´on de memoria. La cantidad de memoria disponible en una computadora est´a relacionada con la capacidad que tenga el procesador, es decir, el procesador puede hacer una combinaci´on entre el n´ umero de bits que utilice para hacer referencia a una localidad de memoria y la incorporaci´on de diferentes mecanismos de rendimiento de manejo de memoria, como son paginaci´on y segmentaci´on. La memoria principal tiene laracter´ıstica de ser vol´atil, es decir, lo que est´e almacenado en esta memoria se pierde cuando se apaga la computadora.

1.1.3

Los dispositivos de entrada y salida

Estos dispositivos forman el conjunto de perif´ericos conectados a la computadora, tienen la caracter´ıstica de proporcionar la interfaz con el usuario, proporcionar la comunicaci´on con algun otro dispositivo electr´onico (por ejemplo modems), y de proporcionar dispositivos de almacenamiento secundario (como son discos duros y cintas magn´eticas). Los dispositivos que realizan la interfaz con usuario establecen el puente de comunicaci´on la computadora y el hombre. Estos dispositivos han evolucionado tanto, que el uso de una computadora resulta extremadamente sencillo e intuitivo. Estos dispositivos i 4ncluyen al teclado, rat´on, monitor, graficadores e impresoras, entre otros. 7

Los dispositivos de comunicaci´on con otros dispositivos electr´onicos (incluyendo computadoras) se utilizan para enviar informaci´on a la computadora desde un lugar remoto. Estos dispositivos incluyen modems y tarjetas de red. Los dispositivos de almacenamiento se utilizan para respaldar la informaci´on que se encuentra en la memoria RAM. A estos dispositivos tambi´en se les conoce como dispositivos de almacenamiento secundario. A diferencia de la memoria RAM estos dispositivos son mec´anicos, lo que provoca que sean mas lentos. Dispositovs de este tipos son los discos duros, discos flexibles, cintas magn´eticas y discos ´opticos.

1.2

Aritm´ etica binaria

Una computadora trabaja en base 2 debido a que u ´nicamente puede distinguir entre los dos valores posibles de un bit: 0 y 1. . Los datos en una computadora est´an en bloques de 8 bits que conforman 1 byte. Una colecci´on de d´ıgitos binarios (bits) pueden representar cualquier valor. El valor de de un n´ umero binario se basa en la posici´on relativa de cada bit y en la presencia del valor 1. El siguiente n´ umero binario tiene todos los bits encendidos. Valor por posici\’on: Valor del bit:

128 64 32 16 8 4 2 1 1 1 1 1 1 1 1 1

Se asume que el bit m´as a la derecha tiene el valor de 1, el siguiente 2, el siguiente 4, y asi en potencias de 2. En este caso el valor de los bits encendidos es 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255( ´o 28 − 1).

Para el valor binario de 00100110, el valor de los bits encendidos es 2 + 4 + 32 = 38.

Una computadora ejecuta aritm´etica u ´nicamente en forma binaria. La operaci´on b´asica que realiza una computadora es una suma, veamos:

Suma binaria La suma binaria se basa en la siguiente regla de suma: 0+0 = 0 8

0+1 1+0 1+1 1+1+1

= = = =

1 1 10 11

Note que las dos u ´ltimas operaciones acarrean 1 bit. Veamos ahora el resultado de sumar 65 m´as 42:

Binario 01000001 00101010 01101011

Decimal 65 42 107

Y verificamos que 01101011 es 1 + 2 + 8 + 32 + 64 = 107.

1.2.1

N´ umeros negativos

Hasta el momento hemos visto n´ umeros positivos. Para establecer el signo en n´ umeros binarios se toma el bit m´as a la izquierda como signo, tal que si esta en cero entonces es positivo y si est´a en uno entonces es negativo. As´ı, un n´ umero negativo contiene un bit encendido en la posici´on m´as a la izquierda, y adem´as se expresa en notaci´on complemento a dos. Esto es, para representar un n´ umero binario como negativo, hay que invertir todos los bits y sumarle 1. Veremos el ejemplo del n´ umero 01000001: Numero 65 01000001 Bits invertidos 10111110 Sumando 1 10111111

(es igual a -65)

Si sumamos los bits encendidos de este nuevo n´ umero no obtenemos 65. Sin embargo, recuerde que un n´ umero negativo se identifica por el bit encendido m´as a la izquierda. Para determinar el valor absoluto de un n´ umero negativo hay que repetir la operaci´on anterior: invertir bits y sumar 1: Valor binario 10111111 Bits invertidos 01000000 Sumando 1 01000001

(es igual a +65)

La suma de +65 y −65 debe ser 0, veamos: 9

01000001 10111111 (1)00000000

(+65) (-65)

El valor de los ocho primeros bits (de derecha a izquierda) son 0. El bit de acarreo de la izquierda se pierde, con lo que el resultado es correcto. Realizar la resta es muy sencilla: invertir el signo del n´ umero que se va a sustraer y sumar los dos n´ umeros. Por ejemplo, restemos 42 a 65. La representaci´on binaria de 42 es 00101010 y su complemento a dos es 11010110: 65 01000001 +(-42) 11010110 23 (1)00010111 El resultado 23 es correcto. Nuevamente el bit de signo de acarreo se ignora. Si la justificaci´on del complemento a dos no es suficientemente clara, considere la siguiente proposici´on: ?Qu´e n´ umero tengo que sumar a 00000001 para obtener un 00000000?. En t´erminos de n´ umeros decimales la respuesta es −1. Para n´ umeros binarios, la respuesta es 11111111, como sigue:

Resultado

00000000 11111111 (1)00000000

Ignorando el acarreo, se observa que el n´ umero 11111111 es equivalente al n´ umero decimal −1. Se puede observar que el patr´on de n´ umeros binarios decrese en valor: +3 +2 +1 0 -1 -2 -3

00000011 00000010 00000001 00000000 11111111 11111110 11111101

Y como se puede ver, el valor 0 de los bits indica su valor: trate el valor de posici´on de cada bit apagado como si fuera un bit encendido, sume sus valores y agrege 1. 10

1.3

Creando programas: c´ odigo de m´ aquina, otros lenguajes, y el lenguaje de programaci´ on Java

Un programa que se quiere ejecutar debe almacenarse en la memoria principal de la computadora. Este programa se encuentra como una secuencia de bytes, cuando un procesador lee estos bytes lo decodifica para saber el tipo de instrucci´on que se ejecutar´a. Esta representaci´on de instrucciones en bytes se le conoce como lenguaje de m´aquina, ya que cada procesador codifica de manera diferente sus instrucciones. En las primeras computadoras, su programarci´on consist´ıa en meter una secuencia de ceros y unos, y el programador deb´ıa conocer el lenguaje de m´aquina. Sin embargo esto era muy tardado y era imposible encontrar errores en programas grandes. As´ı, se ide´o asociar mnem´onicos al c´odigo de m´aquina, lo cual di´o origen a los lenguajes ensambladores, de hecho programar en ensamblador es programar en c´odigo de m´aquina, porlo que a estos lenguajes se les conoce como lenguajes de bajo nivel. La programaci´on se hizo un poco mas sencilla, pero s´olo los expertos pod´ıan programar, y los programas no eran portables, es decir, no pod´ıan pasar de una computadora a otra si ten´ıan diferentes instrucciones de m´aquina. Para facilitar la tarea de programaci´on se ide´o hacer un lenguaje de programaci´on que fuera f´acil de entender para el programador y que utilizara algunas reglas del lenguaje natural, as´ı a finales de la d´ecada de los 60 aparecieron los primeros lenguajes de alto nivel como FORTRAN, COBOL y ALGOL. Hasta la fecha han surgido una gran cantidad de lenguajes de programaci´on de alto nivel, sin embargo la mayor´ıa sigue el siguiente patr´on para poder ejecutarse. 1. Se escribe el programa en lenguaje de alto nivel 2. Se convierte el programa de alto nivel a lenguaje de bajo nivel 3. Se ejecuta. Al proceso de conversi´on de un programa de alto nivel a un programa de bajo nivel, se le conoce como compilaci´on, y al programa que lo hace, se le denomina compilador. As´ı podemos encontar un compilador para cada lenguaje de programaci´on. Como se ha mencionado existe una gran cantidad de lenguajes de programaci´on, entre los que destacan por su popularidad C. Este lenguaje fue exitoso debido a que el c´odigo del sistema operativo UNIX estaba escrito en este lenguaje (UNIX fue el primer sistema operativo que se escribi´o en lenguaje de alto nivel), por lo que si alguien quer´ıa tener este sistema operativo en su m´aquina, s´olo deb´ıa construir un compilador de C, esta tarea no es muy f´acil, pero involucra menos trabajo que construir todo un sistema operativo. C ha sido tan popular que

11

otros lenguajes se han desarrollado a partir de ´el, por ejemplo: C++, Objective C y Java. Este u ´ltimo lenguaje es el que a nosotros nos interesa. Java es otro lenguaje de programaci´on de computadoras, sin embargo tiene dos grandes ventajas a su favor: los programas compilados en Java corren en casi todas las plataformas que tengan la m´aquina virtual de Java y es un lenguaje de programaci´on otientado a objetos. El punto d´ebil de los programas escritos en C, y de la mayor´ıa de los programas escritos con otros lenguajes de alto nivel, es que como est´an en c´odigo de m´aquina (o c´odigo objeto), estos programas no pueden ejecutarse en otra computadora a menos que se lleve el programa en alto nivel (c´odigo fuente) y se compile. Los programas en Java tiene la ventaja de que est´an codificados con las instrucciones de la m´aquina virtual de Java. Una m´aquina virtual es una m´aquina que no existe, sin embargo, existe un programa que se encarga de simularla, es decir, de simular las instrucciones de la m´aquina de Java con las instrucciones del procesador sobre el cual se est´a ejecutando. De esta forma, cuando deseemos ejecutar un programa Java en una computadora espec´ıfica, se debe ejecutar sobre la m´aquina virtual de Java. La presencia de ´esta maquina virtual lo hace ideal para resolver problemsa de programaci´on en el World Wide Web. El Web es la red mundial de computadoras, y por ende, las plataformas (hardware y sistema operativo) var´ıan mucho, sin embargo esto no es impedimento para ejecutar programas de Java. Por otro lado, Java es un lenguaje de programaci´on orientado a objetos, lo cual de dar´a muchas facilidades de dise˜ no, desarrollo y mantenimiento de sistemas de software.

Ejercicios Defina que es una computadora 1. ¿Qu´e es la memoria RAM? 2. ¿Para que se utiliza el DMA? 3. Mencione 2 dispositivos que se utilicen como entrada y salida. 4. ¿Cual es la secuencia de pasos que sigue un procesador para ejecutar una instrucci´on? 5. ¿Cual es el valor decimal del n´ umero binario 00111101? 6. Realice la suma binaria de los n´ umeros 00010001 y 00001111, y verifique el resultado en decimal. 7. ¿Cual es la representaci´on binaria del n´ umero -8? 8. ¿Realice la substracci´on de 11000110 y 00010011? 9. ¿Cual es la funci´on de un compilador? 12

Laboratorio 1. Determine los dispositivos de entrada y salida de su computadora. 2. Determine cual es el procesador de su computadora 3. Determine cual es el sistema operatio de su computadora

13

Cap´ıtulo 2 Desarrollo de software Debido a que el desarrollo de grandes sistemas de informaci´on contiene una gran cantidad de casos de estudio y gran cantidad de m´odulos de c´odigo, se genera que el desarrollo de programas sea una tarea compleja y costosa. De hecho generar sistemas con una buena confiabilidad1 es un reto para todos lo equipos de desarrollo de software. Podemos procurar la confiabilidad de un sistema de software a trav´es de metodolog´ıas para el dise˜ no y mantenimiento de sistemas. La metodolog´ıa que parece ser la m´as existosa el la orientada a objetos.

2.1

Paradigmas de Programaci´ on

Todos los lenguajes de programaci´on proporcionan niveles de abstracci´on, esta abstracci´on va ´ıntimamente relacionada con el paradigma, o m´etodo, de programaci´on. Sin embargo se puede debatir entre la complejidad del problema a resolver con el tipo de abstracci´on que se utilice. Los principales paradigmas de programaci´on son: • Imperativos • Funcionales • Orientados a Objetos 1

Entendamos confiabilidad como “habilidad del sistema para complir su tarea predefinida (a pesar de las fallas de hardware y software)”

14

Los lenguajes imperativos son lenguajes como FORTRAN, BASIC y C, lo cuales eran abstracciones del lenguaje ensamblador y la forma de programar giraba en torno al algoritmo que resolv´ıa el problema. Adem´as estos lenguajes estaban pensados para realizar una programaci´on basada en procedimientos, donde un procedimiento principal llamaba a subprocedimientos (o si prefiere subrutinas y/o funciones) para resolver el problema que se deseaba atacar. Los lenguajes funcionales intentan realizar una modelaci´on del problema a resolver, bajo la premisa “todos los problemas tienen una soluci´on algor´ıtmica” o “todos los problemas se pueden representar mediante listas”, o los convierten a una cadena de desiciones. Ejemplos de estos lenguajes son LISP, APL y Prolog. Con el paradigma orientado a objetos se intenta que los problemas se resuelvan en el espacio soluci´on, debido a que en los dos enfoques anteriores se debe realizar un mapeo a estructuras (lenguaje imperativo) o a una cadena inicial (lenguajes funcionales). En este paradigma se intenta representar a los elementos del espacio del problema como si fueran objetos del espacio soluci´on. La idea es que el programa permita describir la soluci´on del problema en t´erminos del problema. Alan Kay engloba en cinco puntos las caracter´ısticas de Smalltalk, el primer lenguaje orientado a objetos exitoso, y uno de los lenguajes en los que se basa Java. Estas caracter´ısticas representan un enfoque de programaci´on orientada a objetos pura. 1. Cualquier cosa es un objeto 2. Un programa es un conjunto de objetos que se dicen unos a otros que hacer, mediante el envio de mensajes. 3. Cada objeto tiene su propia memoria hecha de otros objetos 4. Cada objeto tiene un tipo 5. Todos los objetos de un tipo particulas pueden recibir el mismo mensaje. El paradigma orientado a objetos ayuda en la confiabilidad del software debido a que los sistema desarrollado bajo esta tecnolog´ıa son altamente modulares, se procura la robust´es a trav´es de una adecuada definici´on de la interfaz de cada tipo de objeto, y adem´as procuran un alto grado de reutilizaci´on de c´odigo ya probado.

2.1.1

Desarrollo de productos

El t´ermino producto lo debemos entender como un sistema de software que ha tenido todo un proceso similar al industrial, donde se inicia con una serie de piezas b´asicas que conforme se juntan van formando un sistema m´as complejo.

15

Cuando se desarrollan productos se deben determinar distintos aspectos del mismo, por ejemplo: hardware donde se ejecutar´a, el modelo del producto, el paradigma que se utilizar´a para su desarrollo, y finalmente las herramientas para llevarlo a cabo. Esto podr´ıa considerarse como un an´alisis de requiereminetos, sin embargo, si se llega a realizar un buen modelo, t´ecnolog´ıa y herramientas de desarrollo, el producto se podr´a migrar a otras plataformas de manera sencilla. Otro aspecto a considerar es la evoluci´on del producto, ya que ´este siempre puede evolucionar de tal forma que siempre que un producto se termine, no indica que su etapa de desarrollo ha concluido, imagine por ejemplo el desarrollo de un procesador de palabras, en una primera estapa puede considerarse que se ha terminado el producto si el sistema es capaz de realizar las operaciones fundamentales de este tipo de sistema, como son: capturar y editar informaci´on del teclado, guardar esta informaci´on en un archivo, recuperar la informaci´on del archivo, mandar a imprimir la informaci´on, y proporcionar ayuda al usuario, como es mostrar el n´ umero de rengl´on y columna, incorporar opciones para insertar cortes de p´agina, manejo de tipos de letras (fonts), etre otras cosas. En una segunda versi´on del producto se le puede agregar el manejo de la justificaci´on de texto. En una tercera versi´on del producto se le podr´ıa agregar el corrector ortogr´afico. Finalmente se podr´ıa llegar a una cuarta versi´on del sistema, donde se le incluya un paquete gr´afico. Esto es, un producto evoluciona con el tiempo, y esta evoluci´on es m´as sencilla cuando se modula el sistema de manera clara, y se escribe en un lenguaje portable. El desarrollo de un sistema puuede considerarse como un proceso lento, donde la evoluvi´on y finalizaci´on de cada versi´on del producto puede llevar varios a˜ nos de trabajo. El desarrollo del producto est´a muy ligado al concepto del ciclo de vida del software, en el ciclo de vida del software podemos distinguir tres partes principales: 1. Requierimientos 2. Desarrollo del software 3. Sistema final En el an´alisis de requerimientos se intentan clarificar los objetivos principales y secundarios que espera el cliente hacerca del producto. La etapa de desarrollo de software intentar´a pasar la lista de requerimientos del producto a un sistema de software que garantice que se cumplen los objetivos del cliente. Cuando se tiene el sistema final se entra en una etapa de mantenimiento del producto donde se corrigen las variaciones que sufran algunos objetivos iniciales (los objetivos no son est´aticos pues tambi´en cambian con el paso del tiempo), y a partir de aqui surgen las nuevas versiones del produco. 16

2.2

Desarrollo de Software

La fase en el desarrollo de un producto que une el conjunto de requisitos con el producto final, se encuentra el desarrollo de software. En esta fase se realiza el an´alisis de requerimientos y se realizan las pruebas de verificaci´on de todos y cada uno de los componentes del sistema, as´ı como del sistema en s´ı. Existen diferentes m´etodos para realizar el desarrollo de software: • M´etodo de cascada, donde cada fase se inicia despu´es de terminar la enterior. • M´etodo espiral, similar al m´etodo de cascada, s´olo que en la u ´ltima fase se vuelve a realizar un an´alisis de requeremientos para verificar si debe salir una nueva versi´on del producto. • M´etodo por prototipos, donde el sistema se inicia con un prototipo donde se puede trabajar directamente los requisitos y, de esta manera, agregar o quitar cosas al sistema. Este m´etodo va refinando el prototipo hasta llegar al sistema final. Dependiendo de cada paradigma de programaci´on que se utilice se realizar´a el an´alisi y dise˜ no del sistema. En la programaci´on estructural (lenguajes imperativos), se procede a plantear el algoritmo central y depu´es se define una estructura de datos y las funciones que la modificaran. En el m´etodo funcional se procede a verificar una secuencia inicial (o estado inicial) y las reglan que lo afectan (los eventos que afectan a los estados) y las condiciones de finalizacion exitosa (el estado final). Finalmente, en el paradigma orientado a objetos se buscan los objetos y sus interfaces del espacio problema. Bruce Eckel[3] define varias fases para el dise˜ no y desarrollo de software, estas fases son: 1. Hacer un plan: Definir las herramientas para el dise˜ no, modelado, construcci´on y pruebas. Establecer una calendarizaci´on a las diferentes fases. 2. Definir lo que estamos haciendo: Revisar el an´alisis de requeremientos y eliminar ambigedades. Obtener un modelo general, independiente del paradigma que se pretenda utilizar. 3. Definir c´omo lo vamos a hacer: Definir el paradigma de programaci´on que se va a utilizar, y dividir el sistema en m´odulos para un an´alisis y manejo m´as sencillo. Si se realiza con el paradigma orientado a objetos, se aconseja utilizar el lenguaje de modelaci´on UML. 4. Construirlo: Se programan las funciones, procedimientos, o clases de objetos que hayan resultado de las fases anteriores. 17

5. Iterarlo: En esta etapa se prueban los diferentes m´odulo al iterarlos con otros, incluyendo al sistema total.

2.3

Componentes principales de un programa Java

Para escribir programas en Java, antes que nada, debe considerar que por omisi´on en Java todos es Orientado a Objetos, es decir, no es como los lenguajes C y Objective C, donde se permite agregar c´odigo C (paradigma estructural), que se consideran como lenguajes h´ıbridos (permiten programas en los paradigmas estructural y orientado a objetos). Los elementos principales en un programa Java son: clases, variables, m´etodos y handles. En Java todo lo que se maneja son objetos, y el programado es el responsable de construir los objetos. El programador no puede manipular el objeto al objeto directamente, esto se realiza a trav´es de handles. Por ejemplo: String s; String a = new String("Hola"); En este ejemplo s y a son dos handles de tipo String, s no hace referencia a ning´ un objeto, sin embargo, el handle a hace referencia al objeto String que tiene la secuencia de car´acteres “Hola”. Esto es, un objeto contiene a sus elemetos (en este caso a la secuencia de car´acteres), y los handles s´olo hacen referencia a los objetos. De hecho dos handles pueden hacer referencia al mismo objeto, por ejemplo considerando el ejemplo anterior podemos tener la siguiente declaraci´on: s = a; Entonces ambos handles hacen referemcia al mismo objeto String. Otra diferencia entre los handles y los objetos es su localizaci´on en el ´area de la memoria. Los handles se almacenan en el ´area de pila (en el ´area local de almacenamiento para cada funci´on), y los objetos se almacenan en una parte del ´area de datos denominada heap. Las clases definen el tipo de un objeto. En las clases se agrupan las variables y funciones que act´ uan sobre estas variables y que, en conjunto, caracterizan el comportamiento de los objetos. Las variables son regiones de memoria en los cuales se almacenan datos. Para los objetos las variables definen el estado que puede tener un objeto. 18

Los m´etodos (o funciones miembro) son partes del programa que act´ uan sobre las variables. Son los responsables de que un objetos realice un acci´on de terminada.

Primer programa en Java Veamos pues un programa sencillo en Java. // Hola.java import java.util.*; public class Hola { public static void main(String[] args) { String s = new String("Hola mundo\n"); System.out.println(s); } } En este ejemplo sencillo podemos notar algunos puntos importantes: la primera linea del programa es un comentario, que indica que el nombre del programa Java es “Hola.java”2 . La siguente l´ınea muestra la declaraci´on import java.util.*; la cual inidica que se incluir´an las las bibliotecas utiler´ıas est´andares de Java. Los objetos de la clase String, y del sistema se encuentran definidos en esta librer´ıa. La clase que se muestra en el ejemplo se llama Hola, se define con la palabra reservada class y se le asigna su restricci´on de acceso como public. La clase Hola no contiene variables de instancia, sin embargo, la funci´on main tiene una variable local. Esta variable es el handle s, el cual hace referencia al objeto String que contiene la secuencia de car´acteres “Hola mundo\n”. La clase Hola contiene a la funci´on est´atica main. Esta funci´on es muy importante en Java, debido a que marca el inicio del programa, es decir, cuando se carga en memoria, main se˜ nala el inicio del c´odigo que se va a ejecutar. Note que el nombre del programa fuente es Hola.java y es id´entico al nombre de la clase. Cuando una clase contiene a la funci´on est´atica main, el nombre de la clase debe ser el nombre del programa. 2

Todos los programas de Java deben tener la extensi´on “.java”

19

Java distingue entre may´ usculas y min´ usculas, tal que la cadena Hola es diferente de hola o de HOLA. La declaraci´on System.out.println(s); es muy interesante, veamos con detalle. Hemos comentado que todo en Java se considera como objetos, pues bien, el entorno donde se ejecuta Java tambi´en se considera como tal y as´ı, la secuencia System.out, denota el objeto de salida estandar del programa Java —todos los procesos de Java tienen una entrada y una salida estandar, la cual son el taclado y el monitor respectivamente—. La secuencia println(s), indica que al objeto de salida se le env´ıa el mensaje println con argumento s, es decir, esto se puede traducir como “imprime el objeto s y despu´es realiza retorno de carro y alimento de linea”.

2.3.1

El kit de desarrollo de Java (JDK)

El kit de desarrollo de Java (JDK) es una colecci´on de software de Sun, que contiene todo lo necesario para crear aplicaciones Java (y Applets). Los componentes principales son:

Programa Compilador Java Int´erprete de Java Visualizador de applets

2.3.2

nombre javac java appletviewer

ejemplo javac filename.java java filename appletviewerfilename.html

Desarrollando un programa en Java

Para escribir programas en Java, el programador debe seguir el siguiente proceso:

1. Editar el archivo: Este paso se puede realizar desde cualquier editor de texto, inclusive el editor de alg´ un ambiende de desarrollo integrado. 2. Compilar el programa: Una vez que se ha escrito el programa se compila desde la linea de comandos con la siguiente instrucci´on: javac programa.java

20

3. Ejecutar el programa: El programa se debe ejcutar en la m´aquina virtual de Java. Se debe invocar desde la l´ınea de comandos con la siguiente instrucci´on: java programa

2.4

Programas con tecnolog´ıa a objetos Java, y programas procedurales

Como se coment´o en la secci´on anterior, Java es un lenguaje totalmente Orientado a Objetos. Lenguajes como C++ y Objective C, permiten trabajar con orientaci´on a objetos y con funciones de C, debido a que su prop´osito fue reutilizar al maximo posible el software que estaba disponible. Java mantiene ventaja sobre los dem´as lenguajes en la portabilidad de c´odigo ejecutable, es decir, cuando un programa Java corre en una plataforma determinada (hardware y software) se puede pasar este c´odigo ejecutable a una nueva plataforma (que tenga la m´aquina virtual de Java) y se tiene la seguridad de que va a correr. La ventaja de la tecnolog´ıa a objetos sobre la procedural es intentar que el c´odigo se reutilice al 100%. Esto es, cuando tenemos una biblioteca de alg´ un lenguaje imperativo, se tiene por lado la definici´on de la estructura y las funciones que act´ uan sobre la estructura por otro lado. Sin embargo, un problema muy com´ un en el uso de bibliotecas es que el programador rar vez conoce todas las funciones que ofrece la biblioteca, con el resultado de que cuando el programador conoce la estructura de datos que se est´a utilizando, entonces procede a escribir su propio c´odigo que act´ ua sobre la estructura. Esto afecta al proceso de desarrollo de software ya que el programador puede estar reeescribiendo una funci´on que ya incluye la biblioteca. Sin embargo si el programador desconoce el funcionamiento de toda la biblioteca, al escribir su nuevo c´odigo, puede alterar la consistencia de los datos que modelan el problema a resolver. Con la tecnolog´ıa Orientada a Objetos este error no ocurre, pues las u ´nicas funciones que alteran los datos est´an definidas en la clase, y ninguna funci´on externa puede alterar estos datos (¡se violar´ıa el encapsulamiento del objeto!, y esta propiedad es fundamental en este paradigma de programaci´on).

Ejercicios 1. ¿Qu´e es la confiabilidad del software? 2. ¿C´omo la programaci´on orientada a objetos a procurar la confiabilidad del software?

21

3. Describa los diferentes paradigmas de programaci´on. 4. ¿Cuales son las cinco caracter´ısticas que definen a SmallTalk como un lenguaje orientado a objetos? 5. Describa con sus palabras los tres m´etodos para el desarrollo de software 6. ¿Cuales son los componentes principales de un programa Java? 7. Describa con sus palabras las ventajas de desarrollar programas con tecnolog´ıa Java vs al desarrollo de programas procedurales.

Laboratorio 1. Instale y configure el JDK 2. Averig¨ ue en que directorio se encuentran los archivos de biblioteca de Java 3. Ejecute el programa Hola.java 4. Modifique el programa Hola.java tal que despliege su nombre en un rengl´on abajo del saludo “Hola”.

22

Cap´ıtulo 3 Reglas del lenguaje Java y herramientas Para que un lenguaje de programaci´on sea considerado orientado a objetos debe contener las siguientes caracter´ısticas: encapsulaci´on, herencia y polimorfismo.

Encapsulaci´ on: es el proceso de agrupar en un objeto informaci´on relacionada con las operaciones que un programa ejecuta sobre los datos. En otras palabras, la encapsulaci´on debe agrupar una conjunto de datos y funciones que operan sobre estos datos (tal que ninguna funci´on externa pueda cambiar estos datos) y esta agrupaci´on debe ser la abstracci´on de un objeto del mundo real. Herencia: es el grado u orden de abstracciones. Es decir, podemos realizar una nueva encapsulaci´on a partir de una existente, agregando o modifcando caracter´ısticas a una abstracci´on previa. Polimorfirmo: Es la habilidad que tiene diferentes objetos de reponder a un mismo mensaje.

Java se considera un lenguaje de programaci´on orientado a objetos porque soporta estas tres caracter´ısticas. Sin embargo, Java no deja de ser como otro lenguaje de programaci´on en el sentido de que debe tener un conjunto de reglas para definir variables y declaraciones de instrucciones de control de flujo. En las siguientes secciones revisaremos estas reglas.

23

3.1

Comentarios, declaraciones, bloques de c´ odigo, y espacios en blanco

Java es un lenguaje con gramatica libre de contexto, lo que significa que el programador tiene la libertad de poner espacios intermedios para acomodar el c´odigo a su gusto. Un programa Java es un conjunto de declaraciones que forman bloques de c´odigo, el programador puede insertar lineas en blanco entre las declaraciones o bloques de c´odigo para poder identificar secciones que le interesen. Ademas puede insertar comentarios con el fin de tener una documentacion al momento de escribir el c´odigo.

3.1.1

Estilo de comentarios

Java permite tres tipos de comentarios: // Comenta una linea /* Comenta un conjunto de lineas */ /** Comentario de documentaci\’on utilizado por el sistema Javadoc */ El primer tipo de comentario se le conoce como comentario de linea, Este comentario inicia cuando el compilador encuentra la secuencia // y finaliza con el EOF o fin de linea. Lenguajes como Objective C y C++ tambi´en lo utilizan. El segundo tipo de comentario es el comentario estandar de C, y tambi´en es reconocido por los lenguajes Objective C y C++. Inicia con la secuencia /* y finaliza con la secuencia */. Este tipo de comentario puede agrupar varias l´ıneas si el programador a si lo desea. El tercer tipo de comentario, inicia con la secuencia de /** y finaliza con la secuencia */. Trabaja como el tipo de comentario anterior, sin embargo el programa Javadoc del JDK lo utiliza para generar documentacion de manera “autom´atica”. Ya que dentro de la secuencia se deben seguir ciertas reglas para generar la documentacion adecuada en HTML. Este tipo de comentario es particular de Java. Estas son algunas sugerencias que se pueden poner en comentarios: • Comentar prop´osito. del programa al inicio del mismo. • Comentar el prop´osito de cada variable en su declaraci´on. • Comentar cada clase • Comentar al final de cada declaraci´on de control. 24

3.1.2

Declaraciones o proposiciones

Las declaraciones son las unidades m´as peque˜ nas de ejecuci´on en un programa Java. Un delcaraci´on es una l´ınea de c´odigo que le indica a la computadora la ejecuci´on de una acci´on espec´ıfica. Las declaraciones pueden ser de dos tipos: 1. Declaraci´on sencilla, generalmente termina con un punto y coma “;”. 2. Declaraci´on compuesta (tambi´en se le llama bloque) generalmente se denota por llaves “{}”. Estos son algunos ejemplos de una declaraci´on sencilla: int num1 = 1, num2 = 2; import java.applet.Applet; System.out.println("Bienvenido a Java!"); Este es un ejemplo de una declaraci´on compuesta: { System.out.println("Bienvenido a Java"); System.out.println("Te gusta a Java?"); }

3.1.3

Espacios en blanco

Java es un lenguaje de programaci´on libre de contexto, lo que significa que, en su mayor´ıa, se ignoran los espacios en blanco. El programador tiene la libertad de introducir en el programa espacios en blanco a su voluntad, con el fin de aumentar su legibilidad. La u ´nica restricci´on es que no pueden colocarse espacios en blanco a mitad de un operador o un identificador. Se consideran espacios en blancos a car´acteres es espacio, tabuladores y alimento de l´ınea.

3.2

Identificadores, palabras reservadas, y palabras clave

Un identificador es una secuencia de letras y d´ıgitos, deben empezar con una letra del alfabeto, un car´acter de subrayado ( _ , o un signo de dolar ($). Los car´acteres posteriores pueden ser: 25

• Desde la a a la z • Desde la A a la Z • Desde 0 hasta 9 • Conjunto de car´acteres Unicode. Los siguientes identificadores son palabras reservadas (o palabras clave) y no se pueden utilizar de otra manera: abstract boolean break byte case catch char class continue default do double else extends

3.3

final finally float for goto if implement import instanceof interface int long new try

package private protected public return short static super switch synchronize this throw void while

Variables y constantes

Java asume que todo con lo que trabaja son objetos, y por ende el tipo de datos con los que trabaja con clases. Sin embargo Java contiene un conjunto de datos b´asicos —esto es, datos que no se trabajan como objetos—, por el momento consideraremos s´olo a este tipo de datos. Los datos en un programa pueden ser variables y constantes, una variable es un dato que puede cambiar conforme se ejecute el programa, y una constante es un dato que siempre mantiene su mismo valor. Las variables en Java pertenecen a los tipos b´asicos que se muestran en la siguiente tabla:

26

Tipo de dato boolean byte char short int long float double

Tama˜ no Valor por omisi´ on 1 false 8 0 16 ‘x0’ 16 0 32 0 64 0 32 0.0F 64 0.0D

Todas las variables que se utilicen en un programa Java deben declararse antes de usarse, esto es, a la variable se le debe asignar un nombre y el tipo de dato que almacena. Las declaraciones pueden aparecer en cualquier punto del programa. La declaraci´on de una variable consta de un tipo, nombre de la variable, y opcionalmente, se coloca el operador de asignaci´on (=) con el valor inicial de la variable. Por ejemplo: int unEntero; int otroEntero = 5; float unFlotante; Por otro lado, los datos constantes tambi´en deben declararse antes de usarse. La sintaxis es la misma que para las variables, s´olo que hay que agregar antes del tipo de la variable, la palabra reservada final (lo cual asegura que el valor asociado al nombre no cambie) , y despu´es de declarar el nombre, forzosamente debe tener el operador de asignaci´on con el valor de la constante. Por ejemplo: final float PI = 3.14158; Nota: asegurese de que al final de la linea de declaraci´on se coloque el car´acter punto y coma (“;”) para indicar que termina la declaraci´on.

El operador coma (“;”) El operador coma se utiliza para declarar en una misma sentencia varias variables o constantes, lo u ´nico que hay que hacer es colocar el operador coma en lugar del punto y coma y voler a colocar el nombre de otra variable (o constante) su valor. Por ejemplo: int entero1, entero2 = 3, entero3; float puntoX, puntoY; static float LIMITE_INFERIOR_X = -1.0, LIMITE_SUPERIOR_X = 1.0; Nota: La definici´on de varias constantes siempre debe hacerse con su valor asociado. 27

3.4

Valores literales

Las literales son valores que se asocian a una sentencia en tiempo de compilaci´on, un caso de su uso es representar los valores de inicializaci´on a las variables y constantes. Los literales enteros nomales son n´ umeros decimales con signo de 32 bits. Los literales que empiezan con 0 son octales, mientras que los literales que los que empiezan con 0x ´o 0X son hexadecimales. Los car´acteres de la A la F en un n´ umero decimal pueden estar en min´ usculas o may´ usculas. As´ı los siguientes n´ umeros tiene el mismo valor: 255, 0377, 0xFF, 0xff, 0XFF Se asume que los literales mayores a 0x7F F F F F F F (2.147.483.647) son enteros largos (long). Se puede forzar la conversi´on de cualquier literal entero a entero lango coloc´andole al final la letra “l” o “L”. Un literal num´erico que contenga tanto un exponente como un punto decimal se toma como un n´ umero de punto flotante. Por omisi´on, los n´ umeros en punto flotante se asumen del tipo double. As´ı pues, todas las literales siguientes se toman del tipo double. 2.221, 0.1, 1.0, 1.80E-7 Se pueden a˜ nadir “F” o “f” al final de la literal para forzar expl´ıcitamente que el literal es float. As´ı pues las siguientes literales on de punto flotante: 2.221f, 0.1F, 1.0F, 1.80E-7f Adem´as se pueden a˜ nadir “D” o “d” al final de la literal para forzarlo a ser double: 2.221D, 0.1d, 1.0d, 1.80E-7D Los dos literales booleanos: true y false, son aut´enticos literales constantes y no necesitan ser definidos dentro del programa, adem´as los valores true y false no son valores num´ericos y no se pueden convertir a tipo entero. Los car´acteres literales est´an encerrados entre comillas simples (’’); por ejemplo ’ ’ representa un espacio. Adem´as se puede definir un car´acter litera˜ n usando ’\xNN’, donde NN es el valor ASCII del car´acter. Por lo tanto, ’\x20’ es tambi´en un espacio. Los car´acteres realmente no imprimibles que aparecen a menudo est´an generados por sus propios valores especiales. Estos se muestran en la seguiente tabla. 28

Descripci´ on Nueva L´ınea Alimentaci´on de p´agina Tabulador Comilla simple Retroceso Comilla doble Retorno de Carro Barra Invertida

Literal \n \f \t \’ \b \" \r \\

Para el caso especial de las comillas simples y dobles es necesario evitar la confusi´on en Java. As´ı, ’\’’ es el car´acter comilla simple, el literal ’\\’ representa el car´acter barra invertida.Los literales tipo cualquiera son un n´ umero cualquiera de car´acteres encerrados entre comillas dobles. Los literales de tipo cadena est´an implantados en la clase String. Por ejemplo, del siguiente fragmento de c´odigo, "Hola mundo" es una cadena: System.out.println("Hola mundo");

3.5

Convenci´ on de nombres

El programador puede elegir cualquier forma de poner nombres a sus variables y constantes, sin embargo por motivos de legibilidad, se ha optado por seguir la siguiente convensi´on de nombres. Las variables se escriben con letras min´ usculas, si el nombre de la variable se compone de varias palabras, entonces se juntas todas y u ´nicamente el inicio de cada palabra que concatena se escribe con may´ uscula. Por ejemplo: float salarioPorMes, salarioPorDia; int diasLaborados, diasFestivos; Las constantes se escriben con may´ usculas, si el nombre de la constante se compone por varias palabras, entonces se coloca un car´acter ’_’ entre las palabras. Por ejemplo: static float LIMITE_INFERIOR_X = -1.0, LIMITE_SUPERIOR_X = 1.0; static float PI = 3.14159;

29

Cuando el nombre de la variable tenga que ver con una estructura muy interna de un sistema, se aconseja iniciar el nombre con un car´acter ’_’, por ejemplo: int _tipoProtocolo;

Ejercicios 1. ¿Qu´e es una declaraci´on? 2. ¿Cuantos tipos de comentarios hay en Java y para que sirve cada uno? 3. ¿C´omo se definen los valores literales para los double, long, y hexadecimales? 4. ¿Qu´e es una variable y como se define en Java? 5. ¿Que es una constante y como se define en Java?

Laboratorio 1. Modifique el programa Hola.java escribiendo en comentarios lo que hace cada l´ınea de c´odigo.

30

Cap´ıtulo 4 Constructores de programas Java sencillos Todo lenguaje de programaci´on debe incluir declaraciones para definir el control del flujo de un programa, debido a que estas proposiciones especifican el orden en el cual se realizar´a una computaci´on. En esta secci´on revisaremos las sentencias de control de flujo de Java.

Nota: Recuerde que una instrucci´on se vuelve proposici´on cuando se separa de las demas instucciones con un car´acter de punto y coma (;). Sin embargo si a un bloque de instrucciones lo delimitamos con los car´acteres de llaves ({}), tambi´en pasar´an a ser proposiciones.

4.1

Operadores

Se cuentan con diferentes tipos de aporadores, aritm´eticos, l´ogicos, relaciones, para el manejo de bits. Los operadores se utilizan dentro de una instrucci´on, frecuentemente de asignaci´on o evaluaci´on. Adem´as Java cuenta con otro tipo especial de operador para hacer una contracci´on en una expresion de asignamiento: los operadores de asignamiento. La siguiente tabla muestra los operadores de Java con su orden de precedencia:

31

Tipo de operador Unario Aritm´etico (y de corrimiento) Relacional L´ogico Condicional (terciario) Asignaci´on

Operadores ~ + − ++ (y los de agrupamiento) * / % + − > > < >= B ? X : Y; =, + =, − =, ∗ =, / =, % =,= , & = k =

Por lo general existen 2 tipos de operaciones: unarias y binarias, esto se refiere al n´ umero de operandos con los que trabaja el operador, sin embargo, Java incluye el operador terciario de asignaci´on (propio del lenguaje C). Los operadores binarios incluyen a los aritm´eticos, relacionales, l´ogicos, y de asignaci´on. En las siguientes subsecciones veremos la forma de trabajar con estos operadores.

4.1.1

Operadores unarios

Java no trabaja con operandos menores a un int, por esta raz´on, cuando los operandos tipo char, byte o short se convierten a int. Por otro lado, si los operandos son mayores a un int, el resultado de aplicar el operador ser´a del tipo del operando. Los operadores unarios son negacion o negativo (-), NOT a nivel bits ( ), autoincremento (++) y autodecremento (--). El operador de negaci´on cambia el signo de su operando, por ejemplo si tenemos int a, b = -8; a = -b; entones el valor de b es 8. El operador de negaci´on invierte el valor de los bits de su operando, por ejemplo: int i, j= 59081716. i = ~j Entonces el valor de I es -59081717, ya que: 59081716 ~ (59081716)

00000011100001011000001111110100 11111100011110100111110000001011

32

Los operadores de auto incremento y autodecremento, incrementan en 1 y decrementan en uno, respectivamente, al operando que se les aplique. Sin embargo, cuando se utilicen estos operadores se debe tener cuidado de su uso, ya que su operaci´on varia dependiendo del lado en el que se le coloque al operando. Esto es, cuando los operadores de auto incremento (o autodecremento) se encuentran del lado derecho del operando, entonces primero incrementa (o decrementa) y despues se utiliza el valor resultante. Si el operando se encuentra del lado izquierdo del operando, entonces primero se toma el valor resultante para trabajarse en la declaraci´on y despu´es se incrementa. As´ı, si tenemos int a = c = d =

a,b,c,d; b = 5; ++a; b++;

Entonces el valor de a,b y c es de 6, ya que todos incrementaron, y d tiene el valor de 5, ya que en su asignaci´on indica que primero le asigne el valor que tiene b y despu´es b se incremente en uno.

4.1.2

Operadores aritm´ eticos.

Los operadores aritm´eticos binarios son: +, -, *, /, y % para las operaciones de suma, resta, multiplicaci´on, divisi´on y m´odulo, respectivamente.

4.1.3

Operadores relacionales

Los operadores relacionales binarios son: , =, == y !=, para las operaciones mayor que, menor que, menor o igual que, mayor o igual que, igual, y diferente, respectivamente. Estos operadores regresan los valores booleanos true y false.

4.1.4

Operadores l´ ogicos.

Los operadores l´ogicos son binarios son: && y || para las operaciones de conjunci´on y disyunci´on, respectivamente, y el operador unario ! para la negaci´on. Estos operadores regresan los valores booleanos true y false.

33

4.1.5

Operadores para manejo de bits.

Se cuenta con seis operadores para manejo de bits, estos operadores s´olo act´ uan sobre los tipos char, int, short, y long. Los operadores son &,|,^,,~, se utilizan para las operaciones de bits AND, OR, XOR, corrimiento a la izquierda, corrimiento a la derecha y complemento a uno, respectivamente.

4.1.6

Operador terciario de asignaci´ on condicional.

En ocasiones tendremos la necesidad de asignar un valor a una variable dependiendo de alguna condici´on, para esto contamos con la expresi´on condicional: expr1?expr2:expr3 Donde se eval´ ua primera a expr1 y si resulta verdadera, entonces toda la expresi´on se vuelve expr2, en caso contrario la expresi´on toma el valor de expr3. Por ejemplo: int a=5, b=-1, c; c = (a>b)?a&0x01:0; Entonces c tendr´a el valor de 1.

4.1.7

Operadores de asignamiento

Los operadores de asignamiento se utilizan para hacer contracciones de expresiones de asignaci´on, esto es, buscan eliminar la redundancia de una variable en una expresi´on. Por ejemplo, supongamos que tenemos la expresi´on: x = x+4; Observemos que la variable x aparece en las partes derecha e izquierda de la asignaci´on. Entonces podemos hacer una contracci´on de esta expresi´on de la siguiente forma: x += 4; 34

As´ı, la sint´axis para los operadores de asignamiento es op=, donde op es una de las operaciones +, -, *, /, %. , &, | y ^.

4.2

Constructores if y while

Estos constructores representan el conjunto b´asico de declaraciones para mantener el control de flujo de un programa.

4.2.1

El constructor if

Esta proposici´on nos sirve para expresar decisiones. Su sintaxis es: if (expresion) proposicion1 [else proposicion2] La secuencia expresi´on, representa una expresi´on booleana, es decir, una operaci´on con realizada con los operadores l´ogicos o relacionales. La secuencia encerrada entre corchetes indica que es opcional. Es decir podemos tener la proposici´on if sin un else. Por ejemplo if (a

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.